From 36cfcb116ec9a5c6ce7c6ae6862372a168372d83 Mon Sep 17 00:00:00 2001 From: admin <572701190@qq.com> Date: Sun, 19 Apr 2026 01:28:21 +0800 Subject: [PATCH] v1.3.0 release - Docker-deployable production build --- .env.example | 9 + .gitignore | 8 + Dockerfile | 14 + README.md | 118 + docker-compose.yaml | 11 + index.html | 13 + nginx.conf | 18 + package-lock.json | 4362 ++++++++++++++++++++++++++++++++++ package.json | 35 + public/favicon.ico | Bin 0 -> 101215 bytes public/logo_square.png | Bin 0 -> 101215 bytes src/App.tsx | 27 + src/components/Sidebar.tsx | 81 + src/index.css | 216 ++ src/main.tsx | 10 + src/pages/Dashboard.tsx | 285 +++ src/pages/Login.tsx | 230 ++ src/pages/ReportEditor.tsx | 2224 +++++++++++++++++ src/pages/ReportManage.tsx | 476 ++++ src/pages/ReportView.tsx | 117 + src/pages/SystemSettings.tsx | 422 ++++ src/pages/TemplateManage.tsx | 1680 +++++++++++++ src/pages/UserManage.tsx | 741 ++++++ src/types.ts | 145 ++ src/utils/defaultContent.ts | 158 ++ src/utils/print.ts | 65 + src/utils/storage.ts | 43 + tsconfig.json | 26 + vite.config.ts | 24 + 29 files changed, 11558 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 docker-compose.yaml create mode 100644 index.html create mode 100644 nginx.conf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/logo_square.png create mode 100644 src/App.tsx create mode 100644 src/components/Sidebar.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/pages/Dashboard.tsx create mode 100644 src/pages/Login.tsx create mode 100644 src/pages/ReportEditor.tsx create mode 100644 src/pages/ReportManage.tsx create mode 100644 src/pages/ReportView.tsx create mode 100644 src/pages/SystemSettings.tsx create mode 100644 src/pages/TemplateManage.tsx create mode 100644 src/pages/UserManage.tsx create mode 100644 src/types.ts create mode 100644 src/utils/defaultContent.ts create mode 100644 src/utils/print.ts create mode 100644 src/utils/storage.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..7a550fe --- /dev/null +++ b/.env.example @@ -0,0 +1,9 @@ +# GEMINI_API_KEY: Required for Gemini AI API calls. +# AI Studio automatically injects this at runtime from user secrets. +# Users configure this via the Secrets panel in the AI Studio UI. +GEMINI_API_KEY="MY_GEMINI_API_KEY" + +# APP_URL: The URL where this applet is hosted. +# AI Studio automatically injects this at runtime with the Cloud Run service URL. +# Used for self-referential links, OAuth callbacks, and API endpoints. +APP_URL="MY_APP_URL" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5a86d2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +node_modules/ +build/ +dist/ +coverage/ +.DS_Store +*.log +.env* +!.env.example diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a99ff75 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +# Build stage +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +# Production stage +FROM nginx:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..3b2bec6 --- /dev/null +++ b/README.md @@ -0,0 +1,118 @@ +# 手术图文病历报告系统 + +基于 **React 19 + TypeScript + Vite + Tailwind CSS** 开发的医疗图文报告管理前端应用。 + +> 适用于医院场景,支持手术记录图文报告的撰写、视频关键帧抽取、模板管理以及基于角色的用户权限控制。 + +--- + +## 功能特性 + +- **图文报告生成**:富文本编辑器撰写手术记录,支持本地上传图片或从手术视频中截取关键帧插入报告。 +- **报告管理**:搜索、筛选、查看、编辑、打印和删除报告。 +- **模板管理**:创建和维护报告标准模板,新建报告时可自动加载默认模板。 +- **用户管理**:超级管理员可创建/编辑/删除用户,分配角色和可视模板权限。 +- **系统设置**:配置视频抽帧百分比位置、AI API 接口地址、默认模板等全局参数。 +- **数据持久化**:所有数据存储在浏览器 `localStorage` 中,无需后端服务即可独立运行。 + +--- + +## 技术栈 + +- React 19 +- React Router DOM 7 +- TypeScript 5.8 +- Vite 6 +- Tailwind CSS 4 +- Lucide React(图标) + +--- + +## 快速开始 + +### 本地开发 + +```bash +# 安装依赖 +npm install + +# 启动开发服务器(端口 3000) +npm run dev +``` + +### 环境变量 + +复制 `.env.example` 为 `.env.local` 并填入实际值: + +```bash +cp .env.example .env.local +``` + +- `GEMINI_API_KEY`:Google Gemini API 密钥(预留 AI 功能) +- `APP_URL`:应用部署后的访问地址 + +--- + +## Docker 部署 + +项目已内置 `Dockerfile`、`nginx.conf` 和 `docker-compose.yaml`,可直接构建并运行: + +```bash +# 构建镜像并启动容器 +docker-compose up -d --build + +# 访问应用 +# http://localhost:8080 +``` + +### 停止服务 + +```bash +docker-compose down +``` + +### 构建说明 + +- **构建阶段**:使用 `node:20-alpine` 执行 `npm ci` 和 `npm run build` +- **运行阶段**:使用 `nginx:alpine` 托管 `dist/` 静态文件 +- **SPA 支持**:`nginx.conf` 已配置 `try_files` 路由回退,刷新页面不 404 + +--- + +## 默认测试账号 + +| 账号 | 密码 | 角色 | +|----------|--------|------------| +| admin | 123456 | 超级管理员 | +| manager | 123456 | 管理员 | +| doctor | 123456 | 医生 | + +--- + +## 项目结构 + +``` +. +├── docker-compose.yaml # Docker Compose 配置 +├── Dockerfile # 多阶段构建镜像 +├── nginx.conf # Nginx SPA 路由配置 +├── package.json # 项目依赖与脚本 +├── public/ # 静态资源(logo、favicon) +├── src/ +│ ├── components/ # 公共组件 +│ ├── pages/ # 页面组件 +│ ├── utils/ # 工具函数(storage、print、defaultContent) +│ ├── App.tsx # 根组件与路由 +│ ├── main.tsx # 应用入口 +│ ├── index.css # 全局样式与 Tailwind 主题 +│ └── types.ts # TypeScript 类型定义 +└── index.html # Vite 入口 HTML +``` + +--- + +## 安全提示 + +- 本应用为纯前端应用,所有认证和授权逻辑在客户端执行。 +- 用户密码以明文形式保存在浏览器 `localStorage` 中(无后端哈希处理)。 +- 若用于生产环境,请确保部署在内网或受信任环境中。 diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..0c4494a --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,11 @@ +version: "3.8" + +services: + tuwen_system: + build: + context: . + dockerfile: Dockerfile + container_name: tuwen_system + restart: unless-stopped + ports: + - "4002:80" diff --git a/index.html b/index.html new file mode 100644 index 0000000..21dfe69 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + My Google AI Studio App + + +
+ + + + diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..f0cab6d --- /dev/null +++ b/nginx.conf @@ -0,0 +1,18 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + + location / { + try_files $uri $uri/ /index.html; + } + + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..01693cc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4362 @@ +{ + "name": "react-example", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-example", + "version": "0.0.0", + "dependencies": { + "@google/genai": "^1.29.0", + "@tailwindcss/vite": "^4.1.14", + "@vitejs/plugin-react": "^5.0.4", + "dotenv": "^17.2.3", + "express": "^4.21.2", + "lucide-react": "^0.546.0", + "motion": "^12.23.24", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.14.1", + "vite": "^6.2.0" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "@types/node": "^22.14.0", + "autoprefixer": "^10.4.21", + "tailwindcss": "^4.1.14", + "tsx": "^4.21.0", + "typescript": "~5.8.2", + "vite": "^6.2.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.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/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.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/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/genai": { + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.50.1.tgz", + "integrity": "sha512-YbkX7H9+1Pt8wOt7DDREy8XSoiL6fRDzZQRyaVBarFf8MR3zHGqVdvM4cLbDXqPhxqvegZShgfxb8kw9C7YhAQ==", + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "^10.3.0", + "p-retry": "^4.6.2", + "protobufjs": "^7.5.4", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.25.2" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.19.tgz", + "integrity": "sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001788", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001788.tgz", + "integrity": "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "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/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.336", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.336.tgz", + "integrity": "sha512-AbH9q9J455r/nLmdNZes0G0ZKcRX73FicwowalLs6ijwOmCJSRRrLX63lcAlzy9ux3dWK1w1+1nsBJEWN11hcQ==", + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "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" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/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/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz", + "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.38.0", + "motion-utils": "^12.36.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", + "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/google-auth-library": { + "version": "10.6.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", + "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.1.4", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.546.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.546.0.tgz", + "integrity": "sha512-Z94u6fKT43lKeYHiVyvyR8fT7pwCzDu7RyMPpTvh054+xahSgj4HFQ+NmflvzdXsoAjYGdCguGaFKYuvq0ThCQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "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/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/motion": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.38.0.tgz", + "integrity": "sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.38.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", + "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.36.0" + } + }, + "node_modules/motion-utils": { + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz", + "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/protobufjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz", + "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.1.tgz", + "integrity": "sha512-5BCvFskyAAVumqhEKh/iPhLOIkfxcEUz8WqFIARCkMg8hZZzDYX9CtwxXA0e+qT8zAxmMC0x3Ckb9iMONwc5jg==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.1.tgz", + "integrity": "sha512-ZkrQuwwhGibjQLqH1eCdyiZyLWglPxzxdl5tgwgKEyCSGC76vmAjleGocRe3J/MLfzMUIKwaFJWpFVJhK3d2xA==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/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/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==", + "devOptional": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/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" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "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 + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9e3207d --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "react-example", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --port=3000 --host=0.0.0.0", + "build": "vite build", + "preview": "vite preview", + "clean": "rm -rf dist", + "lint": "tsc --noEmit" + }, + "dependencies": { + "@google/genai": "^1.29.0", + "@tailwindcss/vite": "^4.1.14", + "@vitejs/plugin-react": "^5.0.4", + "dotenv": "^17.2.3", + "express": "^4.21.2", + "lucide-react": "^0.546.0", + "motion": "^12.23.24", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.14.1", + "vite": "^6.2.0" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "@types/node": "^22.14.0", + "autoprefixer": "^10.4.21", + "tailwindcss": "^4.1.14", + "tsx": "^4.21.0", + "typescript": "~5.8.2", + "vite": "^6.2.0" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6b9ee7e222feb7bc438d9a3752b172ed0e569505 GIT binary patch literal 101215 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%0Dm@X7@4rYwPunif5<;7-I7~T8)spTkQM}y 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 z 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

?IybFnJto4d3_5u@RN3tJv9Jy_92}ei9*Aw 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 FV1nvpN0$Hq literal 0 HcmV?d00001 diff --git a/public/logo_square.png b/public/logo_square.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9ee7e222feb7bc438d9a3752b172ed0e569505 GIT binary patch literal 101215 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%0Dm@X7@4rYwPunif5<;7-I7~T8)spTkQM}y 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 z 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

?IybFnJto4d3_5u@RN3tJv9Jy_92}ei9*Aw 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 FV1nvpN0$Hq literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..c249958 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,27 @@ +import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; +import Login from './pages/Login'; +import Dashboard from './pages/Dashboard'; +import ReportEditor from './pages/ReportEditor'; +import ReportManage from './pages/ReportManage'; +import ReportView from './pages/ReportView'; +import TemplateManage from './pages/TemplateManage'; +import UserManage from './pages/UserManage'; +import SystemSettings from './pages/SystemSettings'; + +export default function App() { + return ( + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + ); +} diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx new file mode 100644 index 0000000..f1d27bd --- /dev/null +++ b/src/components/Sidebar.tsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { Link, useLocation, useNavigate } from 'react-router-dom'; +import { + LayoutDashboard, + FileEdit, + FileText, + Layout, + Users, + Settings, + LogOut +} from 'lucide-react'; +import { User } from '../types'; +import { storage } from '../utils/storage'; + +export default function Sidebar() { + const location = useLocation(); + const navigate = useNavigate(); + const currentUser = storage.get('currentUser', {} as User); + + const logout = () => { + storage.remove('currentUser'); + navigate('/'); + }; + + const navItems = [ + { path: '/dashboard', icon: , title: '工作台', roles: ['super', 'admin', 'user'] }, + { path: '/report-editor', icon: , title: '图文报告生成', roles: ['super', 'admin', 'user'] }, + { path: '/report-manage', icon: , title: '报告管理', roles: ['super', 'admin', 'user'] }, + { path: '/template-manage', icon: , title: '模板管理', roles: ['super', 'admin'] }, + { path: '/user-manage', icon: , title: '用户管理', roles: ['super', 'admin'] }, + { path: '/system-settings', icon: , title: '系统设置', roles: ['super', 'admin', 'user'] }, + ]; + + const filteredNavItems = navItems.filter(item => item.roles.includes(currentUser.role)); + const isCollapsed = location.pathname === '/report-editor' || location.pathname === '/template-manage'; + + return ( +

+ ); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..38ad15a --- /dev/null +++ b/src/index.css @@ -0,0 +1,216 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap'); +@import "tailwindcss"; + +@theme { + --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif; + --color-bg: #F8FAFC; + --color-sidebar-bg: #FFFFFF; + --color-accent: #2563EB; + --color-text-main: #1E293B; + --color-text-muted: #64748B; + --color-border: #E2E8F0; + --color-card-bg: #FFFFFF; +} + +@layer base { + body { + @apply bg-bg text-text-main antialiased; + font-family: var(--font-sans); + } +} + +@layer components { + .btn-accent { + @apply bg-accent text-white px-5 py-2.5 rounded-lg font-semibold text-sm transition-all hover:opacity-90 active:scale-95; + } + + .card-minimal { + @apply bg-card-bg border border-border rounded-xl shadow-[0_1px_3px_rgba(0,0,0,0.05)] p-6; + } + + .input-minimal { + @apply w-full px-4 py-2.5 border border-border rounded-lg text-sm transition-colors focus:outline-hidden focus:border-accent; + } + + /* Editor Styles */ + .editor-content-wrapper { + @apply flex-1 overflow-auto flex justify-center min-w-fit bg-[#e2e8f0] p-6; + } + .editor-content { + @apply w-[210mm] min-h-[297mm] h-auto bg-white p-[40px_48px] shadow-[0_2px_8px_rgba(0,0,0,0.15)] outline-hidden leading-relaxed text-text-main text-sm flex-shrink-0 overflow-visible relative; + } + .editor-content:focus { outline: none; } + .editor-content p { margin: 0; padding: 4px 0; } + .editor-content h1 { font-size: 22px; margin: 16px 0 12px; font-weight: 600; text-align: center; } + .editor-content strong, .editor-content b { font-weight: 600; } + .editor-content u { text-decoration: underline; } + .editor-content table { + width: 100%; + border-collapse: collapse; + margin: 16px 0; + table-layout: fixed; + } + .editor-content td { + padding: 8px; + border: 1px solid #e2e8f0; + vertical-align: top; + } + .editor-content img { + max-width: 100%; + height: auto; + display: block; + margin: 8px auto; + } + + .image-placeholder { + @apply border-2 border-dashed border-[#cbd5e1] rounded-lg p-4 mb-2 bg-[#f8fafc] cursor-pointer min-h-[70px] flex flex-col items-center justify-center transition-all relative; + } + .image-placeholder:hover { + @apply border-accent bg-[#f0f7ff]; + } + .image-placeholder.has-image { + @apply border-none bg-transparent p-0 min-h-0 cursor-default; + } + .image-placeholder .delete-btn { + @apply absolute -top-2 -right-2 w-5 h-5 bg-red-500 text-white rounded-full items-center justify-center text-[10px] cursor-pointer z-10; + display: none; + pointer-events: auto; + } + .image-placeholder:hover .delete-btn { + display: flex; + } + .image-placeholder .placeholder-text { + color: #94a3b8; + font-size: 11px; + margin: 0; + pointer-events: none; + } + .image-placeholder.has-image .placeholder-text { + display: none !important; + } + .template-info-section { + @apply relative mb-4; + } + + .manual-frame-badge { + @apply absolute top-1 left-1 px-1.5 py-0.5 bg-yellow-400 text-yellow-900 text-[9px] font-bold rounded shadow-sm pointer-events-none; + } + + /* Smart Field Bindable Controls */ + .smart-field-wrapper { + display: inline-flex; + align-items: center; + margin: 0 2px; + vertical-align: text-bottom; + white-space: nowrap; + } + .smart-field-wrapper .field-label { + color: #64748b; + user-select: none; + } + .smart-field-wrapper .field-value { + min-width: 32px; + padding: 0 4px; + margin: 0 2px; + border: 1px solid #cbd5e1; + border-radius: 2px; + display: inline-block; + background: #f8fafc; + color: #0f172a; + line-height: 1.2; + font-size: inherit; + vertical-align: text-bottom; + box-sizing: border-box; + min-height: 1.2em; + outline: none; + } + .smart-field-wrapper .field-value:empty::before { + content: '\200b'; + } + .smart-field-wrapper .field-value:focus { + background-color: #e2e8f0; + border-color: #94a3b8; + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.25); + } + .smart-field-wrapper .delete-btn { + position: absolute; + top: -8px; + right: -8px; + width: 16px; + height: 16px; + background: #ef4444; + color: white; + border-radius: 50%; + font-size: 10px; + line-height: 16px; + text-align: center; + cursor: pointer; + user-select: none; + display: none; + z-index: 10; + } + .smart-field-wrapper .delete-btn:hover { + background: #dc2626; + } + .template-editor-mode .smart-field-wrapper:hover .delete-btn, + .template-editor-mode .smart-field-wrapper:focus-within .delete-btn { + display: block; + } + .report-signature-img { + max-width: 120px; + max-height: 40px; + width: auto; + height: auto; + object-fit: contain; + vertical-align: middle; + display: inline-block; + } +} + +@media print { + @page { size: A4; margin: 0; } + body * { visibility: hidden !important; } + .print-content, .print-content * { visibility: visible !important; } + .print-wrapper { + position: static !important; + display: flex !important; + justify-content: center !important; + overflow: visible !important; + background: white !important; + padding: 0 !important; + margin: 0 !important; + } + .print-content { + position: static !important; + width: 210mm !important; + min-height: auto !important; + height: auto !important; + box-shadow: none !important; + padding: 10mm !important; + margin: 0 !important; + overflow: visible !important; + background: white !important; + } + .print-content .image-placeholder:not(.has-image) { + display: none !important; + } + .print-content .smart-field-wrapper .field-value { + border: none !important; + border-bottom: 1px solid #000 !important; + border-radius: 0 !important; + background: transparent !important; + padding: 0 2px !important; + } + .print-content .smart-field-wrapper .delete-btn { + display: none !important; + } + .report-signature-img { + max-width: 120px !important; + max-height: 40px !important; + width: auto !important; + height: auto !important; + object-fit: contain !important; + vertical-align: middle !important; + display: inline-block !important; + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..080dac3 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import {StrictMode} from 'react'; +import {createRoot} from 'react-dom/client'; +import App from './App.tsx'; +import './index.css'; + +createRoot(document.getElementById('root')!).render( + + + , +); diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx new file mode 100644 index 0000000..709c8ea --- /dev/null +++ b/src/pages/Dashboard.tsx @@ -0,0 +1,285 @@ +import React, { useEffect, useState } from 'react'; +import { Link, useNavigate } from 'react-router-dom'; +import Sidebar from '../components/Sidebar'; +import { FileText, Layout, Plus, Settings, TrendingUp, ArrowRight } from 'lucide-react'; +import { User, Report, Template } from '../types'; +import { storage } from '../utils/storage'; + +export default function Dashboard() { + const navigate = useNavigate(); + const [stats, setStats] = useState({ + totalCount: 0, + monthCount: 0, + templateCount: 0, + userCount: 0, + todayCount: 0, + trend: [0,0,0,0,0,0,0], + trendLabels: ['','','','','','',''], + trendFullDates: ['','','','','','',''], + maxTrend: 1 + }); + const [tooltip, setTooltip] = useState<{ visible: boolean; x: number; y: number; date: string; count: number }>({ visible: false, x: 0, y: 0, date: '', count: 0 }); + const [currentUser, setCurrentUser] = useState(null); + const [timeRange, setTimeRange] = useState<'7days' | '1month'>('7days'); + + useEffect(() => { + const user = storage.get('currentUser', null); + if (!user) { + navigate('/'); + return; + } + setCurrentUser(user); + + // Load stats + const reports = storage.get('reports', []); + const templates = storage.get('templates', []); + const users = storage.get('users', []); + + const userReports = user.role === 'user' + ? reports.filter(r => r.author === user.username) + : reports; + + const now = new Date(); + const today = now.toISOString().split('T')[0]; + const todayReports = userReports.filter(r => r.createdAt === today); + + // 本月报告数 + const currentMonth = today.slice(0, 7); + const thisMonthReports = userReports.filter(r => r.createdAt && r.createdAt.startsWith(currentMonth)); + + // 动态趋势数据 + const daysCount = timeRange === '7days' ? 7 : 30; + const trend: number[] = []; + const labels: string[] = []; + const fullDates: string[] = []; + for (let i = daysCount - 1; i >= 0; i--) { + const d = new Date(now); + d.setDate(d.getDate() - i); + const dateStr = d.toISOString().split('T')[0]; + const label = timeRange === '7days' ? `${d.getMonth() + 1}/${d.getDate()}` : `${d.getDate()}`; + labels.push(label); + fullDates.push(dateStr); + trend.push(userReports.filter(r => r.createdAt === dateStr).length); + } + const maxTrend = Math.max(...trend, 1); + + setStats({ + totalCount: userReports.length, + monthCount: thisMonthReports.length, + templateCount: templates.length, + userCount: users.length, + todayCount: todayReports.length, + trend, + trendLabels: labels, + trendFullDates: fullDates, + maxTrend + }); + }, [navigate, timeRange]); + + if (!currentUser) return null; + + return ( +
+ + +
+
+
+

工作台概览

+

实时报告动态与系统状态追踪。

+
+ + + 新建报告 + +
+ +
+
+
全部报告总数
+
{stats.totalCount}
+
+ +
+
本月报告总数
+
{stats.monthCount}
+
+ +
+
今日新增报告
+
{stats.todayCount}
+
+ +
+
系统总用户
+
{stats.userCount}
+
+
+ +
+
+
+ + + 报告增长趋势 + +
+ + +
+
+
+ {/* SVG Area Chart */} + { + const svg = e.currentTarget; + const rect = svg.getBoundingClientRect(); + const mouseX = ((e.clientX - rect.left) / rect.width) * 300; + const paddingX = 10; + const chartW = 300 - paddingX * 2; + const n = stats.trend.length; + if (n <= 1) return; + let idx = Math.round(((mouseX - paddingX) / chartW) * (n - 1)); + idx = Math.max(0, Math.min(n - 1, idx)); + const ptX = paddingX + (idx / (n - 1)) * chartW; + const ptY = 8 + (120 - 16) - (stats.maxTrend > 0 ? (stats.trend[idx] / stats.maxTrend) * (120 - 16) : 0); + setTooltip({ + visible: true, + x: (ptX / 300) * rect.width, + y: (ptY / 135) * rect.height, + date: stats.trendFullDates[idx] || '', + count: stats.trend[idx] + }); + }} + onMouseLeave={() => setTooltip(prev => ({ ...prev, visible: false }))} + > + + + + + + + {/* Grid lines */} + {[0, 1, 2, 3].map((i) => ( + + ))} + {/* Area path */} + {stats.trend.length > 0 && (() => { + const paddingX = 10; + const paddingY = 8; + const chartW = 300 - paddingX * 2; + const chartH = 120 - paddingY * 2; + const points = stats.trend.map((count, i) => { + const x = paddingX + (i / (stats.trend.length - 1)) * chartW; + const y = paddingY + chartH - (stats.maxTrend > 0 ? (count / stats.maxTrend) * chartH : 0); + return { x, y, count, label: stats.trendLabels[i] }; + }); + const linePath = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' '); + const areaPath = `${linePath} L ${points[points.length - 1].x} ${120 - paddingY} L ${points[0].x} ${120 - paddingY} Z`; + return ( + + + + {/* Transparent capture layer for reliable mouse events */} + + {points.map((p, i) => ( + + {/* 7天模式显示圆点和数值;30天模式隐藏 */} + {stats.trend.length <= 10 && ( + <> + + {p.count} + + )} + {/* 标签稀疏化:7天每天显示,30天每隔5天显示 */} + {(stats.trend.length <= 10 || i % 5 === 0) && ( + 10 ? '7' : '8'} fill="#94A3B8" fontWeight="bold">{p.label} + )} + + ))} + + ); + })()} + + {/* Tooltip */} + {tooltip.visible && ( +
+
{tooltip.date}
+
报告数: {tooltip.count}
+
+ )} +
+
+ +
+
快捷入口
+
+ +
+
+ +
+
+
报告管理
+
查看与搜索所有报告
+
+
+ + + + {(currentUser.role === 'super' || currentUser.role === 'admin') && ( + +
+
+ +
+
+
模板管理
+
配置报告标准模板
+
+
+ + + )} + + {currentUser.role === 'super' && ( + +
+
+ +
+
+
系统设置
+
配置抽帧与API参数
+
+
+ + + )} +
+
+
+
+
+ ); +} diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx new file mode 100644 index 0000000..a1eef08 --- /dev/null +++ b/src/pages/Login.tsx @@ -0,0 +1,230 @@ +import React, { useState, useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { User, Template, SystemSettings, FormField, DEFAULT_FORM_FIELDS } from '../types'; +import { defaultReportContent } from '../utils/defaultContent'; +import { storage } from '../utils/storage'; +import { User as UserIcon, Lock } from 'lucide-react'; + +export default function Login() { + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + const navigate = useNavigate(); + + useEffect(() => { + const initData = () => { + const existingUsers = storage.get('users', []); + const hasAdmin = existingUsers.some((u) => u.username === 'admin' && u.password === '123456'); + + let savedTemplates = storage.get('templates', []); + if (savedTemplates.length === 0) { + const initialTemplate: Template = { + id: 'surgery', + name: '腹腔镜胆囊切除术报告', + desc: '标准手术记录模板', + content: defaultReportContent, + createdAt: new Date().toISOString(), + author: 'admin' + }; + savedTemplates = [initialTemplate]; + storage.set('templates', savedTemplates); + } + + if (!hasAdmin) { + const allTplIds = savedTemplates.map(t => t.id); + const defaultUsers: User[] = [ + { username: 'admin', password: '123456', role: 'super', name: '超级管理员', status: 'active', createdAt: '2024-01-01', department: 'admin', visibleTemplates: allTplIds, manageableTemplates: allTplIds }, + { username: 'manager', password: '123456', role: 'admin', name: '管理员', status: 'active', createdAt: '2024-01-01', department: '外科', visibleTemplates: allTplIds, manageableTemplates: allTplIds }, + { username: '0001', password: '123456', role: 'user', name: '张医生', status: 'active', createdAt: '2024-01-01', department: '外科', visibleTemplates: allTplIds, manageableTemplates: [] } + ]; + storage.set('users', defaultUsers); + console.log('Default users initialized'); + } + + const fieldsConfig = storage.get('formFieldsConfig', []); + if (fieldsConfig.length === 0) { + storage.set('formFieldsConfig', DEFAULT_FORM_FIELDS); + } + + const savedAssets = storage.get<{id: string; name: string; dataUrl: string}[]>('imageAssets', []); + if (savedAssets.length === 0) { + fetch('/logo_square.png') + .then(res => res.blob()) + .then(blob => { + const reader = new FileReader(); + reader.onloadend = () => { + const dataUrl = reader.result as string; + storage.set('imageAssets', [{ id: 'asset_logo', name: '医院Logo', dataUrl }]); + }; + reader.readAsDataURL(blob); + }) + .catch(() => {}); + } + + const settingsRaw = storage.get('systemSettings', {} as SystemSettings); + if (!settingsRaw.frameCount) { + const round1 = (n: number) => Math.round(n * 10) / 10; + const positions: number[] = []; + for (let i = 1; i <= 12; i++) { + positions.push(round1((100 / 13) * i)); + } + const defaultSettings = { + frameCount: 12, + framePositions: positions, + apiEndpoint: '', + apiKey: '', + defaultTemplate: savedTemplates[0]?.id || '', + frameMode: 'uniform', + autoInsertFrames: true, + autoInsertDelay: 1, + autoInsertFrameIndices: [0, 2, 4, 6, 8, 10] + }; + storage.set('systemSettings', defaultSettings); + } + }; + + initData(); + }, []); + + const handleLogin = (e: React.FormEvent) => { + e.preventDefault(); + const u = username.trim(); + const p = password.trim(); + + const users = storage.get('users', []); + let user = users.find(user => user.username === u && user.password === p); + + // Fallback for default accounts if localStorage is messed up + if (!user) { + const defaults = [ + { u: 'admin', p: '123456', r: 'super', n: '超级管理员' }, + { u: 'manager', p: '123456', r: 'admin', n: '管理员' }, + { u: '0001', p: '123456', r: 'user', n: '张医生' } + ]; + const d = defaults.find(item => item.u === u && item.p === p); + if (d) { + const allTemplates = storage.get('templates', []); + const allTplIds = allTemplates.map(t => t.id); + user = { username: d.u, password: d.p, role: d.r as any, name: d.n, status: 'active', createdAt: '2024-01-01', visibleTemplates: allTplIds, manageableTemplates: d.r === 'user' ? [] : allTplIds, department: d.r === 'super' ? 'admin' : '外科' }; + // Sync back to localStorage + const updatedUsers = [...users.filter(item => item.username !== u), user]; + storage.set('users', updatedUsers); + } + } + + if (user) { + if (user.status === 'inactive') { + setError('该账号已被禁用'); + return; + } + storage.set('currentUser', user); + navigate('/dashboard'); + } else { + setError('用户ID或密码错误'); + console.log('Login failed for:', u); + } + }; + + const fillLogin = (u: string, p: string) => { + setUsername(u); + setPassword(p); + setTimeout(() => { + // Trigger the robust login logic manually + const users = storage.get('users', []); + let user = users.find(user => user.username === u && user.password === p); + + if (!user) { + const defaults = [ + { u: 'admin', p: '123456', r: 'super', n: '超级管理员' }, + { u: 'manager', p: '123456', r: 'admin', n: '管理员' }, + { u: '0001', p: '123456', r: 'user', n: '张医生' } + ]; + const d = defaults.find(item => item.u === u && item.p === p); + if (d) { + user = { username: d.u, password: d.p, role: d.r as any, name: d.n, status: 'active', createdAt: '2024-01-01' }; + const updatedUsers = [...users.filter(item => item.username !== u), user]; + storage.set('users', updatedUsers); + } + } + + if (user) { + storage.set('currentUser', user); + navigate('/dashboard'); + } + }, 100); + }; + + return ( +
+
+
+
+ Logo +

手术图文病历报告生成终端

+

智能图文报告管理系统

+
+
+ +
+
+ +
+ + setUsername(e.target.value)} + placeholder="请输入您的用户ID" + required + className="input-minimal pl-11" + /> +
+
+
+ +
+ + setPassword(e.target.value)} + placeholder="请输入您的登录密码" + required + className="input-minimal pl-11" + /> +
+
+ + {error &&
{error}
} +
+ +
+

快捷登录测试账号

+
+ {[ + { u: 'admin', p: '123456', r: '超级管理员', c: 'bg-amber-100 text-amber-700' }, + { u: 'manager', p: '123456', r: '管理员', c: 'bg-blue-100 text-blue-700' }, + { u: '0001', p: '123456', r: '医生', c: 'bg-green-100 text-green-700' } + ].map(test => ( +
fillLogin(test.u, test.p)} + className="flex justify-between items-center p-3 bg-slate-50 rounded-xl cursor-pointer transition-all hover:bg-white hover:shadow-md border border-transparent hover:border-border group" + > + {test.u} / {test.p} + + {test.r} + +
+ ))} +
+
+
+
+ ); +} diff --git a/src/pages/ReportEditor.tsx b/src/pages/ReportEditor.tsx new file mode 100644 index 0000000..f9f57f0 --- /dev/null +++ b/src/pages/ReportEditor.tsx @@ -0,0 +1,2224 @@ +import React, { useEffect, useState, useRef } from 'react'; +import { flushSync } from 'react-dom'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import Sidebar from '../components/Sidebar'; +import { + Check, Printer, Undo, Redo, Bold, Italic, Underline, + AlignLeft, AlignCenter, AlignRight, Table, Image as ImageIcon, + Video, Play, Pause, Plus, X, ChevronLeft, Download +} from 'lucide-react'; +import { User, Report, Template, CapturedFrame, SystemSettings, FormField, DEFAULT_FORM_FIELDS } from '../types'; +import { defaultReportContent } from '../utils/defaultContent'; +import { printDocument } from '../utils/print'; +import { storage } from '../utils/storage'; + +export default function ReportEditor() { + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const reportId = searchParams.get('id'); + const restoreFlag = searchParams.get('restore'); + + const [currentUser, setCurrentUser] = useState(null); + const [reportData, setReportData] = useState>({ + title: '腹腔镜胆囊切除术报告', + patientName: '', + hospitalId: '', + patientGender: '', + patientAge: '', + department: '', + bedNumber: '', + surgeryDate: '', + startHour: '', + startMinute: '', + endHour: '', + endMinute: '', + surgeon: [], + assistant: [], + anesthesiologist: [], + anesthesiaType: '', + reportNote: '', + status: 'draft' + }); + + const [templates, setTemplates] = useState([]); + const [videos, setVideos] = useState<{id: string, name: string, url: string, duration: number}[]>([]); + const [currentVideoIndex, setCurrentVideoIndex] = useState(-1); + const [capturedFrames, setCapturedFrames] = useState([]); + const [isPlaying, setIsPlaying] = useState(false); + const [currentTime, setCurrentTime] = useState(0); + const [duration, setDuration] = useState(0); + const [isSaved, setIsSaved] = useState(false); + const [exportModalOpen, setExportModalOpen] = useState(false); + const [loadedTemplateId, setLoadedTemplateId] = useState(''); + const [pendingTemplateId, setPendingTemplateId] = useState(null); + const prevVideoCountRef = useRef(0); + + const [activeTab, setActiveTab] = useState<'info' | 'video'>('info'); + const [activeFieldKey, setActiveFieldKey] = useState(null); + + useEffect(() => { + if (!editorRef.current) return; + const allFields = editorRef.current.querySelectorAll('.field-value'); + allFields.forEach(el => { + (el as HTMLElement).style.backgroundColor = ''; + (el as HTMLElement).style.outline = ''; + (el as HTMLElement).style.outlineOffset = ''; + }); + if (activeFieldKey) { + const targetEl = editorRef.current.querySelector(`.field-value[data-bind="${activeFieldKey}"]`) as HTMLElement; + if (targetEl) { + targetEl.style.backgroundColor = '#f1f5f9'; + targetEl.style.outline = '1px solid #94a3b8'; + targetEl.style.outlineOffset = '1px'; + targetEl.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + } + }, [activeFieldKey]); + + const [multiSelectOptions, setMultiSelectOptions] = useState>({ + surgeon: ['张医生', '李医生', '王医生'], + assistant: ['赵医生', '钱医生', '孙医生'], + anesthesiologist: ['周医生', '吴医生', '郑医生'] + }); + const [anesthesiaOptions, setAnesthesiaOptions] = useState(['全麻', '局麻', '腰麻', '硬膜外麻醉', '静脉麻醉', '吸入麻醉']); + const [openDropdown, setOpenDropdown] = useState(null); + const [multiInputText, setMultiInputText] = useState>({}); + const [touched, setTouched] = useState>({}); + const [formFields, setFormFields] = useState([]); + const [imagePickerOpen, setImagePickerOpen] = useState(false); + const [imagePickerTarget, setImagePickerTarget] = useState(null); + const [imageAssets, setImageAssets] = useState<{id: string; name: string; dataUrl: string}[]>([]); + const [placeholderModal, setPlaceholderModal] = useState({ + isOpen: false, width: '200', height: '200', mode: 'frame' as 'frame' | 'manual' + }); + const [tableModal, setTableModal] = useState({ + isOpen: false, rows: '2', cols: '3' + }); + + const editorRef = useRef(null); + const videoRef = useRef(null); + const canvasRef = useRef(null); + const videoInputRef = useRef(null); + const contentLoadedRef = useRef(false); + const contentRef = useRef(''); + const stateRef = useRef({ reportData, videos, capturedFrames, activeTab, loadedTemplateId }); + + const draftKey = currentUser ? `reportEditorDraft_${currentUser.username}` : ''; + + const updatePageHeight = () => { + if (!editorRef.current) return; + const contentHeight = editorRef.current.scrollHeight; + const pageHeightMm = 297; + const mmToPx = 3.7795275591; + const pages = Math.max(2, Math.ceil(contentHeight / (pageHeightMm * mmToPx))); + editorRef.current.style.minHeight = `${pages * pageHeightMm}mm`; + }; + + const saveDraftToStorage = React.useCallback(() => { + const user = storage.get('currentUser', null); + const key = user ? `reportEditorDraft_${user.username}` : ''; + if (key) { + const currentContent = contentRef.current || editorRef.current?.innerHTML || ''; + storage.set(key, { + content: currentContent, + draftReportId: reportId || null, + reportData: stateRef.current.reportData, + videos: stateRef.current.videos, + capturedFrames: stateRef.current.capturedFrames, + activeTab: stateRef.current.activeTab, + loadedTemplateId: stateRef.current.loadedTemplateId + }); + } + }, [reportId]); + + useEffect(() => { + const user = storage.get('currentUser', null); + if (!user) { navigate('/'); return; } + setCurrentUser(user); + + const savedMulti = storage.get | null>('multiSelectOptions', null); + if (savedMulti) setMultiSelectOptions(savedMulti); + const savedAnesthesia = storage.get('anesthesiaOptions', null); + if (savedAnesthesia) setAnesthesiaOptions(savedAnesthesia); + + const savedFields = storage.get('formFieldsConfig', []); + if (savedFields.length > 0) { + setFormFields(savedFields); + } else { + setFormFields(DEFAULT_FORM_FIELDS); + storage.set('formFieldsConfig', DEFAULT_FORM_FIELDS); + } + + const savedAssets = storage.get<{id: string; name: string; dataUrl: string}[]>('imageAssets', []); + setImageAssets(savedAssets); + + const allTemplates = storage.get('templates', []); + const visibleTplIds = Array.isArray(user.visibleTemplates) ? user.visibleTemplates : allTemplates.map(t => t.id); + const filteredTemplates = allTemplates.filter(t => visibleTplIds.includes(t.id)); + setTemplates(filteredTemplates); + + if (reportId) { + const draft = storage.get | null>(draftKey, null); + if (draft && draft.draftReportId === reportId) { + if (draft.reportData) setReportData(draft.reportData); + if (draft.videos) { + setVideos(draft.videos); + if (draft.videos.length > 0) setCurrentVideoIndex(0); + prevVideoCountRef.current = draft.videos.length; + } + if (draft.capturedFrames) { + setCapturedFrames(draft.capturedFrames.sort((a: CapturedFrame, b: CapturedFrame) => a.time - b.time)); + } + if (draft.activeTab) setActiveTab(draft.activeTab); + stateRef.current = { + ...stateRef.current, + reportData: draft.reportData, + videos: draft.videos, + capturedFrames: draft.capturedFrames, + loadedTemplateId: draft.loadedTemplateId || '' + }; + if (editorRef.current && typeof draft.content === 'string' && draft.content.trim().length > 0) { + editorRef.current.innerHTML = draft.content; + contentRef.current = draft.content; + contentLoadedRef.current = true; + setLoadedTemplateId(draft.loadedTemplateId || ''); + setTimeout(() => updatePageHeight(), 0); + } + } else { + const reports = storage.get('reports', []); + const found = reports.find(r => r.id === reportId); + if (found) { + setReportData(found); + stateRef.current = { + ...stateRef.current, + reportData: found, + videos: found.videos || [], + capturedFrames: found.capturedFrames || [] + }; + if (editorRef.current) { + const restoreContent = storage.getSession(`restore_${reportId}`, null); + if (restoreFlag && restoreContent) { + editorRef.current.innerHTML = restoreContent; + storage.removeSession(`restore_${reportId}`); + } else { + editorRef.current.innerHTML = found.content; + contentRef.current = found.content; + } + contentLoadedRef.current = true; + setTimeout(() => updatePageHeight(), 0); + } + if (found.capturedFrames) { + setCapturedFrames(found.capturedFrames.sort((a, b) => a.time - b.time)); + } + if (found.videos) { + setVideos(found.videos); + if (found.videos.length > 0) setCurrentVideoIndex(0); + prevVideoCountRef.current = found.videos.length; + } + } + } + } else { + const draft = storage.get | null>(draftKey, null); + if (draft && !draft.draftReportId) { + if (draft.reportData) setReportData(draft.reportData); + if (draft.videos) { + setVideos(draft.videos); + if (draft.videos.length > 0) setCurrentVideoIndex(0); + prevVideoCountRef.current = draft.videos.length; + } + if (draft.capturedFrames) { + setCapturedFrames(draft.capturedFrames.sort((a: CapturedFrame, b: CapturedFrame) => a.time - b.time)); + } + if (draft.activeTab) setActiveTab(draft.activeTab); + stateRef.current = { + ...stateRef.current, + reportData: draft.reportData, + videos: draft.videos, + capturedFrames: draft.capturedFrames, + loadedTemplateId: draft.loadedTemplateId || '' + }; + if (editorRef.current && typeof draft.content === 'string' && draft.content.trim().length > 0) { + editorRef.current.innerHTML = draft.content; + contentRef.current = draft.content; + contentLoadedRef.current = true; + setLoadedTemplateId(draft.loadedTemplateId || ''); + setTimeout(() => updatePageHeight(), 0); + } + } + if (!contentLoadedRef.current && editorRef.current) { + const settings = storage.get('systemSettings', {} as SystemSettings); + if (settings.defaultTemplate && filteredTemplates.length > 0) { + const tpl = filteredTemplates.find(t => t.id === settings.defaultTemplate); + if (tpl) { + setLoadedTemplateId(tpl.id); + stateRef.current = { ...stateRef.current, loadedTemplateId: tpl.id }; + editorRef.current.innerHTML = tpl.content; + contentRef.current = tpl.content; + } else { + editorRef.current.innerHTML = defaultReportContent; + contentRef.current = defaultReportContent; + } + } else { + editorRef.current.innerHTML = defaultReportContent; + contentRef.current = defaultReportContent; + } + contentLoadedRef.current = true; + setTimeout(() => updatePageHeight(), 0); + } + } + }, [reportId, navigate, draftKey, restoreFlag]); + + useEffect(() => { + const handleBeforeUnload = () => saveDraftToStorage(); + const handleVisibilityChange = () => { + if (document.visibilityState === 'hidden') saveDraftToStorage(); + }; + window.addEventListener('beforeunload', handleBeforeUnload); + document.addEventListener('visibilitychange', handleVisibilityChange); + return () => { + window.removeEventListener('beforeunload', handleBeforeUnload); + document.removeEventListener('visibilitychange', handleVisibilityChange); + saveDraftToStorage(); + }; + }, [saveDraftToStorage]); + + // Auto-fill current time for fields with timeDefault === 'current' + useEffect(() => { + if (formFields.length === 0) return; + let hasChange = false; + const updates: any = {}; + formFields.forEach(field => { + if (field.timeDefault === 'current') { + if (field.type === 'date') { + const current = new Date().toISOString().split('T')[0]; + if (!(reportData as any)[field.key]) { + updates[field.key] = current; + hasChange = true; + } + } else if (field.type === 'time') { + const now = new Date(); + const hh = String(now.getHours()).padStart(2, '0'); + const mm = String(now.getMinutes()).padStart(2, '0'); + if (field.key === 'startTime') { + if (!reportData.startHour) { + updates.startHour = hh; + updates.startMinute = mm; + hasChange = true; + } + } else if (field.key === 'endTime') { + if (!reportData.endHour) { + updates.endHour = hh; + updates.endMinute = mm; + hasChange = true; + } + } else { + if (!(reportData as any)[field.key]) { + updates[field.key] = `${hh}:${mm}`; + hasChange = true; + } + } + } + } else if (field.timeDefault === 'specific' && field.fixedTimeValue) { + if (field.type === 'date') { + if (!(reportData as any)[field.key]) { + updates[field.key] = field.fixedTimeValue; + hasChange = true; + } + } else if (field.type === 'time') { + if (field.key === 'startTime') { + if (!reportData.startHour) { + const [hh, mm] = field.fixedTimeValue.split(':'); + updates.startHour = hh || ''; + updates.startMinute = mm || ''; + hasChange = true; + } + } else if (field.key === 'endTime') { + if (!reportData.endHour) { + const [hh, mm] = field.fixedTimeValue.split(':'); + updates.endHour = hh || ''; + updates.endMinute = mm || ''; + hasChange = true; + } + } else { + if (!(reportData as any)[field.key]) { + updates[field.key] = field.fixedTimeValue; + hasChange = true; + } + } + } + } + }); + if (hasChange) { + setReportData(prev => { + const next = { ...prev, ...updates }; + stateRef.current = { ...stateRef.current, reportData: next }; + return next; + }); + } + }, [formFields]); + + useEffect(() => { + if (!editorRef.current) return; + const observer = new MutationObserver(() => { + updatePageHeight(); + }); + observer.observe(editorRef.current, { childList: true, subtree: true, attributes: true, characterData: true }); + return () => observer.disconnect(); + }, [currentUser]); + + const triggerPlaceholderUpload = (placeholder: HTMLElement) => { + const input = document.createElement('input'); + input.type = 'file'; + input.accept = 'image/*'; + input.onchange = (ev) => { + const file = (ev.target as HTMLInputElement).files?.[0]; + if (file) { + const reader = new FileReader(); + reader.onload = (event) => { + const src = event.target?.result as string; + const mw = placeholder.style.maxWidth || placeholder.style.width || '200px'; + const mh = placeholder.style.maxHeight || placeholder.style.height || '200px'; + placeholder.innerHTML = ` + × + + `; + placeholder.classList.add('has-image'); + placeholder.style.border = 'none'; + placeholder.style.background = 'transparent'; + placeholder.style.width = 'auto'; + placeholder.style.height = 'auto'; + placeholder.style.lineHeight = 'normal'; + placeholder.style.maxWidth = mw; + placeholder.style.maxHeight = mh; + placeholder.style.textAlign = 'left'; + placeholder.style.verticalAlign = 'top'; + placeholder.style.justifyContent = 'flex-start'; + placeholder.style.alignItems = 'flex-start'; + if (editorRef.current) contentRef.current = editorRef.current.innerHTML; + saveDraftToStorage(); + }; + reader.readAsDataURL(file); + } + }; + input.click(); + }; + + // Handle image placeholder interactions via click capture for reliable contenteditable behavior + useEffect(() => { + const handleEditorClick = (e: MouseEvent) => { + // e.target may be a text node; safely resolve to an Element + let node: Node | null = e.target as Node; + if (node.nodeType === Node.TEXT_NODE) node = node.parentElement; + const targetEl = node as HTMLElement | null; + if (!targetEl) return; + + // Handle click on field-value: switch to info tab, highlight and focus corresponding input + const fieldValue = targetEl.closest('.field-value') as HTMLElement | null; + if (fieldValue) { + const bindKey = fieldValue.getAttribute('data-bind'); + if (bindKey) { + setActiveTab('info'); + stateRef.current = { ...stateRef.current, activeTab: 'info' }; + setActiveFieldKey(bindKey); + setTimeout(() => { + const inputEl = document.getElementById(`input-${bindKey}`); + if (inputEl) { + inputEl.scrollIntoView({ behavior: 'smooth', block: 'center' }); + const focusable = inputEl.querySelector('input, select') as HTMLElement | null; + if (focusable) { + focusable.focus(); + } + } + }, 100); + } + return; + } + + // 点击空白处清除高亮 + setActiveFieldKey(null); + + const placeholder = targetEl.closest('.image-placeholder') as HTMLElement | null; + if (!placeholder) return; + + if (targetEl.closest('.delete-btn')) { + e.stopPropagation(); + e.preventDefault(); + if (placeholder.classList.contains('has-image')) { + placeholder.classList.remove('has-image'); + const w = parseInt(placeholder.style.maxWidth || placeholder.style.width || '0'); + const text = w > 0 && w < 80 ? '插图' : '插入/点击放置图片'; + placeholder.innerHTML = ` + × + ${text} + `; + placeholder.style.border = '1px dashed #cbd5e1'; + placeholder.style.background = '#f8fafc'; + const mw = placeholder.style.maxWidth; + const mh = placeholder.style.maxHeight; + if (mw) placeholder.style.width = mw; + if (mh) { + placeholder.style.height = mh; + placeholder.style.lineHeight = mh; + } + placeholder.style.textAlign = 'center'; + placeholder.style.verticalAlign = 'middle'; + placeholder.style.justifyContent = 'center'; + placeholder.style.alignItems = 'center'; + if (editorRef.current) contentRef.current = editorRef.current.innerHTML; + saveDraftToStorage(); + } else { + const range = document.createRange(); + range.selectNode(placeholder); + const sel = window.getSelection(); + sel?.removeAllRanges(); + sel?.addRange(range); + document.execCommand('delete'); + if (editorRef.current) contentRef.current = editorRef.current.innerHTML; + saveDraftToStorage(); + } + return; + } + + if (!placeholder.classList.contains('has-image')) { + e.preventDefault(); + e.stopPropagation(); + setImagePickerTarget(placeholder); + setImagePickerOpen(true); + } + }; + + const editor = editorRef.current; + if (editor) { + editor.addEventListener('click', handleEditorClick, true); + } + return () => { + if (editor) { + editor.removeEventListener('click', handleEditorClick, true); + } + }; + }, [saveDraftToStorage, currentUser]); + + // Prevent backspace from deleting image-placeholder elements + useEffect(() => { + const editor = editorRef.current; + if (!editor) return; + + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key !== 'Backspace' && e.key !== 'Delete') return; + const sel = window.getSelection(); + if (!sel || sel.rangeCount === 0) return; + const range = sel.getRangeAt(0); + + // If selection is inside a placeholder, or if the range intersects a placeholder + let node: Node | null = range.commonAncestorContainer; + if (node.nodeType === Node.TEXT_NODE) node = node.parentElement; + const placeholder = (node as HTMLElement)?.closest('.image-placeholder'); + if (placeholder) { + e.preventDefault(); + return; + } + + // If collapsed and next/previous sibling is a placeholder + if (range.collapsed) { + const container = range.startContainer; + const offset = range.startOffset; + if (container.nodeType === Node.ELEMENT_NODE) { + const next = (container as Element).children[offset]; + const prev = (container as Element).children[offset - 1]; + if ((e.key === 'Delete' && next?.classList?.contains('image-placeholder')) || + (e.key === 'Backspace' && prev?.classList?.contains('image-placeholder'))) { + e.preventDefault(); + } + } + } + }; + + editor.addEventListener('keydown', handleKeyDown); + return () => editor.removeEventListener('keydown', handleKeyDown); + }, []); + + const fillPlaceholderSrc = (placeholder: HTMLElement, src: string) => { + const mw = placeholder.style.maxWidth || placeholder.style.width || '200px'; + const mh = placeholder.style.maxHeight || placeholder.style.height || '200px'; + placeholder.innerHTML = ` + × + + `; + placeholder.classList.add('has-image'); + placeholder.style.border = 'none'; + placeholder.style.background = 'transparent'; + placeholder.style.width = 'auto'; + placeholder.style.height = 'auto'; + placeholder.style.lineHeight = 'normal'; + placeholder.style.maxWidth = mw; + placeholder.style.maxHeight = mh; + placeholder.style.textAlign = 'left'; + placeholder.style.verticalAlign = 'top'; + placeholder.style.justifyContent = 'flex-start'; + placeholder.style.alignItems = 'flex-start'; + if (editorRef.current) contentRef.current = editorRef.current.innerHTML; + saveDraftToStorage(); + }; + + const execCmd = (command: string, value: string | undefined = undefined) => { + editorRef.current?.focus(); + document.execCommand(command, false, value); + editorRef.current?.focus(); + if (editorRef.current) contentRef.current = editorRef.current.innerHTML; + saveDraftToStorage(); + }; + + const changeLineHeight = (height: string) => { + const sel = window.getSelection(); + if (!sel || !sel.rangeCount) return; + let node = sel.getRangeAt(0).commonAncestorContainer; + if (node.nodeType === Node.TEXT_NODE) node = node.parentNode as Node; + const block = (node as HTMLElement).closest('p, div, td, h1, h2, h3, li'); + if (block) { + (block as HTMLElement).style.lineHeight = height; + if (editorRef.current) contentRef.current = editorRef.current.innerHTML; + saveDraftToStorage(); + } + }; + + const changeAlignment = (align: 'left' | 'center' | 'right' | 'justify') => { + const sel = window.getSelection(); + if (!sel || !sel.rangeCount) return; + let node = sel.getRangeAt(0).commonAncestorContainer; + if (node.nodeType === Node.TEXT_NODE) node = node.parentNode as Node; + const block = (node as HTMLElement).closest('p, div, td, h1, h2, h3, li'); + if (block) { + (block as HTMLElement).style.textAlign = align; + if (editorRef.current) contentRef.current = editorRef.current.innerHTML; + saveDraftToStorage(); + } + }; + + const insertTable = () => { + editorRef.current?.focus(); + setTableModal({ isOpen: true, rows: '2', cols: '3' }); + }; + + const insertImage = () => { + editorRef.current?.focus(); + setPlaceholderModal({ isOpen: true, width: '200', height: '200', mode: 'frame' }); + }; + + const handleVideoUpload = (e: React.ChangeEvent) => { + const files = Array.from(e.target.files || []) as File[]; + const newVideos = files.map(file => ({ + id: Math.random().toString(36).substr(2, 9), + name: file.name, + url: URL.createObjectURL(file), + duration: 0 + })); + const combined = [...videos, ...newVideos]; + setVideos(combined); + stateRef.current = { ...stateRef.current, videos: combined }; + setCurrentVideoIndex(videos.length); // select first newly uploaded video + if (videoInputRef.current) videoInputRef.current.value = ''; + saveDraftToStorage(); + }; + + const removeVideo = (id: string) => { + const idx = videos.findIndex(v => v.id === id); + const updated = videos.filter(v => v.id !== id); + setVideos(updated); + stateRef.current = { ...stateRef.current, videos: updated }; + if (currentVideoIndex >= updated.length) { + setCurrentVideoIndex(updated.length > 0 ? 0 : -1); + } else if (currentVideoIndex === idx && updated.length > 0) { + setCurrentVideoIndex(0); + } + const nextFrames = capturedFrames.filter(f => f.videoIndex !== idx).map(f => { + if (f.videoIndex > idx) return { ...f, videoIndex: f.videoIndex - 1 }; + return f; + }).sort((a, b) => a.time - b.time); + setCapturedFrames(nextFrames); + stateRef.current = { ...stateRef.current, capturedFrames: nextFrames }; + saveDraftToStorage(); + }; + + const selectVideo = (index: number) => { + setCurrentVideoIndex(index); + setIsPlaying(false); + }; + + const togglePlay = () => { + if (!videoRef.current) return; + if (isPlaying) videoRef.current.pause(); + else videoRef.current.play(); + setIsPlaying(!isPlaying); + }; + + const captureFrame = () => { + if (!videoRef.current || !canvasRef.current || currentVideoIndex === -1) return; + const video = videoRef.current; + const canvas = canvasRef.current; + const MAX_WIDTH = 800; + const scale = Math.min(1, MAX_WIDTH / video.videoWidth); + canvas.width = video.videoWidth * scale; + canvas.height = video.videoHeight * scale; + const ctx = canvas.getContext('2d'); + ctx?.drawImage(video, 0, 0, canvas.width, canvas.height); + + const newFrame: CapturedFrame = { + id: Date.now(), + videoIndex: currentVideoIndex, + videoName: videos[currentVideoIndex].name, + time: video.currentTime, + timeFormatted: formatTime(video.currentTime), + dataUrl: canvas.toDataURL('image/jpeg', 0.6), + isManual: true + }; + const nextFrames = [...capturedFrames, newFrame].sort((a, b) => a.time - b.time); + setCapturedFrames(nextFrames); + stateRef.current = { ...stateRef.current, capturedFrames: nextFrames }; + saveDraftToStorage(); + }; + + const autoCaptureFrames = async () => { + if (!videoRef.current || currentVideoIndex === -1) return; + const video = videoRef.current; + const settings = storage.get('systemSettings', {} as SystemSettings); + const positions = settings.framePositions || [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60]; + const dur = video.duration || 1; + + const canvas = canvasRef.current; + if (!canvas) return; + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + const wasPlaying = !video.paused; + if (wasPlaying) video.pause(); + + let accumulatedFrames = [...capturedFrames]; + for (let i = 0; i < positions.length; i++) { + const pos = positions[i]; + const time = (pos / 100) * dur; + video.currentTime = time; + await new Promise(resolve => { + const onSeeked = () => { + video.removeEventListener('seeked', onSeeked); + resolve(); + }; + video.addEventListener('seeked', onSeeked); + }); + const MAX_WIDTH = 800; + const scale = Math.min(1, MAX_WIDTH / video.videoWidth); + canvas.width = video.videoWidth * scale; + canvas.height = video.videoHeight * scale; + ctx.drawImage(video, 0, 0, canvas.width, canvas.height); + const newFrame: CapturedFrame = { + id: Date.now() + Math.random(), + videoIndex: currentVideoIndex, + videoName: videos[currentVideoIndex].name, + time, + timeFormatted: formatTime(time), + dataUrl: canvas.toDataURL('image/jpeg', 0.6), + isManual: false + }; + accumulatedFrames = [...accumulatedFrames, newFrame].sort((a, b) => a.time - b.time); + flushSync(() => { + setCapturedFrames(accumulatedFrames); + }); + stateRef.current = { ...stateRef.current, capturedFrames: accumulatedFrames }; + if (settings.autoInsertFrames && settings.autoInsertFrameIndices?.includes(i)) { + const baseDelay = (settings.autoInsertDelay || 0) * 1000; + const insertOrderIndex = settings.autoInsertFrameIndices.indexOf(i); + const actualDelay = baseDelay > 0 ? baseDelay * (insertOrderIndex + 1) : 0; + + setTimeout(() => { + if (!editorRef.current) return; + const emptyPlaceholder = editorRef.current.querySelector('.image-placeholder:not(.has-image):not([data-mode="manual"])') as HTMLElement | null; + if (emptyPlaceholder) { + emptyPlaceholder.innerHTML = ` + × + + `; + emptyPlaceholder.classList.add('has-image'); + emptyPlaceholder.style.border = 'none'; + emptyPlaceholder.style.background = 'transparent'; + emptyPlaceholder.style.width = 'auto'; + emptyPlaceholder.style.height = 'auto'; + emptyPlaceholder.style.lineHeight = 'normal'; + emptyPlaceholder.style.maxWidth = emptyPlaceholder.style.maxWidth || emptyPlaceholder.style.width || '200px'; + emptyPlaceholder.style.maxHeight = emptyPlaceholder.style.maxHeight || emptyPlaceholder.style.height || '200px'; + emptyPlaceholder.style.textAlign = 'left'; + emptyPlaceholder.style.verticalAlign = 'top'; + emptyPlaceholder.style.justifyContent = 'flex-start'; + emptyPlaceholder.style.alignItems = 'flex-start'; + contentRef.current = editorRef.current.innerHTML; + saveDraftToStorage(); + } + }, actualDelay); + } + } + if (settings.autoInsertFrames && editorRef.current) { + contentRef.current = editorRef.current.innerHTML; + } + if (wasPlaying) video.play(); + saveDraftToStorage(); + }; + + const formatTime = (seconds: number) => { + const mins = Math.floor(seconds / 60); + const secs = Math.floor(seconds % 60); + return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; + }; + + const handleDragStart = (e: React.DragEvent, frame: CapturedFrame) => { + e.dataTransfer.setData('frameId', frame.id.toString()); + }; + + const fillPlaceholder = (placeholder: HTMLElement, frame: CapturedFrame) => { + const mw = placeholder.style.maxWidth || placeholder.style.width || '200px'; + const mh = placeholder.style.maxHeight || placeholder.style.height || '200px'; + placeholder.innerHTML = ` + × + + `; + placeholder.classList.add('has-image'); + placeholder.style.border = 'none'; + placeholder.style.background = 'transparent'; + placeholder.style.width = 'auto'; + placeholder.style.height = 'auto'; + placeholder.style.lineHeight = 'normal'; + placeholder.style.maxWidth = mw; + placeholder.style.maxHeight = mh; + placeholder.style.textAlign = 'left'; + placeholder.style.verticalAlign = 'top'; + placeholder.style.justifyContent = 'flex-start'; + placeholder.style.alignItems = 'flex-start'; + if (editorRef.current) contentRef.current = editorRef.current.innerHTML; + saveDraftToStorage(); + }; + + const handleDrop = (e: React.DragEvent, placeholder: HTMLElement) => { + e.preventDefault(); + if (placeholder.getAttribute('data-mode') === 'manual') { + alert('此处为静态图片占位符,仅支持点击插入(如Logo/签名),不支持拖入关键帧'); + return; + } + const frameId = e.dataTransfer.getData('frameId'); + const frame = capturedFrames.find(f => f.id.toString() === frameId); + if (frame) { + fillPlaceholder(placeholder, frame); + } + }; + + const insertFrameToPlaceholder = (frame: CapturedFrame) => { + if (!editorRef.current) { + alert('编辑器未准备好'); + return; + } + const emptyPlaceholder = editorRef.current.querySelector('.image-placeholder:not(.has-image):not([data-mode="manual"])') as HTMLElement | null; + if (!emptyPlaceholder) { + alert('没有可插入图片的空位'); + return; + } + fillPlaceholder(emptyPlaceholder, frame); + }; + + const seekToFrame = (frame: CapturedFrame) => { + if (!videoRef.current) return; + if (frame.videoIndex !== currentVideoIndex) { + setCurrentVideoIndex(frame.videoIndex); + } + setTimeout(() => { + if (videoRef.current) { + videoRef.current.currentTime = frame.time; + } + }, 50); + }; + + const handleFrameKeyNav = (direction: 'left' | 'right') => { + if (!videoRef.current) return; + const delta = direction === 'left' ? -5 : 5; + videoRef.current.currentTime = Math.max(0, Math.min(duration, videoRef.current.currentTime + delta)); + }; + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { + // Only if video tab is active or video element is focused + if (activeTab === 'video' || document.activeElement === videoRef.current) { + handleFrameKeyNav(e.key === 'ArrowLeft' ? 'left' : 'right'); + } + } + }; + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [activeTab, duration]); + + // Auto-capture frames when new videos are uploaded + useEffect(() => { + if (videos.length > prevVideoCountRef.current && currentVideoIndex !== -1) { + const timer = setTimeout(() => { + if (videoRef.current && videoRef.current.duration) { + autoCaptureFrames(); + } else if (videoRef.current) { + const onMeta = () => { + autoCaptureFrames(); + videoRef.current?.removeEventListener('loadedmetadata', onMeta); + }; + videoRef.current.addEventListener('loadedmetadata', onMeta); + } + }, 300); + return () => clearTimeout(timer); + } + prevVideoCountRef.current = videos.length; + }, [videos.length, currentVideoIndex]); + + // Apply selected template content + useEffect(() => { + if (pendingTemplateId && editorRef.current) { + const tpl = templates.find(t => t.id === pendingTemplateId); + if (tpl) { + editorRef.current.innerHTML = tpl.content; + contentRef.current = tpl.content; + const nextReportData: any = { + title: tpl.name || '腹腔镜胆囊切除术报告', + patientName: '', + hospitalId: '', + patientGender: '', + patientAge: '', + department: '', + bedNumber: '', + surgeryDate: '', + startHour: '', + startMinute: '', + endHour: '', + endMinute: '', + surgeon: [], + assistant: [], + anesthesiologist: [], + anesthesiaType: '', + status: 'draft' + }; + formFields.forEach(field => { + if (field.category === '时间') { + if (field.timeDefault === 'specific' && field.fixedTimeValue) { + if (field.type === 'date') { + nextReportData[field.key] = field.fixedTimeValue; + } else if (field.type === 'time') { + const [hh, mm] = field.fixedTimeValue.split(':'); + if (field.key === 'startTime') { + nextReportData.startHour = hh || ''; + nextReportData.startMinute = mm || ''; + } else if (field.key === 'endTime') { + nextReportData.endHour = hh || ''; + nextReportData.endMinute = mm || ''; + } else { + nextReportData[field.key] = field.fixedTimeValue; + } + } + } else if (field.timeDefault === 'current') { + if (field.type === 'date') { + nextReportData[field.key] = new Date().toISOString().split('T')[0]; + } else if (field.type === 'time') { + const now = new Date(); + const hh = String(now.getHours()).padStart(2, '0'); + const mm = String(now.getMinutes()).padStart(2, '0'); + if (field.key === 'startTime') { + nextReportData.startHour = hh; + nextReportData.startMinute = mm; + } else if (field.key === 'endTime') { + nextReportData.endHour = hh; + nextReportData.endMinute = mm; + } else { + nextReportData[field.key] = `${hh}:${mm}`; + } + } + } + } + }); + if (!nextReportData.surgeryDate) { + nextReportData.surgeryDate = new Date().toISOString().split('T')[0]; + } + setLoadedTemplateId(tpl.id); + setReportData(nextReportData); + setVideos([]); + setCapturedFrames([]); + setCurrentVideoIndex(-1); + prevVideoCountRef.current = 0; + stateRef.current = { + ...stateRef.current, + loadedTemplateId: tpl.id, + reportData: nextReportData, + videos: [], + capturedFrames: [], + activeTab: stateRef.current.activeTab + }; + updatePageHeight(); + saveDraftToStorage(); + } + setPendingTemplateId(null); + } + }, [pendingTemplateId, templates]); + + // Safety net: ensure editor gets initialized if ref was not ready during init effect + React.useLayoutEffect(() => { + if (contentLoadedRef.current || !editorRef.current) return; + + const user = storage.get('currentUser', null); + const key = user ? `reportEditorDraft_${user.username}` : ''; + const draft = key ? storage.get | null>(key, null) : null; + + if (reportId) { + if (draft && draft.draftReportId === reportId && typeof draft.content === 'string' && draft.content.trim().length > 0) { + editorRef.current.innerHTML = draft.content; + contentRef.current = draft.content; + contentLoadedRef.current = true; + setLoadedTemplateId(draft.loadedTemplateId || ''); + stateRef.current = { + ...stateRef.current, + reportData: draft.reportData, + videos: draft.videos, + capturedFrames: draft.capturedFrames, + loadedTemplateId: draft.loadedTemplateId || '' + }; + setTimeout(() => updatePageHeight(), 0); + return; + } + const reports = storage.get('reports', []); + const found = reports.find(r => r.id === reportId); + if (found) { + const restoreContent = storage.getSession(`restore_${reportId}`, null); + if (restoreFlag && restoreContent) { + editorRef.current.innerHTML = restoreContent; + storage.removeSession(`restore_${reportId}`); + } else { + editorRef.current.innerHTML = found.content; + } + contentLoadedRef.current = true; + stateRef.current = { + ...stateRef.current, + reportData: found, + videos: found.videos || [], + capturedFrames: found.capturedFrames || [] + }; + setTimeout(() => updatePageHeight(), 0); + return; + } + } else { + if (draft && !draft.draftReportId && typeof draft.content === 'string' && draft.content.trim().length > 0) { + editorRef.current.innerHTML = draft.content; + contentRef.current = draft.content; + contentLoadedRef.current = true; + setLoadedTemplateId(draft.loadedTemplateId || ''); + stateRef.current = { + ...stateRef.current, + reportData: draft.reportData, + videos: draft.videos, + capturedFrames: draft.capturedFrames, + loadedTemplateId: draft.loadedTemplateId || '' + }; + setTimeout(() => updatePageHeight(), 0); + return; + } + } + + const settings = storage.get('systemSettings', {} as SystemSettings); + const allTemplates = storage.get('templates', []); + const userData = storage.get('currentUser', null); + const visibleTplIds = Array.isArray(userData?.visibleTemplates) ? userData.visibleTemplates : allTemplates.map(t => t.id); + const filteredTemplates = allTemplates.filter(t => visibleTplIds.includes(t.id)); + if (settings.defaultTemplate && filteredTemplates.length > 0) { + const tpl = filteredTemplates.find(t => t.id === settings.defaultTemplate); + if (tpl) { + setLoadedTemplateId(tpl.id); + stateRef.current = { ...stateRef.current, loadedTemplateId: tpl.id }; + editorRef.current.innerHTML = tpl.content; + } else { + editorRef.current.innerHTML = defaultReportContent; + } + } else { + editorRef.current.innerHTML = defaultReportContent; + } + contentLoadedRef.current = true; + setTimeout(() => updatePageHeight(), 0); + }, []); + + const hourOptions = Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, '0')); + const hour12Options = Array.from({ length: 12 }, (_, i) => ((i + 1).toString().padStart(2, '0'))); + const minuteOptions = Array.from({ length: 60 }, (_, i) => i.toString().padStart(2, '0')); + + const formatDateDisplay = (isoDate: string, fmt?: string): string => { + if (!isoDate || !fmt) return isoDate || ''; + const [y, m, d] = isoDate.split('-'); + return fmt + .replace(/YYYY/g, y || '') + .replace(/MM/g, m || '') + .replace(/DD/g, d || ''); + }; + + const formatTimeDisplay = (timeStr: string, fmt?: string): string => { + if (!timeStr || !fmt) return timeStr || ''; + if (fmt === '24h') fmt = 'HH:mm'; + const [h24str, mstr] = timeStr.split(':'); + const h24 = parseInt(h24str) || 0; + const isPM = h24 >= 12; + let h12 = h24 % 12; + if (h12 === 0) h12 = 12; + return fmt + .replace(/HH/g, String(h24).padStart(2, '0')) + .replace(/mm/g, mstr || '00') + .replace(/hh/g, String(h12).padStart(2, '0')) + .replace(/A/g, isPM ? '下午' : '上午'); + }; + + const parseDateFromFormat = (text: string, fmt?: string): string => { + if (!text || !fmt) return text; + const nums = text.match(/\d+/g); + if (!nums) return text; + let y = '', m = '', d = ''; + if (nums.length >= 3) { y = nums[0].padStart(4, '0'); m = nums[1].padStart(2, '0'); d = nums[2].padStart(2, '0'); } + else if (nums.length === 2) { m = nums[0].padStart(2, '0'); d = nums[1].padStart(2, '0'); y = new Date().getFullYear().toString(); } + return `${y}-${m}-${d}`; + }; + + const parseTimeFromFormat = (text: string, fmt?: string): string => { + if (!text || !fmt) return text; + const nums = text.match(/\d+/g); + const ampm = text.match(/上午|下午/); + if (!nums || nums.length < 2) return text; + let h = parseInt(nums[0]); + if (ampm) { + const isPM = ampm[0] === '下午'; + if (isPM && h !== 12) h += 12; + if (!isPM && h === 12) h = 0; + } + return `${String(h).padStart(2, '0')}:${nums[1].padStart(2, '0')}`; + }; + + const to24h = (h12: number, isPM: boolean): number => { + if (isPM && h12 !== 12) return h12 + 12; + if (!isPM && h12 === 12) return 0; + return h12; + }; + + const from24h = (h24: number): { h: number; isPM: boolean } => { + const isPM = h24 >= 12; + let h = h24 % 12; + if (h === 0) h = 12; + return { h, isPM }; + }; + + const addTag = (field: string, value: string) => { + const current = (reportData as any)[field] || []; + if (!current.includes(value)) { + const next = { ...reportData, [field]: [...current, value] }; + setReportData(next); + stateRef.current = { ...stateRef.current, reportData: next }; + saveDraftToStorage(); + } + // Persist custom value to global options for future reuse + const opts = multiSelectOptions[field] || []; + if (!opts.includes(value)) { + const next = { ...multiSelectOptions, [field]: [...opts, value] }; + setMultiSelectOptions(next); + storage.set('multiSelectOptions', next); + } + // Sync to formFieldsConfig + const fieldDef = formFields.find(f => f.key === field); + if (fieldDef && fieldDef.options && !fieldDef.options.includes(value)) { + const updatedFields = formFields.map(f => f.key === field ? { ...f, options: [...(f.options || []), value] } : f); + setFormFields(updatedFields); + storage.set('formFieldsConfig', updatedFields); + } + }; + + const removeTag = (field: string, value: string) => { + const current = (reportData as any)[field] || []; + const next = { ...reportData, [field]: current.filter((v: string) => v !== value) }; + setReportData(next); + stateRef.current = { ...stateRef.current, reportData: next }; + saveDraftToStorage(); + }; + + const removeMultiOption = (field: string, value: string) => { + const current = multiSelectOptions[field] || []; + const next = { ...multiSelectOptions, [field]: current.filter(v => v !== value) }; + setMultiSelectOptions(next); + storage.set('multiSelectOptions', next); + // Sync to formFieldsConfig + const fieldDef = formFields.find(f => f.key === field); + if (fieldDef && fieldDef.options) { + const updatedFields = formFields.map(f => f.key === field ? { ...f, options: (f.options || []).filter(v => v !== value) } : f); + setFormFields(updatedFields); + storage.set('formFieldsConfig', updatedFields); + } + }; + + const removeAnesthesiaOption = (value: string) => { + const next = anesthesiaOptions.filter(v => v !== value); + setAnesthesiaOptions(next); + storage.set('anesthesiaOptions', next); + }; + + // Close dropdowns on outside click + useEffect(() => { + const handleDocClick = (e: MouseEvent) => { + const target = e.target as HTMLElement; + if (!target.closest('.select-dropdown-root')) { + setOpenDropdown(null); + } + }; + document.addEventListener('click', handleDocClick); + return () => document.removeEventListener('click', handleDocClick); + }, []); + + const saveReport = (status: 'draft' | 'completed') => { + if (status === 'completed' && (!reportData.patientName || !reportData.hospitalId)) { + alert('请填写患者姓名和住院号'); + return; + } + + if (status === 'completed') { + const hasSignatureField = editorRef.current?.querySelector('[data-bind="surgeonSignature"]'); + if (hasSignatureField) { + const hasSignatureImage = !!currentUser?.signature; + if (!hasSignatureImage) { + const proceed = window.confirm('提示:模板中包含【手术者签名】字段,但您的账号尚未上传电子签名图片。报告中将不显示签名图片,是否继续完成?'); + if (!proceed) return; + } + } + } + + const content = editorRef.current?.innerHTML || ''; + const now = new Date().toISOString(); + const finalReport: Report = { + ...(reportData as Report), + id: reportId || 'RPT_' + Date.now(), + content, + author: currentUser?.username || '', + authorName: currentUser?.name || '', + createdAt: reportData.createdAt || now.split('T')[0], + status, + capturedFrames, + videos, + updatedAt: now + }; + + const reports = storage.get('reports', []); + let updatedReports: Report[]; + if (reportId) { + const old = reports.find(r => r.id === reportId); + const history = old?.history ? [...old.history] : []; + if (old) { + history.push({ + content: old.content, + updatedAt: old.updatedAt || old.createdAt, + updatedBy: currentUser?.name || currentUser?.username || '', + action: status === 'completed' ? 'complete_report' : 'save_draft' + }); + } + updatedReports = reports.map(r => r.id === reportId ? { ...finalReport, history } : r); + } else { + updatedReports = [...reports, finalReport]; + if (draftKey) storage.remove(draftKey); + } + + storage.set('reports', updatedReports); + if (draftKey) storage.remove(draftKey); + setIsSaved(true); + setTimeout(() => setIsSaved(false), 3000); + if (status === 'completed') navigate('/report-manage'); + }; + + const handleEditorInput = (e: React.FormEvent) => { + if (editorRef.current) { + contentRef.current = editorRef.current.innerHTML; + } + updatePageHeight(); + saveDraftToStorage(); + + const target = e.target as HTMLElement; + if (target && target.hasAttribute('data-bind')) { + const fieldKey = target.getAttribute('data-bind')!; + const newValue = target.innerText; + + const fieldDef = formFields.find(f => f.key === fieldKey); + if (fieldKey === 'startTime') { + let raw = newValue; + if (fieldDef?.timeFormat && (fieldDef.timeFormat.includes('hh') || fieldDef.timeFormat.includes('A'))) { + raw = parseTimeFromFormat(newValue, fieldDef.timeFormat); + } + const parts = raw.split(':'); + setReportData((prev) => { + const next = { ...prev, startHour: parts[0] || '', startMinute: parts[1] || '' }; + stateRef.current = { ...stateRef.current, reportData: next }; + return next; + }); + } else if (fieldKey === 'endTime') { + let raw = newValue; + if (fieldDef?.timeFormat && (fieldDef.timeFormat.includes('hh') || fieldDef.timeFormat.includes('A'))) { + raw = parseTimeFromFormat(newValue, fieldDef.timeFormat); + } + const parts = raw.split(':'); + setReportData((prev) => { + const next = { ...prev, endHour: parts[0] || '', endMinute: parts[1] || '' }; + stateRef.current = { ...stateRef.current, reportData: next }; + return next; + }); + } else { + let raw = newValue; + if (fieldDef?.type === 'date') { + raw = parseDateFromFormat(newValue, fieldDef.timeFormat); + } else if (fieldDef?.type === 'time') { + raw = parseTimeFromFormat(newValue, fieldDef.timeFormat); + } + setReportData((prev) => { + const next = { ...prev, [fieldKey]: raw }; + stateRef.current = { ...stateRef.current, reportData: next }; + return next; + }); + } + } + }; + + // Sync form state -> rich text field values + useEffect(() => { + if (!editorRef.current) return; + const bindNodes = editorRef.current.querySelectorAll('[data-bind]'); + bindNodes.forEach((node) => { + const el = node as HTMLElement; + const fieldKey = el.getAttribute('data-bind')!; + + if (fieldKey === 'surgeonSignature') { + const signatureData = currentUser?.signature; + if (signatureData) { + const imgHtml = `签名`; + if (el.innerHTML !== imgHtml) { + el.innerHTML = imgHtml; + el.style.border = 'none'; + el.style.backgroundColor = 'transparent'; + } + } else { + const placeholder = '【请上传电子签】'; + if (el.innerText !== placeholder) { + el.innerText = placeholder; + el.style.border = ''; + el.style.backgroundColor = ''; + } + } + return; + } + + let newValue = ''; + const fieldDef = formFields.find(f => f.key === fieldKey); + if (fieldKey === 'startTime') { + newValue = `${reportData.startHour || ''}:${reportData.startMinute || ''}`; + if (newValue === ':') newValue = ''; + newValue = formatTimeDisplay(newValue, fieldDef?.timeFormat); + } else if (fieldKey === 'endTime') { + newValue = `${reportData.endHour || ''}:${reportData.endMinute || ''}`; + if (newValue === ':') newValue = ''; + newValue = formatTimeDisplay(newValue, fieldDef?.timeFormat); + } else { + const rawValue = (reportData as any)[fieldKey]; + if (Array.isArray(rawValue)) { + newValue = rawValue.join(', '); + } else if (rawValue !== undefined && rawValue !== null) { + newValue = String(rawValue); + } + if (fieldDef?.type === 'date') { + newValue = formatDateDisplay(newValue, fieldDef.timeFormat); + } else if (fieldDef?.type === 'time') { + newValue = formatTimeDisplay(newValue, fieldDef.timeFormat); + } + } + + if (el.innerText !== newValue) { + el.innerText = newValue; + } + }); + }, [reportData]); + + if (!currentUser) return null; + + const hasVisibleTemplates = templates.length > 0; + + return ( +
+ + +
+ {/* Header */} +
+
+ +
+

图文报告生成

+

+ {reportId ? `编辑报告: ${reportId}` : '新建手术报告'} +

+
+
+
+
+ 当前模板(及重置模板): + +
+ {isSaved && ( + + + 已保存 + + )} + + + + +
+
+ +
+ {/* Editor Main */} +
+ {/* Toolbar */} +
+
+ + +
+
+ + + +
+
+ + + +
+ execCmd('foreColor', e.target.value)} + className="w-9 h-9 p-1.5 bg-transparent border-none cursor-pointer rounded-lg hover:bg-white transition-colors" + title="文字颜色" + /> +
+
+
+ + + +
+
+ +
+
+
+ )} + + {exportModalOpen && ( +
+
+

导出报告

+
+ + + +
+
+
+ )} + + {imagePickerOpen && imagePickerTarget && ( +
+
+

选择图片来源

+
+ + +
+
系统素材
+
+ {imageAssets.map(asset => ( + + ))} + {imageAssets.length === 0 &&
暂无素材
} +
+
+
+
+ +
+
+
+ )} +
+ ); +} diff --git a/src/pages/ReportManage.tsx b/src/pages/ReportManage.tsx new file mode 100644 index 0000000..2d4d342 --- /dev/null +++ b/src/pages/ReportManage.tsx @@ -0,0 +1,476 @@ +import React, { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import Sidebar from '../components/Sidebar'; +import { Search, Eye, Edit, Trash2, FileText, History, X, Download, Printer } from 'lucide-react'; +import { User, Report, DEFAULT_FORM_FIELDS } from '../types'; +import { storage } from '../utils/storage'; +import { printDocument } from '../utils/print'; + +const formatDateTime = (iso: string) => { + if (!iso) return '-'; + const d = new Date(iso); + if (isNaN(d.getTime())) return iso; + const pad = (n: number) => n.toString().padStart(2, '0'); + return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`; +}; + +export default function ReportManage() { + const navigate = useNavigate(); + const [reports, setReports] = useState([]); + const [filteredReports, setFilteredReports] = useState([]); + const [currentUser, setCurrentUser] = useState(null); + const [searchTerm, setSearchTerm] = useState(''); + const [statusFilter, setStatusFilter] = useState(''); + const [dateFilter, setDateFilter] = useState(''); + const [historyModalOpen, setHistoryModalOpen] = useState(false); + const [historyReport, setHistoryReport] = useState(null); + const [selectedIds, setSelectedIds] = useState([]); + const [exportModalOpen, setExportModalOpen] = useState(false); + const [exportTarget, setExportTarget] = useState(null); + + useEffect(() => { + const user = storage.get('currentUser', null); + if (!user) { + navigate('/'); + return; + } + setCurrentUser(user); + + const savedReports = storage.get('reports', []); + setReports(savedReports); + }, [navigate]); + + useEffect(() => { + if (!currentUser) return; + + let filtered = [...reports]; + + if (currentUser.role === 'user') { + filtered = filtered.filter(r => r.author === currentUser.username); + } + + if (searchTerm) { + const term = searchTerm.toLowerCase(); + filtered = filtered.filter(r => + r.title.toLowerCase().includes(term) || + r.patientName.toLowerCase().includes(term) || + r.hospitalId.toLowerCase().includes(term) + ); + } + + if (statusFilter) { + filtered = filtered.filter(r => r.status === statusFilter); + } + + if (dateFilter) { + const now = new Date(); + filtered = filtered.filter(r => { + const reportDate = new Date(r.createdAt); + if (dateFilter === 'today') { + return reportDate.toDateString() === now.toDateString(); + } else if (dateFilter === 'week') { + const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000); + return reportDate >= weekAgo; + } else if (dateFilter === 'month') { + return reportDate.getMonth() === now.getMonth() && reportDate.getFullYear() === now.getFullYear(); + } + return true; + }); + } + + setFilteredReports(filtered); + }, [reports, currentUser, searchTerm, statusFilter, dateFilter]); + + const deleteReport = (id: string) => { + if (window.confirm('确定要删除此报告吗?')) { + const updatedReports = reports.filter(r => r.id !== id); + setReports(updatedReports); + storage.set('reports', updatedReports); + setSelectedIds(prev => prev.filter(pid => pid !== id)); + } + }; + + const viewReport = (id: string) => { + navigate(`/report-view/${id}`); + }; + + const editReport = (id: string) => { + navigate(`/report-editor?id=${id}`); + }; + + const openHistory = (report: Report) => { + setHistoryReport(report); + setHistoryModalOpen(true); + }; + + const restoreHistory = (content: string) => { + if (!historyReport) return; + if (!window.confirm('确定要恢复此历史版本到编辑器吗?当前未保存的内容将丢失。')) return; + navigate(`/report-editor?id=${historyReport.id}&restore=1`); + storage.setSession(`restore_${historyReport.id}`, content); + setHistoryModalOpen(false); + }; + + const toggleSelect = (id: string) => { + setSelectedIds(prev => prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id]); + }; + + const toggleSelectAll = () => { + if (selectedIds.length === filteredReports.length && filteredReports.length > 0) { + setSelectedIds([]); + } else { + setSelectedIds(filteredReports.map(r => r.id)); + } + }; + + const handleBulkDelete = () => { + if (!window.confirm(`确定要删除选中的 ${selectedIds.length} 份报告吗?`)) return; + const updated = reports.filter(r => !selectedIds.includes(r.id)); + setReports(updated); + storage.set('reports', updated); + setSelectedIds([]); + }; + + const buildExportData = (report: Report) => { + const fields: Record = {}; + DEFAULT_FORM_FIELDS.forEach(f => { + fields[f.key] = (report as any)[f.key]; + }); + return { + meta: { + id: report.id, + title: report.title, + createdAt: report.createdAt, + updatedAt: report.updatedAt, + author: report.author, + authorName: report.authorName, + status: report.status + }, + fields + }; + }; + + const downloadJSON = (data: any, filename: string) => { + const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + a.click(); + URL.revokeObjectURL(url); + }; + + const exportSinglePDF = (report: Report) => { + printDocument(report.content); + }; + + const exportSingleJSON = (report: Report) => { + const data = buildExportData(report); + downloadJSON(data, `报告_${report.patientName || '未命名'}_${report.id}.json`); + }; + + const exportBulkPDF = () => { + const selectedReports = reports.filter(r => selectedIds.includes(r.id)); + const mergedHTML = selectedReports.map(r => r.content).join('
'); + printDocument(mergedHTML); + }; + + const exportBulkJSON = () => { + const selectedReports = reports.filter(r => selectedIds.includes(r.id)); + const data = selectedReports.map(r => buildExportData(r)); + const timestamp = new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString().replace(/[:.]/g, '-').slice(0, 16); + downloadJSON(data, `reports_export_${timestamp}.json`); + }; + + const openExportModal = (report: Report) => { + setExportTarget(report); + setExportModalOpen(true); + }; + + if (!currentUser) return null; + + return ( +
+ + +
+
+
+

报告管理

+

+ {currentUser.role === 'user' ? '查看、编辑、打印自己创建的报告' : '查看/检索全院所有已撰写的报告'} +

+
+
+ +
+
+ + setSearchTerm(e.target.value)} + className="input-minimal pl-11" + /> +
+ + + + +
+ + {selectedIds.length > 0 && ( +
+ 已选择 {selectedIds.length} 项 +
+ + + + +
+ )} + +
+
+ + + + + + + + + + + + + + + {filteredReports.length > 0 ? ( + filteredReports.map((report) => ( + + + + + + + + + + + )) + ) : ( + + + + )} + +
+ 0 && selectedIds.length === filteredReports.length} + onChange={toggleSelectAll} + /> + 报告信息患者住院号创建者时间状态操作
+ toggleSelect(report.id)} + /> + +
{report.title}
+
{report.id}
+
{report.patientName}{report.hospitalId}{report.authorName} +
创建: {formatDateTime(report.createdAt)}
+
修改: {formatDateTime(report.updatedAt || report.createdAt)}
+
+ + {report.status === 'draft' ? '草稿' : '已完成'} + + +
+ + {(currentUser.role !== 'user' || report.author === currentUser.username) && ( + <> + + + + )} + + +
+
+
+ +

暂无报告

+

点击"新建报告"开始撰写您的第一份报告

+
+
+
+
+
+ + {historyModalOpen && historyReport && ( +
+
+
+
+

操作历史

+

报告: {historyReport.title}

+
+ +
+
+ {[...(historyReport.history || [])].reverse().map((item, idx) => ( +
+
+ + {item.action === 'complete_report' ? '完成报告' : '保存草稿'} + + {formatDateTime(item.updatedAt)} +
+

由 {item.updatedBy} {item.action === 'complete_report' ? '完成' : '保存'}

+ +
+ ))} +
+
+ 当前版本 + {formatDateTime(historyReport.updatedAt || historyReport.createdAt)} +
+

当前显示内容

+
+
+
+
+ )} + + {exportModalOpen && exportTarget && ( +
+
+
+

导出报告

+ +
+

选择导出格式:

+
+ + +
+
+
+ )} +
+ ); +} diff --git a/src/pages/ReportView.tsx b/src/pages/ReportView.tsx new file mode 100644 index 0000000..214c7f6 --- /dev/null +++ b/src/pages/ReportView.tsx @@ -0,0 +1,117 @@ +import React, { useEffect, useState } from 'react'; +import { useParams, useNavigate } from 'react-router-dom'; +import Sidebar from '../components/Sidebar'; +import { Printer, Edit, ChevronLeft } from 'lucide-react'; +import { User, Report } from '../types'; +import { storage } from '../utils/storage'; + +export default function ReportView() { + const { id } = useParams(); + const navigate = useNavigate(); + const [report, setReport] = useState(null); + const [currentUser, setCurrentUser] = useState(null); + + useEffect(() => { + const user = storage.get('currentUser', null); + if (!user) { + navigate('/'); + return; + } + setCurrentUser(user); + + const reports = storage.get('reports', []); + const found = reports.find(r => r.id === id); + + if (!found) { + alert('报告不存在'); + navigate('/report-manage'); + return; + } + + if (user.role === 'user' && found.author !== user.username) { + alert('您没有权限查看此报告'); + navigate('/report-manage'); + return; + } + + setReport(found); + }, [id, navigate]); + + if (!report || !currentUser) return null; + + const canEdit = currentUser.role !== 'user' || report.author === currentUser.username; + + return ( +
+ + +
+
+
+ +
+

查看报告

+

报告编号: {report.id}

+
+
+
+ {canEdit && ( + + )} + +
+
+ +
+
+

{report.title}

+
+
+ 患者姓名 + {report.patientName} +
+
+ 创建者 + {report.authorName} +
+
+ 创建时间 + {report.createdAt} +
+
+ 报告状态 + + {report.status === 'draft' ? '草稿' : '已完成'} + +
+
+
+ +
+
+
+
+ ); +} diff --git a/src/pages/SystemSettings.tsx b/src/pages/SystemSettings.tsx new file mode 100644 index 0000000..c708546 --- /dev/null +++ b/src/pages/SystemSettings.tsx @@ -0,0 +1,422 @@ +import React, { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import Sidebar from '../components/Sidebar'; +import { Video, Globe, Layout, Check, Plus, X } from 'lucide-react'; +import { User, SystemSettings as ISystemSettings, Template } from '../types'; +import { storage } from '../utils/storage'; + +export default function SystemSettings() { + const navigate = useNavigate(); + const [currentUser, setCurrentUser] = useState(null); + const [settings, setSettings] = useState({ + frameCount: 12, + framePositions: [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60], + apiEndpoint: '', + apiKey: '', + defaultTemplate: '', + frameMode: 'uniform' + }); + const [templates, setTemplates] = useState([]); + const [isSaved, setIsSaved] = useState(false); + const [pendingFrameCount, setPendingFrameCount] = useState(null); + const [modeModalOpen, setModeModalOpen] = useState(false); + + useEffect(() => { + const user = storage.get('currentUser', null); + if (!user) { + navigate('/'); + return; + } + setCurrentUser(user); + + const savedSettings = storage.get('systemSettings', {} as ISystemSettings & { frameMode?: 'uniform' | 'keep' }); + const savedTemplates = storage.get('templates', []); + if (savedSettings.frameCount) { + if (!savedSettings.defaultTemplate && savedTemplates.length > 0) { + savedSettings.defaultTemplate = savedTemplates[0].id; + } + if (!savedSettings.frameMode) savedSettings.frameMode = 'uniform'; + if (typeof savedSettings.autoInsertFrames !== 'boolean') savedSettings.autoInsertFrames = false; + if (typeof savedSettings.autoInsertDelay !== 'number') savedSettings.autoInsertDelay = 0; + setSettings(savedSettings); + } else if (savedTemplates.length > 0) { + setSettings(prev => ({ ...prev, defaultTemplate: savedTemplates[0].id, frameMode: prev.frameMode || 'uniform', autoInsertFrames: typeof prev.autoInsertFrames === 'boolean' ? prev.autoInsertFrames : false, autoInsertDelay: typeof prev.autoInsertDelay === 'number' ? prev.autoInsertDelay : 0 })); + } + setTemplates(savedTemplates); + }, [navigate]); + + const round1 = (n: number) => Math.round(n * 10) / 10; + + const computeFramePositions = (count: number, mode: 'uniform' | 'keep', currentPositions: number[]) => { + if (mode === 'uniform') { + const positions: number[] = []; + for (let i = 1; i <= count; i++) { + positions.push(round1((100 / (count + 1)) * i)); + } + return positions; + } + const sorted = [...currentPositions].sort((a, b) => a - b); + if (count <= sorted.length) { + return sorted.slice(0, count); + } + const need = count - sorted.length; + const last = sorted[sorted.length - 1] || 0; + const range = 100 - last; + for (let i = 1; i <= need; i++) { + sorted.push(round1(last + (range / (need + 1)) * i)); + } + return sorted; + }; + + const handleSave = (e: React.FormEvent) => { + e.preventDefault(); + const sortedPositions = [...settings.framePositions].sort((a, b) => a - b); + const finalSettings = { ...settings, framePositions: sortedPositions, frameCount: sortedPositions.length }; + storage.set('systemSettings', finalSettings); + setSettings(finalSettings); + setIsSaved(true); + setTimeout(() => setIsSaved(false), 3000); + }; + + const testApi = async () => { + if (!settings.apiEndpoint) { + alert('请先输入 API 接口地址'); + return; + } + alert(`正在测试连接到: ${settings.apiEndpoint}\n(模拟测试: 连接成功)`); + }; + + const resetToDefault = () => { + if (window.confirm('确定要恢复系统设置出厂设置吗?所有自定义配置将被清除。')) { + const defaultSettings: ISystemSettings & { frameMode?: 'uniform' | 'keep' } = { + frameCount: 12, + framePositions: [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60], + apiEndpoint: '', + apiKey: '', + defaultTemplate: templates[0]?.id || '', + frameMode: 'uniform', + autoInsertFrames: true, + autoInsertDelay: 1, + autoInsertFrameIndices: [0, 2, 4, 6, 8, 10] + }; + setSettings(defaultSettings); + storage.set('systemSettings', defaultSettings); + } + }; + + const resetAllData = () => { + if (window.confirm('确定要重置全部数据吗?这将清除所有报告、模板和用户设置。')) { + localStorage.clear(); + window.location.reload(); + } + }; + + if (!currentUser) return null; + + return ( +
+ + +
+
+
+

系统设置

+

+ {currentUser.role === 'super' ? '配置全局参数,包括视频抽帧策略与外部 AI API 对接。' : '设置您的默认报告模板。'} +

+
+
+ +
+ {currentUser.role === 'super' && ( +
+
+

+

+ + 当前共 {settings.framePositions.length} 帧 + +
+
+
+
+ +
+ { + const count = Math.max(1, Math.min(100, parseInt(e.target.value) || 1)); + setSettings({ ...settings, frameCount: count }); + }} + className="input-minimal bg-white" + /> + +
+
+
+ +
+ + {settings.frameMode === 'uniform' ? '整体均匀抽取' : '保持当前抽帧'} + +
+
+
+ +
+ setSettings({ ...settings, autoInsertFrames: e.target.checked })} + className="w-4 h-4 accent-accent cursor-pointer" + /> + +
+ +
+
+ + setSettings({ ...settings, autoInsertDelay: Math.max(0, parseFloat(e.target.value) || 0) })} + className="input-minimal bg-white w-full" + /> +
+
+ +

开启后,选中的视频自动抽帧位置将按顺序自动插入到报告的空置图片占位符中,插满后不再提示。

+ +
+ +
+ {settings.framePositions.map((pos, idx) => ( +
+ { + const newPos = [...settings.framePositions]; + newPos[idx] = Math.min(100, Math.max(0, parseFloat(e.target.value) || 0)); + setSettings({ ...settings, framePositions: newPos }); + }} + className="input-minimal w-full pr-6 text-center" + /> + % + {settings.autoInsertFrames && ( + { + const current = settings.autoInsertFrameIndices || []; + const next = current.includes(idx) + ? current.filter(i => i !== idx) + : [...current, idx].sort((a, b) => a - b); + setSettings({ ...settings, autoInsertFrameIndices: next }); + }} + className={`absolute top-1 left-1 cursor-pointer transition-colors ${ + (settings.autoInsertFrameIndices || []).includes(idx) ? 'text-green-500' : 'text-slate-300' + }`} + > + + + )} + +
+ ))} + +
+

指定视频进度的百分比位置进行自动抽帧。系统将按照这些位置提取关键帧供 AI 分析。

+
+
+
+ )} + + {currentUser.role === 'super' && ( +
+
+

+ + AI 接口集成 +

+ +
+
+
+ + setSettings({ ...settings, apiEndpoint: e.target.value })} + placeholder="https://api.example.com/v1/generate" + className="input-minimal" + /> +
+ +
+ + setSettings({ ...settings, apiKey: e.target.value })} + placeholder="sk-xxxxxxxxxxxxxxxx" + className="input-minimal" + /> +
+
+
+ )} + +
+

+ + 默认报告模板 +

+
+ + +

新建报告时将自动加载此模板内容,减少重复操作。

+
+
+ +
+ {currentUser.role === 'super' && ( +
+ + +
+ )} +
+ {isSaved && ( + + + 设置已保存 + + )} + +
+
+
+ + {modeModalOpen && ( +
+
+

选择抽帧方式

+

+ 您将抽取帧数设置为 {pendingFrameCount} 帧,请选择重新计算抽帧位置的方式: +

+
+ + +
+ +
+
+ )} +
+
+ ); +} diff --git a/src/pages/TemplateManage.tsx b/src/pages/TemplateManage.tsx new file mode 100644 index 0000000..af3afa2 --- /dev/null +++ b/src/pages/TemplateManage.tsx @@ -0,0 +1,1680 @@ +import React, { useEffect, useState, useRef } from 'react'; +import { useNavigate } from 'react-router-dom'; +import Sidebar from '../components/Sidebar'; +import { Plus, Edit, Trash2, Save, Printer, Undo, Redo, Bold, Italic, Underline, AlignLeft, AlignCenter, AlignRight, Table, Image as ImageIcon, Check, Download, Upload } from 'lucide-react'; +import { User, Template, FormField, FieldType, DEFAULT_FORM_FIELDS } from '../types'; +import { defaultReportContent } from '../utils/defaultContent'; +import { printDocument } from '../utils/print'; +import { storage } from '../utils/storage'; + +export default function TemplateManage() { + const navigate = useNavigate(); + const [currentUser, setCurrentUser] = useState(null); + const [templates, setTemplates] = useState([]); + const [currentTemplateId, setCurrentTemplateId] = useState(null); + const [isModalOpen, setIsModalOpen] = useState(false); + const [exportModalOpen, setExportModalOpen] = useState(false); + const [isEditing, setIsEditing] = useState(false); + const [formData, setFormData] = useState({ name: '', desc: '' }); + const [importedContent, setImportedContent] = useState<{content: string; fields: FormField[]} | null>(null); + const fileInputRef = useRef(null); + const [isSaved, setIsSaved] = useState(false); + const editorRef = useRef(null); + const savedRangeRef = useRef(null); + const undoStack = useRef([]); + const redoStack = useRef([]); + const [fieldLibTab, setFieldLibTab] = useState<'insert' | 'manage'>('insert'); + const [formFields, setFormFields] = useState([]); + const [newFieldForm, setNewFieldForm] = useState({ label: '', category: '填空', type: 'text' as FieldType }); + const [newFieldOptions, setNewFieldOptions] = useState(''); + const [expandedCategories, setExpandedCategories] = useState(['填空', '单选', '多选', '时间']); + const [imagePickerOpen, setImagePickerOpen] = useState(false); + const [imagePickerTarget, setImagePickerTarget] = useState(null); + const [activeFieldKey, setActiveFieldKey] = useState(null); + const [editingFieldKey, setEditingFieldKey] = useState(null); + const [editFieldLabel, setEditFieldLabel] = useState(''); + const [editFieldOptions, setEditFieldOptions] = useState(''); + const [editFieldTimeFormat, setEditFieldTimeFormat] = useState(''); + const [editFieldTimeDefault, setEditFieldTimeDefault] = useState<'current' | 'specific'>('specific'); + const [editFieldFixedTimeValue, setEditFieldFixedTimeValue] = useState(''); + const [editFieldHasUnderline, setEditFieldHasUnderline] = useState(false); + const [newFieldTimeFormat, setNewFieldTimeFormat] = useState('YYYY年MM月DD日'); + const [newFieldTimeDefault, setNewFieldTimeDefault] = useState<'current' | 'specific'>('specific'); + const [newFieldFixedTimeValue, setNewFieldFixedTimeValue] = useState(''); + const [newFieldHasUnderline, setNewFieldHasUnderline] = useState(false); + const [customTimeFormats, setCustomTimeFormats] = useState([]); + const [formatDropdownOpen, setFormatDropdownOpen] = useState(false); + const [newFormatDropdownOpen, setNewFormatDropdownOpen] = useState(false); + const [placeholderModal, setPlaceholderModal] = useState({ + isOpen: false, width: '200', height: '200', mode: 'frame' as 'frame' | 'manual' + }); + const [tableModal, setTableModal] = useState({ + isOpen: false, rows: '2', cols: '3' + }); + const [imageAssets, setImageAssets] = useState<{ id: string; name: string; dataUrl: string }[]>([]); + const [selectedIds, setSelectedIds] = useState([]); + + const updatePageHeight = () => { + if (!editorRef.current) return; + const contentHeight = editorRef.current.scrollHeight; + const pageHeightMm = 297; + const mmToPx = 3.7795275591; + const pages = Math.max(2, Math.ceil(contentHeight / (pageHeightMm * mmToPx))); + editorRef.current.style.minHeight = `${pages * pageHeightMm}mm`; + }; + + useEffect(() => { + const user = storage.get('currentUser', null); + if (!user || user.role === 'user') { + navigate('/dashboard'); + return; + } + setCurrentUser(user); + + const savedFields = storage.get('formFieldsConfig', []); + if (savedFields.length > 0) { + setFormFields(savedFields); + } else { + setFormFields(DEFAULT_FORM_FIELDS); + storage.set('formFieldsConfig', DEFAULT_FORM_FIELDS); + } + + const savedAssets = storage.get<{ id: string; name: string; dataUrl: string }[]>('imageAssets', []); + if (savedAssets.length > 0) { + setImageAssets(savedAssets); + } else { + fetch('/logo_square.png') + .then((res) => res.blob()) + .then((blob) => { + const reader = new FileReader(); + reader.onloadend = () => { + const dataUrl = reader.result as string; + const initialAssets = [{ id: 'asset_logo', name: '医院Logo', dataUrl }]; + setImageAssets(initialAssets); + storage.set('imageAssets', initialAssets); + }; + reader.readAsDataURL(blob); + }) + .catch(() => setImageAssets([])); + } + + const savedFormats = storage.get('customTimeFormats', []); + const defaultFormats = ['YYYY-MM-DD', 'YYYY年MM月DD日', 'MM-DD', 'MM月DD日', 'HH:mm', 'hh:mm A']; + const cleanedSaved = savedFormats.filter(f => f !== '24h' && f !== '12h'); + setCustomTimeFormats(Array.from(new Set([...defaultFormats, ...cleanedSaved]))); + + const savedTemplates = storage.get('templates', []); + if (savedTemplates.length === 0) { + const initial: Template = { + id: 'surgery', + name: '腹腔镜胆囊切除术报告', + desc: '标准手术记录模板', + content: defaultReportContent, + createdAt: new Date().toISOString(), + author: 'admin' + }; + setTemplates([initial]); + storage.set('templates', [initial]); + setCurrentTemplateId(initial.id); + } else { + const manageable = user.role === 'super' + ? savedTemplates.map(t => t.id) + : (Array.isArray(user.manageableTemplates) ? user.manageableTemplates : savedTemplates.map(t => t.id)); + const filtered = savedTemplates.filter(t => manageable.includes(t.id)); + setTemplates(filtered); + setCurrentTemplateId(filtered[0]?.id || null); + } + }, [navigate]); + + useEffect(() => { + if (currentTemplateId && editorRef.current) { + const template = templates.find(t => t.id === currentTemplateId); + if (template) { + editorRef.current.innerHTML = template.content; + if (template.fields && template.fields.length > 0) { + setFormFields(template.fields); + storage.set('formFieldsConfig', template.fields); + } + } + setTimeout(() => updatePageHeight(), 0); + } + }, [currentTemplateId, templates]); + + useEffect(() => { + if (!editorRef.current) return; + const observer = new MutationObserver(() => { + updatePageHeight(); + }); + observer.observe(editorRef.current, { childList: true, subtree: true, attributes: true, characterData: true }); + return () => observer.disconnect(); + }, [currentUser]); + + const fillPlaceholderSrc = (placeholder: HTMLElement, src: string) => { + const mw = placeholder.style.maxWidth || placeholder.style.width || '200px'; + const mh = placeholder.style.maxHeight || placeholder.style.height || '200px'; + placeholder.innerHTML = ` + × + + `; + placeholder.classList.add('has-image'); + placeholder.style.border = 'none'; + placeholder.style.background = 'transparent'; + placeholder.style.width = 'auto'; + placeholder.style.height = 'auto'; + placeholder.style.lineHeight = 'normal'; + placeholder.style.maxWidth = mw; + placeholder.style.maxHeight = mh; + placeholder.style.textAlign = 'left'; + placeholder.style.verticalAlign = 'top'; + placeholder.style.justifyContent = 'flex-start'; + placeholder.style.alignItems = 'flex-start'; + saveTemplateContent(); + }; + + // Handle image placeholder and smart field delete interactions via click capture + useEffect(() => { + const handleEditorClick = (e: MouseEvent) => { + let node: Node | null = e.target as Node; + if (node.nodeType === Node.TEXT_NODE) node = node.parentElement; + const targetEl = node as HTMLElement | null; + if (!targetEl) return; + + const smartField = targetEl.closest('.smart-field-wrapper') as HTMLElement | null; + if (smartField && targetEl.closest('.delete-btn')) { + e.stopPropagation(); + e.preventDefault(); + pushHistory(); + const sel = window.getSelection(); + const range = document.createRange(); + range.selectNode(smartField); + sel?.removeAllRanges(); + sel?.addRange(range); + document.execCommand('delete'); + saveTemplateContent(); + return; + } + + if (smartField) { + const valueSpan = smartField.querySelector('.field-value'); + const fieldKey = valueSpan?.getAttribute('data-bind') || smartField.getAttribute('data-bind'); + if (fieldKey) { + setActiveFieldKey(fieldKey); + const field = formFields.find(f => f.key === fieldKey); + if (field) { + setExpandedCategories(prev => prev.includes(field.category) ? prev : [...prev, field.category]); + setTimeout(() => { + const el = document.getElementById(`sidebar-field-${fieldKey}`); + el?.scrollIntoView({ behavior: 'smooth', block: 'center' }); + }, 50); + } + } + return; + } + + const placeholder = targetEl.closest('.image-placeholder') as HTMLElement | null; + if (!placeholder) return; + + if (targetEl.closest('.delete-btn')) { + e.stopPropagation(); + e.preventDefault(); + pushHistory(); + if (placeholder.classList.contains('has-image')) { + placeholder.classList.remove('has-image'); + const w = parseInt(placeholder.style.maxWidth || placeholder.style.width || '0'); + const text = w > 0 && w < 80 ? '插图' : '插入/点击放置图片'; + placeholder.innerHTML = ` + × + ${text} + `; + placeholder.style.border = '1px dashed #cbd5e1'; + placeholder.style.background = '#f8fafc'; + const mw = placeholder.style.maxWidth; + const mh = placeholder.style.maxHeight; + if (mw) placeholder.style.width = mw; + if (mh) { + placeholder.style.height = mh; + placeholder.style.lineHeight = mh; + } + placeholder.style.textAlign = 'center'; + placeholder.style.verticalAlign = 'middle'; + placeholder.style.justifyContent = 'center'; + placeholder.style.alignItems = 'center'; + } else { + const range = document.createRange(); + range.selectNode(placeholder); + const sel = window.getSelection(); + sel?.removeAllRanges(); + sel?.addRange(range); + document.execCommand('delete'); + } + return; + } + + if (!placeholder.classList.contains('has-image')) { + e.preventDefault(); + e.stopPropagation(); + setImagePickerTarget(placeholder); + setImagePickerOpen(true); + } + }; + + const editor = editorRef.current; + if (editor) { + editor.addEventListener('click', handleEditorClick, true); + } + return () => { + if (editor) { + editor.removeEventListener('click', handleEditorClick, true); + } + }; + }, [currentTemplateId, currentUser, formFields]); + + // Intercept Backspace/Delete next to smart fields to avoid whole-line deletion + useEffect(() => { + const editor = editorRef.current; + if (!editor) return; + + const handleKeyDown = (e: KeyboardEvent) => { + if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'z') { + e.preventDefault(); + if (e.shiftKey) { + handleRedo(); + } else { + handleUndo(); + } + return; + } + if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'y') { + e.preventDefault(); + handleRedo(); + return; + } + if (e.key !== 'Backspace' && e.key !== 'Delete') return; + const sel = window.getSelection(); + if (!sel || !sel.isCollapsed || sel.rangeCount === 0) return; + const range = sel.getRangeAt(0); + const node = range.startContainer; + const offset = range.startOffset; + + let target: Element | null = null; + + if (node.nodeType === Node.TEXT_NODE) { + if (e.key === 'Backspace' && offset === 0) { + const prev = node.previousSibling; + if (prev && prev.nodeType === Node.ELEMENT_NODE && (prev as Element).classList?.contains('smart-field-wrapper')) { + target = prev as Element; + } + } else if (e.key === 'Delete' && offset === (node.textContent?.length || 0)) { + const next = node.nextSibling; + if (next && next.nodeType === Node.ELEMENT_NODE && (next as Element).classList?.contains('smart-field-wrapper')) { + target = next as Element; + } + } + } else if (node.nodeType === Node.ELEMENT_NODE) { + const el = node as Element; + if (e.key === 'Backspace' && offset > 0) { + const prev = el.childNodes[offset - 1]; + if (prev && prev.nodeType === Node.ELEMENT_NODE && (prev as Element).classList?.contains('smart-field-wrapper')) { + target = prev as Element; + } + } else if (e.key === 'Delete' && offset < el.childNodes.length) { + const next = el.childNodes[offset]; + if (next && next.nodeType === Node.ELEMENT_NODE && (next as Element).classList?.contains('smart-field-wrapper')) { + target = next as Element; + } + } + } + + if (target) { + e.preventDefault(); + pushHistory(); + const sel = window.getSelection(); + const range = document.createRange(); + range.selectNode(target); + sel?.removeAllRanges(); + sel?.addRange(range); + document.execCommand('delete'); + saveTemplateContent(); + } + }; + + editor.addEventListener('keydown', handleKeyDown, true); + return () => { + editor.removeEventListener('keydown', handleKeyDown, true); + }; + }, [currentTemplateId]); + + const saveSelection = () => { + const sel = window.getSelection(); + if (sel && sel.rangeCount > 0) { + savedRangeRef.current = sel.getRangeAt(0); + } + }; + + const restoreSelection = () => { + if (!savedRangeRef.current) return; + const sel = window.getSelection(); + sel?.removeAllRanges(); + sel?.addRange(savedRangeRef.current); + }; + + const pushHistory = () => { + if (!editorRef.current) return; + undoStack.current.push(editorRef.current.innerHTML); + redoStack.current = []; + }; + + const handleUndo = () => { + if (undoStack.current.length === 0 || !editorRef.current) return; + redoStack.current.push(editorRef.current.innerHTML); + const prev = undoStack.current.pop(); + if (prev !== undefined) { + editorRef.current.innerHTML = prev; + saveTemplateContent(); + } + }; + + const handleRedo = () => { + if (redoStack.current.length === 0 || !editorRef.current) return; + undoStack.current.push(editorRef.current.innerHTML); + const next = redoStack.current.pop(); + if (next !== undefined) { + editorRef.current.innerHTML = next; + saveTemplateContent(); + } + }; + + const execCmd = (command: string, value: string | undefined = undefined) => { + if (command !== 'undo' && command !== 'redo') { + pushHistory(); + } + editorRef.current?.focus(); + document.execCommand(command, false, value); + editorRef.current?.focus(); + }; + + const changeLineHeight = (height: string) => { + const sel = window.getSelection(); + if (!sel || !sel.rangeCount) return; + let node = sel.getRangeAt(0).commonAncestorContainer; + if (node.nodeType === Node.TEXT_NODE) node = node.parentNode as Node; + const block = (node as HTMLElement).closest('p, div, td, h1, h2, h3, li'); + if (block) { + (block as HTMLElement).style.lineHeight = height; + saveTemplateContent(); + } + }; + + const changeAlignment = (align: 'left' | 'center' | 'right' | 'justify') => { + const sel = window.getSelection(); + if (!sel || !sel.rangeCount) return; + let node = sel.getRangeAt(0).commonAncestorContainer; + if (node.nodeType === Node.TEXT_NODE) node = node.parentNode as Node; + const block = (node as HTMLElement).closest('p, div, td, h1, h2, h3, li'); + if (block) { + (block as HTMLElement).style.textAlign = align; + saveTemplateContent(); + } + }; + + const saveTemplateContent = () => { + if (!currentTemplateId || !editorRef.current) return; + const allTemplates = storage.get('templates', []); + const updated = allTemplates.map(t => + t.id === currentTemplateId ? { ...t, content: editorRef.current!.innerHTML, updatedAt: new Date().toISOString() } : t + ); + setTemplates(prevTemplates => prevTemplates.map(t => updated.find(u => u.id === t.id) || t)); + storage.set('templates', updated); + }; + + const insertSmartField = (field: FormField) => { + editorRef.current?.focus(); + restoreSelection(); + if (editorRef.current?.querySelector(`[data-bind="${field.key}"]`)) { + alert(`字段 "${field.label}" 已存在,请勿重复插入。`); + return; + } + pushHistory(); + + const underlineClass = field.hasUnderline !== true ? ' no-underline' : ''; + const html = ` ×​`; + + const sel = window.getSelection(); + if (sel && sel.rangeCount > 0) { + const range = sel.getRangeAt(0); + range.deleteContents(); + const wrapper = document.createElement('div'); + wrapper.innerHTML = html; + const fragment = document.createDocumentFragment(); + while (wrapper.firstChild) { + fragment.appendChild(wrapper.firstChild); + } + range.insertNode(fragment); + + const lastNode = fragment.lastChild; + if (lastNode) { + const newRange = document.createRange(); + newRange.setStartAfter(lastNode); + newRange.collapse(true); + sel.removeAllRanges(); + sel.addRange(newRange); + } + } + + editorRef.current?.focus(); + saveTemplateContent(); + }; + + const highlightField = (key: string, active: boolean) => { + if (!editorRef.current) return; + const el = editorRef.current.querySelector(`[data-bind="${key}"]`) as HTMLElement | null; + if (!el) return; + if (active) { + el.style.transition = 'all 0.2s'; + el.style.boxShadow = '0 0 0 2px #3b82f6'; + el.style.backgroundColor = '#e0f2fe'; + } else { + el.style.boxShadow = ''; + el.style.backgroundColor = ''; + } + }; + + const toggleFieldVisible = (key: string) => { + const updated = formFields.map(f => f.key === key ? { ...f, visibleInForm: !f.visibleInForm } : f); + setFormFields(updated); + storage.set('formFieldsConfig', updated); + }; + + const deleteField = (key: string) => { + const updated = formFields.filter(f => f.key !== key); + setFormFields(updated); + storage.set('formFieldsConfig', updated); + }; + + const saveFieldEdit = (key: string) => { + const updated = formFields.map(f => { + if (f.key !== key) return f; + const next: FormField = { ...f }; + if (!f.isSystemLocked) { + next.label = editFieldLabel.trim() || f.label; + } + if (['单选', '多选', '图片'].includes(f.category)) { + next.options = editFieldOptions.split(/[,,]/).map(s => s.trim()).filter(Boolean); + } + if (f.category === '时间') { + next.timeFormat = editFieldTimeFormat; + next.timeDefault = editFieldTimeDefault; + next.fixedTimeValue = editFieldFixedTimeValue; + } + next.hasUnderline = editFieldHasUnderline; + return next; + }); + setFormFields(updated); + storage.set('formFieldsConfig', updated); + setEditingFieldKey(null); + + // 同步更新编辑器中已插入字段的 classList + if (editorRef.current) { + const els = editorRef.current.querySelectorAll(`.field-value[data-bind="${key}"]`); + els.forEach(el => { + if (editFieldHasUnderline) { + el.classList.remove('no-underline'); + } else { + el.classList.add('no-underline'); + } + }); + saveTemplateContent(); + } + }; + + const addField = () => { + if (!newFieldForm.label.trim()) return; + const key = 'custom_' + Date.now(); + const newField: FormField = { + key, + label: newFieldForm.label.trim(), + category: newFieldForm.category, + type: newFieldForm.type, + visibleInForm: true, + isSystemLocked: false, + hasUnderline: newFieldHasUnderline, + options: ['单选', '多选'].includes(newFieldForm.category) && newFieldOptions.trim() + ? newFieldOptions.split(/[,,]/).map(s => s.trim()).filter(Boolean) + : undefined + }; + if (newFieldForm.category === '时间') { + newField.timeFormat = newFieldTimeFormat; + newField.timeDefault = newFieldTimeDefault; + newField.fixedTimeValue = newFieldFixedTimeValue; + } + const updated = [...formFields, newField]; + setFormFields(updated); + storage.set('formFieldsConfig', updated); + setNewFieldForm({ label: '', category: '填空', type: 'text' }); + setNewFieldOptions(''); + setNewFieldTimeFormat('YYYY年MM月DD日'); + setNewFieldTimeDefault('specific'); + setNewFieldFixedTimeValue(''); + setNewFieldHasUnderline(true); + }; + + const handleAssetUpload = (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + const reader = new FileReader(); + reader.onload = (event) => { + const dataUrl = event.target?.result as string; + const asset = { id: 'asset_' + Date.now(), name: file.name, dataUrl }; + const updated = [...imageAssets, asset]; + setImageAssets(updated); + storage.set('imageAssets', updated); + }; + reader.readAsDataURL(file); + e.target.value = ''; + }; + + const insertTable = () => { + editorRef.current?.focus(); + restoreSelection(); + pushHistory(); + setTableModal({ isOpen: true, rows: '2', cols: '3' }); + }; + + const insertImage = () => { + editorRef.current?.focus(); + restoreSelection(); + pushHistory(); + setPlaceholderModal({ isOpen: true, width: '200', height: '200', mode: 'frame' }); + }; + + const saveCurrentTemplate = () => { + if (!currentTemplateId || !editorRef.current) return; + const allTemplates = storage.get('templates', []); + const updated = allTemplates.map(t => { + if (t.id === currentTemplateId) { + return { ...t, content: editorRef.current!.innerHTML, updatedAt: new Date().toISOString() }; + } + return t; + }); + setTemplates(updated.filter(t => templates.some(x => x.id === t.id))); + storage.set('templates', updated); + setIsSaved(true); + setTimeout(() => setIsSaved(false), 3000); + }; + + const handleAddTemplate = () => { + setIsEditing(false); + setFormData({ name: '', desc: '' }); + setIsModalOpen(true); + }; + + const handleEditInfo = (template: Template) => { + setIsEditing(true); + setFormData({ name: template.name, desc: template.desc || '' }); + setIsModalOpen(true); + }; + + const handleDeleteTemplate = (id: string) => { + if (window.confirm('确定要删除此模板吗?')) { + const allTemplates = storage.get('templates', []); + const updated = allTemplates.filter(t => t.id !== id); + setTemplates(updated); + storage.set('templates', updated); + if (currentTemplateId === id) { + setCurrentTemplateId(updated[0]?.id || null); + } + setSelectedIds(prev => prev.filter(sid => sid !== id)); + } + }; + + const handleBatchDelete = () => { + if (selectedIds.length === 0) return; + if (!window.confirm(`确定要删除选中的 ${selectedIds.length} 个模板吗?`)) return; + const allTemplates = storage.get('templates', []); + const updated = allTemplates.filter(t => !selectedIds.includes(t.id)); + setTemplates(updated); + storage.set('templates', updated); + if (currentTemplateId && selectedIds.includes(currentTemplateId)) { + setCurrentTemplateId(updated[0]?.id || null); + } + setSelectedIds([]); + }; + + const handleBatchExport = () => { + if (selectedIds.length === 0) return; + const targets = templates.filter(t => selectedIds.includes(t.id)); + const ts = new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString().replace(/[:.]/g, '-').slice(0, 16); + const exportData = { + version: '1.0', + type: 'surclaw_template_package_batch', + templates: targets + }; + const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `模板批量导出-${ts}.json`; + a.click(); + URL.revokeObjectURL(url); + }; + + const handleImportFile = (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + const reader = new FileReader(); + reader.onload = (event) => { + try { + const json = JSON.parse(event.target?.result as string); + if (json.type !== 'surclaw_template_package') { + alert('无效的模板包文件'); + return; + } + setFormData({ name: json.title || '', desc: json.description || '' }); + setImportedContent({ + content: json.content || '', + fields: Array.isArray(json.fields) ? json.fields : [] + }); + } catch { + alert('文件解析失败,请检查 JSON 格式'); + } + }; + reader.readAsText(file); + if (e.target) e.target.value = ''; + }; + + const handleExportTemplate = (template: Template) => { + const exportData = { + version: '1.0', + type: 'surclaw_template_package', + title: template.name, + description: template.desc || '', + content: template.content, + fields: template.fields || formFields + }; + const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + const ts = new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString().replace(/[:.]/g, '-').slice(0, 16); + a.download = `模板导出-${template.name}-${ts}.json`; + a.click(); + URL.revokeObjectURL(url); + }; + + const handleModalSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const allTemplates = storage.get('templates', []); + if (isEditing) { + const updated = allTemplates.map(t => { + if (t.id === currentTemplateId) { + return { ...t, name: formData.name, desc: formData.desc }; + } + return t; + }); + setTemplates(updated.filter(t => templates.some(x => x.id === t.id))); + storage.set('templates', updated); + } else { + const newTpl: Template = { + id: 'tpl_' + Date.now(), + name: formData.name, + desc: formData.desc, + content: importedContent?.content || defaultReportContent, + createdAt: new Date().toISOString(), + author: currentUser?.username || 'admin', + fields: importedContent?.fields || formFields + }; + const updated = [...allTemplates, newTpl]; + setTemplates([...templates, newTpl]); + storage.set('templates', updated); + setCurrentTemplateId(newTpl.id); + if (importedContent?.fields && importedContent.fields.length > 0) { + setFormFields(importedContent.fields); + storage.set('formFieldsConfig', importedContent.fields); + } + + const savedUsers = storage.get('users', []); + let updatedUsers = savedUsers; + if (currentUser?.role === 'super') { + updatedUsers = savedUsers.map(u => { + if (u.role === 'super') { + const mt = [...(u.manageableTemplates || [])]; + const vt = [...(u.visibleTemplates || [])]; + if (!mt.includes(newTpl.id)) mt.push(newTpl.id); + if (!vt.includes(newTpl.id)) vt.push(newTpl.id); + return { ...u, manageableTemplates: mt, visibleTemplates: vt }; + } + return u; + }); + } else if (currentUser?.role === 'admin') { + const dept = currentUser.department || ''; + updatedUsers = savedUsers.map(u => { + if (u.username === currentUser.username) { + const mt = [...(u.manageableTemplates || [])]; + const vt = [...(u.visibleTemplates || [])]; + if (!mt.includes(newTpl.id)) mt.push(newTpl.id); + if (!vt.includes(newTpl.id)) vt.push(newTpl.id); + return { ...u, manageableTemplates: mt, visibleTemplates: vt }; + } + if (u.role === 'user' && u.department === dept) { + const vt = [...(u.visibleTemplates || [])]; + if (!vt.includes(newTpl.id)) vt.push(newTpl.id); + return { ...u, visibleTemplates: vt }; + } + return u; + }); + } + storage.set('users', updatedUsers); + const currentCached = updatedUsers.find(u => u.username === currentUser?.username); + if (currentCached) { + storage.set('currentUser', currentCached); + setCurrentUser(currentCached); + } + } + setIsModalOpen(false); + setImportedContent(null); + }; + + if (!currentUser) return null; + + const currentTemplate = templates.find(t => t.id === currentTemplateId); + + return ( +
+ + + {/* Template List Sidebar */} + + + {/* Main Editor */} +
+
+
+
+

模板管理

+

+ {currentTemplate ? currentTemplate.name : '请选择模板'} +

+
+
+
+ {isSaved && ( + + + 已保存 + + )} + + + +
+
+ +
+ {/* Editor Main */} +
+ {/* Toolbar */} +
+
+ + +
+
+ + + +
+
+ + + +
+ e.preventDefault()} + onChange={(e) => execCmd('foreColor', e.target.value)} + className="w-9 h-9 p-1.5 bg-transparent border-none cursor-pointer rounded-lg hover:bg-white transition-colors" + title="文字颜色" + /> +
+
+
+ + + +
+
+