diff --git a/README.md b/README.md index 05bf37a..a5ca88e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,13 @@ -# 王元有 - 前端工程师简历网站 +# Wang Yuanyou Fluid Portfolio -基于 Astro 的个人简历网站,内容整理自 `王元有-前端工程师.pdf`。 +Independent Vite + Three.js portfolio site for 王元有, focused on a more grounded frontend-engineering resume. ## Commands ```bash npm install -npm run dev +npm run dev -- --port 5177 +npm run build ``` + +The page uses a restrained scroll-aware WebGL backdrop, critical first-paint styling, grounded resume summaries, responsive layout, subtle scroll reveals, project cards, skills, experience, and contact sections. diff --git a/astro.config.mjs b/astro.config.mjs deleted file mode 100644 index f1f0c30..0000000 --- a/astro.config.mjs +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from "astro/config"; - -export default defineConfig({ - output: "static", -}); diff --git a/docs/plans/2026-06-11-ai-dialogue-redesign-design.md b/docs/plans/2026-06-11-ai-dialogue-redesign-design.md new file mode 100644 index 0000000..910ab8b --- /dev/null +++ b/docs/plans/2026-06-11-ai-dialogue-redesign-design.md @@ -0,0 +1,87 @@ +# 设计文档:「与湛兮(花名)的数字思维体对话」作品集重设计 + +日期:2026-06-11 +状态:已批准 +备份:`../wang-yuanyou-fluid-portfolio-backup-20260611-110154/` + +## 概念 + +整站是访客与「湛兮(花名)的 AI 分身」的一场对话记录。简历核心(最近一年做 SSE 流式对话、打字机渲染、思考态动画)即设计语言来源——网站本身就是其工作成果的活演示。3D 流体 =「思维体」,是画面中唯一的角色。 + +决策记录: + +- 设计隐喻:AI 对话流(vs 职业河流 / 跨端粒子宇宙) +- 推进方式:滚动驱动的对话(vs 真·对话界面 / 滚动+问答入口) +- 流体形态:单一思维流体 + 三状态状态机(vs raymarched metaballs / GPGPU 粒子流) +- 视觉基调:深色 AI 实验室(vs 浅色编辑风 / 双主题) +- 技术路线:原生 Three.js 自写 shader + GSAP ScrollTrigger + Lenis(vs 纯手写 / R3F) + +## 信息架构:7 轮问答 + +| # | 访客提问 | 回答内容 | 数据源 | +|---|---|---|---| +| 0 | —(开机自检) | 「你好,我是湛兮(花名)。」+ 身份一行 + 6 指标 token 式吐出 | metrics | +| 1 | 先介绍一下你自己? | 4 条概述逐行流式输出 | resumeSignals | +| 2 | 最近一年具体在做什么? | 4 张焦点卡依次「生成」 | focusAreas | +| 3 | 有实际项目证明吗? | 4 个项目,各为一轮子对话:项目名打字机 → 模块逐条吐出 | projects | +| 4 | 技能栈展开讲讲? | 7 组技能标签 token 流喷发归位 | skills | +| 5 | 之前的团队经历? | 3 段经历沿垂直对话流时间线生成 | experiences | +| 6 | 怎么联系你? | 联系方式 + 流体归于平静,「对话已保存」收尾 | — | + +页面右侧(移动端顶部)设「会话进度轨」:7 节点对应 7 轮,可点击跳转,保证 HR 快速扫读。 + +## 思维流体(Three.js 自写 shader) + +- 几何:高细分 IcosahedronGeometry;顶点着色器 3 层 FBM simplex 噪声液态位移 +- 片元:Fresnel 边缘辉光 + 双色渐变(青 #22d3ee ↔ 紫 #a78bfa)+ 加性内核光晕 +- 伴生粒子:约 2000 GPU 粒子,curl noise 流场 +- 状态机(uniform 插值过渡): + - `idle`:低频低幅呼吸,粒子懒散环绕 + - `thinking`:收缩 0.85x,噪声频率 ×3 搅动,色温升高,粒子吸入 + - `answering`:回弹 1.1x 归位,粒子向内容区喷发消散,辉光脉冲与文字生成同步 +- 流体位置随轮次左右缓移(lerp)与内容互让;鼠标轻微视差 + +## 非线性动画编排(GSAP ScrollTrigger + Lenis) + +每轮问答为一个 pin 区段,滚动量映射轮内时间轴: + +1. 提问(0→15%):访客气泡逐字打出,steps() 离散节奏 +2. 思考(15→35%):流体 thinking,内容区仅 shimmer 占位——刻意停顿即非线性核心 +3. 爆发生成(35→75%):expo.out 爆发;标题打字机、卡片不等间隔 stagger(模拟 token 不均匀到达)、数字滚动跳变 +4. 余韵(75→100%):流体回 idle,内容微视差上浮,解除 pin + +每轮思考时长 / 爆发曲线 / stagger 间隔均不同(场景配置驱动),避免节奏雷同。向上滚动时时间轴反播,内容「被收回」。 + +降级:`prefers-reduced-motion` → 关 pin 与打字机、内容直出、流体仅呼吸;移动端粒子减半、DPR ≤ 2、细分降档。 + +## 视觉系统 + +- 背景 #070b14 近黑蓝 + 极淡网格点阵 + 流体环境光溢出 +- 强调色:青 #22d3ee(访客/交互)、紫 #a78bfa(思维体/回答)、琥珀 #fbbf24(仅指标数字) +- 气泡语言:提问 = 右对齐细边框气泡;回答 = 无框流式文本块 + 左侧渐变「生成光标」竖线 +- 字体:等宽(JetBrains Mono / 思源等宽回退)用于指标、token、技能标签;正文 Inter + 思源黑体 +- 细节:回答块尾闪烁光标 ▋;项目 logo 复用 public/logos/ + +## 文件结构 + +``` +src/ + main.js # 入口:装配 + Lenis + 进度轨 + resume-data.js # 不动(数据即简历) + dialogue.js # 7 轮问答文案与节奏配置 + render.js # 由 resume-data 生成各轮 DOM + choreography.js # GSAP ScrollTrigger 时间轴编排 + mind/ + mind.js # 流体场景、状态机、粒子 + shaders.js # GLSL + styles.css # 重写 +index.html # 重写骨架 +``` + +新依赖:gsap、lenis。重写 main.js / styles.css / index.html(旧版已整目录备份)。 + +## 性能与验收 + +- 单 canvas 固定底层;rAF 与 GSAP ticker 合并;目标桌面 60fps、移动 30fps+ +- 文字全部真实 DOM(可选中/可索引),打字机仅控制 reveal;进度轨 + 锚点保证可跳转 +- 验收:7 轮完整走查(含回滚反播)、375px 移动端、reduced-motion 降级、Lighthouse 不低于现版本 diff --git a/docs/plans/2026-06-11-ai-dialogue-redesign.md b/docs/plans/2026-06-11-ai-dialogue-redesign.md new file mode 100644 index 0000000..ef490db --- /dev/null +++ b/docs/plans/2026-06-11-ai-dialogue-redesign.md @@ -0,0 +1,56 @@ +# 「数字思维体对话」作品集重设计 实现计划 + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** 将现有作品集重写为「与湛兮(花名)的 AI 分身对话」式单页站点:滚动驱动的 7 轮问答 + shader 思维流体状态机。 + +**Architecture:** Vite 原生 JS。`resume-data.js` 不动;`dialogue.js` 定义 7 轮问答节奏配置;`render.js` 生成 DOM;`mind/` 为 Three.js shader 流体(idle/thinking/answering 状态机 + GPU 粒子);`choreography.js` 用 GSAP ScrollTrigger pin+scrub 编排每轮「提问→思考→爆发生成→余韵」;Lenis 平滑滚动。 + +**Tech Stack:** Vite 7, Three.js 0.184, GSAP ScrollTrigger, Lenis, 自写 GLSL(FBM simplex + Fresnel)。 + +**设计文档:** `docs/plans/2026-06-11-ai-dialogue-redesign-design.md`(已批准) +**备份:** `../wang-yuanyou-fluid-portfolio-backup-20260611-110154/` + +--- + +### Task 1: 依赖安装 +- `pnpm add gsap lenis` +- 验证: package.json 出现两依赖,`pnpm dev` 可启动。 + +### Task 2: `src/dialogue.js` — 轮次配置 +- 7 轮:boot / intro(resumeSignals) / focus(focusAreas) / projects / skills / experience / contact。 +- 每轮字段:id、label(进度轨)、question、type、side(流体停靠 -1/1)、palette(双色)、pinLength、qEnd/thinkEnd(相位)、staggerEach——逐轮不同以保证节奏差异。 +- 联系信息常量:邮箱 419021733@qq.com / wmagmgema521@gmail.com、电话 19980439383、GitHub zhanBoss、男·29岁·电子科技大学 信息管理与信息系统 本科。 + +### Task 3: `index.html` — 骨架重写 +- canvas#mind-canvas(fixed 底层)、.grid-overlay、header.hud(左:姓名/DIGITAL MIND;右:● ONLINE 状态灯)、nav#session-rail、main#dialogue(空,由 render.js 填充)、Google Fonts(JetBrains Mono + Inter, display=swap)。 + +### Task 4: `src/styles.css` — 深色 AI 实验室 +- 背景 #070b14、点阵网格 overlay、青 #22d3ee / 紫 #a78bfa / 琥珀 #fbbf24。 +- 气泡语言:.q-bubble 右对齐细边框;.answer 左侧渐变生成竖线 + 尾部 ▋ 闪烁光标;token/指标/技能用等宽字体。 +- 各轮内容样式:metrics token、focus 卡、project 块、skill 标签云、timeline、contact。 +- 进度轨右侧固定(移动端转顶部水平);≤768px 移动端布局;prefers-reduced-motion 关闭闪烁。 + +### Task 5: `src/render.js` — DOM 生成 +- 每轮 section.round 结构:q-bubble(空文本,编排时打字)→ .thinking(三点 shimmer)→ .answer(.gen 子项供 stagger)。 +- 按 type 分发渲染器,全部读 resume-data.js;boot 轮含问候打字行 + 身份行 + metrics token。 +- 文案全部真实 DOM(初始由 CSS/GSAP 隐藏,reduced-motion 时直接可见)。 + +### Task 6: `src/mind/shaders.js` + `src/mind/mind.js` — 思维流体 +- 顶点:Ashima simplex 3D + 3 octave FBM 位移;片元:Fresnel 辉光 + uColorA/uColorB 渐变 + uHeat 色温 + AdditiveBlending。 +- 粒子:~2000(移动端 900),属性 seed/radius/speed/phase,轨道半径受 uAttract(吸入)与 uBurst(喷发,setState('answering') 时置 1 后衰减)控制,全 GPU。 +- 状态机 STATES{idle, thinking, answering},每帧 lerp uniforms;setSide(dir) 左右停靠(移动端居中缩小);setPalette 双色渐变;指针视差;DPR≤2;resize。 + +### Task 7: `src/choreography.js` — 滚动编排 +- Lenis + ScrollTrigger 集成(gsap.ticker 驱动)。 +- boot 轮:页面加载后时间驱动的开场时间轴(非滚动)。 +- 轮 1-6:pin + scrub 时间轴,相位 0→qEnd 打字(steps 离散)→thinkEnd 思考 shimmer→0.78 爆发 stagger(expo.out,不等间隔)→1 余韵视差;onUpdate 按相位切 mind 状态;enter/enterBack 切 side+palette。 +- 进度轨高亮与 lenis.scrollTo 跳转。 +- reduced-motion:跳过 pin/打字机,内容直出。 + +### Task 8: `src/main.js` — 装配 +- 渲染 DOM → 建 rail → createMind → choreography → boot 开场。 + +### Task 9: 验证 +- `pnpm dev` + Playwright:桌面 1440px 走查 7 轮(截图 hero/中段/尾段)、向上回滚反播、375px 移动端、console 无错误。 +- `pnpm build` 成功。 diff --git a/index.html b/index.html new file mode 100644 index 0000000..82c955c --- /dev/null +++ b/index.html @@ -0,0 +1,41 @@ + + + + + + 湛兮(花名) · 数字思维体 / Digital Mind + + + + + + + + + + + +
+
+ ZHAN XI + DIGITAL MIND · v7.0 +
+
+ + ONLINE +
+
+ + + +
+ + + + diff --git a/package-lock.json b/package-lock.json index c1ae73c..6842171 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,185 +1,18 @@ { - "name": "wang-yuanyou-resume-site", + "name": "wang-yuanyou-fluid-portfolio", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "wang-yuanyou-resume-site", + "name": "wang-yuanyou-fluid-portfolio", "version": "1.0.0", "dependencies": { - "astro": "^6.3.1" + "three": "^0.184.0", + "vite": "^7.2.7" }, "devDependencies": {} }, - "node_modules/@astrojs/compiler": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-4.0.0.tgz", - "integrity": "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==", - "license": "MIT" - }, - "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/@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/@astrojs/prism": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", - "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", - "license": "MIT", - "dependencies": { - "prismjs": "^1.30.0" - }, - "engines": { - "node": ">=22.12.0" - } - }, - "node_modules/@astrojs/telemetry": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz", - "integrity": "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==", - "license": "MIT", - "dependencies": { - "ci-info": "^4.4.0", - "dset": "^3.1.4", - "is-docker": "^4.0.0", - "is-wsl": "^3.1.1", - "which-pm-runs": "^1.1.0" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@capsizecss/unpack": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", - "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", - "license": "MIT", - "dependencies": { - "fontkitten": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@clack/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.3.1.tgz", - "integrity": "sha512-fT1qHVGAag4IEkrupZ6lRRbNCs1vS9P01KB/sG8zKgvUztbYtFBtQpjSITNwooDZ83tpsPzP0mRNs1/KVszCRA==", - "license": "MIT", - "dependencies": { - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" - } - }, - "node_modules/@clack/prompts": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.4.0.tgz", - "integrity": "sha512-S0My7XPGIgpRWMDG8uRqalbgT+a6FmCUdOW+HaIOVVpUPHOb7RrpvjTjiODadKp06fsrVDJZlIzc6yCTp4AnxA==", - "license": "MIT", - "dependencies": { - "@clack/core": "1.3.1", - "fast-string-width": "^3.0.2", - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.7", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", @@ -596,510 +429,10 @@ "node": ">=18" } }, - "node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@oslojs/encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", - "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", - "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", "cpu": [ "arm" ], @@ -1110,9 +443,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", - "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", "cpu": [ "arm64" ], @@ -1123,9 +456,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", - "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", "cpu": [ "arm64" ], @@ -1136,9 +469,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", - "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", "cpu": [ "x64" ], @@ -1149,9 +482,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", - "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", "cpu": [ "arm64" ], @@ -1162,9 +495,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", - "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", "cpu": [ "x64" ], @@ -1175,9 +508,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", - "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", "cpu": [ "arm" ], @@ -1188,9 +521,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", - "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", "cpu": [ "arm" ], @@ -1201,9 +534,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", - "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", "cpu": [ "arm64" ], @@ -1214,9 +547,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", - "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", "cpu": [ "arm64" ], @@ -1227,9 +560,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", - "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", "cpu": [ "loong64" ], @@ -1240,9 +573,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", - "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", "cpu": [ "loong64" ], @@ -1253,9 +586,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", - "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", "cpu": [ "ppc64" ], @@ -1266,9 +599,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", - "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", "cpu": [ "ppc64" ], @@ -1279,9 +612,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", - "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", "cpu": [ "riscv64" ], @@ -1292,9 +625,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", - "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", "cpu": [ "riscv64" ], @@ -1305,9 +638,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", - "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", "cpu": [ "s390x" ], @@ -1318,9 +651,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", - "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", "cpu": [ "x64" ], @@ -1331,9 +664,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", - "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", "cpu": [ "x64" ], @@ -1344,9 +677,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", - "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", "cpu": [ "x64" ], @@ -1357,9 +690,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", - "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", "cpu": [ "arm64" ], @@ -1370,9 +703,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", - "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", "cpu": [ "arm64" ], @@ -1383,9 +716,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", - "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", "cpu": [ "ia32" ], @@ -1396,9 +729,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", - "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", "cpu": [ "x64" ], @@ -1409,9 +742,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", - "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", "cpu": [ "x64" ], @@ -1421,711 +754,12 @@ "win32" ] }, - "node_modules/@shikijs/core": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.1.0.tgz", - "integrity": "sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ==", - "license": "MIT", - "dependencies": { - "@shikijs/primitive": "4.1.0", - "@shikijs/types": "4.1.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.1.0.tgz", - "integrity": "sha512-YquhawCUgaBfhsS72e2Y/dI59gCBNPHu3fEO/tvLaXrTssxZrY5ddjtNLTwndrMgPo8b3IscE+xoICDzpTmlFQ==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.1.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.6" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.1.0.tgz", - "integrity": "sha512-axLpjVs45YBvvINa+dJF+NPW+KtFkNXsFr4SDw2BMj9GdeMnGxVB9PQb2xXlJYovslt/nz6giedAyOANkfc7hg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.1.0", - "@shikijs/vscode-textmate": "^10.0.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/langs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.1.0.tgz", - "integrity": "sha512-nwOMruEkbgdZfQ/b8CgpNBVOpvG1k0N5tbmgiFeqsan401+x3ILqlzZJowSla4Agmq4hG2Uf2wh5jLTEhR8VSg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.1.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/primitive": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.1.0.tgz", - "integrity": "sha512-zx2/2Uwj2q9X3KSyYREEhXO23xBw5WUhP4orK2lE4r+t9JGITmEe0JH+wPmJhqHpOT2bRRs6lAL945+LDvOAGw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.1.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/themes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.1.0.tgz", - "integrity": "sha512-emCcTnUM7yO2wltYbaxm+yLvcCI4+h8XBKc4KmJ7EZUXoSGjcCHifkI//R4OFit9ewpg7H2/9tjOuXrT2v/Knw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.1.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.1.0.tgz", - "integrity": "sha512-3EQWX54fMpniOrDblzAhiwiJwpiTMW6+B9DWyUd9ska483tbayFYuw47UxwuPknI31bKnySfVQ/QW+jFL4rFdA==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "license": "MIT" - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/nlcst": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", - "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", - "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", - "license": "ISC" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/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", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-iterate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/astro": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/astro/-/astro-6.3.7.tgz", - "integrity": "sha512-zIeDRrI0qNgN1lcCjNqt6/IVCVej7VwSa326cO8uP9BOk1cg4QuffhLnOn2gCgWQr32/wxpSRFfXiLKHglu1Tw==", - "license": "MIT", - "dependencies": { - "@astrojs/compiler": "^4.0.0", - "@astrojs/internal-helpers": "0.9.1", - "@astrojs/markdown-remark": "7.1.2", - "@astrojs/telemetry": "3.3.2", - "@capsizecss/unpack": "^4.0.0", - "@clack/prompts": "^1.1.0", - "@oslojs/encoding": "^1.1.0", - "@rollup/pluginutils": "^5.3.0", - "aria-query": "^5.3.2", - "axobject-query": "^4.1.0", - "ci-info": "^4.4.0", - "clsx": "^2.1.1", - "common-ancestor-path": "^2.0.0", - "cookie": "^1.1.1", - "devalue": "^5.6.3", - "diff": "^8.0.3", - "dset": "^3.1.4", - "es-module-lexer": "^2.0.0", - "esbuild": "^0.27.3", - "flattie": "^1.1.1", - "fontace": "~0.4.1", - "get-tsconfig": "5.0.0-beta.4", - "github-slugger": "^2.0.0", - "html-escaper": "3.0.3", - "http-cache-semantics": "^4.2.0", - "js-yaml": "^4.1.1", - "jsonc-parser": "^3.3.1", - "magic-string": "^0.30.21", - "magicast": "^0.5.2", - "mrmime": "^2.0.1", - "neotraverse": "^0.6.18", - "obug": "^2.1.1", - "p-limit": "^7.3.0", - "p-queue": "^9.1.0", - "package-manager-detector": "^1.6.0", - "piccolore": "^0.1.3", - "picomatch": "^4.0.4", - "rehype": "^13.0.2", - "semver": "^7.7.4", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "svgo": "^4.0.1", - "tinyclip": "^0.1.12", - "tinyexec": "^1.0.4", - "tinyglobby": "^0.2.15", - "ultrahtml": "^1.6.0", - "unifont": "~0.7.4", - "unist-util-visit": "^5.1.0", - "unstorage": "^1.17.5", - "vfile": "^6.0.3", - "vite": "^7.3.2", - "vitefu": "^1.1.2", - "xxhash-wasm": "^1.1.0", - "yargs-parser": "^22.0.0", - "zod": "^4.3.6" - }, - "bin": { - "astro": "bin/astro.mjs" - }, - "engines": { - "node": ">=22.12.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/astrodotbuild" - }, - "optionalDependencies": { - "sharp": "^0.34.0" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/common-ancestor-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", - "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">= 18" - } - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cookie-es": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", - "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", - "license": "MIT" - }, - "node_modules/crossws": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", - "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", - "license": "MIT", - "dependencies": { - "uncrypto": "^0.1.3" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/defu": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", - "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devalue": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", - "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", - "license": "MIT" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/diff": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", - "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dset": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", - "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", - "license": "MIT" - }, "node_modules/esbuild": { "version": "0.27.7", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", @@ -2167,60 +801,6 @@ "@esbuild/win32-x64": "0.27.7" } }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "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/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", - "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", - "license": "MIT" - }, - "node_modules/fast-string-width": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", - "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", - "license": "MIT", - "dependencies": { - "fast-string-truncated-width": "^3.0.2" - } - }, - "node_modules/fast-wrap-ansi": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", - "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", - "license": "MIT", - "dependencies": { - "fast-string-width": "^3.0.2" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -2238,36 +818,6 @@ } } }, - "node_modules/flattie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", - "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/fontace": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", - "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", - "license": "MIT", - "dependencies": { - "fontkitten": "^1.0.2" - } - }, - "node_modules/fontkitten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", - "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", - "license": "MIT", - "dependencies": { - "tiny-inflate": "^1.0.3" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2282,1203 +832,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "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", - "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "engines": { - "node": ">=20.20.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "license": "ISC" - }, - "node_modules/h3": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", - "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", - "license": "MIT", - "dependencies": { - "cookie-es": "^1.2.3", - "crossws": "^0.3.5", - "defu": "^6.1.6", - "destr": "^2.0.5", - "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.4", - "radix3": "^1.1.2", - "ufo": "^1.6.3", - "uncrypto": "^0.1.3" - } - }, - "node_modules/hast-util-from-html": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", - "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - "license": "MIT" - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" - }, - "node_modules/iron-webcrypto": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", - "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/brc-dd" - } - }, - "node_modules/is-docker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", - "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "license": "MIT" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/lru-cache": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.0.tgz", - "integrity": "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", - "source-map-js": "^1.2.1" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-definitions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", - "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "license": "CC0-1.0" - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/nanoid": { "version": "3.3.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", @@ -3497,190 +850,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/neotraverse": { - "version": "0.6.18", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", - "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/nlcst-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", - "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "license": "MIT" - }, - "node_modules/node-mock-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", - "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/ofetch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", - "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", - "license": "MIT", - "dependencies": { - "destr": "^2.0.5", - "node-fetch-native": "^1.6.7", - "ufo": "^1.6.1" - } - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "license": "MIT" - }, - "node_modules/oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", - "license": "MIT", - "dependencies": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" - } - }, - "node_modules/p-limit": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", - "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.2.1" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", - "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.4", - "p-timeout": "^7.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", - "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", - "license": "MIT" - }, - "node_modules/parse-latin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", - "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "@types/unist": "^3.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-modify-children": "^4.0.0", - "unist-util-visit-children": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/piccolore": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", - "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", - "license": "ISC" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3727,287 +896,13 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/radix3": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "license": "MIT" - }, - "node_modules/rehype": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", - "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "rehype-parse": "^9.0.0", - "rehype-stringify": "^10.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", - "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-stringify": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", - "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-smartypants": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", - "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", - "license": "MIT", - "dependencies": { - "retext": "^9.0.0", - "retext-smartypants": "^6.0.0", - "unified": "^11.0.4", - "unist-util-visit": "^5.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/retext": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", - "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "retext-latin": "^4.0.0", - "retext-stringify": "^4.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-latin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", - "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "parse-latin": "^7.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-smartypants": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", - "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-stringify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", - "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/rollup": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", - "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -4017,143 +912,34 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.4", - "@rollup/rollup-android-arm64": "4.60.4", - "@rollup/rollup-darwin-arm64": "4.60.4", - "@rollup/rollup-darwin-x64": "4.60.4", - "@rollup/rollup-freebsd-arm64": "4.60.4", - "@rollup/rollup-freebsd-x64": "4.60.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", - "@rollup/rollup-linux-arm-musleabihf": "4.60.4", - "@rollup/rollup-linux-arm64-gnu": "4.60.4", - "@rollup/rollup-linux-arm64-musl": "4.60.4", - "@rollup/rollup-linux-loong64-gnu": "4.60.4", - "@rollup/rollup-linux-loong64-musl": "4.60.4", - "@rollup/rollup-linux-ppc64-gnu": "4.60.4", - "@rollup/rollup-linux-ppc64-musl": "4.60.4", - "@rollup/rollup-linux-riscv64-gnu": "4.60.4", - "@rollup/rollup-linux-riscv64-musl": "4.60.4", - "@rollup/rollup-linux-s390x-gnu": "4.60.4", - "@rollup/rollup-linux-x64-gnu": "4.60.4", - "@rollup/rollup-linux-x64-musl": "4.60.4", - "@rollup/rollup-openbsd-x64": "4.60.4", - "@rollup/rollup-openharmony-arm64": "4.60.4", - "@rollup/rollup-win32-arm64-msvc": "4.60.4", - "@rollup/rollup-win32-ia32-msvc": "4.60.4", - "@rollup/rollup-win32-x64-gnu": "4.60.4", - "@rollup/rollup-win32-x64-msvc": "4.60.4", + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/shiki": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.1.0.tgz", - "integrity": "sha512-l/ABZPUR5v70jI10EzqfMS/I96vjSGv2y0ihUV+WYFzv0EfvW4s54m0Lg8wCrrL+2IkwBzFTuxkZjPf8b2NX9Q==", - "license": "MIT", - "dependencies": { - "@shikijs/core": "4.1.0", - "@shikijs/engine-javascript": "4.1.0", - "@shikijs/engine-oniguruma": "4.1.0", - "@shikijs/langs": "4.1.0", - "@shikijs/themes": "4.1.0", - "@shikijs/types": "4.1.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/smol-toml": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", - "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4163,83 +949,16 @@ "node": ">=0.10.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/svgo": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", - "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", - "license": "MIT", - "dependencies": { - "commander": "^11.1.0", - "css-select": "^5.1.0", - "css-tree": "^3.0.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.1.1", - "sax": "^1.5.0" - }, - "bin": { - "svgo": "bin/svgo.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "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==", + "node_modules/three": { + "version": "0.184.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.184.0.tgz", + "integrity": "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg==", "license": "MIT" }, - "node_modules/tinyclip": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.12.tgz", - "integrity": "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==", - "license": "MIT", - "engines": { - "node": "^16.14.0 || >= 17.3.0" - } - }, - "node_modules/tinyexec": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", - "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -4252,346 +971,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "license": "MIT" - }, - "node_modules/ultrahtml": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", - "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", - "license": "MIT" - }, - "node_modules/uncrypto": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unifont": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", - "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", - "license": "MIT", - "dependencies": { - "css-tree": "^3.1.0", - "ofetch": "^1.5.1", - "ohash": "^2.0.11" - } - }, - "node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-modify-children": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", - "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "array-iterate": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-children": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", - "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unstorage": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", - "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", - "license": "MIT", - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^5.0.0", - "destr": "^2.0.5", - "h3": "^1.15.10", - "lru-cache": "^11.2.7", - "node-fetch-native": "^1.6.7", - "ofetch": "^1.5.1", - "ufo": "^1.6.3" - }, - "peerDependencies": { - "@azure/app-configuration": "^1.8.0", - "@azure/cosmos": "^4.2.0", - "@azure/data-tables": "^13.3.0", - "@azure/identity": "^4.6.0", - "@azure/keyvault-secrets": "^4.9.0", - "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6 || ^7 || ^8", - "@deno/kv": ">=0.9.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.3", - "@vercel/blob": ">=0.27.1", - "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1 || ^2 || ^3", - "aws4fetch": "^1.0.20", - "db0": ">=0.2.1", - "idb-keyval": "^6.2.1", - "ioredis": "^5.4.2", - "uploadthing": "^7.4.4" - }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@deno/kv": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/blob": { - "optional": true - }, - "@vercel/functions": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "uploadthing": { - "optional": true - } - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vite": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", - "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.5.tgz", + "integrity": "sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==", "license": "MIT", "dependencies": { "esbuild": "^0.27.0", @@ -4661,90 +1044,6 @@ "optional": true } } - }, - "node_modules/vitefu": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", - "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/package.json b/package.json index fa312ca..326ac42 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { - "name": "wang-yuanyou-resume-site", + "name": "wang-yuanyou-fluid-portfolio", "version": "1.0.0", "private": true, "type": "module", "scripts": { - "dev": "astro dev", - "build": "astro build", - "build:test": "PUBLIC_APP_ENV_LABEL=测试环境 astro build", - "build:prod": "PUBLIC_APP_ENV_LABEL=生产环境 astro build", - "preview": "astro preview" + "dev": "vite --host 0.0.0.0", + "build": "vite build", + "preview": "vite preview --host 0.0.0.0" }, "dependencies": { - "astro": "^6.3.1" - }, - "devDependencies": {} + "gsap": "^3.15.0", + "lenis": "^1.3.23", + "three": "^0.184.0", + "vite": "^7.2.7" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..0fee3e8 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,676 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + gsap: + specifier: ^3.15.0 + version: 3.15.0 + lenis: + specifier: ^1.3.23 + version: 1.3.23 + three: + specifier: ^0.184.0 + version: 0.184.0 + vite: + specifier: ^7.2.7 + version: 7.3.5 + +packages: + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@rollup/rollup-android-arm-eabi@4.61.1': + resolution: {integrity: sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.61.1': + resolution: {integrity: sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.61.1': + resolution: {integrity: sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.61.1': + resolution: {integrity: sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.61.1': + resolution: {integrity: sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.61.1': + resolution: {integrity: sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.61.1': + resolution: {integrity: sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.61.1': + resolution: {integrity: sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.61.1': + resolution: {integrity: sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.61.1': + resolution: {integrity: sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.61.1': + resolution: {integrity: sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.61.1': + resolution: {integrity: sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.61.1': + resolution: {integrity: sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.61.1': + resolution: {integrity: sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.61.1': + resolution: {integrity: sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.61.1': + resolution: {integrity: sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.61.1': + resolution: {integrity: sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.61.1': + resolution: {integrity: sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.61.1': + resolution: {integrity: sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.61.1': + resolution: {integrity: sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.61.1': + resolution: {integrity: sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.61.1': + resolution: {integrity: sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.61.1': + resolution: {integrity: sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.61.1': + resolution: {integrity: sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.61.1': + resolution: {integrity: sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gsap@3.15.0: + resolution: {integrity: sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A==} + + lenis@1.3.23: + resolution: {integrity: sha512-YxYq3TJqj9sJNv0V9SkyQHejt14xwyIwgDaaMK89Uf9SxQfIszu+gTQSSphh6BWlLTNVKvvXAGkg+Zf+oFIevg==} + peerDependencies: + '@nuxt/kit': '>=3.0.0' + react: '>=17.0.0' + vue: '>=3.0.0' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + react: + optional: true + vue: + optional: true + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + rollup@4.61.1: + resolution: {integrity: sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + three@0.184.0: + resolution: {integrity: sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + vite@7.3.5: + resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + +snapshots: + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@rollup/rollup-android-arm-eabi@4.61.1': + optional: true + + '@rollup/rollup-android-arm64@4.61.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.61.1': + optional: true + + '@rollup/rollup-darwin-x64@4.61.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.61.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.61.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.61.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.61.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.61.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.61.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.61.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.61.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.61.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.61.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.61.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.61.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.61.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.61.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.61.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.61.1': + optional: true + + '@types/estree@1.0.9': {} + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fsevents@2.3.3: + optional: true + + gsap@3.15.0: {} + + lenis@1.3.23: {} + + nanoid@3.3.12: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + rollup@4.61.1: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.61.1 + '@rollup/rollup-android-arm64': 4.61.1 + '@rollup/rollup-darwin-arm64': 4.61.1 + '@rollup/rollup-darwin-x64': 4.61.1 + '@rollup/rollup-freebsd-arm64': 4.61.1 + '@rollup/rollup-freebsd-x64': 4.61.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.1 + '@rollup/rollup-linux-arm-musleabihf': 4.61.1 + '@rollup/rollup-linux-arm64-gnu': 4.61.1 + '@rollup/rollup-linux-arm64-musl': 4.61.1 + '@rollup/rollup-linux-loong64-gnu': 4.61.1 + '@rollup/rollup-linux-loong64-musl': 4.61.1 + '@rollup/rollup-linux-ppc64-gnu': 4.61.1 + '@rollup/rollup-linux-ppc64-musl': 4.61.1 + '@rollup/rollup-linux-riscv64-gnu': 4.61.1 + '@rollup/rollup-linux-riscv64-musl': 4.61.1 + '@rollup/rollup-linux-s390x-gnu': 4.61.1 + '@rollup/rollup-linux-x64-gnu': 4.61.1 + '@rollup/rollup-linux-x64-musl': 4.61.1 + '@rollup/rollup-openbsd-x64': 4.61.1 + '@rollup/rollup-openharmony-arm64': 4.61.1 + '@rollup/rollup-win32-arm64-msvc': 4.61.1 + '@rollup/rollup-win32-ia32-msvc': 4.61.1 + '@rollup/rollup-win32-x64-gnu': 4.61.1 + '@rollup/rollup-win32-x64-msvc': 4.61.1 + fsevents: 2.3.3 + + source-map-js@1.2.1: {} + + three@0.184.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + vite@7.3.5: + dependencies: + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.61.1 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..e63516d --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/choreography.js b/src/choreography.js new file mode 100644 index 0000000..e69dd3a --- /dev/null +++ b/src/choreography.js @@ -0,0 +1,236 @@ +import gsap from "gsap"; +import { ScrollTrigger } from "gsap/ScrollTrigger"; +import Lenis from "lenis"; +import { rounds } from "./dialogue"; + +gsap.registerPlugin(ScrollTrigger); + +/* Lenis 平滑滚动 + ScrollTrigger 集成 */ +export function initSmoothScroll() { + const lenis = new Lenis({ lerp: 0.1 }); + lenis.on("scroll", ScrollTrigger.update); + gsap.ticker.add((time) => lenis.raf(time * 1000)); + gsap.ticker.lagSmoothing(0); + return lenis; +} + +/* 打字机:scrub 时间轴上的离散字符 reveal */ +function addTypewriter(tl, textEl, caretEl, fullText, start, duration) { + const proxy = { p: 0 }; + tl.to( + proxy, + { + p: 1, + duration, + ease: `steps(${fullText.length})`, + onUpdate() { + const n = Math.round(proxy.p * fullText.length); + textEl.textContent = fullText.slice(0, n); + if (caretEl) caretEl.style.opacity = proxy.p >= 1 ? "0" : "1"; + }, + }, + start + ); +} + +/* 开场(时间驱动,非滚动)*/ +export function playBoot(mind) { + const boot = document.querySelector("#r-boot"); + const typedLine = boot.querySelector(".typed-line"); + const items = boot.querySelectorAll(".gen"); + gsap.set(boot.querySelector(".answer"), { opacity: 1 }); + gsap.set(items, { y: 26, autoAlpha: 0 }); + + const text = "这是我的数字思维体,向它提问即可。"; + const proxy = { p: 0 }; + const tl = gsap.timeline({ delay: 0.3 }); + + tl.call(() => mind.setState("thinking")) + .to(proxy, { + p: 1, + duration: 1.4, + ease: `steps(${text.length})`, + onUpdate: () => { + typedLine.textContent = text.slice(0, Math.round(proxy.p * text.length)); + }, + }, 0.5) + .call(() => mind.setState("answering"), null, 1.9) + .to(items, { + y: 0, + autoAlpha: 1, + duration: 0.7, + ease: "expo.out", + stagger: { each: 0.09, from: "start" }, + }, 2.0) + .call(() => mind.setState("idle"), null, 3.4); + return tl; +} + +/* 轮次编排:短轮 pin + scrub;长轮(flow)流式 reveal */ +export function initChoreography(mind, setActive = () => {}) { + rounds + .filter((r) => r.question) + .forEach((round) => { + const section = document.getElementById(`r-${round.id}`); + const inner = section.querySelector(".round-inner"); + const qText = section.querySelector(".q-text"); + const qCaret = section.querySelector(".q-caret"); + const thinking = section.querySelector(".thinking"); + const answer = section.querySelector(".answer"); + const items = section.querySelectorAll(".gen"); + + gsap.set(items, { y: 34, autoAlpha: 0 }); + + if (round.flow) { + buildFlowRound({ round, section, qText, qCaret, thinking, answer, items, mind, setActive }); + return; + } + + const { qEnd, thinkEnd, staggerEach } = round; + const burstEnd = 0.8; + + const tl = gsap.timeline({ + defaults: { ease: "none" }, + scrollTrigger: { + trigger: section, + start: "top top", + end: round.pinLength, + scrub: 0.65, + pin: true, + anticipatePin: 1, + onToggle(self) { + if (self.isActive) setActive(round.id); + }, + onEnter: () => { + mind.setSide(round.side); + mind.setPalette(round.palette); + }, + onEnterBack: () => { + mind.setSide(round.side); + mind.setPalette(round.palette); + }, + onLeave: () => mind.setState("idle"), + onLeaveBack: () => mind.setState("idle"), + onUpdate(self) { + const p = self.progress; + if (p < qEnd) mind.setState("idle"); + else if (p < thinkEnd) mind.setState("thinking"); + else if (p < burstEnd) mind.setState("answering"); + else mind.setState("idle"); + }, + }, + }); + + // 1. 提问打字 + addTypewriter(tl, qText, qCaret, round.question, 0, qEnd); + // 2. 思考 shimmer(刻意停顿 = 非线性蓄力) + tl.to(thinking, { opacity: 1, duration: 0.03 }, qEnd) + .to(thinking, { opacity: 0, duration: 0.04 }, thinkEnd - 0.04); + // 3. 爆发生成:不等间隔 stagger 模拟 token 到达 + tl.to(answer, { opacity: 1, duration: 0.02 }, thinkEnd); + tl.to( + items, + { + y: 0, + autoAlpha: 1, + duration: 0.1, + ease: "expo.out", + stagger: { each: staggerEach, from: "start" }, + }, + thinkEnd + 0.02 + ); + // 4. 余韵:内容微视差上浮 + tl.to(inner, { y: -26, duration: 0.2, ease: "power1.in" }, burstEnd); + // 时间轴总长归一 + tl.to({}, { duration: 0.001 }, 1); + }); +} + +/* 长内容轮:提问/思考用入场 scrub,内容块各自进入视口时「生成」 */ +function buildFlowRound({ round, section, qText, qCaret, thinking, answer, items, mind, setActive }) { + gsap.set(answer, { opacity: 1 }); + + const qTl = gsap.timeline({ + defaults: { ease: "none" }, + scrollTrigger: { + trigger: section, + start: "top 78%", + end: "top 18%", + scrub: 0.5, + }, + }); + addTypewriter(qTl, qText, qCaret, round.question, 0, 0.55); + qTl.to(thinking, { opacity: 1, duration: 0.08 }, 0.6) + .to(thinking, { opacity: 0, duration: 0.1 }, 0.9); + + items.forEach((item, i) => { + gsap.to(item, { + y: 0, + autoAlpha: 1, + duration: 0.8, + delay: (i % 3) * 0.09, // 不等间隔,模拟 token 到达 + ease: "expo.out", + scrollTrigger: { trigger: item, start: "top 88%" }, + }); + }); + + ScrollTrigger.create({ + trigger: section, + start: "top 60%", + end: "bottom 55%", + onToggle(self) { + if (self.isActive) { + setActive(round.id); + mind.setSide(round.side); + mind.setPalette(round.palette); + } else { + mind.setState("idle"); + } + }, + onUpdate(self) { + mind.setState(self.progress < 0.1 ? "thinking" : "answering"); + }, + }); +} + +/* 进度轨:高亮由编排回调驱动,这里只负责节点与跳转 */ +export function initRail(lenis) { + const setActive = (id) => { + document.querySelectorAll(".rail-node").forEach((n) => { + n.classList.toggle("active", n.dataset.round === id); + }); + }; + + ScrollTrigger.create({ + trigger: "#r-boot", + start: "top top", + end: "bottom 40%", + onToggle(self) { + if (self.isActive) setActive("boot"); + }, + }); + + const jump = (id) => { + const target = document.getElementById(`r-${id}`); + if (!target) return; + if (lenis) lenis.scrollTo(target, { offset: 2, duration: 1.2 }); + else target.scrollIntoView({ behavior: "smooth" }); + }; + + return { jump, setActive }; +} + +/* 降级:reduced motion 直接展示全部内容 */ +export function applyReducedMotion() { + rounds + .filter((r) => r.question) + .forEach((round) => { + const section = document.getElementById(`r-${round.id}`); + section.querySelector(".q-text").textContent = round.question; + const answer = section.querySelector(".answer"); + answer.style.opacity = "1"; + }); + const boot = document.querySelector("#r-boot"); + boot.querySelector(".typed-line").textContent = "这是我的数字思维体。"; + document.querySelectorAll(".gen").forEach((n) => (n.style.opacity = "1")); +} diff --git a/src/data/resume.ts b/src/data/resume.ts deleted file mode 100644 index 43ad0c3..0000000 --- a/src/data/resume.ts +++ /dev/null @@ -1,481 +0,0 @@ -export const resume = { - name: "王元有", - alias: "湛兮", - title: "前端开发工程师", - intent: "求职意向:前端开发工程师", - profile: - "7 年前端与跨端开发经验,长期负责 Web、App、H5、小程序与管理后台的架构设计、工程化建设和核心业务交付。熟悉 AI 产品工程、SSE 流式通信、Next.js/Vue/React Native 跨端体系、微前端和 Monorepo 协作模式。", - basics: [ - { label: "工作经验", value: "7 年" }, - { label: "技术管理", value: "2+ 年" }, - { label: "项目用户规模", value: "千万级 MAU" }, - { label: "教育背景", value: "电子科技大学 本科" }, - ], - contact: { - phone: "19980439383", - email: "419021733@qq.com", - emailAlt: "wmagmgema521@gmail.com", - meta: "男 | 29 岁", - }, - highlights: [ - "主导多款企业级产品从 0 到 1 搭建,覆盖 AI 模型服务、AI 资讯对话、供应链、门店数字化、工业互联网平台等场景。", - "掌握 Vue3、React、Next.js、React Native、Expo、UniApp 等技术栈,能独立完成 Web、移动端、App 与管理后台方案落地。", - "推动 Micro-Frontend、SSR、pnpm Monorepo、Git Flow、代码审查、CI/CD、监控体系等工程化实践。", - "有明确的性能与效率结果:构建体积优化 30%、首屏白屏时间缩短 25%、组件库工程化提升开发效率 50%、重复开发成本减少约 40%。", - ], - metrics: [ - { value: "-30%", label: "构建体积优化" }, - { value: "-25%", label: "首屏白屏时间" }, - { value: "+50%", label: "组件库效率提升" }, - { value: "+40%", label: "团队人效提升" }, - { value: "40%", label: "重复开发成本降低" }, - { value: "30%", label: "消息渲染性能提升" }, - ], - skills: [ - { - group: "前端框架", - items: [ - "Next.js 16", - "React 19", - "Vue 3", - "TypeScript 5", - "Tailwind CSS 4", - "Nuxt/SSR", - ], - }, - { - group: "跨端开发", - items: [ - "React Native 0.79", - "Expo 53", - "UniApp", - "H5", - "微信/飞书小程序", - ], - }, - { - group: "AI 与通信", - items: [ - "Vercel AI SDK v6", - "SSE 流式通信", - "多 Agent 协作", - "Markdown/LaTeX 渲染", - "AI 对话", - "AI 生图/生视频", - ], - }, - { - group: "工程化", - items: [ - "pnpm Monorepo", - "Git Submodules", - "Qiankun", - "Lerna", - "Git Flow", - "Playwright", - ], - }, - { - group: "状态与 UI", - items: [ - "Zustand", - "MobX", - "Pinia", - "Radix UI", - "Ant Design", - "Element Plus", - "ProComponents", - ], - }, - { - group: "基础设施", - items: [ - "Alova", - "next-intl", - "i18next", - "ARMS 监控", - "CDN 优化", - "Adyen 支付", - ], - }, - ], - experiences: [ - { - company: "成都海艺互娱科技有限公司", - role: "React Native 开发工程师", - period: "2025.05 - 至今", - points: [ - "参与多款 AI 产品从 0 到 1 搭建与架构设计,覆盖前端性能、交互体验、国际化体系与多端组件复用。", - "在 AI 对话、生图、生视频与多 Agent 协作领域沉淀工程经验,负责流式通信与前端渲染体验优化。", - "支撑千万级海外用户产品,推动多端组件库统一建设,减少重复开发成本约 40%。", - ], - }, - { - company: "四川茶姬企业管理有限公司", - role: "高级 Web 前端开发", - period: "2024.03 - 2025.03", - points: [ - "主导供应链管理系统前端开发,实现采购、仓储、配送等核心模块。", - "独立负责门店报损与食安管理核心功能搭建及迭代,覆盖国内、东南亚与北美业务逻辑。", - "引入阿里云 ARMS 前端监控体系,落地 CDN 静态资源优化方案,并制定代码审查与 Git 操作规范。", - ], - }, - { - company: "中钧科技有限公司四川分公司", - role: "前端开发组长", - period: "2022.04 - 2024.03", - points: [ - "负责经营帮 PC 端微前端、门户和商管核心模块开发,完成 UI 还原、接口联调及性能优化。", - "从零搭建新 E 畅行小程序基础框架,完成技术方案制定与全流程开发。", - "主导经营帮小程序、H5、Admin 后台迭代开发与跨端技术方案设计,建立 Git Flow、代码审查和新人培训机制。", - ], - }, - ], - projects: [ - { - id: "vtrix", - name: "SeaCloud / Vtrix", - subtitle: "AI 模型服务平台(Web 端)", - period: "2025.09 - 至今", - tech: [ - "Next.js 16", - "React 19", - "TypeScript", - "Tailwind CSS", - "Zustand", - "Alova", - "Vercel AI SDK", - "Radix UI", - "next-intl", - ], - summary: - "面向全球用户的 AI 模型聚合服务平台,聚合 LLM、图像、视频、音频、3D 等多模态模型能力,覆盖 C 端调用与 B 端组织/分销管理。", - modules: [ - "分销商客户邀请、折扣模板、额度分配、销售配置与利润率计算。", - "多币种与汇率体系,封装 useCurrency Hook 并贯穿 Pricing、Billing、API Keys 等模块。", - "组织成员、角色权限守卫、配额设置、支出限额、账单报表、交易筛选与 Excel 导出。", - "i18n Submodule 架构迁移、企业微信同步工作流、通用表格/筛选器/分页组件增强。", - ], - }, - { - id: "seabuzz", - name: "SeaBuzz", - subtitle: "AI 智能资讯与对话平台", - period: "2025.05 - 至今", - tech: [ - "React Native", - "Expo 53", - "Expo Router", - "Zustand", - "NativeWind", - "SSE", - "i18next", - "Adyen", - "Lerna", - ], - summary: - "海艺 AI 旗下 AI 新闻聚合、智能搜索与多模态对话平台,基于 Expo 实现 iOS、Android、Web 三端统一开发。", - modules: [ - "AI Agent 对话完整链路:SSE 流式聊天、打字机渲染、Markdown/LaTeX、思考动画、来源引用与历史同步。", - "Discover 发现页与新闻详情,支持瀑布流、大/小卡动态布局、骨架屏与 Smart Image。", - "Google、Facebook、Discord、Email 登录与 SeaArt Auth SDK 对接。", - "Monorepo 公共包体系、API 层、数据模型、UI 组件、状态管理、OTA 热更新与代码签名机制。", - ], - }, - { - id: "bawang", - name: "霸王功夫", - subtitle: "门店数字化与供应链管理平台", - period: "2024.03 - 2025.03", - tech: [ - "React 18", - "Vue 3", - "UniApp", - "MobX", - "Pinia", - "Element Plus", - "Ant Design", - "ProComponents", - ], - summary: - "服务全球 6000+ 门店及运营伙伴的数字化管理平台,覆盖门店运营、食品安全、供应链协同等核心业务。", - modules: [ - "小程序报损模块:摄像头扫码、在线报损登记,兼容微信小程序与飞书 H5。", - "食安管理模块:低频蓝牙连接 TSPL 指令集打印机,支持国内、东南亚、北美三套业务逻辑。", - "经营信息模块:多门店经营状态移动端看板,按区域、时间、指标筛选。", - "供应链模块:采购系统、供应商合同管理、供应商结算系统,对接云厉、费控等外部系统。", - ], - }, - { - id: "jingyingbang", - name: "经营帮平台 + 经营帮拉新", - subtitle: "工业互联网与微前端平台", - period: "2022.04 - 2024.03", - tech: [ - "Vue", - "Qiankun", - "Element UI", - "华为云 OBS", - "百度地图", - "高德地图", - "IM", - "UniApp", - ], - summary: - "基于信息化设计理念和区块链技术的工业互联网平台,为企业和个人提供数字化运营服务。", - modules: [ - "参与单体前端到 Qiankun 微前端拆分,拆分出 12 个基础项目。", - "负责商管、门户、经营帮系列小程序/H5/Admin 后台核心业务交付。", - "引入华为云 OBS 直传减轻请求链路性能浪费。", - "开发内部 Chrome 插件 zjkj-decryption,提升数据解析效率。", - ], - }, - ], - education: { - school: "电子科技大学", - degree: "本科", - major: "信息管理与信息系统", - period: "2023 - 2025", - }, -}; - -export const resumeEn = { - name: "Wang Yuanyou", - alias: "mrZhan", - title: "Frontend Engineer", - intent: "Target Role: Frontend Engineer", - profile: - "Frontend and cross-platform engineer with 7 years of experience building Web, App, H5, mini-program and admin systems. Strong in AI product engineering, SSE streaming, Next.js/Vue/React Native ecosystems, micro-frontends and Monorepo collaboration.", - basics: [ - { label: "Experience", value: "7 years" }, - { label: "Tech Leadership", value: "2+ years" }, - { label: "Product Scale", value: "10M+ MAU" }, - { label: "Education", value: "UESTC Bachelor" }, - ], - contact: { - phone: "19980439383", - email: "419021733@qq.com", - emailAlt: "wmagmgema521@gmail.com", - meta: "Male | 29", - }, - highlights: [ - "Led multiple enterprise products from 0 to 1 across AI model services, AI news and chat, supply chain, store digitization and industrial internet platforms.", - "Hands-on with Vue3, React, Next.js, React Native, Expo and UniApp, capable of delivering Web, mobile, App and admin products end to end.", - "Drove engineering practices including Micro-Frontend, SSR, pnpm Monorepo, Git Flow, code review, CI/CD and frontend observability.", - "Delivered measurable outcomes: 30% smaller bundles, 25% faster first screen, 50% faster component-driven delivery and around 40% less duplicated work.", - ], - metrics: [ - { value: "-30%", label: "Bundle Size" }, - { value: "-25%", label: "First Screen Blank Time" }, - { value: "+50%", label: "Component Delivery Efficiency" }, - { value: "+40%", label: "Team Productivity" }, - { value: "40%", label: "Duplicated Work Reduced" }, - { value: "30%", label: "Message Rendering Performance" }, - ], - skills: [ - { - group: "Frontend Frameworks", - items: [ - "Next.js 16", - "React 19", - "Vue 3", - "TypeScript 5", - "Tailwind CSS 4", - "Nuxt/SSR", - ], - }, - { - group: "Cross-platform", - items: [ - "React Native 0.79", - "Expo 53", - "UniApp", - "H5", - "WeChat/Lark Mini Programs", - ], - }, - { - group: "AI & Streaming", - items: [ - "Vercel AI SDK v6", - "SSE Streaming", - "Multi-Agent Collaboration", - "Markdown/LaTeX", - "AI Chat", - "AI Image/Video", - ], - }, - { - group: "Engineering", - items: [ - "pnpm Monorepo", - "Git Submodules", - "Qiankun", - "Lerna", - "Git Flow", - "Playwright", - ], - }, - { - group: "State & UI", - items: [ - "Zustand", - "MobX", - "Pinia", - "Radix UI", - "Ant Design", - "Element Plus", - "ProComponents", - ], - }, - { - group: "Infrastructure", - items: [ - "Alova", - "next-intl", - "i18next", - "ARMS Monitoring", - "CDN Optimization", - "Adyen Payments", - ], - }, - ], - experiences: [ - { - company: "Chengdu Haiyi Interactive Entertainment Technology Co., Ltd.", - role: "React Native Engineer", - period: "2025.05 - Present", - points: [ - "Contributed to architecture and 0-to-1 delivery of multiple AI products, covering performance, UX, i18n and multi-platform component reuse.", - "Built engineering experience in AI chat, image/video generation and multi-agent collaboration, with focus on streaming and frontend rendering performance.", - "Supported products serving 10M+ overseas users and promoted unified multi-platform component libraries, reducing duplicate work by around 40%.", - ], - }, - { - company: "Sichuan Chaji Enterprise Management Co., Ltd.", - role: "Senior Web Frontend Developer", - period: "2024.03 - 2025.03", - points: [ - "Led frontend development of supply-chain management systems, including procurement, warehousing and delivery modules.", - "Owned store loss-reporting and food-safety features across China, Southeast Asia and North America business rules.", - "Introduced Alibaba Cloud ARMS frontend monitoring, delivered CDN optimization and established code review and Git workflow standards.", - ], - }, - { - company: "Zhongjun Technology Sichuan Branch", - role: "Frontend Team Lead", - period: "2022.04 - 2024.03", - points: [ - "Delivered core modules for the Jingyingbang PC micro-frontend platform, portal and business management systems, including UI implementation, API integration and performance optimization.", - "Built the New E Travel mini-program foundation from scratch and owned technical planning through delivery.", - "Led mini-program, H5 and admin iterations, designed cross-platform solutions, and established Git Flow, code review and onboarding practices.", - ], - }, - ], - projects: [ - { - id: "vtrix", - name: "SeaCloud / Vtrix", - subtitle: "AI Model Service Platform (Web)", - period: "2025.09 - Present", - tech: [ - "Next.js 16", - "React 19", - "TypeScript", - "Tailwind CSS", - "Zustand", - "Alova", - "Vercel AI SDK", - "Radix UI", - "next-intl", - ], - summary: - "A global AI model aggregation platform covering LLM, image, video, audio and 3D model capabilities for developers, organizations and distributors.", - modules: [ - "Built distributor invitation, discount templates, credit allocation, sales configuration and profit margin workflows.", - "Implemented global currency switching and exchange-rate conversion via a reusable useCurrency hook across Pricing, Billing and API Keys.", - "Delivered organization roles, quota controls, spending limits, billing reports, transaction filtering and Excel export flows.", - "Supported i18n submodule migration, WeCom translation sync and shared table/filter/pagination component enhancements.", - ], - }, - { - id: "seabuzz", - name: "SeaBuzz", - subtitle: "AI News and Conversation Platform", - period: "2025.05 - Present", - tech: [ - "React Native", - "Expo 53", - "Expo Router", - "Zustand", - "NativeWind", - "SSE", - "i18next", - "Adyen", - "Lerna", - ], - summary: - "An AI-powered news aggregation, smart search and multimodal conversation platform under SeaArt AI, built with Expo for iOS, Android and Web.", - modules: [ - "Built the AI Agent chat flow with SSE streaming, typewriter rendering, Markdown/LaTeX, thinking animation, citations and history sync.", - "Delivered Discover feed and news detail pages with masonry layout, large/small dynamic cards, skeleton loading and Smart Image.", - "Integrated Google, Facebook, Discord and Email login with SeaArt Auth SDK.", - "Built Monorepo shared packages for API, data models, UI components, state, OTA updates and code signing.", - ], - }, - { - id: "bawang", - name: "Bawang Kungfu", - subtitle: "Store Digitization and Supply Chain Platform", - period: "2024.03 - 2025.03", - tech: [ - "React 18", - "Vue 3", - "UniApp", - "MobX", - "Pinia", - "Element Plus", - "Ant Design", - "ProComponents", - ], - summary: - "A digital operations platform serving 6,000+ stores and partners, covering store operations, food safety and supply-chain collaboration.", - modules: [ - "Built mini-program loss reporting with camera scanning and online registration, compatible with WeChat mini-program and Lark H5.", - "Implemented food safety flows with Bluetooth TSPL printers and separate China, Southeast Asia and North America business rules.", - "Delivered mobile dashboards for multi-store operation metrics with region, time and KPI filtering.", - "Built procurement, supplier contract and settlement modules, integrating multiple external systems.", - ], - }, - { - id: "jingyingbang", - name: "Jingyingbang Platform", - subtitle: "Industrial Internet and Micro-frontend Platform", - period: "2022.04 - 2024.03", - tech: [ - "Vue", - "Qiankun", - "Element UI", - "Huawei Cloud OBS", - "Baidu Map", - "Amap", - "IM", - "UniApp", - ], - summary: - "An industrial internet platform based on informatization and blockchain concepts, providing digital operation services for companies and individuals.", - modules: [ - "Participated in splitting a large frontend monolith into 12 Qiankun-based micro-frontend projects.", - "Delivered core business features for portals, business management, mini-program, H5 and admin systems.", - "Introduced Huawei Cloud OBS direct upload to reduce request-chain overhead.", - "Built an internal Chrome extension, zjkj-decryption, to improve data parsing efficiency.", - ], - }, - ], - education: { - school: "University of Electronic Science and Technology of China", - degree: "Bachelor", - major: "Information Management and Information Systems", - period: "2023 - 2025", - }, -}; diff --git a/src/dialogue.js b/src/dialogue.js new file mode 100644 index 0000000..f2f6b72 --- /dev/null +++ b/src/dialogue.js @@ -0,0 +1,90 @@ +// 7 轮问答的文案与节奏配置 —— 每轮节奏参数刻意不同,避免线性重复 +export const contact = { + emails: ["419021733@qq.com", "wmagmgema521@gmail.com"], + phone: "19980439383", + github: "https://github.com/zhanBoss", + identity: "男 · 29 岁 · 电子科技大学 信息管理与信息系统 本科", +}; + +export const rounds = [ + { + id: "boot", + label: "BOOT", + type: "boot", + question: null, + side: 1, + palette: ["#22d3ee", "#a78bfa"], + }, + { + id: "intro", + label: "WHO", + type: "signals", + question: "先介绍一下你自己?", + side: -1, + palette: ["#2dd4bf", "#a78bfa"], + pinLength: "+=160%", + qEnd: 0.14, + thinkEnd: 0.3, + staggerEach: 0.055, + }, + { + id: "focus", + label: "NOW", + type: "focus", + question: "最近一年具体在做什么?", + side: 1, + palette: ["#22d3ee", "#c084fc"], + pinLength: "+=200%", + qEnd: 0.12, + thinkEnd: 0.34, + staggerEach: 0.085, + }, + { + id: "projects", + label: "PROOF", + type: "projects", + question: "有实际项目证明吗?", + side: -1, + palette: ["#38bdf8", "#a78bfa"], + flow: true, // 内容超过一屏:不 pin,逐块流式生成 + qEnd: 0.07, + thinkEnd: 0.16, + staggerEach: 0.045, + }, + { + id: "skills", + label: "STACK", + type: "skills", + question: "技能栈展开讲讲?", + side: 1, + palette: ["#67e8f9", "#8b5cf6"], + pinLength: "+=240%", + qEnd: 0.1, + thinkEnd: 0.26, + staggerEach: 0.02, + }, + { + id: "experience", + label: "PATH", + type: "experience", + question: "之前的团队经历?", + side: -1, + palette: ["#5eead4", "#a78bfa"], + pinLength: "+=220%", + qEnd: 0.13, + thinkEnd: 0.32, + staggerEach: 0.1, + }, + { + id: "contact", + label: "PING", + type: "contact", + question: "怎么联系你?", + side: 0, + palette: ["#22d3ee", "#f0abfc"], + pinLength: "+=150%", + qEnd: 0.16, + thinkEnd: 0.34, + staggerEach: 0.09, + }, +]; diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..61bfdd5 --- /dev/null +++ b/src/main.js @@ -0,0 +1,34 @@ +import gsap from "gsap"; +import { renderDialogue, renderRail } from "./render"; +import { createMind } from "./mind/mind"; +import { + applyReducedMotion, + initChoreography, + initRail, + initSmoothScroll, + playBoot, +} from "./choreography"; + +const reduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches; + +/* 1. 由简历数据生成对话 DOM */ +renderDialogue(document.getElementById("dialogue")); + +/* 2. 思维流体 */ +const mind = createMind(document.getElementById("mind-canvas"), { reduced }); +window.__mind = mind; +gsap.ticker.add(() => mind.tick()); + +/* 3. 进度轨 + 滚动编排 */ +let lenis = null; +if (!reduced) lenis = initSmoothScroll(); + +const rail = initRail(lenis); +renderRail(document.getElementById("session-rail"), rail.jump); + +if (!reduced) { + initChoreography(mind, rail.setActive); + playBoot(mind); +} else { + applyReducedMotion(); +} diff --git a/src/mind/mind.js b/src/mind/mind.js new file mode 100644 index 0000000..a7f9760 --- /dev/null +++ b/src/mind/mind.js @@ -0,0 +1,255 @@ +import * as THREE from "three"; +import { blobFragment, blobVertex, particleFragment, particleVertex } from "./shaders"; + +// 三状态目标值 —— 每帧向目标插值,无硬切 +const STATES = { + idle: { freq: 1.15, amp: 0.24, speed: 0.22, heat: 0.0, scale: 1.0, attract: 0.12 }, + thinking: { freq: 2.6, amp: 0.27, speed: 0.95, heat: 0.7, scale: 0.86, attract: 1.0 }, + answering: { freq: 1.9, amp: 0.46, speed: 0.5, heat: 0.22, scale: 1.09, attract: 0.0 }, +}; + +const lerp = (a, b, t) => a + (b - a) * t; + +export function createMind(canvas, { reduced = false } = {}) { + const isMobile = window.innerWidth < 880; + const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true }); + renderer.setPixelRatio(Math.min(window.devicePixelRatio, isMobile ? 1.5 : 2)); + renderer.setSize(window.innerWidth, window.innerHeight); + + const scene = new THREE.Scene(); + const camera = new THREE.PerspectiveCamera(42, window.innerWidth / window.innerHeight, 0.1, 30); + camera.position.z = 6; + + const group = new THREE.Group(); + scene.add(group); + + /* ---- 流体球 ---- */ + const blobUniforms = { + uTime: { value: 0 }, + uFreq: { value: STATES.idle.freq }, + uAmp: { value: STATES.idle.amp }, + uSpeed: { value: STATES.idle.speed }, + uHeat: { value: 0 }, + uOpacity: { value: 1 }, + uColorA: { value: new THREE.Color("#22d3ee") }, + uColorB: { value: new THREE.Color("#a78bfa") }, + }; + const blob = new THREE.Mesh( + new THREE.IcosahedronGeometry(1.35, isMobile ? 48 : 96), + new THREE.ShaderMaterial({ + vertexShader: blobVertex, + fragmentShader: blobFragment, + uniforms: blobUniforms, + transparent: true, + blending: THREE.AdditiveBlending, + depthWrite: false, + }) + ); + group.add(blob); + + /* ---- 伴生粒子 ---- */ + const COUNT = isMobile ? 900 : 2000; + const seeds = new Float32Array(COUNT * 3); + const radii = new Float32Array(COUNT); + const speeds = new Float32Array(COUNT); + for (let i = 0; i < COUNT; i++) { + seeds[i * 3] = Math.random(); + seeds[i * 3 + 1] = Math.random(); + seeds[i * 3 + 2] = Math.random(); + radii[i] = 1.7 + Math.random() * 1.5; + speeds[i] = 0.25 + Math.random() * 0.6; + } + const pGeo = new THREE.BufferGeometry(); + pGeo.setAttribute("position", new THREE.BufferAttribute(new Float32Array(COUNT * 3), 3)); + pGeo.setAttribute("aSeed", new THREE.BufferAttribute(seeds, 3)); + pGeo.setAttribute("aRadius", new THREE.BufferAttribute(radii, 1)); + pGeo.setAttribute("aSpeed", new THREE.BufferAttribute(speeds, 1)); + + const particleUniforms = { + uTime: { value: 0 }, + uAttract: { value: STATES.idle.attract }, + uBurst: { value: 0 }, + uDir: { value: -1 }, + uSize: { value: isMobile ? 9 : 12 }, + uMouse: { value: new THREE.Vector3(999, 999, 999) }, + uMouseForce: { value: 0 }, + uGrab: { value: 0 }, + uHeat: { value: 0 }, + uOpacity: { value: 1 }, + uColorA: blobUniforms.uColorA, + uColorB: blobUniforms.uColorB, + }; + const particles = new THREE.Points( + pGeo, + new THREE.ShaderMaterial({ + vertexShader: particleVertex, + fragmentShader: particleFragment, + uniforms: particleUniforms, + transparent: true, + blending: THREE.AdditiveBlending, + depthWrite: false, + }) + ); + group.add(particles); + + /* ---- 状态机 ---- */ + let current = { ...STATES.idle }; + let target = STATES.idle; + let stateName = "idle"; + let burst = 0; + + const colorA = blobUniforms.uColorA.value; + const colorB = blobUniforms.uColorB.value; + const targetColorA = colorA.clone(); + const targetColorB = colorB.clone(); + + // 停靠位置:side -1 内容在右 → 流体去左;1 → 右;0 → 居中偏后 + const dock = new THREE.Vector3(); + const dockTarget = new THREE.Vector3(); + const pointer = { x: 0, y: 0 }; + + function dockFor(side) { + if (window.innerWidth < 880) { + // 移动端:居中上移、退后、缩小,让内容可读 + return new THREE.Vector3(side * 0.3, 1.25, -1.6); + } + if (side === 0) return new THREE.Vector3(0, 0.95, -2.8); + return new THREE.Vector3(side * 2.05, 0.1, -0.7); + } + + let side = 1; + let opacityTarget = 1; + let hasPointer = false; + let mouseSnapped = false; + // 按压牵引弹簧(欠阻尼 → 过冲回弹的阻尼感) + let grab = 0; + let grabVel = 0; + let grabTarget = 0; + const mouseRay = new THREE.Vector3(); + const mouseLocal = new THREE.Vector3(); + + const api = { + setState(name) { + if (name === stateName || reduced) return; + stateName = name; + target = STATES[name]; + if (name === "answering") burst = 1; // 喷发脉冲,随帧衰减 + }, + setSide(s) { + side = s; + dockTarget.copy(dockFor(s)); + particleUniforms.uDir.value = s === 0 ? 0 : -s; // 粒子喷向内容区 + opacityTarget = s === 0 ? 0.42 : 1; // 居中停靠时减淡,保证内容可读 + }, + setPalette([a, b]) { + targetColorA.set(a); + targetColorB.set(b); + }, + get state() { + return stateName; + }, + debug() { + return { stateName, side, dock: dock.toArray(), dockTarget: dockTarget.toArray(), group: group.position.toArray() }; + }, + }; + + api.setSide(1); + dock.copy(dockTarget); + group.position.copy(dock); + + window.addEventListener("pointermove", (e) => { + pointer.x = (e.clientX / window.innerWidth) * 2 - 1; + pointer.y = (e.clientY / window.innerHeight) * 2 - 1; + hasPointer = true; + }); + + window.addEventListener("pointerdown", (e) => { + pointer.x = (e.clientX / window.innerWidth) * 2 - 1; + pointer.y = (e.clientY / window.innerHeight) * 2 - 1; + hasPointer = true; + grabTarget = 1; + }); + const release = () => { grabTarget = 0; }; + window.addEventListener("pointerup", release); + window.addEventListener("pointercancel", release); + window.addEventListener("blur", release); + + window.addEventListener("resize", () => { + renderer.setSize(window.innerWidth, window.innerHeight); + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + api.setSide(side); + }); + + /* ---- 帧循环(由外部 ticker 驱动) ---- */ + const clock = new THREE.Clock(); + function tick() { + const dt = Math.min(clock.getDelta(), 0.05); + const t = clock.elapsedTime; + const k = 1 - Math.pow(0.0014, dt); // 帧率无关的平滑系数 + + current.freq = lerp(current.freq, target.freq, k); + current.amp = lerp(current.amp, target.amp, k); + current.speed = lerp(current.speed, target.speed, k); + current.heat = lerp(current.heat, target.heat, k); + current.scale = lerp(current.scale, target.scale, k); + current.attract = lerp(current.attract, target.attract, k); + burst = lerp(burst, 0, 1 - Math.pow(0.25, dt)); // 脉冲衰减 + + blobUniforms.uTime.value = reduced ? t * 0.25 : t; + blobUniforms.uFreq.value = current.freq; + blobUniforms.uAmp.value = current.amp; + blobUniforms.uSpeed.value = current.speed; + blobUniforms.uHeat.value = current.heat; + + particleUniforms.uTime.value = reduced ? t * 0.25 : t; + particleUniforms.uAttract.value = current.attract; + particleUniforms.uBurst.value = burst; + particleUniforms.uHeat.value = current.heat; + + colorA.lerp(targetColorA, k); + colorB.lerp(targetColorB, k); + + const op = lerp(blobUniforms.uOpacity.value, opacityTarget, k); + blobUniforms.uOpacity.value = op; + particleUniforms.uOpacity.value = op; + + const breathe = 1 + Math.sin(t * 1.4) * 0.018; + group.scale.setScalar(current.scale * breathe); + + dock.lerp(dockTarget, 1 - Math.pow(0.02, dt)); + group.position.set( + dock.x + pointer.x * 0.14, + dock.y - pointer.y * 0.1, + dock.z + ); + group.rotation.y += dt * 0.12; + group.rotation.x = pointer.y * 0.08; + + // 鼠标牵引:把指针投影到流体所在深度平面,转到 group 局部空间后平滑跟随 + if (hasPointer && !reduced) { + mouseRay.set(pointer.x, -pointer.y, 0.5).unproject(camera).sub(camera.position).normalize(); + const planeDist = (group.position.z - camera.position.z) / mouseRay.z; + mouseLocal.copy(camera.position).addScaledVector(mouseRay, planeDist); + group.updateMatrixWorld(); + group.worldToLocal(mouseLocal); + if (!mouseSnapped) { + particleUniforms.uMouse.value.copy(mouseLocal); + mouseSnapped = true; + } else { + particleUniforms.uMouse.value.lerp(mouseLocal, 1 - Math.pow(0.01, dt)); + } + particleUniforms.uMouseForce.value = lerp(particleUniforms.uMouseForce.value, 0.85, k); + + // 按压牵引:欠阻尼弹簧积分 —— 按下缓冲吸入,松开过冲散开再归位 + grabVel += (grabTarget - grab) * 26 * dt; + grabVel *= Math.exp(-3.2 * dt); + grab += grabVel * dt; + particleUniforms.uGrab.value = grab; + } + + renderer.render(scene, camera); + } + + return { ...api, tick }; +} diff --git a/src/mind/shaders.js b/src/mind/shaders.js new file mode 100644 index 0000000..9594e42 --- /dev/null +++ b/src/mind/shaders.js @@ -0,0 +1,202 @@ +// 思维流体 GLSL —— Ashima simplex noise + 3 octave FBM + Fresnel +const SIMPLEX = /* glsl */ ` +vec3 mod289(vec3 x){ return x - floor(x * (1.0/289.0)) * 289.0; } +vec4 mod289(vec4 x){ return x - floor(x * (1.0/289.0)) * 289.0; } +vec4 permute(vec4 x){ return mod289(((x*34.0)+1.0)*x); } +vec4 taylorInvSqrt(vec4 r){ return 1.79284291400159 - 0.85373472095314 * r; } + +float snoise(vec3 v){ + const vec2 C = vec2(1.0/6.0, 1.0/3.0); + const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); + + vec3 i = floor(v + dot(v, C.yyy)); + vec3 x0 = v - i + dot(i, C.xxx); + + vec3 g = step(x0.yzx, x0.xyz); + vec3 l = 1.0 - g; + vec3 i1 = min(g.xyz, l.zxy); + vec3 i2 = max(g.xyz, l.zxy); + + vec3 x1 = x0 - i1 + C.xxx; + vec3 x2 = x0 - i2 + C.yyy; + vec3 x3 = x0 - D.yyy; + + i = mod289(i); + vec4 p = permute(permute(permute( + i.z + vec4(0.0, i1.z, i2.z, 1.0)) + + i.y + vec4(0.0, i1.y, i2.y, 1.0)) + + i.x + vec4(0.0, i1.x, i2.x, 1.0)); + + float n_ = 0.142857142857; + vec3 ns = n_ * D.wyz - D.xzx; + + vec4 j = p - 49.0 * floor(p * ns.z * ns.z); + + vec4 x_ = floor(j * ns.z); + vec4 y_ = floor(j - 7.0 * x_); + + vec4 x = x_ * ns.x + ns.yyyy; + vec4 y = y_ * ns.x + ns.yyyy; + vec4 h = 1.0 - abs(x) - abs(y); + + vec4 b0 = vec4(x.xy, y.xy); + vec4 b1 = vec4(x.zw, y.zw); + + vec4 s0 = floor(b0) * 2.0 + 1.0; + vec4 s1 = floor(b1) * 2.0 + 1.0; + vec4 sh = -step(h, vec4(0.0)); + + vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + + vec3 p0 = vec3(a0.xy, h.x); + vec3 p1 = vec3(a0.zw, h.y); + vec3 p2 = vec3(a1.xy, h.z); + vec3 p3 = vec3(a1.zw, h.w); + + vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2,p2), dot(p3,p3))); + p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w; + + vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); + m = m * m; + return 42.0 * dot(m*m, vec4(dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3))); +} + +float fbm(vec3 p){ + float sum = 0.0; + float amp = 0.5; + for (int i = 0; i < 3; i++) { + sum += amp * snoise(p); + p *= 2.1; + amp *= 0.5; + } + return sum; +} +`; + +export const blobVertex = /* glsl */ ` +uniform float uTime; +uniform float uFreq; +uniform float uAmp; +uniform float uSpeed; + +varying float vDisp; +varying vec3 vNormal; +varying vec3 vViewDir; + +${SIMPLEX} + +void main(){ + float t = uTime * uSpeed; + float d = fbm(normal * uFreq + vec3(t, t * 0.7, -t * 0.4)); + vDisp = d; + vec3 displaced = position + normal * d * uAmp; + + vec4 mvPosition = modelViewMatrix * vec4(displaced, 1.0); + vNormal = normalize(normalMatrix * normal); + vViewDir = normalize(-mvPosition.xyz); + gl_Position = projectionMatrix * mvPosition; +} +`; + +export const blobFragment = /* glsl */ ` +uniform vec3 uColorA; +uniform vec3 uColorB; +uniform float uHeat; +uniform float uOpacity; + +varying float vDisp; +varying vec3 vNormal; +varying vec3 vViewDir; + +void main(){ + float fresnel = pow(1.0 - max(dot(vNormal, vViewDir), 0.0), 2.4); + vec3 base = mix(uColorA, uColorB, vDisp * 0.5 + 0.5); + base = mix(base, vec3(1.0, 0.62, 0.38), uHeat * 0.4); + vec3 color = base * (0.32 + fresnel * 1.6) + base * smoothstep(0.35, 0.9, vDisp) * 0.45; + float alpha = (0.22 + fresnel * 0.85) * uOpacity; + gl_FragColor = vec4(color, alpha); +} +`; + +export const particleVertex = /* glsl */ ` +uniform float uTime; +uniform float uAttract; // 1 = 吸入核心 (thinking) +uniform float uBurst; // 1 = 向外喷发 (answering) +uniform float uDir; // 喷发的水平方向(指向内容区) +uniform float uSize; +uniform vec3 uMouse; // 指针在粒子局部空间的位置 +uniform float uMouseForce; +uniform float uGrab; // 按压牵引强度(弹簧驱动,可为负 → 回弹散开) + +attribute vec3 aSeed; // 每粒子随机种子 +attribute float aRadius; +attribute float aSpeed; + +varying float vFade; + +void main(){ + float t = uTime * aSpeed; + // 进动轨道:两组相位叠加,避免规则圆轨 + float theta = aSeed.x * 6.2831 + t; + float phi = aSeed.y * 3.1415 + sin(t * 0.6 + aSeed.z * 6.2831) * 0.7; + + float r = aRadius * mix(1.0, 0.3, uAttract); + r += uBurst * (0.8 + aSeed.z * 2.6); + + vec3 pos = vec3( + cos(theta) * sin(phi) * r, + cos(phi) * r * 0.85, + sin(theta) * sin(phi) * r + ); + // 喷发时整体偏向内容区一侧 + pos.x += uBurst * uDir * (0.6 + aSeed.y * 1.8); + + // 鼠标牵引:靠近指针的粒子被吸过去,绕指针形成小漩涡 + float md = distance(pos, uMouse); + float pull = smoothstep(2.8, 0.2, md) * uMouseForce * (0.35 + aSeed.z * 0.65); + vec3 swirl = vec3( + sin(t * 2.2 + aSeed.x * 6.2831), + cos(t * 1.7 + aSeed.y * 6.2831), + sin(t * 1.3 + aSeed.z * 6.2831) + ) * (0.12 + aSeed.y * 0.3); + pos = mix(pos, uMouse + swirl, pull); + + // 按住鼠标:全体粒子被牵向按压点,逐粒错相往复脉动; + // uGrab 为负(松开回弹)时 mix 外推 → 粒子向外散开再被拉回 + float osc = 0.55 + 0.45 * sin(uTime * (1.2 + aSeed.x * 1.6) + aSeed.y * 6.2831); + float gpull = clamp(uGrab, -0.35, 1.25) * osc * (0.5 + aSeed.z * 0.5); + gpull = clamp(gpull, -0.4, 0.96); + vec3 gswirl = vec3( + sin(t * 1.8 + aSeed.y * 6.2831), + cos(t * 1.4 + aSeed.z * 6.2831), + sin(t * 1.1 + aSeed.x * 6.2831) + ) * (0.18 + aSeed.x * 0.5); + pos = mix(pos, uMouse + gswirl, gpull); + + vFade = 1.0 - uBurst * aSeed.z * 0.9; + vFade = min(vFade + pull * 0.5 + max(gpull, 0.0) * 0.35, 1.2); + + vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0); + gl_PointSize = uSize * (0.6 + aSeed.z) * (1.0 + pull * 0.5 + max(gpull, 0.0) * 0.3) * (3.4 / -mvPosition.z); + gl_Position = projectionMatrix * mvPosition; +} +`; + +export const particleFragment = /* glsl */ ` +uniform vec3 uColorA; +uniform vec3 uColorB; +uniform float uHeat; +uniform float uOpacity; + +varying float vFade; + +void main(){ + vec2 uv = gl_PointCoord - 0.5; + float d = length(uv); + float mask = smoothstep(0.5, 0.05, d); + vec3 color = mix(uColorA, uColorB, vFade); + color = mix(color, vec3(1.0, 0.62, 0.38), uHeat * 0.35); + gl_FragColor = vec4(color, mask * vFade * 0.75 * uOpacity); +} +`; diff --git a/src/pages/index.astro b/src/pages/index.astro deleted file mode 100644 index fffca5f..0000000 --- a/src/pages/index.astro +++ /dev/null @@ -1,1244 +0,0 @@ ---- -import { resume, resumeEn } from "../data/resume"; -import "../styles/global.css"; - -const githubUrl = "https://github.com/zhanBoss"; -const appEnvLabel = import.meta.env.PUBLIC_APP_ENV_LABEL || "生产环境"; -const translations = { zh: resume, en: resumeEn }; -const navIds = ["top", "proof", "skills", "projects", "experience", "contact"]; -const brandAssets = { - projects: { - vtrix: { src: "/logos/vtrix.png", className: "brand-logo", label: "Vtrix" }, - seabuzz: { src: "/logos/seabuzz.webp", className: "brand-logo", label: "SeaBuzz" }, - bawang: { src: "/logos/chagee.png", className: "brand-logo", label: "CHAGEE" }, - jingyingbang: { src: "/logos/jingyingbang.png", className: "brand-logo brand-logo-wide", label: "经营帮" }, - }, - companies: { - seaart: { src: "/logos/seaart.webp", className: "brand-logo", label: "SeaArt" }, - chagee: { src: "/logos/chagee.png", className: "brand-logo", label: "CHAGEE" }, - zhongjun: { src: "/logos/zhongjun.png", className: "brand-logo brand-logo-wide", label: "中钧科技" }, - }, -}; -const displayNameFor = (data: typeof resume, lang: "zh" | "en" = "zh") => - lang === "zh" ? `${data.name}(${data.alias})` : `${data.name} (${data.alias})`; -const labels = { - zh: { - nav: { - top: "首页", - proof: "证据", - skills: "能力", - projects: "项目", - experience: "经历", - contact: "联系", - }, - metaDescription: `${displayNameFor(resume)} - ${resume.title},7 年前端与跨端开发经验,聚焦 AI 产品、Next.js、React Native、Vue、微前端与工程化。`, - topbarContact: "联系", - language: "EN", - languageLabel: "Switch to English", - themeLabel: "切换主题", - themeLight: "浅色", - themeDark: "深色", - heroEyebrow: "Frontend Engineer · AI Product Systems · Cross-platform", - heroTitle: "把复杂前端系统做成可交付的产品。", - viewProjects: "查看项目案例", - profileAria: "候选人摘要", - mapAria: "项目能力地图", - mapMain: "AI 前端架构", - mapMeta: "SSE · Agent · 多端", - mapNodes: ["Next.js / React", "Expo / RN", "Vue / Qiankun", "i18n / Billing"], - proofKicker: "Proof", - proofTitle: "用指标说明影响力。", - candidate: "Candidate", - phone: "Phone", - email: "Email", - education: "Education", - strengthsKicker: "Strengths", - strengthsTitle: "适合负责高复杂度前端业务闭环。", - skillsKicker: "Capabilities", - skillsTitle: "不是技术罗列,而是围绕交付场景组织能力。", - projectsKicker: "Selected Work", - projectsTitle: "把项目经历改成可扫描的案例索引。", - filterAll: "全部", - experienceKicker: "Experience", - experienceTitle: "工作经历按职责演进呈现。", - domainsKicker: "Featured Domains", - domainsTitle: "最近项目重点。", - contactKicker: "Contact", - contactTitle: "可沟通前端开发工程师岗位。", - sendEmail: "发送邮件", - footer: "Built with Astro.", - }, - en: { - nav: { - top: "Home", - proof: "Proof", - skills: "Skills", - projects: "Projects", - experience: "Experience", - contact: "Contact", - }, - metaDescription: `${displayNameFor(resumeEn, "en")} - ${resumeEn.title}. 7 years of frontend and cross-platform experience across AI products, Next.js, React Native, Vue, micro-frontends and engineering systems.`, - topbarContact: "Contact", - language: "中", - languageLabel: "切换到中文", - themeLabel: "Toggle theme", - themeLight: "Light", - themeDark: "Dark", - heroEyebrow: "Frontend Engineer · AI Product Systems · Cross-platform", - heroTitle: "I turn complex frontend systems into shippable products.", - viewProjects: "View case studies", - profileAria: "Candidate summary", - mapAria: "Project capability map", - mapMain: "AI Frontend Architecture", - mapMeta: "SSE · Agent · Multi-platform", - mapNodes: ["Next.js / React", "Expo / RN", "Vue / Qiankun", "i18n / Billing"], - proofKicker: "Proof", - proofTitle: "Impact backed by measurable outcomes.", - candidate: "Candidate", - phone: "Phone", - email: "Email", - education: "Education", - strengthsKicker: "Strengths", - strengthsTitle: "Built for high-complexity frontend ownership.", - skillsKicker: "Capabilities", - skillsTitle: "Capabilities organized around delivery scenarios.", - projectsKicker: "Selected Work", - projectsTitle: "Project experience shaped into scannable case studies.", - filterAll: "All", - experienceKicker: "Experience", - experienceTitle: "Responsibilities evolved from core delivery to team leadership.", - domainsKicker: "Featured Domains", - domainsTitle: "Recent product focus.", - contactKicker: "Contact", - contactTitle: "Open to frontend engineering opportunities.", - sendEmail: "Send email", - footer: "Built with Astro.", - }, -}; - -const leadProjects = resume.projects.slice(0, 3); -const companyLogoFor = (company: string) => { - if (company.includes("海艺") || company.includes("Haiyi")) return brandAssets.companies.seaart; - if (company.includes("茶姬") || company.includes("Chaji")) return brandAssets.companies.chagee; - if (company.includes("中钧") || company.includes("Zhongjun")) return brandAssets.companies.zhongjun; - return null; -}; -const projectLogoFor = (id: string) => brandAssets.projects[id] ?? null; ---- - - - - - - - - {displayNameFor(resume)} - {resume.title} - - - -
- -
{appEnvLabel}
- -
- - WY - {displayNameFor(resume)} - - -
- - - GitHub - - - - {labels.zh.topbarContact} -
-
- -
-
-
-

{labels.zh.heroEyebrow}

-

{labels.zh.heroTitle}

-

{resume.profile}

- -
- - -
- -
-
-

{labels.zh.proofKicker}

-

{labels.zh.proofTitle}

-
-
- {resume.metrics.map((metric) => ( -
- {metric.value} - {metric.label} -
- ))} -
-
- -
- - -
-
-
-

{labels.zh.strengthsKicker}

-

{labels.zh.strengthsTitle}

-
-
- {resume.highlights.map((item, index) => ( -
- {String(index + 1).padStart(2, "0")} -

{item}

-
- ))} -
-
- -
-
-

{labels.zh.skillsKicker}

-

{labels.zh.skillsTitle}

-
-
- {resume.skills.map((skill) => ( -
-

{skill.group}

-
- {skill.items.map((item) => {item})} -
-
- ))} -
-
- -
-
-
-

{labels.zh.projectsKicker}

-

{labels.zh.projectsTitle}

-
-
- - {resume.projects.map((project) => ( - - ))} -
-
- -
- {resume.projects.map((project, index) => ( -
-
- {projectLogoFor(project.id) && ( - - )} - {String(index + 1).padStart(2, "0")} -
-
-
-
-

{project.name}

-

{project.subtitle}

-
- -
-

{project.summary}

-
    - {project.modules.map((module) =>
  • {module}
  • )} -
-
- {project.tech.map((tech) => {tech})} -
-
-
- ))} -
-
- -
-
-

{labels.zh.experienceKicker}

-

{labels.zh.experienceTitle}

-
-
- {resume.experiences.map((experience) => ( -
-
- {companyLogoFor(experience.company) && ( - - )} - -
-
-

{experience.company}

-

{experience.role}

-
    - {experience.points.map((point) =>
  • {point}
  • )} -
-
-
- ))} -
-
- -
-
-

{labels.zh.domainsKicker}

-

{labels.zh.domainsTitle}

-
-
- {leadProjects.map((project) => ( -
- {projectLogoFor(project.id) && ( - - )} - {project.name} - {project.subtitle} -
- ))} -
-
- -
-
-

{labels.zh.contactKicker}

-

{labels.zh.contactTitle}

- {resume.education.school} · {resume.education.major} · {resume.education.period} -
- -
-
-
-
- - - - - - - diff --git a/src/render.js b/src/render.js new file mode 100644 index 0000000..5bd2afe --- /dev/null +++ b/src/render.js @@ -0,0 +1,209 @@ +import { + experiences, + focusAreas, + metrics, + projects, + resumeSignals, + skills, +} from "./resume-data"; +import { contact, rounds } from "./dialogue"; + +const el = (tag, className, html) => { + const node = document.createElement(tag); + if (className) node.className = className; + if (html != null) node.innerHTML = html; + return node; +}; + +/* ---------- 各轮回答内容 ---------- */ + +function bootContent(answer) { + answer.append( + el( + "h1", + "boot-greeting", + `你好,我是湛兮(花名)
`, + ), + el( + "p", + "boot-identity gen", + `7 年 Web 与跨端前端 · 最近一年在 AI 产品团队 做对话链路与控制台`, + ), + ); + const stream = el("div", "metric-stream"); + metrics.forEach((m) => { + const token = el("div", "metric-token gen"); + token.append(el("span", "v", m.value), el("span", "l", m.label)); + stream.append(token); + }); + answer.append(stream, el("div", "boot-hint gen", "SCROLL TO ASK")); +} + +function signalsContent(answer) { + answer.append(el("div", "a-title gen", "Self Introduction")); + resumeSignals.forEach((line, i) => { + const row = el("div", "signal-line gen"); + row.append( + el("span", "idx", String(i + 1).padStart(2, "0")), + el("p", null, line), + ); + answer.append(row); + }); +} + +function focusContent(answer) { + answer.append(el("div", "a-title gen", "Last 12 Months")); + const grid = el("div", "focus-grid"); + answer.append(grid); + focusAreas.forEach((f) => { + const card = el("div", "focus-card gen"); + card.append(el("h3", null, f.title), el("p", null, f.summary)); + const tags = el("div", "tag-row"); + f.points.forEach((p) => tags.append(el("span", "tag", p))); + card.append(tags); + grid.append(card); + }); +} + +function projectsContent(answer) { + answer.append(el("div", "a-title gen", "Selected Proof")); + projects.forEach((p) => { + const block = el("article", "project-block gen"); + const head = el("div", "project-head"); + head.append( + Object.assign(el("img"), { src: p.logo, alt: p.name, loading: "lazy" }), + el("span", "name", p.name), + el("span", "period", p.period), + ); + block.append( + head, + el("div", "project-sub", p.subtitle), + el("p", "project-summary", p.summary), + ); + const ul = el("ul", "project-modules"); + p.modules.forEach((m) => ul.append(el("li", "gen-sub", m))); + block.append(ul); + const tags = el("div", "tag-row"); + p.tech.forEach((t) => tags.append(el("span", "tag", t))); + block.append(tags); + answer.append(block); + }); +} + +function skillsContent(answer) { + answer.append(el("div", "a-title gen", "Token Stream / Skills")); + const HOT = new Set([ + "SSE 流式通信", + "Next.js", + "React", + "React Native", + "TypeScript", + "Qiankun", + ]); + skills.forEach((group) => { + const wrap = el("div", "skill-group"); + wrap.append(el("div", "g-name", group.group)); + const row = el("div", "tag-row"); + group.items.forEach((item) => { + row.append( + el("span", `skill-token gen${HOT.has(item) ? " hot" : ""}`, item), + ); + }); + wrap.append(row); + answer.append(wrap); + }); +} + +function experienceContent(answer) { + answer.append(el("div", "a-title gen", "Career Path")); + experiences.forEach((exp) => { + const item = el("div", "exp-item gen"); + const head = el("div", "exp-head"); + head.append( + Object.assign(el("img"), { + src: exp.logo, + alt: exp.company, + loading: "lazy", + }), + el("span", "co", exp.company), + el("span", "period", exp.period), + ); + item.append(head, el("div", "exp-role", exp.role)); + const ul = el("ul", "exp-points"); + exp.points.forEach((pt) => ul.append(el("li", null, pt))); + item.append(ul); + answer.append(item); + }); +} + +function contactContent(answer) { + answer.append( + el("h2", "contact-lead gen", "随时可以开启下一轮对话。"), + el("p", "contact-id gen", contact.identity), + ); + const actions = el("div", "contact-actions gen"); + const mail = el("a", "contact-btn primary", "发送邮件"); + mail.href = `mailto:${contact.emails[0]}`; + const mail2 = el("a", "contact-btn", contact.emails[1]); + mail2.href = `mailto:${contact.emails[1]}`; + const gh = el("a", "contact-btn", "GitHub / zhanBoss"); + gh.href = contact.github; + gh.target = "_blank"; + gh.rel = "noreferrer"; + const tel = el("a", "contact-btn", contact.phone); + tel.href = `tel:${contact.phone}`; + actions.append(mail, mail2, gh, tel); + answer.append(actions, el("div", "session-end gen", "SESSION SAVED · 2026")); +} + +const CONTENT = { + boot: bootContent, + signals: signalsContent, + focus: focusContent, + projects: projectsContent, + skills: skillsContent, + experience: experienceContent, + contact: contactContent, +}; + +/* ---------- 装配 ---------- */ + +export function renderDialogue(mount) { + rounds.forEach((round) => { + const section = el("section", "round"); + section.id = `r-${round.id}`; + section.dataset.side = String(round.side); + const inner = el("div", "round-inner"); + + if (round.question) { + const qRow = el("div", "q-row"); + const bubble = el("div", "q-bubble"); + bubble.append(el("span", "q-text"), el("span", "q-caret")); + qRow.append(bubble); + const thinking = el("div", "thinking"); + const dots = el("span", "dots"); + dots.append(el("span", "dot"), el("span", "dot"), el("span", "dot")); + thinking.append(dots, el("span", null, "THINKING")); + inner.append(qRow, thinking); + } + + const answer = el("div", "answer"); + CONTENT[round.type](answer); + if (round.type !== "boot") answer.append(el("span", "a-caret", "▋")); + inner.append(answer); + section.append(inner); + mount.append(section); + }); +} + +export function renderRail(mount, onJump) { + rounds.forEach((round) => { + const node = el("button", "rail-node"); + node.type = "button"; + node.dataset.round = round.id; + node.setAttribute("aria-label", `跳转到 ${round.label}`); + node.append(el("span", "rail-label", round.label)); + node.addEventListener("click", () => onJump(round.id)); + mount.append(node); + }); +} diff --git a/src/resume-data.js b/src/resume-data.js new file mode 100644 index 0000000..03b13dc --- /dev/null +++ b/src/resume-data.js @@ -0,0 +1,173 @@ +export const metrics = [ + { value: "7 年", label: "Web 与跨端前端经验" }, + { value: "2 条", label: "近一年参与的产品线" }, + { value: "SSE", label: "对话流、思考态、消息重试" }, + { value: "12 个", label: "微前端拆分基础项目" }, + { value: "30%", label: "消息渲染链路优化结果" }, + { value: "6000+", label: "门店业务系统服务规模" }, +]; + +export const focusAreas = [ + { + title: "对话链路", + summary: "做过流式消息、思考态、来源引用、历史同步和失败重试,重点是让对话过程稳定、可恢复。", + points: ["SSE", "Markdown/LaTeX", "来源引用", "消息重试"], + }, + { + title: "控制台业务", + summary: "参与过 API Key、账单、组织权限、额度、交易筛选和导出,知道复杂后台最怕状态不清和边界不稳。", + points: ["API Key", "Billing", "RBAC", "Excel 导出"], + }, + { + title: "跨端内容流", + summary: "在 Expo / React Native 项目里做过新闻流、详情页、瀑布流、图片组件和游客转登录数据处理。", + points: ["Expo", "瀑布流", "Smart Image", "游客绑定"], + }, + { + title: "工程习惯", + summary: "经历过微前端拆分、跨项目公共包、i18n 协作、监控接入和代码审查,能把模块交付和团队维护放在一起考虑。", + points: ["Qiankun", "Monorepo", "i18n", "Code Review"], + }, +]; + +export const resumeSignals = [ + "前端经验覆盖 PC 管理后台、小程序、H5、React Native 和微前端,最近一年主要在 AI 产品团队做业务前端。", + "SeaBuzz 侧更偏用户体验:对话、内容流、新闻详情、游客数据、分享和反馈链路。", + "SeaCloud / Vtrix 侧更偏控制台:Pricing、Billing、API Keys、组织权限、交易筛选和分销配置。", + "技术栈以 React / Next.js / React Native / TypeScript 为主,也有 Vue、UniApp 和 Qiankun 项目经验。", +]; + +export const skills = [ + { + group: "对话与内容", + items: ["SSE 流式通信", "打字机响应", "Markdown/LaTeX", "来源引用", "对话历史", "新闻详情"], + }, + { + group: "控制台", + items: ["Pricing", "Billing", "API Keys", "组织权限", "额度限制", "交易筛选", "Excel 导出"], + }, + { + group: "跨端体验", + items: ["React Native", "Expo Router", "NativeWind", "游客转登录", "只读分享", "Smart Image"], + }, + { + group: "Web 主栈", + items: ["Next.js", "React", "Vue 3", "TypeScript", "Tailwind CSS", "Zustand", "Alova"], + }, + { + group: "小程序与 H5", + items: ["UniApp", "微信小程序", "飞书小程序", "H5", "摄像头扫码", "低功耗蓝牙"], + }, + { + group: "工程协作", + items: ["pnpm Monorepo", "Git Submodules", "Qiankun", "Lerna", "i18n 同步", "Code Review"], + }, + { + group: "工程化与质量", + items: ["ARMS 监控", "CDN 优化", "Playwright", "Git Flow", "分支规范", "新人培训"], + }, +]; + +export const projects = [ + { + id: "vtrix", + name: "SeaCloud / Vtrix", + logo: "/logos/vtrix.png", + period: "2025.09 - 至今", + subtitle: "模型服务平台控制台", + summary: + "参与模型服务平台的前端建设,主要处理 Pricing、Billing、API Keys、组织权限、额度和分销相关页面。项目复杂度不在单个页面,而在状态、权限和账务边界。", + modules: [ + "建设分销控制台:客户邀请、折扣模板、额度分配、销售配置与利润率计算。", + "封装 useCurrency Hook,贯穿 Pricing、Billing、API Keys 等模型调用和费用模块。", + "落地组织角色权限、成员配额、支出限额、账单报表、交易筛选与 Excel 导出。", + "参与 i18n Submodule 架构迁移、企业微信翻译同步和通用表格/筛选器/分页组件增强。", + ], + tech: ["Next.js 16", "React 19", "TypeScript", "Tailwind CSS", "Zustand", "Alova", "Radix UI", "next-intl"], + }, + { + id: "seabuzz", + name: "SeaBuzz", + logo: "/logos/seabuzz.webp", + period: "2025.05 - 至今", + subtitle: "资讯、搜索与对话应用", + summary: + "基于 Expo 的跨端应用,覆盖 iOS、Android、Web。我的工作集中在对话链路、内容流、登录绑定、分享和公共包沉淀。", + modules: [ + "实现对话链路:SSE 流式聊天、打字机渲染、Markdown/LaTeX、思考动画、来源引用、消息重写与历史同步。", + "处理游客聊天记录本地存储、登录后自动绑定、分享链接只读模式和反馈机制。", + "交付 Discover 发现页、新闻详情、瀑布流动态布局、骨架屏、Smart Image 与富文本章节渲染。", + "集成 Google、Facebook、Discord、Email 登录与 SeaArt Auth SDK。", + "封装 Monorepo 公共包体系,覆盖 API、数据模型、UI 组件、状态、OTA 热更新与代码签名。", + ], + tech: ["React Native", "Expo 53", "Expo Router", "Zustand", "NativeWind", "SSE", "i18next", "Adyen"], + }, + { + id: "bawang", + name: "霸王功夫", + logo: "/logos/chagee.png", + period: "2024.03 - 2025.03", + subtitle: "门店、食安与供应链系统", + summary: + "服务全球 6000+ 门店及运营伙伴,覆盖门店运营、食品安全、供应链协同等核心业务。", + modules: [ + "搭建小程序报损模块,调用摄像头扫码并兼容微信小程序与飞书 H5。", + "实现食安管理模块,通过低频蓝牙连接 TSPL 指令集打印机,覆盖国内、东南亚、北美三套业务逻辑。", + "交付多门店经营状态移动看板,支持区域、时间、指标筛选。", + "负责采购、供应商合同、供应商结算等供应链系统,对接云厉、费控等外部系统。", + ], + tech: ["React 18", "Vue 3", "UniApp", "MobX", "Pinia", "Element Plus", "Ant Design"], + }, + { + id: "jingyingbang", + name: "经营帮平台 + 经营帮拉新", + logo: "/logos/jingyingbang.png", + period: "2022.04 - 2024.03", + subtitle: "微前端平台与小程序", + summary: + "基于信息化设计理念和区块链技术的工业互联网平台,为企业和个人提供数字化运营服务。", + modules: [ + "参与单体前端到 Qiankun 微前端拆分,共拆分出 12 个基础项目。", + "负责商管、门户、经营帮小程序、H5、Admin 后台核心业务交付。", + "引入华为云 OBS 直传,降低请求链路性能浪费。", + "开发内部 Chrome 插件 zjkj-decryption,提升数据解析效率。", + ], + tech: ["Vue", "Qiankun", "Element UI", "华为云 OBS", "百度地图", "高德地图", "UniApp"], + }, +]; + +export const experiences = [ + { + company: "成都海艺互娱科技有限公司", + logo: "/logos/seaart.webp", + role: "React Native 开发工程师", + period: "2025.05 - 至今", + points: [ + "参与 SeaBuzz、SeaCloud / Vtrix 等项目,主要负责 React Native 跨端页面和 Web 控制台模块。", + "负责对话流、内容流、分享、游客数据绑定、账单、API Keys、组织权限等业务页面开发。", + "优化消息渲染链路和跨端公共包复用,消息渲染性能提升约 30%。", + ], + }, + { + company: "四川茶姬企业管理有限公司", + logo: "/logos/chagee.png", + role: "高级 Web 前端开发", + period: "2024.03 - 2025.03", + points: [ + "主导供应链管理系统前端开发,实现采购、仓储、配送等核心模块功能。", + "独立负责门店报损与食安核心功能搭建及迭代。", + "完成前端监控体系引入、CDN 静态资源优化、代码审查机制与 Git 操作规范建设。", + ], + }, + { + company: "中钧科技有限公司四川分公司", + logo: "/logos/zhongjun.png", + role: "前端开发组长", + period: "2022.04 - 2024.03", + points: [ + "负责经营帮 PC 端微前端、门户和商管核心模块开发,完成 UI 还原、接口联调与性能优化。", + "从零搭建新 E 畅行小程序基础框架,制定技术方案并完成全流程开发。", + "设计 Git Flow、代码审查与分支管理机制,主导新人培训与项目分工协调。", + ], + }, +]; diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..752c6fb --- /dev/null +++ b/src/styles.css @@ -0,0 +1,745 @@ +/* ============ 深色 AI 实验室 ============ */ +:root { + color-scheme: dark; + --bg: #070b14; + --bg-soft: #0b1120; + --ink: #e6edf7; + --ink-dim: #8b97ad; + --ink-faint: #4d586e; + --cyan: #22d3ee; + --violet: #a78bfa; + --amber: #fbbf24; + --line: rgba(139, 151, 173, 0.16); + --mono: "JetBrains Mono", "SFMono-Regular", ui-monospace, Menlo, monospace; + --sans: "Inter", "PingFang SC", "Noto Sans SC", "Microsoft YaHei", sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-behavior: auto; +} + +body { + background: var(--bg); + color: var(--ink); + font-family: var(--sans); + font-size: 16px; + line-height: 1.7; + overflow-x: hidden; + -webkit-font-smoothing: antialiased; +} + +::selection { + background: rgba(34, 211, 238, 0.35); +} + +a { + color: var(--cyan); + text-decoration: none; +} + +/* ============ 底层画布与氛围 ============ */ +#mind-canvas { + position: fixed; + inset: 0; + width: 100%; + height: 100%; + z-index: 0; + pointer-events: none; +} + +.grid-overlay { + position: fixed; + inset: 0; + z-index: 0; + pointer-events: none; + background-image: radial-gradient(rgba(139, 151, 173, 0.13) 1px, transparent 1px); + background-size: 34px 34px; + mask-image: radial-gradient(ellipse 90% 80% at 50% 45%, black 30%, transparent 100%); + -webkit-mask-image: radial-gradient(ellipse 90% 80% at 50% 45%, black 30%, transparent 100%); +} + +/* ============ HUD ============ */ +.hud { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 30; + display: flex; + justify-content: space-between; + align-items: center; + padding: 18px 28px; + font-family: var(--mono); + font-size: 11px; + letter-spacing: 0.14em; + background: linear-gradient(to bottom, rgba(7, 11, 20, 0.85), transparent); + pointer-events: none; +} + +.hud-id { + display: flex; + flex-direction: column; + gap: 2px; +} + +.hud-name { + color: var(--ink); + font-weight: 700; +} + +.hud-sub { + color: var(--ink-faint); + font-size: 10px; +} + +.hud-status { + display: flex; + align-items: center; + gap: 8px; + color: var(--cyan); +} + +.status-dot { + width: 7px; + height: 7px; + border-radius: 50%; + background: var(--cyan); + box-shadow: 0 0 10px var(--cyan); + animation: pulse 2.2s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.35; } +} + +/* ============ 会话进度轨 ============ */ +#session-rail { + position: fixed; + right: 22px; + top: 50%; + transform: translateY(-50%); + z-index: 30; + display: flex; + flex-direction: column; + gap: 4px; +} + +.rail-node { + display: flex; + align-items: center; + gap: 10px; + flex-direction: row-reverse; + background: none; + border: 0; + padding: 6px 0; + cursor: pointer; + font-family: var(--mono); + font-size: 9px; + letter-spacing: 0.18em; + color: var(--ink-faint); + transition: color 0.3s; +} + +.rail-node::after { + content: ""; + width: 8px; + height: 8px; + border-radius: 50%; + border: 1px solid var(--ink-faint); + transition: all 0.3s; + flex: none; +} + +.rail-node .rail-label { + opacity: 0; + transform: translateX(6px); + transition: all 0.3s; +} + +.rail-node:hover .rail-label { + opacity: 1; + transform: none; +} + +.rail-node.active { + color: var(--cyan); +} + +.rail-node.active::after { + background: var(--cyan); + border-color: var(--cyan); + box-shadow: 0 0 12px var(--cyan); +} + +.rail-node.active .rail-label { + opacity: 1; + transform: none; +} + +/* ============ 对话轮次 ============ */ +main { + position: relative; + z-index: 10; +} + +.round { + min-height: 100vh; + display: flex; + align-items: center; + padding: 96px 7vw; +} + +.round-inner { + width: min(640px, 100%); + position: relative; +} + +.round[data-side="-1"] .round-inner { margin-left: auto; } +.round[data-side="1"] .round-inner { margin-right: auto; } +.round[data-side="0"] .round-inner { margin: 0 auto; } + +/* 提问气泡(访客) */ +.q-bubble { + display: inline-flex; + align-items: baseline; + margin-left: auto; + margin-bottom: 34px; + padding: 12px 20px; + border: 1px solid rgba(34, 211, 238, 0.45); + border-radius: 18px 18px 4px 18px; + font-family: var(--mono); + font-size: 15px; + color: var(--cyan); + background: rgba(34, 211, 238, 0.05); + min-height: 46px; + min-width: 60px; +} + +.q-row { + display: flex; + justify-content: flex-end; +} + +.q-caret { + display: inline-block; + width: 8px; + height: 1.1em; + margin-left: 4px; + background: var(--cyan); + transform: translateY(2px); + animation: blink 0.9s steps(1) infinite; +} + +@keyframes blink { + 50% { opacity: 0; } +} + +/* 思考态 */ +.thinking { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 30px; + font-family: var(--mono); + font-size: 12px; + letter-spacing: 0.2em; + color: var(--violet); + opacity: 0; +} + +.thinking .dots { + display: inline-flex; + gap: 5px; +} + +.thinking .dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--violet); + animation: think 1.1s ease-in-out infinite; +} + +.thinking .dot:nth-child(2) { animation-delay: 0.18s; } +.thinking .dot:nth-child(3) { animation-delay: 0.36s; } + +@keyframes think { + 0%, 100% { transform: translateY(0); opacity: 0.4; } + 50% { transform: translateY(-5px); opacity: 1; } +} + +/* 回答块 */ +.answer { + position: relative; + padding-left: 26px; + opacity: 0; +} + +.answer::before { + content: ""; + position: absolute; + left: 0; + top: 4px; + bottom: 4px; + width: 2px; + border-radius: 2px; + background: linear-gradient(to bottom, var(--cyan), var(--violet)); + box-shadow: 0 0 14px rgba(167, 139, 250, 0.5); +} + +.a-caret { + display: inline-block; + margin-top: 14px; + color: var(--violet); + font-family: var(--mono); + animation: blink 1s steps(1) infinite; +} + +.a-title { + font-family: var(--mono); + font-size: 13px; + letter-spacing: 0.22em; + color: var(--violet); + margin-bottom: 18px; + text-transform: uppercase; +} + +/* ============ Round 0: BOOT ============ */ +#r-boot .round-inner { + width: min(760px, 100%); +} + +.boot-greeting { + font-size: clamp(34px, 5.4vw, 58px); + font-weight: 700; + line-height: 1.18; + letter-spacing: -0.01em; + min-height: 1.2em; +} + +.boot-greeting .grad { + background: linear-gradient(100deg, var(--cyan), var(--violet)); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +.boot-identity { + margin-top: 20px; + font-family: var(--mono); + font-size: 14px; + color: var(--ink-dim); +} + +.boot-identity em { + font-style: normal; + color: var(--cyan); +} + +.metric-stream { + margin-top: 44px; + display: flex; + flex-wrap: wrap; + gap: 12px; +} + +.metric-token { + font-family: var(--mono); + border: 1px solid var(--line); + border-radius: 10px; + padding: 10px 16px; + background: rgba(11, 17, 32, 0.7); + backdrop-filter: blur(6px); +} + +.metric-token .v { + color: var(--amber); + font-weight: 700; + font-size: 17px; +} + +.metric-token .l { + display: block; + font-size: 11px; + color: var(--ink-dim); + margin-top: 2px; +} + +.boot-hint { + margin-top: 56px; + font-family: var(--mono); + font-size: 11px; + letter-spacing: 0.24em; + color: var(--ink-faint); + display: flex; + align-items: center; + gap: 12px; +} + +.boot-hint::after { + content: "↓"; + animation: bob 1.6s ease-in-out infinite; +} + +@keyframes bob { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(6px); } +} + +/* ============ Round 1: 概述 ============ */ +.signal-line { + display: flex; + gap: 14px; + margin-bottom: 18px; + font-size: 16px; + color: var(--ink); +} + +.signal-line .idx { + font-family: var(--mono); + font-size: 12px; + color: var(--ink-faint); + padding-top: 5px; + flex: none; +} + +/* ============ Round 2: 焦点卡 ============ */ +.focus-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 14px; +} + +.focus-card { + border: 1px solid var(--line); + border-radius: 14px; + padding: 20px; + background: rgba(11, 17, 32, 0.72); + backdrop-filter: blur(8px); + transition: border-color 0.3s; +} + +.focus-card:hover { + border-color: rgba(34, 211, 238, 0.4); +} + +.focus-card h3 { + font-size: 16px; + margin-bottom: 8px; + color: var(--ink); +} + +.focus-card p { + font-size: 13px; + color: var(--ink-dim); + margin-bottom: 12px; +} + +.tag-row { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.tag { + font-family: var(--mono); + font-size: 10.5px; + padding: 3px 9px; + border-radius: 999px; + border: 1px solid rgba(167, 139, 250, 0.35); + color: var(--violet); +} + +/* ============ Round 3: 项目 ============ */ +.project-block { + border: 1px solid var(--line); + border-radius: 16px; + padding: 24px; + margin-bottom: 18px; + background: rgba(11, 17, 32, 0.78); + backdrop-filter: blur(8px); +} + +.project-head { + display: flex; + align-items: center; + gap: 14px; + margin-bottom: 6px; +} + +.project-head img { + width: 38px; + height: 38px; + border-radius: 10px; + object-fit: cover; + background: var(--bg-soft); +} + +.project-head .name { + font-size: 18px; + font-weight: 700; +} + +.project-head .period { + margin-left: auto; + font-family: var(--mono); + font-size: 11px; + color: var(--ink-faint); +} + +.project-sub { + font-family: var(--mono); + font-size: 12px; + color: var(--cyan); + margin-bottom: 10px; +} + +.project-summary { + font-size: 13.5px; + color: var(--ink-dim); + margin-bottom: 14px; +} + +.project-modules { + list-style: none; + margin-bottom: 14px; +} + +.project-modules li { + position: relative; + padding-left: 18px; + font-size: 13px; + color: var(--ink); + margin-bottom: 7px; +} + +.project-modules li::before { + content: "▸"; + position: absolute; + left: 0; + color: var(--violet); +} + +/* ============ Round 4: 技能 ============ */ +.skill-group { + margin-bottom: 20px; +} + +.skill-group .g-name { + font-family: var(--mono); + font-size: 11px; + letter-spacing: 0.2em; + color: var(--ink-faint); + margin-bottom: 8px; + text-transform: uppercase; +} + +.skill-token { + font-family: var(--mono); + font-size: 12px; + padding: 6px 12px; + border-radius: 8px; + border: 1px solid var(--line); + background: rgba(11, 17, 32, 0.7); + color: var(--ink); + display: inline-block; +} + +.skill-token.hot { + border-color: rgba(34, 211, 238, 0.5); + color: var(--cyan); +} + +/* ============ Round 5: 经历 ============ */ +.exp-item { + position: relative; + padding: 0 0 30px 30px; +} + +.exp-item::before { + content: ""; + position: absolute; + left: 6px; + top: 8px; + bottom: -4px; + width: 1px; + background: var(--line); +} + +.exp-item:last-child::before { bottom: auto; height: calc(100% - 8px); } + +.exp-item::after { + content: ""; + position: absolute; + left: 2px; + top: 8px; + width: 9px; + height: 9px; + border-radius: 50%; + background: var(--bg); + border: 2px solid var(--cyan); + box-shadow: 0 0 10px rgba(34, 211, 238, 0.6); +} + +.exp-head { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; +} + +.exp-head img { + width: 26px; + height: 26px; + border-radius: 7px; + object-fit: cover; +} + +.exp-head .co { + font-weight: 600; + font-size: 15px; +} + +.exp-head .period { + font-family: var(--mono); + font-size: 11px; + color: var(--ink-faint); +} + +.exp-role { + font-family: var(--mono); + font-size: 12px; + color: var(--violet); + margin: 4px 0 8px; +} + +.exp-points { + list-style: none; +} + +.exp-points li { + font-size: 13px; + color: var(--ink-dim); + margin-bottom: 5px; + padding-left: 16px; + position: relative; +} + +.exp-points li::before { + content: "—"; + position: absolute; + left: 0; + color: var(--ink-faint); +} + +/* ============ Round 6: 联系 ============ */ +.contact-lead { + font-size: clamp(24px, 3.4vw, 36px); + font-weight: 700; + margin-bottom: 12px; +} + +.contact-id { + font-family: var(--mono); + font-size: 12.5px; + color: var(--ink-dim); + margin-bottom: 28px; +} + +.contact-actions { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-bottom: 36px; +} + +.contact-btn { + font-family: var(--mono); + font-size: 13px; + padding: 12px 22px; + border-radius: 10px; + border: 1px solid var(--line); + color: var(--ink); + transition: all 0.3s; +} + +.contact-btn.primary { + border-color: var(--cyan); + color: #06222b; + background: var(--cyan); + box-shadow: 0 0 24px rgba(34, 211, 238, 0.35); +} + +.contact-btn:not(.primary):hover { + border-color: var(--violet); + color: var(--violet); +} + +.session-end { + font-family: var(--mono); + font-size: 11px; + letter-spacing: 0.24em; + color: var(--ink-faint); + display: flex; + align-items: center; + gap: 12px; +} + +.session-end::before, +.session-end::after { + content: ""; + height: 1px; + flex: 1; + background: var(--line); +} + +/* ============ 响应式 ============ */ +@media (max-width: 880px) { + .round { + padding: 80px 6vw; + align-items: flex-end; + } + + .round-inner { + width: 100%; + } + + .focus-grid { + grid-template-columns: 1fr; + } + + #session-rail { + right: auto; + top: 54px; + left: 50%; + transform: translateX(-50%); + flex-direction: row; + gap: 14px; + } + + .rail-node .rail-label { display: none; } + + .hud { padding: 14px 18px; } + + .project-head .period { + margin-left: 0; + width: 100%; + } +} + +/* ============ 降级 ============ */ +@media (prefers-reduced-motion: reduce) { + .q-caret, .a-caret, .status-dot, .thinking .dot, .boot-hint::after { + animation: none; + } + + .thinking { display: none; } + .answer { opacity: 1; } +} diff --git a/src/styles/global.css b/src/styles/global.css deleted file mode 100644 index 613a00e..0000000 --- a/src/styles/global.css +++ /dev/null @@ -1,1249 +0,0 @@ -:root { - color-scheme: light; - --paper: #eef1f4; - --paper-2: #f7f8f2; - --ink: #171717; - --muted: #5c626a; - --soft: #8a929b; - --line: #d8dde3; - --line-strong: #b8c0c9; - --white: #fcfbf7; - --green: #16855e; - --blue: #2f5fbe; - --amber: #a76516; - --rose: #b43c64; - --grid-line: rgba(23, 23, 23, 0.045); - --topbar-bg: rgba(238, 241, 244, 0.86); - --nav-bg: rgba(252, 251, 247, 0.72); - --surface: rgba(252, 251, 247, 0.72); - --surface-strong: rgba(252, 251, 247, 0.82); - --map-bg: rgba(252, 251, 247, 0.72); - --button-bg: rgba(252, 251, 247, 0.56); - --button-hover: #fcfbf7; - --inverse-muted: rgba(244, 241, 234, 0.72); - --shadow: 0 22px 55px rgba(23, 23, 23, 0.1); - --max: 1160px; - --radius: 8px; -} - -html[data-theme="dark"] { - color-scheme: dark; - --paper: #111214; - --paper-2: #18191d; - --ink: #f4efe6; - --muted: #bab1a4; - --soft: #8e867b; - --line: #343235; - --line-strong: #4a4642; - --white: #191a1f; - --green: #63d79b; - --blue: #8bb4ff; - --amber: #f0b35a; - --rose: #ff8aa8; - --grid-line: rgba(255, 255, 255, 0.045); - --topbar-bg: rgba(17, 18, 20, 0.86); - --nav-bg: rgba(255, 255, 255, 0.055); - --surface: rgba(255, 255, 255, 0.055); - --surface-strong: rgba(255, 255, 255, 0.08); - --map-bg: #15161a; - --button-bg: rgba(255, 255, 255, 0.055); - --button-hover: rgba(255, 255, 255, 0.11); - --inverse-muted: rgba(17, 18, 20, 0.68); - --shadow: 0 22px 65px rgba(0, 0, 0, 0.28); -} - -* { - box-sizing: border-box; -} - -html { - scroll-behavior: smooth; -} - -body { - margin: 0; - min-height: 100vh; - background: - linear-gradient(116deg, rgba(47, 95, 190, 0.08), transparent 36%), - linear-gradient(246deg, rgba(22, 133, 94, 0.07), transparent 44%), - linear-gradient(90deg, var(--grid-line) 1px, transparent 1px), - linear-gradient(var(--grid-line) 1px, transparent 1px), - var(--paper); - background-size: auto, auto, 40px 40px, 40px 40px, auto; - color: var(--ink); - font-family: - Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", - "Microsoft YaHei", sans-serif; - font-size: 15px; - line-height: 1.58; - letter-spacing: 0; - overflow-x: hidden; -} - -a { - color: inherit; -} - -button, -a { - -webkit-tap-highlight-color: transparent; -} - -.scroll-progress { - position: fixed; - top: 0; - left: 0; - z-index: 60; - width: 100%; - height: 3px; - transform: scaleX(0); - transform-origin: left; - background: linear-gradient(90deg, var(--green), var(--blue), var(--amber)); -} - -.environment-badge { - position: fixed; - top: 72px; - right: 16px; - z-index: 61; - padding: 8px 10px; - color: #ffffff; - font-size: 12px; - font-weight: 750; - line-height: 1; - letter-spacing: 0; - background: rgba(20, 20, 24, 0.86); - border-radius: 999px; - box-shadow: 0 10px 24px rgba(0, 0, 0, 0.16); -} - -.ambient-canvas { - position: fixed; - inset: 0; - z-index: 0; - width: 100vw; - height: 100vh; - pointer-events: none; - opacity: 0.88; -} - -.topbar { - position: sticky; - top: 0; - z-index: 50; - display: grid; - grid-template-columns: 1fr auto 1fr; - align-items: center; - gap: 0.8rem; - min-height: 64px; - padding: 0 clamp(1rem, 4vw, 2.5rem); - border-bottom: 1px solid var(--line); - background: var(--topbar-bg); - backdrop-filter: blur(18px); -} - -.brand { - display: inline-flex; - align-items: center; - gap: 0.7rem; - width: fit-content; - text-decoration: none; -} - -.brand span { - display: grid; - place-items: center; - width: 34px; - height: 34px; - border-radius: 50%; - background: var(--ink); - color: var(--paper); - font-size: 0.72rem; - font-weight: 800; -} - -.brand strong { - font-size: 0.9rem; -} - -.nav { - display: flex; - align-items: center; - gap: 0.25rem; - padding: 0.3rem; - border: 1px solid var(--line); - border-radius: 999px; - background: var(--nav-bg); -} - -.nav a { - display: inline-flex; - align-items: center; - justify-content: center; - min-height: 30px; - padding: 0 0.66rem; - border-radius: 999px; - color: var(--muted); - text-decoration: none; - font-size: 0.8rem; - transition: color 180ms ease, background 180ms ease; -} - -.nav a:hover, -.nav a.active { - color: var(--paper); - background: var(--ink); -} - -.topbar-cta { - display: inline-flex; - align-items: center; - min-height: 34px; - padding: 0 0.82rem; - border: 1px solid var(--ink); - border-radius: 999px; - text-decoration: none; - font-size: 0.82rem; - font-weight: 750; - transition: transform 180ms ease, background 180ms ease, border-color 180ms ease, box-shadow 180ms ease; -} - -.topbar-actions { - justify-self: end; - display: flex; - align-items: center; - justify-content: flex-end; - gap: 0.45rem; -} - -.github-link, -.control-button { - display: inline-flex; - align-items: center; - justify-content: center; - min-height: 34px; - border: 1px solid var(--line); - border-radius: 999px; - background: var(--nav-bg); - color: var(--ink); - text-decoration: none; - font: inherit; - font-size: 0.8rem; - font-weight: 800; - transition: transform 180ms ease, background 180ms ease, border-color 180ms ease, box-shadow 180ms ease; -} - -.github-link { - gap: 0.45rem; - padding: 0 0.74rem; -} - -.github-link svg { - width: 18px; - height: 18px; -} - -.control-button { - min-width: 34px; - padding: 0 0.58rem; - cursor: pointer; -} - -.github-link:hover, -.control-button:hover, -.topbar-cta:hover { - transform: translateY(-1px); - border-color: var(--ink); - background: var(--button-hover); -} - -main { - position: relative; - z-index: 1; - overflow: clip; -} - -.footer { - position: relative; - z-index: 1; -} - -.hero { - position: relative; - display: grid; - grid-template-columns: minmax(0, 1.08fr) minmax(340px, 0.82fr); - gap: clamp(1.8rem, 4.4vw, 4.2rem); - max-width: var(--max); - min-height: calc(88vh - 64px); - margin: 0 auto; - padding: clamp(3.4rem, 7vw, 5.8rem) clamp(1rem, 4vw, 2.5rem); - align-items: center; -} - -.eyebrow, -.section-title p, -.rail-label, -.contact-section > div > p { - margin: 0 0 0.8rem; - color: var(--green); - font-size: 0.72rem; - font-weight: 800; - letter-spacing: 0.1em; - text-transform: uppercase; -} - -.hero h1 { - max-width: 680px; - margin: 0; - font-size: clamp(2.45rem, 4.25vw, 4.65rem); - line-height: 1.04; - letter-spacing: 0; -} - -.lead { - max-width: 660px; - margin: 1.15rem 0 0; - color: var(--muted); - font-size: clamp(0.98rem, 1.28vw, 1.1rem); -} - -.hero-actions, -.contact-actions { - display: flex; - flex-wrap: wrap; - gap: 0.6rem; - margin-top: 1.55rem; -} - -.button { - display: inline-flex; - align-items: center; - justify-content: center; - min-height: 38px; - padding: 0 0.9rem; - border: 1px solid var(--line-strong); - border-radius: 999px; - background: var(--button-bg); - color: var(--ink); - text-decoration: none; - font-size: 0.88rem; - font-weight: 750; - transition: transform 180ms ease, background 180ms ease, border-color 180ms ease, box-shadow 180ms ease; -} - -.button:hover { - transform: translateY(-2px); - border-color: var(--ink); - background: var(--button-hover); -} - -.button-primary { - border-color: var(--ink); - background: var(--ink); - color: var(--paper); -} - -.button-primary:hover { - background: var(--ink); - color: var(--paper); -} - -.brand-logo { - display: grid; - place-items: center; - width: 42px; - height: 42px; - overflow: hidden; - border: 1px solid var(--line); - border-radius: var(--radius); - background: - linear-gradient(135deg, rgba(255, 255, 255, 0.62), rgba(255, 255, 255, 0.18)), - var(--surface-strong); - box-shadow: 0 10px 24px rgba(23, 23, 23, 0.08); - flex: 0 0 auto; -} - -.brand-logo img { - display: block; - width: 74%; - height: 74%; - object-fit: contain; -} - -.brand-logo-wide img { - width: 86%; - height: 54%; -} - -.hero-panel { - position: relative; - border: 1px solid var(--line-strong); - border-radius: var(--radius); - background: color-mix(in srgb, var(--white) 88%, transparent); - box-shadow: var(--shadow); - overflow: hidden; - backdrop-filter: blur(14px); -} - -.profile-card { - display: flex; - align-items: center; - gap: 0.85rem; - padding: 1rem; - border-bottom: 1px solid var(--line); -} - -.avatar { - display: grid; - place-items: center; - width: 48px; - height: 48px; - border-radius: var(--radius); - background: var(--ink); - color: var(--paper); - font-size: 1.12rem; - font-weight: 900; -} - -.profile-card p { - margin: 0; - color: var(--muted); -} - -.profile-card .profile-name { - color: var(--ink); - font-size: 1.04rem; - font-weight: 900; -} - -.signal-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - border-bottom: 1px solid var(--line); -} - -.signal-grid div { - min-height: 92px; - padding: 0.95rem; - border-right: 1px solid var(--line); - border-bottom: 1px solid var(--line); -} - -.signal-grid div:nth-child(2n) { - border-right: 0; -} - -.signal-grid div:nth-last-child(-n + 2) { - border-bottom: 0; -} - -.signal-grid span { - display: block; - color: var(--soft); - font-size: 0.76rem; -} - -.signal-grid strong { - display: block; - margin-top: 0.35rem; - font-size: 1.02rem; - line-height: 1.15; -} - -.system-map { - position: relative; - min-height: 286px; - padding: 1rem; - background: - linear-gradient(90deg, var(--grid-line) 1px, transparent 1px), - linear-gradient(var(--grid-line) 1px, transparent 1px), - var(--map-bg); - background-size: 24px 24px, 24px 24px, auto; -} - -.map-canvas { - position: absolute; - inset: 0; - z-index: 0; - width: 100%; - height: 100%; - pointer-events: none; -} - -.system-map::before, -.system-map::after { - content: none; -} - -.map-node { - position: absolute; - z-index: 1; - min-width: 104px; - padding: 0.58rem 0.68rem; - border: 1px solid var(--line-strong); - border-radius: var(--radius); - background: color-mix(in srgb, var(--paper) 90%, transparent); - font-size: 0.76rem; - font-weight: 800; - box-shadow: 0 10px 24px rgba(23, 23, 23, 0.06); - backdrop-filter: blur(8px); - transition: border-color 180ms ease, box-shadow 180ms ease, filter 180ms ease; -} - -.map-node.is-active-route { - border-color: color-mix(in srgb, var(--blue) 58%, var(--ink)); - box-shadow: - 0 0 0 1px color-mix(in srgb, var(--blue) 24%, transparent), - 0 14px 34px color-mix(in srgb, var(--blue) 18%, transparent); - filter: saturate(1.16); -} - -.map-node-main.is-active-route { - box-shadow: - 0 0 0 1px color-mix(in srgb, var(--amber) 38%, transparent), - 0 18px 42px color-mix(in srgb, var(--amber) 20%, transparent); -} - -.map-node-main { - left: 50%; - top: 50%; - min-width: 168px; - transform: translate(-50%, -50%); - border-radius: var(--radius); - background: var(--ink); - color: var(--paper); -} - -.map-node-main span { - display: block; - margin-top: 0.2rem; - color: rgba(244, 241, 234, 0.72); - font-size: 0.7rem; - font-weight: 600; -} - -.map-node[data-map-node="0"] { - left: 1.25rem; - top: 2rem; - background: color-mix(in srgb, var(--green) 16%, var(--white)); -} - -.map-node[data-map-node="1"] { - right: 1.25rem; - top: 4.8rem; - background: color-mix(in srgb, var(--blue) 15%, var(--white)); -} - -.map-node[data-map-node="2"] { - left: 1.25rem; - bottom: 3rem; - background: color-mix(in srgb, var(--amber) 17%, var(--white)); -} - -.map-node[data-map-node="3"] { - right: 1.25rem; - bottom: 2rem; - background: color-mix(in srgb, var(--rose) 14%, var(--white)); -} - -.proof-section, -.page-grid { - max-width: var(--max); - margin: 0 auto; - padding-inline: clamp(1rem, 4vw, 2.5rem); -} - -.proof-section { - padding-bottom: 3.8rem; -} - -.section-title { - display: flex; - align-items: end; - justify-content: space-between; - gap: 1.4rem; - margin-bottom: 1.25rem; -} - -.section-title h2, -.contact-section h2 { - max-width: 680px; - margin: 0; - font-size: clamp(1.45rem, 2.7vw, 2.4rem); - line-height: 1.12; - letter-spacing: 0; -} - -.proof-grid { - display: grid; - grid-template-columns: repeat(6, minmax(0, 1fr)); - border: 1px solid var(--line-strong); - background: var(--line-strong); - gap: 1px; - border-radius: var(--radius); - overflow: hidden; -} - -.proof-grid article { - min-height: 112px; - padding: 0.95rem; - background: var(--surface-strong); - backdrop-filter: blur(10px); -} - -.proof-grid strong { - display: block; - font-size: clamp(1.55rem, 2.7vw, 2.35rem); - line-height: 1; -} - -.proof-grid span { - display: block; - margin-top: 0.72rem; - color: var(--muted); - font-size: 0.82rem; - font-weight: 650; -} - -.page-grid { - display: grid; - grid-template-columns: 260px minmax(0, 1fr); - gap: clamp(1.6rem, 4.2vw, 4rem); - align-items: start; - padding-bottom: 4rem; -} - -.resume-rail { - position: sticky; - top: 88px; - padding: 1rem; - border: 1px solid rgba(23, 23, 23, 0.82); - border-radius: var(--radius); - background: var(--ink); - color: var(--paper); - box-shadow: var(--shadow); -} - -.resume-rail h2 { - margin: 0; - font-size: 1.5rem; - line-height: 1.15; -} - -.resume-rail p:not(.rail-label) { - margin: 0.52rem 0 1rem; - color: var(--inverse-muted); - font-size: 0.88rem; -} - -.resume-rail dl { - display: grid; - gap: 1px; - margin: 0; - overflow: hidden; - border-radius: var(--radius); - background: rgba(244, 241, 234, 0.16); -} - -.resume-rail dl div { - padding: 0.74rem; - background: rgba(244, 241, 234, 0.08); -} - -.resume-rail dt { - color: rgba(244, 241, 234, 0.52); - font-size: 0.74rem; - text-transform: uppercase; -} - -.resume-rail dd { - margin: 0.25rem 0 0; - font-size: 0.86rem; - font-weight: 700; - overflow-wrap: anywhere; -} - -.email-list { - display: grid; - gap: 0.35rem; -} - -.content-flow { - min-width: 0; -} - -.section { - padding: 3.4rem 0; - border-top: 1px solid var(--line-strong); -} - -.section:first-child { - padding-top: 0; - border-top: 0; -} - -.strength-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 0.75rem; -} - -.strength-grid article { - min-height: 132px; - padding: 1rem; - border: 1px solid var(--line-strong); - border-radius: var(--radius); - background: var(--surface); - backdrop-filter: blur(10px); - transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease; -} - -.strength-grid article:hover { - transform: translateY(-2px); - border-color: color-mix(in srgb, var(--green) 42%, var(--line-strong)); - box-shadow: 0 16px 34px rgba(23, 23, 23, 0.07); -} - -.strength-grid span { - color: var(--amber); - font-weight: 900; - font-size: 0.82rem; -} - -.strength-grid p { - margin: 0.82rem 0 0; - color: var(--muted); - font-size: 0.92rem; -} - -.skill-list { - display: grid; - border-top: 1px solid var(--line-strong); -} - -.skill-list article { - display: grid; - grid-template-columns: 160px minmax(0, 1fr); - gap: 1rem; - padding: 0.9rem 0; - border-bottom: 1px solid var(--line-strong); -} - -.skill-list h3 { - margin: 0; - font-size: 0.94rem; -} - -.skill-list article div, -.tech-line, -.filter-tabs { - display: flex; - flex-wrap: wrap; - gap: 0.45rem; -} - -.skill-list span, -.tech-line span { - display: inline-flex; - align-items: center; - min-height: 26px; - padding: 0 0.6rem; - border: 1px solid var(--line); - border-radius: 999px; - background: var(--surface-strong); - color: var(--muted); - font-size: 0.76rem; - font-weight: 700; - transition: transform 160ms ease, border-color 160ms ease, background 160ms ease, color 160ms ease; -} - -.skill-list span:hover, -.tech-line span:hover { - transform: translateY(-1px); - border-color: color-mix(in srgb, var(--blue) 42%, var(--line)); - color: var(--ink); -} - -.with-action { - align-items: start; -} - -.filter-tabs { - justify-content: flex-end; - max-width: 500px; -} - -.filter-tabs button { - min-height: 30px; - padding: 0 0.64rem; - border: 1px solid var(--line-strong); - border-radius: 999px; - background: var(--surface); - color: var(--muted); - cursor: pointer; - font: inherit; - font-size: 0.76rem; - font-weight: 800; - transition: transform 180ms ease, background 180ms ease, border-color 180ms ease, box-shadow 180ms ease; -} - -.filter-tabs button:hover, -.filter-tabs button.active { - transform: translateY(-1px); - border-color: var(--ink); - background: var(--ink); - color: var(--paper); -} - -.project-stack { - display: grid; - gap: 0.86rem; -} - -.project-row { - display: grid; - grid-template-columns: 66px minmax(0, 1fr); - border: 1px solid var(--line-strong); - border-radius: var(--radius); - background: var(--surface-strong); - overflow: hidden; - box-shadow: 0 16px 36px rgba(23, 23, 23, 0.07); - backdrop-filter: blur(12px); - transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease; -} - -.project-row:hover { - transform: translateY(-2px); - border-color: color-mix(in srgb, var(--blue) 42%, var(--line-strong)); - box-shadow: 0 20px 42px rgba(23, 23, 23, 0.09); -} - -.project-row[hidden] { - display: none; -} - -.project-index { - display: flex; - flex-direction: column; - align-items: center; - gap: 0.58rem; - padding-top: 1rem; - border-right: 1px solid var(--line); - color: var(--soft); - font-size: 0.82rem; - font-weight: 900; -} - -.project-index > span:not(.brand-logo) { - line-height: 1; -} - -.project-main { - padding: 1rem; -} - -.project-head { - display: flex; - justify-content: space-between; - gap: 1rem; -} - -.project-head h3 { - margin: 0; - font-size: clamp(1.08rem, 1.8vw, 1.45rem); - line-height: 1.18; -} - -.project-head p { - margin: 0.22rem 0 0; - color: var(--muted); - font-size: 0.86rem; - font-weight: 700; -} - -.project-head time { - flex: 0 0 auto; - color: var(--rose); - font-size: 0.78rem; - font-weight: 900; -} - -.project-summary { - margin: 0.78rem 0 0; - color: var(--muted); - font-size: 0.9rem; -} - -.project-row ul { - margin: 0.76rem 0; - padding-left: 1.15rem; -} - -.project-row li, -.experience-list li { - margin-bottom: 0.42rem; - color: var(--muted); - font-size: 0.88rem; -} - -.experience-list { - display: grid; - gap: 1px; - border: 1px solid var(--line-strong); - background: var(--line-strong); -} - -.experience-list article { - display: grid; - grid-template-columns: 166px minmax(0, 1fr); - gap: 1rem; - padding: 1rem; - background: var(--surface); - backdrop-filter: blur(10px); -} - -.experience-brand { - display: flex; - flex-direction: column; - gap: 0.7rem; - align-items: flex-start; -} - -.experience-list time { - color: var(--blue); - font-size: 0.82rem; - font-weight: 900; -} - -.experience-list h3, -.domain-strip strong { - margin: 0; - font-size: 1rem; -} - -.experience-list p { - margin: 0.2rem 0 0.68rem; - color: var(--muted); - font-size: 0.88rem; - font-weight: 700; -} - -.experience-list ul { - margin: 0; - padding-left: 1.15rem; -} - -.domain-strip { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 0.75rem; -} - -.domain-strip article { - display: grid; - gap: 0.4rem; - min-height: 120px; - align-content: space-between; - padding: 0.9rem; - border: 1px solid var(--line-strong); - border-radius: var(--radius); - background: - linear-gradient(135deg, rgba(31, 143, 95, 0.14), transparent 48%), - var(--surface-strong); - backdrop-filter: blur(10px); - transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease; -} - -.domain-strip article:hover { - transform: translateY(-2px); - border-color: color-mix(in srgb, var(--amber) 46%, var(--line-strong)); - box-shadow: 0 16px 34px rgba(23, 23, 23, 0.07); -} - -.domain-strip .brand-logo { - width: 38px; - height: 38px; -} - -.domain-strip em { - color: var(--muted); - font-size: 0.84rem; - font-style: normal; -} - -.contact-section { - display: grid; - grid-template-columns: minmax(0, 0.92fr) minmax(280px, 0.68fr); - gap: clamp(1.2rem, 4vw, 2.2rem); - align-items: stretch; - margin-top: 3.2rem; - padding: clamp(1.2rem, 3.6vw, 2rem); - border: 1px solid rgba(23, 23, 23, 0.82); - border-radius: var(--radius); - background: var(--ink); - color: var(--paper); - box-shadow: var(--shadow); -} - -.contact-section > div:first-child { - display: grid; - align-content: start; -} - -.contact-section h2 { - max-width: 440px; - font-size: clamp(1.65rem, 3.2vw, 2.55rem); - line-height: 1.1; -} - -.contact-section span { - display: block; - margin-top: 0.62rem; - color: color-mix(in srgb, currentColor 62%, transparent); - font-size: 0.88rem; -} - -.contact-actions { - display: grid; - gap: 0.6rem; - align-content: center; - min-width: 0; - margin-top: 0; - padding: 0.78rem; - border: 1px solid color-mix(in srgb, currentColor 14%, transparent); - border-radius: var(--radius); - background: color-mix(in srgb, currentColor 5%, transparent); -} - -.contact-section .button { - width: 100%; - min-height: 40px; - justify-content: flex-start; - padding-inline: 0.82rem; - border-color: color-mix(in srgb, currentColor 16%, transparent); - border-radius: var(--radius); - background: color-mix(in srgb, currentColor 4%, transparent); - color: currentColor; - font-size: 0.82rem; -} - -.contact-section .button-primary { - border-color: var(--paper); - background: var(--paper); - color: var(--ink); -} - -.footer { - padding: 1.6rem 1rem; - color: var(--soft); - text-align: center; - font-size: 0.8rem; -} - -.reveal { - opacity: 0; - transform: translateY(18px); - transition: opacity 520ms ease, transform 520ms ease; -} - -.reveal.is-visible { - opacity: 1; - transform: translateY(0); -} - -.is-pressed { - animation: press-feedback 420ms ease; -} - -@keyframes press-feedback { - 0% { - box-shadow: 0 0 0 0 color-mix(in srgb, var(--amber) 36%, transparent); - filter: saturate(1); - } - - 44% { - box-shadow: - 0 0 0 5px color-mix(in srgb, var(--amber) 20%, transparent), - 0 0 22px color-mix(in srgb, var(--blue) 18%, transparent); - filter: saturate(1.18); - } - - 100% { - box-shadow: 0 0 0 0 color-mix(in srgb, var(--amber) 0%, transparent); - filter: saturate(1); - } -} - -@media (max-width: 1080px) { - .topbar { - grid-template-columns: auto 1fr auto; - } - - .nav { - justify-self: center; - } - - .hero { - grid-template-columns: 1fr; - min-height: auto; - gap: 2rem; - } - - .hero-panel { - max-width: 580px; - } - - .proof-grid { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - - .page-grid { - grid-template-columns: 1fr; - } - - .resume-rail { - position: static; - } -} - -@media (max-width: 760px) { - .topbar { - grid-template-columns: 1fr auto; - min-height: 58px; - } - - .brand strong, - .nav { - display: none; - } - - .hero { - padding-top: 2.8rem; - } - - .hero h1 { - font-size: clamp(2.12rem, 10.8vw, 3.15rem); - } - - .lead { - font-size: 0.96rem; - } - - .hero-panel { - box-shadow: var(--shadow); - } - - .signal-grid, - .proof-grid, - .strength-grid, - .domain-strip, - .contact-section { - grid-template-columns: 1fr; - } - - .system-map { - min-height: 270px; - } - - .section-title, - .section-title.with-action, - .project-head, - .contact-section { - align-items: start; - flex-direction: column; - } - - .section-title { - display: block; - } - - .filter-tabs { - justify-content: start; - margin-top: 1rem; - } - - .skill-list article, - .project-row, - .experience-list article { - grid-template-columns: 1fr; - } - - .project-index { - flex-direction: row; - align-items: center; - padding: 0.68rem 0.9rem; - border-right: 0; - border-bottom: 1px solid var(--line); - } - - .experience-brand { - flex-direction: row; - align-items: center; - } - - .contact-actions { - width: 100%; - margin-top: 0; - } -} - -@media (max-width: 460px) { - .button, - .topbar-cta { - width: 100%; - } - - .topbar-cta { - width: auto; - } - - .hero-actions, - .contact-actions { - flex-direction: column; - } - - .map-node { - min-width: 88px; - font-size: 0.68rem; - } - - .map-node-main { - min-width: 146px; - } -} - -@media (prefers-reduced-motion: reduce) { - html { - scroll-behavior: auto; - } - - .ambient-canvas, - .map-canvas { - display: none; - } - - .reveal, - .button, - .nav a, - .topbar-cta, - .github-link, - .control-button, - .filter-tabs button, - .project-row, - .strength-grid article, - .domain-strip article, - .skill-list span, - .tech-line span, - .map-node { - transition: none; - } - - .is-pressed { - animation: none; - } - - .reveal { - opacity: 1; - transform: none; - } -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index bcbf8b5..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "astro/tsconfigs/strict" -} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..c760d36 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,13 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + build: { + rollupOptions: { + output: { + manualChunks: { + three: ["three"], + }, + }, + }, + }, +});