diff --git a/README.md b/README.md index 1b7f5c3..ec178b0 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,57 @@ -# Starlight Starter Kit: Basics +# ΣDOCS · Simba Robotics -[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) +黑龙江大学 Simba 战队的文档站,基于 Astro 7 与 Starlight。首页复用 Simba 主站的黑红视觉、机器人实拍、Logo 和小组图标;文章页保留 Starlight 的侧栏、页内目录、搜索、浅色 / 深色主题与语言切换。 -``` -npm create astro@latest -- --template starlight +## 本地运行 + +```sh +npm install +npm run dev -- --background +npm run astro -- dev status +npm run astro -- dev logs +npm run astro -- dev stop ``` -> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! +中文首页:`http://localhost:4321/zh-cn/`,英文首页:`/en/`,根路径跳转到中文首页。 -## 🚀 Project Structure +生产构建使用 `npm run build`,产物在 `dist/`。`npm run preview` 可验证生产版本与 Pagefind 搜索;开发模式中的搜索由 Starlight 显示开发提示。正式部署时,在 `astro.config.mjs` 设置实际 `site` 域名,以生成 sitemap。 -Inside of your Astro + Starlight project, you'll see the following folders and files: +## 从哪里修改 -``` -. -├── public/ -├── src/ -│ ├── assets/ -│ ├── content/ -│ │ └── docs/ -│ └── content.config.ts -├── astro.config.mjs -├── package.json -└── tsconfig.json -``` +| 内容 | 文件 / 目录 | +| --- | --- | +| 首页布局与中英文文案 | `src/components/Home.astro` | +| 首页卡片、描述和链接 | `src/data/home.ts` | +| 首页样式 | `src/styles/home.css` | +| 文档主题与品牌 | `src/styles/custom.css`、`src/components/SiteTitle.astro` | +| 分类和顺序 | `astro.config.mjs`、页面 frontmatter 中的 `sidebar.order` | +| 入门与写作示例 | `src/content/docs/zh-cn/guides/` | +| 技术方向 | `src/content/docs/zh-cn/{mest,elct,vsag,pram}/` | +| 校内赛规则 | `src/content/docs/zh-cn/competition/` | +| 原始规则附件 | `public/downloads/rmic-2026-original-draft.md` | -Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name. +新增 `.md` 或 `.mdx` 页面后,侧栏按目录自动生成。技术示例的页首有“示例内容”提示,替换为经过确认的内容后再调整该提示。原有视觉组导论保留,未改写。 -Images can be added to `src/assets/` and embedded in Markdown with a relative link. +英文首页已提供,未翻译文章使用 Starlight 默认语言回退并显示提示。首页入口直达现有中文文章,避免空页面。 -Static assets, like favicons, can be placed in the `public/` directory. +## 校内赛规则 -## 🧞 Commands +规则被整理为概览、赛前考核、开源审查、对抗赛、制作规范、裁判系统、待确认事项七章。使用 Starlight 提示栏、步骤、卡片、标签页、表格和自适应赛程示意。没有额外引入 Mermaid 客户端依赖;原始 Mermaid 源码保留在下载附件,网页以阶段示意与完整晋级关系表展示同一赛程。 -All commands are run from the root of the project, from a terminal: +`pending.md` 记录原稿缺失或有歧义的条款。正式发布前,应补齐报名入口、场地信息、同分规则、尺寸孔位图等,并同步各章节。所有页面当前标记为规则预览版;原始附件保持不变。 -| Command | Action | -| :------------------------ | :----------------------------------------------- | -| `npm install` | Installs dependencies | -| `npm run dev` | Starts local dev server at `localhost:4321` | -| `npm run build` | Build your production site to `./dist/` | -| `npm run preview` | Preview your build locally, before deploying | -| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | -| `npm run astro -- --help` | Get help using the Astro CLI | +## 主站素材 -## 👀 Want to learn more? +素材于 2026-09-23 从 `https://simba-robotics.com` 复用并保存到 `public/simba/`,页面加载不依赖主站在线。素材属于战队原有资产,不因本次复用改变授权。 -Check out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat). +| 本地文件 | 主站来源路径 | 用途 | +| --- | --- | --- | +| `logo.svg` | `/logo.svg` | 品牌图标、favicon | +| `logo_with_char.webp` | `/logo_with_char.webp` | 页脚 Logo | +| `header.webp` | `/header.webp` | 首页机器人背景 | +| `mest.svg` | `/icons/mest.svg` | 机械架构入口 | +| `elct.svg` | `/icons/elct.svg` | 电传测控入口 | +| `vsag.svg` | `/icons/vsag.svg` | 视觉算法入口 | +| `pram.svg` | `/icons/pram.svg` | 宣传筹划入口 | + +参考:[Astro 文档](https://docs.astro.build)、[Starlight 文档](https://starlight.astro.build)。 diff --git a/astro.config.mjs b/astro.config.mjs index c5c731b..32128ec 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -2,43 +2,32 @@ import { defineConfig } from 'astro/config'; import starlight from '@astrojs/starlight'; -// https://astro.build/config export default defineConfig({ - integrations: [ - starlight({ - title: 'ΣDOCS', - defaultLocale: 'zh-cn', - locales: { - // English docs in `src/content/docs/en/` - en: { - label: 'English', - }, - // Simplified Chinese docs in `src/content/docs/zh-cn/` - 'zh-cn': { - label: '简体中文', - lang: 'zh-CN', - }, - }, - social: [{ icon: 'github', label: 'SGit', href: 'https://git.simba-robotics.com/PRAM/simba_docs' }], - sidebar: [ - { - label: '视觉算法', - translations: { - 'en': 'Vision & Algorithm', - }, - items: [ - // Each item here is one entry in the navigation menu. - { autogenerate: { directory: 'vsag' } }, - ], - }, - { - label: '电传测控', - translations: { - 'en': 'Electronics & Control', - }, - items: [{ autogenerate: { directory: 'elct' } }], - }, - ], - }), - ], + redirects: { '/': '/zh-cn/' }, + integrations: [starlight({ + title: 'ΣDOCS', + description: 'Simba Robotics / 黑龙江大学 602 创新实验室的工程知识库与校内赛手册。', + defaultLocale: 'zh-cn', + locales: { + 'zh-cn': { label: '简体中文', lang: 'zh-CN' }, + en: { label: 'English', lang: 'en' }, + }, + favicon: '/simba/logo.svg', + customCss: ['./src/styles/custom.css'], + components: { + Header: './src/components/Header.astro', + Hero: './src/components/Hero.astro', + SiteTitle: './src/components/SiteTitle.astro', + Footer: './src/components/Footer.astro', + }, + social: [{ icon: 'github', label: 'Simba Git · 文档仓库', href: 'https://git.simba-robotics.com/PRAM/simba_docs' }], + sidebar: [ + { label: '开始阅读', translations: { en: 'Start here' }, items: [{ autogenerate: { directory: 'guides' } }] }, + { label: '2026 校内赛 · RMIC', translations: { en: '2026 Campus Competition' }, items: [{ autogenerate: { directory: 'competition' } }] }, + { label: '机械架构 · MEST', translations: { en: 'Mechanical Engineering' }, items: [{ autogenerate: { directory: 'mest' } }] }, + { label: '电传测控 · ELCT', translations: { en: 'Electronics & Control' }, items: [{ autogenerate: { directory: 'elct' } }] }, + { label: '视觉算法 · VSAG', translations: { en: 'Vision & Algorithms' }, items: [{ autogenerate: { directory: 'vsag' } }] }, + { label: '宣传筹划 · PRAM', translations: { en: 'Operations & Media' }, items: [{ autogenerate: { directory: 'pram' } }] }, + ], + })], }); diff --git a/package-lock.json b/package-lock.json index 3ef88d0..7091bcd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,31 @@ "dependencies": { "@astrojs/starlight": "^0.41.1", "astro": "^7.0.2", - "sharp": "^0.34.5" + "sharp": "^0.34.5", + "starlight-ion-theme": "^2.4.0", + "starlight-theme-obsidian": "^0.4.1" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" } }, "node_modules/@astrojs/compiler-binding": { @@ -391,6 +415,15 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", @@ -1058,6 +1091,98 @@ "@expressive-code/core": "^0.44.0" } }, + "node_modules/@iconify/tools": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@iconify/tools/-/tools-4.2.0.tgz", + "integrity": "sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==", + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0", + "@iconify/utils": "^2.3.0", + "cheerio": "^1.1.2", + "domhandler": "^5.0.3", + "extract-zip": "^2.0.1", + "local-pkg": "^1.1.2", + "pathe": "^2.0.3", + "svgo": "^3.3.2", + "tar": "^7.5.2" + } + }, + "node_modules/@iconify/tools/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@iconify/tools/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/@iconify/tools/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/@iconify/tools/node_modules/svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -1523,6 +1648,18 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -2082,6 +2219,297 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/chroma-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-3.1.2.tgz", + "integrity": "sha512-YBTQqArPN8A0niHXCwrO1z5x++a+6l0mLBykncUpr23oIPW7L4h39s6gokdK/bDrPmSh8+TjMmrhBPnyiaWPmQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", @@ -2106,6 +2534,13 @@ "@types/estree": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT", + "peer": true + }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -2175,6 +2610,16 @@ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", @@ -2270,6 +2715,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/astring": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", @@ -2379,6 +2837,17 @@ "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" } }, + "node_modules/astro-icon": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/astro-icon/-/astro-icon-1.1.5.tgz", + "integrity": "sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==", + "license": "MIT", + "dependencies": { + "@iconify/tools": "^4.0.5", + "@iconify/types": "^2.0.0", + "@iconify/utils": "^2.1.30" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -2429,6 +2898,28 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "peer": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -2479,6 +2970,48 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", @@ -2494,6 +3027,22 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chroma-js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-3.2.0.tgz", + "integrity": "sha512-os/OippSlX1RlWWr+QDPcGUZs0uoqr32urfxESG9U93lhUfbnlyckte84Q8P1UQY/qth983AS1JONKmLS4T0nw==", + "license": "(BSD-3-Clause AND Apache-2.0)", + "peer": true + }, "node_modules/ci-info": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", @@ -2556,6 +3105,12 @@ "node": ">= 18" } }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, "node_modules/cookie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", @@ -2686,6 +3241,448 @@ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "license": "CC0-1.0" }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "peer": true, + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "peer": true, + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2722,6 +3719,16 @@ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2863,6 +3870,28 @@ "node": ">=4" } }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -2966,6 +3995,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/estree-util-attach-comments": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", @@ -3075,12 +4118,51 @@ "@expressive-code/plugin-text-markers": "^0.44.0" } }, + "node_modules/exsolve": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", + "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", + "license": "MIT" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, "node_modules/fast-string-truncated-width": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", @@ -3105,6 +4187,15 @@ "fast-string-width": "^3.0.2" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -3122,6 +4213,19 @@ } } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "peer": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/flattie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", @@ -3166,6 +4270,21 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-tsconfig": { "version": "5.0.0-beta.4", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", @@ -3187,6 +4306,58 @@ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "license": "ISC" }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/h3": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", @@ -3595,6 +4766,37 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -3629,12 +4831,34 @@ } } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/inline-style-parser": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -3693,6 +4917,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-hexadecimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", @@ -3736,6 +4970,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -3791,6 +5035,16 @@ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/klona": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", @@ -3800,6 +5054,12 @@ "node": ">= 8" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -4049,6 +5309,23 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -5175,6 +6452,83 @@ ], "license": "MIT" }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "peer": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -5293,6 +6647,15 @@ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "license": "MIT" }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/oniguruma-parser": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", @@ -5432,6 +6795,43 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, "node_modules/piccolore": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", @@ -5456,6 +6856,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, "node_modules/postcss": { "version": "8.5.15", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", @@ -5550,6 +6961,32 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/radix3": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", @@ -5569,6 +7006,33 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/recma-build-jsx": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", @@ -5940,6 +7404,13 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense", + "peer": true + }, "node_modules/rolldown": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", @@ -5973,6 +7444,19 @@ "@rolldown/binding-win32-x64-msvc": "1.1.3" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/satteri": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.2.tgz", @@ -6004,6 +7488,20 @@ "node": ">=11.0.0" } }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "peer": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -6144,6 +7642,317 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/starlight-ion-theme": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/starlight-ion-theme/-/starlight-ion-theme-2.4.0.tgz", + "integrity": "sha512-7iydgTqjjLW9Gh39DSgVLqz8uHCFiqmMfHQQg3bELTkX4eLUvmqi9TOsOEoGRmeAdY9/rhcVMm78b3KHGESE5g==", + "dependencies": { + "@astrojs/starlight": "^0.38", + "@iconify/tools": "^4.1.1", + "@iconify/utils": "^2.2.1", + "@shikijs/themes": "^1.26.1", + "astro-icon": "^1.1.5", + "pathe": "^2.0.1" + }, + "peerDependencies": { + "@astrojs/starlight": "^0.38", + "astro": "^6.0.0" + } + }, + "node_modules/starlight-ion-theme/node_modules/@astrojs/internal-helpers": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.9.1.tgz", + "integrity": "sha512-1pWuARqYom/TzuU3+0ZugsTrKlUydWKuULmDqSMTuonY+9IRDUEGKX/8PXQ1nBxRq3w85uGtd9q9SXfqEldMIQ==", + "license": "MIT", + "dependencies": { + "picomatch": "^4.0.4" + } + }, + "node_modules/starlight-ion-theme/node_modules/@astrojs/markdown-remark": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.1.2.tgz", + "integrity": "sha512-caXZ4Dc2St2dW8luEg22GlP0gupLdztCTQE4EzZOxW1pqWXz9mbeJEuHUkgDYcKWW8tjIHkydYDhWLVoxJ327Q==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.9.1", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.0", + "smol-toml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/starlight-ion-theme/node_modules/@astrojs/mdx": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-5.0.6.tgz", + "integrity": "sha512-4dKe0ZMmqujofPNDHahzClkwinn9f8jHPcaXcgdGvPAlboD2mjzkUCofli2cBnxYAkdfhC6d50gBJ8i/cH8gHw==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "7.1.2", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.16.0", + "es-module-lexer": "^2.0.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "astro": "^6.0.0" + } + }, + "node_modules/starlight-ion-theme/node_modules/@astrojs/starlight": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.38.5.tgz", + "integrity": "sha512-35xLSOtZDAMAilHG2zAEZoJ4AaPb+doYOvxuuRTAnmIBSOvujffOAHv3/rr6W/LJtkhBU38PjRDJ4i8QT1uGVw==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^7.1.1", + "@astrojs/mdx": "^5.0.4", + "@astrojs/sitemap": "^3.7.2", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.42.0", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.3", + "hast-util-select": "^6.0.4", + "hast-util-to-string": "^3.0.1", + "hastscript": "^9.0.1", + "i18next": "^23.11.5", + "js-yaml": "^4.1.1", + "klona": "^2.0.6", + "magic-string": "^0.30.21", + "mdast-util-directive": "^3.1.0", + "mdast-util-to-markdown": "^2.1.2", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.2", + "rehype-format": "^5.0.1", + "remark-directive": "^4.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" + }, + "peerDependencies": { + "astro": "^6.0.0" + } + }, + "node_modules/starlight-ion-theme/node_modules/@expressive-code/core": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.42.0.tgz", + "integrity": "sha512-MN11+9nfmaC7sYu2BZJXAXqwkBRt8t1xTSqP+Ti1NfTEskgl6xUnzDxoaiQkg0BMzpglA0pys4dpDKquP/cyIw==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/starlight-ion-theme/node_modules/@expressive-code/plugin-frames": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.42.0.tgz", + "integrity": "sha512-XtkPm+941Uta7Y+81Acv+OA/20F1NJmJhCX6UYGKpqEIGqplNh3PTOhcURp6tcruhlzJcWcvpWy6Oigz3SrjqA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.42.0" + } + }, + "node_modules/starlight-ion-theme/node_modules/@expressive-code/plugin-shiki": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.42.0.tgz", + "integrity": "sha512-PMKey/kLmewttAHQezL+Y5Fx3vVssfDi3+FJOYQQS2mXP3tQspFELtKKAfsXfmSXdToZYgwoO69HJndqfE+09g==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.42.0", + "shiki": "^4.0.2" + } + }, + "node_modules/starlight-ion-theme/node_modules/@expressive-code/plugin-text-markers": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.42.0.tgz", + "integrity": "sha512-l59lUx8fq1v5g6SpmbDjiU0+7IdfbiWnAyRmtTVSpfhyq+nZMN4UcmYyu2b9Mynhzt7Gr+O+cXyEPDNb2AVWVQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.42.0" + } + }, + "node_modules/starlight-ion-theme/node_modules/@shikijs/themes": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz", + "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/starlight-ion-theme/node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/starlight-ion-theme/node_modules/astro-expressive-code": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.42.0.tgz", + "integrity": "sha512-aiTePi2Cn0mJPYWZSzP1GcxCinX9mNtJyCCshVVPSg1yRwM7ADvFJOx0FnS440M9t65hp8JH//dc2qr22Bm4ag==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.42.0" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" + } + }, + "node_modules/starlight-ion-theme/node_modules/expressive-code": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.42.0.tgz", + "integrity": "sha512-V5DtJLEKuj4wf9O6IRtPtRObkMVy2ggR+S0MdjrTw6m58krZnDioyhW1si3Y04c5YPeooP4nd85Yq9NwEVHS4g==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.42.0", + "@expressive-code/plugin-frames": "^0.42.0", + "@expressive-code/plugin-shiki": "^0.42.0", + "@expressive-code/plugin-text-markers": "^0.42.0" + } + }, + "node_modules/starlight-ion-theme/node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/starlight-ion-theme/node_modules/rehype-expressive-code": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.42.0.tgz", + "integrity": "sha512-8rp/1YMEVVSYbtz+bFBx+uSx3vA4i4T8RwRm5Q/IWbucQnnQqQ0hDqtmKOr8tv+59Cik6cu5aH3WPo0I7csuTA==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.42.0" + } + }, + "node_modules/starlight-site-graph": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/starlight-site-graph/-/starlight-site-graph-0.5.0.tgz", + "integrity": "sha512-/FYCXDg+JwQGtxaDy1X/Lhhc5CYAF0ThOWvzBH3VmJSRlpAhqWgoUS/mGUNSy+QqGns+een+VDma+dkfBVWggA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/chroma-js": "^3.1.1", + "@types/d3": "^7.4.3", + "astro-integration-kit": "^0.18.0", + "chroma-js": "^3.1.2", + "d3": "^7.9.0", + "gray-matter": "^4.0.3", + "htmlparser2": "^10.0.0", + "micromatch": "^4.0.8" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.33.0", + "astro": ">=5.5.0", + "pixi-stats": "^1.3.10" + }, + "peerDependenciesMeta": { + "@astrojs/starlight": { + "optional": true + }, + "pixi-stats": { + "optional": true + } + } + }, + "node_modules/starlight-site-graph/node_modules/astro-integration-kit": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/astro-integration-kit/-/astro-integration-kit-0.18.0.tgz", + "integrity": "sha512-Z0QW5IQjosuKQDEGYYkvUX6EhEtrmE4/oViqWz23QveV8U7AuyFsTdg00WRNPevWZl/5a4lLUeDpv4bCRynRRg==", + "deprecated": "Check the migration guide: https://astro-integration-kit.netlify.app/migration-guide/", + "license": "MIT", + "peer": true, + "dependencies": { + "pathe": "^1.1.2", + "recast": "^0.23.7" + }, + "peerDependencies": { + "astro": "^4.12.0 || ^5.0.0" + } + }, + "node_modules/starlight-site-graph/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT", + "peer": true + }, + "node_modules/starlight-theme-obsidian": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/starlight-theme-obsidian/-/starlight-theme-obsidian-0.4.1.tgz", + "integrity": "sha512-O+/+JgozYi4dqijntitELDTUa1dgpnbwiOd4KvLmoEXsZiWsAFQmMKc/v5KJeSjpfjeXLPqbWrC3UQ6zEHkXGQ==", + "license": "MIT", + "peerDependencies": { + "@astrojs/starlight": ">=0.33.0", + "astro": ">=5.5.0", + "starlight-site-graph": "^0.5.0" + } + }, "node_modules/stream-replace-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", @@ -6164,6 +7973,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/style-to-js": { "version": "1.1.21", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", @@ -6207,12 +8026,35 @@ "url": "https://opencollective.com/svgo" } }, + "node_modules/tar": { + "version": "7.5.17", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.17.tgz", + "integrity": "sha512-wPEBwzapC+2PaTYPH6e2L+cNOEE227S47wUYFqlegcs8zlLLmeb9Fcff1HVZY4Fwku/1Eyv38n7GYwB2aaS71g==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT", + "peer": true + }, "node_modules/tinyclip": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", @@ -6247,6 +8089,19 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -6271,8 +8126,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true + "license": "0BSD" }, "node_modules/ufo": { "version": "1.6.4", @@ -6292,6 +8146,15 @@ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", "license": "MIT" }, + "node_modules/undici": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", @@ -6726,6 +8589,28 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/which-pm-runs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", @@ -6735,12 +8620,27 @@ "node": ">=4" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, "node_modules/xxhash-wasm": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", "license": "MIT" }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/yargs-parser": { "version": "22.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", @@ -6750,6 +8650,16 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", diff --git a/package.json b/package.json index 5f9ba87..10fc1cb 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "dependencies": { "@astrojs/starlight": "^0.41.1", "astro": "^7.0.2", - "sharp": "^0.34.5" + "sharp": "^0.34.5", + "starlight-ion-theme": "^2.4.0", + "starlight-theme-obsidian": "^0.4.1" } -} \ No newline at end of file +} diff --git a/public/downloads/rmic-2026-original-draft.md b/public/downloads/rmic-2026-original-draft.md new file mode 100644 index 0000000..347ad45 --- /dev/null +++ b/public/downloads/rmic-2026-original-draft.md @@ -0,0 +1,362 @@ +# 黑龙江大学 Robomaster 校内赛 参赛手册(预览版,非最终效果) + +## 比赛介绍 + +黑龙江大学 RoboMaster 机甲大师校内赛(下文简称 RMIC)是一项面向黑龙江大学全体本科同学、要求参赛选手设计、制造可发射水弹的智能机器人的比赛。比赛要求参赛队完成机器人机械组装、电路设计、程序调试,在赛场中激烈对抗、按照规则决出胜负。 + +本比赛由 602 实验室 / Simba 战队提供技术支持并成立赛务组委员会(下文简称组委会),负责比赛环境搭建、规则解释、技术支持。 + +## 参赛要求 + +### 参赛资格 + +- 所有选手应为黑龙江大学本科生 +- 以团队形式参赛,每队人数严格限制为 3 人 +- 每人限参加一支队伍 +- 每队 50 元报名费 + +鼓励各位同学跨学院、跨专业组队,以实现技术互补。 + +### 赛事时间 + +2026 年 09 月 23 日至 11 月 01 日 + +## 赛事流程 + +1. 09 月 23 日:报名开启 +2. 10 月 09 日:报名关闭 +3. 10 月 10 日:规则测评 +4. 10 月 24 日:完整形态考察、开源审查 +5. 10 月 25 日:适应性训练、裁判系统开放借用 +6. 11 月 01 日:机器人射击对抗赛 + +以下是对赛事各流程的详细解释。 + +## 前期准备 + +### 报名 + +本比赛自 9 月 23 日开启报名,至 10 月 9 日止。请扫码加入赛事官方 QQ 群,并联系队友填写报名链接。后续相关通知将第一时间在群内发布。 + +### 规则测评 + +规则测评采用线上题库形式发布,于 10 月 10 日开始可进入答题,10 月 23 日停止,考察参赛队对本参赛手册熟悉程度。 + +各参赛队使用报名后分配的账号进入答题,不限答题次数,答到满分视为通过。未通过参赛队不得参与赛事后续流程。 + +### 完整形态考察 + +在本项开始前,各参赛队应参考附录![机器人制作规范],完成考察内容中的功能。10 月 24 日,参赛队需携带机器人参与完整形态考察,目的为检验各参赛队的机器人制作情况。评分规则如下: + +|部分|考察内容|具体要求 |分值| +|----|--------|-------- |----| +|底盘|直线移动|不偏离指定宽度道路行进5米 |15| +|底盘|原地旋转|不偏离指定半径圆周在10秒内旋转720° |15| +|底盘|全向移动|可以在不旋转的前提下相对地面前后左右平移 |15| +|云台|枪口俯仰|使用任意方法使水弹发射机构相对于与地面平行某一轴转动超过30°|15| +|云台|发射水弹|可以不大于1秒的间隔连续发射水弹10秒,不卡弹 |15| +|云台|定点击打|发射水弹,30秒内能够命中1米外 $100cm^2$ 大小固定靶 5 次以上|15| +|其他|内容不限|其他有助于对战的功能 |10| + +由考察现场赛务工作人员评分,按照规则排名。排名前 16 队伍获得比赛/裁判系统借用资格。 + +剩余队伍中,排名前 4 的队伍可获得三等奖,其余队伍失去参赛资格。 + +若达到基本参赛要求的队伍超过 16 组,组委会将视情况调整本条,增加比赛资格名额。 + +### 开源审查 + +**组委会严禁直接购买成品方案或代做参与比赛,此类做法严重违反比赛精神。** + +所有参赛队伍需在完整形态考察前向组委会通过特定渠道提交作品报告,应包括以下内容: + +1. 整机开发使用到的关键的软件/硬件 +2. 整机方案的设计思路 +3. 使用的开源设计(如有)的来源 +4. 在开源设计(如有)基础上所作的创新性改动 +5. 机器人宣传照、队伍形象照(可能需要公开展示,建议认真拍摄) + +在完整形态考察当天,各队需要在完整形态考察通过后现场接受作品的实物审查。 + +接收实物审查的队伍,有义务在接收质询时向组委会展示以下内容: + +1. 机械设计图纸(如有) +2. 电路设计图纸(如有) +3. 机器人源代码 +4. 对相关技术提问做出现场答辩 + +组委会有权记录、保存参赛队伍的机器人相关构型信息。根据开源审查结果,将作品归为以下几类: + +#### A类 充分再设计 + +指能够领悟开源设计的设计意图,并能够在机械构型、电控软硬件方案上优化、创新的一类。 + +例如: +- 轮组:麦克纳姆轮/全向轮/阿克曼底盘/舵轮等驱动框架方式的更换 +- 电机:直流有刷/直流无刷、步进电机/减速电机等电机的更换 +- 传动:直接驱动/齿轮传动/同步带传动/连杆传动等传动方式的更换 +- 云台:增加/减少云台的俯仰/偏航/滚转自由度等云台构型的更换 +- 硬件:更换不同框架的主控板,如 ESP32/STM32/STC51/NUC/RK 等主控的更换 +- 软件:更换软件开发框架,如裸机代码修改/FreeRTOS/Zephyr/Linux/Windows 等内置软件框架的更换 +- 其他:创新性设计,如实现小陀螺、增加自瞄系统等 + +#### B类 非充分再设计 + +指能够基本理解开源设计,但仅对原设计某一模块尺寸/参数进行调整,不能体现原创设计意图的一类。 + +- 轮组:轮径、轮宽等参数改变 +- 联轴器:夹紧式/顶紧式/刚性/柔性等联轴器类型更换 +- 材料:能够提升性能的更换,如打印件替换为亚克力板/亚克力板替换为玻纤/碳板等 +- 其他:有创新性但对比赛帮助不大的设计,如杜邦线更换空中端子接线等 + +#### C类 无效再设计 + +指对开源设计照搬照抄/直接购买产品,不能理解开源设计的一类。 + +- 简单型号替换:同规格元件替换,如使用同一型号,区别仅在生产厂商不同的电机/核心板等 +- 劣化替换:导致性能受损且未能带来造价收益的替换,如使用性价比更差的同控制方式电机/只换一块更大更重的电池等 +- 换壳:仅改变外观的替换,如抹去厂商标记/喷涂涂装等 +- 其他:对比赛无帮助的设计,如在车体上加装奶龙玩偶等 + +作品评定类别满足一条即能够被认定为该类,按最高分类,优先级为 $A>B>C$(例如,满足 A 类 1 条,B 类 2 条,被认定为 A 类)。各类作品获奖限制如下: + +- A 类作品:最高可获得一等奖 +- B 类作品:最高可获得二等奖 +- C 类作品:最高可获得三等奖 + +## 正式比赛 + +### 机器人射击对抗赛 + +各个通过考核的队伍将在本比赛中决出最终胜负。 + +每局比赛形式为: + +1. 每局比赛前,通过检录验证机器人是否符合机器人制作规范(见附录)、安装裁判系统(见附录)。 +2. 检录通过后,双方将机器人放入赛场,开始三分钟准备,确认裁判系统与操作位图传客户端连接、遥控设备连接是否正常。 +3. 进入操作位,操作机器人与对方战斗,通过水弹攻击对方装甲板,裁判系统同步扣除对应方血量。 +4. 血量先减为 0 一方落败,另一方胜出;或 3 分钟时间耗尽,血量较多一方胜出。 + +赛程安排如下所示。 + +#### 适应性训练 + +10 月 25 日,将开放场地及裁判系统借用,各通过考核的参赛队抽签在场地中按次序进行单局比赛,为参赛队提供调试环境。 + +#### 决赛 + +11 月 01 日举行决赛。具体时间为:上午 9:00 - 11:00 下午 14:00 - 18:00。 + +比赛采取如下图所示的流程。请注意以下的名词解释: + +- BO5:五局三胜 (Best Of 5) +- BO3:三局两胜 (Best Of 3) +- BO1:单局定胜负 (Best Of 1) + +```mermaid +flowchart TD + Note["比赛顺序说明:
• 第一场前16队抽签编号1~16
• 同一组内按编号从小到大依次两两比赛
• 不同组按前文顺序进行
• 每场编号小为红方,编号大为蓝方"] + + subgraph P1["第一阶段:16进8(双败淘汰,BO3)"] + R1["首轮 16进8
16队 / 8场 BO3
按编号:1v2, 3v4, ..., 15v16"] + W1["16进8胜者组
8队 / 4场 BO3"] + L1_1["16进8败者组第一轮
8队 / 4场 BO3"] + L1_2["16进8败者组第二轮
8队 / 4场 BO3"] + end + + subgraph P2["第二阶段:8进4(双败淘汰,BO3)"] + W2["8进4胜者组
4队 / 2场 BO3"] + L2_1["8进4败者组第一轮
4队 / 2场 BO3"] + L2_2["8进4败者组第二轮
4队 / 2场 BO3"] + end + + subgraph P3["第三阶段:总决赛(单败淘汰,BO5)"] + SF["半决赛
4队 / 2场 BO5"] + Bronze["季军争夺战
1场 BO5"] + Final["冠军争夺战
1场 BO5"] + Champion["冠军"] + RunnerUp["亚军"] + Third["季军"] + Fourth["殿军"] + end + + E1["淘汰"] + E2["淘汰"] + E3["淘汰"] + E4["淘汰"] + + Note -.-> R1 + + R1 -->|"胜者 8队"| W1 + R1 -->|"败者 8队"| L1_1 + + W1 -->|"胜者 4队"| W2 + W1 -->|"败者 4队"| L1_2 + + L1_1 -->|"胜者 4队"| L1_2 + L1_1 -->|"败者"| E1 + + L1_2 -->|"胜者 4队"| L2_1 + L1_2 -->|"败者"| E2 + + W2 -->|"胜者 2队"| SF + W2 -->|"败者 2队"| L2_2 + + L2_1 -->|"胜者 2队"| L2_2 + L2_1 -->|"败者"| E3 + + L2_2 -->|"胜者 2队"| SF + L2_2 -->|"败者"| E4 + + SF -->|"胜者 2队"| Final + SF -->|"败者 2队"| Bronze + + Bronze -->|"胜者"| Third + Bronze -->|"败者"| Fourth + + Final -->|"胜者"| Champion + Final -->|"败者"| RunnerUp + + classDef stage fill:#e3f2fd,stroke:#1565c0,color:#000; + classDef finalStage fill:#fff8e1,stroke:#f9a825,color:#000; + classDef win fill:#e8f5e9,stroke:#2e7d32,color:#000; + classDef lose fill:#ffebee,stroke:#c62828,color:#000; + classDef note fill:#f5f5f5,stroke:#999,color:#000; + + class R1,W1,L1_1,L1_2,W2,L2_1,L2_2 stage; + class SF,Bronze,Final finalStage; + class Champion,RunnerUp,Third,Fourth win; + class E1,E2,E3,E4 lose; + class Note note; + +``` + +#### 奖项评定 + +比赛设置:一等奖/二等奖/三等奖/人气奖 + +一、二、三等奖按照排名指标依次发放,人气奖独立发放给人气投票最高的队伍。 + +排名规则: + +1. 主要指标:$冠军>亚军>季军>殿军>8强>16强$ +2. 次要指标:队伍总造成伤害数 + +开源审查限制分配奖项者,若获得超过限制的奖项,排名顺延至对应奖项位次。 +例:评定为非充分再设计队伍,获冠军,则名次被调整至二等奖第一名位置,原二等奖第一名进入一等奖名单内。 + +#### 奖励 + +1. 冠、亚、季军奖杯 +2. 一/二/三等奖对应档奖金 +2. 校级竞赛一/二/三等奖证书(加盖黑大公章),可申请学分/综测加分 +3. 八强队伍获得 Simba 战队直通面试机会 / 明信片套装 / 3D 打印 NFC 钥匙扣 + +### 别样的碰碰车大赛(附加赛事) + +## 附录 + +### 机器人制作规范 + +本节描述参与本比赛需要满足的机器人技术规格。未满足本规范的机器人将无法通过完整性考察或检录。 + +基础要求如下: + +1. 能够通过遥控装置/裁判系统控制运动 +2. 带有且仅带有 1 个水弹发射器 +3. 初始尺寸(包覆盒)小于 $350\times350\times350(mm)$ +4. 伸展尺寸小于 $400\times400\times400(mm)$ +5. 能够按照规范安装 4 个裁判系统装甲板与 1 个图传模块 + +初始尺寸限制指机器人具有一个状态小于该尺寸,伸展尺寸指机器人无论何种状态下必须小于该尺寸。除上述要求外,还需满足下列补充要求内容: + +#### 能源 + +1. 机器人仅可使用电池供能、储能,且仅可使用锂电池/干电池。需保证所用电池极耳不外露且具有一定的防撞保护措施。 +2. 机器人电池电压对地绝对值应小于 30V。 +2. 机器人仅可出现电能与机械能两种形式的能量传递。 + +例:机器人不可使用液压、气缸、压缩气体罐、燃油等供能形式。 + +#### 控制通信 + +1. 机器人可通过以下方式控制: + - 裁判系统下发键盘鼠标指令 + - 自行配备遥控器 + - 自制通信与控制方式 +2. 需要配备官方下发/自制图传并能够向裁判系统客户端发送画面。选手不可目视操控机器人,仅能通过计算机屏幕画面陈宗座机器人。 + +#### 光学 + +1. 除裁判系统外,机器人不可安装明显可见光/不可见光发射设备,如大功率 LED 灯、激光指示器/紫外灯等设备。主控板状态指示灯/红外传感器等设备不算明显的发光设备。 +2. 机器人不可安装能够对人员/摄像机设备造成损害的激光产品。仅可使用一类 (Class I) 激光产品,如大部分线性扫描/立体扫描激光雷达。 + +#### 识别特征 + +裁判系统装甲模块两侧有明显灯光效果,以辅助自动瞄准算法开发。每块装甲模块的灯光颜色、亮度、形状、大小及相对位置被视为装甲模块的视觉特征。 + +1. 不得用任何手段模仿装甲模块视觉特征 +2. 不得用任何手段遮挡/改变装甲模块视觉特征 + +#### 外观 + +1. 机器人上所出现的线缆应整齐且不外露。无法避免的外露线材需使用束线管、理线器等材料进行保护。 +2. 机器人的外观设计应避免出现明显影响美观的材料,如塑料袋、床单、快递气垫膜等。 +3. 禁止在机器人上刻意设计/使用尖锐结构,避免破坏场地/伤害参赛人员。 +4. 禁止出现面积大于 $30\times30mm^2$ 的接近纯红色/纯蓝色外观涂装。 +5. 禁止出现其他违背赛事精神的外观设计。 + +#### 发射机构 + +1. 能够使水弹(泡发的聚丙烯酸钠交联共聚物,通称吸水树脂,有弹性,泡发前大小 1~2mm,泡发后大小 7~9mm)以固定路径、初速度离开机器人,且能够连续发射水弹 10s。 +2. 仅可使用电机驱动的弹簧发射装置(通称波箱)发射水弹。严格禁止使用预充压缩气体/液压装置发射水弹。 + +#### 装甲模块 + +机器人上需要按规范留有安装组委会提供裁判系统四块装甲板的安装位。装甲板安装规范如下: + +首先定义机器人机体坐标系,机器人机体坐标系是**标准 $X,Y,Z$ 笛卡尔坐标系**,设原点为机器人质量中心,机器人使用底盘构型最大效率方向为机器人 $X$ 轴(若存在多个最大效率方向,可任选一个方向作为 $X$ 轴),$Z$ 轴指向地心。 + +1. 装甲模块和装甲支撑架需稳固连接,装甲支撑架底部链接面需与 $XY$ 平面平行,使得装甲模块受力面所在平面的法向量所在直线与 $Z$ 轴负方向所在直线的锐角夹角为 $75°$。装甲模块不含侧灯的两条边与 $XY$ 平面夹角小于 $5°$。定义安装好的装甲模块受击打面的法向量(与 $Z$ 轴负方向夹角为锐角)在 $XY$ 平面上的投影为该装甲模块的方向向量。4 块装甲模块的方向向量需分别与机器人机体坐标系的正 $X$ 轴、负 $X$ 轴、正 $Y$ 轴、负 $Y$ 轴一一对应,方向向量和对应坐标轴之间的角度误差不能超过 $5°$。 +2. 机器人本身的运动学方程也需建立在上述机体坐标系下。装甲模块的安装方式需与机器人本身的结构特性或者运动学特性共享同一个参考坐标系。$X$ 轴上安装的装甲模块几何中心点连线与 $Y$ 轴上安装的装甲模块几何中心点连线要互相垂直。装甲模块相对于机器人的几何中心的偏移量在 $X$ 轴或 $Y$ 轴上的分量不得超过 $30mm$。 +3. 装甲支撑架可以选择官方装甲支撑架或自制,且安装好的装甲模块和装甲支撑架需与底盘刚性连接。比赛过程中,装甲模块与底盘不可发生相对移动。刚性连接定义如下图所示,向装甲模块下边缘中点施加一个竖直向上的 $20N$ 的力,装甲模块受击打面角度 $\alpha$ 变化不得大于 $5°$。 +4. 定义在 90% 的时间仅有两轮接触地面的底盘构型为**平衡车构型**,该种构型机器人只需要安装正 $X$ 轴与负 $X$ 轴上的装甲板模块。 + +#### 变形约束 + +1. 若因机器人结构设计导致机器人具有可变形特性,其装甲模块的运动需满足:任何一块装甲模块不可相对于机器人底盘发生连续、往复的快速移动。快速移动定义为移动速度超过 $0.5m/s$。 +2. 机器人任意两块装甲板模块下边缘高度差不可超过 $50mm$。 +3. 机器人任意装甲板下边缘距离地面高度,在比赛中必须保持在 $[30,200]mm$ 范围内。 +4. 设计装甲板支撑架安装孔位时应考虑避免装甲板受到撞击。装甲板破损的机器人检录将不予通过。 + +### 裁判系统 + +各队伍制作的机器人均需安装裁判系统,由组委会统一设计并提供,通过完整形态考察的队伍均可借用。 + +单套裁判系统包含以下物品: + +1. 四块装甲板(击打检测)模块,用于检测对手攻击 +2. 图传模块,用于发送整车状态与图像画面到裁判系统客户端,为选手提供操作视野 + +各队伍不可修改裁判系统的任意软硬件,正式比赛需要烧录比赛的专用固件。自制裁判系统将无法通过检录。裁判系统借用应遵循如下规则: + +- 提前借用裁判系统(在正式比赛前借用)需缴纳 100 元押金 +- 比赛现场裁判系统损坏,可临时缴付押金再借一套 +- 完赛后,归还裁判系统后返还押金 +- 赛中/赛前若裁判系统发生损坏,依损坏程度从所属队伍押金中扣除维修费 + +#### 装甲板模块 + +装甲板模块用于实时检测水弹击打/物理碰撞。尺寸规格与安装孔位如下: + +- 构成:每车由 2 或 4 块装甲板组成,包含 1 块主装甲板与 3 块从装甲板。 +- 检测机制:以 100ms 为检测周期,当任意一块装甲板触发击打信号后,全车四块装甲板将进入 100ms 静默期。 +- 供电:需要使用杜邦线提供 5V±1V 供电。 +- 数据交互:可与一路 UART 串口通信,可用于从裁判系统向主控发送键盘/鼠标控制指令。 + +#### 图传 + +该模块负责将机器人第一人称视角画面回传至裁判系统客户端屏幕。安装方式由队伍自行决定。尺寸如下: + +- 可以使用两种方式供电。外部 3.3V 端子供电或内部电池供电。 +- 本模块价格较贵,电压输入错误导致烧毁可能需要赔偿约 55 元,严禁使用 5V 输入供电。谨慎上电。 \ No newline at end of file diff --git a/public/simba/elct.svg b/public/simba/elct.svg new file mode 100644 index 0000000..97dfec5 --- /dev/null +++ b/public/simba/elct.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/simba/header.webp b/public/simba/header.webp new file mode 100644 index 0000000..059b265 Binary files /dev/null and b/public/simba/header.webp differ diff --git a/public/simba/logo.svg b/public/simba/logo.svg new file mode 100644 index 0000000..58c90e7 --- /dev/null +++ b/public/simba/logo.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + diff --git a/public/simba/logo_with_char.webp b/public/simba/logo_with_char.webp new file mode 100644 index 0000000..b614430 Binary files /dev/null and b/public/simba/logo_with_char.webp differ diff --git a/public/simba/mest.svg b/public/simba/mest.svg new file mode 100644 index 0000000..ce36410 --- /dev/null +++ b/public/simba/mest.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/simba/pram.svg b/public/simba/pram.svg new file mode 100644 index 0000000..2098035 --- /dev/null +++ b/public/simba/pram.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/simba/vsag.svg b/public/simba/vsag.svg new file mode 100644 index 0000000..81a7cbb --- /dev/null +++ b/public/simba/vsag.svg @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 0000000..f522f7f --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,4 @@ +--- +import DefaultFooter from '@astrojs/starlight/components/Footer.astro'; +--- +{!/^\/(?:zh-cn|en)\/?$/.test(Astro.url.pathname) && } diff --git a/src/components/Header.astro b/src/components/Header.astro new file mode 100644 index 0000000..52923ff --- /dev/null +++ b/src/components/Header.astro @@ -0,0 +1,20 @@ +--- +import DefaultHeader from '@astrojs/starlight/components/Header.astro'; +import Search from '@astrojs/starlight/components/Search.astro'; +import LanguageSelect from '@astrojs/starlight/components/LanguageSelect.astro'; +import SiteTitle from './SiteTitle.astro'; +const home = /^\/(?:zh-cn|en)\/?$/.test(Astro.url.pathname); +const en = Astro.locals.starlightRoute.lang === 'en'; +--- +{home ? ( +
+ + +
+
+) : } diff --git a/src/components/Hero.astro b/src/components/Hero.astro new file mode 100644 index 0000000..45eb9e7 --- /dev/null +++ b/src/components/Hero.astro @@ -0,0 +1,6 @@ +--- +import DefaultHero from '@astrojs/starlight/components/Hero.astro'; +import Home from './Home.astro'; +const home = /^\/(?:zh-cn|en)\/?$/.test(Astro.url.pathname); +--- +{home ? : } diff --git a/src/components/Home.astro b/src/components/Home.astro new file mode 100644 index 0000000..9ded39e --- /dev/null +++ b/src/components/Home.astro @@ -0,0 +1,73 @@ +--- +import { disciplines, reading } from '../data/home'; +import '../styles/home.css'; +const en = Astro.locals.starlightRoute.lang === 'en'; +--- +
+
+ + +
+
HLJU · 602 LABTHE SIMBA KNOWLEDGE BASE
+

BUILD.LEARN.ITERATE.

+
+

{en ? 'Every iteration deserves to be documented.' : '让每一次迭代,都有迹可循。'}

+

{en ? 'Engineering notes, shared experience and competition guides from Simba Robotics.' : '从第一行代码到赛场上的每一次突破。'}
{en ? 'Build on what we learn. Make the next robot better.' : '这里是 Simba 战队的知识库,也是你的工程起点。'}

+
+ + +
+
+
04{en ? 'DISCIPLINES' : '专业方向'}
+
01{en ? 'SHARED KNOWLEDGE BASE' : '开放知识库'}
+
BUILD · TEST · DOCUMENT · REPEAT
+ {en ? 'EXPLORE THE DOCS' : '向下探索知识库'} +
+
+
+ + RMIC 2026 + {en ? 'Build your first competition robot.' : '你的第一台参赛机器人,从这里出发。'}{en ? 'Campus competition · Sep 23 – Nov 1 · Preview rules' : '黑龙江大学 RoboMaster 校内赛 · 09.23—11.01 · 规则预览版'} + {en ? 'Read the guide' : '查看参赛手册'} + +
+
01 KNOWLEDGE BASE
+

{en ? 'Find your next direction.' : '从热爱出发,向工程进阶。'}

{en ? 'Four disciplines. One robot. A shared place to learn.' : '四个方向,一台机器人。'}
{en ? 'Chinese guides with clearly marked sample content.' : '把零散的经验,连接成可复用的知识。'}

+ +
+
+
02 START EXPLORING
+

{en ? 'A good place to begin.' : '不止于阅读,从动手开始。'}

{en ? 'Explore the guide' : '查看入门指南'}
+ +
+
+
KNOWLEDGE IS BUILT TOGETHER.

{en ? 'Your next discovery belongs here.' : '你踩过的坑,值得成为下一条路。'}

{en ? 'A debugging note, a build log, or a better explanation. Start small.' : '一份调试记录、一次方案复盘、一段更清楚的解释。知识库的下一页,由你来写。'}

+ {en ? 'Contribute a document' : '参与文档共建'} +
+
+ + +
diff --git a/src/components/SiteTitle.astro b/src/components/SiteTitle.astro new file mode 100644 index 0000000..fdc2d12 --- /dev/null +++ b/src/components/SiteTitle.astro @@ -0,0 +1,8 @@ +--- +const { siteTitleHref } = Astro.locals.starlightRoute; +--- + + + ΣDOCSSIMBA ROBOTICS + + diff --git a/src/components/TournamentFlow.astro b/src/components/TournamentFlow.astro new file mode 100644 index 0000000..89bb1be --- /dev/null +++ b/src/components/TournamentFlow.astro @@ -0,0 +1,19 @@ +--- +const stages = [ + { number: '01', title: '16 → 8', format: '双败阶段 · BO3', detail: '首轮 → 胜者组 / 败者组两轮', result: '胜者组 4 队 + 败者组 4 队' }, + { number: '02', title: '8 → 4', format: '双败阶段 · BO3', detail: '胜者组 → 败者组两轮', result: '胜者组 2 队 + 败者组 2 队' }, + { number: '03', title: '四强 → 冠军', format: '单败阶段 · BO5', detail: '半决赛 → 冠军战 / 季军战', result: '决出冠军、亚军、季军、殿军' }, +]; +--- +
+ {stages.map(stage =>
{stage.number} / {stage.format}{stage.title}

{stage.detail}

{stage.result}
)} +
+ + diff --git a/src/content/docs/en/guides/example.md b/src/content/docs/en/guides/example.md index ebd0f3b..d963ad5 100644 --- a/src/content/docs/en/guides/example.md +++ b/src/content/docs/en/guides/example.md @@ -1,11 +1,24 @@ --- -title: Example Guide -description: A guide in my new Starlight docs site. +title: Welcome to the knowledge base +description: A starting point for reading and contributing to ΣDOCS. +sidebar: + order: 0 --- -Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. -Writing a good guide requires thinking about what your users are trying to do. +ΣDOCS collects engineering notes and competition guides from Simba Robotics at Heilongjiang University. -## Further reading +:::note[Documentation language] +The technical guides and 2026 campus competition rules are currently written in Chinese. Untranslated pages use Starlight’s Chinese fallback. New sample articles are marked at the top of each page. +::: -- Read [about how-to guides](https://diataxis.fr/how-to-guides/) in the Diátaxis framework +## Choose an entry point + +- [Getting started (Chinese)](/zh-cn/guides/getting-started/) +- [2026 campus competition guide (Chinese)](/zh-cn/competition/) +- [Mechanical engineering (Chinese)](/zh-cn/mest/getting-started/) +- [Electronics and control (Chinese)](/zh-cn/elct/getting-started/) +- [Vision and algorithms (Chinese)](/zh-cn/vsag/intro/) +- [Operations and media (Chinese)](/zh-cn/pram/getting-started/) +- [Contributing guide (Chinese)](/zh-cn/guides/contributing/) + +The campus competition guide is a **preview based on the supplied draft**, with unresolved items listed separately for the organizers to confirm. diff --git a/src/content/docs/en/index.mdx b/src/content/docs/en/index.mdx index c073401..b9cc0c7 100644 --- a/src/content/docs/en/index.mdx +++ b/src/content/docs/en/index.mdx @@ -1,40 +1,7 @@ --- -title: Welcome to Starlight -description: Get started building your docs site with Starlight. -template: splash # Remove or comment out this line to display the site sidebar on this page. +title: ΣDOCS · Simba Robotics Knowledge Base +description: Engineering notes, shared experience and campus competition guides from Simba Robotics at Heilongjiang University. +template: splash hero: - tagline: Congrats on setting up a new Starlight project! - image: - file: ../../../assets/houston.webp - actions: - - text: Example Guide - link: /guides/example/ - icon: right-arrow - - text: Read the Starlight docs - link: https://starlight.astro.build - icon: external - variant: minimal + title: BUILD. LEARN. ITERATE. --- - -import { Card, CardGrid } from '@astrojs/starlight/components'; - -## Next steps - - - - Edit `src/content/docs/index.mdx` to see this page change. - - - Delete `template: splash` in `src/content/docs/index.mdx` to display a - sidebar on this page. - - - Add Markdown or MDX files to `src/content/docs` to create new pages. - - - Edit your `sidebar` and other config in `astro.config.mjs`. - - - Learn more in [the Starlight Docs](https://starlight.astro.build/). - - diff --git a/src/content/docs/zh-cn/competition/index.mdx b/src/content/docs/zh-cn/competition/index.mdx new file mode 100644 index 0000000..2cf89ca --- /dev/null +++ b/src/content/docs/zh-cn/competition/index.mdx @@ -0,0 +1,88 @@ +--- +title: 2026 校内赛参赛手册 +description: 黑龙江大学 RoboMaster 校内赛(RMIC)的参赛资格、日程与规则索引。 +sidebar: + label: 赛事概览与日程 + order: 1 + badge: + text: 预览版 + variant: caution +--- +import { CardGrid, LinkCard, Steps } from '@astrojs/starlight/components'; + +:::caution[规则预览版 · 尚未最终定稿] +本手册整理自《比赛规则草稿》,保留原稿中的赛事安排与技术指标。缺失或存在歧义的内容已列入[待确认事项](/zh-cn/competition/pending/),正式执行口径以组委会后续发布为准。 +::: + +## 比赛是什么 + +黑龙江大学 **RoboMaster 机甲大师校内赛**(RMIC)面向黑龙江大学全体本科生。参赛队设计、制造能够发射水弹的智能机器人,完成机械组装、电路设计与程序调试,并在赛场对抗中决出胜负。 + +**602 实验室 / Simba 战队**提供技术支持并成立赛务组委员会(简称“组委会”),负责比赛环境搭建、规则解释和技术支持。 + +## 参赛资格 + +| 项目 | 要求 | +| --- | --- | +| 参赛对象 | 黑龙江大学本科生 | +| 组队人数 | **每队严格限定 3 人** | +| 队伍限制 | 每人仅可参加一支队伍 | +| 报名费 | **50 元 / 队** | +| 赛事周期 | **2026 年 9 月 23 日—11 月 1 日** | + +:::tip[欢迎跨学院、跨专业组队] +机械、电路、编程与项目协作都很重要。鼓励通过跨专业组队实现技术互补。 +::: + +## 赛事日程 + +以下日期均为 **2026 年**。 + +| 日期 | 阶段 | 参赛队需要完成的事项 | +| --- | --- | --- | +| 9 月 23 日 | 报名开启 | 组队、加入官方 QQ 群、填写报名信息 | +| 10 月 9 日 | 报名截止 | 完成报名 | +| 10 月 10—23 日 | 规则测评 | 使用分配账号答题,取得满分 | +| 10 月 24 日 | 完整形态考察、开源审查 | 携带机器人参加考察,并接受作品审查 | +| 10 月 25 日 | 适应性训练 | 通过考核的队伍到场调试,裁判系统开放借用 | +| 11 月 1 日 | 机器人射击对抗赛 | 上午 9:00—11:00;下午 14:00—18:00 | + +:::note[报名入口待补充] +原稿未附官方 QQ 群二维码、报名链接、比赛地点及作品报告提交渠道。本页暂不提供可提交的报名入口,请等待组委会补充。 +::: + +## 按参赛流程阅读 + + + +1. **确认资格并准备报名** + + 阅读[报名与赛前考核](/zh-cn/competition/preparation/),了解规则测评和满分要求。 + +2. **设计、制作并记录你的机器人** + + 对照[机器人制作规范](/zh-cn/competition/robot-spec/)与[裁判系统](/zh-cn/competition/referee-system/),预留安装空间和接口。 + +3. **准备作品报告与开源审查** + + 阅读[开源审查](/zh-cn/competition/open-source/),记录参考来源、设计思路和改动。 + +4. **通过考核,参加训练与正式比赛** + + 阅读[对抗赛与奖项](/zh-cn/competition/matches/),了解单局流程、赛制与奖励限制。 + + + + + + + + + + +## 原始附件 + +下载《比赛规则草稿》原始 Markdown + +原始附件保持原文,便于与整理后的章节对照。原稿中的 Mermaid 赛程源码也包含在附件中。 + diff --git a/src/content/docs/zh-cn/competition/matches.mdx b/src/content/docs/zh-cn/competition/matches.mdx new file mode 100644 index 0000000..2affa09 --- /dev/null +++ b/src/content/docs/zh-cn/competition/matches.mdx @@ -0,0 +1,122 @@ +--- +title: 对抗赛与奖项 +description: 单局流程、训练安排、决赛晋级关系与奖项限制。 +sidebar: + order: 4 +--- +import { Steps } from '@astrojs/starlight/components'; +import TournamentFlow from '../../../../components/TournamentFlow.astro'; + +:::caution[预览版] +本章保留原稿的赛制与奖励表述。平局、同分、奖项名额及赛程执行细节尚待组委会确认。 +::: + +## 单局比赛流程 + + + +1. **检录与安装裁判系统** + + 验证机器人符合[制作规范](/zh-cn/competition/robot-spec/),并安装[裁判系统](/zh-cn/competition/referee-system/)。 + +2. **三分钟准备** + + 检录通过后,双方将机器人放入赛场,确认裁判系统与操作位图传客户端连接、遥控设备连接正常。 + +3. **进入操作位并开始对抗** + + 操作机器人,以水弹攻击对方装甲板。裁判系统同步扣除对应方血量。 + +4. **判定单局胜负** + + 血量先减为 0 的一方落败;或在 **3 分钟比赛时间**耗尽后,血量较多的一方胜出。 + + + +:::note[准备时间与对抗时间分开计算] +三分钟准备后,再进行最多三分钟的单局对抗。原稿尚未说明双方同时归零或时间结束时血量相同的处理办法。 +::: + +## 适应性训练 + +**10 月 25 日**开放场地与裁判系统借用。通过考核的队伍抽签,按次序进行单局比赛,用于现场调试。 + +## 决赛安排 + +**11 月 1 日:上午 9:00—11:00,下午 14:00—18:00。** + +| 缩写 | 含义 | +| --- | --- | +| BO1 | 单局定胜负(Best of 1) | +| BO3 | 三局两胜(Best of 3) | +| BO5 | 五局三胜(Best of 5) | + +### 抽签与比赛顺序 + +- 第一场前,16 队抽签取得编号 1—16。 +- 同一组内按编号从小到大依次两两比赛。 +- 不同组按赛程所列顺序进行。 +- 每场编号较小的队伍为红方,较大的队伍为蓝方。 + +### 晋级流程 + + + +下表将原稿的 Mermaid 流程图转为可直接查阅的晋级关系。**每一行是一轮比赛,不是一场单局。** + +| 轮次 | 队伍 / 场次 | 赛制 | 胜者去向 | 败者去向 | +| --- | --- | --- | --- | --- | +| 首轮 16 进 8 | 16 队 / 8 场,1v2、3v4…15v16 | BO3 | 8 队 → 16 进 8 胜者组 | 8 队 → 16 进 8 败者组第一轮 | +| 16 进 8 胜者组 | 8 队 / 4 场 | BO3 | 4 队 → 8 进 4 胜者组 | 4 队 → 16 进 8 败者组第二轮 | +| 16 进 8 败者组第一轮 | 8 队 / 4 场 | BO3 | 4 队 → 16 进 8 败者组第二轮 | 淘汰 | +| 16 进 8 败者组第二轮 | 8 队 / 4 场 | BO3 | 4 队 → 8 进 4 败者组第一轮 | 淘汰 | +| 8 进 4 胜者组 | 4 队 / 2 场 | BO3 | 2 队 → 半决赛 | 2 队 → 8 进 4 败者组第二轮 | +| 8 进 4 败者组第一轮 | 4 队 / 2 场 | BO3 | 2 队 → 8 进 4 败者组第二轮 | 淘汰 | +| 8 进 4 败者组第二轮 | 4 队 / 2 场 | BO3 | 2 队 → 半决赛 | 淘汰 | +| 半决赛 | 4 队 / 2 场 | BO5 | 2 队 → 冠军争夺战 | 2 队 → 季军争夺战 | +| 季军争夺战 | 2 队 / 1 场 | BO5 | 季军 | 殿军 | +| 冠军争夺战 | 2 队 / 1 场 | BO5 | 冠军 | 亚军 | + +:::note[赛制边界] +前两个阶段为原稿所述的双败阶段,四强起改为单败阶段。跨轮重排、回避重复对阵等未在原稿中明确,请等待正式对阵表。 +::: + +## 奖项评定 + +比赛设置 **一等奖、二等奖、三等奖、人气奖**。 + +- 一、二、三等奖按照排名指标依次发放。 +- 人气奖独立授予人气投票最高的队伍。 + +排名指标依次为: + +1. **主要指标:** 冠军 > 亚军 > 季军 > 殿军 > 8 强 > 16 强。 +2. **次要指标:** 队伍总造成伤害数。 + +:::caution[开源审查影响奖项分配] +A 类作品最高获得一等奖,B 类最高获得二等奖,C 类最高获得三等奖。若队伍获得超出限制的奖项,奖项位次按原稿顺延调整。 +::: + +原稿示例:被评为 **B 类(非充分再设计)**的队伍取得冠军,则调整至二等奖第一名位置,原二等奖第一名进入一等奖名单。 + +:::note[比赛名次与奖项位次待区分] +原稿未明确该调整是否影响冠军头衔、奖杯或八强资格。请勿据此自行推定;详见[待确认事项](/zh-cn/competition/pending/)。 +::: + +## 奖励 + +以下是原稿列出的奖励,金额与名额尚未给出。 + +1. 冠、亚、季军奖杯。 +2. 一、二、三等奖对应档奖金。 +3. 校级竞赛一、二、三等奖证书(加盖黑大公章),可申请学分或综测加分。 +4. 八强队伍获得 **Simba 战队直通面试机会、明信片套装、3D 打印 NFC 钥匙扣**。 + +学分、综测申请的办理条件及奖励兑现细节待组委会补充。 + +## 附加赛事:别样的碰碰车大赛 + +:::note[内容待发布] +原稿仅包含赛事标题,尚无参赛条件、赛制与评分规则。本页不补设规则。 +::: + diff --git a/src/content/docs/zh-cn/competition/open-source.mdx b/src/content/docs/zh-cn/competition/open-source.mdx new file mode 100644 index 0000000..65abb4f --- /dev/null +++ b/src/content/docs/zh-cn/competition/open-source.mdx @@ -0,0 +1,107 @@ +--- +title: 开源审查 +description: 作品报告、现场答辩、再设计分类与获奖限制。 +sidebar: + order: 3 +--- +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +:::caution[预览版] +本章整理自原稿。提交渠道、具体时限和评审执行口径待组委会确认。 +::: + +:::danger[严禁购买成品方案或代做参赛] +组委会严禁直接购买成品方案或委托代做参与比赛。参考开源设计时,应理解设计思路,并如实说明来源与改动。 +::: + +## 提交作品报告 + +**完整形态考察前**,通过组委会指定渠道提交报告,包含: + +1. 整机开发使用的关键软件与硬件。 +2. 整机方案的设计思路。 +3. 使用的开源设计及其来源(如有)。 +4. 在开源设计基础上作出的创新性改动(如有)。 +5. 机器人宣传照、队伍形象照。 + +:::note[照片可能公开展示] +请认真准备照片。原稿未提供报告提交渠道,待组委会补充。 +::: + +## 现场实物审查 + +**10 月 24 日**,通过完整形态考察后接受审查。队伍有义务在接受质询时展示: + +- 机械设计图纸(如有)。 +- 电路设计图纸(如有)。 +- 机器人源代码。 +- 对相关技术问题的现场答辩。 + +组委会有权记录、保存参赛队机器人的相关构型信息。 + +## 再设计分类 + + + + +理解开源设计的设计意图,能够对机械构型、电控软硬件方案进行优化或创新。 + +原稿举例: + +- **轮组:** 更换麦克纳姆轮、全向轮、阿克曼底盘、舵轮等驱动框架。 +- **电机:** 更换直流有刷、直流无刷、步进、减速等电机方案。 +- **传动:** 更换直接驱动、齿轮、同步带、连杆等传动方式。 +- **云台:** 增减俯仰、偏航、滚转自由度等构型调整。 +- **硬件:** 更换不同框架的主控,例如 ESP32、STM32、STC51、NUC、RK。 +- **软件:** 更换软件开发框架,例如裸机代码、FreeRTOS、Zephyr、Linux、Windows。 +- **其他:** 实现小陀螺、增加自瞄系统等创新设计。 + +**最高可获得一等奖。** + + + + +基本理解开源设计,但仅对某一模块尺寸或参数进行调整,不能体现原创设计意图。 + +原稿举例: + +- **轮组:** 改变轮径、轮宽等参数。 +- **联轴器:** 更换夹紧式、顶紧式、刚性、柔性等类型。 +- **材料:** 为提升性能而更换材料,如打印件换亚克力板,亚克力板换玻纤或碳板。 +- **其他:** 有创新性但对比赛帮助不大的设计,如杜邦线换为空中端子接线。 + +**最高可获得二等奖。** + + + + +照搬开源设计、直接购买产品,不能理解开源设计。 + +原稿举例: + +- **简单型号替换:** 同规格元件只更换生产厂商,例如同型号电机或核心板。 +- **劣化替换:** 导致性能受损且不能带来造价收益,如使用性价比更差的同控制方式电机,或只换更大更重的电池。 +- **换壳:** 只改变外观,例如抹去厂商标记或喷涂涂装。 +- **其他:** 对比赛没有帮助的设计,如加装玩偶。 + +**最高可获得三等奖。** + + + + +:::note[分类不是参赛许可] +原稿同时规定“严禁直接购买成品方案或代做”,并在 C 类中提及“直接购买产品”。C 类获奖上限不能视为对被禁止参赛方式的许可;具体处理方式仍需组委会澄清。 +::: + +## 分类优先级与获奖上限 + +满足某类的一条即可认定为该类,按最高分类,优先级为 **A > B > C**。例如满足 A 类 1 条、B 类 2 条,认定为 A 类。 + +| 类别 | 再设计程度 | 获奖上限 | +| --- | --- | --- | +| A | 充分再设计 | 一等奖 | +| B | 非充分再设计 | 二等奖 | +| C | 无效再设计 | 三等奖 | + +若比赛结果对应奖项超出类别上限,按[奖项评定规则](/zh-cn/competition/matches/#奖项评定)调整奖项位次。 + diff --git a/src/content/docs/zh-cn/competition/pending.md b/src/content/docs/zh-cn/competition/pending.md new file mode 100644 index 0000000..3200390 --- /dev/null +++ b/src/content/docs/zh-cn/competition/pending.md @@ -0,0 +1,61 @@ +--- +title: 待确认事项与原稿 +description: 发布正式规则前需由组委会补充或澄清的事项。 +sidebar: + order: 7 +--- +:::note[编辑整理说明] +本页汇总原稿缺项与歧义,帮助组委会完成定稿。以下是待确认问题,不是新增赛事规则。 +::: + +## 赛事信息 + +- 官方 QQ 群二维码、报名链接、报名费缴纳方式与截止具体时刻。 +- 比赛地点、签到安排、作品报告提交渠道和具体截止时刻。 +- 规则测评入口、账号发放与技术支持联系方式。 +- “别样的碰碰车大赛”的参赛条件、流程、评分与奖励。 + +## 考察与审查 + +- 直线移动的道路宽度、原地旋转的指定半径。 +- 单项未完全达成的计分方式;总分相同时的排序方法。 +- “命中 5 次以上”的阈值口径。 +- “基本参赛要求”的具体定义;扩增名额后的赛制。 +- C 类所述“直接购买产品”,与禁止购买成品方案或代做的处理边界。 + +## 对抗与奖项 + +- 初始血量、命中伤害、物理碰撞计分、复活或重赛机制(如有)。 +- 双方同时归零、时间耗尽血量相同及次要指标同分时的判定。 +- 跨轮分组、重复对阵、红蓝方更换、比赛间准备与维修时间。 +- 迟到、弃权、故障、暂停、违规及申诉的处理方式。 +- 场地尺寸、障碍布置与现场安全要求。 +- 原稿给出的多轮 BO3 / BO5 如何排入比赛时间,是否多场地并行。 +- 各奖项名额、奖金金额、人气投票规则及奖励领取方式。 +- 开源审查造成的奖项位次调整,是否影响竞技名次、奖杯与八强资格。 +- 学分或综测加分的申请条件与办理流程。 + +## 制作与裁判系统 + +- 装甲板、支撑架和图传模块的尺寸、孔位、接口及安装示意图。 +- 装甲模块相对几何中心偏移不超过 30 mm 的测量对象。 +- 刚性连接要求与变形约束的适用关系。 +- “30 × 30 mm²”涂装面积写法、计算方法及颜色判定范围。 +- 平衡车的两块装甲主从组成、检测与静默期行为。 +- 自制图传与禁止修改 / 自制裁判系统的适用边界。 +- UART 协议、客户端获取方式与正式固件烧录流程。 + +## 本次整理做了什么 + +- 按参赛流程拆分章节,增加站内索引和跳转。 +- 将关键数值集中到表格,使用提示栏突出禁止事项与缺失信息。 +- 修正“陈宗座机器人”等明显笔误和重复编号,统一单位排版。 +- 将 Mermaid 赛程图整理为阶段示意与完整晋级关系表。 +- 保留原稿的赛事日期、人数、费用、评分、数值限制及奖励表述。 + +## 对照原始附件 + +下载《比赛规则草稿》原始 Markdown + +原始附件未改写;包含完整原文及 Mermaid 源码。后续规则更新建议同时记录发布日期、修改条款和生效范围。 + diff --git a/src/content/docs/zh-cn/competition/preparation.mdx b/src/content/docs/zh-cn/competition/preparation.mdx new file mode 100644 index 0000000..a4d21b6 --- /dev/null +++ b/src/content/docs/zh-cn/competition/preparation.mdx @@ -0,0 +1,74 @@ +--- +title: 报名与赛前考核 +description: 报名、规则测评、完整形态考察与晋级资格。 +sidebar: + order: 2 +--- +import { Steps } from '@astrojs/starlight/components'; + +:::caution[预览版] +本章来自赛事规则草稿。道路宽度、旋转半径等未给出的判定参数,见[待确认事项](/zh-cn/competition/pending/)。 +::: + +## 报名 + +报名时间为 **2026 年 9 月 23 日至 10 月 9 日**。每队 3 人,每人仅可参加一队,报名费为 50 元 / 队。 + + + +1. **联系队友并确认资格。** 所有选手均须为黑龙江大学本科生。 +2. **加入赛事官方 QQ 群。** 后续通知将第一时间在群内发布。 +3. **共同填写报名信息。** QQ 群二维码与报名链接待组委会补充。 + + + +## 规则测评 + +| 项目 | 规定 | +| --- | --- | +| 时间 | 10 月 10 日开始,10 月 23 日停止 | +| 形式 | 线上题库 | +| 账号 | 使用报名后分配的账号 | +| 次数 | 不限答题次数 | +| 通过标准 | **取得满分** | + +:::danger[未通过测评不得继续参赛] +未通过规则测评的队伍不得参与赛事后续流程。 +::: + +## 完整形态考察 + +**10 月 24 日**,参赛队携带机器人参加现场考察。各队应提前按照[机器人制作规范](/zh-cn/competition/robot-spec/)完成机器人与考察所需功能。 + +### 评分表 + +总分 **100 分**,由现场赛务工作人员评分并排名。 + +| 部分 | 考察内容 | 具体要求 | 分值 | +| --- | --- | --- | ---: | +| 底盘 | 直线移动 | 在指定宽度道路内行进 5 m,不偏离道路 | 15 | +| 底盘 | 原地旋转 | 在指定半径圆周内,10 s 内旋转 720°,不偏离范围 | 15 | +| 底盘 | 全向移动 | 不旋转车体,相对地面完成前、后、左、右平移 | 15 | +| 云台 | 枪口俯仰 | 使用任意方法,使水弹发射机构绕某一与地面平行的轴转动超过 30° | 15 | +| 云台 | 发射水弹 | 以不大于 1 s 的发射间隔连续发射 10 s,不卡弹 | 15 | +| 云台 | 定点击打 | 30 s 内,命中 1 m 外面积为 100 cm² 的固定靶 5 次以上 | 15 | +| 其他 | 有助于对战的功能 | 内容不限 | 10 | + +:::note[评分细则待补充] +原稿未给出道路宽度、旋转半径、部分完成时的计分办法、同分排序及“5 次以上”的具体判定口径。 +::: + +### 晋级与奖项资格 + +- 排名前 **16** 的队伍获得比赛资格与裁判系统借用资格。 +- 剩余队伍中排名前 **4** 的队伍可获得三等奖,其余队伍失去参赛资格。 +- 若达到基本参赛要求的队伍超过 16 组,组委会将视情况调整本条,增加比赛资格名额。 + +:::caution[名额调整] +上述为原稿中的暂定方案。若比赛名额增加,赛制、对阵与奖项安排也需由组委会同步确认。 +::: + +## 同日开源审查 + +作品报告必须在完整形态考察前提交;考察通过后,当天接受实物审查。材料清单与获奖限制详见[开源审查](/zh-cn/competition/open-source/)。 + diff --git a/src/content/docs/zh-cn/competition/referee-system.md b/src/content/docs/zh-cn/competition/referee-system.md new file mode 100644 index 0000000..02c0bec --- /dev/null +++ b/src/content/docs/zh-cn/competition/referee-system.md @@ -0,0 +1,67 @@ +--- +title: 裁判系统 +description: 装甲板与图传模块的安装、供电、通信和借用规则。 +sidebar: + order: 6 +--- +:::caution[预览版] +接口说明来自原稿。尺寸、孔位与通信协议附件尚未提供,请以组委会后续资料为准。 +::: + +## 系统组成 + +所有参赛机器人均需安装由组委会统一设计、提供的裁判系统。通过完整形态考察的队伍可借用。 + +单套系统包含: + +| 模块 | 数量 | 功能 | +| --- | --- | --- | +| 装甲板(击打检测)模块 | 4 块 | 检测对手攻击 | +| 图传模块 | 1 个 | 将整车状态和图像发送至客户端,为选手提供视野 | + +:::danger[不得修改裁判系统] +队伍不可修改裁判系统的任何软硬件;正式比赛需烧录比赛专用固件。自制裁判系统不能通过检录。 +::: + +## 借用与押金 + +- 正式比赛前提前借用,需缴纳 **100 元押金**。 +- 比赛现场损坏时,可临时缴付押金再借一套。 +- 完赛后归还裁判系统,返还押金。 +- 赛前或赛中损坏的,按损坏程度从所属队伍押金中扣除维修费。 + +## 装甲板模块 + +实时检测水弹击打及物理碰撞。 + +| 项目 | 原稿规定 | +| --- | --- | +| 构成 | 每车安装 2 或 4 块;原稿另写“1 块主装甲板与 3 块从装甲板” | +| 检测周期 | **100 ms** | +| 静默期 | 任意一块触发击打后,全车四块装甲板进入 **100 ms** 静默期 | +| 供电 | 通过杜邦线提供 **5 V ± 1 V** | +| 通信 | 一路 **UART**,可向主控发送键盘、鼠标控制指令 | + +:::note[平衡车配置待确认] +制作规范允许平衡车只装 2 块装甲,但本节原稿的主从数量及静默期描述按 4 块表述。两块配置的主从分配与检测行为需组委会补充。 +::: + +装甲板外形尺寸、安装孔位图及串口协议未附于原稿。角度、高度和刚性要求见[装甲模块安装规范](/zh-cn/competition/robot-spec/#装甲模块)。 + +## 图传模块 + +将机器人第一人称视角画面回传至裁判系统客户端屏幕,安装方式由队伍决定。 + +可使用以下两种供电方式: + +- 外部 **3.3 V** 端子供电。 +- 内部电池供电。 + +:::danger[图传模块严禁接入 5 V] +外部供电要求为 **3.3 V**,与装甲板的 **5 V ± 1 V** 不同。错误电压可能烧毁模块,原稿注明可能需要赔偿约 **55 元**,请谨慎上电。 +::: + +:::note[尺寸资料待补充] +原稿中的“尺寸如下”未附图片或数值,图传模块尺寸、接口图及客户端使用方法待组委会发布。 +::: + diff --git a/src/content/docs/zh-cn/competition/robot-spec.md b/src/content/docs/zh-cn/competition/robot-spec.md new file mode 100644 index 0000000..97c00b3 --- /dev/null +++ b/src/content/docs/zh-cn/competition/robot-spec.md @@ -0,0 +1,142 @@ +--- +title: 机器人制作规范 +description: 尺寸、能源、控制通信、发射机构、装甲模块和变形约束。 +sidebar: + order: 5 +--- +:::caution[预览版 · 制作前请核对] +本章保留原稿技术指标。未满足规范的机器人无法通过完整形态考察或检录;孔位、尺寸图等缺失资料见[待确认事项](/zh-cn/competition/pending/)。 +::: + +## 基础要求 + +| 项目 | 要求 | +| --- | --- | +| 运动控制 | 能通过遥控装置或裁判系统控制运动 | +| 发射器数量 | **有且仅有 1 个**水弹发射器 | +| 初始尺寸(包覆盒) | **小于 350 × 350 × 350 mm** | +| 伸展尺寸 | **小于 400 × 400 × 400 mm** | +| 裁判系统安装位 | 4 个装甲板模块和 1 个图传模块;平衡车构型例外见下文 | + +**初始尺寸**指机器人至少有一个状态小于规定尺寸;**伸展尺寸**指机器人在任何状态下都必须小于规定尺寸。 + +## 能源 + +1. 仅可使用电池供能、储能,且电池种类仅限锂电池或干电池。 +2. 电池极耳不得外露,并应具有一定的防撞保护措施。 +3. 电池电压对地绝对值必须 **小于 30 V**。 +4. 仅允许电能与机械能两种形式的能量传递。 + +:::danger[禁止的供能形式] +不可使用液压、气缸、压缩气体罐、燃油等供能形式。 +::: + +## 控制通信 + +允许通过以下方式控制机器人: + +- 裁判系统下发键盘、鼠标指令。 +- 自行配备的遥控器。 +- 自制通信与控制方式。 + +需配备官方下发或自制图传,并能够向裁判系统客户端发送画面。 + +:::caution[仅能通过屏幕操控] +选手不可目视操控机器人,仅能通过计算机屏幕画面操作机器人。自制图传与“不可修改或自制裁判系统”的边界,待组委会确认。 +::: + +## 光学 + +1. 除裁判系统外,不可安装明显可见光或不可见光发射设备,例如大功率 LED 灯、激光指示器、紫外灯。主控板状态指示灯、红外传感器等不算明显发光设备。 +2. 不可安装能够损害人员或摄像机设备的激光产品。仅可使用 **一类(Class I)**激光产品。 + +原稿以“大部分线性扫描 / 立体扫描激光雷达”为例;具体设备应以其标注的激光类别核对,不以设备名称推定类别。 + +## 识别特征 + +裁判系统装甲模块两侧的灯光用于辅助自动瞄准算法开发。灯光的**颜色、亮度、形状、大小与相对位置**均视为模块视觉特征。 + +- 不得以任何手段模仿装甲模块视觉特征。 +- 不得以任何手段遮挡或改变装甲模块视觉特征。 + +## 外观 + +1. 线缆应整齐且不外露;无法避免的外露线材应使用束线管、理线器等保护。 +2. 避免使用明显影响美观的材料,如塑料袋、床单、快递气垫膜。 +3. 禁止刻意设计或使用尖锐结构,以免破坏场地或伤害人员。 +4. 禁止出现面积大于 **30 × 30 mm²** 的接近纯红色或纯蓝色外观涂装。 +5. 禁止其他违背赛事精神的外观设计。 + +:::note[涂装面积口径待确认] +“30 × 30 mm²”沿用原稿写法。面积阈值、计算方式及“接近纯红 / 纯蓝”的判定需组委会明确。 +::: + +## 发射机构 + +1. 应使水弹以固定路径和初速度离开机器人,并能连续发射 **10 s**。 +2. 仅可使用**电机驱动的弹簧发射装置(波箱)**发射水弹。 + +水弹为泡发的聚丙烯酸钠交联共聚物(通称吸水树脂),具有弹性;泡发前约 **1—2 mm**,泡发后约 **7—9 mm**。 + +:::danger[禁止预充气体或液压发射] +严格禁止使用预充压缩气体、液压装置发射水弹。 +::: + +## 装甲模块 + +需要预留组委会提供的四块装甲板安装位。平衡车构型适用下文例外。 + +### 机体坐标系 + +采用标准 **X、Y、Z 笛卡尔坐标系**: + +- 原点:机器人质量中心。 +- X 轴:底盘构型最大效率方向;存在多个方向时可任选其一。 +- Z 轴:指向地心。 +- 机器人运动学方程也需建立在此坐标系下。 + +### 安装角度与方向 + +1. 装甲模块与支撑架稳固连接,支撑架底部连接面与 XY 平面平行。 +2. 受力面所在平面的法向量所在直线,与 Z 轴负方向所在直线的锐角为 **75°**。 +3. 装甲模块不含侧灯的两条边,与 XY 平面的夹角 **小于 5°**。 +4. 取受击面法向量中与 Z 轴负方向成锐角的一支,其在 XY 平面上的投影为装甲模块的**方向向量**。 +5. 四块装甲的方向向量分别对应 **+X、−X、+Y、−Y**,与对应坐标轴的角度误差 **不超过 5°**。 + +### 参考坐标与位置 + +- 装甲安装方式应与机器人的结构特性或运动学特性共享同一参考坐标系。 +- X 轴上两块装甲的几何中心连线,与 Y 轴上两块装甲的几何中心连线互相垂直。 +- 装甲模块相对于机器人几何中心的偏移量,在 X 轴或 Y 轴上的分量 **不得超过 30 mm**。 + +:::note[偏移量的测量对象待确认] +上述偏移限制保留原稿表述。具体是指单块装甲、成对装甲中心还是安装轴线,应结合组委会补充图示确认后制作。 +::: + +### 刚性连接 + +支撑架可采用官方设计或自制,安装后的装甲模块、支撑架必须与底盘刚性连接;比赛中不可与底盘发生相对移动。 + +**判定方法:** 在装甲模块下边缘中点施加竖直向上的 **20 N** 力,受击面角度 α 的变化 **不得大于 5°**。 + +:::note[示意图待补充] +原稿提及刚性连接示意图,但附件未包含图片。本章保留文字定义,不补绘可能影响判定的尺寸图。 +::: + +### 平衡车构型例外 + +**90% 的时间仅有两轮接地**的底盘定义为平衡车构型,只需安装 **+X 与 −X** 方向的装甲板模块。 + +## 变形约束 + +| 项目 | 约束 | +| --- | --- | +| 装甲运动 | 不可相对底盘连续、往复快速移动;快速移动定义为速度超过 **0.5 m/s** | +| 下边缘高度差 | 任意两块装甲板下边缘高度差 **不超过 50 mm** | +| 离地高度 | 比赛中任意装甲板下边缘必须保持在 **30—200 mm(含端点)** | +| 安装孔位 | 设计时考虑避免装甲板受撞击 | + +:::caution[装甲板破损不能通过检录] +装甲板破损的机器人将不予通过检录。刚性连接要求与可变形结构的具体适用边界待组委会说明。 +::: + diff --git a/src/content/docs/zh-cn/elct/getting-started.md b/src/content/docs/zh-cn/elct/getting-started.md new file mode 100644 index 0000000..de85e11 --- /dev/null +++ b/src/content/docs/zh-cn/elct/getting-started.md @@ -0,0 +1,43 @@ +--- +title: 电控开发的第一个闭环 +description: 电传测控组示例:接口、数据、控制与调试记录。 +sidebar: + order: 1 +--- +:::note[示例内容 · 待替换] +本文是入门结构示例,尚未指定战队实际使用的开发板、固件、引脚或控制参数。 +::: + +## 从接口表开始 + +| 接口信息 | 记录内容 | +| --- | --- | +| 电源 | 额定电压、允许范围、极性和电流需求 | +| 通信 | 协议、引脚、波特率与数据格式 | +| 控制 | 指令单位、更新频率、失联时的行为 | +| 调试 | 日志字段、采样周期与固件版本 | + +:::caution[先确认供电] +不同模块的供电电压可能不同。接线与上电必须以对应器件资料和实际电路为准。 +::: + +## 练习:让一条数据可追踪 + +1. 明确输入来自哪里、代表什么物理量。 +2. 为原始输入增加时间戳与单位。 +3. 在日志中同时记录目标值和反馈值。 +4. 模拟无数据、异常值和通信中断,记录程序行为。 + +## 建议的调试记录 + +```text +任务:待填写 +硬件 / 固件版本:待填写 +输入与单位:待填写 +期望行为:待填写 +实测行为:待填写 +结论与下一步:待填写 +``` + +接入校内赛设备前,请阅读[裁判系统](/zh-cn/competition/referee-system/),尤其是装甲板与图传模块不同的供电要求。 + diff --git a/src/content/docs/zh-cn/guides/contributing.mdx b/src/content/docs/zh-cn/guides/contributing.mdx new file mode 100644 index 0000000..aa0397f --- /dev/null +++ b/src/content/docs/zh-cn/guides/contributing.mdx @@ -0,0 +1,98 @@ +--- +title: 文档共建指南 +description: 用 Markdown 与 Starlight 组件记录工程经验。 +sidebar: + order: 2 +--- +import { Tabs, TabItem, Steps } from '@astrojs/starlight/components'; + +:::note[协作规范示例] +本页是一份可修改的文档写作模板。审核人、分支策略和发布流程需按战队实际约定补充。 +::: + +## 一篇文档回答什么 + +| 部分 | 要回答的问题 | +| --- | --- | +| 目标 | 读者要解决什么问题? | +| 前提 | 适用的硬件、软件版本和基础知识是什么? | +| 步骤 | 如何复现?关键参数为什么这样选? | +| 验证 | 用什么现象或数据证明完成? | +| 排错 | 常见失败有哪些?如何定位? | +| 参考 | 来源、许可证和相关文档在哪里? | + +## 选择页面格式 + + + + +普通文章使用 `.md`,适合标题、表格、代码块和提示栏。 + +```md +--- +title: 我的第一份调试记录 +description: 记录问题、环境、步骤和验证结果。 +sidebar: + order: 1 +--- + +## 目标 + +写清楚这次要验证的行为。 + +:::tip[复现提示] +注明固件版本与接线方式。 +::: +``` + + + + +需要卡片、步骤和标签页时使用 `.mdx`。组件从 Starlight 导入: + +```mdx +import { Steps } from '@astrojs/starlight/components'; + + + +1. 记录环境。 +2. 执行操作。 +3. 核对结果。 + + +``` + + + + +## 提示栏如何选 + +:::note[补充背景] +说明适用范围、版本或尚未确认的内容。 +::: + +:::tip[更好的做法] +给出能减少试错成本的建议。 +::: + +:::caution[容易出错] +突出操作顺序、参数限制或兼容性问题。 +::: + +:::danger[禁止或高风险操作] +用于已确认的禁止事项。例如校内赛图传模块严禁使用 5 V 输入。 +::: + +## 发布前检查 + + + +1. **核实内容。** 区分正式规则、经验建议、示例与待确认项。 +2. **检查链接。** 使用完整站内路径,如 `/zh-cn/competition/`。 +3. **构建预览。** 执行 `npm run build`;开发预览使用 `npm run dev -- --background`。 +4. **人工复核。** 检查手机排版、表格、提示栏及引用来源。 + + + +代码位于 [Simba 文档仓库](https://git.simba-robotics.com/PRAM/simba_docs)。各分类由目录自动生成,首页入口在 `src/data/home.ts` 中维护。 + diff --git a/src/content/docs/zh-cn/guides/getting-started.mdx b/src/content/docs/zh-cn/guides/getting-started.mdx new file mode 100644 index 0000000..73e8a32 --- /dev/null +++ b/src/content/docs/zh-cn/guides/getting-started.mdx @@ -0,0 +1,47 @@ +--- +title: 新队员,从这里开始 +description: 认识 ΣDOCS,选择一个方向,完成第一次工程实践。 +sidebar: + order: 1 +--- +import { Steps, CardGrid, LinkCard } from '@astrojs/starlight/components'; + +欢迎来到 **ΣDOCS**。这里整理 Simba 战队在机械、电控、视觉与团队协作中的知识,也收录校内赛参赛手册。 + +:::note[内容建设中] +技术方向中的新增页面是可替换的示例内容,用于展示文档结构,不代表战队已确认的培训计划或硬件方案。已有的视觉组导论保留原稿。 +::: + +## 先找到你的入口 + + + + + + +## 一次入门实践 + + + +1. **选择一个方向** + + [机械架构](/zh-cn/mest/getting-started/)、[电传测控](/zh-cn/elct/getting-started/)、[视觉算法](/zh-cn/vsag/intro/)和[宣传筹划](/zh-cn/pram/getting-started/)是四个互相协作的入口。可以从自己最感兴趣的问题开始。 + +2. **把任务缩小到可以验证的程度** + + 例如完成一个零件模型、读懂一份通信数据、处理一张图像,或整理一次活动记录。先写下输入、输出和完成标准。 + +3. **记录过程和结果** + + 保留环境、步骤、关键参数、截图与失败尝试。让下一位同学能够复现你的结果。 + +4. **请队友复核,再补入知识库** + + 请熟悉该方向的队友核对技术结论;尚未验证的内容明确标注为“待验证”。 + + + +:::tip[先完成一个小闭环] +“跑起来”只是第一步。能够解释为什么、说明适用条件,并让别人复现,才是一份有用的工程记录。 +::: + diff --git a/src/content/docs/zh-cn/index.mdx b/src/content/docs/zh-cn/index.mdx index 0e8d9ce..9f160c0 100644 --- a/src/content/docs/zh-cn/index.mdx +++ b/src/content/docs/zh-cn/index.mdx @@ -1,42 +1,7 @@ --- -title: 欢迎使用 Σ 文档 -description: 本文档是一份开放贡献的 RoboMaster 系列赛事相关知识教程库。 -template: splash # Remove or comment out this line to display the site sidebar on this page. +title: ΣDOCS · Simba 战队知识库 +description: 黑龙江大学 Simba Robotics 战队的开放知识库,汇集机械、电控、视觉、团队协作与 2026 RoboMaster 校内赛手册。 +template: splash hero: - tagline: 基于 Astro / Starlight 搭建,少女施工中... - image: - file: ../../../assets/houston.webp - actions: - - text: 阅读概览 - link: /zh-cn/intro - icon: right-arrow - - text: 提交修改 - link: https://git.simba-robotics.com/PRAM/simba_docs - - text: 访问 Simba 官网 - link: https://simba-robotics.com - icon: external - variant: minimal + title: BUILD. LEARN. ITERATE. --- - -import { Card, CardGrid } from '@astrojs/starlight/components'; - -## Next steps - - - - Edit `src/content/docs/index.mdx` to see this page change. - - - Delete `template: splash` in `src/content/docs/index.mdx` to display a - sidebar on this page. - - - Add Markdown or MDX files to `src/content/docs` to create new pages. - - - Edit your `sidebar` and other config in `astro.config.mjs`. - - - Learn more in [the Starlight Docs](https://starlight.astro.build/). - - diff --git a/src/content/docs/zh-cn/intro.md b/src/content/docs/zh-cn/intro.md index ad6fc43..0fe2880 100644 --- a/src/content/docs/zh-cn/intro.md +++ b/src/content/docs/zh-cn/intro.md @@ -1,11 +1,19 @@ --- -title: 示例教程 -description: 关于 RoboMaster 的昨天、今天和明天 +title: 知识库概览 +description: ΣDOCS 的内容结构与阅读入口。 --- -Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. -Writing a good guide requires thinking about what your users are trying to do. +ΣDOCS 是 Simba 战队的工程知识库。本页保留原有概览地址,新的阅读入口见[新队员,从这里开始](/zh-cn/guides/getting-started/)。 -## Further reading +## 内容导航 -- Read [about how-to guides](https://diataxis.fr/how-to-guides/) in the Diátaxis framework +- [2026 校内赛参赛手册](/zh-cn/competition/):赛事日程、考核、制作规范与裁判系统。 +- [机械架构](/zh-cn/mest/getting-started/):结构、建模与装配示例。 +- [电传测控](/zh-cn/elct/getting-started/):接口与调试记录示例。 +- [视觉算法](/zh-cn/vsag/intro/):视觉组导论与技术笔记。 +- [宣传筹划](/zh-cn/pram/getting-started/):内容制作与团队协作示例。 +- [文档共建指南](/zh-cn/guides/contributing/):页面格式、组件与写作模板。 + +:::note[内容建设中] +新增技术示例均在页首标注,可按战队实际情况替换。校内赛手册来自规则草稿,仍为预览版。 +::: diff --git a/src/content/docs/zh-cn/mest/getting-started.md b/src/content/docs/zh-cn/mest/getting-started.md new file mode 100644 index 0000000..b2d9b5a --- /dev/null +++ b/src/content/docs/zh-cn/mest/getting-started.md @@ -0,0 +1,36 @@ +--- +title: 从草图到装配 +description: 机械架构组入门示例:需求、建模、装配与验证。 +sidebar: + order: 1 +--- +:::note[示例内容 · 待替换] +本页展示机械组教程的组织方式,具体软件、材料和验收参数请由小组负责人补充。 +::: + +## 先定义接口 + +绘制零件前,先列出整体尺寸、安装空间、连接方式与维护需求。与电控、视觉同学确认线缆通道、传感器位置和拆装空间。 + +| 阶段 | 建议产出 | 验证方式 | +| --- | --- | --- | +| 需求整理 | 尺寸与接口清单 | 与相关小组共同确认 | +| 草图与建模 | 参数化零件模型 | 检查约束和干涉 | +| 装配设计 | 装配体、紧固件清单 | 检查工具可达性 | +| 样件验证 | 实测记录、问题清单 | 比较设计值与实测值 | + +## 第一个练习:传感器支架 + +1. 测量传感器外形与安装孔位。 +2. 用草图表达孔位、支撑面和走线槽。 +3. 在装配体中检查运动范围与遮挡。 +4. 记录试装发现的问题并更新模型版本。 + +:::tip[给下一次维护留空间] +记录紧固件规格、装配顺序与线缆方向,比只保存最终模型更容易交接。 +::: + +## 参赛前核对 + +校内赛机器人须满足专门的[制作规范](/zh-cn/competition/robot-spec/)。教学示例中的结构建议不能替代赛事尺寸与装甲板要求。 + diff --git a/src/content/docs/zh-cn/pram/getting-started.md b/src/content/docs/zh-cn/pram/getting-started.md new file mode 100644 index 0000000..1ea9073 --- /dev/null +++ b/src/content/docs/zh-cn/pram/getting-started.md @@ -0,0 +1,33 @@ +--- +title: 把工程故事记录下来 +description: 宣传筹划组示例:内容制作、素材整理与协作交付。 +sidebar: + order: 1 +--- +:::note[示例内容 · 待替换] +下述流程用于演示知识库内容,实际发布渠道、负责人和审核节点待战队补充。 +::: + +## 一次活动的记录流程 + +1. **明确主题。** 说明活动的目标、读者和交付形式。 +2. **准备素材。** 收集时间线、机器人照片、演示片段与关键数据。 +3. **核对事实。** 向相关小组确认技术名词、版本和结果。 +4. **完成交付。** 保存源文件、导出文件、素材来源与说明。 + +## 素材清单模板 + +| 文件 | 内容 | 来源 / 作者 | 使用范围 | 状态 | +| --- | --- | --- | --- | --- | +| 待填写 | 机器人展示照 | 待填写 | 待确认 | 待审核 | +| 待填写 | 调试过程片段 | 待填写 | 待确认 | 待整理 | +| 待填写 | 活动文案 | 待填写 | 待确认 | 初稿 | + +:::tip[记录过程也记录失败] +保留关键迭代与调试背景,可以帮助读者理解成果是如何实现的。 +::: + +## 和知识库协作 + +把活动复盘中的技术结论交给对应小组复核,将可复用的经验整理为独立文章。写作格式参见[文档共建指南](/zh-cn/guides/contributing/)。 + diff --git a/src/content/docs/zh-cn/vsag/intro.md b/src/content/docs/zh-cn/vsag/intro.md index de6d52a..122120c 100644 --- a/src/content/docs/zh-cn/vsag/intro.md +++ b/src/content/docs/zh-cn/vsag/intro.md @@ -3,8 +3,15 @@ title: 导论 description: 视觉组同学需要学习的内容 --- -Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. -Writing a good guide requires thinking about what your users are trying to do. +现代工业设备和零售电子产品主要的发展方向是:让其变得更像人,或者更能理解人类。人类作为生物,收集周围环境的方式中,眼睛所看到的信息是最主要的;让自己在自然环境中生存下去,思考收集到信息的能力是最重要的。人类作为生物是有极限的,因此我们发动了人所独有的改造世界的能力,将无机物质改造为替代我们进行劳动的工具,来解放我们的劳动。本组需要研究的是这些工具的两个部分:摄像机等传感器的数据处理,以及根据这些传感器做出决策的计算方法。 + +依笔者所见,当前世界生产力的发展必然要求我们的生产工具要代替更多先前只能由人类完成的工作,但已有的生产工具在形态、技术上进行迭代的经济效益阻力依然很大,因此将机器赋予人的智能来操作机器而不是将已有机器升级的需求是必然的,RMUL、RMUC中的哨兵这类考验依据环境情况自主行动的兵种在各类机器人比赛中是很少见的,但与目前的行业发展有很大接轨。 + +在RM比赛中,没有禁止的做法都是被允许的,例如为普通步兵/英雄机器人添加自瞄、弹道计算功能等。 + +:::tip[你知道吗?] +Astro 帮助你使用 [“群岛架构”](https://docs.astro.build/zh-cn/concepts/islands/) 构建更快的网站。 +::: ## Further reading diff --git a/src/content/docs/zh-cn/vsag/pipeline.md b/src/content/docs/zh-cn/vsag/pipeline.md new file mode 100644 index 0000000..1b68008 --- /dev/null +++ b/src/content/docs/zh-cn/vsag/pipeline.md @@ -0,0 +1,39 @@ +--- +title: 一次视觉任务的完整链路 +description: 视觉算法示例:从图像采集到控制输出。 +sidebar: + order: 2 +--- +:::note[技术笔记示例 · 非实际系统说明] +本页仅演示视觉文档如何组织。算法、通信协议、误差阈值和硬件参数应替换为经过验证的实际方案。 +::: + +## 先看输入与输出 + +| 模块 | 输入 | 输出 | 建议记录 | +| --- | --- | --- | --- | +| 图像采集 | 相机数据 | 带时间戳的图像 | 分辨率、曝光、帧率 | +| 目标检测 | 图像 | 候选目标 | 置信度、漏检和误检 | +| 几何解算 | 目标特征与标定参数 | 位置或姿态估计 | 坐标系、单位、误差 | +| 跟踪与决策 | 连续观测 | 目标状态 | 丢失、切换与延迟 | +| 控制接口 | 目标状态 | 控制侧可用的数据 | 协议、超时、版本 | + +## 做一次离线验证 + +1. 选择一段带有明确场景说明的测试素材。 +2. 保存每个模块的中间结果,而不只看最终输出。 +3. 为失败帧记录原因:模糊、遮挡、曝光、坐标转换或通信。 +4. 改动一个变量后复测,保留前后对照。 + +:::tip[坐标系必须写清楚] +说明原点、轴方向、角度正方向、单位与时间戳含义,避免不同模块对同一数值产生不同理解。 +::: + +## 后续补充 + +- 测试数据与使用许可。 +- 实际依赖、环境部署和启动方式。 +- 标定流程、评价指标与典型失败案例。 + +继续阅读[视觉组导论](/zh-cn/vsag/intro/)。 + diff --git a/src/data/home.ts b/src/data/home.ts new file mode 100644 index 0000000..a6507f9 --- /dev/null +++ b/src/data/home.ts @@ -0,0 +1,13 @@ +// 首页示例入口集中在这里维护;文章正文位于 src/content/docs/。 +export const disciplines = [ + { code: 'MEST', title: '机械架构', en: 'Mechanical engineering', description: '从第一张草图,到能上场的机器人。', enDescription: 'From the first sketch to a robot in the arena.', tags: 'CAD / 结构设计 / 加工装配', href: '/zh-cn/mest/getting-started/', icon: 'mest' }, + { code: 'ELCT', title: '电传测控', en: 'Electronics & control', description: '连接电路与代码,让每一次运动可控。', enDescription: 'Connect circuits and code. Make every motion count.', tags: 'STM32 / 嵌入式 / 运动控制', href: '/zh-cn/elct/getting-started/', icon: 'elct' }, + { code: 'VSAG', title: '视觉算法', en: 'Vision & algorithms', description: '感知赛场,理解目标,做出下一步决策。', enDescription: 'Perceive the field. Understand the next move.', tags: 'OpenCV / 目标检测 / 自主决策', href: '/zh-cn/vsag/intro/', icon: 'vsag' }, + { code: 'PRAM', title: '宣传筹划', en: 'Operations & media', description: '记录每一次迭代,让工程故事被看见。', enDescription: 'Document every iteration. Share the engineering story.', tags: '视觉设计 / 内容创作 / 团队协作', href: '/zh-cn/pram/getting-started/', icon: 'pram' }, +]; +export const reading = [ + { code: 'START HERE', title: '新队员,从这里开始', en: 'Your first steps with Simba', description: '认识知识库,选择方向,完成第一次实践。', enDescription: 'Find your discipline and start a first project.', href: '/zh-cn/guides/getting-started/', label: '入门指南', enLabel: 'GETTING STARTED' }, + { code: 'BUILD TOGETHER', title: '把经验写成下一份文档', en: 'Turn experience into documentation', description: '使用统一的结构,记录问题、过程与验证结果。', enDescription: 'Capture the problem, process and verification.', href: '/zh-cn/guides/contributing/', label: '协作规范 · 示例', enLabel: 'CONTRIBUTING · SAMPLE' }, + { code: 'FIELD NOTES', title: '一次视觉任务的完整链路', en: 'Inside a vision pipeline', description: '从图像输入到控制输出,拆解模块与接口。', enDescription: 'Trace a frame from camera input to control output.', href: '/zh-cn/vsag/pipeline/', label: '技术笔记 · 示例', enLabel: 'TECHNICAL NOTE · SAMPLE' }, +]; + diff --git a/src/styles/custom.css b/src/styles/custom.css new file mode 100644 index 0000000..1eda380 --- /dev/null +++ b/src/styles/custom.css @@ -0,0 +1,24 @@ +:root { + --sl-font: 'Segoe UI', 'Microsoft YaHei', system-ui, sans-serif; + --sl-font-mono: 'Cascadia Code', Consolas, monospace; + --sl-color-accent-low: #401820; + --sl-color-accent: #d91c3a; + --sl-color-accent-high: #ffb3bd; +} +:root[data-theme='light'] { + --sl-color-accent-low: #ffeaed; + --sl-color-accent: #c21932; + --sl-color-accent-high: #891328; +} +.docs-brand { display: inline-flex; align-items: center; gap: 11px; color: var(--sl-color-white); text-decoration: none; white-space: nowrap; } +.brand-icon { background: #090a0c; padding: 5px; display: flex; border-radius: 2px; } +.brand-name { font-size: 25px; line-height: 1.1; font-weight: 800; letter-spacing: -.04em; } +.brand-name small { display: block; margin-top: 5px; font: 8px/1.2 var(--sl-font-mono); letter-spacing: .14em; color: var(--sl-color-gray-2); } +:focus-visible { outline: 2px solid var(--sl-color-text-accent); outline-offset: 5px; } +.sl-markdown-content :is(h2, h3) { scroll-margin-top: 1rem; } +.sl-markdown-content table { font-size: .9rem; } +.sl-markdown-content details { padding: 1rem 1.2rem; border: 1px solid var(--sl-color-hairline); border-radius: 4px; } +.sl-markdown-content summary { cursor: pointer; font-weight: 600; } +.starlight-aside { border-radius: 0 4px 4px 0; } +@media print { .docs-brand { color: black; } } + diff --git a/src/styles/home.css b/src/styles/home.css new file mode 100644 index 0000000..6e8e0d4 --- /dev/null +++ b/src/styles/home.css @@ -0,0 +1,179 @@ +/* Only splash pages use the main site's fixed dark palette. Articles keep both themes. */ +:root:has(.docs-home) { + color-scheme: dark; + --sl-color-bg: #090a0c; --sl-color-bg-nav: #090a0c; + --sl-color-white: #f4f1ea; --sl-color-black: #090a0c; + --sl-color-gray-1: #e6e3df; --sl-color-gray-2: #c2c2c3; + --sl-color-gray-3: #96979c; --sl-color-gray-4: #565a60; + --sl-color-gray-5: #292c31; --sl-color-gray-6: #15171b; --sl-color-gray-7: #101216; + --sl-color-accent: #ff3047; --sl-color-accent-low: #401820; --sl-color-accent-high: #ffb3bd; + --sl-color-text: #c2c2c3; --sl-color-text-accent: #ff8998; + --sl-color-hairline: #ffffff1c; --sl-color-hairline-shade: #ffffff1c; + --sl-color-bg-inline-code: #181b20; --sl-nav-height: 5rem; +} +:root:has(.docs-home) .content-panel { padding: 0; } +:root:has(.docs-home) .sl-container { max-width: none; } +:root:has(.docs-home) .sl-container > * + * { margin-top: 0; } +:root:has(.docs-home) main { padding: 0; } +:root:has(.docs-home) .header { border-bottom: 1px solid #ffffff1c; } +.home-header { display: flex; align-items: center; justify-content: space-between; height: 100%; gap: 24px; max-width: 1440px; margin: auto; } +.home-header nav { display: flex; align-items: stretch; height: calc(var(--sl-nav-height) - 1px); } +.home-header nav a { display: flex; align-items: center; gap: 8px; padding: 0 19px; color: #c2c2c3; text-decoration: none; font-size: 13px; border-bottom: 2px solid transparent; } +.home-header nav a span { color: #ff5a6d; font: 10px var(--sl-font-mono); } +.home-header nav a:hover, .home-header nav a.active { background: #ffffff04; color: #fff; border-color: #ff3047; } +.home-tools { display: flex; align-items: center; gap: 18px; } +.home-tools site-search button[data-open-modal] { width: 40px; height: 40px; justify-content: center; background: transparent; border: 1px solid #ffffff22; padding: 0; } +.home-tools site-search button[data-open-modal] > :not(svg) { display: none; } +.docs-home { --red: #ff3047; --paper: #f4f1ea; --muted: #96979c; --line: #ffffff1c; color: var(--paper); background: #090a0c; font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif; } +.docs-home a { text-decoration: none; } +.docs-home a:focus-visible { outline: 2px solid #ff8998; outline-offset: 5px; } +.home-hero { position: relative; overflow: hidden; border-bottom: 1px solid var(--line); } +.hero-backdrop { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 65% center; opacity: .55; } +.home-hero::after { content: ''; position: absolute; inset: 0; background: linear-gradient(90deg, #090a0cf5 5%, #090a0ccc 35%, #090a0c15 75%), linear-gradient(0deg, #090a0c 2%, transparent 45%); pointer-events: none; } +.hero-grid { position: absolute; inset: 0; background-image: linear-gradient(#ffffff05 1px, transparent 1px), linear-gradient(90deg, #ffffff05 1px, transparent 1px); background-size: 80px 80px; } +.hero-shell { position: relative; z-index: 1; max-width: 1320px; margin: auto; padding: 64px 48px 50px; } +.eyebrow { display: flex; align-items: center; gap: 13px; font: 10px var(--sl-font-mono); letter-spacing: .1em; } +.eyebrow > span { background: var(--red); color: white; padding: 7px 10px; } +.eyebrow b { font-weight: 500; color: #c2c2c3; } +.home-hero h1 { font-family: 'Arial Black', 'Segoe UI', sans-serif; font-size: clamp(64px, 7.8vw, 108px); letter-spacing: -.065em; line-height: .97; font-weight: 900; margin: 30px 0 24px; } +.home-hero h1 > span { display: block; } +.home-hero .outline { -webkit-text-stroke: 1px #a4a4a7; color: transparent; margin-left: .58em; } +.red { color: var(--red); } +.hero-copy h2 { font-size: clamp(19px, 2vw, 25px); letter-spacing: .04em; font-weight: 650; } +.hero-copy p { font-size: 13px; color: #b6b7bc; line-height: 1.9; margin-top: 12px; } +.hero-actions { display: flex; gap: 12px; margin-top: 27px; flex-wrap: wrap; } +.home-button { display: inline-flex; min-height: 48px; align-items: center; justify-content: space-between; gap: 40px; padding: 0 22px; border: 1px solid #ffffff38; color: var(--paper); font-size: 13px; font-weight: 600; transition: background .2s, border-color .2s; } +.home-button span { font-size: 20px; font-weight: 400; } +.home-button.primary { background: var(--red); border-color: var(--red); color: white; } +.home-button:hover { border-color: var(--red); background: #ff304720; } +.home-button.primary:hover { background: #da1b34; } +.image-caption { position: absolute; right: 48px; bottom: 55px; padding: 14px 16px; border: 1px solid #ffffff26; background: #090a0cbb; font: 9px/2 var(--sl-font-mono); letter-spacing: .08em; color: #c2c2c3; } +.image-caption > span:last-child { color: #878a90; padding-left: 13px; } +.signal { display: inline-block; width: 5px; height: 5px; background: #66e6a4; margin-right: 6px; vertical-align: middle; } +.hero-bottom { position: relative; z-index: 1; max-width: 1224px; padding: 23px 0; margin: auto; border-top: 1px solid var(--line); display: flex; align-items: center; gap: 36px; } +.hero-bottom > div { display: flex; align-items: baseline; gap: 10px; } +.hero-bottom strong { font: 600 27px/1 var(--sl-font-mono); } +.hero-bottom span { font-size: 11px; color: var(--muted); } +.hero-bottom .hero-motto { color: #858991; font: 9px var(--sl-font-mono); letter-spacing: .09em; margin-left: auto; } +.hero-bottom > a { display: flex; align-items: center; gap: 20px; font-size: 10px; color: #c2c2c3; } +.hero-bottom > a span { color: var(--red); font-size: 21px; } +.home-inner { max-width: 1320px; padding: 0 48px; margin: auto; } +.competition-notice { margin-top: 32px; display: flex; align-items: center; gap: 24px; background: linear-gradient(100deg, #ff304710, #111316 70%); border: 1px solid #ff304738; border-left: 3px solid var(--red); padding: 22px 26px; color: var(--paper); } +.notice-tag { font: 11px var(--sl-font-mono); color: #ff7a8b; letter-spacing: .04em; white-space: nowrap; } +.notice-copy { display: flex; flex-direction: column; gap: 6px; } +.notice-copy strong { font-size: 14px; font-weight: 600; } +.notice-copy > span { color: var(--muted); font-size: 11px; } +.notice-link { display: flex; align-items: center; gap: 24px; margin-left: auto; font-size: 11px; white-space: nowrap; } +.notice-link b { font-size: 20px; font-weight: 400; color: var(--red); } +.competition-notice:hover { border-color: var(--red); } +.knowledge-section { padding-top: 78px; scroll-margin-top: 7rem; } +.section-eyebrow { display: flex; align-items: center; gap: 12px; color: #989ca4; font: 10px/1.5 var(--sl-font-mono); letter-spacing: .13em; } +.section-eyebrow > span { color: var(--red); } +.section-eyebrow i { width: 60px; height: 1px; background: var(--line); } +.section-heading { display: flex; align-items: end; justify-content: space-between; gap: 24px; margin: 16px 0 30px; } +.section-heading h2 { font-size: clamp(24px, 2.6vw, 33px); letter-spacing: -.04em; font-weight: 650; } +.section-heading p { color: var(--muted); font-size: 12px; line-height: 1.9; } +.discipline-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); } +.discipline-card { color: var(--paper); background: #101215; border: 1px solid var(--line); padding: 26px 22px 18px; min-width: 0; transition: background .2s, border-color .2s; } +.discipline-card + .discipline-card { border-left: 0; } +.card-top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 28px; } +.card-top span { font: 10px var(--sl-font-mono); color: #a7aab0; } +.card-top img { opacity: .9; } +.discipline-card h3 { font-size: 21px; font-weight: 650; } +.discipline-card p { color: var(--muted); font-size: 12px; line-height: 1.9; margin-top: 13px; min-height: 46px; } +.card-bottom { display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--line); padding-top: 20px; margin-top: 25px; gap: 6px; } +.card-bottom span { font-size: 9px; color: #b0b1b7; } +.card-bottom b { color: var(--red); font-size: 20px; font-weight: 400; } +.discipline-card:hover { background: #19171c; box-shadow: inset 0 2px var(--red); } +.reading-section { padding-top: 76px; } +.text-link { color: #dddde0; font-size: 12px; white-space: nowrap; } +.text-link span { color: var(--red); margin-left: 14px; } +.reading-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; } +.reading-card { border-top: 1px solid #ffffff35; padding: 24px 0; color: var(--paper); } +.reading-index { display: flex; gap: 18px; font: 11px var(--sl-font-mono); color: var(--red); } +.reading-index b { font-size: 9px; color: #878b93; font-weight: 400; letter-spacing: .08em; } +.reading-card h3 { font-size: 17px; margin-top: 20px; font-weight: 600; } +.reading-card p { color: var(--muted); font-size: 12px; margin-top: 11px; line-height: 1.9; } +.reading-card > div { display: flex; align-items: center; justify-content: space-between; margin-top: 26px; color: #a3a6af; font-size: 10px; } +.reading-card > div > b { color: var(--red); font-size: 21px; font-weight: 400; } +.reading-card:hover { border-color: var(--red); } +.contribute-panel { display: flex; justify-content: space-between; align-items: center; gap: 30px; border: 1px solid var(--line); background: #101215; padding: 38px; margin: 45px 0 72px; } +.contribute-panel .section-eyebrow { color: #ff7a8b; font-size: 9px; } +.contribute-panel h2 { font-size: 23px; margin-top: 13px; font-weight: 600; } +.contribute-panel p { font-size: 12px; color: var(--muted); margin-top: 12px; line-height: 1.8; } +.contribute-panel .home-button { flex-shrink: 0; } +.home-ticker { border-block: 1px solid var(--line); padding: 15px 24px; overflow: hidden; white-space: nowrap; color: #b4b6bd; font: 10px var(--sl-font-mono); letter-spacing: .17em; text-align: center; } +.home-ticker span { color: var(--red); margin: 0 28px; } +.home-footer { max-width: 1320px; padding: 48px 48px 22px; margin: auto; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 36px; } +.home-footer img { object-fit: contain; object-position: left; } +.home-footer p { font-size: 11px; color: var(--muted); line-height: 1.9; margin-top: 16px; } +.footer-links { display: flex; gap: 35px; } +.footer-links a { color: #c2c2c3; font-size: 11px; } +.footer-links a:hover { color: #ff7a8b; } +.footer-bottom { width: 100%; border-top: 1px solid var(--line); padding-top: 22px; display: flex; justify-content: space-between; gap: 16px; color: #8c9098; font: 8px var(--sl-font-mono); letter-spacing: .06em; flex-wrap: wrap; } +@media (min-width: 1440px) { .hero-backdrop { object-position: center 43%; } } +@media (max-width: 1100px) { + .home-header nav a { padding-inline: 12px; } + .home-tools { gap: 10px; } + .hero-bottom { margin-inline: 48px; } + .hero-bottom .hero-motto { display: none; } + .hero-bottom > a { margin-left: auto; } + .image-caption { display: none; } + .discipline-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; } + .discipline-card + .discipline-card { border-left: 1px solid var(--line); } +} +@media (max-width: 760px) { + :root:has(.docs-home) { --sl-nav-height: 4.5rem; } + .home-header { gap: 12px; } + .home-header nav { display: none; } + .home-tools { margin-left: auto; } + .hero-shell { padding: 45px 24px 35px; } + .home-hero h1 { font-size: clamp(60px, 13vw, 92px); } + .hero-backdrop { object-position: 66% center; opacity: .3; } + .home-hero::after { background: linear-gradient(90deg, #090a0cd9, #090a0c33), linear-gradient(0deg, #090a0c, transparent); } + .eyebrow { font-size: 8px; gap: 9px; } + .hero-bottom { margin-inline: 24px; gap: 24px; } + .hero-bottom > a { font-size: 0; gap: 0; } + .hero-bottom strong { font-size: 23px; } + .home-inner { padding-inline: 24px; } + .competition-notice { flex-wrap: wrap; gap: 12px; padding: 20px; } + .notice-tag { width: 100%; } + .notice-copy strong { font-size: 13px; } + .notice-link { margin: 5px 0 0; } + .knowledge-section, .reading-section { padding-top: 54px; } + .section-heading { align-items: start; flex-direction: column; gap: 13px; } + .section-heading p br { display: none; } + .discipline-card { padding: 22px 17px 16px; } + .card-top { margin-bottom: 22px; gap: 6px; } + .card-top img { width: 32px; height: 32px; } + .card-top span { font-size: 9px; } + .discipline-card h3 { font-size: 18px; } + .card-bottom { margin-top: 20px; gap: 10px; } + .card-bottom span { line-height: 1.8; } + .reading-grid { grid-template-columns: 1fr; gap: 8px; } + .reading-card { padding-block: 22px; } + .reading-card h3 { margin-top: 15px; } + .reading-card > div { margin-top: 15px; } + .contribute-panel { flex-direction: column; align-items: start; padding: 26px; margin: 30px 0 50px; } + .contribute-panel h2 { font-size: 21px; } + .home-footer { padding: 36px 24px 22px; } + .footer-links { gap: 24px; flex-wrap: wrap; } +} +@media (max-width: 380px) { + .discipline-grid { grid-template-columns: 1fr; } + .home-tools { gap: 4px; } + .brand-name { font-size: 22px; } + .brand-name small { font-size: 7px; } + .docs-brand { gap: 7px; } + .hero-bottom { gap: 16px; } +} +@media (prefers-reduced-motion: reduce) { .docs-home * { transition: none; } } +@media print { + .docs-home { --paper: #111; --muted: #555; --line: #ddd; background: white; color: black; } + .hero-backdrop, .hero-grid, .home-hero::after, .home-ticker, .image-caption { display: none; } + .home-hero .outline { color: black; -webkit-text-stroke: 0; } + .hero-shell { padding: 20px; } + .home-hero h1 { font-size: 45px; } +} + +