diff --git a/.dockerignore b/.dockerignore index b7d4337..860832d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,3 +8,6 @@ liapi liapi.exe SECURITY.md CONTRIBUTING.md +web/node_modules +web/.nuxt +web/.output diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3d1daf1..d7566a2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,9 +5,42 @@ on: branches: ['**'] pull_request: +permissions: + contents: write + jobs: + frontend: + runs-on: ubuntu-latest + defaults: + run: + working-directory: web + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Install deps + run: npm ci + + - name: Typecheck + run: npm run typecheck + + - name: Build admin SPA + run: npm run build + + # Hand the freshly built assets to the Go job so embedding is verified + # against current sources (the committed copy is only a fallback). + - uses: actions/upload-artifact@v4 + with: + name: adminui + path: server/adminui + if-no-files-found: error + test: runs-on: ubuntu-latest + needs: frontend steps: - uses: actions/checkout@v4 @@ -16,6 +49,12 @@ jobs: go-version: 'stable' cache: true + - name: Use freshly built admin UI + uses: actions/download-artifact@v4 + with: + name: adminui + path: server/adminui + - name: Format check run: | out=$(gofmt -l .) @@ -31,3 +70,80 @@ jobs: - name: Build run: go build ./... + + # ── 自动发布:仅当 beta 分支上 CI 全绿时触发 ─────────── + # 固定 tag `beta-latest`,每次成功都覆盖为该提交的构建产物; + # 作为正式 Release 发布(非 prerelease)。 + # 注意:不依赖 workflow_run(那要求工作流先在默认分支 main 上存在)。 + publish: + needs: [frontend, test] + if: github.event_name == 'push' && github.ref == 'refs/heads/beta' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version: stable + cache: false + + - name: Use freshly built admin UI + uses: actions/download-artifact@v4 + with: + name: adminui + path: server/adminui + + - name: Build release binaries + env: + ENABLE_VERSION_INJECT: '1' + VERSION: beta-${{ github.sha }} + run: | + chmod +x buildrelease.sh + # Build a practical subset (fast, most-used platforms); the full + # matrix (Android/iOS included) is reserved for tagged releases. + mkdir -p dist + ok=0 + for T in linux/amd64 linux/arm64 windows/amd64 windows/arm64 darwin/amd64 darwin/arm64; do + if ./buildrelease.sh "$T"; then ok=$((ok+1)); else echo "skip $T"; fi + done + echo "built=$ok" + test "$ok" -gt 0 || { echo "no binaries built"; exit 1; } + + - name: Generate checksums + run: | + cd dist + sha256sum * > checksums.txt + echo "共 $(ls | wc -l) 个文件" + ls -lh + + # The rolling tag keeps one release; drop previous assets so the + # release always reflects only the newest successful build. + - name: Clean previous release assets + env: + GH_TOKEN: ${{ github.token }} + run: | + gh release view beta-latest --json assets \ + --jq '.assets[].name' 2>/dev/null | while read -r name; do + [ -n "$name" ] && gh release delete-asset beta-latest "$name" -y || true + done + + - name: Publish beta release + uses: softprops/action-gh-release@v2 + with: + tag_name: beta-latest + name: Beta build ${{ github.sha }} + target_commitish: ${{ github.sha }} + prerelease: false + draft: false + make_latest: false + files: dist/* + generate_release_notes: true + body: | + Automated release from the `beta` branch. + + - Commit: `${{ github.sha }}` + - Version injected into binaries: `beta-${{ github.sha }}` + - Built by CI run ${{ github.run_id }} + + ⚠️ Rolling build tracked to the `beta` branch. For production use, + prefer a versioned release. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 11cf62c..36d9fbd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,6 +9,25 @@ permissions: contents: write jobs: + # ── 0. 构建管理台 SPA(go:embed 依赖它)──────────────── + build-frontend: + runs-on: ubuntu-latest + defaults: + run: + working-directory: web + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm ci + - run: npm run build + - uses: actions/upload-artifact@v4 + with: + name: adminui + path: server/adminui + if-no-files-found: error + # ── 1. 枚举平台,分流到 Linux / macOS runner ───────── list-targets: runs-on: ubuntu-latest @@ -34,7 +53,7 @@ jobs: # ── 2a. Linux runner ───────────────────────────────── build-linux: - needs: list-targets + needs: [list-targets, build-frontend] runs-on: ubuntu-latest strategy: fail-fast: false @@ -48,6 +67,12 @@ jobs: go-version: stable cache: false + - name: Use freshly built admin UI + uses: actions/download-artifact@v4 + with: + name: adminui + path: server/adminui + # ★ 只在 Android 平台启用 NDK 缓存 - name: Cache Android NDK if: startsWith(matrix.target.goos, 'android') @@ -74,7 +99,7 @@ jobs: # ── 2b. macOS runner(仅 iOS)───────────────────────── build-macos: - needs: list-targets + needs: [list-targets, build-frontend] runs-on: macos-latest strategy: fail-fast: false @@ -88,6 +113,12 @@ jobs: go-version: stable cache: false + - name: Use freshly built admin UI + uses: actions/download-artifact@v4 + with: + name: adminui + path: server/adminui + - name: Build continue-on-error: true env: diff --git a/.gitignore b/.gitignore index 3c43037..d940ac1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,11 @@ **/health_state.json **/relay.jsonl* /android-ndk-*/ + +# Nuxt admin SPA (web/) — build artifacts only; source is committed. +/web/node_modules/ +/web/.nuxt/ +/web/.output/ +/web/dist/ +/web/node_modules/.cache/ +*.tsbuildinfo diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..70d4447 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,469 @@ +# Liapi 开发文档 + +> 面向贡献者与维护者的开发指南。 +> 功能规格与配置字段见 [README.md](README.md);协作规范见 [CONTRIBUTING.md](CONTRIBUTING.md); +> 安全策略见 [SECURITY.md](SECURITY.md)。 + +## 目录 + +- [0. 铁律(Must Follow)](#0-铁律must-follow) +- [1. 项目定位](#1-项目定位) +- [2. 架构总览](#2-架构总览) +- [3. 目录结构](#3-目录结构) +- [4. 核心数据流](#4-核心数据流) +- [5. 配置与热重载](#5-配置与热重载) +- [6. 安全约定](#6-安全约定不可违背) +- [7. 开发环境与常用命令](#7-开发环境与常用命令) +- [8. 管理台前端(Nuxt 4 / fuxsto-design)](#8-管理台前端nuxt-4--fuxsto-design) +- [9. 提交前检查清单(本地与 CI 同等)](#9-提交前检查清单本地与-ci-同等) +- [10. 测试指南](#10-测试指南) +- [11. CI 与发布流程](#11-ci-与发布流程) +- [12. 修改配置 schema 的注意事项](#12-修改配置-schema-的注意事项) + +--- + +## 0. 铁律(Must Follow) + +> **任何上传至仓库的内容,必须推送到 `https://github.com/LiStudioorg/liapi` 仓库的 `beta` 分支,严禁推送到 `main` 分支。** + +- 所有 commit / push 一律以 `beta` 为目标分支,`main` 分支禁止直接写入。 +- 当前工作分支即 `beta`(`git branch --show-current` 应为 `beta`)。 +- 提交前务必确认目标分支: + + ```bash + git branch --show-current # 期望输出:beta + git push origin beta # 只推 beta,禁止 git push origin main + ``` + +- 合并到 `main`(如需要)只能通过受控的 Pull Request 由维护者执行,开发者本人不得直接推送。 + +### 0.1 构建产物必须随源码提交 + +管理台产物 `server/adminui/` 由 `//go:embed all:adminui` 打包进二进制,**必须提交进仓库**: +CI / Docker 的 Go 构建阶段不含 Node,若产物缺失则 `go build` 直接失败。 + +- 改动 `web/` 后,先运行 `./buildadmin.sh` 重新生成,再连同源码一起提交。 +- 不要手工编辑 `server/adminui/` 下任何文件(全是生成产物,会被下次构建覆盖)。 +- `.gitignore` 只忽略 `web/node_modules`、`web/.nuxt`、`web/.output` 等中间物, + **不**忽略 `server/adminui/`。 + +--- + +## 1. 项目定位 + +Liapi 是自托管、OpenAI 兼容的 API 网关:对外暴露 `/v1/*`,对内聚合多个上游 +(OpenAI / Claude / OpenRouter / 硅基流动 / Ollama…),统一 **鉴权、路由、日志、 +限流、配额、故障转移、可观测**。 + +| 是 | 不是 | +|---|---| +| 自托管 HTTP 服务 | 多租户 SaaS | +| OpenAI 兼容网关 | 不做注册 / 支付 / 发票 | +| 统一鉴权 + 路由 + 限流 + 日志 | 不做模型推理 | + +- **技术栈:Go 1.22+(约定 `go 1.22`)/ 纯标准库,零第三方依赖。** +- `go.mod` 必须保持 stdlib-only,这是硬约束(见 CONTRIBUTING)。 +- **Go 服务**单二进制 + 内嵌管理台(`//go:embed`),`go build` 一步出产物。 +- **管理台前端**为独立 Nuxt 工程(`web/`),构建产物 `server/adminui/` 再被 Go 内嵌。 + +--- + +## 2. 架构总览 + +``` + ┌──────────────────────────────────────┐ + │ liapi │ + 客户端 ────────────► │ /v1/* 业务入口(OpenAI 兼容) │ + (SDK / base_url) │ ├─ 客户端鉴权(token / device / 策略) │ + │ ├─ 限流 + 日配额 │ + │ ├─ 别名解析 / 参数覆写 │ + │ ├─ 路由(fallback / priority / │ + │ │ latency / cost / group) │ + │ ├─ 转发 + 重试 + 故障转移 │ + │ │ ├─ 流式(SSE) / 非流式 │ + │ │ └─ 用量抽取 │ + │ └─ 日志(JSONL + 环形缓冲) │ + │ │ + │ /admin/api/* 管理接口(独立鉴权) │ + │ / 内嵌管理台 SPA(Nuxt) │ + │ /metrics Prometheus 文本 │ + │ │ + │ 后台 goroutine:健康探测 / 配额清理 / │ + │ 告警 / 日志保留 │ + └──────────────────────────────────────┘ + │ │ │ + ┌────┴───┐ ┌───┴─────┐ ┌──┴──────┐ + │ OpenAI │ │OpenRouter│ │ Ollama │ ... + └────────┘ └─────────┘ └─────────┘ +``` + +**关键设计(改动时务必保持):** + +1. 上游 `base_url` **自带版本前缀**(如 `https://api.openai.com/v1`);转发路径 = + `base_url`(去尾斜杠)+ 客户端路径去掉 `/v1` 前缀(`relativePath`)。 +2. 客户端 token 与上游 API Key **完全分离**:前者校验入站,后者只注入出站。 +3. 故障转移决策必须在**首次 `WriteHeader` 之前**完成;一旦写响应头不再切换上游。 +4. 流式转发**不设 `http.Client.Timeout`**;非流式用 `context.WithTimeout`, + 流式用空闲看门狗(`stream_idle_timeout`),靠客户端断开驱动结束。 + +--- + +## 3. 目录结构 + +``` +liapi/ +├── go.mod # module liapi / go 1.22(零依赖) +├── main.go # 入口:加载配置、装配依赖、启动 HTTP、优雅退出 +├── buildadmin.sh # 构建管理台 SPA 到 server/adminui(改 web/ 后运行) +├── buildrelease.sh # 交叉编译单个平台(release.yml 调用) +├── config/ +│ ├── config.go # Config/Upstream/Device/AliasRule/... + 默认值 + Validate + 原子 Save +│ ├── config_test.go +│ ├── holder.go # 配置 Holder(RWMutex,热重载单一数据源) +│ └── interop.go # OneAPI channels 导入 +├── common/ +│ ├── errors.go # OpenAI 错误格式 {"error":{...}} 与写出 +│ ├── token.go # 常量时间比较 / SHA-256 / 脱敏 +│ ├── password.go # PBKDF2-HMAC-SHA256 密码哈希/校验(管理台登录) +│ └── token_test.go +├── auth/ +│ ├── auth.go # 客户端 token / 设备 token 校验 +│ ├── admin.go # 管理登录(用户名+密码→会话)/ admin token 校验 + 每 IP 失败锁定 +│ └── auth_test.go +├── routing/ +│ ├── router.go # 别名解析 + 候选收集 + fallback/strategy/group/健康过滤 +│ ├── router_test.go +│ └── fallback_test.go +├── relay/ +│ ├── relay.go # 转发主循环(重试 / 故障转移 / 失败分类) +│ ├── stream.go # SSE 流式复制(Flusher) +│ ├── usage.go # 用量抽取(OpenAI / Anthropic 两套字段) +│ ├── http.go # 头透传、响应头清洗、尾缓冲 +│ └── {relay,retry}_test.go +├── server/ +│ ├── server.go # ServeMux 路由注册 + admin 中间件(IP/锁定/限流/会话或token) +│ ├── handler_v1.go # /v1/* 业务实现 +│ ├── handler_admin.go # /admin/api/* 实现(含 login/logout/me)+ SPA 静态托管 +│ ├── requestid.go # X-Request-ID 中间件 +│ ├── adminui/ # 管理台构建产物(go:embed all:adminui),勿手改 +│ └── {server,policy,failover,adminui,helpers}_test.go +├── web/ # 管理台源码(Nuxt 4 + fuxsto-design,独立于 Go) +│ ├── nuxt.config.ts # ssr:false + nitro.preset=static,产物输出到 ../server/adminui +│ ├── package.json # Nuxt 4 / Vue 3 / Tailwind v4 / fuxsto-design +│ ├── tsconfig.json +│ └── app/ +│ ├── app.vue # 根组件 +│ ├── layouts/default.vue # NewAPI 风格侧边栏 + 顶栏 + 路由过渡(含未认证跳转) +│ ├── layouts/auth.vue # 登录页专用居中布局 +│ ├── pages/login.vue # 登录页(token 校验 + 回跳 redirect) +│ ├── pages/config.vue # 配置页(表单/JSON 双视图可视化编辑 + 热重载) +│ ├── pages/*.vue # 概览/上游/令牌/设备/统计/日志/健康/配置/调试 +│ ├── components/ # Field / DialogPanel / StatTile +│ ├── composables/ # useApi(admin token + fetch)/ useUi(toast/confirm/handleError) +│ ├── types/api.ts # 与 Go 端 JSON 契约对应的类型 +│ ├── utils/format.ts # 数字/时间/状态格式化 +│ └── assets/css/main.css +├── stats/ +│ ├── logger.go # JSONL 写入 + 环形缓冲 + 保留策略 +│ ├── limiter.go # 滑动窗口限流 +│ ├── quota.go # 每日配额 + 告警阈值 +│ ├── health.go # 后台健康探测 + 持久化 +│ ├── totals.go # 原子聚合计数 +│ ├── aggregate.go # 统计聚合(分维度 / 分位数) +│ ├── metrics.go # Prometheus 指标 +│ ├── alerts.go # Webhook / Bark 告警 + 去重 +│ ├── audit.go # 管理端访问审计环 +│ └── {stats,testhelpers}_test.go +└── .github/workflows/{ci,release}.yml +``` + +--- + +## 4. 核心数据流 + +### 4.1 请求链路(以 `POST /v1/chat/completions` 为例) + +``` +RequestID 中间件(生成/回显 X-Request-ID) + ├─ 客户端鉴权:Authorization: Bearer → x-api-key → ?token= + │ 常量时间比较;设备 token 仅比对 SHA-256;策略校验(过期 / IP 白名单) + ├─ 限流:滑动窗口(全局 rate_limit_per_minute / 设备 rpm / 策略 rpm)→ 429 + ├─ 日配额:daily_per_token / 设备 daily → 超额 429 + 告警 + ├─ 读 body(MaxBytesReader)→ 413;非法 JSON → 400 + ├─ 解析 model / stream;缺 model → 400 + ├─ 别名解析(aliases / alias_rules)+ 参数覆写 → 最终 model + ├─ 路由:group 过滤 → fallbacks 链 或 strategy 排序 → 健康过滤 + ├─ 转发主循环(重试 + 故障转移) + ├─ 回写:SSE 流式 / 普通复制(清洗响应头) + ├─ 用量抽取(usage)→ totals / aggregate + └─ 写日志(JSONL + 环形缓冲) +``` + +### 4.2 路由(`routing/router.go`) + +1. **别名**:`aliases[model]` 精确优先;否则首条匹配的 `alias_rules`(精确或正则), + 并带回 `params` 覆写。 +2. **候选**:遍历启用上游,按 `group` 与 `Matches(model)`(支持 `"*"` 兜底)过滤。 +3. **排序**: + - 若 `fallbacks[model]` 存在 → 按显式链顺序(仅保留匹配到的上游)。 + - 否则按 `priority` 升序分组,组内按 `route_strategy`: + - `""`/`priority`:`weight` 加权随机(展开 → 洗牌 → 去重保序)。 + - `latency`:`weight * (1000 / max(latency_ms, 50))`,clamp 到 `[1,1000]` 后加权随机。 + - `cost`:按 `prices[model].Input` 升序;无价目则退化为 `priority`。 +4. **健康过滤**:`skip_unhealthy=true` 时剔除不健康上游;若全被剔除则**回退全量** + (防止全挂不可用)。 + +### 4.3 转发与故障转移(`relay/relay.go`) + +失败分类 `failKind`:`failNetwork`(连接失败,安全重试)、`failTimeout` +(可能已入账)、`failUpstream`(429/5xx)。 + +| 情况 | 处理 | +|---|---| +| `2xx` | 回写并向客户端返回;结束 | +| `4xx`(≠429) | **不切换**,原样透传上游错误 | +| `429` / `5xx` | 同上游重试(受 `upstream.retry` 限制),再切换下一候选 | +| 网络错误 | 同上游重试(安全),再切换 | +| 超时 | 仅当 `retry_on_timeout=true` 才重试/切换(防重复计费) | +| 客户端断开 | 记 `499`,立即停止,**绝不重试** | + +- 单上游重试有 `250ms * attempt` 的退避。 +- 每次重试/切换通过 `OnEvent` 上报指标与告警。 + +### 4.4 流式(`relay/stream.go`) + +- 以响应 `Content-Type` 含 `text/event-stream` 判断流式。 +- 逐行读 + 每行 `http.Flusher.Flush()`;客户端 `Write` 出错即停止并关闭上游 body。 +- 响应头清洗:**删除 `Content-Length / Transfer-Encoding / Connection`**,其余透传。 +- 空闲看门狗按 `stream_idle_timeout` 断开长时间无数据连接。 + +--- + +## 5. 配置与热重载 + +- 全部配置由管理台(`http://:8787/`)编辑,保存即热重载。 +- `config.json` 只作首次引导(自动生成、含随机 `admin_token` 与随机管理账号密码),权限强制 `0600`; + Windows 跳过权限校验,可用 `LIAPI_SKIP_PERM_CHECK=1` 临时绕过。 +- 保存流程(`config.Save`):临时文件 → `fsync` → `os.Rename` 原子替换 → 再次 `chmod 0600`。 +- 热重载:`Holder.Set(newCfg)`;所有请求**每次现取** `holder.Get()`,不缓存。 +- 管理台是 Nuxt 生成的静态 SPA,产物位于 `server/adminui/`,由 + `server/server.go` 的 `//go:embed all:adminui` 打包进二进制; + `handler_admin.go` 的 `adminUI` 负责静态资源 + SPA 回退(未知 GET 路径 → `index.html`)。 +- 启动时 `main.go` 的 `printAdminBanner` 会以醒目方框打印 **管理台登录用户名**、 + **首次生成的密码明文**(仅首次启动出现,之后不再显示)以及 `admin_token`(供 /metrics 与脚本), + 方便直接登录;设 `LIAPI_MASK_ADMIN_TOKEN=1` 可只打印脱敏值 + (共享/远程终端、录屏等场景)。 +- 管理台「配置」页(`web/app/pages/config.vue`)提供**表单 / JSON 双视图**: + - 表单视图按 Collapse 分组(监听与转发 / 路由与重试 / 健康检查 / 日志 / 管理台与鉴权 / + 别名·降级链·价目 / 告警)编辑各顶层字段;键值型字段(`aliases` / `fallbacks` / + `prices` / `alias_rules`)用增删行编辑器维护。 + - 保存时 `buildConfig()` 以 JSON 视图为**基底**,仅覆盖表单涉及的字段, + 因此表单未覆盖的字段(`token_policies` / `token_quotas` / `upstreams` / `devices` 等)原样保留。 + - `upstreams` 与 `devices` 不在此页编辑,分别由「上游」「设备」专页维护。 + - 脱敏密钥(含 `...`)无需手填:服务端 `resolveMaskedSecrets` 会在保存时还原为原值; + `admin_password` 留空即保持原密码,填写则更新为新密码。 + +--- + +## 6. 安全约定(不可违背) + +1. **永不记录密钥**:token 用 `common.MaskToken` 脱敏;`api_key` 一律不入日志。 + 设备 token 只存 SHA-256(`token_hash`),明文仅在创建/轮换时返回一次。 + 管理台密码只存 PBKDF2-HMAC-SHA256 加盐哈希(`admin_password_hash`),明文仅在首次生成时打印一次。 +2. **常量时间比较**:token 校验用 SHA-256 摘要 + `subtle.ConstantTimeCompare`; + 密码校验用 PBKDF2 派生 + `subtle.ConstantTimeCompare`。 +3. **管理面三层防护**:IP 白名单(`admin_allow_ips`)→ 每 IP 失败锁定 → 每 IP 限流 + (`admin_rate_per_minute`)→ 登录会话(用户名+密码)或 admin token。每次尝试写入审计环。 +4. **X-Forwarded-For 仅在配置白名单时信任**(防伪造)。 +5. 日志文件 `0600`;配置文件 `0600`。 +6. 前端登录会话 token 仅存浏览器 `localStorage`,随请求以 `Authorization: Bearer` 发送; + 不得写入仓库或日志。登录/退出一律走 `/login` 页面,禁止用 `window.prompt` + 等浏览器对话框收集密钥。 +7. 终端打印首次生成的明文密码属便利性取舍(仅首次启动),可用 `LIAPI_MASK_ADMIN_TOKEN=1` + 关闭;生产环境若会把 stdout 接入共享日志,应设为 `1`。 + +--- + +## 7. 开发环境与常用命令 + +```bash +git clone https://github.com/LiStudioorg/liapi.git +cd liapi +git checkout beta # 铁律:工作在 beta 分支 +go test ./... +go build -o liapi . +./liapi -config config.json # 首次运行生成 config.json(0600),终端醒目打印管理账号密码与 admin_token +``` + +> 启动后终端会出现一个方框,其中 `用户名` / `密码` 为管理台登录凭据(密码仅首次生成时显示), +> 直接用于登录 `http://:8787/`。`Admin Token` 单独列出,仅供 `/metrics` 与脚本。 +> 如需隐藏明文:`LIAPI_MASK_ADMIN_TOKEN=1 ./liapi -config config.json`。 + +冒烟: + +```bash +curl http://localhost:8787/v1/models -H "Authorization: Bearer sk-client-aaa" +curl http://localhost:8787/v1/chat/completions -H "Authorization: Bearer sk-client-aaa" \ + -d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}' -N +``` + +全新装配依赖关系(`main.go`): + +``` +config.Load → Holder → stats.NewLogger / NewLimiter / NewTotals + → relay.New(holder) → stats.NewHealth(holder, relay.Client()) + → routing.NewRouter(holder, health) → auth.NewClient / NewAdmin(holder) + → server.New(...) → health.Start(ctx) → http.Server +``` + +--- + +## 8. 管理台前端(Nuxt 4 / fuxsto-design) + +管理台源码在 `web/`,与 Go 代码完全解耦;**唯一契约是 `/admin/api/*` 的 JSON**。 + +- 技术栈:Nuxt 4(`ssr: false`)+ Vue 3 + Tailwind CSS v4 + `fuxsto-design` 组件库。 +- 构建:`nuxt generate` + `nitro.preset=static`,`output.publicDir` 指向 + `../server/adminui`,产出纯静态 SPA(客户端路由)。 +- 布局参考 NewApi:左侧固定侧边栏 + 顶栏,页面切换带过渡动画 + (`pageTransition`,`mode: out-in`)。 +- **登录**:`app/pages/login.vue` 是独立的登录页,配 `layouts/auth.vue`(居中品牌布局)。 + - 输入**用户名 + 密码**,调用 `/admin/api/login` 换取短期会话 token(`sess-…`)。 + - 未认证(`localStorage` 无会话 token)访问任意页面 → 自动跳转 `/login?redirect=<原路径>`。 + - 登录成功才写入 `localStorage`(错误凭据不会覆盖已有会话),再回跳 `redirect`;密码框提供显示/隐藏切换。 + - 任意接口返回 401 → `useUi.handleError` 清除无效态并跳转 `/login`。 + - 退出登录调用 `/admin/api/logout` 使服务端会话失效后再清除本地 token。 + - **禁止**使用 `window.prompt` / `window.confirm` 等浏览器对话框收集或确认密钥。 +- API 客户端:`app/composables/useApi.ts`——会话 token 存 `localStorage`, + 请求带 `Authorization: Bearer `;`login()` 换 token、`logout()` 服务端失效并登出。 +- 类型契约:`app/types/api.ts`,字段须与 `server/handler_admin.go` 保持一致。 +- 开发代理:`nuxt.config.ts` 的 `nitro.devProxy` 已把 `/admin/api`、`/v1`、`/metrics` + 转发到本地 `127.0.0.1:8787`,可先起 Go 服务再 `npm run dev`。 + +### 8.1 配置页可视化编辑(`app/pages/config.vue`) + +配置页是「可视化编辑 + 热重载」的统一入口,控件与 `config/config.go` 字段一一对应: + +- 顶部 `Segmented` 切换 **表单 / JSON** 两个视图,共用同一份 `text`(GET `/admin/api/config` 返回的脱敏 JSON)。 +- 表单字段用 `reactive(form)` 承载标量项,用 `ref([])` 承载键值/列表项; + `readForm(cfg)` 把配置铺进表单,`buildConfig()` 反向合成。 +- **合成策略**:`buildConfig()` 先解析 JSON 视图为基底对象,再 `Object.assign` 覆盖表单字段。 + 这样新增字段只要没加进表单就会自动透传,避免「表单漏字段导致配置丢失」。 +- 保存仍走 `POST /admin/api/config` 单一接口,服务端做 `Validate` → `Save`(原子)→ `Holder.Set`; + 校验失败保留旧配置,前端提示错误。 +- 导出的 JSON(`/config/export`)含明文密钥,仅用于备份,切勿提交仓库。 + +> 新增配置字段时(见第 12 节):除更新 `config/config.go` 与 README 字段表外, +> 若希望出现在管理台表单中,还需同步 `web/app/types/api.ts` 类型与本页控件。 + +常用命令(在 `web/` 内): + +```bash +npm install # 安装依赖(首次) +npm run dev # 开发服务器(默认 3000,已代理 /admin/api 到 8787) +npm run typecheck # vue-tsc 类型检查 +npm run build # 生成静态产物到 server/adminui +``` + +或在仓库根执行 `./buildadmin.sh` 一键构建(缺依赖会先 `npm ci`)。 + +### 8.2 构建产物生命周期 + +``` +web/app/** ──npm run build──► server/adminui/** ──go:embed──► 二进制 + (源码,提交) (产物,提交) (go build) +``` + +- 两者都提交;CI 会在 Go 构建前重新生成产物并覆盖,确保校验的是最新源码。 +- 本地只需保证「改了 `web/` 就一定跑过 `./buildadmin.sh` 并提交产物」。 +- 排查页面 404/资源 404:确认 `server/adminui/index.html` 与 `_nuxt/` 已存在且被提交。 + +--- + +## 9. 提交前检查清单(本地与 CI 同等) + +```bash +gofmt -l . # 必须无输出(注意:仓库统一 CRLF,Linux CI 下为 LF) +go vet ./... +go test ./... +go build ./... + +cd web && npm run typecheck && npm run build # 前端(改了 web/ 时) +``` + +> Windows 本地 `go test ./...` 会因文件权限校验(`TestLoadPermCheck` 等)失败, +> 这是平台差异(`chmod` 在 Windows 为 no-op);Linux CI 下正常。可用 +> `LIAPI_SKIP_PERM_CHECK=1` 跳过相关校验后在本地跑其余测试。 + +**推送:** + +```bash +git branch --show-current # 必须是 beta +git add +git commit -m "..." +git push origin beta # 只推 beta +``` + +--- + +## 10. 测试指南 + +- 测试与被测文件同目录:`foo.go` → `foo_test.go`。 +- 需覆盖的核心逻辑:路由(fallback 链、策略、别名、group、健康过滤)、 + 重试/故障转移分类、限流/配额窗口、配置校验、设备鉴权、管理台 SPA 托管。 +- HTTP/转发类测试用 `httptest` 起假上游(可注入失败/延迟/SSE)。 +- 时间相关逻辑用注入时钟(如 `SetNow`),**不要**用 `time.Sleep`。 +- 临时产物(health/log 文件)写入临时目录(`t.TempDir()`),勿污染仓库。 +- 共享测试桩在 `server/helpers_test.go`、`stats/testhelpers_test.go`: + `newTestServer` 装配完整 Server,`serve`/`do` 发送请求,`newOKUpstream` 起假上游。 + +--- + +## 11. CI 与发布流程 + +### 11.1 CI(`.github/workflows/ci.yml`) + +在所有分支 push 与 PR 上运行两个 job: + +1. `frontend`(Node 22):`npm ci` → `npm run typecheck` → `npm run build`, + 上传 `server/adminui` 为 artifact。 +2. `test`(Go stable,`needs: frontend`):下载 artifact 覆盖 `server/adminui`, + 再执行 `gofmt -l .` / `go vet` / `go test` / `go build`,确保内嵌的是最新产物。 + +### 11.2 自动发布(`publish` job,仅 beta) + +- 触发条件:`push` 且 `ref == refs/heads/beta`,且 `frontend` + `test` 均通过。 +- 行为:交叉编译 6 个常用平台(linux/windows/darwin × amd64/arm64), + 版本号注入 `beta-`,**覆盖式**发布到固定 tag `beta-latest` 的**正式 Release**。 +- 每次发布前清空旧资产,保证 `beta-latest` 只保留最新提交的产物 + `checksums.txt`。 +- `make_latest: false`:不抢占版本化 Release 的 "Latest" 徽章。 + +### 11.3 版本化发布(`.github/workflows/release.yml`,打 tag) + +1. 维护者切 tag(如 `vX.Y.Z`)并推送。 +2. `release.yml` 先构建前端,再枚举 `go tool dist list`,Linux/macOS runner 并行 + 交叉编译(Android 下载/缓存 NDK;iOS 用 Xcode clang 输出 c-archive)。 +3. 汇总产物 + `checksums.txt`,用 `softprops/action-gh-release` 发布 Release, + 版本注入 `-X main.version=`。 + +> 发布/合并涉及 `main` 的操作只能由维护者通过受控流程执行; +> 日常开发一律停留在 `beta`(见第 0 节铁律)。 + +--- + +## 12. 修改配置 schema 的注意事项 + +- 新增/变更字段:同步更新 `config/config.go` 的 struct 与 `Validate()`, + 并在 `README.md` 字段表补充说明与迁移影响。 +- 若字段出现在管理台表单:同步更新 `web/app/types/api.ts`、`web/app/pages/config.vue` + 的 `form`/`readForm()`/`buildConfig()`(或对应专页组件)。 +- 兼容旧配置:`buildConfig()` 以 JSON 视图为基底,未加入表单的新字段会透传, + 不会因表单遗漏而被抹掉;但仍应把常用字段补进表单以便可视化编辑。 +- 密钥类字段需在 `server/handler_admin.go` 的 `adminGetConfig` 脱敏、在 + `resolveMaskedSecrets` 还原(如 `admin_password_hash` 已在两处处理)。 +- 未讨论不得改动 `go` directive。 +- 保持零第三方依赖(Go 侧);确需功能时优先在树内实现。 + +--- + +*本文档随开发演进修订。功能规格以 README 为准,协作规范以 CONTRIBUTING 为准。* diff --git a/Dockerfile b/Dockerfile index 8259d53..43eb5a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,20 @@ +# ---- frontend (Nuxt admin SPA) ---- +FROM node:22-alpine AS frontend +WORKDIR /web +COPY web/package.json web/package-lock.json* ./ +RUN npm ci +COPY web/ ./ +# Outputs to ../server/adminui relative to web/ +RUN npm run build + # ---- build ---- FROM golang:1.22-alpine AS build WORKDIR /src COPY go.mod ./ RUN go mod download 2>/dev/null || true COPY . . +# Overlay the freshly built admin SPA over whatever is committed. +COPY --from=frontend /server/adminui ./server/adminui RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/liapi . # ---- run ---- diff --git a/README.md b/README.md index 20936b4..4102dbb 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ liapi/ │ └── admin.go # 管理 token 校验(独立) ├── routing/ │ ├── router.go # 候选收集 → priority 升序 → 组内加权随机打散 -│ └── aliases.go # (P2)模型别名 / 参数覆写 +│ └── router_test.go # 别名 / fallback / 策略 / group 测试 ├── relay/ │ ├── relay.go # 转发主循环(含故障转移 / 重试) │ ├── stream.go # SSE 流式复制(32KB 缓冲 + Flusher) @@ -97,12 +97,12 @@ liapi/ │ ├── server.go # ServeMux 路由注册(Go 1.22 方法路由) │ ├── handler_v1.go # /v1/chat/completions、completions、embeddings、 │ │ # messages、models 的实现 -│ └── handler_admin.go # /admin/api/* -├── adminui/ -│ └── index.html # 单文件管理台(go:embed 打包) +│ ├── handler_admin.go # /admin/api/* + SPA 静态托管 +│ └── adminui/ # 管理台构建产物(go:embed all:adminui) +├── web/ # 管理台源码(Nuxt 4 + fuxsto-design) ├── stats/ │ ├── logger.go # JSONL 写文件 + 环形缓冲(数组+取模) -│ ├── limiter.go # 固定窗口限流 map[token]{count,reset} + 定期清理 +│ ├── limiter.go # 滑动窗口限流 + 定期清理 │ ├── health.go # 后台探测 goroutine,内存 map 存状态 │ └── totals.go # 全量计数/用量/费用的原子聚合 └── README.md @@ -135,7 +135,9 @@ liapi/ "health_state_file": "health_state.json", // 健康状态持久化文件 "skip_unhealthy": true, // 路由时避开不健康上游(可开关) - "admin_token": "adm-sk-xxxxxxxx", // 管理接口鉴权(独立) + "admin_token": "adm-sk-xxxxxxxx", // 管理接口鉴权(独立);保留给 /metrics 与脚本 + "admin_username": "admin", // 管理台登录用户名 + "admin_password_hash": "pbkdf2-sha256$…", // 管理台登录密码(PBKDF2 哈希,不明文存储) "admin_rate_per_minute": 60, // 管理接口按 IP 限流(-1=关闭,0/未设=默认60) "admin_allow_ips": [], // 管理接口 IP/CIDR 白名单,空=不限 "metrics_token": "", // /metrics 鉴权 token;"-"=内网免鉴权; @@ -231,6 +233,8 @@ liapi/ | 字段 | 说明 | |---|---| +| `admin_username` / `admin_password_hash` | 管理台登录账号;密码只存 PBKDF2-HMAC-SHA256 加盐哈希,首次运行自动生成并在终端打印一次 | +| `admin_token` | 静态管理 token,保留给 `/metrics` 与脚本自动化;日常登录改用用户名+密码 | | `admin_rate_per_minute` | 管理 API 每 IP 每分钟请求数(防暴力破解);`-1`=关闭,`0`/未设=默认 60 | | `admin_allow_ips` | 管理 API IP/CIDR 白名单;同时用于是否信任 `X-Forwarded-For` | | `metrics_token` | `/metrics` 鉴权;`"-"`=免鉴权;未设置=要求 admin token | @@ -279,7 +283,8 @@ r.Context() ### 6.2 鉴权细节 -- 读取顺序:`Authorization: Bearer ` → `x-api-key: ` → `?token=`。 +- **管理台登录**:用户名 + 密码。密码以 PBKDF2-HMAC-SHA256(随机盐,21 万次迭代)哈希存储(`admin_password_hash`),登录成功后签发**短期会话 token**(`sess-…`,默认 12 小时),前端存 `localStorage` 并随请求以 `Authorization: Bearer` 发送。退出登录即服务端失效该会话。静态 `admin_token` 仍可用(保留给 `/metrics` 与脚本)。 +- **业务 API**:读取顺序:`Authorization: Bearer ` → `x-api-key: ` → `?token=`;这些 token 用于调用模型,与登录账号分离。 - `Bearer` 前缀**大小写不敏感**。 - 比较用 **SHA-256 摘要 + `crypto/subtle.ConstantTimeCompare`**,避免时序攻击与长度侧信道。 - token 脱敏:`sk-abc12345xyz` → `sk-ab...xyz` 后再进日志。 @@ -370,11 +375,14 @@ return failAll(lastErr) # 502 或透传最后一次的 sta ### 7.2 管理 API(独立 admin token) -除列表/查看外,管理 API 受 **IP 白名单 + 每 IP 限流(默认 60/min)+ admin token** 三层保护。 +除列表/查看外,管理 API 受 **IP 白名单 + 每 IP 限流(默认 60/min)+ 登录会话或 admin token** 三层保护。 | 路径 | 方法 | 说明 | |---|---|---| -| `/` | GET | 管理台单页(go:embed,含设备/统计/配置编辑);`/admin` 301 → `/` | +| `/` | GET | 管理台 SPA(Nuxt 静态构建,go:embed;含设备/统计/配置编辑);`/admin` 301 → `/` | +| `/admin/api/login` | POST | 登录:`{username,password}` → 短期会话 token(受 IP 白名单/锁定/限流保护) | +| `/admin/api/logout` | POST | 退出登录:使当前会话 token 失效 | +| `/admin/api/me` | GET | 返回当前登录用户名 | | `/admin/api/overview` | GET | 请求数 / 成功率 / 平均延迟 / token 量 / 费用 / 故障转移数 | | `/admin/api/upstreams` | GET | 上游列表(api_key 脱敏) | | `/admin/api/upstreams` | POST | 新增上游 | @@ -402,7 +410,7 @@ return failAll(lastErr) # 502 或透传最后一次的 sta | `/admin/api/stats/devices?n=` | GET | 设备用量排行 | | `/metrics` | GET | Prometheus 文本格式;`metrics_token`(`"-"`=免鉴权)或 admin token | -管理台前端把 admin token 存 `localStorage`,每次请求带 `Authorization: Bearer `。**管理 token 与客户端 token 严格分离**。 +管理台前端通过独立的 `/login` 登录页输入**用户名 + 密码**(校验通过后服务端签发短期会话 token,存 `localStorage`,每次请求带 `Authorization: Bearer `);未登录访问任意页面会自动跳转登录页,不使用浏览器原生对话框。**管理登录账号与调用模型的客户端 token 严格分离**:前者只登管理台,后者(`devices[]` / `client_tokens[]`)只用于 `/v1/*` 调用模型。 ### 7.3 部署(Docker) @@ -449,6 +457,11 @@ docker build -t liapi . && docker run -p 8787:8787 -v "$PWD/data:/data" liapi 单 HTML(CSS+JS 内联),`go:embed` 进二进制,零构建。Tabs:概览 / 上游 / 令牌 / 日志 / 调试 / 健康。 +> **v2**:管理台已重写为 Nuxt 4 + fuxsto-design 的静态 SPA(源码在 `web/`, +> 产物在 `server/adminui/`,`go:embed all:adminui` 打包;构建见 `./buildadmin.sh`)。 +> 布局参考 NewApi(侧边栏 + 顶栏 + 页面过渡动画),功能覆盖概览 / 上游 / 令牌 / +> 设备 / 统计 / 日志 / 健康 / 配置 / 调试。 + ### P1-9 配置热重载 - 所有请求从 `Holder.Get()` 现取,不缓存。 @@ -532,9 +545,11 @@ docker build -t liapi . && docker run -p 8787:8787 -v "$PWD/data:/data" liapi ## 十四、运行方式 ```bash -# 首次运行自动生成默认 config.json(含随机 admin_token,打印到控制台) +# 首次运行自动生成默认 config.json(随机 admin_token + 随机 admin 账号密码, +# 用户名默认为 admin,密码在控制台方框中醒目打印,仅显示这一次) go build -o liapi ./... ./liapi -config config.json +# 想隐藏明文(共享日志/录屏):LIAPI_MASK_ADMIN_TOKEN=1 ./liapi -config config.json # 冒烟 curl http://localhost:8787/v1/models -H "Authorization: Bearer sk-client-aaa" @@ -551,12 +566,15 @@ open http://localhost:8787/ ``` main.go server/handler_v1.go routing/router.go -config/config.go server/handler_admin.go routing/aliases.go -config/holder.go server/server.go relay/relay.go -auth/auth.go stats/logger.go relay/stream.go -auth/admin.go stats/limiter.go relay/usage.go -common/errors.go stats/health.go relay/http.go -common/token.go stats/totals.go adminui/index.html +config/config.go server/handler_admin.go relay/relay.go +config/holder.go server/server.go relay/stream.go +config/interop.go server/requestid.go relay/usage.go +auth/auth.go server/adminui/ (SPA) relay/http.go +auth/admin.go web/ (Nuxt 源码) stats/logger.go +common/errors.go stats/aggregate.go stats/limiter.go +common/token.go stats/metrics.go stats/quota.go +stats/health.go stats/alerts.go stats/audit.go +stats/totals.go ``` --- diff --git a/auth/admin.go b/auth/admin.go index 575d19a..26b3ca2 100644 --- a/auth/admin.go +++ b/auth/admin.go @@ -2,6 +2,7 @@ package auth import ( "net/http" + "strings" "sync" "time" @@ -13,6 +14,9 @@ const ( defaultLockoutFailures = 5 defaultLockoutWindow = 5 * time.Minute defaultLockoutDuration = 15 * time.Minute + + // defaultSessionTTL bounds how long a login session stays valid. + defaultSessionTTL = 12 * time.Hour ) type lockState struct { @@ -21,17 +25,92 @@ type lockState struct { lockedUntil time.Time } -// Admin validates the separate admin token used for /admin/api/*, with -// per-IP lockout after repeated failures (brute-force protection). +type session struct { + username string + expiresAt time.Time +} + +// Admin validates access to /admin/api/* and the admin UI. +// +// Two credentials are accepted: +// - a browser login session token (issued by Login, short-lived), and +// - the static admin_token from config (kept for /metrics and scripts). type Admin struct { holder *config.Holder - mu sync.Mutex - locks map[string]*lockState + mu sync.Mutex + locks map[string]*lockState + sessions map[string]*session + ttl time.Duration } func NewAdmin(holder *config.Holder) *Admin { - return &Admin{holder: holder, locks: make(map[string]*lockState)} + return &Admin{ + holder: holder, + locks: make(map[string]*lockState), + sessions: make(map[string]*session), + ttl: defaultSessionTTL, + } +} + +// SetSessionTTL overrides the default session lifetime (tests, tuning). +func (a *Admin) SetSessionTTL(d time.Duration) { + if d > 0 { + a.ttl = d + } +} + +// Login validates username/password against the configured admin credentials +// and, on success, returns a fresh session token. The second result is false +// when the credentials are wrong or no password login is configured. +func (a *Admin) Login(username, password string) (string, bool) { + cfg := a.holder.Get() + if cfg.AdminPasswordHash == "" { + return "", false + } + if !common.TokenEqual(cfg.AdminUsername, strings.TrimSpace(username)) { + return "", false + } + if !common.VerifyPassword(cfg.AdminPasswordHash, password) { + return "", false + } + tok := common.RandomToken("sess-") + now := time.Now() + a.mu.Lock() + // Opportunistically drop expired sessions so the map stays bounded. + for k, s := range a.sessions { + if now.After(s.expiresAt) { + delete(a.sessions, k) + } + } + a.sessions[tok] = &session{username: cfg.AdminUsername, expiresAt: now.Add(a.ttl)} + a.mu.Unlock() + return tok, true +} + +// Logout invalidates a session token (no-op if unknown). +func (a *Admin) Logout(token string) { + a.mu.Lock() + delete(a.sessions, token) + a.mu.Unlock() +} + +// sessionValid reports whether token is a live login session. +func (a *Admin) sessionValid(token string) bool { + if token == "" { + return false + } + a.mu.Lock() + defer a.mu.Unlock() + s := a.sessions[token] + if s == nil { + return false + } + if time.Now().After(s.expiresAt) { + delete(a.sessions, token) + return false + } + return true } // Locked reports whether ip is currently locked out (and for how long). @@ -78,16 +157,32 @@ func (a *Admin) ClearFailures(ip string) { a.mu.Unlock() } +// Credential extracts the admin credential from the request, checking: +// 1. Authorization: Bearer +// 2. x-admin-token: +// 3. ?token= +func (a *Admin) Credential(r *http.Request) string { + if t := bearerFromHeader(r.Header.Get("Authorization")); t != "" { + return t + } + if t := strings.TrimSpace(r.Header.Get("x-admin-token")); t != "" { + return t + } + return strings.TrimSpace(r.URL.Query().Get("token")) +} + +// Authenticate accepts either a live login session token or the static +// admin token. The admin token remains valid for /metrics and automation. func (a *Admin) Authenticate(r *http.Request) bool { - cfg := a.holder.Get() - if cfg.AdminToken == "" { + t := a.Credential(r) + if t == "" { return false } - t := bearerFromHeader(r.Header.Get("Authorization")) - if t == "" { - t = r.Header.Get("x-admin-token") + if strings.HasPrefix(t, "sess-") { + return a.sessionValid(t) } - if t == "" { + cfg := a.holder.Get() + if cfg.AdminToken == "" { return false } return common.TokenEqual(cfg.AdminToken, t) diff --git a/auth/auth_test.go b/auth/auth_test.go index c59630a..1672134 100644 --- a/auth/auth_test.go +++ b/auth/auth_test.go @@ -3,6 +3,7 @@ package auth import ( "net/http/httptest" "testing" + "time" "liapi/common" "liapi/config" @@ -92,3 +93,80 @@ func TestHashEqual(t *testing.T) { t.Fatal("mismatching hash") } } + +func TestAdminLoginAndSession(t *testing.T) { + hash, err := common.HashPassword("hunter2") + if err != nil { + t.Fatal(err) + } + cfg := &config.Config{ + AdminToken: "adm-static-token", + AdminUsername: "alice", + AdminPasswordHash: hash, + } + cfg.SetDefaults() + cfg.AdminToken = "adm-static-token" + cfg.AdminUsername = "alice" + cfg.AdminPasswordHash = hash + h := config.NewHolder(cfg) + a := NewAdmin(h) + + // Wrong password / username rejected. + if _, ok := a.Login("alice", "nope"); ok { + t.Fatal("wrong password must fail") + } + if _, ok := a.Login("bob", "hunter2"); ok { + t.Fatal("wrong username must fail") + } + + // Correct credentials issue a session token that authenticates. + tok, ok := a.Login("alice", "hunter2") + if !ok || tok == "" { + t.Fatal("valid login should issue a token") + } + r := httptest.NewRequest("GET", "/admin/api/overview", nil) + r.Header.Set("Authorization", "Bearer "+tok) + if !a.Authenticate(r) { + t.Fatal("session token should authenticate") + } + + // Static admin token still works (for /metrics and scripts). + r2 := httptest.NewRequest("GET", "/metrics", nil) + r2.Header.Set("x-admin-token", "adm-static-token") + if !a.Authenticate(r2) { + t.Fatal("static admin token should still authenticate") + } + + // Unknown/garbage token rejected. + r3 := httptest.NewRequest("GET", "/x", nil) + r3.Header.Set("Authorization", "Bearer sess-garbage") + if a.Authenticate(r3) { + t.Fatal("unknown session token must fail") + } + + // Logout invalidates the session. + a.Logout(tok) + if a.Authenticate(r) { + t.Fatal("logged-out session must fail") + } +} + +func TestAdminSessionExpiry(t *testing.T) { + hash, _ := common.HashPassword("pw") + cfg := &config.Config{AdminUsername: "u", AdminPasswordHash: hash} + cfg.SetDefaults() + cfg.AdminUsername = "u" + cfg.AdminPasswordHash = hash + a := NewAdmin(config.NewHolder(cfg)) + a.SetSessionTTL(time.Nanosecond) + tok, ok := a.Login("u", "pw") + if !ok { + t.Fatal("login should succeed") + } + time.Sleep(2 * time.Millisecond) + r := httptest.NewRequest("GET", "/x", nil) + r.Header.Set("Authorization", "Bearer "+tok) + if a.Authenticate(r) { + t.Fatal("expired session must fail") + } +} diff --git a/buildadmin.sh b/buildadmin.sh new file mode 100644 index 0000000..13b3f6d --- /dev/null +++ b/buildadmin.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# Build the Nuxt admin SPA into server/adminui so the Go binary can embed it. +# The generated assets ARE committed (CI/Docker build Go without Node), so run +# this whenever the frontend changes and commit the result. +set -euo pipefail + +here="$(cd "$(dirname "$0")" && pwd)" +web="$here/web" + +if [ ! -d "$web/node_modules" ]; then + echo "==> installing frontend deps (npm ci)" + (cd "$web" && npm ci) +fi + +echo "==> building admin SPA (nuxt generate)" +(cd "$web" && npm run build) + +echo "==> done. Output embedded from server/adminui/" +echo " Remember to commit server/adminui/ changes." diff --git a/common/password.go b/common/password.go new file mode 100644 index 0000000..16a0d26 --- /dev/null +++ b/common/password.go @@ -0,0 +1,128 @@ +package common + +import ( + "crypto/hmac" + "crypto/rand" + "crypto/sha256" + "crypto/subtle" + "encoding/base64" + "encoding/hex" + "errors" + "hash" + "strconv" + "strings" +) + +// Password hashing (admin UI login). Passwords are never stored in plaintext: +// only a PBKDF2-HMAC-SHA256 digest with a random per-account salt is persisted. +// +// The encoded form is a self-describing string so parameters can change over +// time without breaking existing hashes: +// +// pbkdf2-sha256$$$ +// +// This is implemented on top of crypto/hmac + crypto/sha256 to stay compatible +// with the module's `go 1.22` directive (crypto/pbkdf2 landed later). + +const ( + // pbkdf2Iterations is the default work factor. Tuned to stay well under + // 100ms on commodity hardware while resisting offline brute force. + pbkdf2Iterations = 210000 + pbkdf2SaltLen = 16 + pbkdf2KeyLen = 32 + pbkdf2Prefix = "pbkdf2-sha256" +) + +// pbkdf2 implements PBKDF2 (RFC 2898) over a hash constructor, using HMAC. +func pbkdf2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { + prf := hmac.New(h, password) + hashLen := prf.Size() + numBlocks := (keyLen + hashLen - 1) / hashLen + + var buf [4]byte + dk := make([]byte, 0, numBlocks*hashLen) + u := make([]byte, hashLen) + for block := 1; block <= numBlocks; block++ { + prf.Reset() + prf.Write(salt) + buf[0] = byte(block >> 24) + buf[1] = byte(block >> 16) + buf[2] = byte(block >> 8) + buf[3] = byte(block) + prf.Write(buf[:4]) + dk = prf.Sum(dk) + t := dk[len(dk)-hashLen:] + copy(u, t) + + for n := 2; n <= iter; n++ { + prf.Reset() + prf.Write(u) + u = u[:0] + u = prf.Sum(u) + for x := range u { + t[x] ^= u[x] + } + } + } + return dk[:keyLen] +} + +// HashPassword derives a storable PBKDF2 digest from a plaintext password. +// The returned string embeds the salt and iteration count. +func HashPassword(password string) (string, error) { + if password == "" { + return "", errors.New("password must not be empty") + } + salt := make([]byte, pbkdf2SaltLen) + if _, err := rand.Read(salt); err != nil { + return "", err + } + dk := pbkdf2([]byte(password), salt, pbkdf2Iterations, pbkdf2KeyLen, sha256.New) + return strings.Join([]string{ + pbkdf2Prefix, + strconv.Itoa(pbkdf2Iterations), + base64.RawStdEncoding.EncodeToString(salt), + base64.RawStdEncoding.EncodeToString(dk), + }, "$"), nil +} + +// VerifyPassword reports whether password matches the encoded PBKDF2 digest. +// Comparison is constant time. Malformed encodings fail closed (return false). +func VerifyPassword(encoded, password string) bool { + parts := strings.Split(encoded, "$") + if len(parts) != 4 || parts[0] != pbkdf2Prefix { + return false + } + iter, err := strconv.Atoi(parts[1]) + if err != nil || iter <= 0 { + return false + } + salt, err := base64.RawStdEncoding.DecodeString(parts[2]) + if err != nil { + return false + } + want, err := base64.RawStdEncoding.DecodeString(parts[3]) + if err != nil || len(want) == 0 { + return false + } + got := pbkdf2([]byte(password), salt, iter, len(want), sha256.New) + return subtle.ConstantTimeCompare(got, want) == 1 +} + +// IsPasswordHash reports whether s looks like an encoded PBKDF2 digest +// (used to distinguish a real hash from a masked/empty value). +func IsPasswordHash(s string) bool { + parts := strings.Split(s, "$") + return len(parts) == 4 && parts[0] == pbkdf2Prefix && parts[1] != "" && + parts[2] != "" && parts[3] != "" +} + +// RandomPassword returns a URL-safe random password (base64 of 18 bytes). +// Used to seed the first-run admin credentials. +func RandomPassword() string { + b := make([]byte, 18) + if _, err := rand.Read(b); err != nil { + return "changeme-" + hex.EncodeToString([]byte{1, 2, 3, 4}) + } + return base64.RawURLEncoding.EncodeToString(b) +} diff --git a/common/password_test.go b/common/password_test.go new file mode 100644 index 0000000..6a07fd8 --- /dev/null +++ b/common/password_test.go @@ -0,0 +1,45 @@ +package common + +import "testing" + +func TestHashAndVerifyPassword(t *testing.T) { + enc, err := HashPassword("s3cret-pass") + if err != nil { + t.Fatal(err) + } + if !IsPasswordHash(enc) { + t.Fatalf("encoded hash not recognized: %q", enc) + } + if VerifyPassword(enc, "s3cret-pass") != true { + t.Fatal("correct password should verify") + } + if VerifyPassword(enc, "wrong") { + t.Fatal("wrong password must not verify") + } + // Distinct salts → distinct encodings for the same password. + enc2, _ := HashPassword("s3cret-pass") + if enc == enc2 { + t.Fatal("salts should differ between hashes") + } +} + +func TestVerifyPasswordMalformed(t *testing.T) { + for _, bad := range []string{"", "plaintext", "pbkdf2-sha256$0$aa$bb", "md5$1$aa$bb", "pbkdf2-sha256$x$aa$bb"} { + if VerifyPassword(bad, "x") { + t.Fatalf("malformed hash must fail closed: %q", bad) + } + } +} + +func TestHashPasswordEmpty(t *testing.T) { + if _, err := HashPassword(""); err == nil { + t.Fatal("empty password must be rejected") + } +} + +func TestRandomPassword(t *testing.T) { + a, b := RandomPassword(), RandomPassword() + if a == "" || a == b { + t.Fatalf("random passwords should be non-empty and unique: %q %q", a, b) + } +} diff --git a/config/config.go b/config/config.go index ac7e09d..29bfbad 100644 --- a/config/config.go +++ b/config/config.go @@ -140,6 +140,8 @@ type Config struct { HealthStateFile string `json:"health_state_file"` SkipUnhealthy bool `json:"skip_unhealthy"` AdminToken string `json:"admin_token"` + AdminUsername string `json:"admin_username"` + AdminPasswordHash string `json:"admin_password_hash"` AdminRatePerMinute int `json:"admin_rate_per_minute"` AdminAllowIPs []string `json:"admin_allow_ips"` MetricsToken string `json:"metrics_token"` @@ -159,6 +161,11 @@ type Config struct { RetryOnTimeout bool `json:"retry_on_timeout"` Upstreams []Upstream `json:"upstreams"` Devices []Device `json:"devices"` + + // FirstRunPassword carries a freshly generated admin password in cleartext + // for one startup only (printed in the terminal banner). It is never + // persisted: json:"-" and cleared by main.go after printing. + FirstRunPassword string `json:"-"` } func (c *Config) SetDefaults() { @@ -265,6 +272,24 @@ func (c *Config) Validate() error { if c.AdminToken == "" { c.AdminToken = common.RandomToken("adm-") } + if strings.TrimSpace(c.AdminUsername) == "" { + c.AdminUsername = "admin" + } + // First run: seed admin login credentials. The plaintext password is + // surfaced once via FirstRunPassword (printed by main.go), then discarded. + if c.AdminPasswordHash == "" { + pw := common.RandomPassword() + hash, err := common.HashPassword(pw) + if err != nil { + return fmt.Errorf("generate admin password: %w", err) + } + c.AdminPasswordHash = hash + c.FirstRunPassword = pw + } else if !common.IsPasswordHash(c.AdminPasswordHash) && !strings.Contains(c.AdminPasswordHash, "...") { + // Masked placeholders (e.g. "admi...hash") are restored by the server + // after validation; only genuinely malformed values are rejected. + return errors.New("admin_password_hash: malformed (expected pbkdf2-sha256$...)") + } if c.RateLimitPerMinute < 0 { return errors.New("rate_limit_per_minute must be >= 0") } diff --git a/main.go b/main.go index 19ad110..da2017b 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,26 @@ import ( // version is overridden at link time by buildrelease.sh (-X main.version=…). var version = "dev" +// printAdminBanner surfaces how to log in to the admin UI. The login account +// is username/password; on first run the generated password is shown once here +// (it is never stored in plaintext). The static admin token is also printed as +// a fallback credential for /metrics and automation. +func printAdminBanner(cfg *config.Config, configPath string) { + token := cfg.AdminToken + if os.Getenv("LIAPI_MASK_ADMIN_TOKEN") == "1" { + token = common.MaskToken(cfg.AdminToken) + " (masked; see " + configPath + ")" + } + pw := "(unchanged — set via 管理台 配置页)" + if cfg.FirstRunPassword != "" { + pw = cfg.FirstRunPassword + " (首次生成,仅显示这一次)" + } else if os.Getenv("LIAPI_MASK_ADMIN_TOKEN") == "1" { + pw = "(masked; reset via config)" + } + const bar = "════════════════════════════════════════════════════════════════" + log.Printf("\n%s\n Liapi 管理台 http://%s/\n\n 登录入口 http://%s/\n 用户名 %s\n 密码 %s\n\n Admin Token : %s\n (Token 仅用于 /metrics 与脚本;日常登录用用户名+密码)\n%s", + bar, cfg.Addr, cfg.Addr, cfg.AdminUsername, pw, token, bar) +} + func main() { configPath := flag.String("config", "config.json", "path to config file") showVer := flag.Bool("version", false, "print version and exit") @@ -39,11 +59,13 @@ func main() { if len(cfg.ClientTokens) == 0 && len(cfg.Devices) == 0 { log.Printf("[warn] no client_tokens/devices configured yet — all /v1/* requests will be rejected") } - // Never log raw secrets: mask the admin token. - log.Printf("config loaded from %s (admin_token=%s)", *configPath, common.MaskToken(cfg.AdminToken)) holder := config.NewHolder(cfg) + log.Printf("config loaded from %s", *configPath) + printAdminBanner(cfg, *configPath) + cfg.FirstRunPassword = "" + logger, err := stats.NewLogger(cfg.LogFile, cfg.RingSize, cfg.LogMaxBytes) if err != nil { log.Fatalf("open log file %s: %v", cfg.LogFile, err) diff --git a/server/adminui/200.html b/server/adminui/200.html new file mode 100644 index 0000000..9230448 --- /dev/null +++ b/server/adminui/200.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/404.html b/server/adminui/404.html new file mode 100644 index 0000000..9230448 --- /dev/null +++ b/server/adminui/404.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/_nuxt/11441PgY.js b/server/adminui/_nuxt/11441PgY.js new file mode 100644 index 0000000..52699de --- /dev/null +++ b/server/adminui/_nuxt/11441PgY.js @@ -0,0 +1 @@ +import{$ as e,J as t,M as n,P as r,g as i,h as a,kt as o,l as s,nt as c,u as l,ut as u,v as d}from"./Bx_a1Ri3.js";import{t as f}from"./CjfA7_9d.js";import{r as p,t as m}from"./DQKjIeim.js";import{t as h}from"./D2-o7L18.js";import{t as g}from"./D-_L2MRs.js";import{t as _}from"./D5UXUZnN.js";import{t as v}from"./NDcEePfh.js";import{t as y}from"./nj6DwLzD.js";import{t as b}from"./C8yIGsZb.js";import{i as x,n as S,r as C}from"./zZGEHylc.js";var w={class:`flex flex-wrap items-center gap-3 px-5 py-4`},T={class:`ml-auto flex flex-wrap items-center gap-2`},E={class:`w-64`},D={class:`w-32`},O={class:`px-5 pb-5`},k={class:`text-xs text-muted-foreground`},A={class:`text-xs text-muted-foreground`},j=d({__name:`logs`,setup(d){let{request:j}=y(),{handleError:M}=m(),N=c([]),P=c(!0),F=c(``),I=c(``),L=[{label:`全部状态`,value:``},{label:`200`,value:`200`},{label:`400`,value:`400`},{label:`401`,value:`401`},{label:`429`,value:`429`},{label:`500`,value:`500`},{label:`502`,value:`502`},{label:`504`,value:`504`}],R=[{key:`time`,title:`时间`,width:90},{key:`token`,title:`Token`,width:110},{key:`model`,title:`模型`},{key:`upstream`,title:`上游`,width:120},{key:`status`,title:`状态`,width:80},{key:`stream`,title:`流`,width:50},{key:`latency_ms`,title:`延迟`,width:80},{key:`io`,title:`in/out`,width:110},{key:`error`,title:`错误`}],z;async function B(){try{let e=`/logs?n=200`;F.value.trim()&&(e+=`&q=`+encodeURIComponent(F.value.trim())),I.value&&(e+=`&status=`+encodeURIComponent(I.value)),N.value=await j(e)}catch(e){M(e)}finally{P.value=!1}}function V(){clearTimeout(z),z=setTimeout(B,300)}return n(B),(n,c)=>(r(),l(u(p),{padding:`none`},{header:t(()=>[s(`div`,w,[c[3]||=s(`h2`,{class:`text-sm font-semibold`},`最近日志`,-1),s(`div`,T,[s(`div`,E,[i(u(g),{modelValue:u(F),"onUpdate:modelValue":c[0]||=t=>e(F)?F.value=t:null,size:`sm`,placeholder:`搜索 model / 上游 / 错误 / token…`,onInput:V},null,8,[`modelValue`])]),s(`div`,D,[i(u(v),{modelValue:u(I),"onUpdate:modelValue":c[1]||=t=>e(I)?I.value=t:null,options:L,size:`sm`,onChange:B},null,8,[`modelValue`])]),i(u(h),{variant:`outline`,size:`sm`,icon:u(_),onClick:B},{default:t(()=>[...c[2]||=[a(` 刷新 `,-1)]]),_:1},8,[`icon`])])])]),default:t(()=>[s(`div`,O,[i(u(f),{columns:R,data:u(N),size:`sm`,hover:``,loading:u(P),"empty-text":`暂无日志。`},{"cell-time":t(({row:e})=>[a(o(u(C)(e.time)),1)]),"cell-token":t(({row:e})=>[s(`span`,k,o(e.token),1)]),"cell-upstream":t(({row:e})=>[a(o(e.upstream||`-`),1)]),"cell-status":t(({row:e})=>[i(u(b),{size:`sm`,variant:u(x)(e.status)===`success`?`primary`:`outline`},{default:t(()=>[a(o(e.status),1)]),_:2},1032,[`variant`])]),"cell-stream":t(({row:e})=>[a(o(e.stream?`Y`:``),1)]),"cell-latency_ms":t(({row:e})=>[a(o(e.latency_ms)+`ms`,1)]),"cell-io":t(({row:e})=>[a(o(u(S)(e.in_tokens))+`/`+o(u(S)(e.out_tokens)),1)]),"cell-error":t(({row:e})=>[s(`span`,A,o(e.error),1)]),_:1},8,[`data`,`loading`])])]),_:1}))}});export{j as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/B2oFgaBj.js b/server/adminui/_nuxt/B2oFgaBj.js new file mode 100644 index 0000000..d65541d --- /dev/null +++ b/server/adminui/_nuxt/B2oFgaBj.js @@ -0,0 +1 @@ +import{t as e}from"./BOgT-xSl.js";var t=e(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]);export{t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/BCSPyKdf.js b/server/adminui/_nuxt/BCSPyKdf.js new file mode 100644 index 0000000..bb219aa --- /dev/null +++ b/server/adminui/_nuxt/BCSPyKdf.js @@ -0,0 +1 @@ +import{J as e,M as t,P as n,f as r,g as i,h as a,kt as o,l as s,nt as c,ut as l,v as u}from"./Bx_a1Ri3.js";import{t as d}from"./BOgT-xSl.js";import{t as f}from"./DXIMwwdP.js";import{t as p}from"./CjfA7_9d.js";import{r as m,t as h}from"./DQKjIeim.js";import{t as g}from"./D2-o7L18.js";import{t as _}from"./D5UXUZnN.js";import{t as v}from"./nj6DwLzD.js";import{t as y}from"./C8yIGsZb.js";import{r as b}from"./zZGEHylc.js";var x=d(`shield-check`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),S={class:`space-y-4`},C={class:`flex items-center justify-between gap-3 px-5 py-4`},w={class:`flex items-center gap-2`},T={class:`px-5 pb-5`},E={class:`text-xs text-muted-foreground`},D={class:`flex items-center justify-between gap-3 px-5 py-4`},O={class:`px-5 pb-5`},k={class:`text-xs text-muted-foreground`},A={class:`flex items-center justify-between gap-3 px-5 py-4`},j={class:`flex items-center gap-2`},M={class:`px-5 pb-5`},N={class:`text-xs text-muted-foreground`},P=u({__name:`health`,setup(u){let{request:d}=v(),{toast:P,handleError:F}=h(),I=c([]),L=c([]),R=c([]),z=c(!0),B=c(!1);async function V(){try{let[e,t,n]=await Promise.all([d(`/health`),d(`/health/history?n=50`),d(`/audit?n=50`)]);I.value=e,L.value=t,R.value=n}catch(e){F(e)}finally{z.value=!1}}t(V);async function H(){B.value=!0;try{await d(`/health/probe`,{method:`POST`,body:`{}`}),P.success(`探测完成`),await V()}catch(e){F(e)}finally{B.value=!1}}let U=[{key:`name`,title:`上游`},{key:`ok`,title:`状态`,width:90},{key:`latency_ms`,title:`延迟`,width:90},{key:`consecutive_failures`,title:`连续失败`,width:90},{key:`last_check`,title:`最后检查`,width:180},{key:`error`,title:`错误`}],W=[{key:`time`,title:`时间`,width:90},{key:`name`,title:`上游`},{key:`ok`,title:`状态`,width:80},{key:`latency_ms`,title:`延迟`,width:80},{key:`source`,title:`来源`,width:80},{key:`error`,title:`错误`}],G=[{key:`time`,title:`时间`,width:90},{key:`ip`,title:`IP`,width:140},{key:`method`,title:`方法`,width:80},{key:`path`,title:`路径`},{key:`ok`,title:`结果`,width:80},{key:`reason`,title:`原因`}];return(t,c)=>(n(),r(`div`,S,[i(l(m),{padding:`none`},{header:e(()=>[s(`div`,C,[s(`div`,w,[i(l(f),{size:16,class:`text-muted-foreground`}),c[0]||=s(`h2`,{class:`text-sm font-semibold`},`上游健康状态`,-1)]),i(l(g),{variant:`primary`,size:`sm`,icon:l(_),loading:l(B),onClick:H},{default:e(()=>[...c[1]||=[a(` 立即探测 `,-1)]]),_:1},8,[`icon`,`loading`])])]),default:e(()=>[s(`div`,T,[i(l(p),{columns:U,data:l(I),size:`sm`,hover:``,loading:l(z),"empty-text":`没有启用的上游。`},{"cell-ok":e(({row:t})=>[i(l(y),{size:`sm`,variant:t.ok?`primary`:`outline`},{default:e(()=>[a(o(t.ok?`正常`:`异常`),1)]),_:2},1032,[`variant`])]),"cell-latency_ms":e(({row:e})=>[a(o(e.latency_ms)+`ms`,1)]),"cell-error":e(({row:e})=>[s(`span`,E,o(e.error),1)]),_:1},8,[`data`,`loading`])])]),_:1}),i(l(m),{padding:`none`},{header:e(()=>[s(`div`,D,[c[3]||=s(`h2`,{class:`text-sm font-semibold`},`探测历史`,-1),i(l(g),{variant:`outline`,size:`sm`,icon:l(_),onClick:V},{default:e(()=>[...c[2]||=[a(` 刷新 `,-1)]]),_:1},8,[`icon`])])]),default:e(()=>[s(`div`,O,[i(l(p),{columns:W,data:l(L),size:`sm`,hover:``,loading:l(z),"empty-text":`暂无探测记录。`},{"cell-time":e(({row:e})=>[a(o(l(b)(e.time)),1)]),"cell-ok":e(({row:t})=>[i(l(y),{size:`sm`,variant:t.ok?`primary`:`outline`},{default:e(()=>[a(o(t.ok?`正常`:`异常`),1)]),_:2},1032,[`variant`])]),"cell-latency_ms":e(({row:e})=>[a(o(e.latency_ms)+`ms`,1)]),"cell-source":e(({row:t})=>[i(l(y),{size:`sm`,variant:t.manual?`secondary`:`outline`},{default:e(()=>[a(o(t.manual?`手动`:`定时`),1)]),_:2},1032,[`variant`])]),"cell-error":e(({row:e})=>[s(`span`,k,o(e.error),1)]),_:1},8,[`data`,`loading`])])]),_:1}),i(l(m),{padding:`none`},{header:e(()=>[s(`div`,A,[s(`div`,j,[i(l(x),{size:16,class:`text-muted-foreground`}),c[4]||=s(`h2`,{class:`text-sm font-semibold`},`管理端审计日志`,-1)]),i(l(g),{variant:`outline`,size:`sm`,icon:l(_),onClick:V},{default:e(()=>[...c[5]||=[a(` 刷新 `,-1)]]),_:1},8,[`icon`])])]),default:e(()=>[s(`div`,M,[i(l(p),{columns:G,data:l(R),size:`sm`,hover:``,loading:l(z),"empty-text":`暂无审计记录。`},{"cell-time":e(({row:e})=>[a(o(l(b)(e.time)),1)]),"cell-ok":e(({row:t})=>[i(l(y),{size:`sm`,variant:t.ok?`primary`:`outline`},{default:e(()=>[a(o(t.ok?`成功`:`拒绝`),1)]),_:2},1032,[`variant`])]),"cell-reason":e(({row:e})=>[s(`span`,N,o(e.reason),1)]),_:1},8,[`data`,`loading`])])]),_:1})]))}});export{P as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/BH8nemMl.js b/server/adminui/_nuxt/BH8nemMl.js new file mode 100644 index 0000000..e4ab71e --- /dev/null +++ b/server/adminui/_nuxt/BH8nemMl.js @@ -0,0 +1 @@ +import{$ as e,J as t,M as n,P as r,d as i,g as a,h as o,kt as s,l as c,nt as l,tt as u,u as d,ut as f,v as p}from"./Bx_a1Ri3.js";import{t as m}from"./CjfA7_9d.js";import{r as h,t as g}from"./DQKjIeim.js";import{t as _}from"./D2-o7L18.js";import{t as v}from"./D-_L2MRs.js";import{n as y,t as b}from"./CMKGzL4T.js";import{t as x}from"./D5UXUZnN.js";import{t as S}from"./nj6DwLzD.js";import{n as C,t as w}from"./DeZOVV_X.js";import{t as T}from"./C8yIGsZb.js";import{t as E}from"./Dk1h4UcG.js";import{t as D}from"./BjW-HIZC.js";import{t as O}from"./DRUQkVH5.js";var k={class:`flex items-center justify-between gap-3 px-5 py-4`},A={class:`space-y-4 px-5 pb-5`},j={class:`mt-1 block break-all text-xs`},M={class:`text-xs`},N={class:`text-xs text-muted-foreground`},P={class:`flex justify-end gap-1`},F={class:`grid grid-cols-1 gap-x-6 gap-y-1 sm:grid-cols-2`},I={class:`flex items-center pt-6`},L={class:`flex items-center gap-2 text-sm`},R={class:`flex justify-end gap-2`},z=p({__name:`devices`,setup(p){let{request:z}=S(),{toast:B,confirm:V,handleError:H}=g(),U=l([]),W=l(!0),G=l(!1),K=l(!1),q=l(``),J=l(``),Y=u({id:``,name:``,note:``,rpm:0,daily:0,disabled:!1}),X=[{key:`id`,title:`ID`},{key:`name`,title:`名称`},{key:`rpm`,title:`RPM`,width:80},{key:`daily`,title:`每日`,width:80},{key:`token_hint`,title:`Token`,width:130},{key:`status`,title:`状态`,width:90},{key:`actions`,title:``,width:110,align:`right`}];async function Z(){try{U.value=await z(`/devices`)}catch(e){H(e)}finally{W.value=!1}}n(Z);function Q(){Object.assign(Y,{id:``,name:``,note:``,rpm:0,daily:0,disabled:!1}),K.value=!0}async function $(){G.value=!0;try{let e=await z(`/devices`,{method:`POST`,body:JSON.stringify({id:Y.id.trim(),name:Y.name.trim(),note:Y.note.trim(),rpm:Number(Y.rpm)||0,daily:Number(Y.daily)||0,disabled:Y.disabled})});K.value=!1,e.token&&(J.value=`设备已创建`,q.value=e.token),B.success(`设备已创建`),await Z()}catch(e){H(e)}finally{G.value=!1}}async function ee(e){if(await V(`轮换 Token`,`轮换 ${e} 的 token?旧 token 立即失效。`,{danger:!0}))try{let t=await z(`/devices/`+encodeURIComponent(e)+`/rotate`,{method:`POST`,body:`{}`});t.token&&(J.value=`已轮换`,q.value=t.token),B.success(`已轮换`),await Z()}catch(e){H(e)}}async function te(e){if(await V(`删除设备`,`确定删除设备 ${e}?`,{danger:!0}))try{await z(`/devices/`+encodeURIComponent(e),{method:`DELETE`}),B.success(`已删除`),await Z()}catch(e){H(e)}}return(n,l)=>{let u=C,p=O;return r(),d(f(h),{padding:`none`},{header:t(()=>[c(`div`,k,[l[10]||=c(`div`,null,[c(`h2`,{class:`text-sm font-semibold`},`设备`),c(`p`,{class:`text-xs text-muted-foreground`},` Token 仅存 SHA-256 哈希,明文只显示一次 `)],-1),a(f(_),{variant:`primary`,size:`sm`,icon:f(y),onClick:Q},{default:t(()=>[...l[9]||=[o(` 新建设备 `,-1)]]),_:1},8,[`icon`])])]),default:t(()=>[c(`div`,A,[f(q)?(r(),d(f(D),{key:0,type:`warning`,title:`此 token 只显示一次,请立即保存`,closable:``,onClose:l[0]||=e=>q.value=``},{default:t(()=>[c(`code`,j,s(f(q)),1)]),_:1})):i(``,!0),f(U).length||f(W)?(r(),d(f(m),{key:1,columns:X,data:f(U),"row-key":`id`,size:`sm`,hover:``,loading:f(W),"empty-text":`还没有设备,点「新建设备」签发 token。`},{"cell-id":t(({row:e})=>[c(`code`,M,s(e.id),1)]),"cell-name":t(({row:e})=>[o(s(e.name||`-`),1)]),"cell-rpm":t(({row:e})=>[o(s(e.rpm>0?e.rpm:`全局`),1)]),"cell-daily":t(({row:e})=>[o(s(e.daily>0?e.daily:`全局`),1)]),"cell-token_hint":t(({row:e})=>[c(`span`,N,s(e.token_hint),1)]),"cell-status":t(({row:e})=>[e.disabled?(r(),d(f(T),{key:0,size:`sm`,variant:`outline`},{default:t(()=>[...l[11]||=[o(`disabled`,-1)]]),_:1})):(r(),d(f(T),{key:1,size:`sm`,variant:`primary`},{default:t(()=>[...l[12]||=[o(`启用`,-1)]]),_:1}))]),"cell-actions":t(({row:e})=>[c(`div`,P,[a(f(_),{variant:`ghost`,size:`sm`,icon:f(x),onClick:t=>ee(e.id)},null,8,[`icon`,`onClick`]),a(f(_),{variant:`ghost`,size:`sm`,danger:``,icon:f(b),onClick:t=>te(e.id)},null,8,[`icon`,`onClick`])])]),_:1},8,[`data`,`loading`])):(r(),d(f(E),{key:2,title:`还没有设备`,description:`点「新建设备」签发 token。`}))]),a(p,{open:f(K),"onUpdate:open":l[8]||=t=>e(K)?K.value=t:null,title:`新建设备`,size:`lg`},{footer:t(()=>[c(`div`,R,[a(f(_),{variant:`outline`,size:`sm`,onClick:l[7]||=e=>K.value=!1},{default:t(()=>[...l[15]||=[o(`取消`,-1)]]),_:1}),a(f(_),{variant:`primary`,size:`sm`,loading:f(G),onClick:$},{default:t(()=>[...l[16]||=[o(` 创建 `,-1)]]),_:1},8,[`loading`])])]),default:t(()=>[c(`div`,F,[a(u,{label:`id(留空自动生成)`},{default:t(()=>[a(f(v),{modelValue:f(Y).id,"onUpdate:modelValue":l[1]||=e=>f(Y).id=e,placeholder:`phone-01`},null,8,[`modelValue`])]),_:1}),a(u,{label:`名称`},{default:t(()=>[a(f(v),{modelValue:f(Y).name,"onUpdate:modelValue":l[2]||=e=>f(Y).name=e,placeholder:`我的手机`},null,8,[`modelValue`])]),_:1}),a(u,{label:`备注`},{default:t(()=>[a(f(v),{modelValue:f(Y).note,"onUpdate:modelValue":l[3]||=e=>f(Y).note=e},null,8,[`modelValue`])]),_:1}),a(u,{label:`RPM(0=用全局)`},{default:t(()=>[a(f(v),{modelValue:f(Y).rpm,"onUpdate:modelValue":l[4]||=e=>f(Y).rpm=e,type:`number`},null,8,[`modelValue`])]),_:1}),a(u,{label:`每日上限(0=用全局)`},{default:t(()=>[a(f(v),{modelValue:f(Y).daily,"onUpdate:modelValue":l[5]||=e=>f(Y).daily=e,type:`number`},null,8,[`modelValue`])]),_:1}),c(`div`,I,[c(`label`,L,[a(f(w),{modelValue:f(Y).disabled,"onUpdate:modelValue":l[6]||=e=>f(Y).disabled=e},null,8,[`modelValue`]),l[13]||=o(),l[14]||=c(`span`,null,`disabled`,-1)])])])]),_:1},8,[`open`])]),_:1})}}});export{z as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/BOgT-xSl.js b/server/adminui/_nuxt/BOgT-xSl.js new file mode 100644 index 0000000..0245702 --- /dev/null +++ b/server/adminui/_nuxt/BOgT-xSl.js @@ -0,0 +1 @@ +import{S as e}from"./Bx_a1Ri3.js";var t=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},n=e=>e===``,r=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),i=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),a=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),o=e=>{let t=a(e);return t.charAt(0).toUpperCase()+t.slice(1)},s={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},c=({name:a,iconNode:c,absoluteStrokeWidth:l,"absolute-stroke-width":u,strokeWidth:d,"stroke-width":f,size:p=s.width,color:m=s.stroke,...h},{slots:g})=>e(`svg`,{...s,...h,width:p,height:p,stroke:m,"stroke-width":n(l)||n(u)||l===!0||u===!0?Number(d||f||s[`stroke-width`])*24/Number(p):d||f||s[`stroke-width`],class:r(`lucide`,h.class,...a?[`lucide-${i(o(a))}-icon`,`lucide-${i(a)}`]:[`lucide-icon`]),...!g.default&&!t(h)&&{"aria-hidden":`true`}},[...c.map(t=>e(...t)),...g.default?[g.default()]:[]]),l=(t,n)=>(r,{slots:i,attrs:a})=>e(c,{...a,...r,iconNode:n,name:t},i);export{l as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/BTFs9w_Z.js b/server/adminui/_nuxt/BTFs9w_Z.js new file mode 100644 index 0000000..b4a1f03 --- /dev/null +++ b/server/adminui/_nuxt/BTFs9w_Z.js @@ -0,0 +1 @@ +import{D as e,Et as t,J as n,K as r,M as i,P as a,c as o,d as s,f as c,g as l,kt as u,l as d,nt as f,ut as p,v as m}from"./Bx_a1Ri3.js";import{j as h}from"./Dw7E2aQ0.js";import{i as g,n as _}from"./D2-o7L18.js";import{t as v}from"./DMJkRJ-9.js";import{t as y}from"./CAJW6uLT.js";function b(e,t){let n=o(()=>e()||t());return{isInactive:n,inactiveClasses:o(()=>n.value?`opacity-60 cursor-not-allowed pointer-events-none bg-muted/30`:``)}}var x={class:`flex items-start gap-2 w-full h-full transition-all duration-300`},S=[`value`,`placeholder`,`rows`,`maxlength`,`disabled`,`readonly`],C={key:0,class:`flex justify-end px-3.5 pb-1.5 pt-0.5 text-[10px] font-bold text-muted-foreground/70 select-none`},w={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},T=m({__name:`Textarea`,props:{modelValue:{default:``},placeholder:{default:``},rows:{default:3},maxlength:{default:void 0},showCount:{type:Boolean,default:!1},autoSize:{type:[Boolean,Object],default:!1},size:{default:`md`},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},clearable:{type:Boolean,default:!1},error:{type:Boolean,default:!1},resize:{default:`none`},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`update:modelValue`,`change`,`clear`,`focus`,`blur`,`keydown`],setup(m,{emit:T}){let E=m,D=T,{entryClasses:O}=v(()=>E.animate,()=>E.delay,()=>E.entryClass),{isInactive:k,inactiveClasses:A}=b(()=>E.disabled,()=>E.loading),{handleBlurValidate:j,handleChangeValidate:M}=y(),N=f(null),P=f(!1),F=null;r(()=>E.error,e=>{e&&(P.value=!0,F&&clearTimeout(F),F=setTimeout(()=>{P.value=!1},350))});let I=e=>{let t=e.target.value;E.maxlength!==void 0&&t.length>E.maxlength||(D(`update:modelValue`,t),D(`change`,t),M())},L=e=>D(`focus`,e),R=e=>{D(`blur`,e),j()},z=e=>D(`keydown`,e),B=()=>{D(`update:modelValue`,``),D(`change`,``),D(`clear`),N.value?.focus()},V=o(()=>({sm:{minH:`min-h-[5rem]`,text:`text-xs`,pad:`px-2.5 py-2`},md:{minH:`min-h-[6.5rem]`,text:`text-sm`,pad:`px-3.5 py-2.5`},lg:{minH:`min-h-[8rem]`,text:`text-base`,pad:`px-4 py-3`}})[E.size]),H=async()=>{let t=N.value;if(!t||!E.autoSize)return;await e(),t.style.height=`auto`;let n=typeof E.autoSize==`object`?E.autoSize:{},r=Number.parseFloat(getComputedStyle(t).lineHeight)||20,i=n.minRows??E.rows,a=n.maxRows,o=i*r+2,s=a?a*r+2:1/0,c=t.scrollHeight;cs&&(c=s),t.style.height=`${c}px`};r(()=>E.modelValue,()=>{E.autoSize&&H()}),r(()=>E.autoSize,()=>{E.autoSize&&H()}),i(()=>{E.autoSize&&H(),E.resize===`none`&&N.value?.style.setProperty(`resize`,`none`)});let U=o(()=>String(E.modelValue??``)),W=o(()=>E.maxlength===void 0?`${U.value.length}`:`${U.value.length} / ${E.maxlength}`),G=o(()=>_(`relative flex flex-col w-full border rounded-base transition-all duration-200 overflow-hidden bg-background`,V.value.minH,E.error?`border-destructive text-destructive focus-within:ring-2 focus-within:ring-destructive/20`:`border-border hover:border-border/80 focus-within:border-primary focus-within:ring-2 focus-within:ring-primary/15`,P.value?`animate-shake`:``,A.value,`transition-all duration-200`)),K=o(()=>_(`w-full h-full bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground/60 font-medium align-top`,V.value.text,V.value.pad,{"resize-none":E.resize===`none`,"resize-y":E.resize===`vertical`,"resize-x":E.resize===`horizontal`,resize:E.resize===`both`},E.loading?`opacity-35 blur-[1.5px] scale-[0.99] select-none`:`opacity-100 blur-none scale-100`,`transition-all duration-300 ease-smooth`)),q=o(()=>_({"w-3.5 h-3.5":E.size===`sm`,"w-4 h-4":E.size===`md`,"w-4.5 h-4.5":E.size===`lg`}));return(e,r)=>(a(),c(`div`,{class:t([p(O),`w-full`])},[d(`div`,{class:t(G.value)},[d(`div`,x,[d(`textarea`,{ref_key:`textareaRef`,ref:N,value:U.value,placeholder:E.placeholder,rows:E.rows,maxlength:E.maxlength,disabled:E.disabled||E.loading,readonly:E.readonly,class:t([K.value,`grow`]),onInput:I,onFocus:L,onBlur:R,onKeydown:z},null,42,S),l(h,{name:`icon-pop`},{default:n(()=>[E.clearable&&U.value!==``&&!E.disabled&&!E.loading?(a(),c(`button`,{key:0,type:`button`,onClick:B,class:`text-muted-foreground hover:text-foreground transition-colors shrink-0 p-1 mt-1 active:scale-90`,"aria-label":`清空`},[l(p(g),{class:t(q.value)},null,8,[`class`])])):s(``,!0)]),_:1})]),E.showCount?(a(),c(`div`,C,u(W.value),1)):s(``,!0),l(h,{name:`fade`},{default:n(()=>[E.loading?(a(),c(`div`,w,[...r[0]||=[d(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[d(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):s(``,!0)]),_:1})],2)],2))}});export{b as n,T as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/BjW-HIZC.js b/server/adminui/_nuxt/BjW-HIZC.js new file mode 100644 index 0000000..6465489 --- /dev/null +++ b/server/adminui/_nuxt/BjW-HIZC.js @@ -0,0 +1 @@ +import{Et as e,J as t,L as n,P as r,c as i,d as a,f as o,g as s,h as c,kt as l,l as u,nt as d,u as f,ut as p,v as m,z as h}from"./Bx_a1Ri3.js";import{j as g}from"./Dw7E2aQ0.js";import{a as _,i as v}from"./DQKjIeim.js";import{i as y,n as b,r as x}from"./D2-o7L18.js";import{t as S}from"./z_P_bNzM.js";import{t as C}from"./DMJkRJ-9.js";var w=[`role`],T={class:`flex-1 min-w-0 space-y-1`},E={key:0,class:`text-sm font-bold text-foreground leading-snug`},D={key:1,class:`text-xs text-muted-foreground leading-relaxed`},O={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},k=m({__name:`Alert`,props:{type:{default:`info`},banner:{type:Boolean,default:!1},title:{default:``},description:{default:``},showIcon:{type:Boolean,default:!0},closable:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``},onClose:{type:Function,default:void 0}},emits:[`close`],setup(m,{emit:k}){let A=m,j=k,{entryClasses:M}=C(()=>A.animate,()=>A.delay,()=>A.entryClass),N=d(!0),P=d(!1),F=d(null),I={info:{icon:v,classes:{base:`bg-primary/5 border-primary/20 text-foreground`,icon:`text-primary`}},success:{icon:_,classes:{base:`bg-success/5 border-success/20 text-foreground`,icon:`text-success`}},warning:{icon:x,classes:{base:`bg-warning/5 border-warning/25 text-foreground`,icon:`text-warning`}},error:{icon:y,classes:{base:`bg-destructive/5 border-destructive/20 text-foreground`,icon:`text-destructive`}}},L=i(()=>I[A.type]),R=i(()=>L.value.icon),z=()=>{if(P.value)return;let e=F.value;if(!e){N.value=!1;return}P.value=!0,j(`close`),A.onClose?.();let t=e.offsetHeight;e.style.transition=`none`,e.style.height=`${t}px`,e.style.opacity=`1`,e.offsetHeight,e.style.transition=`height 0.32s cubic-bezier(0.16,1,0.3,1), opacity 0.32s cubic-bezier(0.16,1,0.3,1), padding 0.32s cubic-bezier(0.16,1,0.3,1)`,e.style.height=`0px`,e.style.opacity=`0`},B=e=>{e.propertyName===`height`&&P.value&&(N.value=!1)},V=i(()=>b(`relative w-full flex items-start gap-2.5 p-3 border overflow-hidden rounded-base transition-all duration-300`,L.value.classes.base,A.banner?`rounded-none`:``,A.closable?`pr-9`:``)),H=i(()=>b(`shrink-0 mt-0.5`,L.value.classes.icon));return(i,d)=>(r(),o(`div`,{class:e([p(M),`w-full`])},[s(g,{name:`fade`},{default:t(()=>[N.value?(r(),o(`div`,{key:0,ref_key:`boxRef`,ref:F,class:e(V.value),role:A.type===`error`||A.type===`warning`?`alert`:`status`,onTransitionend:B},[A.showIcon?(r(),f(h(R.value),{key:0,class:e(p(b)(H.value,`w-4.5 h-4.5`)),"stroke-width":2},null,8,[`class`])):a(``,!0),u(`div`,T,[A.title?(r(),o(`div`,E,[n(i.$slots,`title`,{},()=>[c(l(A.title),1)])])):a(``,!0),A.description||i.$slots.default?(r(),o(`div`,D,[n(i.$slots,`default`,{},()=>[c(l(A.description),1)])])):a(``,!0)]),n(i.$slots,`extra`),A.closable?(r(),o(`button`,{key:1,type:`button`,class:`absolute top-3 right-3 z-10 shrink-0 text-muted-foreground hover:text-foreground transition-colors duration-200 cursor-pointer active:scale-90`,onClick:z,"aria-label":`关闭`},[s(p(S),{class:`w-4 h-4`,"stroke-width":2.5})])):a(``,!0),s(g,{name:`fade`},{default:t(()=>[A.loading?(r(),o(`div`,O,[...d[0]||=[u(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[u(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):a(``,!0)]),_:1})],42,w)):a(``,!0)]),_:3})],2))}});export{k as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/BkfABsWB.js b/server/adminui/_nuxt/BkfABsWB.js new file mode 100644 index 0000000..269f1f3 --- /dev/null +++ b/server/adminui/_nuxt/BkfABsWB.js @@ -0,0 +1 @@ +import{Et as e,I as t,J as n,K as r,L as i,M as a,Ot as o,P as s,c,d as l,f as u,g as d,k as f,kt as p,l as m,nt as h,r as g,u as _,ut as v,v as y,z as b}from"./Bx_a1Ri3.js";import{j as x}from"./Dw7E2aQ0.js";import{r as S,t as C}from"./DQKjIeim.js";import{n as w}from"./D2-o7L18.js";import{t as T}from"./nj6DwLzD.js";import{n as E,t as D}from"./zZGEHylc.js";var O={class:`min-w-0 flex flex-col gap-0.5`},k={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] overflow-hidden pointer-events-none rounded-[inherit]`},A=y({__name:`Statistic`,props:{title:{default:``},value:{default:0},precision:{default:0},groupSeparator:{type:Boolean,default:!0},prefix:{default:``},suffix:{default:``},prefixIcon:{default:null},from:{default:0},duration:{default:600},direction:{default:`horizontal`},size:{default:`md`},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},setup(t){let i=t,o=h(!1),g=h(Number(i.from??0)),y=null;r(()=>i.value,e=>{let t=Number(e)||0,n=g.value,r=i.duration,a=performance.now();y&&cancelAnimationFrame(y);let o=e=>{let i=Math.min(1,(e-a)/r),s=1-(1-i)**3;g.value=n+(t-n)*s,i<1?y=requestAnimationFrame(o):g.value=t};y=requestAnimationFrame(o)},{immediate:!0}),f(()=>{y&&cancelAnimationFrame(y)});let S=c(()=>{let[e,t]=g.value.toFixed(i.precision).split(`.`),n=e??``,r=n;return i.groupSeparator&&(r=n.replace(/\B(?=(\d{3})+(?!\d))/g,`,`)),t===void 0?r:`${r}.${t}`});a(()=>{i.animate&&setTimeout(()=>{o.value=!0},i.delay)});let C=c(()=>{switch(i.size){case`sm`:return`text-[11px]`;case`lg`:return`text-sm`;default:return`text-xs`}}),T=c(()=>{switch(i.size){case`sm`:return`text-lg`;case`lg`:return`text-3xl`;default:return`text-2xl`}}),E=c(()=>{switch(i.size){case`sm`:return`w-4 h-4`;case`lg`:return`w-7 h-7`;default:return`w-5 h-5`}}),D=c(()=>i.animate?i.entryClass?o.value?i.entryClass:`opacity-0`:w(`transform transition-all duration-700 ease-swift`,o.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-98 blur-md pointer-events-none`):``);return(t,r)=>(s(),u(`div`,{class:e(v(w)(`relative w-fit select-none transition-all duration-300 rounded-base`,i.direction===`horizontal`?`flex items-center gap-3`:`flex flex-col items-start gap-1`,i.disabled?`opacity-50 pointer-events-none grayscale`:``,D.value))},[i.prefixIcon?(s(),u(`div`,{key:0,class:e([`shrink-0 flex items-center justify-center text-primary`,E.value])},[(s(),_(b(i.prefixIcon),{class:e(E.value)},null,8,[`class`]))],2)):l(``,!0),m(`div`,O,[m(`span`,{class:e([`text-muted-foreground font-bold`,C.value])},p(i.title),3),m(`div`,{class:e([`flex items-baseline gap-1 font-mono font-extrabold text-foreground`,i.loading?`opacity-35 blur-[1.5px] scale-[0.99] pointer-events-none`:``])},[i.prefix?(s(),u(`span`,{key:0,class:e([`text-muted-foreground font-bold`,C.value])},p(i.prefix),3)):l(``,!0),m(`span`,{class:e([`tabular-nums`,T.value])},p(S.value),3),i.suffix?(s(),u(`span`,{key:1,class:e([`text-muted-foreground font-bold`,C.value])},p(i.suffix),3)):l(``,!0)],2)]),d(x,{name:`fade`},{default:n(()=>[i.loading?(s(),u(`div`,k,[...r[0]||=[m(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[m(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):l(``,!0)]),_:1})],2))}}),j={key:0},M={class:`flex-1 min-w-0 flex flex-col gap-2`},N=`absolute inset-0 overflow-hidden pointer-events-none rounded-[inherit]`,P=`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer`,F=y({__name:`Skeleton`,props:{loading:{type:Boolean,default:void 0},rows:{default:3},title:{type:Boolean,default:!0},avatar:{type:Boolean,default:!1},size:{default:`md`},width:{default:`100%`},height:{default:``},round:{type:Boolean,default:!1},animated:{type:Boolean,default:!0},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},setup(n){let r=n,d=h(!1);a(()=>{r.animate&&setTimeout(()=>{d.value=!0},r.delay)});let f=c(()=>r.loading!==!1),p=e=>typeof e==`number`?`${e}px`:e,_=c(()=>w(`relative overflow-hidden rounded-base bg-muted/70 dark:bg-muted/50`,r.round?`rounded-full`:``)),y=c(()=>w(_.value,`rounded-full shrink-0`,r.size===`lg`?`w-14 h-14`:r.size===`sm`?`w-8 h-8`:`w-10 h-10`)),b=c(()=>w(_.value,r.size===`lg`?`h-5 w-2/3`:r.size===`sm`?`h-3 w-1/2`:`h-4 w-1/2`)),x=c(()=>w(_.value,r.size===`lg`?`h-4`:r.size===`sm`?`h-2.5`:`h-3`,`w-full`)),S=c(()=>w(`w-full flex`,r.size===`lg`?`gap-4`:r.size===`sm`?`gap-2`:`gap-3`)),C=c(()=>({width:p(r.width)})),T=c(()=>r.height?{height:p(r.height)}:{}),E=c(()=>r.animate?r.entryClass?d.value?r.entryClass:`opacity-0`:w(`transform transition-all duration-700 ease-swift`,d.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-98 blur-md pointer-events-none`):``);return(n,a)=>(s(),u(`div`,{class:e(v(w)(`w-full`,E.value)),style:o(C.value)},[f.value?(s(),u(`div`,{key:1,class:e(S.value),style:o(T.value),"aria-hidden":`true`},[r.avatar?(s(),u(`div`,{key:0,class:e(y.value)},[r.animated?(s(),u(`div`,{key:0,class:e(N)},[m(`div`,{class:e(P)})])):l(``,!0)],2)):l(``,!0),m(`div`,M,[r.title?(s(),u(`div`,{key:0,class:e(b.value)},[r.animated?(s(),u(`div`,{key:0,class:e(N)},[m(`div`,{class:e(P)})])):l(``,!0)],2)):l(``,!0),(s(!0),u(g,null,t(r.rows,t=>(s(),u(`div`,{key:t,class:e(x.value),style:o(t===r.rows?{width:`40%`}:{})},[r.animated?(s(),u(`div`,{key:0,class:e(N)},[m(`div`,{class:e(P)})])):l(``,!0)],6))),128))])],6)):(s(),u(`div`,j,[i(n.$slots,`default`)]))],6))}}),I=globalThis.setInterval,L={class:`space-y-4`},R={key:0,class:`grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4`},z={key:1,class:`grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5`},B=y({__name:`index`,setup(e){let{request:r}=T(),{handleError:i}=C(),o=h(null),l=h(!0);async function p(){try{o.value=await r(`/overview`)}catch(e){i(e)}finally{l.value=!1}}a(()=>{p();let e=I(p,4e3);f(()=>clearInterval(e))});let m=c(()=>{let e=o.value;return e?[{title:`请求数`,value:E(e.requests),suffix:``},{title:`成功率`,value:(e.success_rate||0).toFixed(1),suffix:`%`},{title:`平均延迟`,value:e.avg_latency_ms||0,suffix:`ms`},{title:`in_token`,value:E(e.in_tokens)},{title:`out_token`,value:E(e.out_tokens)},{title:`费用(元)`,value:D(e.cost)},{title:`今日费用`,value:D(e.cost_today)},{title:`客户端错误`,value:E(e.client_errors)},{title:`上游错误`,value:E(e.upstream_errors)},{title:`故障转移`,value:E(e.failovers)},{title:`多模态部件`,value:E(e.multimodal)},{title:`上游数`,value:E(e.upstreams)},{title:`客户端 Token`,value:E(e.client_tokens)},{title:`设备数`,value:E(e.devices)},{title:`模型数`,value:E(e.models)},{title:`丢弃日志`,value:E(e.dropped_logs)}]:[]});return(e,r)=>(s(),u(`div`,L,[v(l)&&!v(o)?(s(),u(`div`,R,[(s(),u(g,null,t(8,e=>d(v(F),{key:e,class:`h-[88px] rounded-xl`})),64))])):(s(),u(`div`,z,[(s(!0),u(g,null,t(v(m),(e,t)=>(s(),_(v(S),{key:e.title,padding:`md`,"hover-shadow":``,class:`transition-transform duration-200 hover:-translate-y-0.5`},{default:n(()=>[d(v(A),{title:e.title,value:e.value,suffix:e.suffix,size:`md`,animate:``,delay:t*25},null,8,[`title`,`value`,`suffix`,`delay`])]),_:2},1024))),128))]))]))}});export{B as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/Bx_a1Ri3.js b/server/adminui/_nuxt/Bx_a1Ri3.js new file mode 100644 index 0000000..c0bc837 --- /dev/null +++ b/server/adminui/_nuxt/Bx_a1Ri3.js @@ -0,0 +1,3 @@ +function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>S(e)===`[object Map]`,p=e=>S(e)===`[object Set]`,m=e=>S(e)===`[object Date]`,h=e=>S(e)===`[object RegExp]`,g=e=>typeof e==`function`,_=e=>typeof e==`string`,v=e=>typeof e==`symbol`,y=e=>typeof e==`object`&&!!e,b=e=>(y(e)||g(e))&&g(e.then)&&g(e.catch),x=Object.prototype.toString,S=e=>x.call(e),C=e=>S(e).slice(8,-1),w=e=>S(e)===`[object Object]`,T=e=>_(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,E=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),D=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ee=/-\w/g,O=D(e=>e.replace(ee,e=>e.slice(1).toUpperCase())),te=/\B([A-Z])/g,ne=D(e=>e.replace(te,`-$1`).toLowerCase()),re=D(e=>e.charAt(0).toUpperCase()+e.slice(1)),ie=D(e=>e?`on${re(e)}`:``),k=(e,t)=>!Object.is(e,t),A=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},oe=e=>{let t=parseFloat(e);return isNaN(t)?e:t},se=e=>{let t=_(e)?Number(e):NaN;return isNaN(t)?e:t},ce,le=()=>ce||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};function ue(e){if(d(e)){let t={};for(let n=0;ne.startsWith(`/*`)?``:e).split(de).forEach(e=>{if(e){let n=e.split(fe);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function he(e){let t=``;if(_(e))t=e;else if(d(e))for(let n=0;n!!(e&&e.__v_isRef===!0),Ee=e=>_(e)?e:e==null?``:d(e)||y(e)&&(e.toString===x||!g(e.toString))?Te(e)?Ee(e.value):JSON.stringify(e,De,2):String(e),De=(e,t)=>Te(t)?De(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[Oe(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>Oe(e))}:v(t)?Oe(t):y(t)&&!d(t)&&!w(t)?String(t):t,Oe=(e,t=``)=>v(e)?`Symbol(${e.description??t})`:e,j,ke=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&j&&(j.active?(this.parent=j,this.index=(j.scopes||(j.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,t;if(this.scopes){let n=this.scopes.slice();for(e=0,t=n.length;e0&&--this._on===0){if(j===this)j=this.prevScope;else{let e=j;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let t,n;for(t=0,n=this.effects.length;t0)return;if(Le){let e=Le;for(Le=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;Ie;){let t=Ie;for(Ie=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(t){e||=t}t=n}}if(e)throw e}function Ve(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function He(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),Ge(r),Ke(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Ue(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(We(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function We(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ze)||(e.globalVersion=Ze,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ue(e))))return;e.flags|=2;let t=e.dep,n=M,r=N;M=e,N=!0;try{Ve(e);let n=e.fn(e._value);(t.version===0||k(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{M=n,N=r,He(e),e.flags&=-3}}function Ge(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Ge(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Ke(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var N=!0,qe=[];function Je(){qe.push(N),N=!1}function Ye(){let e=qe.pop();N=e===void 0||e}function Xe(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=M;M=void 0;try{t()}finally{M=e}}}var Ze=0,Qe=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},$e=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!M||!N||M===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==M)t=this.activeLink=new Qe(M,this),M.deps?(t.prevDep=M.depsTail,M.depsTail.nextDep=t,M.depsTail=t):M.deps=M.depsTail=t,et(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=M.depsTail,t.nextDep=void 0,M.depsTail.nextDep=t,M.depsTail=t,M.deps===t&&(M.deps=e)}return t}trigger(e){this.version++,Ze++,this.notify(e)}notify(e){ze();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{Be()}}};function et(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)et(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var tt=new WeakMap,nt=Symbol(``),rt=Symbol(``),it=Symbol(``);function P(e,t,n){if(N&&M){let t=tt.get(e);t||tt.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new $e),r.map=t,r.key=n),r.track()}}function at(e,t,n,r,i,a){let o=tt.get(e);if(!o){Ze++;return}let s=e=>{e&&e.trigger()};if(ze(),t===`clear`)o.forEach(s);else{let i=d(e),a=i&&T(n);if(i&&n===`length`){let e=Number(r);o.forEach((t,n)=>{(n===`length`||n===it||!v(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(it)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(nt)),f(e)&&s(o.get(rt)));break;case`delete`:i||(s(o.get(nt)),f(e)&&s(o.get(rt)));break;case`set`:f(e)&&s(o.get(nt))}}Be()}function ot(e,t){let n=tt.get(e);return n&&n.get(t)}function st(e){let t=L(e);return t===e||(P(t,`iterate`,it),I(e))?t:F(e)?qt(e)?t.map(e=>Xt(R(e))):t.map(Xt):t.map(R)}function ct(e){return P(e=L(e),`iterate`,it),e}function lt(e,t){return F(e)?Xt(qt(e)?R(t):t):R(t)}var ut={__proto__:null,[Symbol.iterator](){return dt(this,Symbol.iterator,e=>lt(this,e))},concat(...e){return st(this).concat(...e.map(e=>d(e)?st(e):e))},entries(){return dt(this,`entries`,e=>(e[1]=lt(this,e[1]),e))},every(e,t){return pt(this,`every`,e,t,void 0,arguments)},filter(e,t){return pt(this,`filter`,e,t,e=>e.map(e=>lt(this,e)),arguments)},find(e,t){return pt(this,`find`,e,t,e=>lt(this,e),arguments)},findIndex(e,t){return pt(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return pt(this,`findLast`,e,t,e=>lt(this,e),arguments)},findLastIndex(e,t){return pt(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return pt(this,`forEach`,e,t,void 0,arguments)},includes(...e){return ht(this,`includes`,e)},indexOf(...e){return ht(this,`indexOf`,e)},join(e){return st(this).join(e)},lastIndexOf(...e){return ht(this,`lastIndexOf`,e)},map(e,t){return pt(this,`map`,e,t,void 0,arguments)},pop(){return gt(this,`pop`)},push(...e){return gt(this,`push`,e)},reduce(e,...t){return mt(this,`reduce`,e,t)},reduceRight(e,...t){return mt(this,`reduceRight`,e,t)},shift(){return gt(this,`shift`)},some(e,t){return pt(this,`some`,e,t,void 0,arguments)},splice(...e){return gt(this,`splice`,e)},toReversed(){return st(this).toReversed()},toSorted(e){return st(this).toSorted(e)},toSpliced(...e){return st(this).toSpliced(...e)},unshift(...e){return gt(this,`unshift`,e)},values(){return dt(this,`values`,e=>lt(this,e))}};function dt(e,t,n){let r=ct(e),i=r[t]();return r!==e&&!I(e)&&(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}var ft=Array.prototype;function pt(e,t,n,r,i,a){let o=ct(e),s=o!==e&&!I(e),c=o[t];if(c!==ft[t]){let t=c.apply(e,a);return s?R(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,lt(e,t),r,e)}:n.length>2&&(l=function(t,r){return n.call(this,t,r,e)}));let u=c.call(o,l,r);return s&&i?i(u):u}function mt(e,t,n,r){let i=ct(e),a=i!==e&&!I(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=lt(e,t)),n.call(this,t,lt(e,r),i,e)}):n.length>3&&(o=function(t,r,i){return n.call(this,t,r,i,e)}));let c=i[t](o,...r);return s?lt(e,c):c}function ht(e,t,n){let r=L(e);P(r,`iterate`,it);let i=r[t](...n);return(i===-1||i===!1)&&Jt(n[0])?(n[0]=L(n[0]),r[t](...n)):i}function gt(e,t,n=[]){Je(),ze();let r=L(e)[t].apply(e,n);return Be(),Ye(),r}var _t=e(`__proto__,__v_isRef,__isVue`),vt=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(v));function yt(e){v(e)||(e=String(e));let t=L(this);return P(t,`has`,e),t.hasOwnProperty(e)}var bt=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(t===`__v_skip`)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(t===`__v_isReactive`)return!r;if(t===`__v_isReadonly`)return r;if(t===`__v_isShallow`)return i;if(t===`__v_raw`)return n===(r?i?Bt:zt:i?Rt:Lt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=ut[t]))return e;if(t===`hasOwnProperty`)return yt}let o=Reflect.get(e,t,z(e)?e:n);if((v(t)?vt.has(t):_t(t))||(r||P(e,`get`,t),i))return o;if(z(o)){let e=a&&T(t)?o:o.value;return r&&y(e)?Wt(e):e}return y(o)?r?Wt(o):Ht(o):o}},xt=class extends bt{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],a=d(e)&&T(t);if(!this._isShallow){let e=F(i);if(!I(n)&&!F(n)&&(i=L(i),n=L(n)),!a&&z(i)&&!z(n))return e||(i.value=n),!0}let o=a?Number(t)e,Ot=e=>Reflect.getPrototypeOf(e);function kt(e,t,n){return function(...r){let i=this.__v_raw,a=L(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?Dt:t?Xt:R;return!t&&P(a,`iterate`,l?rt:nt),s(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:c?[d(e[0]),d(e[1])]:d(e),done:t}}})}}function At(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function jt(e,t){let n={get(n){let r=this.__v_raw,i=L(r),a=L(n);e||(k(n,a)&&P(i,`get`,n),P(i,`get`,a));let{has:o}=Ot(i),s=t?Dt:e?Xt:R;if(o.call(i,n))return s(r.get(n));if(o.call(i,a))return s(r.get(a));r!==i&&r.get(n)},get size(){let t=this.__v_raw;return!e&&P(L(t),`iterate`,nt),t.size},has(t){let n=this.__v_raw,r=L(n),i=L(t);return e||(k(t,i)&&P(r,`has`,t),P(r,`has`,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,a=i.__v_raw,o=L(a),s=t?Dt:e?Xt:R;return!e&&P(o,`iterate`,nt),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:At(`add`),set:At(`set`),delete:At(`delete`),clear:At(`clear`)}:{add(e){let n=L(this),r=Ot(n),i=L(e),a=!t&&!I(e)&&!F(e)?i:e;return r.has.call(n,a)||k(e,a)&&r.has.call(n,e)||k(i,a)&&r.has.call(n,i)||(n.add(a),at(n,`add`,a,a)),this},set(e,n){!t&&!I(n)&&!F(n)&&(n=L(n));let r=L(this),{has:i,get:a}=Ot(r),o=i.call(r,e);o||=(e=L(e),i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?k(n,s)&&at(r,`set`,e,n,s):at(r,`add`,e,n),this},delete(e){let t=L(this),{has:n,get:r}=Ot(t),i=n.call(t,e);i||=(e=L(e),n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&at(t,`delete`,e,void 0,a),o},clear(){let e=L(this),t=e.size!==0,n=e.clear();return t&&at(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=kt(r,e,t)}),n}function Mt(e,t){let n=jt(e,t);return(t,r,i)=>r===`__v_isReactive`?!e:r===`__v_isReadonly`?e:r===`__v_raw`?t:Reflect.get(u(n,r)&&r in t?n:t,r,i)}var Nt={get:Mt(!1,!1)},Pt={get:Mt(!1,!0)},Ft={get:Mt(!0,!1)},It={get:Mt(!0,!0)},Lt=new WeakMap,Rt=new WeakMap,zt=new WeakMap,Bt=new WeakMap;function Vt(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function Ht(e){return F(e)?e:Kt(e,!1,Ct,Nt,Lt)}function Ut(e){return Kt(e,!1,Tt,Pt,Rt)}function Wt(e){return Kt(e,!0,wt,Ft,zt)}function Gt(e){return Kt(e,!0,Et,It,Bt)}function Kt(e,t,n,r,i){if(!y(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let a=i.get(e);if(a)return a;let o=Vt(C(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function qt(e){return F(e)?qt(e.__v_raw):!!(e&&e.__v_isReactive)}function F(e){return!!(e&&e.__v_isReadonly)}function I(e){return!!(e&&e.__v_isShallow)}function Jt(e){return e?!!e.__v_raw:!1}function L(e){let t=e&&e.__v_raw;return t?L(t):e}function Yt(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&ae(e,`__v_skip`,!0),e}var R=e=>y(e)?Ht(e):e,Xt=e=>y(e)?Wt(e):e;function z(e){return e?e.__v_isRef===!0:!1}function Zt(e){return $t(e,!1)}function Qt(e){return $t(e,!0)}function $t(e,t){return z(e)?e:new en(e,t)}var en=class{constructor(e,t){this.dep=new $e,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:L(e),this._value=t?e:R(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||I(e)||F(e);e=n?e:L(e),k(e,t)&&(this._rawValue=e,this._value=n?e:R(e),this.dep.trigger())}};function tn(e){return z(e)?e.value:e}function nn(e){return g(e)?e():tn(e)}var rn={get:(e,t,n)=>t===`__v_raw`?e:tn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return z(i)&&!z(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function an(e){return qt(e)?e:new Proxy(e,rn)}function on(e){let t=d(e)?Array(e.length):{};for(let n in e)t[n]=un(e,n);return t}var sn=class{constructor(e,t,n){this._object=e,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=v(t)?t:String(t),this._raw=L(e);let r=!0,i=e;if(!d(e)||v(this._key)||!T(this._key))do r=!Jt(i)||I(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let e=this._object[this._key];return this._shallow&&(e=tn(e)),this._value=e===void 0?this._defaultValue:e}set value(e){if(this._shallow&&z(this._raw[this._key])){let t=this._object[this._key];if(z(t)){t.value=e;return}}this._object[this._key]=e}get dep(){return ot(this._raw,this._key)}},cn=class{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}};function ln(e,t,n){return z(e)?e:g(e)?new cn(e):y(e)&&arguments.length>1?un(e,t,n):Zt(e)}function un(e,t,n){return new sn(e,t,n)}var dn=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new $e(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ze-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&M!==this)return Re(this,!0),!0}get value(){let e=this.dep.track();return We(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function fn(e,t,n=!1){let r,i;return g(e)?r=e:(r=e.get,i=e.set),new dn(r,i,n)}var pn={},mn=new WeakMap,hn=void 0;function gn(e,t=!1,n=hn){if(n){let t=mn.get(n);t||mn.set(n,t=[]),t.push(e)}}function _n(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:I(e)||o===!1||o===0?vn(e,1):vn(e),m,h,_,v,y=!1,b=!1;if(z(e)?(h=()=>e.value,y=I(e)):qt(e)?(h=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>qt(e)||I(e)),h=()=>e.map(e=>{if(z(e))return e.value;if(qt(e))return p(e);if(g(e))return f?f(e,2):e()})):h=g(e)?n?f?()=>f(e,2):e:()=>{if(_){Je();try{_()}finally{Ye()}}let t=hn;hn=m;try{return f?f(e,3,[v]):e(v)}finally{hn=t}}:r,n&&o){let e=h,t=o===!0?1/0:o;h=()=>vn(e(),t)}let x=je(),S=()=>{m.stop(),x&&x.active&&c(x.effects,m)};if(s&&n){let e=n;n=(...t)=>{let n=e(...t);return S(),n}}let C=b?Array(e.length).fill(pn):pn,w=e=>{if(m.flags&1&&(m.dirty||e)){if(n){let t=m.run();if(e||o||y||(b?t.some((e,t)=>k(e,C[t])):k(t,C))){_&&_();let e=hn;hn=m;try{let e=[t,C===pn?void 0:b&&C[0]===pn?[]:C,v];C=t,f?f(n,3,e):n(...e)}finally{hn=e}}}else m.run()}};return u&&u(w),m=new Pe(h),m.scheduler=l?()=>l(w,!1):w,v=e=>gn(e,!1,m),_=m.onStop=()=>{let e=mn.get(m);if(e){if(f)f(e,4);else for(let t of e)t();mn.delete(m)}},n?a?w(!0):C=m.run():l?l(w.bind(null,!0),!0):m.run(),S.pause=m.pause.bind(m),S.resume=m.resume.bind(m),S.stop=S,S}function vn(e,t=1/0,n){if(t<=0||!y(e)||e.__v_skip||(n||=new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,z(e))vn(e.value,t,n);else if(d(e))for(let r=0;r{vn(e,t,n)});else if(w(e)){for(let r in e)vn(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&vn(e[r],t,n)}return e}function yn(e,t,n,r){try{return r?e(...r):e()}catch(e){bn(e,t,n)}}function B(e,t,n,r){if(g(e)){let i=yn(e,t,n,r);return i&&b(i)&&i.catch(e=>{bn(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a>>1,i=V[r],a=Fn(i);a=Fn(n)?V.push(e):V.splice(kn(t),0,e),e.flags|=1,jn()}}function jn(){Dn||=En.then(In)}function Mn(e){if(!d(e))wn&&e.id===-1?wn.splice(Tn+1,0,e):e.flags&1||(Cn.push(e),e.flags|=1);else for(let t=0;tFn(e)-Fn(t));if(Cn.length=0,wn){for(let t=0;te.id==null?e.flags&2?-1:1/0:e.id;function In(e){try{for(Sn=0;Sn{r._d&&so(-1);let i=Rn(t),a=ro.length,o;try{o=e(...n)}finally{for(let e=ro.length;e>a;e--)ao();Rn(i),r._d&&so(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function Bn(e,n){if(H===null)return e;let r=Vo(H),i=e.dirs||=[];for(let e=0;e1)return n&&g(t)?t.call(r&&r.proxy):t}}function Wn(){return!!(Oo()||$i)}var Gn=Symbol.for(`v-scx`),Kn=()=>Un(Gn);function qn(e,t){return Yn(e,null,t)}function Jn(e,t,n){return Yn(e,t,n)}function Yn(e,n,i=t){let{immediate:a,deep:o,flush:c,once:l}=i,u=s({},i),d=n&&a||!n&&c!==`post`,f;if(Po){if(c===`sync`){let e=Kn();f=e.__watcherHandles||=[]}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=$;u.call=(e,t,n)=>B(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{K(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():An(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=_n(e,n,u);return Po&&(f?f.push(h):d&&h()),h}function Xn(e,t,n){let r=this.proxy,i=_(e)?e.includes(`.`)?Zn(r,e):()=>r[e]:e.bind(r,r),a;g(t)?a=t:(a=t.handler,n=t);let o=jo(this),s=Yn(i,a.bind(r),n);return o(),s}function Zn(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;ee.__isTeleport,tr=e=>e&&(e.disabled||e.disabled===``),nr=e=>e&&(e.defer||e.defer===``),rr=e=>typeof SVGElement<`u`&&e instanceof SVGElement,ir=e=>typeof MathMLElement==`function`&&e instanceof MathMLElement,ar=(e,t)=>{let n=e&&e.to;return _(n)?t?t(n):null:n},or={name:`Teleport`,__isTeleport:!0,process(e,t,n,r,i,a,o,s,c,l){let{mc:u,pc:d,pbc:f,o:{insert:p,querySelector:m,createText:h,createComment:g,parentNode:_}}=l,v=tr(t.props),{dynamicChildren:y}=t,b=(e,t,n)=>{e.shapeFlag&16&&u(e.children,t,n,i,a,o,s,c)},x=(e=t)=>{let n=tr(e.props),r=e.target=ar(e.props,m),a=dr(r,e,h,p);r&&(o!==`svg`&&rr(r)?o=`svg`:o!==`mathml`&&ir(r)&&(o=`mathml`),i&&i.isCE&&(i.ce._teleportTargets||(i.ce._teleportTargets=new Set)).add(r),n||(b(e,r,a),ur(e,!1)))},S=e=>{let t=()=>{if(Qn.get(e)===t){if(Qn.delete(e),tr(e.props)){let t=_(e.el)||n;b(e,t,e.anchor),ur(e,!0)}x(e)}};Qn.set(e,t),K(t,a)};if(e==null){let e=t.el=h(``),i=t.anchor=h(``);if(p(e,n,r),p(i,n,r),nr(t.props)||a&&a.pendingBranch){S(t);return}v&&(b(t,n,i),ur(t,!0)),x()}else{t.el=e.el;let r=t.anchor=e.anchor,u=Qn.get(e);if(u){u.flags|=8,Qn.delete(e),S(t);return}t.targetStart=e.targetStart;let p=t.target=e.target,h=t.targetAnchor=e.targetAnchor,g=tr(e.props),_=g?n:p,b=g?r:h;if(o===`svg`||rr(p)?o=`svg`:(o===`mathml`||ir(p))&&(o=`mathml`),y?(f(e.dynamicChildren,y,_,i,a,o,s),La(e,t,!0)):c||d(e,t,_,b,i,a,o,s,!1),v)g?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):sr(t,n,r,l,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){let e=ar(t.props,m);e&&(t.target=e,sr(t,e,null,l,0))}else g&&sr(t,p,h,l,1);ur(t,v)}},remove(e,t,n,{um:r,o:{remove:i}},a){let{shapeFlag:o,children:s,anchor:c,targetStart:l,targetAnchor:u,target:d,props:f}=e,p=tr(f),m=a||!p,h=Qn.get(e);if(h&&(h.flags|=8,Qn.delete(e)),d&&(i(l),i(u)),a&&i(c),!h&&(p||d)&&o&16)for(let e=0;e{e.isMounted=!0}),pi(()=>{e.isUnmounting=!0}),e}var W=[Function,Array],mr={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:W,onEnter:W,onAfterEnter:W,onEnterCancelled:W,onBeforeLeave:W,onLeave:W,onAfterLeave:W,onLeaveCancelled:W,onBeforeAppear:W,onAppear:W,onAfterAppear:W,onAppearCancelled:W},hr=e=>{let t=e.subTree;return t.component?hr(t.component):t},gr={name:`BaseTransition`,props:mr,setup(e,{slots:t}){let n=Oo(),r=pr();return()=>{let i=t.default&&wr(t.default(),!0),a=i&&i.length?_r(i):n.subTree?xo():void 0;if(!a)return;let o=L(e),{mode:s}=o;if(r.isLeaving)return xr(a);let c=Sr(a);if(!c)return xr(a);let l=br(c,o,r,n,e=>l=e);c.type!==J&&Cr(c,l);let u=n.subTree&&Sr(n.subTree);if(u&&u.type!==J&&!po(u,c)&&hr(n).type!==J){let e=br(u,o,r,n);if(Cr(u,e),s===`out-in`&&c.type!==J)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete e.afterLeave,u=void 0},xr(a);s===`in-out`&&c.type!==J?e.delayLeave=(e,t,n)=>{let i=yr(r,u);i[String(u.key)]=u,e[U]=()=>{t(),e[U]=void 0,delete l.delayedLeave,u=void 0},l.delayedLeave=()=>{n(),delete l.delayedLeave,u=void 0}}:u=void 0}else u&&=void 0;return a}}};function _r(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==J){t=n;break}}return t}var vr=gr;function yr(e,t){let{leavingVNodes:n}=e,r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function br(e,t,n,r,i){let{appear:a,mode:o,persisted:s=!1,onBeforeEnter:c,onEnter:l,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:p,onLeave:m,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:_,onAppear:v,onAfterAppear:y,onAppearCancelled:b}=t,x=String(e.key),S=yr(n,e),C=(e,t)=>{e&&B(e,r,9,t)},w=(e,t)=>{let n=t[1];C(e,t),d(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},T={mode:o,persisted:s,beforeEnter(t){let r=c;if(!n.isMounted){if(a)r=_||c;else return}t[U]&&t[U](!0);let i=S[x];i&&po(e,i)&&i.el[U]&&i.el[U](),C(r,[t])},enter(t){if(S[x]===e)return;let r=l,i=u,o=f;if(!n.isMounted){if(a)r=v||l,i=y||u,o=b||f;else return}let s=!1;t[fr]=e=>{s||(s=!0,C(e?o:i,[t]),T.delayedLeave&&T.delayedLeave(),t[fr]=void 0)};let c=t[fr].bind(null,!1);r?w(r,[t,c]):c()},leave(t,r){let i=String(e.key);if(t[fr]&&t[fr](!0),n.isUnmounting)return r();C(p,[t]);let a=!1;t[U]=n=>{a||(a=!0,r(),C(n?g:h,[t]),t[U]=void 0,S[i]===e&&delete S[i])};let o=t[U].bind(null,!1);S[i]=e,m?w(m,[t,o]):o()},clone(e){let a=br(e,t,n,r,i);return i&&i(a),a}};return T}function xr(e){if(Qr(e))return e=yo(e),e.children=null,e}function Sr(e){if(!Qr(e))return er(e.type)&&e.children?_r(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&g(n.default))return n.default()}}function Cr(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let n=e.component.subTree;Cr(er(n.type)&&Sr(n)||n,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function wr(e,t=!1,n){let r=[],i=0;for(let a=0;a1)for(let e=0;eAr(e,n&&(d(n)?n[t]:n),r,a,o));return}if(Yr(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&Ar(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?Vo(a.component):a.el,l=o?null:s,{i:f,r:p}=e,m=n&&n.r,h=f.refs===t?f.refs={}:f.refs,v=f.setupState,y=L(v),b=v===t?i:e=>!Or(h,e)&&u(y,e),x=(e,t)=>!(t&&Or(h,t));if(m!=null&&m!==p){if(jr(n),_(m))h[m]=null,b(m)&&(v[m]=null);else if(z(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(h[e.k]=null)}}if(g(p))yn(p,f,12,[l,h]);else{let t=_(p),n=z(p);if(t||n){let i=()=>{if(e.f){let n=t?b(p)?v[p]:h[p]:x(p)||!e.k?p.value:h[e.k];if(o)d(n)&&c(n,s);else if(d(n))n.includes(s)||n.push(s);else if(t)h[p]=[s],b(p)&&(v[p]=h[p]);else{let t=[s];x(p,e.k)&&(p.value=t),e.k&&(h[e.k]=t)}}else t?(h[p]=l,b(p)&&(v[p]=l)):n&&(x(p,e.k)&&(p.value=l),e.k&&(h[e.k]=l))};if(l){let t=()=>{i(),kr.delete(e)};t.id=-1,kr.set(e,t),K(t,r)}else jr(e),i()}}}function jr(e){let t=kr.get(e);t&&(t.flags|=8,kr.delete(e))}var Mr=!1,Nr=()=>{Mr||=(console.error(`Hydration completed but contains mismatches.`),!0)},Pr=e=>e.namespaceURI.includes(`svg`)&&e.tagName!==`foreignObject`,Fr=e=>e.namespaceURI.includes(`MathML`),Ir=e=>{if(e.nodeType===1){if(Pr(e))return`svg`;if(Fr(e))return`mathml`}},Lr=e=>e.nodeType===8;function Rr(e){let{mt:t,p:n,o:{patchProp:r,createText:i,nextSibling:o,parentNode:s,remove:c,insert:l,createComment:u}}=e,d=(e,t)=>{if(!t.hasChildNodes()){n(null,e,t),Pn(),t._vnode=e;return}f(t.firstChild,e,null,null,null),Pn(),t._vnode=e},f=(n,r,a,c,u,d=!1)=>{d||=!!r.dynamicChildren;let b=Lr(n)&&n.data===`[`,x=()=>g(n,r,a,c,u,b),{type:S,ref:C,shapeFlag:w,patchFlag:T}=r,E=n.nodeType;r.el=n,T===-2&&(d=!1,r.dynamicChildren=null);let D=null;switch(S){case to:E===3?(n.data!==r.children&&(Nr(),n.data=r.children),D=o(n)):r.children===``?(l(r.el=i(``),s(n),n),D=n):D=x();break;case J:y(n)?(D=o(n),v(r.el=n.content.firstChild,n,a)):D=E!==8||b?x():o(n);break;case no:if(b&&(n=o(n),E=n.nodeType),E===1||E===3){D=n;let e=!r.children.length;for(let t=0;t{s||=!!t.dynamicChildren;let{type:l,dynamicProps:u,props:d,patchFlag:f,shapeFlag:p,dirs:h,transition:g}=t,_=l===`input`||l===`option`,b=!!u;if(_||b||f!==-1){h&&Vn(t,null,n,`created`);let l=!1;if(y(e)){l=Ia(null,g)&&n&&n.vnode.props&&n.vnode.props.appear;let r=e.content.firstChild;if(l){let e=r.getAttribute(`class`);e&&(r.$cls=e),g.beforeEnter(r)}v(r,e,n),t.el=e=r}if(p&16&&!(d&&(d.innerHTML||d.textContent))){let r=m(e.firstChild,t,e,n,i,o,s);for(r&&!Ur(e,1)&&Nr();r;){let e=r;r=r.nextSibling,c(e)}}else if(p&8){let n=t.children;n[0]===` +`&&(e.tagName===`PRE`||e.tagName===`TEXTAREA`)&&(n=n.slice(1));let{textContent:r}=e;r!==n&&r!==n.replace(/\r\n|\r/g,` +`)&&(Ur(e,0)||Nr(),e.textContent=t.children)}if(d){if(_||b||!s||f&48){let t=e.tagName.includes(`-`),i=e.namespaceURI.includes(`svg`)?`svg`:e.namespaceURI.includes(`MathML`)?`mathml`:void 0;for(let o in d)if(_&&(o.endsWith(`value`)||o===`indeterminate`)||a(o)&&!E(o)||o[0]===`.`||t&&!E(o)||u&&u.includes(o)){if(Br(e,o,d[o]))continue;r(e,o,null,d[o],i,n)}}else if(d.onClick)r(e,`onClick`,null,d.onClick,void 0,n);else if(f&4&&qt(d.style))for(let e in d.style)d.style[e]}let x;(x=d&&d.onVnodeBeforeMount)&&Q(x,n,t),h&&Vn(t,null,n,`beforeMount`),((x=d&&d.onVnodeMounted)||h||l)&&Qa(()=>{x&&Q(x,n,t),l&&g.enter(e),h&&Vn(t,null,n,`mounted`)},i)}return e.nextSibling},m=(e,t,r,a,s,c,u)=>{u||=!!t.dynamicChildren;let d=t.children,p=d.length,m=!1;for(let t=0;t{let{slotScopeIds:c}=t;c&&(i=i?i.concat(c):c);let d=s(e),f=m(o(e),t,d,n,r,i,a);return f&&Lr(f)&&f.data===`]`?o(t.anchor=f):(Nr(),l(t.anchor=u(`]`),d,f),f)},g=(e,t,r,i,a,l)=>{if(Gr(e,t)||Nr(),t.el=null,l){let t=_(e);for(;;){let n=o(e);if(n&&n!==t)c(n);else break}}let u=o(e),d=s(e);return c(e),n(null,t,d,u,r,i,Ir(d),a),r&&(r.vnode.el=t.el,fa(r,t.el)),u},_=(e,t=`[`,n=`]`)=>{let r=0;for(;e;)if(e=o(e),e&&Lr(e)&&(e.data===t&&r++,e.data===n)){if(r===0)return o(e);r--}return e},v=(e,t,n)=>{let r=t.parentNode;r&&r.replaceChild(e,t);let i=n;for(;i;)i.vnode.el===t&&(i.vnode.el=i.subTree.el=e),i=i.parent},y=e=>e.nodeType===1&&e.tagName===`TEMPLATE`;return[d,f]}var zr=new Set([`src`,`srcset`,`href`,`poster`]);function Br(e,t,n){return zr.has(t)?e.getAttribute(t)===(n==null?null:`${n}`):!1}var Vr=`data-allow-mismatch`,Hr={0:`text`,1:`children`,2:`class`,3:`style`,4:`attribute`};function Ur(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Vr);)e=e.parentElement;return Wr(e&&e.getAttribute(Vr),t)}function Wr(e,t){if(e==null)return!1;if(e===``)return!0;{let n=e.split(`,`);return t===0&&n.includes(`children`)?!0:n.includes(Hr[t])}}function Gr(e,t){return Ur(e.parentElement,1)||Kr(e)||qr(t)}function Kr(e){return e.nodeType===1&&Wr(e.getAttribute(Vr),1)}function qr({props:e}){let t=e&&e[Vr];return typeof t==`string`&&Wr(t,1)}le().requestIdleCallback,le().cancelIdleCallback;function Jr(e,t){if(Lr(e)&&e.data===`[`){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(Lr(r)){if(r.data===`]`){if(--n===0)break}else r.data===`[`&&n++}r=r.nextSibling}}else t(e)}var Yr=e=>!!e.type.__asyncLoader;function Xr(e){g(e)&&(e={loader:e});let{loader:t,loadingComponent:n,errorComponent:r,delay:i=200,hydrate:a,timeout:o,suspensible:s=!0,onError:c}=e,l=null,u,d=0,f=()=>(d++,l=null,p()),p=()=>{let e;return l||(e=l=t().catch(e=>{if(e=e instanceof Error?e:Error(String(e)),c)return new Promise((t,n)=>{c(e,()=>t(f()),()=>n(e),d+1)});throw e}).then(t=>e!==l&&l?l:(t&&(t.__esModule||t[Symbol.toStringTag]===`Module`)&&(t=t.default),u=t,t)))};return Tr({name:`AsyncComponentWrapper`,__asyncLoader:p,__asyncHydrate(e,t,n){let r=e.isConnected,i=!1;(t.bu||=[]).push(()=>i=!0);let o=()=>{i||!e.parentNode||r&&!e.isConnected||n()},s=a?()=>{let n=a(o,t=>Jr(e,t));n&&(t.bum||=[]).push(n)}:o;u?s():p().then(()=>!t.isUnmounted&&s())},get __asyncResolved(){return u},setup(){let e=$;if(Dr(e),u)return()=>Zr(u,e);let t=t=>{l=null,bn(t,e,13,!r)};if(s&&e.suspense||Po)return p().then(t=>()=>Zr(t,e)).catch(e=>(t(e),()=>r?X(r,{error:e}):null));let a=Zt(!1),c=Zt(),d=Zt(!!i),f,m;return mi(()=>{f!=null&&clearTimeout(f),m!=null&&clearTimeout(m)}),i&&(m=setTimeout(()=>{e.isUnmounted||(d.value=!1)},i)),o!=null&&(f=setTimeout(()=>{if(!e.isUnmounted&&!a.value&&!c.value){let e=Error(`Async component timed out after ${o}ms.`);t(e),c.value=e}},o)),p().then(()=>{e.isUnmounted||(a.value=!0,e.parent&&Qr(e.parent.vnode)&&e.parent.update())}).catch(n=>{if(e.isUnmounted){l=null;return}t(n),c.value=n}),()=>{if(a.value&&u)return Zr(u,e);if(c.value&&r)return X(r,{error:c.value});if(n&&!d.value)return Zr(n,e)}}})}function Zr(e,t){let{ref:n,props:r,children:i,ce:a}=t.vnode,o=X(e,r,i);return o.ref=n,o.ce=a,delete t.vnode.ce,o}var Qr=e=>e.type.__isKeepAlive,$r={name:`KeepAlive`,__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){let n=Oo(),r=n.ctx;if(!r.renderer)return()=>{let e=t.default&&t.default();return e&&e.length===1?e[0]:e};let i=new Map,a=new Set,o=null,s=n.suspense,{renderer:{p:c,m:l,um:u,o:{createElement:d}}}=r,f=d(`div`);r.activate=(e,t,n,r,i)=>{let a=e.component;l(e,t,n,0,s),c(a.vnode,e,t,n,a,s,r,e.slotScopeIds,i),K(()=>{a.isDeactivated=!1,a.a&&A(a.a);let t=e.props&&e.props.onVnodeMounted;t&&Q(t,a.parent,e)},s)},r.deactivate=e=>{let t=e.component;Ba(t.m),Ba(t.a),l(e,f,null,1,s),K(()=>{t.da&&A(t.da);let n=e.props&&e.props.onVnodeUnmounted;n&&Q(n,t.parent,e),t.isDeactivated=!0},s)};function p(e){ai(e),u(e,n,s,!0)}function m(e){i.forEach((t,n)=>{let r=Ho(Yr(t)?t.type.__asyncResolved||{}:t.type);r&&!e(r)&&h(n)})}function h(e){let t=i.get(e);t&&(!o||!po(t,o))?p(t):o&&ai(o),i.delete(e),a.delete(e)}Jn(()=>[e.include,e.exclude],([e,t])=>{e&&m(t=>ei(e,t)),t&&m(e=>!ei(t,e))},{flush:`post`,deep:!0});let g=null,_=()=>{g!=null&&(Ha(n.subTree.type)?K(()=>{let e=oi(n.subTree);e.component&&i.set(g,e)},n.subTree.suspense):i.set(g,oi(n.subTree)))};return ui(_),fi(_),pi(()=>{i.forEach(e=>{let{subTree:t,suspense:r}=n,i=oi(t);if(e.type===i.type&&e.key===i.key){ai(i);let e=i.component.da;e&&K(e,r);return}p(e)})}),()=>{if(g=null,!t.default)return o=null;let n=t.default(),r=n[0];if(n.length>1)return o=null,n;if(!fo(r)||!(r.shapeFlag&4)&&!(r.shapeFlag&128))return o=null,r;let s=oi(r);if(s.type===J)return o=null,s;let c=s.type,l=Ho(Yr(s)?s.type.__asyncResolved||{}:c),{include:u,exclude:d,max:f}=e;if(u&&(!l||!ei(u,l))||d&&l&&ei(d,l))return s.shapeFlag&=-257,o=s,r;let p=s.key==null?c:s.key,m=i.get(p);return s.el&&(s=yo(s),r.shapeFlag&128&&(r.ssContent=s)),g=p,m?(s.el=m.el,s.component=m.component,s.transition&&Cr(s,s.transition),s.shapeFlag|=512,a.delete(p),a.add(p)):(a.add(p),f&&a.size>parseInt(f,10)&&h(a.values().next().value)),s.shapeFlag|=256,o=s,Ha(r.type)?r:s}}};function ei(e,t){return d(e)?e.some(e=>ei(e,t)):_(e)?e.split(`,`).includes(t):h(e)?(e.lastIndex=0,e.test(t)):!1}function ti(e,t){ri(e,`a`,t)}function ni(e,t){ri(e,`da`,t)}function ri(e,t,n=$){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if(si(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Qr(e.parent.vnode)&&ii(r,t,n,e),e=e.parent}}function ii(e,t,n,r){let i=si(t,e,r,!0);mi(()=>{c(r[t],i)},n)}function ai(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function oi(e){return e.shapeFlag&128?e.ssContent:e}function si(e,t,n=$,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{Je();let i=jo(n),a=B(t,n,e,r);return i(),Ye(),a};return r?i.unshift(a):i.push(a),a}}var ci=e=>(t,n=$)=>{(!Po||e===`sp`)&&si(e,(...e)=>t(...e),n)},li=ci(`bm`),ui=ci(`m`),di=ci(`bu`),fi=ci(`u`),pi=ci(`bum`),mi=ci(`um`),hi=ci(`sp`),gi=ci(`rtg`),_i=ci(`rtc`);function vi(e,t=$){si(`ec`,e,t)}var yi=`components`;function bi(e,t){return Ci(yi,e,!0,t)||e}var xi=Symbol.for(`v-ndc`);function Si(e){return _(e)?Ci(yi,e,!1)||e:e||xi}function Ci(e,t,n=!0,r=!1){let i=H||$;if(i){let n=i.type;if(e===yi){let e=Ho(n,!1);if(e&&(e===t||e===O(t)||e===re(O(t))))return n}let a=wi(i[e]||n[e],t)||wi(i.appContext[e],t);return!a&&r?n:a}}function wi(e,t){return e&&(e[t]||e[O(t)]||e[re(O(t))])}function Ti(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||_(e)){let n=o&&qt(e),r=!1,s=!1;n&&(r=!I(e),s=F(e),e=ct(e)),i=Array(e.length);for(let n=0,o=e.length;nt(e,n,void 0,a&&a[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,o=n.length;r0;return t!=="default"&&(e.name=t),io(),uo(q,null,[X(`slot`,e,r&&r())],i?-2:64)}let o=e[t];o&&o._c&&(o._d=!1);let c=ro.length;io();let l;try{let i=o&&Di(o(n)),s=n.key||a||i&&i.key;l=uo(q,{key:(s&&!v(s)?s:`_${t}`)+(!i&&r?`_fb`:``)},i||(r?r():[]),i&&e._===1?64:-2)}catch(e){for(let e=ro.length;e>c;e--)ao();throw e}finally{o&&o._c&&(o._d=!0)}return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+`-s`]),l}function Di(e){return e.some(e=>!fo(e)||!(e.type===J||e.type===q&&!Di(e.children)))?e:null}var Oi=e=>e?No(e)?Vo(e):Oi(e.parent):null,ki=s(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Oi(e.parent),$root:e=>Oi(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Vi(e),$forceUpdate:e=>e.f||=()=>{An(e.update)},$nextTick:e=>e.n||=On.bind(e.proxy),$watch:e=>Xn.bind(e)}),Ai=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),ji={get({_:e},n){if(n===`__v_skip`)return!0;let{ctx:r,setupState:i,data:a,props:o,accessCache:s,type:c,appContext:l}=e;if(n[0]!==`$`){let e=s[n];if(e!==void 0)switch(e){case 1:return i[n];case 2:return a[n];case 4:return r[n];case 3:return o[n]}else if(Ai(i,n))return s[n]=1,i[n];else if(a!==t&&u(a,n))return s[n]=2,a[n];else if(u(o,n))return s[n]=3,o[n];else if(r!==t&&u(r,n))return s[n]=4,r[n];else Ii&&(s[n]=0)}let d=ki[n],f,p;if(d)return n===`$attrs`&&P(e.attrs,`get`,``),d(e);if((f=c.__cssModules)&&(f=f[n]))return f;if(r!==t&&u(r,n))return s[n]=4,r[n];if(p=l.config.globalProperties,u(p,n))return p[n]},set({_:e},n,r){let{data:i,setupState:a,ctx:o}=e;return Ai(a,n)?(a[n]=r,!0):i!==t&&u(i,n)?(i[n]=r,!0):u(e.props,n)||n[0]===`$`&&n.slice(1)in e?!1:(o[n]=r,!0)},has({_:{data:e,setupState:n,accessCache:r,ctx:i,appContext:a,props:o,type:s}},c){let l;return!!(r[c]||e!==t&&c[0]!==`$`&&u(e,c)||Ai(n,c)||u(o,c)||u(i,c)||u(ki,c)||u(a.config.globalProperties,c)||(l=s.__cssModules)&&l[c])},defineProperty(e,t,n){return n.get==null?u(n,`value`)&&this.set(e,t,n.value,null):e._.accessCache[t]=0,Reflect.defineProperty(e,t,n)}};function Mi(){return Pi(`useSlots`).slots}function Ni(){return Pi(`useAttrs`).attrs}function Pi(e){let t=Oo();return t.setupContext||=Bo(t)}function Fi(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var Ii=!0;function Li(e){let t=Vi(e),n=e.proxy,i=e.ctx;Ii=!1,t.beforeCreate&&zi(t.beforeCreate,e,`bc`);let{data:a,computed:o,methods:s,watch:c,provide:l,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:h,updated:_,activated:v,deactivated:b,beforeDestroy:x,beforeUnmount:S,destroyed:C,unmounted:w,render:T,renderTracked:E,renderTriggered:D,errorCaptured:ee,serverPrefetch:O,expose:te,inheritAttrs:ne,components:re,directives:ie,filters:k}=t;if(u&&Ri(u,i,null),s)for(let e in s){let t=s[e];g(t)&&(i[e]=t.bind(n))}if(a){let t=a.call(n,n);y(t)&&(e.data=Ht(t))}if(Ii=!0,o)for(let e in o){let t=o[e],a=Wo({get:g(t)?t.bind(n,n):g(t.get)?t.get.bind(n,n):r,set:!g(t)&&g(t.set)?t.set.bind(n):r});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(c)for(let e in c)Bi(c[e],i,n,e);if(l){let e=g(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{Hn(t,e[t])})}f&&zi(f,e,`c`);function A(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(A(li,p),A(ui,m),A(di,h),A(fi,_),A(ti,v),A(ni,b),A(vi,ee),A(_i,E),A(gi,D),A(pi,S),A(mi,w),A(hi,O),d(te)){if(te.length){let t=e.exposed||={};te.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||={}}T&&e.render===r&&(e.render=T),ne!=null&&(e.inheritAttrs=ne),re&&(e.components=re),ie&&(e.directives=ie),O&&Dr(e)}function Ri(e,t,n=r){d(e)&&(e=Ki(e));for(let n in e){let r=e[n],i;i=y(r)?`default`in r?Un(r.from||n,r.default,!0):Un(r.from||n):Un(r),z(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function zi(e,t,n){B(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function Bi(e,t,n,r){let i=r.includes(`.`)?Zn(n,r):()=>n[r];if(_(e)){let n=t[e];g(n)&&Jn(i,n)}else if(g(e))Jn(i,e.bind(n));else if(y(e)){if(d(e))e.forEach(e=>Bi(e,t,n,r));else{let r=g(e.handler)?e.handler.bind(n):t[e.handler];g(r)&&Jn(i,r,e)}}}function Vi(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t),c;return s?c=s:!i.length&&!n&&!r?c=t:(c={},i.length&&i.forEach(e=>Hi(c,e,o,!0)),Hi(c,t,o)),y(t)&&a.set(t,c),c}function Hi(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&Hi(e,a,n,!0),i&&i.forEach(t=>Hi(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=Ui[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var Ui={data:Wi,props:Ji,emits:Ji,methods:qi,computed:qi,beforeCreate:G,created:G,beforeMount:G,mounted:G,beforeUpdate:G,updated:G,beforeDestroy:G,beforeUnmount:G,destroyed:G,unmounted:G,activated:G,deactivated:G,errorCaptured:G,serverPrefetch:G,components:qi,directives:qi,watch:Yi,provide:Wi,inject:Gi};function Wi(e,t){return t?e?function(){return s(g(e)?e.call(this,this):e,g(t)?t.call(this,this):t)}:t:e}function Gi(e,t){return qi(Ki(e),Ki(t))}function Ki(e){if(d(e)){let t={};for(let n=0;nt===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${O(t)}Modifiers`]||e[`${ne(t)}Modifiers`];function ta(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&ea(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>_(e)?e.trim():e)),s.number&&(a=a.map(oe)));let c,l=i[c=ie(n)]||i[c=ie(O(n))];!l&&o&&(l=i[c=ie(ne(n))]),l&&B(l,e,6,a);let u=i[c+`Once`];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,B(u,e,6,a)}}var na=new WeakMap;function ra(e,t,n=!1){let r=n?na:t.emitsCache,i=r.get(e);if(i!==void 0)return i;let a=e.emits,o={},c=!1;if(!g(e)){let r=e=>{let n=ra(e,t,!0);n&&(c=!0,s(o,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return!a&&!c?(y(e)&&r.set(e,null),null):(d(a)?a.forEach(e=>o[e]=null):s(o,a),y(e)&&r.set(e,o),o)}function ia(e,t){return!e||!a(t)?!1:(t=t.slice(2),t=t===`Once`?t:t.replace(/Once$/,``),u(e,t[0].toLowerCase()+t.slice(1))||u(e,ne(t))||u(e,t))}function aa(e){let{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[a],slots:s,attrs:c,emit:l,render:u,renderCache:d,props:f,data:p,setupState:m,ctx:h,inheritAttrs:g}=e,_=Rn(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=Z(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=Z(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:sa(c)}}catch(t){ro.length=0,bn(t,e,1),v=X(J)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=ca(y,a)),b=yo(b,y,!1,!0))}return n.dirs&&(b=yo(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&Cr(er(b.type)&&Sr(b)||b,n.transition),v=b,Rn(_),v}function oa(e,t=!0){let n;for(let t=0;t{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||={})[n]=e[n]);return t},ca=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function la(e,t,n){let{props:r,children:i,component:a}=e,{props:o,children:s,patchFlag:c}=t,l=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?ua(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;tObject.create(pa),ha=e=>Object.getPrototypeOf(e)===pa;function ga(e,t,n,r=!1){let i={},a=ma();e.propsDefaults=Object.create(null),va(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);e.props=n?r?i:Ut(i):e.type.props?i:a,e.attrs=a}function _a(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=L(i),[c]=e.propsOptions,l=!1;if((r||o>0)&&!(o&16)){if(o&8){let n=e.vnode.dynamicProps;for(let r=0;r{p=!0;let[t,n]=xa(e,r,!0);s(l,t),n&&f.push(...n)};!i&&r.mixins.length&&r.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!c&&!p)return y(e)&&a.set(e,n),n;if(d(c))for(let e=0;ee===`_`||e===`_ctx`||e===`$stable`,wa=e=>d(e)?e.map(Z):[Z(e)],Ta=(e,t,n)=>{if(t._n)return t;let r=zn((...e)=>wa(t(...e)),n);return r._c=!1,r},Ea=(e,t,n)=>{let r=e._ctx;for(let n in e){if(Ca(n))continue;let i=e[n];if(g(i))t[n]=Ta(n,i,r);else if(i!=null){let e=wa(i);t[n]=()=>e}}},Da=(e,t)=>{let n=wa(t);e.slots.default=()=>n},Oa=(e,t,n)=>{for(let r in t)(n||!Ca(r))&&(e[r]=t[r])},ka=(e,t,n)=>{let r=e.slots=ma();if(e.vnode.shapeFlag&32){let e=t._;e?(Oa(r,t,n),n&&ae(r,`_`,e,!0)):Ea(t,r)}else t&&Da(e,t)},Aa=(e,n,r)=>{let{vnode:i,slots:a}=e,o=!0,s=t;if(i.shapeFlag&32){let e=n._;e?r&&e===1?o=!1:Oa(a,n,r):(o=!n.$stable,Ea(n,a)),s=n}else n&&(Da(e,n),s={default:1});if(o)for(let e in a)!Ca(e)&&s[e]==null&&delete a[e]},K=Qa;function ja(e){return Na(e)}function Ma(e){return Na(e,Rr)}function Na(e,i){let a=le();a.__VUE__=!0;let{insert:o,remove:s,patchProp:c,createElement:l,createText:u,createComment:d,setText:f,setElementText:p,parentNode:m,nextSibling:h,setScopeId:g=r,insertStaticContent:_}=e,v=(e,t,r,i=null,a=null,o=null,s=void 0,c=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!po(e,t)&&(i=ve(e),pe(e,a,o,!0),e=null),t.patchFlag===-2&&(l=!1,t.dynamicChildren=null),t.dynamicChildren&&e&&e.dynamicChildren&&e.dynamicChildren.hasOnce&&(t.dynamicChildren===n&&(t.dynamicChildren=[]),t.dynamicChildren.hasOnce=!0);let{type:u,ref:d,shapeFlag:f}=t;switch(u){case to:y(e,t,r,i);break;case J:b(e,t,r,i);break;case no:e??x(t,r,i,s);break;case q:re(e,t,r,i,a,o,s,c,l);break;default:f&1?w(e,t,r,i,a,o,s,c,l):f&6?ie(e,t,r,i,a,o,s,c,l):(f&64||f&128)&&u.process(e,t,r,i,a,o,s,c,l,xe)}d!=null&&a?Ar(d,e&&e.ref,o,t||e,!t):d==null&&e&&e.ref!=null&&Ar(e.ref,null,o,e,!0)},y=(e,t,n,r)=>{if(e==null)o(t.el=u(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},b=(e,t,n,r)=>{e==null?o(t.el=d(t.children||``),n,r):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},S=({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=h(e),o(e,n,r),e=i;o(t,n,r)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)},w=(e,t,n,r,i,a,o,s,c)=>{if(t.type===`svg`?o=`svg`:t.type===`math`&&(o=`mathml`),e==null)T(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),O(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},T=(e,t,n,r,i,a,s,u)=>{let d,f,{props:m,shapeFlag:h,transition:g,dirs:_}=e;if(d=e.el=l(e.type,a,m&&m.is,m),h&8?p(d,e.children):h&16&&ee(e.children,d,null,r,i,Pa(e,a),s,u),_&&Vn(e,null,r,`created`),D(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!E(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&Q(f,r,e)}_&&Vn(e,null,r,`beforeMount`);let v=Ia(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&K(()=>{try{f&&Q(f,r,e),v&&g.enter(d),_&&Vn(e,null,r,`mounted`)}finally{}},i)},D=(e,t,n,r,i)=>{if(n&&g(e,n),r)for(let t=0;t{for(let l=c;l{let l=n.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:f}=n;u|=e.patchFlag&16;let m=e.props||t,h=n.props||t,g;if(r&&Fa(r,!1),(g=h.onVnodeBeforeUpdate)&&Q(g,r,n,e),f&&Vn(n,e,r,`beforeUpdate`),r&&Fa(r,!0),d&&(!e.dynamicChildren||e.dynamicChildren.length!==d.length)&&(u=0,s=!1,d=null),(m.innerHTML&&h.innerHTML==null||m.textContent&&h.textContent==null)&&p(l,``),d?te(e.dynamicChildren,d,l,r,i,Pa(n,a),o):s||ce(e,n,l,null,r,i,Pa(n,a),o,!1),u>0){if(u&16)ne(l,m,h,r,a);else if(u&2&&m.class!==h.class&&c(l,`class`,null,h.class,a),u&4&&c(l,`style`,m.style,h.style,a),u&8){let e=n.dynamicProps;for(let t=0;t{g&&Q(g,r,n,e),f&&Vn(n,e,r,`updated`)},i)},te=(e,t,n,r,i,a,o)=>{for(let s=0;s{if(n!==r){if(n!==t)for(let t in n)!E(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(E(t))continue;let o=r[t],s=n[t];o!==s&&t!==`value`&&c(e,t,s,o,a,i)}`value`in r&&c(e,`value`,n.value,r.value,a)}},re=(e,t,n,r,i,a,s,c,l)=>{let d=t.el=e?e.el:u(``),f=t.anchor=e?e.anchor:u(``),{patchFlag:p,dynamicChildren:m,slotScopeIds:h}=t;h&&(c=c?c.concat(h):h),e==null?(o(d,n,r),o(f,n,r),ee(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(te(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&La(e,t,!0)):ce(e,t,n,f,i,a,s,c,l)},ie=(e,t,n,r,i,a,o,s,c)=>{t.slotScopeIds=s,e==null?t.shapeFlag&512?i.ctx.activate(t,n,r,o,c):k(t,n,r,i,a,o,c):ae(e,t,c)},k=(e,t,n,r,i,a,o)=>{let s=e.component=Do(e,r,i);if(Qr(e)&&(s.ctx.renderer=xe),Fo(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,oe,o),!e.el){let r=s.subTree=X(J);b(null,r,t,n),e.placeholder=r.el}}else oe(s,e,t,n,i,a,o)},ae=(e,t,n)=>{let r=t.component=e.component;if(la(e,t,n)){if(r.asyncDep&&!r.asyncResolved){t.el=e.el,se(r,t,n);return}r.next=t,r.update()}else t.el=e.el,r.vnode=t},oe=(e,t,n,r,i,a,o)=>{let s=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{let n=za(e);if(n){t&&(t.el=c.el,se(e,t,o)),n.asyncDep.then(()=>{K(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;Fa(e,!1),t?(t.el=c.el,se(e,t,o)):t=c,n&&A(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&Q(d,s,t,c),Fa(e,!0);let f=aa(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),ve(p),e,i,a),t.el=f.el,u===null&&fa(e,f.el),r&&K(r,i),(d=t.props&&t.props.onVnodeUpdated)&&K(()=>Q(d,s,t,c),i)}else{let o,{el:s,props:c}=t,{bm:l,m:u,parent:d,root:f,type:p}=e,m=Yr(t);if(Fa(e,!1),l&&A(l),!m&&(o=c&&c.onVnodeBeforeMount)&&Q(o,d,t),Fa(e,!0),s&&Ce){let t=()=>{e.subTree=aa(e),Ce(s,e.subTree,e,i,null)};m&&p.__asyncHydrate?p.__asyncHydrate(s,e,t):t()}else{f.ce&&f.ce._hasShadowRoot()&&f.ce._injectChildStyle(p,e.parent?e.parent.type:void 0);let o=e.subTree=aa(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&K(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;K(()=>Q(o,d,e),i)}(t.shapeFlag&256||d&&Yr(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&K(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new Pe(s);e.scope.off();let l=e.update=c.run.bind(c),u=e.job=c.runIfDirty.bind(c);u.i=e,u.id=e.uid,c.scheduler=()=>An(u),Fa(e,!0),l()},se=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,_a(e,t.props,r,n),Aa(e,t.children,n),Je(),Nn(e),Ye()},ce=(e,t,n,r,i,a,o,s,c=!1)=>{let l=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:m}=t;if(f>0){if(f&128){de(l,d,n,r,i,a,o,s,c);return}if(f&256){ue(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&_e(l,i,a),d!==l&&p(n,d)):u&16?m&16?de(l,d,n,r,i,a,o,s,c):_e(l,i,a,!0):(u&8&&p(n,``),m&16&&ee(d,n,r,i,a,o,s,c))},ue=(e,t,r,i,a,o,s,c,l)=>{e||=n,t||=n;let u=e.length,d=t.length,f=Math.min(u,d),p=0;for(;pd?_e(e,a,o,!0,!1,f):ee(t,r,i,a,o,s,c,l,f)},de=(e,t,r,i,a,o,s,c,l)=>{let u=0,d=t.length,f=e.length-1,p=d-1;for(;u<=f&&u<=p;){let n=e[u],i=t[u]=l?So(t[u]):Z(t[u]);if(po(n,i))v(n,i,r,null,a,o,s,c,l);else break;u++}for(;u<=f&&u<=p;){let n=e[f],i=t[p]=l?So(t[p]):Z(t[p]);if(po(n,i))v(n,i,r,null,a,o,s,c,l);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,n=ep)for(;u<=f;)pe(e[u],a,o,!0),u++;else{let m=u,h=u,g=new Map;for(u=h;u<=p;u++){let e=t[u]=l?So(t[u]):Z(t[u]);e.key!=null&&g.set(e.key,u)}let _,y=0,b=p-h+1,x=!1,S=0,C=Array(b);for(u=0;u=b){pe(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&po(n,t[_])){i=_;break}i===void 0?pe(n,a,o,!0):(C[i-h]=u+1,i>=S?S=i:x=!0,v(n,t[i],r,null,a,o,s,c,l),y++)}let w=x?Ra(C):n;for(_=w.length-1,u=b-1;u>=0;u--){let e=h+u,n=t[e],f=t[e+1],p=e+1{let{el:a,type:c,transition:l,children:u,shapeFlag:d}=e;if(d&6){fe(e.component.subTree,t,n,r);return}if(d&128){e.suspense.move(t,n,r);return}if(d&64){c.move(e,t,n,xe);return}if(c===q){o(a,t,n);for(let e=0;el.enter(a),i));else{let{leave:r,delayLeave:i,afterLeave:c}=l,u=()=>{e.ctx.isUnmounted?s(a):o(a,t,n)},d=()=>{let e=a._isLeaving||!!a[U];a._isLeaving&&a[U](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}}else o(a,t,n)},pe=(e,t,n,r=!1,i=!1)=>{let{type:a,props:o,ref:s,children:c,dynamicChildren:l,shapeFlag:u,patchFlag:d,dirs:f,cacheIndex:p,memo:m}=e;if((d===-2||l&&l.hasOnce)&&(i=!1),s!=null&&(Je(),Ar(s,null,n,e,!0),Ye()),p!=null&&(!e.ctx||e.ctx===t)&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!Yr(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&Q(_,t,e),u&6)ge(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Vn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,xe,r):l&&!l.hasOnce&&(a!==q||d>0&&d&64)?_e(l,t,n,!1,!0):(a===q&&d&384||!i&&u&16)&&_e(c,t,n),r&&me(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&K(()=>{_&&Q(_,t,e),h&&Vn(e,null,t,`unmounted`),v&&(e.el=null)},n)},me=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===q){he(n,r);return}if(t===no){C(e),i&&!i.persisted&&i.afterLeave&&i.afterLeave();return}let a=()=>{s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(e.shapeFlag&1&&i&&!i.persisted){let{leave:t,delayLeave:r}=i,o=()=>t(n,a);r?r(e.el,a,o):o()}else a()},he=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},ge=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;Ba(c),Ba(l),r&&A(r),i.stop(),a?(a.flags|=8,pe(o,e,t,n)):e.vnode.el&&o&&(o.transition=e.vnode.transition,pe(o,e,t,n)),s&&K(s,t),K(()=>{e.isUnmounted=!0},t)},_e=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o{if(e.shapeFlag&6)return ve(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[$n];return n?h(n):t},ye=!1,be=(e,t,n)=>{let r;e==null?t._vnode&&(pe(t._vnode,null,null,!0),r=t._vnode.component):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e,ye||=(ye=!0,Nn(r),Pn(),!1)},xe={p:v,um:pe,m:fe,r:me,mt:k,mc:ee,pc:ce,pbc:te,n:ve,o:e},Se,Ce;return i&&([Se,Ce]=i(xe)),{render:be,hydrate:Se,createApp:Qi(be,Se)}}function Pa({type:e,props:t},n){return n===`svg`&&e===`foreignObject`||n===`mathml`&&e===`annotation-xml`&&t&&t.encoding&&t.encoding.includes(`html`)?void 0:n}function Fa({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ia(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function La(e,t,n=!1){let r=e.children,i=t.children;if(d(r)&&d(i))for(let e=0;e>1,e[n[s]]0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,o=n[a-1];a-->0;)n[a]=o,o=t[o];return n}function za(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:za(t)}function Ba(e){if(e)for(let t=0;te.__isSuspense,Ua=0,Wa={name:`Suspense`,__isSuspense:!0,process(e,t,n,r,i,a,o,s,c,l){if(e==null)Ka(t,n,r,i,a,o,s,c,l);else{if(a&&a.deps>0&&!e.suspense.isInFallback&&!a.isHydrating){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}qa(e,t,n,r,i,o,s,c,l)}},hydrate:Ya,normalize:Xa};function Ga(e,t){let n=e.props&&e.props[t];g(n)&&n()}function Ka(e,t,n,r,i,a,o,s,c){let{p:l,o:{createElement:u}}=c,d=u(`div`),f=e.suspense=Ja(e,i,r,t,d,n,a,o,s,c);l(null,f.pendingBranch=e.ssContent,d,null,r,f,a,o),f.deps>0?(Ga(e,`onPending`),Ga(e,`onFallback`),l(null,e.ssFallback,t,n,r,null,a,o),$a(f,e.ssFallback)):f.resolve(!1,!0)}function qa(e,t,n,r,i,a,o,s,{p:c,um:l,o:{createElement:u}}){let d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;let f=t.ssContent,p=t.ssFallback,{activeBranch:m,pendingBranch:h,isInFallback:g,isHydrating:_}=d;if(h)d.pendingBranch=f,po(h,f)?(d.deps++,c(h,f,_?n:d.hiddenContainer,null,i,d,a,o,s),d.deps--,d.deps<=0?d.resolve():g&&!_&&!d.isFallbackMountPending&&(c(m,p,n,r,i,null,a,o,s),$a(d,p))):(d.pendingId=Ua++,_?(d.isHydrating=!1,d.activeBranch=h):l(h,i,d),d.deps=0,d.effects.length=0,d.hiddenContainer=u(`div`),g?(c(null,f,d.hiddenContainer,null,i,d,a,o,s),d.deps<=0?d.resolve():d.isFallbackMountPending||(c(m,p,n,r,i,null,a,o,s),$a(d,p))):m&&po(m,f)?(c(m,f,n,r,i,d,a,o,s),d.resolve(!0)):(c(null,f,d.hiddenContainer,null,i,d,a,o,s),d.deps<=0&&d.resolve()));else if(m&&po(m,f))c(m,f,n,r,i,d,a,o,s),$a(d,f);else if(Ga(t,`onPending`),d.pendingBranch=f,d.pendingId=f.shapeFlag&512?f.component.suspenseId:Ua++,c(null,f,d.hiddenContainer,null,i,d,a,o,s),d.deps<=0)d.resolve();else{let{timeout:e,pendingId:t}=d;e>0?setTimeout(()=>{d.pendingId===t&&d.fallback(p)},e):e===0&&d.fallback(p)}}function Ja(e,t,n,r,i,a,o,s,c,l,u=!1){let{p:d,m:f,um:p,n:m,o:{parentNode:h,remove:g}}=l,_,v=eo(e);v&&t&&t.pendingBranch&&(_=t.pendingId,t.deps++);let y=e.props?se(e.props.timeout):void 0,b=a,x={vnode:e,parent:t,parentComponent:n,namespace:o,container:r,hiddenContainer:i,deps:0,pendingId:Ua++,timeout:typeof y==`number`?y:-1,activeBranch:null,isFallbackMountPending:!1,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){let{vnode:r,activeBranch:i,pendingBranch:o,pendingId:s,effects:c,parentComponent:l,container:u,isInFallback:d}=x,g=!1;if(x.isHydrating)x.isHydrating=!1;else if(!e){g=i&&o.transition&&o.transition.mode===`out-in`;let e=!1;g&&(i.transition.afterLeave=()=>{s===x.pendingId&&(f(o,u,a===b&&!e?m(i):a,0),Mn(c),d&&r.ssFallback&&(r.ssFallback.el=null))}),i&&!x.isFallbackMountPending&&(h(i.el)===u&&(a=m(i),e=!0),p(i,l,x,!0),!g&&d&&r.ssFallback&&K(()=>r.ssFallback.el=null,x)),g||f(o,u,a,0)}x.isFallbackMountPending=!1,$a(x,o),x.pendingBranch=null,x.isInFallback=!1;let y=x.parent,S=!1;for(;y;){if(y.pendingBranch){for(let e=0;e{if(x.isFallbackMountPending=!1,!x.isInFallback)return;let e=x.vnode.ssFallback;d(null,e,i,o,r,null,a,s,c),$a(x,e)},u=e.transition&&e.transition.mode===`out-in`;u&&(x.isFallbackMountPending=!0,n.transition.afterLeave=l),x.isInFallback=!0,p(n,r,null,!0),u||l()},move(e,t,n){x.activeBranch&&f(x.activeBranch,e,t,n),x.container=e},next(){return x.activeBranch&&m(x.activeBranch)},registerDep(e,t,n){let r=!!x.pendingBranch;r&&x.deps++;let i=e.vnode.el;e.asyncDep.catch(t=>{bn(t,e,0)}).then(a=>{if(e.isUnmounted||x.isUnmounted||x.pendingId!==e.suspenseId)return;if(Mo(),i&&!e.scope.active){r&&--x.deps===0&&x.resolve();return}e.asyncResolved=!0;let{vnode:s}=e;Lo(e,a,!1),i&&(s.el=i);let c=!i&&e.subTree.el;t(e,s,h(i||e.subTree.el),i?null:m(e.subTree),x,o,n),c&&(s.placeholder=null,g(c)),fa(e,s.el),r&&--x.deps===0&&x.resolve()})},unmount(e,t){x.isUnmounted=!0,x.activeBranch&&p(x.activeBranch,n,e,t),x.pendingBranch&&p(x.pendingBranch,n,e,t)}};return x}function Ya(e,t,n,r,i,a,o,s,c){let l=t.suspense=Ja(t,r,n,e.parentNode,document.createElement(`div`),null,i,a,o,s,!0),u=c(e,l.pendingBranch=t.ssContent,n,l,a,o);return l.deps===0&&l.resolve(!1,!0),u}function Xa(e){let{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=Za(r?n.default:n),e.ssFallback=r?Za(n.fallback):X(J)}function Za(e){let t;if(g(e)){let n=oo&&e._c;n&&(e._d=!1,io()),e=e(),n&&(e._d=!0,t=Y,ao())}return d(e)&&(e=oa(e)),e=Z(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(t=>t!==e)),e}function Qa(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):Mn(e)}function $a(e,t){e.activeBranch=t;let{vnode:n,parentComponent:r}=e,i=t.el;for(;!i&&t.component;)t=t.component.subTree,i=t.el;n.el=i,r&&r.subTree===n&&(r.vnode.el=i,fa(r,i))}function eo(e){let t=e.props&&e.props.suspensible;return t!=null&&t!==!1}var q=Symbol.for(`v-fgt`),to=Symbol.for(`v-txt`),J=Symbol.for(`v-cmt`),no=Symbol.for(`v-stc`),ro=[],Y=null;function io(e=!1){ro.push(Y=e?null:[])}function ao(){ro.pop(),Y=ro[ro.length-1]||null}var oo=1;function so(e,t=!1){oo+=e,e<0&&Y&&t&&(Y.hasOnce=!0)}function co(e){return e.dynamicChildren=oo>0?Y||n:null,ao(),oo>0&&Y&&Y.push(e),e}function lo(e,t,n,r,i,a){return co(go(e,t,n,r,i,a,!0))}function uo(e,t,n,r,i){return co(X(e,t,n,r,i,!0))}function fo(e){return e?e.__v_isVNode===!0:!1}function po(e,t){return e.type===t.type&&e.key===t.key}var mo=({key:e})=>e??null,ho=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:_(e)||z(e)||g(e)?{i:H,r:e,k:t,f:!!n}:e);function go(e,t=null,n=null,r=0,i=null,a=e===q?0:1,o=!1,s=!1){let c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&mo(t),ref:t&&ho(t),scopeId:Ln,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:H};return s?(Co(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=_(n)?8:16),oo>0&&!o&&Y&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&Y.push(c),c}var X=_o;function _o(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===xi)&&(e=J),fo(e)){let r=yo(e,t,!0);return n&&Co(r,n),oo>0&&!a&&Y&&(r.shapeFlag&6?Y[Y.indexOf(e)]=r:Y.push(r)),r.patchFlag=-2,r}if(Uo(e)&&(e=e.__vccOpts),t){t=vo(t);let{class:e,style:n}=t;e&&!_(e)&&(t.class=he(e)),y(n)&&(Jt(n)&&!d(n)&&(n=s({},n)),t.style=ue(n))}let o=_(e)?1:Ha(e)?128:er(e)?64:y(e)?4:g(e)?2:0;return go(e,t,n,r,i,o,a,!0)}function vo(e){return e?Jt(e)||ha(e)?s({},e):e:null}function yo(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?wo(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&mo(l),ref:t&&t.ref?n&&a?d(a)?a.concat(ho(t)):[a,ho(t)]:ho(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==q?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&yo(e.ssContent),ssFallback:e.ssFallback&&yo(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return c&&r&&Cr(u,c.clone(u)),u}function bo(e=` `,t=0){return X(to,null,e,t)}function xo(e=``,t=!1){return t?(io(),uo(J,null,e)):X(J,null,e)}function Z(e){return e==null||typeof e==`boolean`?X(J):d(e)?X(q,null,e.slice()):fo(e)?So(e):X(to,null,String(e))}function So(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:yo(e)}function Co(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(d(t))n=16;else if(typeof t==`object`){if(r&65){let n=t.default;n&&(n._c&&(n._d=!1),Co(e,n()),n._c&&(n._d=!0));return}{n=32;let r=t._;!r&&!ha(t)?t._ctx=H:r===3&&H&&(H.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}}else if(g(t)){if(r&65){Co(e,{default:t});return}t={default:t,_ctx:H},n=32}else t=String(t),r&64?(n=16,t=[bo(t)]):n=8;e.children=t,e.shapeFlag|=n}function wo(...e){let t={};for(let n=0;n$||H,ko,Ao;{let e=le(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};ko=t(`__VUE_INSTANCE_SETTERS__`,e=>$=e),Ao=t(`__VUE_SSR_SETTERS__`,e=>Po=e)}var jo=e=>{let t=$;return ko(e),e.scope.on(),()=>{e.scope.off(),ko(t)}},Mo=()=>{$&&$.scope.off(),ko(null)};function No(e){return e.vnode.shapeFlag&4}var Po=!1;function Fo(e,t=!1,n=!1){t&&Ao(t);let{props:r,children:i}=e.vnode,a=No(e);ga(e,r,a,t),ka(e,i,n||t);let o=a?Io(e,t):void 0;return t&&Ao(!1),o}function Io(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,ji);let{setup:r}=n;if(r){Je();let n=e.setupContext=r.length>1?Bo(e):null,i=jo(e),a=yn(r,e,0,[e.props,n]),o=b(a);if(Ye(),i(),(o||e.sp)&&!Yr(e)&&Dr(e),o){if(a.then(Mo,Mo),t)return a.then(n=>{Ao(!0);try{Lo(e,n,t)}finally{Ao(!1)}}).catch(t=>{bn(t,e,0)});e.asyncDep=a}else Lo(e,a,t)}else Ro(e,t)}function Lo(e,t,n){g(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:y(t)&&(e.setupState=an(t)),Ro(e,n)}function Ro(e,t,n){let i=e.type;e.render||=i.render||r;{let t=jo(e);Je();try{Li(e)}finally{Ye(),t()}}}var zo={get(e,t){return P(e,`get`,``),e[t]}};function Bo(e){return{attrs:new Proxy(e.attrs,zo),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function Vo(e){return e.exposed?e.exposeProxy||=new Proxy(an(Yt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ki)return ki[n](e)},has(e,t){return t in e||t in ki}}):e.proxy}function Ho(e,t=!0){return g(e)?e.displayName||e.name:e.name||t&&e.__name}function Uo(e){return g(e)&&`__vccOpts`in e}var Wo=(e,t)=>fn(e,t,Po);function Go(e,t,n){try{so(-1);let r=arguments.length;return r===2?y(t)&&!d(t)?fo(t)?X(e,null,[t]):X(e,t):X(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&fo(n)&&(n=[n]),X(e,t,n))}finally{so(1)}}var Ko=`3.5.43`;export{z as $,ni as A,se as At,br as B,Wn as C,_ as Ct,On as D,ge as Dt,wo as E,he as Et,Hn as F,pr as G,Ni as H,Ti as I,zn as J,Jn as K,Ei as L,ui as M,fi as N,ti as O,ue as Ot,io as P,F as Q,bi as R,Go as S,ve as St,fo as T,oe as Tt,Er as U,Cr as V,Mi as W,Ae as X,Bn as Y,je as Z,Xr as _,d as _t,Wa as a,Qt as at,wr as b,y as bt,Wo as c,on as ct,xo as d,O as dt,Me as et,lo as f,re as ft,X as g,A as gt,bo as h,ye as ht,$r as i,Gt as it,vi as j,pi as k,Ee as kt,go as l,nn as lt,ja as m,ne as mt,mr as n,Zt as nt,lr as o,L as ot,Ma as p,s as pt,qn as q,q as r,Ut as rt,B as s,ln as st,vr as t,Ht as tt,uo as u,tn as ut,Tr as v,g as vt,Un as w,v as wt,vo as x,a as xt,Oo as y,o as yt,Si as z}; \ No newline at end of file diff --git a/server/adminui/_nuxt/C8yIGsZb.js b/server/adminui/_nuxt/C8yIGsZb.js new file mode 100644 index 0000000..e2e82f6 --- /dev/null +++ b/server/adminui/_nuxt/C8yIGsZb.js @@ -0,0 +1 @@ +import{D as e,Et as t,J as n,L as r,M as i,Ot as a,P as o,W as s,c,d as l,f as u,g as d,k as f,l as p,nt as m,u as h,ut as ee,v as g,w as _,z as v}from"./Bx_a1Ri3.js";import{j as y}from"./Dw7E2aQ0.js";import{n as b}from"./D2-o7L18.js";import{t as x}from"./z_P_bNzM.js";var te={key:0,class:`relative flex items-center justify-center shrink-0`},S=[`src`],C={key:2,class:`leading-none tracking-tight`},w={key:3,class:`relative flex items-center justify-center shrink-0`},T=[`src`],E=[`disabled`],D={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},O=g({__name:`Chip`,props:{variant:{default:void 0},size:{default:void 0},selectable:{type:Boolean,default:!1},selected:{type:Boolean,default:void 0},value:{default:void 0},closable:{type:Boolean,default:!1},disabled:{type:Boolean,default:void 0},loading:{type:Boolean,default:void 0},round:{type:Boolean,default:!1},icon:{default:null},avatar:{default:``},suffixIcon:{default:null},suffixAvatar:{default:``},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`click`,`select`,`update:selected`,`close`],setup(g,{emit:O}){let k=g,A=O;s();let j=m(!1),M=m(!1),N=m(!1),P=_(`FuxstoChipGroup`,null),F=c(()=>k.variant||P?.variant.value||`secondary`),I=c(()=>k.size||P?.size.value||`md`),L=c(()=>k.disabled??P?.disabled.value??!1),R=c(()=>k.loading??P?.loading.value??!1),z=c(()=>{if(P&&k.value!==void 0){let e=P.modelValue.value;return P.multiple.value&&Array.isArray(e)?e.includes(k.value):e===k.value}return k.selected||!1}),B=m(null),V=m(null),H=m(0),U=m(!0),W=m(null),G=m(!1),K=(e,t,n)=>{let r=B.value;if(!r||e===t){n&&n();return}G.value=!0,W.value=`${e}px`;let i=r.animate([{width:`${e}px`},{width:`${t}px`}],{duration:300,easing:`cubic-bezier(0.25, 1, 0.5, 1)`});i.onfinish=()=>{G.value=!1,W.value=null,n&&n()}},q=null,J=null;i(()=>{if(k.animate&&(J=setTimeout(()=>{j.value=!0},k.delay)),B.value&&V.value){H.value=B.value.offsetWidth;let t=new ResizeObserver(()=>{if(U.value){U.value=!1;return}if(R.value||G.value)return;let t=W.value;W.value=null,e(()=>{if(!B.value)return;let e=B.value.offsetWidth;W.value=t,H.value!==0&&Math.abs(H.value-e)>1&&K(H.value,e,()=>{H.value=e})})});t.observe(V.value),q=t}}),f(()=>{q?.disconnect(),q=null,J!==null&&(clearTimeout(J),J=null)});let Y=e=>{if(!(L.value||R.value)){if(A(`click`,e),P){if(k.value===void 0){console.warn(`[fuxsto-design] Chip 在 ChipGroup 内使用时必须传 value,否则点击不会生效。`);return}P.updateGroupValue(k.value)}else if(k.selectable||k.selected!==void 0){let e=!z.value;A(`update:selected`,e),A(`select`,e)}}},X=e=>{e.stopPropagation(),!(L.value||R.value)&&A(`close`,e)},Z=c(()=>{let e=k.selectable||k.selected!==void 0||P||k.closable;return b(`relative inline-flex items-center justify-center w-fit h-fit select-none font-bold overflow-hidden border transition-all duration-300 ease-smooth`,k.round?`rounded-full`:`rounded-base`,{"px-2 py-1 text-[11px] gap-1.5":I.value===`sm`,"px-2.5 py-1.5 text-xs gap-2":I.value===`md`,"px-3.5 py-2 text-sm gap-2.5":I.value===`lg`},z.value?F.value===`outline`||F.value===`primary`?`bg-primary/10 border-primary text-primary shadow-sm`:`bg-primary text-primary-foreground border-primary shadow-sm`:{"bg-background text-foreground border-border/80 hover:border-border":F.value==="default","bg-secondary text-secondary-foreground border-border/30 hover:bg-secondary/80":F.value===`secondary`,"bg-transparent text-foreground border-border/80 hover:bg-muted/50":F.value===`outline`,"bg-transparent text-foreground border-transparent hover:bg-muted/50":F.value===`ghost`,"bg-background/40 backdrop-blur-md text-foreground border-white/20 dark:border-white/10 hover:bg-white/10":F.value===`glass`,"bg-primary text-primary-foreground border-transparent":F.value===`primary`},L.value||R.value?`opacity-40 grayscale cursor-not-allowed pointer-events-none`:e?`cursor-pointer active:scale-[0.97]`:``)}),Q=c(()=>b(`rounded-full object-cover shrink-0 transition-transform duration-200`,{"w-3.5 h-3.5":I.value===`sm`,"w-4 h-4":I.value===`md`,"w-4.5 h-4.5":I.value===`lg`})),$=c(()=>b(`shrink-0 transition-transform duration-200`,{"w-3 h-3":I.value===`sm`,"w-3.5 h-3.5":I.value===`md`,"w-4 h-4":I.value===`lg`})),ne=c(()=>k.animate?k.entryClass?j.value?k.entryClass:`opacity-0`:b(`transform transition-all duration-700 ease-swift`,j.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-96 blur-md pointer-events-none`):``);return(e,i)=>(o(),u(`div`,{class:t([ne.value,`inline-block align-middle rounded-[inherit]`])},[p(`div`,{ref_key:`chipContainerRef`,ref:B,class:t(Z.value),style:a(W.value?{width:W.value}:{}),onClick:Y},[p(`span`,{ref_key:`chipContentRef`,ref:V,class:t([`inline-flex items-center whitespace-nowrap transition-all duration-300 ease-smooth`,[I.value===`sm`?`gap-1.5`:I.value===`md`?`gap-2`:`gap-2.5`,R.value?`opacity-30 blur-[1.5px] scale-95`:`opacity-100 blur-none scale-100`]])},[k.avatar?(o(),u(`div`,te,[M.value?l(``,!0):(o(),u(`div`,{key:0,class:t([Q.value,`absolute inset-0 bg-muted-foreground/20 animate-pulse rounded-full`])},null,2)),p(`img`,{src:k.avatar,alt:`avatar`,onLoad:i[0]||=e=>M.value=!0,class:t([Q.value,M.value?`opacity-100 blur-none scale-100`:`opacity-0 blur-sm scale-105`])},null,42,S)])):k.icon?(o(),h(v(k.icon),{key:1,class:t($.value)},null,8,[`class`])):l(``,!0),e.$slots.default?(o(),u(`span`,C,[r(e.$slots,`default`)])):l(``,!0),k.suffixAvatar?(o(),u(`div`,w,[N.value?l(``,!0):(o(),u(`div`,{key:0,class:t([Q.value,`absolute inset-0 bg-muted-foreground/20 animate-pulse rounded-full`])},null,2)),p(`img`,{src:k.suffixAvatar,alt:`suffix-avatar`,onLoad:i[1]||=e=>N.value=!0,class:t([Q.value,N.value?`opacity-100 blur-none scale-100`:`opacity-0 blur-sm scale-105`])},null,42,T)])):k.suffixIcon?(o(),h(v(k.suffixIcon),{key:4,class:t($.value)},null,8,[`class`])):l(``,!0),k.closable?(o(),u(`button`,{key:5,type:`button`,onClick:X,disabled:L.value||R.value,class:`p-0.5 rounded-full hover:bg-black/10 dark:hover:bg-white/20 transition-colors active:scale-90 ml-0.5 shrink-0`},[d(ee(x),{class:t([$.value,`stroke-[2.5]`])},null,8,[`class`])],8,E)):l(``,!0)],2),d(y,{name:`fade`},{default:n(()=>[R.value?(o(),u(`div`,D,[...i[2]||=[p(`div`,{class:`absolute inset-0 overflow-hidden pointer-events-none rounded-[inherit]`},[p(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):l(``,!0)]),_:1})],6)],2))}});export{O as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/CAJW6uLT.js b/server/adminui/_nuxt/CAJW6uLT.js new file mode 100644 index 0000000..d396324 --- /dev/null +++ b/server/adminui/_nuxt/CAJW6uLT.js @@ -0,0 +1 @@ +import{w as e}from"./Bx_a1Ri3.js";var t=`FuxstoFormItemContext`;function n(){let n=e(t,null),r=e(`FuxstoFormContext`,null);return{isInFormItem:!!n,handleBlurValidate:async()=>{n&&await n.validate(`blur`)},handleChangeValidate:async()=>{n&&await n.validate(`change`)},validate:async()=>!n||n.validate(),getFieldValue:()=>n?n.getValue():void 0,formSize:r?.size,formDisabled:r?.disabled}}export{n as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/CC5v17Ca.js b/server/adminui/_nuxt/CC5v17Ca.js new file mode 100644 index 0000000..03fdef4 --- /dev/null +++ b/server/adminui/_nuxt/CC5v17Ca.js @@ -0,0 +1 @@ +import{$ as e,I as t,J as n,M as ee,P as r,Y as i,c as a,d as o,f as s,g as c,h as l,kt as u,l as d,nt as f,r as p,u as m,ut as h,v as g}from"./Bx_a1Ri3.js";import{I as _}from"./Dw7E2aQ0.js";import{t as v}from"./CjfA7_9d.js";import{r as y,t as b}from"./DQKjIeim.js";import{t as x}from"./D2-o7L18.js";import{t as S}from"./i8vU1wpO.js";import{t as C}from"./D5UXUZnN.js";import{t as w}from"./NDcEePfh.js";import{t as T}from"./nj6DwLzD.js";import{t as E}from"./C8yIGsZb.js";import{n as D,t as O}from"./zZGEHylc.js";var k={class:`rounded-xl border border-border bg-muted/40 px-3 py-2.5`},A={class:`text-[11px] text-muted-foreground`},j={class:`mt-0.5 truncate text-lg font-semibold`},te=Object.assign(g({__name:`StatTile`,props:{label:{},value:{}},setup(e){return(t,n)=>(r(),s(`div`,k,[d(`div`,A,u(e.label),1),d(`div`,j,u(e.value),1)]))}}),{__name:`StatTile`}),ne={class:`space-y-4`},M={class:`flex flex-wrap items-center gap-3 px-5 py-4`},N={class:`ml-auto flex flex-wrap items-center gap-2`},P={class:`w-32`},F={class:`space-y-5 px-5 pb-5`},I={key:0,class:`grid grid-cols-2 gap-3 sm:grid-cols-4 lg:grid-cols-7`},L={class:`font-medium`},R={class:`grid grid-cols-1 gap-4 lg:grid-cols-2`},z={key:0,class:`flex flex-wrap gap-2`},B={key:1,class:`text-sm text-muted-foreground`},V=g({__name:`stats`,setup(g){let{request:k,download:A}=T(),{handleError:j,toast:V}=b(),H=f(`model`),U=f(``),W=f(``),G=f(null),K=f([]),q=f(!0),J=[{label:`按模型`,value:`model`},{label:`按设备`,value:`device`},{label:`按天`,value:`day`}],Y=[{key:`key`,title:`Key`},{key:`requests`,title:`请求`,width:80},{key:`success`,title:`成功`,width:80},{key:`errors`,title:`错误`,width:70},{key:`io`,title:`in/out`,width:130},{key:`cost`,title:`费用`,width:90},{key:`avg_latency_ms`,title:`avg`,width:70},{key:`p50_ms`,title:`P50`,width:60},{key:`p90_ms`,title:`P90`,width:60},{key:`p99_ms`,title:`P99`,width:60}];async function X(){q.value=!0;try{let e=`group_by=`+encodeURIComponent(H.value);U.value&&(e+=`&from=`+U.value),W.value&&(e+=`&to=`+W.value);let[t,n]=await Promise.all([k(`/stats?`+e),k(`/stats/devices?n=10`).catch(()=>[])]);G.value=t,K.value=n}catch(e){j(e)}finally{q.value=!1}}ee(X);let Z=a(()=>G.value?.total),Q=a(()=>Object.entries(G.value?.error_codes||{}).sort((e,t)=>e[0].localeCompare(t[0])));function re(e){let t=`format=`+e+`&group_by=`+encodeURIComponent(H.value);return U.value&&(t+=`&from=`+U.value),W.value&&(t+=`&to=`+W.value),t}async function $(e){try{await A(`/stats/export?`+re(e),e===`csv`?`liapi-stats.csv`:`liapi-stats.json`)}catch(e){j(e)}}return(ee,a)=>{let f=te;return r(),s(`div`,ne,[c(h(y),{padding:`none`},{header:n(()=>[d(`div`,M,[a[8]||=d(`h2`,{class:`text-sm font-semibold`},`用量统计`,-1),d(`div`,N,[d(`div`,P,[c(h(w),{modelValue:h(H),"onUpdate:modelValue":a[0]||=t=>e(H)?H.value=t:null,options:J,size:`sm`,onChange:X},null,8,[`modelValue`])]),i(d(`input`,{"onUpdate:modelValue":a[1]||=t=>e(U)?U.value=t:null,type:`date`,class:`rounded-lg border border-border bg-background px-3 py-1.5 text-sm outline-none focus:border-ring`},null,512),[[_,h(U)]]),i(d(`input`,{"onUpdate:modelValue":a[2]||=t=>e(W)?W.value=t:null,type:`date`,class:`rounded-lg border border-border bg-background px-3 py-1.5 text-sm outline-none focus:border-ring`},null,512),[[_,h(W)]]),c(h(x),{variant:`outline`,size:`sm`,icon:h(C),onClick:X},{default:n(()=>[...a[5]||=[l(` 查询 `,-1)]]),_:1},8,[`icon`]),c(h(x),{variant:`outline`,size:`sm`,icon:h(S),onClick:a[3]||=e=>$(`csv`)},{default:n(()=>[...a[6]||=[l(` CSV `,-1)]]),_:1},8,[`icon`]),c(h(x),{variant:`outline`,size:`sm`,icon:h(S),onClick:a[4]||=e=>$(`json`)},{default:n(()=>[...a[7]||=[l(` JSON `,-1)]]),_:1},8,[`icon`])])])]),default:n(()=>[d(`div`,F,[h(Z)?(r(),s(`div`,I,[c(f,{label:`总请求`,value:h(D)(h(Z).requests)},null,8,[`value`]),c(f,{label:`成功`,value:h(D)(h(Z).success)},null,8,[`value`]),c(f,{label:`错误`,value:h(D)(h(Z).errors)},null,8,[`value`]),c(f,{label:`费用(元)`,value:h(O)(h(Z).cost)},null,8,[`value`]),c(f,{label:`P50`,value:h(Z).p50_ms+`ms`},null,8,[`value`]),c(f,{label:`P90`,value:h(Z).p90_ms+`ms`},null,8,[`value`]),c(f,{label:`P99`,value:h(Z).p99_ms+`ms`},null,8,[`value`])])):o(``,!0),c(h(v),{columns:Y,data:h(G)?.rows||[],size:`sm`,hover:``,loading:h(q),"empty-text":`所选区间暂无数据。`},{"cell-key":n(({row:e})=>[d(`span`,L,u(e.key),1)]),"cell-io":n(({row:e})=>[l(u(h(D)(e.in_tokens))+`/`+u(h(D)(e.out_tokens)),1)]),"cell-cost":n(({row:e})=>[l(u(h(O)(e.cost)),1)]),_:1},8,[`data`,`loading`]),d(`div`,R,[d(`div`,null,[a[9]||=d(`h3`,{class:`mb-2 text-sm font-semibold`},`设备排行`,-1),c(h(v),{columns:[{key:`key`,title:`设备/Token`},{key:`requests`,title:`请求`,width:80},{key:`io`,title:`in/out`,width:130},{key:`cost`,title:`费用`,width:90}],data:h(K),size:`sm`,hover:``,"empty-text":`暂无数据。`},{"cell-io":n(({row:e})=>[l(u(h(D)(e.in_tokens))+`/`+u(h(D)(e.out_tokens)),1)]),"cell-cost":n(({row:e})=>[l(u(h(O)(e.cost)),1)]),_:1},8,[`data`])]),d(`div`,null,[a[10]||=d(`h3`,{class:`mb-2 text-sm font-semibold`},`错误码分布`,-1),h(Q).length?(r(),s(`div`,z,[(r(!0),s(p,null,t(h(Q),([e,t])=>(r(),m(h(E),{key:e,variant:`secondary`},{default:n(()=>[l(` HTTP `+u(e)+` · `+u(t),1)]),_:2},1024))),128))])):(r(),s(`p`,B,`无错误`))])])])]),_:1})])}}});export{V as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/CMHCZ1c-.js b/server/adminui/_nuxt/CMHCZ1c-.js new file mode 100644 index 0000000..2603cec --- /dev/null +++ b/server/adminui/_nuxt/CMHCZ1c-.js @@ -0,0 +1 @@ +import{C as e,X as t,Z as n,rt as r,tt as i,y as a}from"./Bx_a1Ri3.js";var o=Error.captureStackTrace,s=class e extends Error{name;code;docs;fix;sources;data;get why(){return this.message}constructor(t,n=e){super(t.why,{cause:t.cause}),this.code=this.name=t.code,this.fix=t.fix,this.docs=t.docs,this.sources=t.sources,this.data=t.data,o?.(this,n)}toJSON(){return{name:this.name,why:this.why,fix:this.fix,docs:this.docs,sources:this.sources,cause:this.cause,data:this.data,stack:this.stack}}};function c(e,t){return typeof e==`string`?`${e}/${t.toLowerCase()}`:e?.(t)}function l(e={}){let{docsBase:t,reporters:n=[]}=e;return new Proxy({},{get(e,r){if(typeof r!=`string`)return;let i=(e={},a={})=>{let o=c(t,r),l=new s({code:r,why:o??``,docs:o,cause:e.cause,sources:e.sources},i);for(let e of n)e(l,a);return l};return i}})}function u(e){return`https://nuxt.com/docs/4.x/errors/${e.replace(`NUXT_`,``).toLowerCase()}`}var d=[e=>{console.error(`[${e.name}]`)}],f=l({docsBase:u,reporters:d});function p(e,t={},n){for(let r in e){let i=e[r],a=n?`${n}:${r}`:r;typeof i==`object`&&i?p(i,t,a):typeof i==`function`&&(t[a]=i)}return t}var m=(()=>{if(console.createTask)return console.createTask;let e={run:e=>e()};return()=>e})();function h(e,t,n,r){for(let i=n;ie[i](...t)):e[i](...t);if(n&&typeof n.then==`function`)return Promise.resolve(n).then(()=>h(e,t,i+1,r))}catch(e){return Promise.reject(e)}}function g(e,t,n){if(e.length>0)return h(e,t,0,m(n))}function _(e,t,n){if(e.length>0){let r=m(n);return Promise.all(e.map(e=>r.run(()=>e(...t))))}}function v(e,t){for(let n of[...e])n(t)}var y=class{_hooks;_before;_after;_deprecatedHooks;_deprecatedMessages;constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(e,t,n={}){if(!e||typeof t!=`function`)return()=>{};let r=e,i;for(;this._deprecatedHooks[e];)i=this._deprecatedHooks[e],e=i.to;if(i&&!n.allowDeprecated){let e=i.message;e||=`${r} hook has been deprecated`+(i.to?`, please use ${i.to}`:``),this._deprecatedMessages||=new Set,this._deprecatedMessages.has(e)||(console.warn(e),this._deprecatedMessages.add(e))}if(!t.name)try{Object.defineProperty(t,"name",{get:()=>`_`+e.replace(/\W+/g,`_`)+`_hook_cb`,configurable:!0})}catch{}return this._hooks[e]=this._hooks[e]||[],this._hooks[e].push(t),()=>{t&&=(this.removeHook(e,t),void 0)}}hookOnce(e,t){let n,r=(...e)=>(typeof n==`function`&&n(),n=void 0,r=void 0,t(...e));return n=this.hook(e,r),n}removeHook(e,t){let n=this._hooks[e];if(n){let r=n.indexOf(t);r!==-1&&n.splice(r,1),n.length===0&&(this._hooks[e]=void 0)}}clearHook(e){this._hooks[e]=void 0}deprecateHook(e,t){this._deprecatedHooks[e]=typeof t==`string`?{to:t}:t;let n=this._hooks[e]||[];this._hooks[e]=void 0;for(let t of n)this.hook(e,t)}deprecateHooks(e){for(let t in e)this.deprecateHook(t,e[t])}addHooks(e){let t=p(e),n=Object.keys(t).map(e=>this.hook(e,t[e]));return()=>{for(let e of n)e();n.length=0}}removeHooks(e){let t=p(e);for(let e in t)this.removeHook(e,t[e])}removeAllHooks(){this._hooks={}}callHook(e,...t){return this.callHookWith(g,e,t)}callHookParallel(e,...t){return this.callHookWith(_,e,t)}callHookWith(e,t,n){let r=this._before||this._after?{name:t,args:n,context:{}}:void 0;this._before&&v(this._before,r);let i=e(this._hooks[t]?[...this._hooks[t]]:[],n,t);return i instanceof Promise?i.finally(()=>{this._after&&r&&v(this._after,r)}):(this._after&&r&&v(this._after,r),i)}beforeEach(e){return this._before=this._before||[],this._before.push(e),()=>{if(this._before!==void 0){let t=this._before.indexOf(e);t!==-1&&this._before.splice(t,1)}}}afterEach(e){return this._after=this._after||[],this._after.push(e),()=>{if(this._after!==void 0){let t=this._after.indexOf(e);t!==-1&&this._after.splice(t,1)}}}};function b(){return new y}var x=class{_hooks;constructor(){this._hooks={}}hook(e,t){return!e||typeof t!=`function`?()=>{}:(this._hooks[e]=this._hooks[e]||[],this._hooks[e].push(t),()=>{t&&=(this.removeHook(e,t),void 0)})}removeHook(e,t){let n=this._hooks[e];if(n){let r=n.indexOf(t);r!==-1&&n.splice(r,1),n.length===0&&(this._hooks[e]=void 0)}}callHook(e,...t){let n=this._hooks[e];if(n&&n.length!==0)return h(n.slice(),t,0)}};function S(){return globalThis.AsyncLocalStorage||globalThis.process?.getBuiltinModule?.(`node:async_hooks`)?.AsyncLocalStorage}var C=globalThis.WeakRef||class{#e;constructor(e){this.#e=e}deref(){return this.#e}};function w(e={}){let t,n=!1,r=e=>{if(t&&t!==e)throw Error(`Context conflict`)},i;if(e.asyncContext){let t=e.AsyncLocalStorage||S();t?i=new t:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}let a=e=>i&&typeof e==`object`&&e?{__unctx_weak:new C(e)}:e,o=e=>e&&e.__unctx_weak?e.__unctx_weak.deref():e,s=()=>{if(i){let e=i.getStore();if(e!==void 0)return o(e)}return t};return{use:()=>{let e=s();if(e===void 0)throw Error(`Context is not available`);return e},tryUse:()=>s()??null,set:(e,i)=>{i||r(e),t=e,n=!0},unset:()=>{t=void 0,n=!1},call:(e,o)=>{r(e),t=e;try{return i?i.run(a(e),o):o()}finally{n||(t=void 0)}},async callAsync(e,r){t=e;let o=()=>{t=e},s=()=>t===e?o:void 0;j.add(s);try{let o=i?i.run(a(e),r):r();return n||(t=void 0),await o}finally{j.delete(s)}}}}function T(e={}){let t={};return{get(n,r={}){return t[n]||(t[n]=w({...e,...r})),t[n]}}}var E=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof global<`u`?global:typeof window<`u`?window:{},D=`__unctx__`,O=E[D]||(E[D]=T()),k=(e,t={})=>O.get(e,t),A=`__unctx_async_handlers__`,j=E[A]||(E[A]=new Set);function M(e){let t=[];for(let e of j){let n=e();n&&t.push(n)}let n=()=>{for(let e of t)e()},r=e();return r&&typeof r==`object`&&`catch`in r&&(r=r.catch(e=>{throw n(),e})),[r,n]}var N={name:`page`,mode:`out-in`},P={meta:[{charset:`utf-8`},{name:`viewport`,content:`width=device-width, initial-scale=1`},{name:`color-scheme`,content:`dark light`}],link:[],style:[],script:[],noscript:[],title:`Liapi Admin`,htmlAttrs:{lang:`zh-CN`}},F={id:`__nuxt-loader`},I={componentName:`NuxtLink`,prefetch:!0,prefetchOn:{visibility:!0}},L=`#__nuxt`,R=`nuxt-app`,z=36e5,B=`vite:preloadError`;function V(e=`nuxt-app`){return k(e,{asyncContext:!1})}var H=`__nuxt_plugin`;function U(e){let a=0,o={_id:e.id||`nuxt-app`,_scope:t(),provide:void 0,versions:{get nuxt(){return`4.5.2`},get vue(){return o.vueApp.version}},payload:r({...e.ssrContext?.payload||{},data:r({}),state:i({}),once:new Set,_errors:r({})}),static:{data:{}},runWithContext(e){return o._scope.active&&!n()?o._scope.run(()=>q(o,e)):q(o,e)},isHydrating:!0,deferHydration(){if(!o.isHydrating)return()=>{};a++;let e=!1;return()=>{if(!e&&(e=!0,a--,a===0))return o.isHydrating=!1,o.callHook(`app:suspense:resolve`)}},_asyncDataPromises:{},_asyncData:r({}),_state:r({}),_payloadRevivers:{},...e};{let e=window.__NUXT__;if(e)for(let t in e)switch(t){case`data`:case`state`:case`_errors`:Object.assign(o.payload[t],e[t]);break;default:o.payload[t]=e[t]}}o.hooks=b(),o.hook=o.hooks.hook;{let e=o.hooks.callHook;o.hooks.callHook=(t,...n)=>Promise.resolve().then(()=>e(t,...n))}o.callHook=o.hooks.callHook,o.provide=(e,t)=>{let n=`$`+e;Z(o,n,t),Z(o.vueApp.config.globalProperties,n,t)},Z(o.vueApp,`$nuxt`,o),Z(o.vueApp.config.globalProperties,`$nuxt`,o);{window.addEventListener(B,e=>{o.callHook(`app:chunkError`,{error:e.payload}),e.payload?.message?.includes(`Unable to preload CSS`)&&e.preventDefault()}),window.useNuxtApp||=Y;let e=o.hook(`app:error`,(...e)=>{f.NUXT_E1005({cause:e.length>1?e:e[0]})});o.hook(`app:mounted`,e)}let s=o.payload.config;return o.provide(`config`,s),o}async function W(e,t){if(typeof t==`function`){let{provide:n}=await e.runWithContext(()=>t(e))||{};if(n&&typeof n==`object`)for(let t in n)e.provide(t,n[t])}}async function G(e,t){let n;for(let r of t)try{await W(e,r)}catch(t){if(!e.payload.error)throw t;n||=t}if(n)throw e.payload.error||n}function K(e){if(typeof e==`function`)return e;let t=e._name||e.name;return delete e.name,Object.assign(e.setup||(()=>{}),e,{[H]:!0,_name:t})}function q(e,t,n){return V(e._id).set(e),e.vueApp.runWithContext(()=>n?t(...n):t())}function J(t){let n;return e()&&(n=a()?.appContext.app.$nuxt),n||=V(t).tryUse(),n||null}function Y(e){let t=J(e);if(!t)throw f.NUXT_E1001();return t}function X(e){return Y().$config}function Z(e,t,n){Object.defineProperty(e,t,{get:()=>n})}export{d as _,X as a,N as c,z as d,L as f,u as g,f as h,Y as i,F as l,x as m,U as n,P as o,M as p,K as r,R as s,G as t,I as u,l as v}; \ No newline at end of file diff --git a/server/adminui/_nuxt/CMKGzL4T.js b/server/adminui/_nuxt/CMKGzL4T.js new file mode 100644 index 0000000..2d0fd65 --- /dev/null +++ b/server/adminui/_nuxt/CMKGzL4T.js @@ -0,0 +1 @@ +import{t as e}from"./BOgT-xSl.js";var t=e(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),n=e(`trash-2`,[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]]);export{t as n,n as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/CjfA7_9d.js b/server/adminui/_nuxt/CjfA7_9d.js new file mode 100644 index 0000000..432e112 --- /dev/null +++ b/server/adminui/_nuxt/CjfA7_9d.js @@ -0,0 +1 @@ +import{E as e,Et as t,H as n,I as r,J as i,L as a,M as o,Ot as s,P as c,c as l,d as u,f as d,g as f,h as p,kt as m,l as h,nt as g,r as _,u as v,ut as y,v as b,w as x,z as S}from"./Bx_a1Ri3.js";import{j as C,z as w}from"./Dw7E2aQ0.js";import{t as T}from"./BOgT-xSl.js";import{n as E,t as D}from"./bazXKP70.js";import{n as O}from"./D2-o7L18.js";var k=T(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),A=T(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),j=T(`chevron-up`,[[`path`,{d:`m18 15-6-6-6 6`,key:`153udz`}]]),M=T(`inbox`,[[`polyline`,{points:`22 12 16 12 14 15 10 15 8 12 2 12`,key:`o97t9d`}],[`path`,{d:`M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`oot6mr`}]]),N=[`checked`,`indeterminate`,`disabled`],P={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},F={key:0,class:`text-xs font-bold text-foreground`},I=b({inheritAttrs:!1,__name:`Checkbox`,props:{modelValue:{type:[Boolean,Array],default:!1},value:{default:!0},indeterminate:{type:Boolean,default:!1},size:{default:void 0},disabled:{type:Boolean,default:void 0},loading:{type:Boolean,default:void 0},error:{type:Boolean,default:void 0},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`update:modelValue`,`change`],setup(r,{emit:s}){let p=r,m=s,_=g(!1),b=n(),w=l(()=>{let e={};for(let t in b)t.startsWith(`aria-`)&&(e[t]=b[t]);return e}),T=l(()=>{let e={};for(let t in b)t.startsWith(`aria-`)||(e[t]=b[t]);return e}),E=x(`FuxstoCheckboxGroup`,null),A=l(()=>E?E.modelValue.value.includes(p.value):Array.isArray(p.modelValue)?p.modelValue.includes(p.value):!!p.modelValue),j=l(()=>p.disabled===void 0?E?.disabled.value!==void 0&&E.disabled.value:p.disabled),M=l(()=>p.loading===void 0?E?.loading.value!==void 0&&E.loading.value:p.loading),I=l(()=>p.error===void 0?E?.error.value!==void 0&&E.error.value:p.error),L=l(()=>p.size===void 0?E?.size.value===void 0?`md`:E.size.value:p.size),R=()=>{if(!(j.value||M.value)){if(E)E.updateValue(p.value);else{let e=!A.value;m(`update:modelValue`,e),m(`change`,e)}}};o(()=>{p.animate&&setTimeout(()=>{_.value=!0},p.delay)});let z=l(()=>O(`relative flex items-center justify-center rounded-[calc(var(--radius)-3px)] border transition-all duration-200 shrink-0 bg-background overflow-hidden peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ring`,{"w-4 h-4":L.value===`sm`,"w-5 h-5":L.value===`md`,"w-6 h-6":L.value===`lg`},I.value?`border-destructive text-destructive`:A.value||p.indeterminate?`bg-primary border-primary text-primary-foreground`:`border-border hover:border-border/80`,j.value||M.value?`opacity-50 cursor-not-allowed pointer-events-none`:`cursor-pointer`)),B=l(()=>O(`transform transition-all duration-200 ease-spring`,{"w-3 h-3":L.value===`sm`,"w-3.5 h-3.5":L.value===`md`,"w-4 h-4":L.value===`lg`},A.value||p.indeterminate?`scale-100 opacity-100`:`scale-0 opacity-0`)),V=l(()=>p.animate?p.entryClass?_.value?p.entryClass:`opacity-0`:O(`transform transition-all duration-700 ease-swift`,_.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-98 blur-md pointer-events-none`):``);return(n,r)=>(c(),d(`label`,e({class:y(O)(`inline-flex items-center gap-2 select-none cursor-pointer`,j.value?`cursor-not-allowed`:``,V.value)},T.value),[h(`input`,e({type:`checkbox`,class:`peer sr-only`},w.value,{checked:A.value,indeterminate:p.indeterminate,disabled:j.value||M.value,onChange:R}),null,16,N),h(`div`,{class:t(z.value)},[h(`div`,{class:t([`w-full h-full flex items-center justify-center transition-all duration-300`,M.value?`opacity-30 blur-[1px] scale-95`:`opacity-100 blur-none scale-100`])},[(c(),v(S(p.indeterminate?y(D):y(k)),{class:t(B.value),"stroke-width":`3`},null,8,[`class`]))],2),f(C,{name:`fade`},{default:i(()=>[M.value?(c(),d(`div`,P,[...r[0]||=[h(`div`,{class:`absolute inset-0 overflow-hidden pointer-events-none rounded-[inherit]`},[h(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):u(``,!0)]),_:1})],2),n.$slots.default?(c(),d(`span`,F,[a(n.$slots,`default`)])):u(``,!0)],16))}}),L={class:`w-full text-left border-collapse select-none`},R={class:`bg-muted/40 border-b border-border/60 text-muted-foreground font-bold uppercase tracking-wider text-[10px]`},z=[`onClick`],B={key:1,class:`flex flex-col -space-y-1 shrink-0 ml-0.5`},V=[`onClick`],H=[`onClick`],U={type:`button`,class:`p-0.5 rounded text-muted-foreground hover:text-foreground transition-transform duration-300`},W={key:0,class:`bg-muted/20`},G=[`colspan`],K={class:`expanded-inner-wrapper overflow-hidden`},q={class:`p-4`},J={key:0},Y=[`colspan`],X={class:`flex flex-col items-center justify-center gap-2`},Z={class:`text-xs font-bold`},Q=((e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n})(b({__name:`Table`,props:{columns:{},data:{},rowKey:{default:`id`},size:{default:`md`},bordered:{type:Boolean,default:!0},rounded:{type:Boolean,default:!0},striped:{type:Boolean,default:!1},hover:{type:Boolean,default:!0},selectable:{type:Boolean,default:!1},selectedRowKeys:{default:()=>[]},expandable:{type:Boolean,default:!1},emptyText:{default:`暂无数据`},loading:{type:Boolean,default:!1},loadingRowKeys:{default:()=>[]},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`update:selectedRowKeys`,`selection-change`,`sort-change`,`row-click`],setup(e,{emit:n}){let b=e,x=n,T=g(!1),D=g(null),k=g(null),N=g(new Set),P=l(()=>{if(!D.value||!k.value)return b.data;let e=b.columns.find(e=>e.key===D.value);return!e||!e.sortable?b.data:[...b.data].sort((t,n)=>{if(typeof e.sortable==`function`){let r=e.sortable(t,n);return k.value===`asc`?r:-r}let r=t[D.value],i=n[D.value];if(r===i)return 0;let a=r>i?1:-1;return k.value===`asc`?a:-a})}),F=l(()=>b.data.length!==0&&b.data.every(e=>b.selectedRowKeys.includes(e[b.rowKey]))),Q=l(()=>{let e=b.data.filter(e=>b.selectedRowKeys.includes(e[b.rowKey])).length;return e>0&&e{if(b.loading)return;let e=[];F.value||(e=b.data.map(e=>e[b.rowKey])),x(`update:selectedRowKeys`,e),x(`selection-change`,b.data.filter(t=>e.includes(t[b.rowKey])),e)},te=e=>{if(b.loading||b.loadingRowKeys.includes(e[b.rowKey]))return;let t=e[b.rowKey],n=[...b.selectedRowKeys],r=n.indexOf(t);r===-1?n.push(t):n.splice(r,1),x(`update:selectedRowKeys`,n),x(`selection-change`,b.data.filter(e=>n.includes(e[b.rowKey])),n)},ne=e=>{e.sortable&&!b.loading&&(D.value===e.key?k.value===`asc`?k.value=`desc`:(D.value=null,k.value=null):(D.value=e.key,k.value=`asc`),x(`sort-change`,e,k.value))},re=(e,t)=>{if(t.stopPropagation(),b.loading||b.loadingRowKeys.includes(e[b.rowKey]))return;let n=e[b.rowKey];N.value.has(n)?N.value.delete(n):N.value.add(n)},ie=(e,t)=>{let n=e.querySelector(`.expanded-inner-wrapper`);if(!n){t();return}n.style.height=`0px`,n.style.overflow=`hidden`,n.style.opacity=`0`;let r=n.scrollHeight,i=n.animate([{height:`0px`,opacity:0},{height:`${r}px`,opacity:1}],{duration:300,easing:`cubic-bezier(0.25, 1, 0.5, 1)`});i.onfinish=()=>{n.style.height=``,n.style.overflow=``,n.style.opacity=``,t()}},ae=(e,t)=>{let n=e.querySelector(`.expanded-inner-wrapper`);if(!n){t();return}let r=n.offsetHeight;n.style.height=`${r}px`,n.style.overflow=`hidden`,n.offsetHeight;let i=n.animate([{height:`${r}px`,opacity:1},{height:`0px`,opacity:0}],{duration:280,easing:`cubic-bezier(0.25, 1, 0.5, 1)`});i.onfinish=()=>{n.style.height=`0px`,t()}};o(()=>{b.animate&&setTimeout(()=>{T.value=!0},b.delay)});let $=l(()=>{switch(b.size){case`sm`:return`px-3 py-2 text-[11px] whitespace-nowrap`;case`lg`:return`px-5 py-4 text-sm whitespace-nowrap`;default:return`px-4 py-3 text-xs whitespace-nowrap`}}),oe=l(()=>b.animate?b.entryClass?T.value?b.entryClass:`opacity-0`:O(`transform transition-all duration-700 ease-swift`,T.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-2 scale-98 blur-md pointer-events-none`):``);return(e,n)=>(c(),d(`div`,{class:t(y(O)(`relative w-full overflow-hidden`,b.rounded?`rounded-base`:`rounded-none`,oe.value))},[h(`div`,{class:t([`w-full overflow-x-auto scrollbar-none bg-background transition-all duration-300`,[b.bordered?`border border-border/80`:``,b.rounded?`rounded-base`:`rounded-none`]])},[h(`table`,L,[h(`thead`,null,[h(`tr`,R,[b.selectable?(c(),d(`th`,{key:0,class:t([$.value,`w-10 text-center`])},[f(I,{"model-value":F.value,indeterminate:Q.value,size:b.size===`lg`?`md`:`sm`,disabled:b.loading||b.data.length===0,onChange:ee},null,8,[`model-value`,`indeterminate`,`size`,`disabled`])],2)):u(``,!0),b.expandable?(c(),d(`th`,{key:1,class:t([$.value,`w-8`])},null,2)):u(``,!0),(c(!0),d(_,null,r(b.columns,e=>(c(),d(`th`,{key:e.key,class:t([$.value,e.sortable?`cursor-pointer hover:bg-muted/80 transition-colors`:``,e.align===`center`?`text-center`:e.align===`right`?`text-right`:`text-left`]),style:s(e.width?{width:typeof e.width==`number`?`${e.width}px`:e.width}:{}),onClick:t=>ne(e)},[h(`div`,{class:t([`inline-flex items-center gap-1.5 whitespace-nowrap`,e.align===`center`?`justify-center`:e.align===`right`?`justify-end`:`justify-start`])},[e.icon?(c(),v(S(e.icon),{key:0,class:`w-3.5 h-3.5 text-primary shrink-0`})):u(``,!0),h(`span`,null,m(e.title),1),e.sortable?(c(),d(`div`,B,[f(y(j),{class:t([`w-3 h-3 transition-colors`,D.value===e.key&&k.value===`asc`?`text-primary stroke-[3]`:`text-muted-foreground/40`])},null,8,[`class`]),f(y(A),{class:t([`w-3 h-3 transition-colors`,D.value===e.key&&k.value===`desc`?`text-primary stroke-[3]`:`text-muted-foreground/40`])},null,8,[`class`])])):u(``,!0)],2)],14,z))),128))])]),h(`tbody`,{class:t([`divide-y divide-border/40 font-medium text-foreground transition-all duration-300 ease-smooth`,b.loading?`opacity-35 blur-[1.5px] scale-[0.99] select-none pointer-events-none`:`opacity-100 blur-none scale-100`])},[(c(!0),d(_,null,r(P.value,(o,l)=>(c(),d(_,{key:o[b.rowKey]||l},[h(`tr`,{class:t([`relative transition-colors duration-150 animate-row-fade`,[b.hover?`hover:bg-muted/40 cursor-pointer`:``,b.striped&&l%2==1?`bg-secondary/30 dark:bg-muted/25`:`bg-background`,b.selectedRowKeys.includes(o[b.rowKey])?`bg-primary/5 dark:bg-primary/10`:``,b.loadingRowKeys.includes(o[b.rowKey])?`opacity-35 blur-[1px] select-none pointer-events-none row-loading`:``]]),style:s({"--row-delay":`${l*40}ms`}),onClick:e=>x(`row-click`,o,l,e)},[b.selectable?(c(),d(`td`,{key:0,class:t([$.value,`w-10 text-center`]),onClick:n[0]||=w(()=>{},[`stop`])},[f(I,{"model-value":b.selectedRowKeys.includes(o[b.rowKey]),size:b.size===`lg`?`md`:`sm`,disabled:b.loading||b.loadingRowKeys.includes(o[b.rowKey]),onChange:e=>te(o)},null,8,[`model-value`,`size`,`disabled`,`onChange`])],2)):u(``,!0),b.expandable?(c(),d(`td`,{key:1,class:t([$.value,`w-8 text-center`]),onClick:w(e=>re(o,e),[`stop`])},[h(`button`,U,[f(y(E),{class:t([`w-3.5 h-3.5 transition-transform duration-300`,N.value.has(o[b.rowKey])?`rotate-90 text-primary`:`rotate-0`])},null,8,[`class`])])],10,H)):u(``,!0),(c(!0),d(_,null,r(b.columns,n=>(c(),d(`td`,{key:n.key,class:t([$.value,n.align===`center`?`text-center`:n.align===`right`?`text-right`:`text-left`])},[a(e.$slots,`cell-${n.key}`,{row:o,column:n,value:o[n.key],index:l},()=>[p(m(o[n.key]!==void 0&&o[n.key]!==null?o[n.key]:`-`),1)],!0)],2))),128))],14,V),f(C,{css:!1,onEnter:ie,onLeave:ae},{default:i(()=>[b.expandable&&N.value.has(o[b.rowKey])?(c(),d(`tr`,W,[h(`td`,{colspan:b.columns.length+ +!!b.selectable+1,class:`p-0 border-b border-border/40 overflow-hidden`},[h(`div`,K,[h(`div`,q,[a(e.$slots,`expandedRow`,{row:o,index:l},void 0,!0)])])],8,G)])):u(``,!0)]),_:2},1024)],64))),128)),P.value.length===0?(c(),d(`tr`,J,[h(`td`,{colspan:b.columns.length+ +!!b.selectable+ +!!b.expandable,class:`py-12 text-center text-muted-foreground`},[h(`div`,X,[f(y(M),{class:`w-8 h-8 text-muted-foreground/30 stroke-[1.5]`}),h(`span`,Z,m(b.emptyText),1)])],8,Y)])):u(``,!0)],2)])],2),f(C,{name:`fade`},{default:i(()=>[b.loading?(c(),d(`div`,{key:0,class:t([`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] overflow-hidden pointer-events-none transition-all duration-300 will-change-[opacity]`,b.rounded?`rounded-base`:`rounded-none`])},[h(`div`,{class:t([`absolute inset-0 overflow-hidden`,b.rounded?`rounded-base`:`rounded-none`])},[...n[1]||=[h(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer`},null,-1)]],2)],2)):u(``,!0)]),_:1})],2))}}),[[`__scopeId`,`data-v-f7880f7d`]]);export{k as i,M as n,A as r,Q as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/CnEaNhAK.js b/server/adminui/_nuxt/CnEaNhAK.js new file mode 100644 index 0000000..caa6cc0 --- /dev/null +++ b/server/adminui/_nuxt/CnEaNhAK.js @@ -0,0 +1 @@ +import{P as e,f as t,kt as n,l as r}from"./Bx_a1Ri3.js";import{t as i}from"./Djcrsm7t.js";import{t as a}from"#entry";var o={class:`antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide`},s={class:`max-w-520px text-center`},c=[`textContent`],l=[`textContent`],u=[`textContent`],d=a({__name:`error-500`,props:{appName:{type:String,default:`Nuxt`},status:{type:Number,default:500},statusText:{type:String,default:`Internal server error`},description:{type:String,default:`This page is temporarily unavailable.`},refresh:{type:String,default:`Refresh this page`}},setup(a){let d=a;return i({title:`${d.status} - ${d.statusText} | ${d.appName}`,script:[{innerHTML:`!function(){let e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(let e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(let t of e)if("childList"===t.type)for(let e of t.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;let r=function(e){let r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),r.credentials="use-credentials"===e.crossOrigin?"include":"anonymous"===e.crossOrigin?"omit":"same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:`*,:after,:before{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 #0000;--un-ring-shadow:0 0 #0000;--un-shadow-inset: ;--un-shadow:0 0 #0000;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:#93c5fd80;--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }`}]}),(i,d)=>(e(),t(`div`,o,[r(`div`,s,[r(`h1`,{class:`font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]`,textContent:n(a.status)},null,8,c),r(`h2`,{class:`font-semibold mb-2 sm:text-3xl text-2xl`,textContent:n(a.statusText)},null,8,l),r(`p`,{class:`mb-4 px-2 text-[#64748B] text-md`,textContent:n(a.description)},null,8,u)])]))}},[[`__scopeId`,`data-v-f91406c7`]]);export{d as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/Cxvr5SZe.js b/server/adminui/_nuxt/Cxvr5SZe.js new file mode 100644 index 0000000..16d1fec --- /dev/null +++ b/server/adminui/_nuxt/Cxvr5SZe.js @@ -0,0 +1 @@ +import{L as e,M as t,P as n,f as r,g as i,l as a,nt as o,ut as s,v as c}from"./Bx_a1Ri3.js";import{t as l}from"./DsoWRbkX.js";var u={class:`relative flex min-h-screen items-center justify-center overflow-hidden bg-background px-4 text-foreground`},d={class:`relative w-full max-w-sm`},f={class:`mb-6 flex flex-col items-center gap-3 text-center`},p={class:`grid h-12 w-12 place-items-center rounded-2xl bg-primary text-primary-foreground shadow-lg shadow-primary/20`},m={class:`rounded-2xl border border-border bg-card/60 p-6 shadow-xl backdrop-blur-sm`},h=c({__name:`auth`,setup(c){let h=o(!0);return t(()=>{let e=localStorage.getItem(`liapi_theme`);h.value=!e||e===`dark`,document.documentElement.classList.toggle(`dark`,h.value)}),(t,o)=>(n(),r(`div`,u,[o[2]||=a(`div`,{class:`pointer-events-none absolute -top-40 left-1/2 h-96 w-96 -translate-x-1/2 rounded-full bg-primary/20 blur-3xl`},null,-1),o[3]||=a(`div`,{class:`pointer-events-none absolute -bottom-40 right-1/4 h-80 w-80 rounded-full bg-primary/10 blur-3xl`},null,-1),a(`div`,d,[a(`div`,f,[a(`div`,p,[i(s(l),{size:24})]),o[0]||=a(`div`,null,[a(`div`,{class:`text-lg font-semibold tracking-tight`},`Liapi`),a(`div`,{class:`text-xs text-muted-foreground`},`API Gateway 管理台`)],-1)]),a(`div`,m,[e(t.$slots,`default`)]),o[1]||=a(`p`,{class:`mt-6 text-center text-[11px] text-muted-foreground`},` 登录会话仅保存在本机浏览器,不会上传 `,-1)])]))}});export{h as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/D-_L2MRs.js b/server/adminui/_nuxt/D-_L2MRs.js new file mode 100644 index 0000000..f12d7d6 --- /dev/null +++ b/server/adminui/_nuxt/D-_L2MRs.js @@ -0,0 +1 @@ +import{E as e,Et as t,H as n,J as r,K as i,M as a,Ot as o,P as s,c,d as l,f as u,g as d,l as f,nt as p,u as m,ut as h,v as g,z as _}from"./Bx_a1Ri3.js";import{j as v}from"./Dw7E2aQ0.js";import{t as y}from"./BOgT-xSl.js";import{i as b,n as x}from"./D2-o7L18.js";import{t as S}from"./CAJW6uLT.js";var C=y(`eye-off`,[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]),w=y(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),T=[`type`,`value`,`placeholder`,`disabled`,`readonly`],E={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},D=g({inheritAttrs:!1,__name:`Input`,props:{modelValue:{default:``},type:{default:`text`},placeholder:{default:``},size:{default:`md`},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},clearable:{type:Boolean,default:!1},error:{type:Boolean,default:!1},prefixIcon:{default:null},suffixIcon:{default:null},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`update:modelValue`,`change`,`clear`,`focus`,`blur`],setup(g,{emit:y}){let D=g,O=y,k=p(!1),A=p(!1),j=p(null),M=p(!1);i(()=>D.error,e=>{e&&(M.value=!0,setTimeout(()=>{M.value=!1},350))});let N=c(()=>D.type===`password`?A.value?`text`:`password`:D.type),{handleBlurValidate:P,handleChangeValidate:F}=S(),I=n(),L=c(()=>I.class),R=c(()=>I.style),{class:z,style:B,...V}=I,H=e=>{let t=e.target.value;O(`update:modelValue`,t),O(`change`,t),F()},U=()=>{O(`update:modelValue`,``),O(`change`,``),O(`clear`),F(),j.value?.focus()};a(()=>{D.animate&&setTimeout(()=>{k.value=!0},D.delay)});let W=c(()=>{let e=D.disabled||D.loading;return x(`relative flex items-center w-full border rounded-base transition-all duration-200 overflow-hidden bg-background`,{"h-8 px-2.5 text-xs":D.size===`sm`,"h-10 px-3.5 text-sm":D.size===`md`,"h-12 px-4 text-base":D.size===`lg`},D.error?`border-destructive text-destructive focus-within:ring-2 focus-within:ring-destructive/20`:`border-border hover:border-border/80 focus-within:border-primary focus-within:ring-2 focus-within:ring-primary/15`,M.value?`animate-shake`:``,e?`opacity-60 cursor-not-allowed pointer-events-none bg-muted/30`:``)}),G=c(()=>D.animate?D.entryClass?k.value?D.entryClass:`opacity-0`:x(`transform transition-all duration-700 ease-swift`,k.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-98 blur-md pointer-events-none`):``),K=c(()=>x({"w-3.5 h-3.5":D.size===`sm`,"w-4 h-4":D.size===`md`,"w-4.5 h-4.5":D.size===`lg`}));return(n,i)=>(s(),u(`div`,{class:t([[G.value,L.value],`w-full`]),style:o(R.value)},[f(`div`,{class:t(W.value)},[f(`div`,{class:t([`flex items-center gap-2 w-full h-full transition-all duration-300 ease-smooth`,D.loading?`opacity-35 blur-[1.5px] scale-[0.99] select-none`:`opacity-100 blur-none scale-100`])},[D.prefixIcon?(s(),m(_(D.prefixIcon),{key:0,class:t([K.value,`text-muted-foreground shrink-0`])},null,8,[`class`])):l(``,!0),f(`input`,e({ref_key:`inputRef`,ref:j},V,{type:N.value,value:D.modelValue,placeholder:D.placeholder,disabled:D.disabled||D.loading,readonly:D.readonly,onInput:H,onFocus:i[0]||=e=>O(`focus`,e),onBlur:i[1]||=e=>{h(P)(),O(`blur`,e)},class:`w-full h-full bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground/60 font-medium`}),null,16,T),d(v,{name:`icon-pop`},{default:r(()=>[D.clearable&&D.modelValue!==``&&!D.disabled&&!D.loading?(s(),u(`button`,{key:0,type:`button`,onClick:U,class:`text-muted-foreground hover:text-foreground transition-colors shrink-0 p-0.5 active:scale-90`},[d(h(b),{class:t(K.value)},null,8,[`class`])])):l(``,!0)]),_:1}),D.type===`password`&&!D.disabled&&!D.loading?(s(),u(`button`,{key:1,type:`button`,onClick:i[2]||=e=>A.value=!A.value,class:`text-muted-foreground hover:text-foreground transition-colors shrink-0 p-0.5 active:scale-90 overflow-hidden`},[d(v,{name:`icon-flip`,mode:`out-in`},{default:r(()=>[(s(),m(_(A.value?h(C):h(w)),{key:A.value?`eye-off`:`eye`,class:t(K.value)},null,8,[`class`]))]),_:1})])):l(``,!0),D.suffixIcon&&D.type!==`password`?(s(),m(_(D.suffixIcon),{key:2,class:t([K.value,`text-muted-foreground shrink-0`])},null,8,[`class`])):l(``,!0)],2),d(v,{name:`fade`},{default:r(()=>[D.loading?(s(),u(`div`,E,[...i[3]||=[f(`div`,{class:`absolute inset-0 overflow-hidden pointer-events-none rounded-[inherit]`},[f(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):l(``,!0)]),_:1})],2)],6))}});export{w as n,C as r,D as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/D2-o7L18.js b/server/adminui/_nuxt/D2-o7L18.js new file mode 100644 index 0000000..b2cd259 --- /dev/null +++ b/server/adminui/_nuxt/D2-o7L18.js @@ -0,0 +1 @@ +import{D as e,Et as t,H as n,J as r,K as i,L as a,M as o,Ot as s,P as c,W as l,c as u,d,f as ee,g as f,k as te,l as p,nt as m,u as h,ut as ne,v as g,w as _,z as re}from"./Bx_a1Ri3.js";import{j as ie}from"./Dw7E2aQ0.js";import{t as v}from"./BOgT-xSl.js";var y=v(`circle-x`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]),b=v(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]);function x(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`){if(Array.isArray(e)){var i=e.length;for(t=0;t{let n=Array(e.length+t.length);for(let t=0;t({classGroupId:e,validator:t}),T=(e=new Map,t=null,n)=>({nextPart:e,validators:t,classGroupId:n}),E=`-`,D=[],O=`arbitrary..`,k=e=>{let t=M(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:e=>{if(e.startsWith(`[`)&&e.endsWith(`]`))return j(e);let n=e.split(E);return A(n,+(n[0]===``&&n.length>1),t)},getConflictingClassGroupIds:(e,t)=>{if(t){let t=r[e],i=n[e];return t?i?C(i,t):t:i||D}return n[e]||D}}},A=(e,t,n)=>{if(e.length-t===0)return n.classGroupId;let r=e[t],i=n.nextPart.get(r);if(i){let n=A(e,t+1,i);if(n)return n}let a=n.validators;if(a===null)return;let o=t===0?e.join(E):e.slice(t).join(E),s=a.length;for(let e=0;ee.slice(1,-1).indexOf(`:`)===-1?void 0:(()=>{let t=e.slice(1,-1),n=t.indexOf(`:`),r=t.slice(0,n);return r?O+r:void 0})(),M=e=>{let{theme:t,classGroups:n}=e;return ae(n,t)},ae=(e,t)=>{let n=T();for(let r in e){let i=e[r];N(i,n,r,t)}return n},N=(e,t,n,r)=>{let i=e.length;for(let a=0;a{if(typeof e==`string`){F(e,t,n);return}if(typeof e==`function`){I(e,t,n,r);return}L(e,t,n,r)},F=(e,t,n)=>{let r=e===``?t:oe(t,e);r.classGroupId=n},I=(e,t,n,r)=>{if(R(e)){N(e(r),t,n,r);return}t.validators===null&&(t.validators=[]),t.validators.push(w(n,e))},L=(e,t,n,r)=>{let i=Object.entries(e),a=i.length;for(let e=0;e{let n=e,r=t.split(E),i=r.length;for(let e=0;e`isThemeGetter`in e&&e.isThemeGetter===!0,se=e=>{if(e<1)return{get:()=>void 0,set:()=>{}};let t=0,n=Object.create(null),r=Object.create(null),i=(i,a)=>{n[i]=a,t++,t>e&&(t=0,r=n,n=Object.create(null))};return{get(e){let t=n[e];if(t!==void 0)return t;if((t=r[e])!==void 0)return i(e,t),t},set(e,t){e in n?n[e]=t:i(e,t)}}},z=`!`,B=`:`,ce=[],V=(e,t,n,r,i)=>({modifiers:e,hasImportantModifier:t,baseClassName:n,maybePostfixModifierPosition:r,isExternal:i}),le=e=>{let{prefix:t,experimentalParseClassName:n}=e,r=e=>{let t=[],n=0,r=0,i=0,a,o=e.length;for(let s=0;si?a-i:void 0;return V(t,l,c,u)};if(t){let e=t+B,n=r;r=t=>t.startsWith(e)?n(t.slice(e.length)):V(ce,!1,t,void 0,!0)}if(n){let e=r;r=t=>n({className:t,parseClassName:e})}return r},ue=e=>{let t=new Map;return e.orderSensitiveModifiers.forEach((e,n)=>{t.set(e,1e6+n)}),e=>{let n=[],r=[];for(let i=0;i0&&(r.sort(),n.push(...r),r=[]),n.push(a)):r.push(a)}return r.length>0&&(r.sort(),n.push(...r)),n}},de=e=>({cache:se(e.cacheSize),parseClassName:le(e),sortModifiers:ue(e),postfixLookupClassGroupIds:fe(e),...k(e)}),fe=e=>{let t=Object.create(null),n=e.postfixLookupClassGroups;if(n)for(let e=0;e{let{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:i,sortModifiers:a,postfixLookupClassGroupIds:o}=t,s=[],c=e.trim().split(pe),l=``;for(let e=c.length-1;e>=0;--e){let t=c[e],{isExternal:u,modifiers:d,hasImportantModifier:ee,baseClassName:f,maybePostfixModifierPosition:te}=n(t);if(u){l=t+(l.length>0?` `+l:l);continue}let p=!!te,m;if(p){m=r(f.substring(0,te));let e=m&&o[m]?r(f):void 0;e&&e!==m&&(m=e,p=!1)}else m=r(f);if(!m){if(!p){l=t+(l.length>0?` `+l:l);continue}if(m=r(f),!m){l=t+(l.length>0?` `+l:l);continue}p=!1}let h=d.length===0?``:d.length===1?d[0]:a(d).join(`:`),ne=ee?h+z:h,g=ne+m;if(s.indexOf(g)>-1)continue;s.push(g);let _=i(m,p);for(let e=0;e<_.length;++e){let t=_[e];s.push(ne+t)}l=t+(l.length>0?` `+l:l)}return l},he=(...e)=>{let t=0,n,r,i=``;for(;t{if(typeof e==`string`)return e;let t,n=``;for(let r=0;r{let n,r,i,a,o=o=>(n=de(t.reduce((e,t)=>t(e),e())),r=n.cache.get,i=n.cache.set,a=s,s(o)),s=e=>{let t=r(e);if(t)return t;let a=me(e,n);return i(e,a),a};return a=o,(...e)=>a(he(...e))},ve=[],H=e=>{let t=t=>t[e]||ve;return t.isThemeGetter=!0,t.themeKey=e,t},ye=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,be=/^\((?:(\w[\w-]*):)?(.+)\)$/i,xe=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,Se=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Ce=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,we=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix|color|light-dark)\(.+\)$/,Te=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Ee=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,U=e=>xe.test(e),W=e=>!!e&&!Number.isNaN(Number(e)),G=e=>!!e&&Number.isInteger(Number(e)),De=e=>e.endsWith(`%`)&&W(e.slice(0,-1)),K=e=>Se.test(e),Oe=()=>!0,ke=e=>Ce.test(e)&&!we.test(e),Ae=()=>!1,je=e=>Te.test(e),Me=e=>Ee.test(e),Ne=e=>!q(e)&&!Y(e),Pe=e=>e.startsWith(`@container`)&&(e[10]===`/`&&e[11]!==void 0||e[11]===`s`&&e[16]!==void 0&&e.startsWith(`-size/`,10)||e[11]===`n`&&e[18]!==void 0&&e.startsWith(`-normal/`,10)),Fe=e=>Z(e,Xe,Ae),q=e=>ye.test(e),J=e=>Z(e,Ze,ke),Ie=e=>Z(e,Qe,W),Le=e=>Z(e,et,Oe),Re=e=>Z(e,$e,Ae),ze=e=>Z(e,Je,Ae),Be=e=>Z(e,Ye,Me),Ve=e=>Z(e,tt,je),Y=e=>be.test(e),X=e=>Q(e,Ze),He=e=>Q(e,$e),Ue=e=>Q(e,Je),We=e=>Q(e,Xe),Ge=e=>Q(e,Ye),Ke=e=>Q(e,tt,!0),qe=e=>Q(e,et,!0),Z=(e,t,n)=>{let r=ye.exec(e);return r?r[1]?t(r[1]):n(r[2]):!1},Q=(e,t,n=!1)=>{let r=be.exec(e);return r?r[1]?t(r[1]):n:!1},Je=e=>e===`position`||e===`percentage`,Ye=e=>e===`image`||e===`url`,Xe=e=>e===`length`||e===`size`||e===`bg-size`,Ze=e=>e===`length`,Qe=e=>e===`number`,$e=e=>e===`family-name`,et=e=>e===`number`||e===`weight`,tt=e=>e===`shadow`,nt=_e(()=>{let e=H(`color`),t=H(`font`),n=H(`text`),r=H(`font-weight`),i=H(`tracking`),a=H(`leading`),o=H(`breakpoint`),s=H(`container`),c=H(`spacing`),l=H(`radius`),u=H(`shadow`),d=H(`inset-shadow`),ee=H(`text-shadow`),f=H(`drop-shadow`),te=H(`blur`),p=H(`perspective`),m=H(`aspect`),h=H(`ease`),ne=H(`animate`),g=()=>[`auto`,`avoid`,`all`,`avoid-page`,`page`,`left`,`right`,`column`],_=()=>[`center`,`top`,`bottom`,`left`,`right`,`top-left`,`left-top`,`top-right`,`right-top`,`bottom-right`,`right-bottom`,`bottom-left`,`left-bottom`],re=()=>[..._(),Y,q],ie=()=>[`auto`,`hidden`,`clip`,`visible`,`scroll`],v=()=>[`auto`,`contain`,`none`],y=()=>[Y,q,c],b=()=>[U,`full`,`auto`,...y()],x=()=>[G,`none`,`subgrid`,Y,q],S=()=>[`auto`,{span:[`full`,G,Y,q]},G,Y,q],C=()=>[G,`auto`,Y,q],w=()=>[`auto`,`min`,`max`,`fr`,Y,q],T=()=>[`start`,`end`,`center`,`between`,`around`,`evenly`,`stretch`,`baseline`,`center-safe`,`end-safe`],E=()=>[`start`,`end`,`center`,`stretch`,`center-safe`,`end-safe`],D=()=>[`auto`,...y()],O=()=>[U,`auto`,`full`,`dvw`,`dvh`,`lvw`,`lvh`,`svw`,`svh`,`min`,`max`,`fit`,...y()],k=()=>[s,U,`screen`,`full`,`dvw`,`lvw`,`svw`,`min`,`max`,`fit`,...y()],A=()=>[U,`screen`,`full`,`lh`,`dvh`,`lvh`,`svh`,`min`,`max`,`fit`,...y()],j=()=>[e,Y,q],M=()=>[..._(),Ue,ze,{position:[Y,q]}],ae=()=>[`no-repeat`,{repeat:[``,`x`,`y`,`space`,`round`]}],N=()=>[`auto`,`cover`,`contain`,We,Fe,{size:[Y,q]}],P=()=>[De,X,J],F=()=>[``,`none`,`full`,l,Y,q],I=()=>[``,W,X,J],L=()=>[`solid`,`dashed`,`dotted`,`double`],oe=()=>[`normal`,`multiply`,`screen`,`overlay`,`darken`,`lighten`,`color-dodge`,`color-burn`,`hard-light`,`soft-light`,`difference`,`exclusion`,`hue`,`saturation`,`color`,`luminosity`],R=()=>[W,De,Ue,ze],se=()=>[``,`none`,te,Y,q],z=()=>[`none`,W,Y,q],B=()=>[`none`,W,Y,q],ce=()=>[W,Y,q],V=()=>[U,`full`,...y()];return{cacheSize:500,theme:{animate:[`spin`,`ping`,`pulse`,`bounce`],aspect:[`video`],blur:[K],breakpoint:[K],color:[Oe],container:[K],"drop-shadow":[K],ease:[`in`,`out`,`in-out`],font:[Ne],"font-weight":[`thin`,`extralight`,`light`,`normal`,`medium`,`semibold`,`bold`,`extrabold`,`black`],"inset-shadow":[K],leading:[`none`,`tight`,`snug`,`normal`,`relaxed`,`loose`],perspective:[`dramatic`,`near`,`normal`,`midrange`,`distant`,`none`],radius:[K],shadow:[K],spacing:[`px`,W],text:[K],"text-shadow":[K],tracking:[`tighter`,`tight`,`normal`,`wide`,`wider`,`widest`]},classGroups:{aspect:[{aspect:[`auto`,`square`,U,q,Y,m]}],container:[`container`],"container-type":[{"@container":[``,`normal`,`size`,Y,q]}],"container-named":[Pe],columns:[{columns:[W,`auto`,q,Y,s]}],"break-after":[{"break-after":g()}],"break-before":[{"break-before":g()}],"break-inside":[{"break-inside":[`auto`,`avoid`,`avoid-page`,`avoid-column`]}],"box-decoration":[{"box-decoration":[`slice`,`clone`]}],box:[{box:[`border`,`content`]}],display:[`block`,`inline-block`,`inline`,`flex`,`inline-flex`,`table`,`inline-table`,`table-caption`,`table-cell`,`table-column`,`table-column-group`,`table-footer-group`,`table-header-group`,`table-row-group`,`table-row`,`flow-root`,`grid`,`inline-grid`,`contents`,`list-item`,`hidden`],sr:[`sr-only`,`not-sr-only`],float:[{float:[`right`,`left`,`none`,`start`,`end`]}],clear:[{clear:[`left`,`right`,`both`,`none`,`start`,`end`]}],isolation:[`isolate`,`isolation-auto`],"object-fit":[{object:[`contain`,`cover`,`fill`,`none`,`scale-down`]}],"object-position":[{object:re()}],overflow:[{overflow:ie()}],"overflow-x":[{"overflow-x":ie()}],"overflow-y":[{"overflow-y":ie()}],overscroll:[{overscroll:v()}],"overscroll-x":[{"overscroll-x":v()}],"overscroll-y":[{"overscroll-y":v()}],position:[`static`,`fixed`,`absolute`,`relative`,`sticky`],inset:[{inset:b()}],"inset-x":[{"inset-x":b()}],"inset-y":[{"inset-y":b()}],start:[{"inset-s":b(),start:b()}],end:[{"inset-e":b(),end:b()}],"inset-bs":[{"inset-bs":b()}],"inset-be":[{"inset-be":b()}],top:[{top:b()}],right:[{right:b()}],bottom:[{bottom:b()}],left:[{left:b()}],visibility:[`visible`,`invisible`,`collapse`],z:[{z:[G,`auto`,Y,q]}],basis:[{basis:[U,`full`,`auto`,s,...y()]}],"flex-direction":[{flex:[`row`,`row-reverse`,`col`,`col-reverse`]}],"flex-wrap":[{flex:[`nowrap`,`wrap`,`wrap-reverse`]}],flex:[{flex:[W,U,`auto`,`initial`,`none`,q]}],grow:[{grow:[``,W,Y,q]}],shrink:[{shrink:[``,W,Y,q]}],order:[{order:[G,`first`,`last`,`none`,Y,q]}],"grid-cols":[{"grid-cols":x()}],"col-start-end":[{col:S()}],"col-start":[{"col-start":C()}],"col-end":[{"col-end":C()}],"grid-rows":[{"grid-rows":x()}],"row-start-end":[{row:S()}],"row-start":[{"row-start":C()}],"row-end":[{"row-end":C()}],"grid-flow":[{"grid-flow":[`row`,`col`,`dense`,`row-dense`,`col-dense`]}],"auto-cols":[{"auto-cols":w()}],"auto-rows":[{"auto-rows":w()}],gap:[{gap:y()}],"gap-x":[{"gap-x":y()}],"gap-y":[{"gap-y":y()}],"justify-content":[{justify:[...T(),`normal`]}],"justify-items":[{"justify-items":[...E(),`normal`]}],"justify-self":[{"justify-self":[`auto`,...E()]}],"align-content":[{content:[`normal`,...T()]}],"align-items":[{items:[...E(),{baseline:[``,`last`]}]}],"align-self":[{self:[`auto`,...E(),{baseline:[``,`last`]}]}],"place-content":[{"place-content":T()}],"place-items":[{"place-items":[...E(),`baseline`]}],"place-self":[{"place-self":[`auto`,...E()]}],p:[{p:y()}],px:[{px:y()}],py:[{py:y()}],ps:[{ps:y()}],pe:[{pe:y()}],pbs:[{pbs:y()}],pbe:[{pbe:y()}],pt:[{pt:y()}],pr:[{pr:y()}],pb:[{pb:y()}],pl:[{pl:y()}],m:[{m:D()}],mx:[{mx:D()}],my:[{my:D()}],ms:[{ms:D()}],me:[{me:D()}],mbs:[{mbs:D()}],mbe:[{mbe:D()}],mt:[{mt:D()}],mr:[{mr:D()}],mb:[{mb:D()}],ml:[{ml:D()}],"space-x":[{"space-x":y()}],"space-x-reverse":[`space-x-reverse`],"space-y":[{"space-y":y()}],"space-y-reverse":[`space-y-reverse`],size:[{size:O()}],"inline-size":[{inline:[`auto`,...k()]}],"min-inline-size":[{"min-inline":[`auto`,...k()]}],"max-inline-size":[{"max-inline":[`none`,...k()]}],"block-size":[{block:[`auto`,...A()]}],"min-block-size":[{"min-block":[`auto`,...A()]}],"max-block-size":[{"max-block":[`none`,...A()]}],w:[{w:[s,`screen`,...O()]}],"min-w":[{"min-w":[s,`screen`,`none`,...O()]}],"max-w":[{"max-w":[s,`screen`,`none`,`prose`,{screen:[o]},...O()]}],h:[{h:[`screen`,`lh`,...O()]}],"min-h":[{"min-h":[`screen`,`lh`,`none`,...O()]}],"max-h":[{"max-h":[`screen`,`lh`,`none`,...O()]}],"font-size":[{text:[`base`,n,X,J]}],"font-smoothing":[`antialiased`,`subpixel-antialiased`],"font-style":[`italic`,`not-italic`],"font-weight":[{font:[r,qe,Le]}],"font-stretch":[{"font-stretch":[`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`normal`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`,De,q]}],"font-family":[{font:[He,Re,t]}],"font-features":[{"font-features":[q]}],"fvn-normal":[`normal-nums`],"fvn-ordinal":[`ordinal`],"fvn-slashed-zero":[`slashed-zero`],"fvn-figure":[`lining-nums`,`oldstyle-nums`],"fvn-spacing":[`proportional-nums`,`tabular-nums`],"fvn-fraction":[`diagonal-fractions`,`stacked-fractions`],tracking:[{tracking:[i,Y,q]}],"line-clamp":[{"line-clamp":[W,`none`,Y,Ie]}],leading:[{leading:[`none`,a,...y()]}],"list-image":[{"list-image":[`none`,Y,q]}],"list-style-position":[{list:[`inside`,`outside`]}],"list-style-type":[{list:[`disc`,`decimal`,`none`,Y,q]}],"text-alignment":[{text:[`left`,`center`,`right`,`justify`,`start`,`end`]}],"placeholder-color":[{placeholder:j()}],"text-color":[{text:j()}],"text-decoration":[`underline`,`overline`,`line-through`,`no-underline`],"text-decoration-style":[{decoration:[...L(),`wavy`]}],"text-decoration-thickness":[{decoration:[W,`from-font`,`auto`,Y,J]}],"text-decoration-color":[{decoration:j()}],"underline-offset":[{"underline-offset":[W,`auto`,Y,q]}],"text-transform":[`uppercase`,`lowercase`,`capitalize`,`normal-case`],"text-overflow":[`truncate`,`text-ellipsis`,`text-clip`],"text-wrap":[{text:[`wrap`,`nowrap`,`balance`,`pretty`]}],indent:[{indent:y()}],"tab-size":[{tab:[G,Y,q]}],"vertical-align":[{align:[`baseline`,`top`,`middle`,`bottom`,`text-top`,`text-bottom`,`sub`,`super`,Y,q]}],whitespace:[{whitespace:[`normal`,`nowrap`,`pre`,`pre-line`,`pre-wrap`,`break-spaces`]}],break:[{break:[`normal`,`words`,`all`,`keep`]}],wrap:[{wrap:[`break-word`,`anywhere`,`normal`]}],hyphens:[{hyphens:[`none`,`manual`,`auto`]}],content:[{content:[`none`,Y,q]}],"bg-attachment":[{bg:[`fixed`,`local`,`scroll`]}],"bg-clip":[{"bg-clip":[`border`,`padding`,`content`,`text`]}],"bg-origin":[{"bg-origin":[`border`,`padding`,`content`]}],"bg-position":[{bg:M()}],"bg-repeat":[{bg:ae()}],"bg-size":[{bg:N()}],"bg-image":[{bg:[`none`,{linear:[{to:[`t`,`tr`,`r`,`br`,`b`,`bl`,`l`,`tl`]},G,Y,q],radial:[``,Y,q],conic:[``,G,Y,q]},Ge,Be]}],"bg-color":[{bg:j()}],"gradient-from-pos":[{from:P()}],"gradient-via-pos":[{via:P()}],"gradient-to-pos":[{to:P()}],"gradient-from":[{from:j()}],"gradient-via":[{via:j()}],"gradient-to":[{to:j()}],rounded:[{rounded:F()}],"rounded-s":[{"rounded-s":F()}],"rounded-e":[{"rounded-e":F()}],"rounded-t":[{"rounded-t":F()}],"rounded-r":[{"rounded-r":F()}],"rounded-b":[{"rounded-b":F()}],"rounded-l":[{"rounded-l":F()}],"rounded-ss":[{"rounded-ss":F()}],"rounded-se":[{"rounded-se":F()}],"rounded-ee":[{"rounded-ee":F()}],"rounded-es":[{"rounded-es":F()}],"rounded-tl":[{"rounded-tl":F()}],"rounded-tr":[{"rounded-tr":F()}],"rounded-br":[{"rounded-br":F()}],"rounded-bl":[{"rounded-bl":F()}],"border-w":[{border:I()}],"border-w-x":[{"border-x":I()}],"border-w-y":[{"border-y":I()}],"border-w-s":[{"border-s":I()}],"border-w-e":[{"border-e":I()}],"border-w-bs":[{"border-bs":I()}],"border-w-be":[{"border-be":I()}],"border-w-t":[{"border-t":I()}],"border-w-r":[{"border-r":I()}],"border-w-b":[{"border-b":I()}],"border-w-l":[{"border-l":I()}],"divide-x":[{"divide-x":I()}],"divide-x-reverse":[`divide-x-reverse`],"divide-y":[{"divide-y":I()}],"divide-y-reverse":[`divide-y-reverse`],"border-style":[{border:[...L(),`hidden`,`none`]}],"divide-style":[{divide:[...L(),`hidden`,`none`]}],"border-color":[{border:j()}],"border-color-x":[{"border-x":j()}],"border-color-y":[{"border-y":j()}],"border-color-s":[{"border-s":j()}],"border-color-e":[{"border-e":j()}],"border-color-bs":[{"border-bs":j()}],"border-color-be":[{"border-be":j()}],"border-color-t":[{"border-t":j()}],"border-color-r":[{"border-r":j()}],"border-color-b":[{"border-b":j()}],"border-color-l":[{"border-l":j()}],"divide-color":[{divide:j()}],"outline-style":[{outline:[...L(),`none`,`hidden`]}],"outline-offset":[{"outline-offset":[W,Y,q]}],"outline-w":[{outline:[``,W,X,J]}],"outline-color":[{outline:j()}],shadow:[{shadow:[``,`inner`,`none`,u,Ke,Ve]}],"shadow-color":[{shadow:j()}],"inset-shadow":[{"inset-shadow":[`none`,d,Ke,Ve]}],"inset-shadow-color":[{"inset-shadow":j()}],"ring-w":[{ring:I()}],"ring-w-inset":[`ring-inset`],"ring-color":[{ring:j()}],"ring-offset-w":[{"ring-offset":[W,J]}],"ring-offset-color":[{"ring-offset":j()}],"inset-ring-w":[{"inset-ring":I()}],"inset-ring-color":[{"inset-ring":j()}],"text-shadow":[{"text-shadow":[`none`,ee,Ke,Ve]}],"text-shadow-color":[{"text-shadow":j()}],opacity:[{opacity:[W,Y,q]}],"mix-blend":[{"mix-blend":[...oe(),`plus-darker`,`plus-lighter`]}],"bg-blend":[{"bg-blend":oe()}],"mask-clip":[{"mask-clip":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]},`mask-no-clip`],"mask-composite":[{mask:[`add`,`subtract`,`intersect`,`exclude`]}],"mask-image-linear-pos":[{"mask-linear":[W]}],"mask-image-linear-from-pos":[{"mask-linear-from":R()}],"mask-image-linear-to-pos":[{"mask-linear-to":R()}],"mask-image-linear-from-color":[{"mask-linear-from":j()}],"mask-image-linear-to-color":[{"mask-linear-to":j()}],"mask-image-t-from-pos":[{"mask-t-from":R()}],"mask-image-t-to-pos":[{"mask-t-to":R()}],"mask-image-t-from-color":[{"mask-t-from":j()}],"mask-image-t-to-color":[{"mask-t-to":j()}],"mask-image-r-from-pos":[{"mask-r-from":R()}],"mask-image-r-to-pos":[{"mask-r-to":R()}],"mask-image-r-from-color":[{"mask-r-from":j()}],"mask-image-r-to-color":[{"mask-r-to":j()}],"mask-image-b-from-pos":[{"mask-b-from":R()}],"mask-image-b-to-pos":[{"mask-b-to":R()}],"mask-image-b-from-color":[{"mask-b-from":j()}],"mask-image-b-to-color":[{"mask-b-to":j()}],"mask-image-l-from-pos":[{"mask-l-from":R()}],"mask-image-l-to-pos":[{"mask-l-to":R()}],"mask-image-l-from-color":[{"mask-l-from":j()}],"mask-image-l-to-color":[{"mask-l-to":j()}],"mask-image-x-from-pos":[{"mask-x-from":R()}],"mask-image-x-to-pos":[{"mask-x-to":R()}],"mask-image-x-from-color":[{"mask-x-from":j()}],"mask-image-x-to-color":[{"mask-x-to":j()}],"mask-image-y-from-pos":[{"mask-y-from":R()}],"mask-image-y-to-pos":[{"mask-y-to":R()}],"mask-image-y-from-color":[{"mask-y-from":j()}],"mask-image-y-to-color":[{"mask-y-to":j()}],"mask-image-radial":[{"mask-radial":[Y,q]}],"mask-image-radial-from-pos":[{"mask-radial-from":R()}],"mask-image-radial-to-pos":[{"mask-radial-to":R()}],"mask-image-radial-from-color":[{"mask-radial-from":j()}],"mask-image-radial-to-color":[{"mask-radial-to":j()}],"mask-image-radial-shape":[{"mask-radial":[`circle`,`ellipse`]}],"mask-image-radial-size":[{"mask-radial":[{closest:[`side`,`corner`],farthest:[`side`,`corner`]}]}],"mask-image-radial-pos":[{"mask-radial-at":_()}],"mask-image-conic-pos":[{"mask-conic":[W]}],"mask-image-conic-from-pos":[{"mask-conic-from":R()}],"mask-image-conic-to-pos":[{"mask-conic-to":R()}],"mask-image-conic-from-color":[{"mask-conic-from":j()}],"mask-image-conic-to-color":[{"mask-conic-to":j()}],"mask-mode":[{mask:[`alpha`,`luminance`,`match`]}],"mask-origin":[{"mask-origin":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]}],"mask-position":[{mask:M()}],"mask-repeat":[{mask:ae()}],"mask-size":[{mask:N()}],"mask-type":[{"mask-type":[`alpha`,`luminance`]}],"mask-image":[{mask:[`none`,Y,q]}],filter:[{filter:[``,`none`,Y,q]}],blur:[{blur:se()}],brightness:[{brightness:[W,Y,q]}],contrast:[{contrast:[W,Y,q]}],"drop-shadow":[{"drop-shadow":[``,`none`,f,Ke,Ve]}],"drop-shadow-color":[{"drop-shadow":j()}],grayscale:[{grayscale:[``,W,Y,q]}],"hue-rotate":[{"hue-rotate":[W,Y,q]}],invert:[{invert:[``,W,Y,q]}],saturate:[{saturate:[W,Y,q]}],sepia:[{sepia:[``,W,Y,q]}],"backdrop-filter":[{"backdrop-filter":[``,`none`,Y,q]}],"backdrop-blur":[{"backdrop-blur":se()}],"backdrop-brightness":[{"backdrop-brightness":[W,Y,q]}],"backdrop-contrast":[{"backdrop-contrast":[W,Y,q]}],"backdrop-grayscale":[{"backdrop-grayscale":[``,W,Y,q]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[W,Y,q]}],"backdrop-invert":[{"backdrop-invert":[``,W,Y,q]}],"backdrop-opacity":[{"backdrop-opacity":[W,Y,q]}],"backdrop-saturate":[{"backdrop-saturate":[W,Y,q]}],"backdrop-sepia":[{"backdrop-sepia":[``,W,Y,q]}],"border-collapse":[{border:[`collapse`,`separate`]}],"border-spacing":[{"border-spacing":y()}],"border-spacing-x":[{"border-spacing-x":y()}],"border-spacing-y":[{"border-spacing-y":y()}],"table-layout":[{table:[`auto`,`fixed`]}],caption:[{caption:[`top`,`bottom`]}],transition:[{transition:[``,`all`,`colors`,`opacity`,`shadow`,`transform`,`none`,Y,q]}],"transition-behavior":[{transition:[`normal`,`discrete`]}],duration:[{duration:[W,`initial`,Y,q]}],ease:[{ease:[`linear`,`initial`,h,Y,q]}],delay:[{delay:[W,Y,q]}],animate:[{animate:[`none`,ne,Y,q]}],backface:[{backface:[`hidden`,`visible`]}],perspective:[{perspective:[p,Y,q]}],"perspective-origin":[{"perspective-origin":re()}],rotate:[{rotate:z()}],"rotate-x":[{"rotate-x":z()}],"rotate-y":[{"rotate-y":z()}],"rotate-z":[{"rotate-z":z()}],scale:[{scale:B()}],"scale-x":[{"scale-x":B()}],"scale-y":[{"scale-y":B()}],"scale-z":[{"scale-z":B()}],"scale-3d":[`scale-3d`],skew:[{skew:ce()}],"skew-x":[{"skew-x":ce()}],"skew-y":[{"skew-y":ce()}],transform:[{transform:[Y,q,``,`none`,`gpu`,`cpu`]}],"transform-origin":[{origin:re()}],"transform-style":[{transform:[`3d`,`flat`]}],translate:[{translate:V()}],"translate-x":[{"translate-x":V()}],"translate-y":[{"translate-y":V()}],"translate-z":[{"translate-z":V()}],"translate-none":[`translate-none`],zoom:[{zoom:[G,Y,q]}],accent:[{accent:j()}],appearance:[{appearance:[`none`,`auto`]}],"caret-color":[{caret:j()}],"color-scheme":[{scheme:[`normal`,`dark`,`light`,`light-dark`,`only-dark`,`only-light`]}],cursor:[{cursor:[`auto`,`default`,`pointer`,`wait`,`text`,`move`,`help`,`not-allowed`,`none`,`context-menu`,`progress`,`cell`,`crosshair`,`vertical-text`,`alias`,`copy`,`no-drop`,`grab`,`grabbing`,`all-scroll`,`col-resize`,`row-resize`,`n-resize`,`e-resize`,`s-resize`,`w-resize`,`ne-resize`,`nw-resize`,`se-resize`,`sw-resize`,`ew-resize`,`ns-resize`,`nesw-resize`,`nwse-resize`,`zoom-in`,`zoom-out`,Y,q]}],"field-sizing":[{"field-sizing":[`fixed`,`content`]}],"pointer-events":[{"pointer-events":[`auto`,`none`]}],resize:[{resize:[`none`,``,`y`,`x`]}],"scroll-behavior":[{scroll:[`auto`,`smooth`]}],"scrollbar-thumb-color":[{"scrollbar-thumb":j()}],"scrollbar-track-color":[{"scrollbar-track":j()}],"scrollbar-gutter":[{"scrollbar-gutter":[`auto`,`stable`,`both`]}],"scrollbar-w":[{scrollbar:[`auto`,`thin`,`none`]}],"scroll-m":[{"scroll-m":y()}],"scroll-mx":[{"scroll-mx":y()}],"scroll-my":[{"scroll-my":y()}],"scroll-ms":[{"scroll-ms":y()}],"scroll-me":[{"scroll-me":y()}],"scroll-mbs":[{"scroll-mbs":y()}],"scroll-mbe":[{"scroll-mbe":y()}],"scroll-mt":[{"scroll-mt":y()}],"scroll-mr":[{"scroll-mr":y()}],"scroll-mb":[{"scroll-mb":y()}],"scroll-ml":[{"scroll-ml":y()}],"scroll-p":[{"scroll-p":y()}],"scroll-px":[{"scroll-px":y()}],"scroll-py":[{"scroll-py":y()}],"scroll-ps":[{"scroll-ps":y()}],"scroll-pe":[{"scroll-pe":y()}],"scroll-pbs":[{"scroll-pbs":y()}],"scroll-pbe":[{"scroll-pbe":y()}],"scroll-pt":[{"scroll-pt":y()}],"scroll-pr":[{"scroll-pr":y()}],"scroll-pb":[{"scroll-pb":y()}],"scroll-pl":[{"scroll-pl":y()}],"snap-align":[{snap:[`start`,`end`,`center`,`align-none`]}],"snap-stop":[{snap:[`normal`,`always`]}],"snap-type":[{snap:[`none`,`x`,`y`,`both`]}],"snap-strictness":[{snap:[`mandatory`,`proximity`]}],touch:[{touch:[`auto`,`none`,`manipulation`]}],"touch-x":[{"touch-pan":[`x`,`left`,`right`]}],"touch-y":[{"touch-pan":[`y`,`up`,`down`]}],"touch-pz":[`touch-pinch-zoom`],select:[{select:[`none`,`text`,`all`,`auto`]}],"will-change":[{"will-change":[`auto`,`scroll`,`contents`,`transform`,Y,q]}],fill:[{fill:[`none`,...j()]}],"stroke-w":[{stroke:[W,X,J,Ie]}],stroke:[{stroke:[`none`,...j()]}],"forced-color-adjust":[{"forced-color-adjust":[`auto`,`none`]}]},conflictingClassGroups:{"container-named":[`container-type`],overflow:[`overflow-x`,`overflow-y`],overscroll:[`overscroll-x`,`overscroll-y`],inset:[`inset-x`,`inset-y`,`inset-bs`,`inset-be`,`start`,`end`,`top`,`right`,`bottom`,`left`],"inset-x":[`start`,`end`,`right`,`left`],"inset-y":[`inset-bs`,`inset-be`,`top`,`bottom`],flex:[`basis`,`grow`,`shrink`],gap:[`gap-x`,`gap-y`],p:[`px`,`py`,`ps`,`pe`,`pbs`,`pbe`,`pt`,`pr`,`pb`,`pl`],px:[`ps`,`pe`,`pr`,`pl`],py:[`pbs`,`pbe`,`pt`,`pb`],m:[`mx`,`my`,`ms`,`me`,`mbs`,`mbe`,`mt`,`mr`,`mb`,`ml`],mx:[`ms`,`me`,`mr`,`ml`],my:[`mbs`,`mbe`,`mt`,`mb`],size:[`w`,`h`],"font-size":[`leading`],"fvn-normal":[`fvn-ordinal`,`fvn-slashed-zero`,`fvn-figure`,`fvn-spacing`,`fvn-fraction`],"fvn-ordinal":[`fvn-normal`],"fvn-slashed-zero":[`fvn-normal`],"fvn-figure":[`fvn-normal`],"fvn-spacing":[`fvn-normal`],"fvn-fraction":[`fvn-normal`],"line-clamp":[`display`,`overflow`],rounded:[`rounded-s`,`rounded-e`,`rounded-t`,`rounded-r`,`rounded-b`,`rounded-l`,`rounded-ss`,`rounded-se`,`rounded-ee`,`rounded-es`,`rounded-tl`,`rounded-tr`,`rounded-br`,`rounded-bl`],"rounded-s":[`rounded-ss`,`rounded-es`],"rounded-e":[`rounded-se`,`rounded-ee`],"rounded-t":[`rounded-tl`,`rounded-tr`],"rounded-r":[`rounded-tr`,`rounded-br`],"rounded-b":[`rounded-br`,`rounded-bl`],"rounded-l":[`rounded-tl`,`rounded-bl`],"border-spacing":[`border-spacing-x`,`border-spacing-y`],"border-w":[`border-w-x`,`border-w-y`,`border-w-s`,`border-w-e`,`border-w-bs`,`border-w-be`,`border-w-t`,`border-w-r`,`border-w-b`,`border-w-l`],"border-w-x":[`border-w-s`,`border-w-e`,`border-w-r`,`border-w-l`],"border-w-y":[`border-w-bs`,`border-w-be`,`border-w-t`,`border-w-b`],"border-color":[`border-color-x`,`border-color-y`,`border-color-s`,`border-color-e`,`border-color-bs`,`border-color-be`,`border-color-t`,`border-color-r`,`border-color-b`,`border-color-l`],"border-color-x":[`border-color-s`,`border-color-e`,`border-color-r`,`border-color-l`],"border-color-y":[`border-color-bs`,`border-color-be`,`border-color-t`,`border-color-b`],translate:[`translate-x`,`translate-y`,`translate-none`],"translate-none":[`translate`,`translate-x`,`translate-y`,`translate-z`],"scroll-m":[`scroll-mx`,`scroll-my`,`scroll-ms`,`scroll-me`,`scroll-mbs`,`scroll-mbe`,`scroll-mt`,`scroll-mr`,`scroll-mb`,`scroll-ml`],"scroll-mx":[`scroll-ms`,`scroll-me`,`scroll-mr`,`scroll-ml`],"scroll-my":[`scroll-mbs`,`scroll-mbe`,`scroll-mt`,`scroll-mb`],"scroll-p":[`scroll-px`,`scroll-py`,`scroll-ps`,`scroll-pe`,`scroll-pbs`,`scroll-pbe`,`scroll-pt`,`scroll-pr`,`scroll-pb`,`scroll-pl`],"scroll-px":[`scroll-ps`,`scroll-pe`,`scroll-pr`,`scroll-pl`],"scroll-py":[`scroll-pbs`,`scroll-pbe`,`scroll-pt`,`scroll-pb`],touch:[`touch-x`,`touch-y`,`touch-pz`],"touch-x":[`touch`],"touch-y":[`touch`],"touch-pz":[`touch`]},conflictingClassGroupModifiers:{"font-size":[`leading`]},postfixLookupClassGroups:[`container-type`],orderSensitiveModifiers:[`*`,`**`,`after`,`backdrop`,`before`,`details-content`,`file`,`first-letter`,`first-line`,`marker`,`placeholder`,`selection`]}});function $(...e){return nt(S(e))}var rt=[`type`,`disabled`],it={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px]`},at=g({__name:`Button`,props:{variant:{default:void 0},size:{default:void 0},disabled:{type:Boolean,default:void 0},loading:{type:Boolean,default:!1},danger:{type:Boolean,default:!1},icon:{default:null},iconPosition:{default:`left`},suffixIcon:{default:null},round:{type:Boolean,default:!1},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},setup(g){let v=g,y=l(),b=n().type??`button`,x=m(!1),S=_(`FuxstoButtonGroup`,null),C=u(()=>v.disabled===void 0?S?.disabled!==void 0&&S.disabled:v.disabled),w=u(()=>v.size===void 0?S?.size===void 0?`md`:S.size:v.size),T=u(()=>v.variant===void 0?S?.variant===void 0?`primary`:S.variant:v.variant),E=u(()=>!y.default&&v.icon&&!v.suffixIcon),D=m(null),O=m(null),k=m(0),A=m(!0),j=m(null),M=m(!1),ae=(e,t,n)=>{let r=D.value;if(!r||e===t||Math.abs(e-t)<2){n&&n();return}M.value=!0,j.value=`${e}px`;let i=r.animate([{width:`${e}px`},{width:`${t}px`}],{duration:320,easing:`cubic-bezier(0.25, 1, 0.5, 1)`});i.onfinish=()=>{M.value=!1,j.value=null,k.value=t,n&&n()}};i(()=>v.loading,async t=>{if(D.value){if(t){let e=D.value.offsetWidth;j.value=`${e}px`,k.value=e}else{await e();let t=D.value.offsetWidth,n=k.value;Math.abs(n-t)>2?ae(n,t):(j.value=null,k.value=t)}}}),o(()=>{if(v.animate&&setTimeout(()=>{x.value=!0},v.delay),D.value){k.value=D.value.offsetWidth;let e=new ResizeObserver(()=>{if(A.value){A.value=!1;return}if(M.value||v.loading)return;let e=D.value?.offsetWidth||0;if(Math.abs(k.value-e)<=2){k.value=e;return}let t=k.value;ae(t,e)});O.value&&e.observe(O.value),te(()=>{e.disconnect()})}});let N=u(()=>{let e=C.value||v.loading;return $(`relative inline-flex items-center justify-center h-fit w-fit select-none font-bold overflow-hidden border`,`transition-all duration-300 ease-smooth will-change-[border-radius,width]`,S?.isGroup?$(`rounded-none first:rounded-l-base last:rounded-r-base`):v.round?`rounded-full`:`rounded-base`,{"bg-primary text-primary-foreground border-transparent hover:opacity-90":T.value===`primary`&&!e&&!v.danger,"bg-destructive text-destructive-foreground border-transparent hover:opacity-90":T.value===`primary`&&!e&&v.danger,"bg-muted-foreground/20 text-muted-foreground/60 border-transparent":T.value===`primary`&&e,"bg-secondary text-secondary-foreground hover:bg-secondary/80 border-border/40":T.value===`secondary`&&!e&&!v.danger,"bg-destructive/10 text-destructive border-destructive/20 hover:bg-destructive/20":T.value===`secondary`&&!e&&v.danger,"bg-secondary/40 text-muted-foreground/50 border-border/20":T.value===`secondary`&&e,"bg-background text-foreground border-border hover:bg-muted/80 hover:border-border/80":T.value===`outline`&&!e&&!v.danger,"bg-destructive/5 text-destructive border-destructive/30 hover:bg-destructive/10 hover:border-destructive/60":T.value===`outline`&&!e&&v.danger,"bg-background/40 text-muted-foreground/40 border-border/30":T.value===`outline`&&e,"bg-transparent text-foreground border-transparent hover:bg-muted/50":T.value===`ghost`&&!e&&!v.danger,"bg-transparent text-destructive border-transparent hover:bg-destructive/10":T.value===`ghost`&&!e&&v.danger,"bg-transparent text-muted-foreground/40 border-transparent":T.value===`ghost`&&e,"bg-background/40 backdrop-blur-md text-foreground border-white/20 dark:border-white/10 hover:bg-white/10":T.value===`glass`&&!e,"bg-background/10 backdrop-blur-sm text-muted-foreground/30 border-white/5":T.value===`glass`&&e},E.value?{"p-1.5 aspect-square":w.value===`sm`,"p-2.5 aspect-square":w.value===`md`,"p-3.5 aspect-square":w.value===`lg`}:{"px-3.5 py-1.5 text-xs":w.value===`sm`,"px-5 py-2.5 text-sm":w.value===`md`,"px-7 py-3 text-base":w.value===`lg`},e?`cursor-not-allowed`:`cursor-pointer active:scale-[0.96]`,v.animate?v.entryClass?x.value?v.entryClass:`opacity-0`:$(`transform transition-all duration-700 ease-swift`,x.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-96 blur-md pointer-events-none`):``)}),P=u(()=>$(`flex items-center justify-center gap-2 transition-all duration-300 ease-smooth whitespace-nowrap`,v.loading?`opacity-25 blur-[2.5px] scale-95`:`opacity-100 blur-none scale-100`)),F=u(()=>$({"w-3.5 h-3.5":w.value===`sm`,"w-4 h-4":w.value===`md`,"w-4.5 h-4.5":w.value===`lg`}));return(e,n)=>(c(),ee(`button`,{ref_key:`btnContainer`,ref:D,type:ne(b),class:t(N.value),disabled:C.value||v.loading,style:s(j.value?{width:j.value}:{})},[p(`span`,{ref_key:`btnContent`,ref:O,class:t(P.value)},[v.icon&&v.iconPosition===`left`?(c(),h(re(v.icon),{key:0,class:t(F.value)},null,8,[`class`])):d(``,!0),e.$slots.default?a(e.$slots,`default`,{},void 0,void 0,1):d(``,!0),v.suffixIcon||v.icon&&v.iconPosition===`right`?(c(),h(re(v.suffixIcon||v.icon),{key:2,class:t(F.value)},null,8,[`class`])):d(``,!0)],2),f(ie,{name:`fade`},{default:r(()=>[v.loading?(c(),ee(`div`,it,[...n[0]||=[p(`div`,{class:`absolute inset-0 overflow-hidden pointer-events-none`},[p(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.12] to-transparent animate-kinetic-shimmer`})],-1)]])):d(``,!0)]),_:1})],14,rt))}});export{y as i,$ as n,b as r,at as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/D5UXUZnN.js b/server/adminui/_nuxt/D5UXUZnN.js new file mode 100644 index 0000000..d037b7b --- /dev/null +++ b/server/adminui/_nuxt/D5UXUZnN.js @@ -0,0 +1 @@ +import{t as e}from"./BOgT-xSl.js";var t=e(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]);export{t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/DDlQRUFs.js b/server/adminui/_nuxt/DDlQRUFs.js new file mode 100644 index 0000000..5df89fd --- /dev/null +++ b/server/adminui/_nuxt/DDlQRUFs.js @@ -0,0 +1 @@ +import{$ as e,D as t,Et as n,F as r,I as i,J as a,K as o,L as s,M as c,P as l,Y as u,c as d,ct as f,d as p,f as m,g as h,h as g,k as _,kt as v,l as y,nt as b,r as x,tt as S,u as C,ut as w,v as T,w as E,z as D}from"./Bx_a1Ri3.js";import{L as O,R as k,j as A}from"./Dw7E2aQ0.js";import{t as j}from"./BOgT-xSl.js";import{n as M,t as N}from"./bazXKP70.js";import{r as P,t as F}from"./DQKjIeim.js";import{n as I,t as L}from"./D2-o7L18.js";import{t as R}from"./i8vU1wpO.js";import{n as ee,t as z}from"./D-_L2MRs.js";import{n as B,t as V}from"./CMKGzL4T.js";import{t as te}from"./D5UXUZnN.js";import{t as H}from"./nj6DwLzD.js";import{n as U,t as W}from"./DeZOVV_X.js";import{t as G}from"./DMJkRJ-9.js";import{n as K,t as ne}from"./BTFs9w_Z.js";import{t as re}from"./CAJW6uLT.js";import{t as ie}from"./BjW-HIZC.js";var ae=j(`code-xml`,[[`path`,{d:`m18 16 4-4-4-4`,key:`1inbqp`}],[`path`,{d:`m6 8-4 4 4 4`,key:`15zrgr`}],[`path`,{d:`m14.5 4-5 16`,key:`e7oirm`}]]),oe=j(`file-braces`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1`,key:`1oajmo`}],[`path`,{d:`M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1`,key:`mpwhp6`}]]),se=j(`save`,[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]]),ce=j(`upload`,[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]]),le=T({__name:`Collapse`,props:{modelValue:{default:()=>[]},accordion:{type:Boolean,default:!1},bordered:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},emits:[`update:modelValue`,`change`],setup(e,{emit:t}){let i=e,a=t,c=b(i.modelValue);o(()=>i.modelValue,e=>{c.value=e});let u=e=>{if(!(i.disabled||i.loading)){if(i.accordion){let t=c.value===e?``:e;c.value=t,a(`update:modelValue`,t),a(`change`,t)}else{let t=Array.isArray(c.value)?[...c.value]:[],n=t.indexOf(e);n===-1?t.push(e):t.splice(n,1),c.value=t,a(`update:modelValue`,t),a(`change`,t)}}};r(`FuxstoCollapseContext`,{...f(i),modelValue:c,toggleItem:u});let p=d(()=>I(`w-full flex flex-col transition-all duration-300 rounded-base overflow-hidden`,i.bordered?`border border-border/80 divide-y divide-border/60`:`divide-y divide-border/40`));return(e,t)=>(l(),m(`div`,{class:n(p.value)},[s(e.$slots,`default`)],2))}}),ue={class:`flex-grow`},de={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] pointer-events-none`},fe={class:`w-full`},q=T({__name:`CollapseItem`,props:{name:{},title:{default:``},disabled:{type:Boolean,default:void 0},icon:{default:null},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`toggle`],setup(e,{expose:t,emit:r}){let i=e,o=r,f=b(!1),_=E(`FuxstoCollapseContext`,null),x=d(()=>{if(!_)return!1;let e=_.modelValue.value;return _.accordion.value?e===i.name:Array.isArray(e)&&e.includes(i.name)}),S=d(()=>i.disabled===void 0?_?.disabled.value!==void 0&&_.disabled.value:i.disabled),T=d(()=>_?.loading.value||!1),k=()=>{if(S.value||T.value)return;let e=!x.value;_?.toggleItem(i.name),o(`toggle`,e,i.name)};t({open:()=>{x.value||k()},close:()=>{x.value&&k()},toggle:()=>{k()},isExpanded:x});let j=(e,t)=>{let n=e;n.style.height=`0px`,n.style.overflow=`hidden`;let r=n.scrollHeight,i=n.animate([{height:`0px`,opacity:0},{height:`${r}px`,opacity:1}],{duration:300,easing:`cubic-bezier(0.25, 1, 0.5, 1)`});i.onfinish=()=>{n.style.height=``,n.style.overflow=``,t()}},N=(e,t)=>{let n=e,r=n.scrollHeight;n.style.height=`${r}px`,n.style.overflow=`hidden`,n.offsetHeight;let i=n.animate([{height:`${r}px`,opacity:1},{height:`0px`,opacity:0}],{duration:280,easing:`cubic-bezier(0.25, 1, 0.5, 1)`});i.onfinish=()=>{n.style.height=`0px`,t()}};c(()=>{i.animate&&setTimeout(()=>{f.value=!0},i.delay)});let P=d(()=>I(`flex items-center justify-between w-full px-4 py-3.5 text-sm font-bold text-foreground bg-background select-none transition-all duration-300 ease-smooth`,S.value||T.value?`opacity-40 grayscale cursor-not-allowed pointer-events-none`:`cursor-pointer hover:bg-muted/50 active:bg-muted/80 opacity-100 grayscale-0`)),F=d(()=>i.animate?i.entryClass?f.value?i.entryClass:`opacity-0`:I(`transform transition-all duration-700 ease-swift`,f.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-98 blur-md pointer-events-none`):``);return(e,t)=>(l(),m(`div`,{class:n(w(I)(`relative w-full overflow-hidden bg-background`,F.value))},[y(`div`,{class:n(P.value),onClick:k},[y(`div`,{class:n([`flex items-center gap-3 w-full transition-all duration-300 ease-smooth`,T.value?`opacity-35 blur-[1.5px] scale-[0.99]`:``])},[i.icon?(l(),C(D(i.icon),{key:0,class:`w-4 h-4 text-primary shrink-0 transition-all duration-300`})):p(``,!0),y(`span`,ue,[s(e.$slots,`title`,{},()=>[g(v(i.title),1)])]),h(w(M),{class:n([`w-4 h-4 text-muted-foreground transition-transform duration-300 ease-smooth shrink-0`,x.value?`rotate-90 text-primary`:`rotate-0`])},null,8,[`class`])],2),h(A,{name:`fade`},{default:a(()=>[T.value?(l(),m(`div`,de,[...t[0]||=[y(`div`,{class:`absolute inset-0 overflow-hidden`},[y(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer`})],-1)]])):p(``,!0)]),_:1})],2),h(A,{css:!1,onEnter:j,onLeave:N},{default:a(()=>[u(y(`div`,fe,[y(`div`,{class:n([`p-4 text-xs text-muted-foreground leading-relaxed border-t border-border/30 bg-muted/20 transition-all duration-300 ease-smooth`,T.value?`opacity-35 blur-[1.5px]`:``])},[s(e.$slots,`default`)],2)],512),[[O,x.value]])]),_:3})],2))}}),J=[`onClick`],Y={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] overflow-hidden pointer-events-none rounded-[inherit]`},pe=T({__name:`Segmented`,props:{modelValue:{default:``},options:{default:()=>[]},size:{default:`md`},block:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`update:modelValue`,`change`],setup(e,{emit:r}){let s=e,u=r,f=b(!1),g=new Map,S=b(null),T=b(null),E=()=>{let e=T.value,t=g.get(s.modelValue);if(!e||!t||!S.value)return;let n=S.value,r=t.offsetLeft-n.offsetLeft,i=t.offsetWidth;e.style.left=`${r}px`,e.style.width=`${i}px`},O=e=>{e.disabled||s.disabled||s.loading||(e.value!==s.modelValue&&(u(`update:modelValue`,e.value),u(`change`,e)),t(()=>E()))},k=(e,t)=>{t?g.set(e,t):g.delete(e)};o(()=>s.modelValue,()=>t(()=>E())),o(()=>s.options.length,()=>t(()=>E()));let j=null,M=null;c(()=>{s.animate&&(M=setTimeout(()=>{f.value=!0},s.delay)),t(()=>E()),typeof ResizeObserver<`u`&&S.value&&(j=new ResizeObserver(()=>E()),j.observe(S.value))}),_(()=>{j?.disconnect(),j=null,M!==null&&(clearTimeout(M),M=null),g.clear()});let N=d(()=>I(`relative inline-flex items-center bg-secondary/40 rounded-base p-1 select-none overflow-hidden border border-border/40 transition-all duration-300`,{"p-0.5 gap-1":s.size===`sm`,"p-1 gap-1":s.size===`md`,"p-1.5 gap-1.5":s.size===`lg`},s.block?`w-full`:`w-fit`,s.disabled||s.loading?`opacity-60 pointer-events-none grayscale`:``)),P=e=>I(`relative z-10 flex items-center justify-center gap-1.5 font-bold transition-all duration-200 whitespace-nowrap rounded-[calc(var(--radius)-3px)] cursor-pointer`,{"px-2.5 py-0.5 text-[11px]":s.size===`sm`,"px-3.5 py-1 text-xs":s.size===`md`,"px-5 py-1.5 text-sm":s.size===`lg`},s.block?`flex-1 justify-center`:``,e.value===s.modelValue?`text-primary-foreground`:`text-muted-foreground hover:text-foreground`,e.disabled?`opacity-45 cursor-not-allowed pointer-events-none`:``),F=d(()=>{switch(s.size){case`sm`:return`w-3.5 h-3.5`;case`lg`:return`w-4.5 h-4.5`;default:return`w-4 h-4`}}),L=d(()=>s.animate?s.entryClass?f.value?s.entryClass:`opacity-0`:I(`transform transition-all duration-700 ease-swift`,f.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-98 blur-md pointer-events-none`):``);return(e,t)=>(l(),m(`div`,{class:n(w(I)(`relative w-fit`,s.block?`w-full`:``,L.value))},[y(`div`,{class:n(N.value),ref_key:`rootEl`,ref:S},[y(`div`,{ref_key:`indicatorEl`,ref:T,class:`absolute top-0.5 bottom-0.5 z-0 rounded-[calc(var(--radius)-3px)] bg-primary shadow-sm transition-all duration-200 ease-smooth`},null,512),(l(!0),m(x,null,i(s.options,e=>(l(),m(`div`,{key:e.value,ref_for:!0,ref:t=>k(e.value,t),class:n(P(e)),onClick:t=>O(e)},[e.icon?(l(),C(D(e.icon),{key:0,class:n([F.value,`shrink-0`])},null,8,[`class`])):p(``,!0),y(`span`,null,v(e.label),1)],10,J))),128)),h(A,{name:`fade`},{default:a(()=>[s.loading?(l(),m(`div`,Y,[...t[0]||=[y(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[y(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):p(``,!0)]),_:1})],2)],2))}}),X=[`disabled`],Z=[`value`,`placeholder`,`disabled`],Q=[`disabled`],me={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},$=T({__name:`InputNumber`,props:{modelValue:{default:null},min:{default:-(2**53-1)},max:{default:2**53-1},step:{default:1},precision:{default:void 0},controls:{type:Boolean,default:!0},size:{default:`md`},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},error:{type:Boolean,default:!1},placeholder:{default:``},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`update:modelValue`,`change`,`focus`,`blur`],setup(e,{emit:t}){let r=e,i=t,{entryClasses:o}=G(()=>r.animate,()=>r.delay,()=>r.entryClass),{isInactive:s,inactiveClasses:c}=K(()=>r.disabled,()=>r.loading),{handleBlurValidate:u,handleChangeValidate:f}=re(),g=b(r.modelValue!==null&&r.modelValue!==void 0?String(r.modelValue):``),v=b(null),x=b(!1),S=d(()=>{if(r.precision!==void 0)return Math.max(0,Math.floor(r.precision));let e=String(r.step),t=e.indexOf(`.`);return t>=0?e.length-t-1:0}),C=e=>{let t=S.value,n=10**t,r=Math.round(e*n)/n,i=r.toFixed(t);return t>0?Number(i):Math.round(r)},T=e=>{let t=r.min??-(2**53-1),n=r.max??2**53-1;return C(Math.min(n,Math.max(t,e)))},E=e=>{i(`update:modelValue`,e),i(`change`,e),f(),e===null?g.value=``:g.value=String(e)},D=e=>{let t=T(e);E(t)},O=()=>D(Number(g.value||r.modelValue||0)+(r.step??1)),k=()=>D(Number(g.value||r.modelValue||0)-(r.step??1)),j=null,M=e=>{s.value||(P(),e===`up`?O():k(),j=setInterval(()=>{e===`up`?O():k()},120))},P=()=>{j&&=(clearInterval(j),null)};_(()=>P());let F=d(()=>(r.modelValue??0)>=(r.max??2**53-1)),L=d(()=>(r.modelValue??0)<=(r.min??-(2**53-1))),R=e=>{let t=e.target.value;g.value=t,f()},ee=e=>{i(`blur`,e);let t=Number(g.value);if(g.value===``||Number.isNaN(t)){g.value=r.modelValue!==null&&r.modelValue!==void 0?String(r.modelValue):``;return}D(t),u()},z=e=>{s.value||(e.preventDefault(),e.deltaY<0?O():k())},V=e=>{s.value||(e.key===`ArrowUp`?(e.preventDefault(),O()):e.key===`ArrowDown`&&(e.preventDefault(),k()))},te=d(()=>I(`relative flex items-center w-full border rounded-base transition-all duration-200 overflow-hidden bg-background`,{"h-8 px-1 text-xs":r.size===`sm`,"h-10 px-1.5 text-sm":r.size===`md`,"h-12 px-2 text-base":r.size===`lg`},r.error?`border-destructive text-destructive focus-within:ring-2 focus-within:ring-destructive/20`:`border-border hover:border-border/80 focus-within:border-primary focus-within:ring-2 focus-within:ring-primary/15`,x.value?`animate-shake`:``,c.value)),H=d(()=>I(`w-full h-full bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground/60 font-medium text-center`,r.loading?`opacity-35 blur-[1.5px] scale-[0.99]`:`opacity-100 blur-none scale-100`,`transition-all duration-300 ease-smooth`)),U=d(()=>I(`shrink-0 flex items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-muted/70 active:scale-[0.9] transition-all duration-200 cursor-pointer`,{"w-6 h-6":r.size===`sm`,"w-7 h-7":r.size===`md`,"w-8 h-8":r.size===`lg`},`disabled:opacity-40 disabled:cursor-not-allowed`)),W=d(()=>({"w-3 h-3":r.size===`sm`,"w-3.5 h-3.5":r.size===`md`,"w-4 h-4":r.size===`lg`}));return(e,t)=>(l(),m(`div`,{class:n([w(o),`w-full`])},[y(`div`,{class:n(te.value)},[r.controls?(l(),m(`button`,{key:0,type:`button`,disabled:w(s)||L.value,class:n(U.value),onPointerdown:t[0]||=e=>M(`down`),onPointerup:P,onPointerleave:P,"aria-label":`减少`},[h(w(N),{class:n(W.value)},null,8,[`class`])],42,X)):p(``,!0),y(`input`,{ref_key:`inputRef`,ref:v,value:g.value,placeholder:r.placeholder,disabled:r.disabled||r.loading,class:n(H.value),type:`text`,inputmode:`decimal`,onInput:R,onBlur:ee,onFocus:t[1]||=e=>{w(f)(),i(`focus`,e)},onKeydown:V,onWheel:z},null,42,Z),r.controls?(l(),m(`button`,{key:1,type:`button`,disabled:w(s)||F.value,class:n(U.value),onPointerdown:t[2]||=e=>M(`up`),onPointerup:P,onPointerleave:P,"aria-label":`增加`},[h(w(B),{class:n(W.value)},null,8,[`class`])],42,Q)):p(``,!0),h(A,{name:`fade`},{default:a(()=>[r.loading?(l(),m(`div`,me,[...t[3]||=[y(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[y(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):p(``,!0)]),_:1})],2)],2))}}),he={class:`space-y-4`},ge={class:`flex flex-wrap items-center gap-2 px-5 py-4`},_e={class:`ml-auto flex flex-wrap items-center gap-2`},ve={class:`inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border px-3 py-1.5 text-xs font-medium transition-colors hover:bg-muted`},ye={class:`inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border px-3 py-1.5 text-xs font-medium transition-colors hover:bg-muted`},be={class:`space-y-4 px-5 pb-5`},xe={class:`grid grid-cols-1 gap-x-6 gap-y-1 px-1 sm:grid-cols-2 lg:grid-cols-3`},Se={class:`text-[11px] text-muted-foreground`},Ce={class:`grid grid-cols-1 gap-x-6 gap-y-1 px-1 sm:grid-cols-2 lg:grid-cols-3`},we={class:`flex h-9 items-center`},Te={class:`flex h-9 items-center`},Ee={class:`grid grid-cols-1 gap-x-6 gap-y-1 px-1 sm:grid-cols-2 lg:grid-cols-3`},De={class:`grid grid-cols-1 gap-x-6 gap-y-1 px-1 sm:grid-cols-2 lg:grid-cols-3`},Oe={class:`text-[11px] text-muted-foreground`},ke={class:`flex h-9 items-center`},Ae={class:`grid grid-cols-1 gap-x-6 gap-y-1 px-1 sm:grid-cols-2 lg:grid-cols-3`},je={class:`space-y-5 px-1`},Me={class:`mb-2 flex items-center`},Ne={class:`mb-2 flex items-center`},Pe={class:`mb-2 flex items-center`},Fe={class:`mb-2 flex items-center`},Ie={class:`flex items-center gap-1.5 text-xs text-muted-foreground`},Le={class:`space-y-4 px-1`},Re={class:`grid grid-cols-1 gap-x-6 gap-y-1 sm:grid-cols-2 lg:grid-cols-4`},ze={class:`flex h-9 items-center`},Be={class:`flex h-9 items-center`},Ve={class:`flex h-9 items-center`},He={class:`flex items-center gap-2`},Ue={class:`flex items-center gap-2`},We={key:1},Ge=T({__name:`config`,setup(t){let{request:n,download:r}=H(),{toast:o,confirm:s,handleError:u}=F(),d=b(``),f=b(!1),p=b(!0),_=b(!1),T=b(`form`),E=b([`network`]),D=S({addr:``,body_limit_bytes:0,timeout:0,stream_timeout:0,stream_idle_timeout:0,max_idle_conns:0,probe_interval:0,probe_timeout:0,probe_fail_threshold:0,probe_concurrency:0,skip_unhealthy:!1,log_file:``,log_max_bytes:0,log_retention_days:0,log_raw_tokens:!1,ring_size:0,retry_on_timeout:!1,rate_limit_per_minute:0,daily_per_token:0,admin_username:``,admin_token:``,admin_password:``,admin_rate_per_minute:0,admin_allow_ips:``,metrics_token:``,route_strategy:`priority`,alerts:{webhooks:[],bark:[],on_failover:!1,on_unhealthy:!1,on_quota:!1,quota_warn_percent:80,min_alert_interval_seconds:60}}),O=b([]),A=b([]),j=b([]),M=b([]),N=[{label:`priority(优先级+权重)`,value:`priority`},{label:`latency(按延迟)`,value:`latency`},{label:`cost(按价目)`,value:`cost`}];function I(e){if(!e)return`0 B`;let t=[`B`,`KB`,`MB`,`GB`],n=0,r=e;for(;r>=1024&&n({k:e,v:t})),A.value=Object.entries(e.fallbacks||{}).map(([e,t])=>({model:e,chain:(t||[]).join(`, `)})),j.value=Object.entries(e.prices||{}).map(([e,t])=>({model:e,input:t.input??0,output:t.output??0})),M.value=(e.alias_rules||[]).map(e=>({pattern:e.pattern??``,regex:!!e.regex,model:e.model??``,params:e.params?JSON.stringify(e.params):``}))}async function K(){p.value=!0;try{let e=await n(`/config`);d.value=JSON.stringify(e,null,2),G(e),_.value=!1}catch(e){u(e)}finally{p.value=!1}}c(K);function re(){let e;try{e=JSON.parse(d.value)}catch(e){throw Error(`JSON 视图不是合法 JSON: `+e.message)}let t={};for(let{k:e,v:n}of O.value)e.trim()&&(t[e.trim()]=n);let n={};for(let{model:e,chain:t}of A.value){let r=t.split(`,`).map(e=>e.trim()).filter(Boolean);e.trim()&&r.length&&(n[e.trim()]=r)}let r={};for(let e of j.value)e.model.trim()&&(r[e.model.trim()]={input:Number(e.input)||0,output:Number(e.output)||0});let i=[];for(let e of M.value){if(!e.pattern.trim()||!e.model.trim())continue;let t={pattern:e.pattern.trim(),regex:e.regex,model:e.model.trim()};if(e.params.trim())try{t.params=JSON.parse(e.params)}catch{throw Error(`alias_rules[${e.pattern}] params 不是合法 JSON`)}i.push(t)}return Object.assign(e,{addr:D.addr,body_limit_bytes:Number(D.body_limit_bytes)||0,timeout:Number(D.timeout)||0,stream_timeout:Number(D.stream_timeout)||0,stream_idle_timeout:Number(D.stream_idle_timeout)||0,max_idle_conns:Number(D.max_idle_conns)||0,probe_interval:Number(D.probe_interval)||0,probe_timeout:Number(D.probe_timeout)||0,probe_fail_threshold:Number(D.probe_fail_threshold)||0,probe_concurrency:Number(D.probe_concurrency)||0,skip_unhealthy:D.skip_unhealthy,log_file:D.log_file,log_max_bytes:Number(D.log_max_bytes)||0,log_retention_days:Number(D.log_retention_days)||0,log_raw_tokens:D.log_raw_tokens,ring_size:Number(D.ring_size)||0,retry_on_timeout:D.retry_on_timeout,rate_limit_per_minute:Number(D.rate_limit_per_minute)||0,daily_per_token:Number(D.daily_per_token)||0,admin_username:D.admin_username,admin_token:D.admin_token,admin_rate_per_minute:Number(D.admin_rate_per_minute)||0,admin_allow_ips:D.admin_allow_ips.split(`,`).map(e=>e.trim()).filter(Boolean),metrics_token:D.metrics_token,route_strategy:D.route_strategy,alerts:{webhooks:D.alerts.webhooks,bark:D.alerts.bark,on_failover:D.alerts.on_failover,on_unhealthy:D.alerts.on_unhealthy,on_quota:D.alerts.on_quota,quota_warn_percent:Number(D.alerts.quota_warn_percent)||0,min_alert_interval_seconds:Number(D.alerts.min_alert_interval_seconds)||0},aliases:t,fallbacks:n,prices:r,alias_rules:i}),D.admin_password&&(e.admin_password=D.admin_password),e}async function ue(){let e;try{e=re()}catch(e){o.error(e.message);return}if(await s(`保存并热重载`,`校验失败将保留当前配置。`)){f.value=!0;try{await n(`/config`,{method:`POST`,body:JSON.stringify(e)}),o.success(`已保存并热重载`),await K()}catch(e){u(e)}finally{f.value=!1}}}async function de(){try{await r(`/config/export`,`liapi-config.json`)}catch(e){u(e)}}async function fe(e,t){let r=await e.text();if(await s(`导入配置`,t===`oneapi`?`从 OneAPI 导入?仅替换 upstreams,其余配置保持不变。`:`导入并覆盖全部配置?当前配置将被替换(校验失败则不替换)。`,{danger:t!==`oneapi`}))try{await n(t===`oneapi`?`/config/import?format=oneapi`:`/config/import`,{method:`POST`,body:r}),o.success(t===`oneapi`?`OneAPI 上游已导入`:`导入成功`),await K()}catch(e){u(e)}}function J(e,t){let n=e.target,r=n.files?.[0];r&&fe(r,t),n.value=``}let Y=b(``),X=b(``);function Z(){let e=Y.value.trim();e&&(D.alerts.webhooks.push(e),Y.value=``)}function Q(){let e=X.value.trim();e&&(D.alerts.bark.push(e),X.value=``)}return(t,n)=>{let r=U;return l(),m(`div`,he,[h(w(P),{padding:`none`},{header:a(()=>[y(`div`,ge,[n[47]||=y(`h2`,{class:`text-sm font-semibold`},`配置(可视化编辑 + 热重载)`,-1),y(`div`,_e,[h(w(pe),{modelValue:w(T),"onUpdate:modelValue":n[0]||=t=>e(T)?T.value=t:null,options:[{label:`表单`,value:`form`,icon:w(ee)},{label:`JSON`,value:`json`,icon:w(ae)}],size:`sm`},null,8,[`modelValue`,`options`]),h(w(L),{variant:`outline`,size:`sm`,icon:w(te),loading:w(p),onClick:K},{default:a(()=>[...n[42]||=[g(` 重新加载 `,-1)]]),_:1},8,[`icon`,`loading`]),h(w(L),{variant:`primary`,size:`sm`,icon:w(se),loading:w(f),onClick:ue},{default:a(()=>[...n[43]||=[g(` 保存并热重载 `,-1)]]),_:1},8,[`icon`,`loading`]),h(w(L),{variant:`outline`,size:`sm`,icon:w(R),onClick:de},{default:a(()=>[...n[44]||=[g(` 导出 JSON `,-1)]]),_:1},8,[`icon`]),y(`label`,ve,[h(w(ce),{size:15}),n[45]||=g(` 导入 JSON `,-1),y(`input`,{type:`file`,accept:`.json,application/json`,class:`hidden`,onChange:n[1]||=e=>J(e,`liapi`)},null,32)]),y(`label`,ye,[h(w(oe),{size:15}),n[46]||=g(` 导入 OneAPI `,-1),y(`input`,{type:`file`,accept:`.json,application/json`,class:`hidden`,onChange:n[2]||=e=>J(e,`oneapi`)},null,32)])])])]),default:a(()=>[y(`div`,be,[h(w(ie),{type:`info`,"show-icon":!0},{default:a(()=>[...n[48]||=[g(` 「重新加载」拉取的配置中密钥已脱敏,保存时脱敏值自动还原。 表单未覆盖的字段(token_policies / token_quotas / upstreams / devices 等) 保留原值:upstreams 与 devices 请到各自的「上游」「设备」页维护。 「导出 JSON」含完整密钥,请妥善保管。 `,-1)]]),_:1}),w(T)===`form`?(l(),C(w(le),{key:0,modelValue:w(E),"onUpdate:modelValue":n[40]||=t=>e(E)?E.value=t:null},{default:a(()=>[h(w(q),{name:`network`,title:`监听与转发`},{default:a(()=>[y(`div`,xe,[h(r,{label:`addr(监听地址)`},{default:a(()=>[h(w(z),{modelValue:w(D).addr,"onUpdate:modelValue":n[3]||=e=>w(D).addr=e,placeholder:`:8787`},null,8,[`modelValue`])]),_:1}),h(r,{label:`body_limit_bytes(请求体上限)`},{default:a(()=>[h(w($),{modelValue:w(D).body_limit_bytes,"onUpdate:modelValue":n[4]||=e=>w(D).body_limit_bytes=e,min:0,step:1048576,controls:``},null,8,[`modelValue`]),y(`span`,Se,v(I(w(D).body_limit_bytes)),1)]),_:1}),h(r,{label:`max_idle_conns(连接池)`},{default:a(()=>[h(w($),{modelValue:w(D).max_idle_conns,"onUpdate:modelValue":n[5]||=e=>w(D).max_idle_conns=e,min:0,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`timeout(非流式超时,秒;0=关闭)`},{default:a(()=>[h(w($),{modelValue:w(D).timeout,"onUpdate:modelValue":n[6]||=e=>w(D).timeout=e,min:0,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`stream_timeout(流式整体超时,秒;0=不设)`},{default:a(()=>[h(w($),{modelValue:w(D).stream_timeout,"onUpdate:modelValue":n[7]||=e=>w(D).stream_timeout=e,min:0,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`stream_idle_timeout(流式空闲看门狗,秒)`},{default:a(()=>[h(w($),{modelValue:w(D).stream_idle_timeout,"onUpdate:modelValue":n[8]||=e=>w(D).stream_idle_timeout=e,min:0,controls:``},null,8,[`modelValue`])]),_:1})])]),_:1}),h(w(q),{name:`routing`,title:`路由与重试`},{default:a(()=>[y(`div`,Ce,[h(r,{label:`route_strategy(路由策略)`},{default:a(()=>[h(w(pe),{modelValue:w(D).route_strategy,"onUpdate:modelValue":n[9]||=e=>w(D).route_strategy=e,options:N,size:`sm`,block:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`retry_on_timeout(超时重试,防重复计费)`},{default:a(()=>[y(`div`,we,[h(w(W),{modelValue:w(D).retry_on_timeout,"onUpdate:modelValue":n[10]||=e=>w(D).retry_on_timeout=e},null,8,[`modelValue`])])]),_:1}),h(r,{label:`skip_unhealthy(避开不健康上游)`},{default:a(()=>[y(`div`,Te,[h(w(W),{modelValue:w(D).skip_unhealthy,"onUpdate:modelValue":n[11]||=e=>w(D).skip_unhealthy=e},null,8,[`modelValue`])])]),_:1}),h(r,{label:`rate_limit_per_minute(全局限流,0=关)`},{default:a(()=>[h(w($),{modelValue:w(D).rate_limit_per_minute,"onUpdate:modelValue":n[12]||=e=>w(D).rate_limit_per_minute=e,min:0,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`daily_per_token(每日配额,0=关)`},{default:a(()=>[h(w($),{modelValue:w(D).daily_per_token,"onUpdate:modelValue":n[13]||=e=>w(D).daily_per_token=e,min:0,controls:``},null,8,[`modelValue`])]),_:1})])]),_:1}),h(w(q),{name:`health`,title:`健康检查`},{default:a(()=>[y(`div`,Ee,[h(r,{label:`probe_interval(间隔,秒)`},{default:a(()=>[h(w($),{modelValue:w(D).probe_interval,"onUpdate:modelValue":n[14]||=e=>w(D).probe_interval=e,min:0,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`probe_timeout(超时,秒)`},{default:a(()=>[h(w($),{modelValue:w(D).probe_timeout,"onUpdate:modelValue":n[15]||=e=>w(D).probe_timeout=e,min:0,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`probe_fail_threshold(连续失败判定)`},{default:a(()=>[h(w($),{modelValue:w(D).probe_fail_threshold,"onUpdate:modelValue":n[16]||=e=>w(D).probe_fail_threshold=e,min:0,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`probe_concurrency(探测并发)`},{default:a(()=>[h(w($),{modelValue:w(D).probe_concurrency,"onUpdate:modelValue":n[17]||=e=>w(D).probe_concurrency=e,min:0,controls:``},null,8,[`modelValue`])]),_:1})])]),_:1}),h(w(q),{name:`logging`,title:`日志`},{default:a(()=>[y(`div`,De,[h(r,{label:`log_file(JSONL 路径)`},{default:a(()=>[h(w(z),{modelValue:w(D).log_file,"onUpdate:modelValue":n[18]||=e=>w(D).log_file=e,placeholder:`relay.jsonl`},null,8,[`modelValue`])]),_:1}),h(r,{label:`log_max_bytes(轮转阈值)`},{default:a(()=>[h(w($),{modelValue:w(D).log_max_bytes,"onUpdate:modelValue":n[19]||=e=>w(D).log_max_bytes=e,min:0,step:1048576,controls:``},null,8,[`modelValue`]),y(`span`,Oe,v(I(w(D).log_max_bytes)),1)]),_:1}),h(r,{label:`log_retention_days(保留天数,0=永久)`},{default:a(()=>[h(w($),{modelValue:w(D).log_retention_days,"onUpdate:modelValue":n[20]||=e=>w(D).log_retention_days=e,min:0,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`ring_size(内存环形缓冲条数)`},{default:a(()=>[h(w($),{modelValue:w(D).ring_size,"onUpdate:modelValue":n[21]||=e=>w(D).ring_size=e,min:0,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`log_raw_tokens(记录明文 token,仅排查用)`},{default:a(()=>[y(`div`,ke,[h(w(W),{modelValue:w(D).log_raw_tokens,"onUpdate:modelValue":n[22]||=e=>w(D).log_raw_tokens=e},null,8,[`modelValue`])])]),_:1})])]),_:1}),h(w(q),{name:`admin`,title:`管理台与鉴权`},{default:a(()=>[y(`div`,Ae,[h(r,{label:`admin_username(登录用户名)`},{default:a(()=>[h(w(z),{modelValue:w(D).admin_username,"onUpdate:modelValue":n[23]||=e=>w(D).admin_username=e},null,8,[`modelValue`])]),_:1}),h(r,{label:`admin_password(留空=保持原密码)`},{default:a(()=>[h(w(z),{modelValue:w(D).admin_password,"onUpdate:modelValue":n[24]||=e=>w(D).admin_password=e,type:`password`,placeholder:`输入新密码以修改`},null,8,[`modelValue`])]),_:1}),h(r,{label:`admin_token(脱敏;原样保存则不变)`},{default:a(()=>[h(w(z),{modelValue:w(D).admin_token,"onUpdate:modelValue":n[25]||=e=>w(D).admin_token=e},null,8,[`modelValue`])]),_:1}),h(r,{label:`admin_rate_per_minute(-1=关闭,0=默认60)`},{default:a(()=>[h(w($),{modelValue:w(D).admin_rate_per_minute,"onUpdate:modelValue":n[26]||=e=>w(D).admin_rate_per_minute=e,min:-1,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`metrics_token(/metrics 鉴权;- = 免鉴权)`},{default:a(()=>[h(w(z),{modelValue:w(D).metrics_token,"onUpdate:modelValue":n[27]||=e=>w(D).metrics_token=e,placeholder:`留空=用 admin_token`},null,8,[`modelValue`])]),_:1}),h(r,{label:`admin_allow_ips(IP/CIDR,逗号分隔)`},{default:a(()=>[h(w(z),{modelValue:w(D).admin_allow_ips,"onUpdate:modelValue":n[28]||=e=>w(D).admin_allow_ips=e,placeholder:`127.0.0.1, 10.0.0.0/8`},null,8,[`modelValue`])]),_:1})])]),_:1}),h(w(q),{name:`aliases`,title:`别名 / 降级链 / 价目`},{default:a(()=>[y(`div`,je,[y(`div`,null,[y(`div`,Me,[n[50]||=y(`span`,{class:`text-xs font-medium`},`aliases(精确别名)`,-1),h(w(L),{variant:`outline`,size:`sm`,icon:w(B),class:`ml-auto`,onClick:n[29]||=e=>w(O).push({k:``,v:``})},{default:a(()=>[...n[49]||=[g(`添加`,-1)]]),_:1},8,[`icon`])]),(l(!0),m(x,null,i(w(O),(e,t)=>(l(),m(`div`,{key:`a`+t,class:`mb-2 flex items-center gap-2`},[h(w(z),{modelValue:e.k,"onUpdate:modelValue":t=>e.k=t,placeholder:`gpt-4o`},null,8,[`modelValue`,`onUpdate:modelValue`]),n[51]||=y(`span`,{class:`text-muted-foreground`},`→`,-1),h(w(z),{modelValue:e.v,"onUpdate:modelValue":t=>e.v=t,placeholder:`openai/gpt-4o`},null,8,[`modelValue`,`onUpdate:modelValue`]),h(w(L),{variant:`ghost`,size:`sm`,danger:``,icon:w(V),onClick:e=>w(O).splice(t,1)},null,8,[`icon`,`onClick`])]))),128))]),y(`div`,null,[y(`div`,Ne,[n[53]||=y(`span`,{class:`text-xs font-medium`},`fallbacks(显式降级链,逗号分隔上游名)`,-1),h(w(L),{variant:`outline`,size:`sm`,icon:w(B),class:`ml-auto`,onClick:n[30]||=e=>w(A).push({model:``,chain:``})},{default:a(()=>[...n[52]||=[g(`添加`,-1)]]),_:1},8,[`icon`])]),(l(!0),m(x,null,i(w(A),(e,t)=>(l(),m(`div`,{key:`f`+t,class:`mb-2 flex items-center gap-2`},[h(w(z),{modelValue:e.model,"onUpdate:modelValue":t=>e.model=t,placeholder:`gpt-4o`},null,8,[`modelValue`,`onUpdate:modelValue`]),n[54]||=y(`span`,{class:`text-muted-foreground`},`→`,-1),h(w(z),{modelValue:e.chain,"onUpdate:modelValue":t=>e.chain=t,placeholder:`openai-main, openrouter-fallback`},null,8,[`modelValue`,`onUpdate:modelValue`]),h(w(L),{variant:`ghost`,size:`sm`,danger:``,icon:w(V),onClick:e=>w(A).splice(t,1)},null,8,[`icon`,`onClick`])]))),128))]),y(`div`,null,[y(`div`,Pe,[n[56]||=y(`span`,{class:`text-xs font-medium`},`prices(元 / 1M tokens)`,-1),h(w(L),{variant:`outline`,size:`sm`,icon:w(B),class:`ml-auto`,onClick:n[31]||=e=>w(j).push({model:``,input:0,output:0})},{default:a(()=>[...n[55]||=[g(`添加`,-1)]]),_:1},8,[`icon`])]),(l(!0),m(x,null,i(w(j),(e,t)=>(l(),m(`div`,{key:`p`+t,class:`mb-2 flex items-center gap-2`},[h(w(z),{modelValue:e.model,"onUpdate:modelValue":t=>e.model=t,placeholder:`gpt-4o`},null,8,[`modelValue`,`onUpdate:modelValue`]),h(w($),{modelValue:e.input,"onUpdate:modelValue":t=>e.input=t,min:0,step:.1,placeholder:`input`,controls:``},null,8,[`modelValue`,`onUpdate:modelValue`]),h(w($),{modelValue:e.output,"onUpdate:modelValue":t=>e.output=t,min:0,step:.1,placeholder:`output`,controls:``},null,8,[`modelValue`,`onUpdate:modelValue`]),h(w(L),{variant:`ghost`,size:`sm`,danger:``,icon:w(V),onClick:e=>w(j).splice(t,1)},null,8,[`icon`,`onClick`])]))),128))]),y(`div`,null,[y(`div`,Fe,[n[58]||=y(`span`,{class:`text-xs font-medium`},`alias_rules(正则别名 + 参数覆写)`,-1),h(w(L),{variant:`outline`,size:`sm`,icon:w(B),class:`ml-auto`,onClick:n[32]||=e=>w(M).push({pattern:``,regex:!1,model:``,params:``})},{default:a(()=>[...n[57]||=[g(`添加`,-1)]]),_:1},8,[`icon`])]),(l(!0),m(x,null,i(w(M),(e,t)=>(l(),m(`div`,{key:`r`+t,class:`mb-2 grid grid-cols-1 items-center gap-2 sm:grid-cols-[1fr_auto_1fr_1fr_auto]`},[h(w(z),{modelValue:e.pattern,"onUpdate:modelValue":t=>e.pattern=t,placeholder:`^gpt-4o-mini$`},null,8,[`modelValue`,`onUpdate:modelValue`]),y(`label`,Ie,[h(w(W),{modelValue:e.regex,"onUpdate:modelValue":t=>e.regex=t,size:`sm`},null,8,[`modelValue`,`onUpdate:modelValue`]),n[59]||=g(` regex `,-1)]),h(w(z),{modelValue:e.model,"onUpdate:modelValue":t=>e.model=t,placeholder:`openai/gpt-4o-mini`},null,8,[`modelValue`,`onUpdate:modelValue`]),h(w(z),{modelValue:e.params,"onUpdate:modelValue":t=>e.params=t,placeholder:`{"temperature":0.2}`},null,8,[`modelValue`,`onUpdate:modelValue`]),h(w(L),{variant:`ghost`,size:`sm`,danger:``,icon:w(V),onClick:e=>w(M).splice(t,1)},null,8,[`icon`,`onClick`])]))),128))])])]),_:1}),h(w(q),{name:`alerts`,title:`告警`},{default:a(()=>[y(`div`,Le,[y(`div`,Re,[h(r,{label:`on_failover(故障转移告警)`},{default:a(()=>[y(`div`,ze,[h(w(W),{modelValue:w(D).alerts.on_failover,"onUpdate:modelValue":n[33]||=e=>w(D).alerts.on_failover=e},null,8,[`modelValue`])])]),_:1}),h(r,{label:`on_unhealthy(不健康告警)`},{default:a(()=>[y(`div`,Be,[h(w(W),{modelValue:w(D).alerts.on_unhealthy,"onUpdate:modelValue":n[34]||=e=>w(D).alerts.on_unhealthy=e},null,8,[`modelValue`])])]),_:1}),h(r,{label:`on_quota(配额告警)`},{default:a(()=>[y(`div`,Ve,[h(w(W),{modelValue:w(D).alerts.on_quota,"onUpdate:modelValue":n[35]||=e=>w(D).alerts.on_quota=e},null,8,[`modelValue`])])]),_:1}),h(r,{label:`quota_warn_percent(告警阈值 %)`},{default:a(()=>[h(w($),{modelValue:w(D).alerts.quota_warn_percent,"onUpdate:modelValue":n[36]||=e=>w(D).alerts.quota_warn_percent=e,min:0,max:100,controls:``},null,8,[`modelValue`])]),_:1}),h(r,{label:`min_alert_interval_seconds(去重窗口)`},{default:a(()=>[h(w($),{modelValue:w(D).alerts.min_alert_interval_seconds,"onUpdate:modelValue":n[37]||=e=>w(D).alerts.min_alert_interval_seconds=e,min:0,controls:``},null,8,[`modelValue`])]),_:1})]),y(`div`,null,[n[61]||=y(`div`,{class:`mb-2 text-xs font-medium`},`webhooks(通用 JSON POST)`,-1),(l(!0),m(x,null,i(w(D).alerts.webhooks,(e,t)=>(l(),m(`div`,{key:`w`+t,class:`mb-2 flex items-center gap-2`},[h(w(z),{"model-value":e,"onUpdate:modelValue":e=>w(D).alerts.webhooks[t]=String(e)},null,8,[`model-value`,`onUpdate:modelValue`]),h(w(L),{variant:`ghost`,size:`sm`,danger:``,icon:w(V),onClick:e=>w(D).alerts.webhooks.splice(t,1)},null,8,[`icon`,`onClick`])]))),128)),y(`div`,He,[h(w(z),{modelValue:w(Y),"onUpdate:modelValue":n[38]||=t=>e(Y)?Y.value=t:null,placeholder:`https://hook.example.com/notify`,onKeyup:k(Z,[`enter`])},null,8,[`modelValue`]),h(w(L),{variant:`outline`,size:`sm`,icon:w(B),onClick:Z},{default:a(()=>[...n[60]||=[g(`添加`,-1)]]),_:1},8,[`icon`])])]),y(`div`,null,[n[63]||=y(`div`,{class:`mb-2 text-xs font-medium`},`bark(Bark 推送 URL)`,-1),(l(!0),m(x,null,i(w(D).alerts.bark,(e,t)=>(l(),m(`div`,{key:`b`+t,class:`mb-2 flex items-center gap-2`},[h(w(z),{"model-value":e,"onUpdate:modelValue":e=>w(D).alerts.bark[t]=String(e)},null,8,[`model-value`,`onUpdate:modelValue`]),h(w(L),{variant:`ghost`,size:`sm`,danger:``,icon:w(V),onClick:e=>w(D).alerts.bark.splice(t,1)},null,8,[`icon`,`onClick`])]))),128)),y(`div`,Ue,[h(w(z),{modelValue:w(X),"onUpdate:modelValue":n[39]||=t=>e(X)?X.value=t:null,placeholder:`https://api.day.app/xxxx`,onKeyup:k(Q,[`enter`])},null,8,[`modelValue`]),h(w(L),{variant:`outline`,size:`sm`,icon:w(B),onClick:Q},{default:a(()=>[...n[62]||=[g(`添加`,-1)]]),_:1},8,[`icon`])])])])]),_:1})]),_:1},8,[`modelValue`])):(l(),m(`div`,We,[n[64]||=y(`p`,{class:`mb-3 text-xs text-muted-foreground`},` 直接编辑 JSON。保存时会先通过 JSON 解析与后端校验,失败则保留当前配置。 `,-1),h(w(ne),{modelValue:w(d),"onUpdate:modelValue":n[41]||=t=>e(d)?d.value=t:null,rows:24,resize:`vertical`,placeholder:`{ }`,class:`font-mono text-xs`},null,8,[`modelValue`])]))])]),_:1})])}}});export{Ge as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/DMJkRJ-9.js b/server/adminui/_nuxt/DMJkRJ-9.js new file mode 100644 index 0000000..8f8a6ff --- /dev/null +++ b/server/adminui/_nuxt/DMJkRJ-9.js @@ -0,0 +1 @@ +import{M as e,c as t,nt as n}from"./Bx_a1Ri3.js";import{n as r}from"./D2-o7L18.js";function i(i,a,o){let s=n(!1);return e(()=>{i()&&setTimeout(()=>{s.value=!0},a())}),{isAnimateActive:s,entryClasses:t(()=>{if(!i())return``;let e=o();return e?s.value?e:`opacity-0`:r(`transform transition-all duration-700 ease-swift`,s.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-98 blur-md pointer-events-none`)})}}export{i as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/DQKjIeim.js b/server/adminui/_nuxt/DQKjIeim.js new file mode 100644 index 0000000..3eea5ea --- /dev/null +++ b/server/adminui/_nuxt/DQKjIeim.js @@ -0,0 +1 @@ +import{D as e,Et as t,I as n,J as r,K as i,L as a,M as o,Ot as s,P as c,S as l,U as u,W as d,c as f,d as p,f as m,g as h,h as g,k as _,kt as v,l as y,lt as b,nt as x,o as ee,r as S,tt as C,u as w,ut as T,v as E,z as D}from"./Bx_a1Ri3.js";import{F as O,M as k,N as A,j,p as M,z as te}from"./Dw7E2aQ0.js";import{t as N}from"./BOgT-xSl.js";import{i as P,n as F,r as I,t as L}from"./D2-o7L18.js";import{t as R}from"./z_P_bNzM.js";var z=N(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),B=N(`info`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]),ne={class:`h-auto w-full`},V={class:`font-bold text-sm w-full flex items-center justify-between gap-4`},H={class:`relative z-10 w-full`},U={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},W=E({__name:`Card`,props:{variant:{default:`default`},shadow:{default:`none`},hoverShadow:{type:Boolean,default:!1},interactive:{default:`none`},bordered:{type:Boolean,default:!0},glass:{type:Boolean,default:!1},padding:{default:`md`},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``},loading:{type:Boolean,default:!1}},setup(e){let n=e,l=x(!1),u=x(null),d=x(null);i(()=>n.loading,e=>{e&&u.value?d.value=`${u.value.offsetHeight}px`:d.value=null}),o(()=>{n.animate&&setTimeout(()=>{l.value=!0},n.delay)});let g=f(()=>F(`relative h-fit w-full rounded-base overflow-hidden transition-all duration-300 ease-out`,n.bordered?n.glass?`border border-white/10 dark:border-white/5`:`border border-border/60`:`border-transparent`,{"bg-background text-foreground":n.variant==="default"&&!n.glass,"bg-background/70 text-foreground":n.variant==="default"&&n.glass,"bg-primary text-primary-foreground border-transparent":n.variant===`primary`,"bg-secondary text-secondary-foreground":n.variant===`secondary`&&!n.glass,"bg-secondary/40 text-secondary-foreground":n.variant===`secondary`&&n.glass,"bg-muted/60 text-muted-foreground":n.variant===`muted`&&!n.glass,"bg-muted/30 text-muted-foreground":n.variant===`muted`&&n.glass},n.glass?`backdrop-blur-lg`:``,{"shadow-none":n.shadow===`none`,"shadow-[0_2px_8px_rgba(0,0,0,0.015)] dark:shadow-none":n.shadow===`sm`,"shadow-[0_4px_16px_rgba(0,0,0,0.02),0_1px_4px_rgba(0,0,0,0.01)] dark:shadow-none":n.shadow===`md`,"shadow-[0_12px_32px_rgba(0,0,0,0.03),0_2px_8px_rgba(0,0,0,0.01)] dark:shadow-none":n.shadow===`lg`},n.hoverShadow&&!n.loading?`hover:shadow-[0_16px_36px_rgba(0,0,0,0.04),0_2px_12px_rgba(0,0,0,0.01)] dark:hover:shadow-none`:``,{"hover:scale-[1.006]":n.interactive===`lift`&&!n.loading,"active:scale-[0.993]":n.interactive!==`none`&&!n.loading},{"p-0":n.padding===`none`,"p-3.5":n.padding===`sm`,"p-5":n.padding===`md`,"p-7":n.padding===`lg`},n.animate?n.entryClass?l.value?n.entryClass:`opacity-0`:F(`transform transition-all duration-700 ease-swift`,l.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-2 scale-98 blur-md pointer-events-none`):``));return(e,i)=>(c(),m(`div`,{ref_key:`cardContainer`,ref:u,class:t(g.value),style:s(d.value?{height:d.value}:{})},[y(`div`,ne,[e.$slots.header?(c(),m(`div`,{key:0,class:t([n.padding===`none`?`p-4 border-b border-border/40`:`mb-3.5 pb-3 border-b border-border/40`,`w-full`])},[y(`div`,V,[a(e.$slots,`header`)])],2)):p(``,!0),y(`div`,H,[a(e.$slots,`default`)]),e.$slots.footer?(c(),m(`div`,{key:1,class:t([n.padding===`none`?`p-4 border-t border-border/40`:`mt-3.5 pt-3 border-t border-border/40`,`w-full`])},[a(e.$slots,`footer`)],2)):p(``,!0)]),h(j,{name:`fade`},{default:r(()=>[n.loading?(c(),m(`div`,U,[...i[0]||=[y(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[y(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):p(``,!0)]),_:1})],6))}}),re=[`a[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`].join(`, `);function G(e){return Array.from(e.querySelectorAll(re)).filter(e=>{if(e.getAttribute(`aria-hidden`)===`true`)return!1;let t=window.getComputedStyle(e);return t.display!==`none`&&t.visibility!==`hidden`})}function ie(t,n,r={}){let{restore:a=!0}=r,o=null,s=!1,c=e=>{if(e.key!==`Tab`)return;let n=t.value;if(!n)return;let r=G(n);if(r.length===0){e.preventDefault();return}let i=document.activeElement,a=r[0],o=r[r.length-1],s=!i||!n.contains(i);e.shiftKey?(i===a||s)&&(e.preventDefault(),o.focus()):(i===o||s)&&(e.preventDefault(),a.focus())},l=()=>{let e=t.value;if(!e)return;let n=G(e)[0];n?n.focus():e.focus()},u=()=>{s||typeof document>`u`||(s=!0,o=document.activeElement,document.addEventListener(`keydown`,c,!0),l())},d=()=>{if(!s)return;s=!1,document.removeEventListener(`keydown`,c,!0);let e=o;o=null,a&&e&&typeof e.focus==`function`&&e.isConnected&&e.focus()};return i(()=>b(n),t=>{t?e(u):d()},{immediate:!0}),_(()=>{s&&(s=!1,document.removeEventListener(`keydown`,c,!0),o=null)}),{activate:u,deactivate:d}}var ae={class:`fixed top-6 left-0 right-0 z-[99999] flex flex-col items-center gap-3 pointer-events-none px-4`,"aria-live":`polite`,"aria-atomic":`false`},oe=[`role`],se={class:`text-sm font-semibold leading-none tracking-tight`},ce=[`onClick`],le=E({__name:`MessageContainer`,props:{messages:{}},emits:[`remove`],setup(e,{emit:i}){let a=e,o=i,s={info:B,success:z,warning:I,error:P},l=e=>{switch(e){case`error`:return`border-destructive/50 bg-background/60 text-destructive dark:bg-background/80`;case`warning`:return`border-warning/50 bg-background/60 text-warning dark:bg-background/80`;case`success`:return`border-success/50 bg-background/60 text-success dark:bg-background/80`;default:return`border-border bg-background/60 text-foreground dark:bg-background/80`}};return(e,i)=>(c(),m(`div`,ae,[h(k,{name:`message-flip`,tag:`div`,class:`flex flex-col items-center gap-3`},{default:r(()=>[(c(!0),m(S,null,n(a.messages,e=>(c(),m(`div`,{key:e.id,class:t([`pointer-events-auto max-w-xl w-fit flex items-center gap-3 px-4 py-3 shadow-[0_8px_30px_rgba(0,0,0,0.08)] rounded-base border backdrop-blur-md`,T(F)(l(e.type),e.class)]),role:e.type===`error`?`alert`:void 0},[(c(),w(D(e.icon||s[e.type||`info`]),{class:`w-4 h-4 shrink-0`})),y(`span`,se,v(e.content),1),e.closable?(c(),m(`button`,{key:0,onClick:t=>o(`remove`,e.id),class:`ml-2 p-0.5 rounded-[calc(var(--radius)-4px)] hover:bg-muted/80 transition-colors active:scale-90`,"aria-label":`关闭`},[h(T(R),{class:`w-3.5 h-3.5 opacity-60`})],8,ce)):p(``,!0)],10,oe))),128))]),_:1})]))}}),K=C([]),q=!1,J=new Map,ue=()=>`message_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,de=()=>{if(q)return;let e=document.createElement(`div`);e.className=`fuxsto-message-wrapper`,document.body.appendChild(e);let t=h(le,{messages:K,onRemove:Y});O(t,e),q=!0},Y=e=>{let t=J.get(e);t&&(clearTimeout(t),J.delete(e));let n=K.findIndex(t=>t.id===e);n!==-1&&K.splice(n,1)},X=e=>{q||de();let t=typeof e==`string`?{content:e}:e,n=t.id||ue(),r=t.duration===void 0?3e3:t.duration,i=t.type||`info`,a=K.find(e=>e.content===t.content&&(e.type||`info`)===i);if(a?.id){let e=a.id;if(r>0){let t=J.get(e);t&&clearTimeout(t),J.set(e,setTimeout(()=>Y(e),r))}return e}let o={...t,id:n,type:i};if(K.push(o),K.length>5){let e=K.shift();if(e?.id){let t=J.get(e.id);t&&clearTimeout(t),J.delete(e.id)}}return r>0&&J.set(n,setTimeout(()=>Y(n),r)),n};X.info=(e,t)=>X({content:e,type:`info`,...t}),X.success=(e,t)=>X({content:e,type:`success`,...t}),X.warning=(e,t)=>X({content:e,type:`warning`,...t}),X.error=(e,t)=>X({content:e,type:`error`,...t});var Z=0,Q=``;function fe(){Z===0&&(Q=document.body.style.overflow,document.body.style.overflow=`hidden`),Z++}function pe(){Z!==0&&(Z--,Z===0&&(document.body.style.overflow=Q))}var me={key:0,class:`fixed inset-0 z-[99999] flex items-center justify-center p-4 overflow-y-auto pointer-events-none`},he=[`aria-labelledby`,`aria-describedby`],ge={key:0,class:`w-full flex items-center justify-between pr-3`},_e={key:1,class:`flex items-start gap-3.5 pr-6`},ve={class:`space-y-1`},ye=[`id`],be=[`id`],xe=[`disabled`],Se={key:1,class:`flex items-center justify-end gap-2.5 px-4.5 py-3.5 sm:px-5 sm:py-3.5 bg-muted/20 border-t border-border/40`},Ce={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},we=E({__name:`Dialog`,props:{open:{type:Boolean,default:!1},title:{default:``},description:{default:``},size:{default:`md`},confirmText:{default:`确认`},cancelText:{default:`取消`},confirmVariant:{default:`primary`},cancelVariant:{default:`secondary`},showConfirm:{type:Boolean,default:!0},showCancel:{type:Boolean,default:!0},danger:{type:Boolean,default:!1},closable:{type:Boolean,default:!0},maskClosable:{type:Boolean,default:!0},escClosable:{type:Boolean,default:!0},loading:{type:Boolean,default:!1},type:{default:`none`},icon:{default:null}},emits:[`update:open`,`confirm`,`cancel`,`close`],setup(e,{emit:n}){let s=e,l=n,b=d(),S=x(null),C=u(),E=u();ie(S,f(()=>s.open));function O(){if(!b.default)return!1;let e=b.default();return!e||e.length===0?!1:e.some(e=>typeof e.children!=`string`||e.children.trim().length>0)}let k=e=>{typeof document<`u`&&(e?fe():pe())};i(()=>s.open,e=>{k(e)});let A=()=>{s.loading||(l(`update:open`,!1),l(`close`))},M=()=>{s.maskClosable&&A()},N=e=>l(`confirm`,e),ne=e=>{s.loading||(l(`cancel`,e),A())},V=e=>{s.open&&s.escClosable&&e.key===`Escape`&&A()};o(()=>{window.addEventListener(`keydown`,V),s.open&&k(!0)}),_(()=>{window.removeEventListener(`keydown`,V),k(!1)});let H=f(()=>F(`relative w-full h-fit bg-background border border-border/80 shadow-[0_20px_50px_rgba(0,0,0,0.2)] rounded-base overflow-hidden transition-all duration-300 pointer-events-auto flex flex-col`,{"max-w-sm":s.size===`sm`,"max-w-md":s.size===`md`,"max-w-lg":s.size===`lg`,"max-w-2xl":s.size===`xl`,"max-w-[calc(100vw-2rem)] min-h-[calc(100vh-2rem)]":s.size===`full`})),U={info:B,success:z,warning:I,error:P,none:null},W=f(()=>{switch(s.type){case`error`:return`text-destructive`;case`warning`:return`text-warning`;case`success`:return`text-success`;default:return`text-primary`}});return(e,n)=>(c(),w(ee,{to:`body`},[h(j,{name:`dialog-mask`,appear:``},{default:r(()=>[s.open?(c(),m(`div`,{key:0,class:`fixed inset-0 z-[99998] bg-background/60 dark:bg-background/40 backdrop-blur-md`,onClick:M})):p(``,!0)]),_:1}),h(j,{name:`dialog-pop`,appear:``},{default:r(()=>[s.open?(c(),m(`div`,me,[y(`div`,{ref_key:`panelRef`,ref:S,class:t(H.value),role:`dialog`,"aria-modal":`true`,"aria-labelledby":T(C),"aria-describedby":s.description||e.$slots.description?T(E):void 0,tabindex:`-1`,onClick:n[0]||=te(()=>{},[`stop`])},[y(`div`,{class:t([`flex items-start justify-between p-4.5 sm:p-5`,O()?`border-b border-border/40 pb-4`:`pb-4.5`])},[e.$slots.header?(c(),m(`div`,ge,[a(e.$slots,`header`)])):(c(),m(`div`,_e,[s.icon||s.type!==`none`&&U[s.type]?(c(),w(D(s.icon||U[s.type]),{key:0,class:t([`w-5 h-5 shrink-0 mt-0.5`,s.icon?`text-primary`:W.value])},null,8,[`class`])):p(``,!0),y(`div`,ve,[y(`h3`,{id:T(C),class:`font-extrabold text-sm sm:text-base text-foreground tracking-tight leading-tight`},[a(e.$slots,`title`,{},()=>[g(v(s.title),1)])],8,ye),s.description||e.$slots.description?(c(),m(`p`,{key:0,id:T(E),class:`text-xs text-muted-foreground leading-relaxed break-words`},[a(e.$slots,`description`,{},()=>[g(v(s.description),1)])],8,be)):p(``,!0)])])),s.closable?(c(),m(`button`,{key:2,type:`button`,"aria-label":`关闭`,onClick:A,disabled:s.loading,class:`p-1 rounded-[calc(var(--radius)-4px)] text-muted-foreground hover:bg-muted transition-colors active:scale-90 shrink-0 ml-auto`},[h(T(R),{class:`w-4 h-4`})],8,xe)):p(``,!0)],2),O()?(c(),m(`div`,{key:0,class:t([`p-5 text-xs text-muted-foreground leading-relaxed transition-all duration-300`,s.loading?`opacity-35 blur-[1.5px] scale-[0.99] select-none pointer-events-none`:`opacity-100 blur-none scale-100`])},[a(e.$slots,`default`)],2)):p(``,!0),s.showCancel||s.showConfirm||e.$slots.footer?(c(),m(`div`,Se,[a(e.$slots,`footer`,{},()=>[s.showCancel?(c(),w(L,{key:0,variant:s.cancelVariant,size:`sm`,disabled:s.loading,onClick:ne},{default:r(()=>[g(v(s.cancelText),1)]),_:1},8,[`variant`,`disabled`])):p(``,!0),s.showConfirm?(c(),w(L,{key:1,variant:s.danger?`outline`:s.confirmVariant,danger:s.danger,size:`sm`,loading:s.loading,onClick:N},{default:r(()=>[g(v(s.confirmText),1)]),_:1},8,[`variant`,`danger`,`loading`])):p(``,!0)])])):p(``,!0),h(j,{name:`fade`},{default:r(()=>[s.loading?(c(),m(`div`,Ce,[...n[1]||=[y(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[y(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):p(``,!0)]),_:1})],10,he)])):p(``,!0)]),_:3})]))}}),$=e=>{let t=typeof e==`string`?{content:e}:e,n=document.createElement(`div`);document.body.appendChild(n);let r=C({open:!0,loading:!1,...t}),i=null,a=()=>{r.open=!1,setTimeout(()=>{i&&i.unmount(),n.remove(),t.onClose&&t.onClose()},450)},o=async e=>{if(t.onConfirm){let e=t.onConfirm();if(e instanceof Promise){r.loading=!0;try{let t=await e;r.loading=!1,t!==!1&&a()}catch{r.loading=!1}return}e!==!1&&a()}else a()},s=()=>{t.onCancel&&t.onCancel(),a()},c={};return r.content&&(c.default=()=>typeof r.content==`function`?r.content():(r.content,r.content)),i=A({setup(){return()=>l(we,{...r,"onUpdate:open":e=>{e||a()},onConfirm:o,onCancel:s,onClose:a},c)}}),i.mount(n),{close:a,setLoading:e=>{r.loading=e}}};$.confirm=e=>$({type:`warning`,...typeof e==`string`?{content:e}:e}),$.warning=e=>$({type:`warning`,danger:!0,...typeof e==`string`?{content:e}:e}),$.error=e=>$({type:`error`,danger:!0,...typeof e==`string`?{content:e}:e}),$.success=e=>$({type:`success`,...typeof e==`string`?{content:e}:e});function Te(){let e=M(),t={success:e=>X.success(e),error:e=>X.error(e),warning:e=>X.warning(e),info:e=>X.info(e)};function n(e,t,n={}){return new Promise(r=>{$.confirm({title:e,description:t,danger:n.danger,confirmText:n.confirmText||`确认`,cancelText:`取消`,onConfirm:()=>r(!0),onCancel:()=>r(!1),onClose:()=>r(!1)})})}function r(n){let r=n;if(r.unauthorized){e.push({path:`/login`,query:{redirect:e.currentRoute.value.fullPath}});return}t.error(r.message||String(n))}return{toast:t,confirm:n,handleError:r}}export{z as a,B as i,$ as n,W as r,Te as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/DRUQkVH5.js b/server/adminui/_nuxt/DRUQkVH5.js new file mode 100644 index 0000000..4100463 --- /dev/null +++ b/server/adminui/_nuxt/DRUQkVH5.js @@ -0,0 +1 @@ +import{J as e,L as t,P as n,u as r,ut as i,v as a}from"./Bx_a1Ri3.js";import{n as o}from"./DQKjIeim.js";var s=Object.assign(a({__name:`DialogPanel`,props:{open:{type:Boolean},title:{},description:{},size:{}},emits:[`update:open`],setup(a,{emit:s}){let c=s;return(s,l)=>(n(),r(i(o),{open:a.open,title:a.title,description:a.description,size:a.size||`md`,"show-confirm":!1,"show-cancel":!1,closable:``,"onUpdate:open":l[0]||=e=>c(`update:open`,e)},{footer:e(()=>[t(s.$slots,`footer`)]),default:e(()=>[t(s.$slots,`default`)]),_:3},8,[`open`,`title`,`description`,`size`]))}}),{__name:`DialogPanel`});export{s as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/DXIMwwdP.js b/server/adminui/_nuxt/DXIMwwdP.js new file mode 100644 index 0000000..760ccac --- /dev/null +++ b/server/adminui/_nuxt/DXIMwwdP.js @@ -0,0 +1 @@ +import{t as e}from"./BOgT-xSl.js";var t=e(`activity`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]);export{t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/DeZOVV_X.js b/server/adminui/_nuxt/DeZOVV_X.js new file mode 100644 index 0000000..254a914 --- /dev/null +++ b/server/adminui/_nuxt/DeZOVV_X.js @@ -0,0 +1 @@ +import{E as e,Et as t,H as n,J as r,L as i,M as a,P as o,c as s,d as c,f as l,g as u,kt as d,l as f,nt as p,v as m}from"./Bx_a1Ri3.js";import{j as h}from"./Dw7E2aQ0.js";import{n as g}from"./D2-o7L18.js";import{t as _}from"./CAJW6uLT.js";var v={class:`mb-3`},y={class:`mb-1.5 block text-xs font-medium text-muted-foreground`},b=Object.assign(m({__name:`Field`,props:{label:{}},setup(e){return(t,n)=>(o(),l(`div`,v,[f(`label`,y,d(e.label),1),i(t.$slots,`default`)]))}}),{__name:`Field`}),x=[`aria-checked`,`aria-busy`,`disabled`],S={key:0,class:`absolute inset-0 z-500 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},C=m({inheritAttrs:!1,__name:`Switch`,props:{modelValue:{type:Boolean,default:!1},size:{default:`md`},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`update:modelValue`,`change`],setup(d,{emit:m}){let v=d,y=m,b=p(!1),{handleChangeValidate:C}=_(),w=n(),T=s(()=>{let e={};for(let t in w)t.startsWith(`aria-`)&&(e[t]=w[t]);return e}),E=s(()=>{let e={};for(let t in w)t.startsWith(`aria-`)||(e[t]=w[t]);return e}),D=()=>{if(v.disabled||v.loading)return;let e=!v.modelValue;y(`update:modelValue`,e),y(`change`,e),C()};a(()=>{v.animate&&setTimeout(()=>{b.value=!0},v.delay)});let O=s(()=>g(`relative inline-flex shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-300 ease-in-out select-none overflow-hidden p-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring`,{"w-8 h-4.5":v.size===`sm`,"w-11 h-6":v.size===`md`,"w-14 h-7.5":v.size===`lg`},v.modelValue?`bg-primary`:`bg-muted-foreground/30`,v.disabled||v.loading?`opacity-60 cursor-not-allowed pointer-events-none`:``)),k=s(()=>g(`pointer-events-none inline-block rounded-full bg-background shadow-md transform transition-transform duration-300 ease-spring`,{"w-3.5 h-3.5":v.size===`sm`,"w-5 h-5":v.size===`md`,"w-6.5 h-6.5":v.size===`lg`},v.modelValue?v.size===`sm`?`translate-x-3.5`:v.size===`md`?`translate-x-5`:`translate-x-6.5`:`translate-x-0`)),A=s(()=>v.animate?v.entryClass?b.value?v.entryClass:`opacity-0`:g(`transform transition-all duration-700 ease-swift`,b.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-98 blur-md pointer-events-none`):``);return(n,a)=>(o(),l(`div`,e({class:[A.value,`inline-flex items-center`]},E.value),[f(`button`,e({type:`button`,role:`switch`,"aria-checked":d.modelValue,"aria-busy":v.loading||void 0,disabled:v.disabled||v.loading,class:O.value},T.value,{onClick:D}),[f(`div`,{class:t([k.value,`flex items-center justify-center transition-all duration-300`])},[i(n.$slots,`thumb`)],2),u(h,{name:`fade`},{default:r(()=>[v.loading?(o(),l(`div`,S,[...a[0]||=[f(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[f(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):c(``,!0)]),_:1})],16,x)],16))}});export{b as n,C as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/Di5spq1Y.js b/server/adminui/_nuxt/Di5spq1Y.js new file mode 100644 index 0000000..223856b --- /dev/null +++ b/server/adminui/_nuxt/Di5spq1Y.js @@ -0,0 +1 @@ +import{$ as e,I as t,J as n,M as r,P as i,d as a,f as o,g as s,h as c,kt as l,l as u,nt as d,r as f,u as p,ut as m,v as h}from"./Bx_a1Ri3.js";import{j as g}from"./Dw7E2aQ0.js";import{t as _}from"./BOgT-xSl.js";import{r as v,t as y}from"./DQKjIeim.js";import{t as b}from"./D2-o7L18.js";import{t as x}from"./D-_L2MRs.js";import{t as S}from"./nj6DwLzD.js";import{n as C,t as w}from"./DeZOVV_X.js";import{t as T}from"./BTFs9w_Z.js";var E=_(`send`,[[`path`,{d:`M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z`,key:`1ffxy3`}],[`path`,{d:`m21.854 2.147-10.94 10.939`,key:`12cjpa`}]]),D={class:`space-y-1 px-5 pb-5`},O=[`value`],k={class:`flex items-center gap-4 pt-3`},A={class:`flex items-center gap-2 text-sm`},j={class:`ml-auto`},M={key:0,class:`mt-3 max-h-[420px] overflow-auto rounded-lg border border-border bg-muted/40 p-3 text-xs leading-relaxed break-all whitespace-pre-wrap`},N=`liapi-model-list`,P=h({__name:`debug`,setup(h){let{request:_}=S(),{handleError:P}=y(),F=d(``),I=d(`[{"role":"user","content":"你好,用一句话介绍自己。"}]`),L=d(!1),R=d(!1),z=d(``),B=d(!1),V=d([]);r(async()=>{try{let e=await _(`/config`),t=new Set;for(let n of e.upstreams||[])if(!n.disabled)for(let e of n.models||[])e!==`*`&&t.add(e);for(let n of Object.keys(e.aliases||{}))t.add(n);V.value=[...t].sort()}catch{}});async function H(){let e;try{e=JSON.parse(I.value)}catch(e){B.value=!0,z.value=`messages 不是合法 JSON: `+e.message;return}R.value=!0,B.value=!0,z.value=`请求中...`;try{let t=await _(`/test`,{method:`POST`,body:JSON.stringify({model:F.value.trim(),messages:e,stream:L.value})});z.value=JSON.stringify(t,null,2)}catch(e){z.value=`错误: `+e.message}finally{R.value=!1}}return(r,d)=>{let h=C;return i(),p(m(v),{padding:`none`},{header:n(()=>[...d[3]||=[u(`div`,{class:`px-5 py-4`},[u(`h2`,{class:`text-sm font-semibold`},`调试:发送一条请求`),u(`p`,{class:`text-xs text-muted-foreground`},` 直接走完整转发链路(别名 / 路由 / 故障转移),用于连通性排查 `)],-1)]]),default:n(()=>[u(`div`,D,[s(h,{label:`model`},{default:n(()=>[s(m(x),{modelValue:m(F),"onUpdate:modelValue":d[0]||=t=>e(F)?F.value=t:null,list:N,placeholder:`gpt-4o`},null,8,[`modelValue`]),u(`datalist`,{id:N},[(i(!0),o(f,null,t(m(V),e=>(i(),o(`option`,{key:e,value:e},null,8,O))),128))])]),_:1}),s(h,{label:`messages (JSON 数组)`},{default:n(()=>[s(m(T),{modelValue:m(I),"onUpdate:modelValue":d[1]||=t=>e(I)?I.value=t:null,rows:5,class:`font-mono text-xs`},null,8,[`modelValue`])]),_:1}),u(`div`,k,[u(`label`,A,[s(m(w),{modelValue:m(L),"onUpdate:modelValue":d[2]||=t=>e(L)?L.value=t:null},null,8,[`modelValue`]),d[4]||=c(),d[5]||=u(`span`,null,`stream`,-1)]),u(`div`,j,[s(m(b),{variant:`primary`,size:`md`,icon:m(E),loading:m(R),onClick:H},{default:n(()=>[...d[6]||=[c(` 发送 `,-1)]]),_:1},8,[`icon`,`loading`])])]),s(g,{name:`fade`},{default:n(()=>[m(B)?(i(),o(`pre`,M,l(m(z)),1)):a(``,!0)]),_:1})])]),_:1})}}});export{P as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/Djcrsm7t.js b/server/adminui/_nuxt/Djcrsm7t.js new file mode 100644 index 0000000..72c826d --- /dev/null +++ b/server/adminui/_nuxt/Djcrsm7t.js @@ -0,0 +1 @@ +import{_ as e,g as t,i as n,v as r}from"./CMHCZ1c-.js";import{$ as i,A as a,C as o,O as s,Z as c,k as l,lt as u,nt as d,q as f,w as p,y as m}from"./Bx_a1Ri3.js";import{a as h,i as g}from"#entry";var _=Object.assign((e,t)=>i(t)?u(t):t,{_static:!0});function v(e,t={}){let n=t.head||g();return n.ssr?n.push(e||{},t):y(n,e,t)}function y(e,t,n={}){let r=c();if(r&&!r.active)return{patch(){},dispose(){},_i:-1};let i=d(!1);if(n.onRendered&&r){let e=n.onRendered;n={...n,onRendered:t=>r.run(()=>e(t))}}let o;return f(()=>{let r=i.value?{}:h(t,_);o?o.patch(r):o=e.push(r,n)}),m()&&(l(()=>{o.dispose()}),a(()=>{i.value=!0}),s(()=>{i.value=!1})),o}var b=r({docsBase:t,reporters:e});function x(e){let t=e||n();return t.ssrContext?.head||t.runWithContext(()=>{if(o()){let e=p(`usehead`);if(!e)throw b.NUXT_E6001();return e}})}function S(e,t={}){return v(e,{head:t.head||x(t.nuxt),...t})}export{S as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/Dk1h4UcG.js b/server/adminui/_nuxt/Dk1h4UcG.js new file mode 100644 index 0000000..57de4bc --- /dev/null +++ b/server/adminui/_nuxt/Dk1h4UcG.js @@ -0,0 +1 @@ +import{Et as e,J as t,L as n,M as r,P as i,c as a,d as o,f as s,g as c,h as l,kt as u,l as d,nt as f,u as p,ut as m,v as h,z as g}from"./Bx_a1Ri3.js";import{j as _}from"./Dw7E2aQ0.js";import{n as v}from"./CjfA7_9d.js";import{n as y}from"./D2-o7L18.js";var b={key:0,class:`relative flex items-center justify-center`},x=[`src`],S={class:`space-y-1 max-w-sm`},C={class:`font-extrabold text-sm text-foreground tracking-tight`},w={key:0,class:`text-xs text-muted-foreground leading-relaxed`},T={key:0,class:`pt-2`},E={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},D=h({__name:`Empty`,props:{title:{default:`暂无数据`},description:{default:``},icon:{default:null},image:{default:``},size:{default:`md`},variant:{default:`default`},loading:{type:Boolean,default:!1},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},setup(h){let D=h,O=f(!1),k=f(!1);r(()=>{D.animate&&setTimeout(()=>{O.value=!0},D.delay)});let A=a(()=>y(`relative flex flex-col items-center justify-center text-center select-none overflow-hidden transition-all duration-300 w-full`,{"p-6 gap-3":D.size===`sm`,"p-10 gap-4":D.size===`md`,"p-14 gap-6":D.size===`lg`},{"bg-transparent":D.variant==="default","bg-background border border-border/80 shadow-sm rounded-base":D.variant===`card`,"bg-muted/10 border-2 border-dashed border-border/80 rounded-base":D.variant===`dashed`})),j=a(()=>y({"w-8 h-8":D.size===`sm`,"w-12 h-12":D.size===`md`,"w-16 h-16":D.size===`lg`})),M=a(()=>D.animate?D.entryClass?O.value?D.entryClass:`opacity-0`:y(`transform transition-all duration-700 ease-swift`,O.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-2 scale-98 blur-md pointer-events-none`):``);return(r,a)=>(i(),s(`div`,{class:e([A.value,M.value])},[d(`div`,{class:e([`flex flex-col items-center justify-center gap-3 w-full transition-all duration-300 ease-smooth`,D.loading?`opacity-30 blur-[2px] scale-[0.98]`:`opacity-100 blur-none scale-100`])},[n(r.$slots,`icon`,{},()=>[D.image?(i(),s(`div`,b,[k.value?o(``,!0):(i(),s(`div`,{key:0,class:e([j.value,`absolute inset-0 bg-muted-foreground/20 animate-pulse rounded-base`])},null,2)),d(`img`,{src:D.image,alt:`empty`,onLoad:a[0]||=e=>k.value=!0,class:e([j.value,`object-contain transition-all duration-500`,k.value?`opacity-100 blur-none scale-100`:`opacity-0 blur-sm scale-105`])},null,42,x)])):(i(),p(g(D.icon||m(v)),{key:1,class:e([j.value,`text-muted-foreground/40 stroke-[1.3]`])},null,8,[`class`]))]),d(`div`,S,[d(`h4`,C,[n(r.$slots,`title`,{},()=>[l(u(D.title),1)])]),D.description||r.$slots.description?(i(),s(`p`,w,[n(r.$slots,`description`,{},()=>[l(u(D.description),1)])])):o(``,!0)]),r.$slots.default||r.$slots.extra?(i(),s(`div`,T,[n(r.$slots,`extra`,{},()=>[n(r.$slots,`default`)])])):o(``,!0)],2),c(_,{name:`fade`},{default:t(()=>[D.loading?(i(),s(`div`,E,[...a[1]||=[d(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[d(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):o(``,!0)]),_:1})],2))}});export{D as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/DpmZExze.js b/server/adminui/_nuxt/DpmZExze.js new file mode 100644 index 0000000..6671a96 --- /dev/null +++ b/server/adminui/_nuxt/DpmZExze.js @@ -0,0 +1 @@ +import{$ as e,I as t,J as n,M as r,P as i,f as a,g as o,h as s,kt as c,l,nt as u,r as d,tt as f,u as p,ut as m,v as h}from"./Bx_a1Ri3.js";import{t as g}from"./BOgT-xSl.js";import{t as _}from"./CjfA7_9d.js";import{r as v,t as y}from"./DQKjIeim.js";import{t as b}from"./D2-o7L18.js";import{t as x}from"./D-_L2MRs.js";import{n as S,t as C}from"./CMKGzL4T.js";import{t as w}from"./nj6DwLzD.js";import{n as T,t as E}from"./DeZOVV_X.js";import{t as D}from"./C8yIGsZb.js";import{t as O}from"./Dk1h4UcG.js";import{t as k}from"./DRUQkVH5.js";var ee=g(`pencil`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]),te={class:`flex items-center justify-between gap-3 px-5 py-4`},A={class:`px-5 pb-5`},j={class:`font-medium`},M={class:`text-xs text-muted-foreground`},N={class:`flex flex-wrap gap-1`},P={key:0,class:`text-xs text-muted-foreground`},F={key:2,class:`text-xs text-muted-foreground`},I={class:`flex justify-end gap-1`},L={class:`grid grid-cols-1 gap-x-6 gap-y-1 sm:grid-cols-2`},R={class:`flex items-center gap-6 pt-2 sm:col-span-2`},z={class:`flex items-center gap-2 text-sm`},B={class:`flex items-center gap-2 text-sm`},V={class:`flex justify-end gap-2`},H=h({__name:`upstreams`,setup(h){let{request:g}=w(),{toast:H,confirm:U,handleError:W}=y(),G=u([]),K=u({}),q=u(!0),J=u(!1),Y=u(!1),X=u(null),Z=f({name:``,base_url:``,api_key:``,models:``,health_path:``,retry:0,priority:1,weight:1,disabled:!1,inject_usage:!1,group:``,model_map:``}),ne=[{key:`name`,title:`名称`},{key:`base_url`,title:`Base URL`},{key:`models`,title:`模型`},{key:`priority`,title:`优先级`,width:70},{key:`weight`,title:`权重`,width:60},{key:`key`,title:`Key`,width:130},{key:`status`,title:`状态`,width:90},{key:`actions`,title:``,width:120,align:`right`}];async function Q(){try{let[e,t]=await Promise.all([g(`/upstreams`),g(`/health`).catch(()=>[])]);G.value=e,K.value=Object.fromEntries(t.map(e=>[e.name,e]))}catch(e){W(e)}finally{q.value=!1}}r(Q);function $(e){e?(X.value=e.name,Object.assign(Z,{name:e.name,base_url:e.base_url||``,api_key:e.api_key||``,models:(e.models||[]).join(`,`),health_path:e.health_path||``,retry:e.retry||0,priority:e.priority||1,weight:e.weight||1,disabled:!!e.disabled,inject_usage:!!e.inject_usage,group:e.group||``,model_map:e.model_map?JSON.stringify(e.model_map):``})):(X.value=null,Object.assign(Z,{name:``,base_url:``,api_key:``,models:``,health_path:``,retry:0,priority:1,weight:1,disabled:!1,inject_usage:!1,group:``,model_map:``})),Y.value=!0}async function re(){let e=Z.models.split(`,`).map(e=>e.trim()).filter(Boolean),t={name:Z.name.trim(),base_url:Z.base_url.trim(),models:e,health_path:Z.health_path.trim(),retry:Number(Z.retry)||0,priority:Number(Z.priority)||0,weight:Math.max(1,Number(Z.weight)||1),disabled:Z.disabled,inject_usage:Z.inject_usage,group:Z.group.trim()},n=Z.model_map.trim();if(n)try{t.model_map=JSON.parse(n)}catch{H.error(`model_map 不是合法 JSON`);return}Z.api_key&&(t.api_key=Z.api_key),J.value=!0;try{let e=X.value?`/upstreams/`+encodeURIComponent(X.value):`/upstreams`;await g(e,{method:X.value?`PUT`:`POST`,body:JSON.stringify(t)}),H.success(`已保存`),Y.value=!1,await Q()}catch(e){W(e)}finally{J.value=!1}}async function ie(e){if(await U(`删除上游`,`确定删除上游 ${e} ?`,{danger:!0}))try{await g(`/upstreams/`+encodeURIComponent(e),{method:`DELETE`}),H.success(`已删除`),await Q()}catch(e){W(e)}}return(r,u)=>{let f=T,h=k;return i(),p(m(v),{padding:`none`},{header:n(()=>[l(`div`,te,[u[16]||=l(`div`,null,[l(`h2`,{class:`text-sm font-semibold`},`上游配置`),l(`p`,{class:`text-xs text-muted-foreground`},` 聚合多个上游,统一路由 / 重试 / 故障转移 `)],-1),o(m(b),{variant:`primary`,size:`sm`,icon:m(S),onClick:u[0]||=e=>$()},{default:n(()=>[...u[15]||=[s(` 新增上游 `,-1)]]),_:1},8,[`icon`])])]),default:n(()=>[l(`div`,A,[m(G).length||m(q)?(i(),p(m(_),{key:0,columns:ne,data:m(G),"row-key":`name`,size:`sm`,hover:``,loading:m(q),"empty-text":`还没有上游,点「新增上游」添加。`},{"cell-name":n(({row:e})=>[l(`span`,j,c(e.name),1)]),"cell-base_url":n(({row:e})=>[l(`span`,M,c(e.base_url),1)]),"cell-models":n(({row:e})=>[l(`div`,N,[(i(!0),a(d,null,t(e.models,e=>(i(),p(m(D),{key:e,size:`sm`,variant:`secondary`},{default:n(()=>[s(c(e),1)]),_:2},1024))),128))])]),"cell-priority":n(({row:e})=>[s(c(e.priority),1)]),"cell-weight":n(({row:e})=>[s(c(e.weight),1)]),"cell-key":n(({row:e})=>[e.has_api_key?(i(),a(`span`,P,c(e.api_key),1)):(i(),p(m(D),{key:1,size:`sm`,variant:`outline`,class:`text-warning`},{default:n(()=>[...u[17]||=[s(`无 key`,-1)]]),_:1}))]),"cell-status":n(({row:e})=>[e.disabled?(i(),p(m(D),{key:0,size:`sm`,variant:`outline`},{default:n(()=>[...u[18]||=[s(`disabled`,-1)]]),_:1})):m(K)[e.name]?(i(),p(m(D),{key:1,size:`sm`,variant:m(K)[e.name]?.ok?`primary`:`secondary`},{default:n(()=>[s(c(m(K)[e.name]?.ok?`正常`:`异常`),1)]),_:2},1032,[`variant`])):(i(),a(`span`,F,`—`))]),"cell-actions":n(({row:e})=>[l(`div`,I,[o(m(b),{variant:`ghost`,size:`sm`,icon:m(ee),onClick:t=>$(e)},null,8,[`icon`,`onClick`]),o(m(b),{variant:`ghost`,size:`sm`,danger:``,icon:m(C),onClick:t=>ie(e.name)},null,8,[`icon`,`onClick`])])]),_:1},8,[`data`,`loading`])):(i(),p(m(O),{key:1,title:`还没有上游`,description:`点右上角「新增上游」添加第一个上游。`}))]),o(h,{open:m(Y),"onUpdate:open":u[14]||=t=>e(Y)?Y.value=t:null,title:m(X)?`编辑上游`:`新增上游`,size:`lg`},{footer:n(()=>[l(`div`,V,[o(m(b),{variant:`outline`,size:`sm`,onClick:u[13]||=e=>Y.value=!1},{default:n(()=>[...u[22]||=[s(`取消`,-1)]]),_:1}),o(m(b),{variant:`primary`,size:`sm`,loading:m(J),onClick:re},{default:n(()=>[...u[23]||=[s(` 保存 `,-1)]]),_:1},8,[`loading`])])]),default:n(()=>[l(`div`,L,[o(f,{label:`name *`},{default:n(()=>[o(m(x),{modelValue:m(Z).name,"onUpdate:modelValue":u[1]||=e=>m(Z).name=e,placeholder:`openai-main`},null,8,[`modelValue`])]),_:1}),o(f,{label:`base_url *(带版本前缀,无尾斜杠)`},{default:n(()=>[o(m(x),{modelValue:m(Z).base_url,"onUpdate:modelValue":u[2]||=e=>m(Z).base_url=e,placeholder:`https://api.openai.com/v1`},null,8,[`modelValue`])]),_:1}),o(f,{label:`api_key(留空=保留原值)`},{default:n(()=>[o(m(x),{modelValue:m(Z).api_key,"onUpdate:modelValue":u[3]||=e=>m(Z).api_key=e,type:`password`,placeholder:`sk-...`},null,8,[`modelValue`])]),_:1}),o(f,{label:`models *(逗号分隔,* 兜底)`},{default:n(()=>[o(m(x),{modelValue:m(Z).models,"onUpdate:modelValue":u[4]||=e=>m(Z).models=e,placeholder:`gpt-4o,gpt-4o-mini`},null,8,[`modelValue`])]),_:1}),o(f,{label:`health_path`},{default:n(()=>[o(m(x),{modelValue:m(Z).health_path,"onUpdate:modelValue":u[5]||=e=>m(Z).health_path=e,placeholder:`/v1/models`},null,8,[`modelValue`])]),_:1}),o(f,{label:`retry(0-10)`},{default:n(()=>[o(m(x),{modelValue:m(Z).retry,"onUpdate:modelValue":u[6]||=e=>m(Z).retry=e,type:`number`},null,8,[`modelValue`])]),_:1}),o(f,{label:`priority(越小越优先)`},{default:n(()=>[o(m(x),{modelValue:m(Z).priority,"onUpdate:modelValue":u[7]||=e=>m(Z).priority=e,type:`number`},null,8,[`modelValue`])]),_:1}),o(f,{label:`weight`},{default:n(()=>[o(m(x),{modelValue:m(Z).weight,"onUpdate:modelValue":u[8]||=e=>m(Z).weight=e,type:`number`},null,8,[`modelValue`])]),_:1}),o(f,{label:`group(配合 X-Route-Group 路由)`},{default:n(()=>[o(m(x),{modelValue:m(Z).group,"onUpdate:modelValue":u[9]||=e=>m(Z).group=e,placeholder:`如 free / pro`},null,8,[`modelValue`])]),_:1}),o(f,{label:`model_map(JSON:公开名→上游真实名)`},{default:n(()=>[o(m(x),{modelValue:m(Z).model_map,"onUpdate:modelValue":u[10]||=e=>m(Z).model_map=e,placeholder:`{"gpt-4o":"gpt-4o-2024-11-20"}`},null,8,[`modelValue`])]),_:1}),l(`div`,R,[l(`label`,z,[o(m(E),{modelValue:m(Z).disabled,"onUpdate:modelValue":u[11]||=e=>m(Z).disabled=e},null,8,[`modelValue`]),u[19]||=s(),u[20]||=l(`span`,null,`disabled`,-1)]),l(`label`,B,[o(m(E),{modelValue:m(Z).inject_usage,"onUpdate:modelValue":u[12]||=e=>m(Z).inject_usage=e},null,8,[`modelValue`]),u[21]||=l(`span`,null,`流式注入 include_usage`,-1)])])])]),_:1},8,[`open`,`title`])]),_:1})}}});export{H as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/DsoWRbkX.js b/server/adminui/_nuxt/DsoWRbkX.js new file mode 100644 index 0000000..0867645 --- /dev/null +++ b/server/adminui/_nuxt/DsoWRbkX.js @@ -0,0 +1 @@ +import{t as e}from"./BOgT-xSl.js";var t=e(`gauge`,[[`path`,{d:`m12 14 4-4`,key:`9kzdfg`}],[`path`,{d:`M3.34 19a10 10 0 1 1 17.32 0`,key:`19p75a`}]]);export{t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/DvnvAQHt.js b/server/adminui/_nuxt/DvnvAQHt.js new file mode 100644 index 0000000..2051787 --- /dev/null +++ b/server/adminui/_nuxt/DvnvAQHt.js @@ -0,0 +1 @@ +import{$ as e,J as t,M as n,P as r,g as i,h as a,kt as o,l as s,nt as c,u as l,ut as u,v as d}from"./Bx_a1Ri3.js";import{R as f}from"./Dw7E2aQ0.js";import{t as p}from"./CjfA7_9d.js";import{r as m,t as h}from"./DQKjIeim.js";import{t as g}from"./D2-o7L18.js";import{t as _}from"./D-_L2MRs.js";import{n as v,t as y}from"./CMKGzL4T.js";import{t as b}from"./nj6DwLzD.js";import{t as x}from"./Dk1h4UcG.js";var S={class:`space-y-4 px-5 pb-5`},C={class:`flex max-w-md gap-2`},w={class:`text-xs`},T=d({__name:`tokens`,setup(d){let{request:T}=b(),{toast:E,confirm:D,handleError:O}=h(),k=c([]),A=c(!0),j=c(``),M=[{key:`masked`,title:`Token`},{key:`actions`,title:``,width:80,align:`right`}];async function N(){try{k.value=await T(`/tokens`)}catch(e){O(e)}finally{A.value=!1}}n(N);async function P(){let e=j.value.trim();if(!e)return E.warning(`请输入 token`);try{await T(`/tokens`,{method:`POST`,body:JSON.stringify({token:e})}),j.value=``,E.success(`已添加`),await N()}catch(e){O(e)}}async function F(e){if(await D(`删除令牌`,`确定删除该 token?`,{danger:!0}))try{await T(`/tokens/delete`,{method:`POST`,body:JSON.stringify({token:e})}),E.success(`已删除`),await N()}catch(e){O(e)}}return(n,c)=>(r(),l(u(m),{padding:`none`},{header:t(()=>[...c[1]||=[s(`div`,{class:`px-5 py-4`},[s(`h2`,{class:`text-sm font-semibold`},`客户端令牌`),s(`p`,{class:`text-xs text-muted-foreground`},` 明文列表,兼容旧版;新接入推荐用「设备」 `)],-1)]]),default:t(()=>[s(`div`,S,[s(`div`,C,[i(u(_),{modelValue:u(j),"onUpdate:modelValue":c[0]||=t=>e(j)?j.value=t:null,placeholder:`输入新 token (如 sk-client-xxxx)`,onKeydown:f(P,[`enter`])},null,8,[`modelValue`]),i(u(g),{variant:`primary`,size:`md`,icon:u(v),onClick:P},{default:t(()=>[...c[2]||=[a(`添加`,-1)]]),_:1},8,[`icon`])]),u(k).length||u(A)?(r(),l(u(p),{key:0,columns:M,data:u(k),size:`sm`,hover:``,loading:u(A),"empty-text":`还没有客户端令牌。`},{"cell-masked":t(({row:e})=>[s(`code`,w,o(e.masked),1)]),"cell-actions":t(({row:e})=>[i(u(g),{variant:`ghost`,size:`sm`,danger:``,icon:u(y),onClick:t=>F(e.full)},null,8,[`icon`,`onClick`])]),_:1},8,[`data`,`loading`])):(r(),l(u(x),{key:1,title:`还没有客户端令牌`}))])]),_:1}))}});export{T as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/Dw7E2aQ0.js b/server/adminui/_nuxt/Dw7E2aQ0.js new file mode 100644 index 0000000..6c418c5 --- /dev/null +++ b/server/adminui/_nuxt/Dw7E2aQ0.js @@ -0,0 +1,2 @@ +import{_ as e,g as t,h as n,i as r,v as i}from"./CMHCZ1c-.js";import{At as a,B as o,C as s,Ct as c,G as l,N as u,S as d,St as f,Tt as p,V as m,Z as ee,_t as h,b as te,bt as g,dt as _,ft as v,g as ne,gt as re,ht as y,m as ie,mt as b,n as ae,ot as x,p as oe,pt as S,r as se,s as ce,st as le,t as ue,vt as de,w as fe,wt as pe,xt as me,y as he,yt as ge}from"./Bx_a1Ri3.js";var _e=void 0,ve=typeof window<`u`&&window.trustedTypes;if(ve)try{_e=ve.createPolicy(`vue`,{createHTML:e=>e})}catch{}var ye=_e?e=>_e.createHTML(e):e=>e,be=`http://www.w3.org/2000/svg`,xe=`http://www.w3.org/1998/Math/MathML`,C=typeof document<`u`?document:null,Se=C&&C.createElement(`template`),Ce={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?C.createElementNS(be,e):t===`mathml`?C.createElementNS(xe,e):n?C.createElement(e,{is:n}):C.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>C.createTextNode(e),createComment:e=>C.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>C.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==a&&(i=i.nextSibling););else{Se.innerHTML=ye(r===`svg`?`${e}`:r===`mathml`?`${e}`:e);let i=Se.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},w=`transition`,T=`animation`,E=Symbol(`_vtc`),we={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Te=S({},ae,we),Ee=(e=>(e.displayName=`Transition`,e.props=Te,e))((e,{slots:t})=>d(ue,Oe(e),t)),D=(e,t=[])=>{h(e)?e.forEach(e=>e(...t)):e&&e(...t)},De=e=>e?h(e)?e.some(e=>e.length>1):e.length>1:!1;function Oe(e){let t={};for(let n in e)n in we||(t[n]=e[n]);if(e.css===!1)return t;let{name:n=`v`,type:r,duration:i,enterFromClass:a=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:c=a,appearActiveClass:l=o,appearToClass:u=s,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=ke(i),ee=m&&m[0],h=m&&m[1],{onBeforeEnter:te,onEnter:g,onEnterCancelled:_,onLeave:v,onLeaveCancelled:ne,onBeforeAppear:re=te,onAppear:y=g,onAppearCancelled:ie=_}=t,b=(e,t,n,r)=>{e._enterCancelled=r,A(e,t?u:s),A(e,t?l:o),n&&n()},ae=(e,t)=>{e._isLeaving=!1,A(e,d),A(e,p),A(e,f),t&&t()},x=e=>(t,n)=>{let i=e?y:g,o=()=>b(t,e,n);D(i,[t,o]),Ae(()=>{A(t,e?c:a),k(t,e?u:s),De(i)||Me(t,r,ee,o)})};return S(t,{onBeforeEnter(e){D(te,[e]),k(e,a),k(e,o)},onBeforeAppear(e){D(re,[e]),k(e,c),k(e,l)},onEnter:x(!1),onAppear:x(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>ae(e,t);k(e,d),e._enterCancelled?(k(e,f),Ie(e)):(Ie(e),k(e,f)),Ae(()=>{e._isLeaving&&(A(e,d),k(e,p),De(v)||Me(e,r,h,n))}),D(v,[e,n])},onEnterCancelled(e){b(e,!1,void 0,!0),D(_,[e])},onAppearCancelled(e){b(e,!0,void 0,!0),D(ie,[e])},onLeaveCancelled(e){ae(e),D(ne,[e])}})}function ke(e){if(e==null)return null;if(g(e))return[O(e.enter),O(e.leave)];{let t=O(e);return[t,t]}}function O(e){return a(e)}function k(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[E]||(e[E]=new Set)).add(t)}function A(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[E];n&&(n.delete(t),n.size||(e[E]=void 0))}function Ae(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}var je=0;function Me(e,t,n,r){let i=e._endId=++je,a=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(a,n);let{type:o,timeout:s,propCount:c}=Ne(e,t);if(!o)return r();let l=o+`end`,u=0,d=()=>{e.removeEventListener(l,f),a()},f=t=>{t.target===e&&++u>=c&&d()};setTimeout(()=>{u(n[e]||``).split(`, `),i=r(`${w}Delay`),a=r(`${w}Duration`),o=Pe(i,a),s=r(`${T}Delay`),c=r(`${T}Duration`),l=Pe(s,c),u=null,d=0,f=0;t===w?o>0&&(u=w,d=o,f=a.length):t===T?l>0&&(u=T,d=l,f=c.length):(d=Math.max(o,l),u=d>0?o>l?w:T:null,f=u?u===w?a.length:c.length:0);let p=u===w&&/\b(?:transform|all)(?:,|$)/.test(r(`${w}Property`).toString());return{type:u,timeout:d,propCount:f,hasTransform:p}}function Pe(e,t){for(;e.lengthFe(t)+Fe(e[n])))}function Fe(e){return e===`auto`?0:Number(e.slice(0,-1).replace(`,`,`.`))*1e3}function Ie(e){return(e?e.ownerDocument:document).body.offsetHeight}function Le(e,t,n){let r=e[E];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var j=Symbol(`_vod`),M=Symbol(`_vsh`),Re={name:`show`,beforeMount(e,{value:t},{transition:n}){e[j]=e.style.display===`none`?``:e.style.display,n&&t?n.beforeEnter(e):N(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),N(e,!0),r.enter(e)):r.leave(e,()=>{N(e,!1)}):N(e,t))},beforeUnmount(e,{value:t}){N(e,t)}};function N(e,t){e.style.display=t?e[j]:`none`,e[M]=!t}var ze=Symbol(``),Be=/(?:^|;)\s*display\s*:/;function Ve(e,t,n){let r=e.style,i=c(n),a=!1;if(n&&!i){if(t){if(c(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??F(r,t,``)}else for(let e in t)n[e]??F(r,e,``)}for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?F(r,i,``):We(e,i,!c(t)&&t?t[i]:void 0,o)||F(r,i,o)}}else if(i){if(t!==n){let e=r[ze];e&&(n+=`;`+e),r.cssText=n,a=Be.test(n)}}else t&&e.removeAttribute(`style`);j in e&&(e[j]=a?r.display:``,e[M]&&(r.display=`none`))}var P=/\s*!important$/;function F(e,t,n){if(h(n))n.forEach(n=>F(e,t,n));else if(n??=``,t.startsWith(`--`))P.test(n)?e.setProperty(t,n.replace(P,``),`important`):e.setProperty(t,n);else{let r=Ue(e,t);P.test(n)?e.setProperty(b(r),n.replace(P,``),`important`):e[r]=n}}var He=[`Webkit`,`Moz`,`ms`],I={};function Ue(e,t){let n=I[t];if(n)return n;let r=_(t);if(r!==`filter`&&r in e)return I[t]=r;r=v(r);for(let n=0;net||=(tt.then(()=>et=0),Date.now());function rt(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;let r=n.value;if(h(r)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let i=r.slice(),a=[e];for(let n=0;ne.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,at=(e,t,n,r,i,a)=>{let o=i===`svg`;t===`class`?Le(e,r,o):t===`style`?Ve(e,n,r):me(t)?ge(t)||Xe(e,t,n,r,a):(t[0]===`.`?(t=t.slice(1),1):t[0]===`^`?(t=t.slice(1),0):ot(e,t,r,o))?(qe(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&Ke(e,t,r,o,a,t!==`value`)):e._isVueCE&&(st(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!c(r)))?qe(e,_(t),r,a,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),Ke(e,t,r,o))};function ot(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&it(t)&&de(n));if(t===`spellcheck`||t===`draggable`||t===`translate`||t===`autocorrect`||t===`sandbox`&&e.tagName===`IFRAME`||t===`form`||t===`list`&&e.tagName===`INPUT`||t===`type`&&e.tagName===`TEXTAREA`)return!1;if(t===`width`||t===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return it(t)&&c(n)?!1:t in e}function st(e,t){let n=e._def.props;if(!n)return!1;let r=_(t);return Array.isArray(n)?n.some(e=>_(e)===r):Object.keys(n).some(e=>_(e)===r)}var ct=new WeakMap,lt=new WeakMap,R=Symbol(`_moveCb`),ut=Symbol(`_enterCb`),dt=(e=>(delete e.props.mode,e))({name:`TransitionGroup`,props:S({},Te,{tag:String,moveClass:String}),setup(e,{slots:t}){let n=he(),r=l(),i,a;return u(()=>{if(!i.length)return;let t=e.moveClass||`${e.name||`v`}-move`;if(!gt(i[0].el,n.vnode.el,t)){i=[];return}i.forEach(ft),i.forEach(pt);let r=i.filter(mt);Ie(n.vnode.el),r.forEach(e=>{let n=e.el,r=n.style;k(n,t),r.transform=r.webkitTransform=r.transitionDuration=``;let i=n[R]=e=>{e&&e.target!==n||(!e||e.propertyName.endsWith(`transform`))&&(n.removeEventListener(`transitionend`,i),n[R]=null,A(n,t))};n.addEventListener(`transitionend`,i)}),i=[]}),()=>{let s=x(e),c=Oe(s),l=s.tag||se;if(i=[],a)for(let e=0;e{e.split(/\s+/).forEach(e=>e&&r.classList.remove(e))}),n.split(/\s+/).forEach(e=>e&&r.classList.add(e)),r.style.display=`none`;let a=t.nodeType===1?t:t.parentNode;a.appendChild(r);let{hasTransform:o}=Ne(r);return a.removeChild(r),o}var _t=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return h(t)?e=>re(t,e):t};function vt(e){e.target.composing=!0}function yt(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var z=Symbol(`_assign`),B=Symbol(`_initialValue`);function V(e,t,n){return t&&(e=e.trim()),n&&(e=p(e)),e}var bt={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e.parentNode&&(e.type===`text`?e[B]=e.defaultValue.replace(/[\r\n]/g,``):e.type===`textarea`&&(e[B]=e.defaultValue.replace(/\r\n?/g,` +`))),e[z]=_t(i);let a=r||i.props&&i.props.type===`number`;L(e,t?`change`:`input`,t=>{t.target.composing||e[z](V(e.value,n,a))}),(n||a)&&L(e,`change`,()=>{e.value=V(e.value,n,a)}),t||(L(e,`compositionstart`,vt),L(e,`compositionend`,yt),L(e,`change`,yt))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let i=t??``,a=e[B];delete e[B],a!==void 0&&(e.type===`text`||e.type===`textarea`)&&e.value!==a?e[z](V(e.value,n,r)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[z]=_t(o),e.composing)return;let s=(a||e.type===`number`)&&!/^0\d/.test(e.value)?p(e.value):e.value,c=t??``;if(s===c)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&e.type!==`range`&&(r&&t===n||i&&e.value.trim()===c)||(e.value=c)}},xt=[`ctrl`,`shift`,`alt`,`meta`],St={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>`button`in e&&e.button!==0,middle:e=>`button`in e&&e.button!==1,right:e=>`button`in e&&e.button!==2,exact:(e,t)=>xt.some(n=>e[`${n}Key`]&&!t.includes(n))},Ct=(e,t)=>{if(!e)return e;let n=e._withMods||={},r=t.join(`.`);return n[r]||(n[r]=((n,...r)=>{for(let e=0;e{let n=e._withKeys||={},r=t.join(`.`);return n[r]||(n[r]=(n=>{if(!(`key`in n))return;let r=b(n.key);if(t.some(e=>e===r||wt[e]===r))return e(n)}))},Et=S({patchProp:at},Ce),H,Dt=!1;function Ot(){return H||=ie(Et)}function kt(){return H=Dt?H:oe(Et),Dt=!0,H}var At=((...e)=>{Ot().render(...e)}),jt=((...e)=>{let t=Ot().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=Pt(e);if(!r)return;let i=t._component;!de(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent=``);let a=n(r,!1,Nt(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t}),Mt=((...e)=>{let t=kt().createApp(...e),{mount:n}=t;return t.mount=e=>{let t=Pt(e);if(t)return n(t,!0,Nt(t))},t});function Nt(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function Pt(e){return c(e)?document.querySelector(e):e}var Ft=/bot\b|chrome-lighthouse|facebookexternalhit|google\b/i;function It(e){return Ft.test(e)}import.meta.url.replace(/\/app\/.*$/,`/`);var Lt=Symbol(`layout-meta`),Rt=Symbol(`layout`),zt=Symbol(`route`),U=i({docsBase:t,reporters:e});String.fromCharCode;var Bt=/#/g,Vt=/&/g,Ht=/\//g,Ut=/=/g,Wt=/\?/g,W=/\+/g,Gt=/%5e/gi,Kt=/%60/gi,qt=/%7c/gi,Jt=/%20/gi,Yt=/%2f/gi,Xt=/%252f/gi;function Zt(e){return encodeURI(``+e).replace(qt,`|`)}function G(e){return Zt(typeof e==`string`?e:JSON.stringify(e)).replace(W,`%2B`).replace(Jt,`+`).replace(Bt,`%23`).replace(Vt,`%26`).replace(Kt,"`").replace(Gt,`^`).replace(Ht,`%2F`)}function K(e){return G(e).replace(Ut,`%3D`)}function Qt(e){return Zt(e).replace(Bt,`%23`).replace(Wt,`%3F`).replace(Xt,`%2F`).replace(Vt,`%26`).replace(W,`%2B`)}function q(e=``){try{return decodeURIComponent(``+e)}catch{return``+e}}function $t(e){return q(e.replace(Yt,`%252F`))}function en(e){return q(e.replace(W,` `))}function tn(e){return q(e.replace(W,` `))}function J(e=``){let t=Object.create(null);e[0]===`?`&&(e=e.slice(1));for(let n of e.split(`&`)){let e=n.match(/([^=]+)=?(.*)/)||[];if(e.length<2)continue;let r=en(e[1]);if(r===`__proto__`||r===`constructor`)continue;let i=tn(e[2]||``);t[r]===void 0?t[r]=i:Array.isArray(t[r])?t[r].push(i):t[r]=[t[r],i]}return t}function nn(e,t){return(typeof t==`number`||typeof t==`boolean`)&&(t=String(t)),t?Array.isArray(t)?t.map(t=>`${K(e)}=${G(t)}`).join(`&`):`${K(e)}=${G(t)}`:K(e)}function rn(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>nn(t,e[t])).filter(Boolean).join(`&`)}var an=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,on=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,sn=/^([/\\]\s*){2,}[^/\\]/,cn=/^[\s\0]*(blob|data|javascript|vbscript):$/i,ln=/\/$|\/\?|\/#/,un=/^\.?\//;function Y(e,t={}){return typeof t==`boolean`&&(t={acceptRelative:t}),t.strict?an.test(e):on.test(e)||(t.acceptRelative?sn.test(e):!1)}function X(e){return!!e&&cn.test(e)}function dn(e=``,t){return t?ln.test(e):e.endsWith(`/`)}function Z(e=``,t){if(!t)return(dn(e)?e.slice(0,-1):e)||`/`;if(!dn(e,!0))return e||`/`;let n=e,r=``,i=e.indexOf(`#`);i!==-1&&(n=e.slice(0,i),r=e.slice(i));let[a,...o]=n.split(`?`);return((a.endsWith(`/`)?a.slice(0,-1):a)||`/`)+(o.length>0?`?${o.join(`?`)}`:``)+r}function fn(e=``,t){if(!t)return e.endsWith(`/`)?e:e+`/`;if(dn(e,!0))return e||`/`;let n=e,r=``,i=e.indexOf(`#`);if(i!==-1&&(n=e.slice(0,i),r=e.slice(i),!n))return r;let[a,...o]=n.split(`?`);return a+`/`+(o.length>0?`?${o.join(`?`)}`:``)+r}function pn(e,t){if(gn(t)||Y(e))return e;let n=Z(t);if(e.startsWith(n)){let t=e[n.length];if(!t||t===`/`||t===`?`)return e}return vn(n,e)}function mn(e,t){if(gn(t))return e;let n=Z(t);if(!e.startsWith(n))return e;let r=e[n.length];return r&&r!==`/`&&r!==`?`?e:`/`+e.slice(n.length).replace(/^\/+/,``)}function hn(e,t){let n=Q(e);return n.search=rn({...J(n.search),...t}),Cn(n)}function gn(e){return!e||e===`/`}function _n(e){return e&&e!==`/`}function vn(e,...t){let n=e||``;for(let e of t.filter(e=>_n(e)))if(n){let t=e.replace(un,``);n=fn(n)+t}else n=e;return n}function yn(...e){let t=/\/(?!\/)/,n=e.filter(Boolean),r=[],i=0;for(let e of n)if(e&&e!==`/`){for(let[n,a]of e.split(t).entries())if(a&&a!==`.`){if(a===`..`){if(r.length===1&&Y(r[0]))continue;r.pop(),i--;continue}if(n===1&&r[r.length-1]?.endsWith(`:/`)){r[r.length-1]+=`/`+a;continue}r.push(a),i++}}let a=r.join(`/`);return i>=0?n[0]?.startsWith(`/`)&&!a.startsWith(`/`)?a=`/`+a:n[0]?.startsWith(`./`)&&!a.startsWith(`./`)&&(a=`./`+a):a=`../`.repeat(-1*i)+a,n[n.length-1]?.endsWith(`/`)&&!a.endsWith(`/`)&&(a+=`/`),a}function bn(e,t){return q(Z(e))===q(Z(t))}var xn=Symbol.for(`ufo:protocolRelative`);function Q(e=``,t){let n=e.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(n){let[,e,t=``]=n;return{protocol:e.toLowerCase(),pathname:t,href:e+t,auth:``,host:``,search:``,hash:``}}if(!Y(e,{acceptRelative:!0}))return t?Q(t+e):Sn(e);let[,r=``,i,a=``]=e.replace(/\\/g,`/`).match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,o=``,s=``]=a.match(/([^#/?]*)(.*)?/)||[];r===`file:`&&(s=s.replace(/\/(?=[A-Za-z]:)/,``));let{pathname:c,search:l,hash:u}=Sn(s);return{protocol:r.toLowerCase(),auth:i?i.slice(0,Math.max(0,i.length-1)):``,host:o,pathname:c,search:l,hash:u,[xn]:!r}}function Sn(e=``){let[t=``,n=``,r=``]=(e.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:n,hash:r}}function Cn(e){let t=e.pathname||``,n=e.search?(e.search.startsWith(`?`)?``:`?`)+e.search:``,r=e.hash||``,i=e.auth?e.auth+`@`:``,a=e.host||``;return(e.protocol||e[xn]?(e.protocol||``)+`//`:``)+i+a+t+n+r}function wn(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)===`[object Module]`:!0}function Tn(e,t,n=`.`,r){if(!wn(t))return Tn(e,{},n,r);let i={...t};for(let t of Object.keys(e)){if(t===`__proto__`||t===`constructor`)continue;let a=e[t];a!=null&&(r&&r(i,t,a,n)||(i[t]=Array.isArray(a)&&Array.isArray(i[t])?[...a,...i[t]]:wn(a)&&wn(i[t])?Tn(a,i[t],(n?`${n}.`:``)+t.toString(),r):a))}return i}function En(e){return(...t)=>t.reduce((t,n)=>Tn(t,n,``,e),{})}var Dn=En();function On(e,t){try{return t in e}catch{return!1}}var kn=class extends Error{static __h3_error__=!0;statusCode=500;fatal=!1;unhandled=!1;statusMessage;data;cause;constructor(e,t={}){super(e,t),t.cause&&!this.cause&&(this.cause=t.cause)}toJSON(){let e={message:this.message,statusCode:Pn(this.statusCode,500)};return this.statusMessage&&(e.statusMessage=Nn(this.statusMessage)),this.data!==void 0&&(e.data=this.data),e}};function An(e){if(typeof e==`string`)return new kn(e);if(jn(e))return e;let t=new kn(e.message??e.statusMessage??``,{cause:e.cause||e});if(On(e,`stack`))try{Object.defineProperty(t,"stack",{get(){return e.stack}})}catch{try{t.stack=e.stack}catch{}}if(e.data&&(t.data=e.data),e.statusCode?t.statusCode=Pn(e.statusCode,t.statusCode):e.status&&(t.statusCode=Pn(e.status,t.statusCode)),e.statusMessage?t.statusMessage=e.statusMessage:e.statusText&&(t.statusMessage=e.statusText),t.statusMessage){let e=t.statusMessage;Nn(t.statusMessage)!==e&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.")}return e.fatal!==void 0&&(t.fatal=e.fatal),e.unhandled!==void 0&&(t.unhandled=e.unhandled),t}function jn(e){return e?.constructor?.__h3_error__===!0}var Mn=/[^\u0009\u0020-\u007E]/g;function Nn(e=``){return e.replace(Mn,``)}function Pn(e,t=200){return!e||(typeof e==`string`&&(e=Number.parseInt(e,10)),e<100||e>999)?t:e}globalThis.Headers,globalThis.Response;var $=()=>r()?.$router;function Fn(e){let t=e.scope,n=ee();for(;n;){if(n===t)return!0;n=n.parent}return!1}var In=(()=>{if(s()){let e=he();if(!e||Fn(e))return fe(zt,r()._route)}return r()._route});function Ln(e){return e}var Rn=()=>{try{if(r()._processingMiddleware)return!0}catch{return!1}return!1},zn=(e,t)=>{e||=`/`;let n=typeof e==`string`?e:`path`in e?Bn(e):$().resolve(e).href;if(t?.open){let{protocol:e}=new URL(n,window.location.href);if(e&&X(e))throw U.NUXT_E2002({toPath:n,protocol:e});let{target:r=`_blank`,windowFeatures:i={}}=t.open,a=[];for(let[e,t]of Object.entries(i))t!==void 0&&a.push(`${e.toLowerCase()}=${t}`);return open(n,r,a.join(`, `)),Promise.resolve()}let i=Y(n,{acceptRelative:!0}),a=t?.external||i;if(a){if(!t?.external)throw U.NUXT_E2001({toPath:n});let{protocol:e}=new URL(n,window.location.href);if(e&&X(e))throw U.NUXT_E2002({toPath:n,protocol:e})}let o=Rn();if(!a&&o){if(t?.replace){if(typeof e==`string`){let{pathname:t,search:n,hash:r}=Q(e);return{path:t,...n&&{query:J(n)},...r&&{hash:r},replace:!0}}return{...e,replace:!0}}return e}let s=$(),c=r();if(a)return c._scope.stop(),t?.replace?location.replace(n):location.href=n,o?c.isHydrating?new Promise(()=>{}):!1:Promise.resolve();let l=typeof e==`string`?Vn(e):e;return t?.replace?s.replace(l):s.push(l)};function Bn(e){return hn(e.path||``,e.query||{})+(e.hash||``)}function Vn(e){let t=Q(e);return Qt($t(t.pathname))+t.search+t.hash}var Hn=`__nuxt_error`,Un=()=>le(r().payload,`error`),Wn=e=>{let t=Yn(e);try{let e=Un();r().hooks.callHook(`app:error`,t),e.value||=t}catch{throw t}return t},Gn=(e,t)=>{let r=e.callHook(`app:error`,Yn(t));return n.NUXT_E1012({userAgent:navigator.userAgent,cause:t}),r},Kn=async(e,t)=>{if(It(navigator.userAgent)){await Gn(e,t);return}await e.runWithContext(()=>Wn(t))},qn=async(e={})=>{let t=r(),n=Un();t.callHook(`app:error:cleared`,e),e.redirect&&await $().replace(e.redirect),n.value=void 0},Jn=e=>!!e&&typeof e==`object`&&`__nuxt_error`in e,Yn=e=>{typeof e!=`string`&&e.statusText&&(e.message??=e.statusText);let t=An(e);return Object.defineProperty(t,Hn,{value:!0,configurable:!1,writable:!1}),Object.defineProperty(t,"status",{get:()=>t.statusCode,configurable:!0}),Object.defineProperty(t,"statusText",{get:()=>t.statusMessage,configurable:!0}),t};export{It as A,fn as C,Lt as D,U as E,At as F,bt as I,Re as L,dt as M,jt as N,Rt as O,Mt as P,Tt as R,hn as S,Z as T,X as _,Jn as a,J as b,Ln as c,Bn as d,In as f,bn as g,Y as h,Yn as i,Ee as j,zt as k,Vn as l,Dn as m,Kn as n,Wn as o,$ as p,qn as r,Un as s,Gn as t,zn as u,yn as v,mn as w,pn as x,vn as y,Ct as z}; \ No newline at end of file diff --git a/server/adminui/_nuxt/EBK3dIz3.js b/server/adminui/_nuxt/EBK3dIz3.js new file mode 100644 index 0000000..2f0e590 --- /dev/null +++ b/server/adminui/_nuxt/EBK3dIz3.js @@ -0,0 +1 @@ +import{$ as e,Et as t,J as n,M as r,P as i,d as a,f as o,g as s,h as c,kt as l,l as u,nt as d,u as f,ut as p,v as m,z as h}from"./Bx_a1Ri3.js";import{R as g,f as _,j as v,u as y,z as b}from"./Dw7E2aQ0.js";import{t as x}from"./BOgT-xSl.js";import{r as S,t as C}from"./D2-o7L18.js";import{n as w,r as T,t as E}from"./D-_L2MRs.js";import{t as D}from"./B2oFgaBj.js";import{t as O}from"./nj6DwLzD.js";var k=x(`loader-circle`,[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]]),A=x(`log-in`,[[`path`,{d:`m10 17 5-5-5-5`,key:`1bsop3`}],[`path`,{d:`M15 12H3`,key:`6jk70r`}],[`path`,{d:`M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4`,key:`u53s6r`}]]),j=x(`user`,[[`path`,{d:`M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2`,key:`975kel`}],[`circle`,{cx:`12`,cy:`7`,r:`4`,key:`17ys0d`}]]),M={class:`space-y-1.5`},N={class:`relative`},P={class:`space-y-1.5`},F={class:`relative`},I=[`title`],L={key:0,class:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive`},R=m({__name:`login`,setup(m){let{login:x}=O(),R=_(),z=d(``),B=d(``),V=d(!1),H=d(!1),U=d(``);r(()=>{z.value=localStorage.getItem(`liapi_admin_username`)||``});function W(){let e=R.query.redirect,t=Array.isArray(e)?e[0]:e;return typeof t==`string`&&t.startsWith(`/`)&&t!==`/login`?t:`/`}async function G(){U.value=``;let e=z.value.trim();if(!e||!B.value){U.value=`请输入用户名和密码`;return}H.value=!0;try{await x(e,B.value),localStorage.setItem(`liapi_admin_username`,e),await y(W(),{replace:!0})}catch(e){U.value=e.message||`登录失败`}finally{H.value=!1}}return(r,d)=>(i(),o(`form`,{class:`space-y-4`,onSubmit:b(G,[`prevent`])},[u(`div`,M,[d[3]||=u(`label`,{class:`text-xs font-medium text-muted-foreground`},`用户名`,-1),u(`div`,N,[s(p(j),{size:15,class:`pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground`}),s(p(E),{modelValue:p(z),"onUpdate:modelValue":d[0]||=t=>e(z)?z.value=t:null,type:`text`,placeholder:`admin`,autofocus:``,autocomplete:`username`,class:`pl-9`,onKeydown:g(b(G,[`prevent`]),[`enter`])},null,8,[`modelValue`,`onKeydown`])])]),u(`div`,P,[d[4]||=u(`label`,{class:`text-xs font-medium text-muted-foreground`},`密码`,-1),u(`div`,F,[s(p(D),{size:15,class:`pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground`}),s(p(E),{modelValue:p(B),"onUpdate:modelValue":d[1]||=t=>e(B)?B.value=t:null,type:p(V)?`text`:`password`,placeholder:`••••••••`,autocomplete:`current-password`,class:`pl-9 pr-9`,onKeydown:g(b(G,[`prevent`]),[`enter`])},null,8,[`modelValue`,`type`,`onKeydown`]),u(`button`,{type:`button`,class:`absolute right-2 top-1/2 grid h-7 w-7 -translate-y-1/2 place-items-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,title:p(V)?`隐藏`:`显示`,onClick:d[2]||=e=>V.value=!p(V)},[(i(),f(h(p(V)?p(T):p(w)),{size:15}))],8,I)])]),s(v,{name:`fade`},{default:n(()=>[p(U)?(i(),o(`div`,L,[s(p(S),{size:14,class:`mt-0.5 shrink-0`}),u(`span`,null,l(p(U)),1)])):a(``,!0)]),_:1}),s(p(C),{type:`submit`,class:`w-full`,disabled:p(H)},{default:n(()=>[(i(),f(h(p(H)?p(k):p(A)),{size:16,class:t(p(H)?`animate-spin`:``)},null,8,[`class`])),c(` `+l(p(H)?`登录中…`:`登录`),1)]),_:1},8,[`disabled`])],32))}});export{R as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/NDcEePfh.js b/server/adminui/_nuxt/NDcEePfh.js new file mode 100644 index 0000000..8c31c0c --- /dev/null +++ b/server/adminui/_nuxt/NDcEePfh.js @@ -0,0 +1 @@ +import{Et as e,I as t,J as n,K as r,M as i,Ot as a,P as o,Y as s,Z as c,at as l,c as u,d,et as f,f as p,g as m,it as h,k as g,kt as _,l as v,lt as y,nt as b,o as x,r as S,u as C,ut as w,v as T}from"./Bx_a1Ri3.js";import{I as E,j as D}from"./Dw7E2aQ0.js";import{t as O}from"./BOgT-xSl.js";import{i as ee,r as te}from"./CjfA7_9d.js";import{i as ne,n as k}from"./D2-o7L18.js";import{t as re}from"./CAJW6uLT.js";var ie=O(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),A=Math.min,j=Math.max,M=Math.round,N=Math.floor,P=e=>({x:e,y:e}),ae={left:`right`,right:`left`,bottom:`top`,top:`bottom`};function oe(e,t,n){return j(e,A(t,n))}function F(e,t){return typeof e==`function`?e(t):e}function I(e){return e.split(`-`)[0]}function L(e){return e.split(`-`)[1]}function se(e){return e===`x`?`y`:`x`}function ce(e){return e===`y`?`height`:`width`}function R(e){let t=e[0];return t===`t`||t===`b`?`y`:`x`}function le(e){return se(R(e))}function ue(e,t,n){n===void 0&&(n=!1);let r=L(e),i=le(e),a=ce(i),o=i===`x`?r===(n?`end`:`start`)?`right`:`left`:r===`start`?`bottom`:`top`;return t.reference[a]>t.floating[a]&&(o=z(o)),[o,z(o)]}function de(e){let t=z(e);return[fe(e),t,fe(t)]}function fe(e){return e.includes(`start`)?e.replace(`start`,`end`):e.replace(`end`,`start`)}var pe=[`left`,`right`],me=[`right`,`left`],he=[`top`,`bottom`],ge=[`bottom`,`top`];function _e(e,t,n){switch(e){case`top`:case`bottom`:return n?t?me:pe:t?pe:me;case`left`:case`right`:return t?he:ge;default:return[]}}function ve(e,t,n,r){let i=L(e),a=_e(I(e),n===`start`,r);return i&&(a=a.map(e=>e+`-`+i),t&&(a=a.concat(a.map(fe)))),a}function z(e){let t=I(e);return ae[t]+e.slice(t.length)}function ye(e){return{top:e.top??0,right:e.right??0,bottom:e.bottom??0,left:e.left??0}}function be(e){return typeof e==`number`?{top:e,right:e,bottom:e,left:e}:ye(e)}function B(e){let{x:t,y:n,width:r,height:i}=e;return{width:r,height:i,top:n,left:t,right:t+r,bottom:n+i,x:t,y:n}}function xe(e,t,n){let{reference:r,floating:i}=e,a=R(t),o=le(t),s=ce(o),c=I(t),l=a===`y`,u=r.x+r.width/2-i.width/2,d=r.y+r.height/2-i.height/2,f=r[s]/2-i[s]/2,p;switch(c){case`top`:p={x:u,y:r.y-i.height};break;case`bottom`:p={x:u,y:r.y+r.height};break;case`right`:p={x:r.x+r.width,y:d};break;case`left`:p={x:r.x-i.width,y:d};break;default:p={x:r.x,y:r.y}}let m=L(t);return m&&(p[o]+=f*(m===`end`?1:-1)*(n&&l?-1:1)),p}async function Se(e,t){t===void 0&&(t={});let{x:n,y:r,platform:i,rects:a,elements:o,strategy:s}=e,{boundary:c=`clippingAncestors`,rootBoundary:l=`viewport`,elementContext:u=`floating`,altBoundary:d=!1,padding:f=0}=F(t,e),p=be(f),m=o[d?u===`floating`?`reference`:`floating`:u],h=B(await i.getClippingRect({element:await(i.isElement==null?void 0:i.isElement(m))??!0?m:m.contextElement||await(i.getDocumentElement==null?void 0:i.getDocumentElement(o.floating)),boundary:c,rootBoundary:l,strategy:s})),g=u===`floating`?{x:n,y:r,width:a.floating.width,height:a.floating.height}:a.reference,_=await(i.getOffsetParent==null?void 0:i.getOffsetParent(o.floating)),v=await(i.isElement==null?void 0:i.isElement(_))&&await(i.getScale==null?void 0:i.getScale(_))||{x:1,y:1},y=B(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:o,rect:g,offsetParent:_,strategy:s}):g);return{top:(h.top-y.top+p.top)/v.y,bottom:(y.bottom-h.bottom+p.bottom)/v.y,left:(h.left-y.left+p.left)/v.x,right:(y.right-h.right+p.right)/v.x}}var Ce=50,we=async(e,t,n)=>{let{placement:r=`bottom`,strategy:i=`absolute`,middleware:a=[],platform:o}=n,s=o.detectOverflow?o:{...o,detectOverflow:Se},c=await(o.isRTL==null?void 0:o.isRTL(t)),l=await o.getElementRects({reference:e,floating:t,strategy:i}),{x:u,y:d}=xe(l,r,c),f=r,p=0,m={};for(let n=0;ne<=0)){let e=(i.flip?.index||0)+1,t=S[e];if(t&&(u!==`alignment`||_===R(t)||T.every(e=>R(e.placement)!==_||e.overflows[0]>0)))return{data:{index:e,overflows:T},reset:{placement:t}};let n=T.filter(e=>e.overflows[0]<=0).sort((e,t)=>e.overflows[1]-t.overflows[1])[0]?.placement;if(!n)switch(f){case`bestFit`:{let e=T.filter(e=>{if(x){let t=R(e.placement);return t===_||t===`y`}return!0}).map(e=>[e.placement,e.overflows.filter(e=>e>0).reduce((e,t)=>e+t,0)]).sort((e,t)=>e[1]-t[1])[0]?.[0];e&&(n=e);break}case`initialPlacement`:n=o}if(r!==n)return{reset:{placement:n}}}return{}}}},Ee=new Set([`left`,`top`]);async function De(e,t){let{placement:n,platform:r,elements:i}=e,a=await(r.isRTL==null?void 0:r.isRTL(i.floating)),o=I(n),s=L(n),c=R(n)===`y`,l=Ee.has(o)?-1:1,u=a&&c?-1:1,d=F(t,e),{mainAxis:f,crossAxis:p,alignmentAxis:m}=typeof d==`number`?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return s&&typeof m==`number`&&(p=s===`end`?m*-1:m),c?{x:p*u,y:f*l}:{x:f*l,y:p*u}}var Oe=function(e){return e===void 0&&(e=0),{name:`offset`,options:e,async fn(t){var n;let{x:r,y:i,placement:a,middlewareData:o}=t,s=await De(t,e);return a===o.offset?.placement&&(n=o.arrow)!=null&&n.alignmentOffset?{}:{x:r+s.x,y:i+s.y,data:{...s,placement:a}}}}},ke=function(e){return e===void 0&&(e={}),{name:`shift`,options:e,async fn(t){let{x:n,y:r,placement:i,platform:a}=t,{mainAxis:o=!0,crossAxis:s=!1,limiter:c={fn:e=>{let{x:t,y:n}=e;return{x:t,y:n}}},...l}=F(e,t),u={x:n,y:r},d=await a.detectOverflow(t,l),f=R(i),p=se(f),m=u[p],h=u[f],g=(e,t)=>oe(t+d[e===`y`?`top`:`left`],t,t-d[e===`y`?`bottom`:`right`]);o&&(m=g(p,m)),s&&(h=g(f,h));let _=c.fn({...t,[p]:m,[f]:h});return{..._,data:{x:_.x-n,y:_.y-r,enabled:{[p]:o,[f]:s}}}}}},Ae=function(e){return e===void 0&&(e={}),{name:`size`,options:e,async fn(t){let{placement:n,rects:r,platform:i,elements:a}=t,{apply:o=()=>{},...s}=F(e,t),c=await i.detectOverflow(t,s),l=I(n),u=L(n),d=R(n)===`y`,{width:f,height:p}=r.floating,m,h;l===`top`||l===`bottom`?(m=l,h=u===(await(i.isRTL==null?void 0:i.isRTL(a.floating))?`start`:`end`)?`left`:`right`):(h=l,m=u===`end`?`top`:`bottom`);let g=p-c.top-c.bottom,_=f-c.left-c.right,v=A(p-c[m],g),y=A(f-c[h],_),b=t.middlewareData.shift,x=!b,S=v,C=y;b!=null&&b.enabled.x&&(C=_),b!=null&&b.enabled.y&&(S=g),x&&!u&&(d?C=f-2*j(c.left,c.right):S=p-2*j(c.top,c.bottom)),await o({...t,availableWidth:C,availableHeight:S});let w=await i.getDimensions(a.floating);return f!==w.width||p!==w.height?{reset:{rects:!0}}:{}}}};function V(){return typeof window<`u`}function H(e){return je(e)?(e.nodeName||``).toLowerCase():`#document`}function U(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function W(e){return((je(e)?e.ownerDocument:e.document)||window.document)?.documentElement}function je(e){return V()?e instanceof Node||e instanceof U(e).Node:!1}function G(e){return V()?e instanceof Element||e instanceof U(e).Element:!1}function K(e){return V()?e instanceof HTMLElement||e instanceof U(e).HTMLElement:!1}function Me(e){return!V()||typeof ShadowRoot>`u`?!1:e instanceof ShadowRoot||e instanceof U(e).ShadowRoot}function Ne(e){let{overflow:t,overflowX:n,overflowY:r,display:i}=Y(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&i!==`inline`&&i!==`contents`}function Pe(e){return/^(table|td|th)$/.test(H(e))}function Fe(e){try{if(e.matches(`:popover-open`))return!0}catch{}try{return e.matches(`:modal`)}catch{return!1}}var Ie=/transform|translate|scale|rotate|perspective|filter/,Le=/paint|layout|strict|content/,q=e=>!!e&&e!==`none`,Re;function ze(e){let t=G(e)?Y(e):e;return q(t.transform)||q(t.translate)||q(t.scale)||q(t.rotate)||q(t.perspective)||!Ve()&&(q(t.backdropFilter)||q(t.filter))||Ie.test(t.willChange||``)||Le.test(t.contain||``)}function Be(e){let t=X(e);for(;K(t)&&!J(t);){if(ze(t))return t;if(Fe(t))return null;t=X(t)}return null}function Ve(){return Re??=typeof CSS<`u`&&CSS.supports&&CSS.supports(`-webkit-backdrop-filter`,`none`),Re}function J(e){return/^(html|body|#document)$/.test(H(e))}function Y(e){return U(e).getComputedStyle(e)}function He(e){return G(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function X(e){if(H(e)===`html`)return e;let t=e.assignedSlot||e.parentNode||Me(e)&&e.host||W(e);return Me(t)?t.host:t}function Ue(e){let t=X(e);return J(t)?(e.ownerDocument||e).body:K(t)&&Ne(t)?t:Ue(t)}function Z(e,t,n){t===void 0&&(t=[]),n===void 0&&(n=!0);let r=Ue(e),i=r===e.ownerDocument?.body,a=U(r);if(i){let e=We(a);return t.concat(a,a.visualViewport||[],Ne(r)?r:[],e&&n?Z(e):[])}return t.concat(r,Z(r,[],n))}function We(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function Ge(e){let t=Y(e),n=parseFloat(t.width)||0,r=parseFloat(t.height)||0,i=K(e),a=i?e.offsetWidth:n,o=i?e.offsetHeight:r,s=M(n)!==a||M(r)!==o;return s&&(n=a,r=o),{width:n,height:r,$:s}}function Ke(e){return G(e)?e:e.contextElement}function Q(e){let t=Ke(e);if(!K(t))return P(1);let n=t.getBoundingClientRect(),{width:r,height:i,$:a}=Ge(t),o=(a?M(n.width):n.width)/r,s=(a?M(n.height):n.height)/i;return(!o||!Number.isFinite(o))&&(o=1),(!s||!Number.isFinite(s))&&(s=1),{x:o,y:s}}var qe=P(0);function Je(e){let t=U(e);return!Ve()||!t.visualViewport?qe:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Ye(e,t,n){return t===void 0&&(t=!1),!!n&&t&&n===U(e)}function $(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);let i=e.getBoundingClientRect(),a=Ke(e),o=P(1);t&&(r?G(r)&&(o=Q(r)):o=Q(e));let s=Ye(a,n,r)?Je(a):P(0),c=(i.left+s.x)/o.x,l=(i.top+s.y)/o.y,u=i.width/o.x,d=i.height/o.y;if(a&&r){let e=U(a),t=G(r)?U(r):r,n=e,i=We(n);for(;i&&t!==n;){let e=Q(i),t=i.getBoundingClientRect(),r=Y(i),a=t.left+(i.clientLeft+parseFloat(r.paddingLeft))*e.x,o=t.top+(i.clientTop+parseFloat(r.paddingTop))*e.y;c*=e.x,l*=e.y,u*=e.x,d*=e.y,c+=a,l+=o,n=U(i),i=We(n)}}return B({width:u,height:d,x:c,y:l})}function Xe(e,t){let n=He(e).scrollLeft;return t?t.left+n:$(W(e)).left+n}function Ze(e,t){let n=e.getBoundingClientRect();return{x:n.left+t.scrollLeft-Xe(e,n),y:n.top+t.scrollTop}}function Qe(e){let{elements:t,rect:n,offsetParent:r,strategy:i}=e,a=i===`fixed`,o=W(r),s=t?Fe(t.floating):!1;if(r===o||s&&a)return n;let c={scrollLeft:0,scrollTop:0},l=P(1),u=P(0),d=K(r);if((d||!a)&&((H(r)!==`body`||Ne(o))&&(c=He(r)),d)){let e=$(r);l=Q(r),u.x=e.x+r.clientLeft,u.y=e.y+r.clientTop}let f=o&&!d&&!a?Ze(o,c):P(0);return{width:n.width*l.x,height:n.height*l.y,x:n.x*l.x-c.scrollLeft*l.x+u.x+f.x,y:n.y*l.y-c.scrollTop*l.y+u.y+f.y}}function $e(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function et(e){let t=He(e),n=e.ownerDocument.body,r=j(e.scrollWidth,e.clientWidth,n.scrollWidth,n.clientWidth),i=j(e.scrollHeight,e.clientHeight,n.scrollHeight,n.clientHeight),a=-t.scrollLeft+Xe(e),o=-t.scrollTop;return Y(n).direction===`rtl`&&(a+=j(e.clientWidth,n.clientWidth)-r),{width:r,height:i,x:a,y:o}}var tt=25;function nt(e,t,n){n===void 0&&(n=`viewport`);let r=n===`layoutViewport`,i=U(e),a=W(e),o=i.visualViewport,s=a.clientWidth,c=a.clientHeight,l=0,u=0;if(o){let e=!Ve()||t===`fixed`;r?e||(l=-o.offsetLeft,u=-o.offsetTop):(s=o.width,c=o.height,e&&(l=o.offsetLeft,u=o.offsetTop))}if(Xe(a)<=0){let e=a.ownerDocument,t=e.body,n=getComputedStyle(t),r=e.compatMode===`CSS1Compat`&&parseFloat(n.marginLeft)+parseFloat(n.marginRight)||0,i=Math.abs(a.clientWidth-t.clientWidth-r),o=getComputedStyle(a).scrollbarGutter===`stable both-edges`?i/2:i;o<=tt&&(s-=o)}return{width:s,height:c,x:l,y:u}}function rt(e,t){let n=$(e,!0,t===`fixed`),r=n.top+e.clientTop,i=n.left+e.clientLeft,a=Q(e);return{width:e.clientWidth*a.x,height:e.clientHeight*a.y,x:i*a.x,y:r*a.y}}function it(e,t,n){let r;if(t===`viewport`||t===`layoutViewport`)r=nt(e,n,t);else if(t===`document`)r=et(W(e));else if(G(t))r=rt(t,n);else{let n=Je(e);r={x:t.x-n.x,y:t.y-n.y,width:t.width,height:t.height}}return B(r)}function at(e,t){let n=t.get(e);if(n)return n;let r=Z(e,[],!1).filter(e=>G(e)&&H(e)!==`body`),i=null,a=Y(e).position===`fixed`,o=a?X(e):e;for(;G(o)&&!J(o);){let e=Y(o),t=ze(o),n=i?i.position:a?`fixed`:``;!t&&(n===`fixed`||n===`absolute`&&e.position===`static`)?r=r.filter(e=>e!==o):i=e,o=X(o)}return t.set(e,r),r}function ot(e){let{element:t,boundary:n,rootBoundary:r,strategy:i}=e,a=[...n===`clippingAncestors`?Fe(t)?[]:at(t,this._c):[].concat(n),r],o=it(t,a[0],i),s=o.top,c=o.right,l=o.bottom,u=o.left;for(let e=1;e{s(!1,1e-7)},1e3)}y=!1}try{r=new IntersectionObserver(b,{...v,root:a.ownerDocument})}catch{r=new IntersectionObserver(b,v)}r.observe(e)}let c=U(e),l=()=>s(n);return c.addEventListener(`resize`,l),s(!0),()=>{c.removeEventListener(`resize`,l),o()}}function _t(e,t,n,r){r===void 0&&(r={});let{ancestorScroll:i=!0,ancestorResize:a=!0,elementResize:o=typeof ResizeObserver==`function`,layoutShift:s=typeof IntersectionObserver==`function`,animationFrame:c=!1}=r,l=Ke(e),u=i||a?[...l?Z(l):[],...t?Z(t):[]]:[];u.forEach(e=>{i&&e.addEventListener(`scroll`,n),a&&e.addEventListener(`resize`,n)});let d=l&&s?gt(l,n,a):null,f=-1,p=null;o&&(p=new ResizeObserver(e=>{let[r]=e;r&&r.target===l&&p&&t&&(p.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame(()=>{var e;(e=p)==null||e.observe(t)})),n()}),l&&!c&&p.observe(l),t&&p.observe(t));let m,h=c?$(e):null;c&&g();function g(){let t=$(e);h&&!ht(h,t)&&n(),h=t,m=requestAnimationFrame(g)}return n(),()=>{var e;u.forEach(e=>{i&&e.removeEventListener(`scroll`,n),a&&e.removeEventListener(`resize`,n)}),d?.(),(e=p)==null||e.disconnect(),p=null,c&&cancelAnimationFrame(m)}}var vt=Oe,yt=ke,bt=Te,xt=Ae,St=(e,t,n)=>{let r=new Map,i=n??{},a={...mt,...i.platform,_c:r};return we(e,t,{...i,platform:a})};function Ct(e){return typeof e==`object`&&!!e&&`$el`in e}function wt(e){if(Ct(e)){let t=e.$el;return je(t)&&H(t)===`#comment`?null:t}return e}function Tt(e){return typeof window>`u`?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function Et(e,t){let n=Tt(e);return Math.round(t*n)/n}function Dt(e,t,n){n===void 0&&(n={});let i=n.whileElementsMounted,a=u(()=>y(n.open)??!0),o=u(()=>y(n.middleware)),s=u(()=>y(n.placement)??`bottom`),d=u(()=>y(n.strategy)??`absolute`),p=u(()=>y(n.transform)??!0),m=u(()=>wt(e.value)),g=u(()=>wt(t.value)),_=b(0),v=b(0),x=b(d.value),S=b(s.value),C=l({}),w=b(!1),T=u(()=>{let e={position:x.value,left:`0`,top:`0`};if(!g.value)return e;let t=Et(g.value,_.value),n=Et(g.value,v.value);return p.value?{...e,transform:`translate(`+t+`px, `+n+`px)`,...Tt(g.value)>=1.5&&{willChange:`transform`}}:{position:x.value,left:t+`px`,top:n+`px`}}),E;function D(){if(m.value==null||g.value==null)return;let e=a.value;St(m.value,g.value,{middleware:o.value,placement:s.value,strategy:d.value}).then(t=>{_.value=t.x,v.value=t.y,x.value=t.strategy,S.value=t.placement,C.value=t.middlewareData,w.value=e!==!1})}function O(){typeof E==`function`&&(E(),E=void 0)}function ee(){if(O(),i===void 0){D();return}if(m.value!=null&&g.value!=null){E=i(m.value,g.value,D);return}}function te(){a.value||(w.value=!1)}return r([o,s,d,a],D,{flush:`sync`}),r([m,g],ee,{flush:`sync`}),r(a,te,{flush:`sync`}),c()&&f(O),{x:h(_),y:h(v),strategy:h(x),placement:h(S),middlewareData:h(C),isPositioned:h(w),floatingStyles:T,update:D}}var Ot={key:0,class:`font-bold text-foreground truncate`},kt={key:1,class:`text-muted-foreground/60 font-medium truncate`},At={class:`flex items-center gap-1.5 shrink-0 ml-2`},jt={key:0,class:`absolute inset-0 z-20 flex items-center justify-center bg-background/20 dark:bg-background/10 backdrop-blur-[1px] rounded-[inherit] overflow-hidden pointer-events-none`},Mt={key:0,class:`p-1 border-b border-border/40 mb-1 flex items-center gap-2`},Nt={class:`max-h-56 overflow-y-auto space-y-0.5 scrollbar-none`},Pt=[`onClick`],Ft={key:0,class:`p-3 text-center text-xs text-muted-foreground`},It=T({__name:`Select`,props:{modelValue:{default:``},options:{default:()=>[]},placeholder:{default:`请选择...`},size:{default:`md`},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},clearable:{type:Boolean,default:!1},searchable:{type:Boolean,default:!1},error:{type:Boolean,default:!1},animate:{type:Boolean,default:!0},delay:{default:0},entryClass:{default:``}},emits:[`update:modelValue`,`change`,`clear`],setup(r,{emit:c}){let l=r,f=c,h=b(!1),y=b(!1),T=b(``),O=b(null),A=b(null),{x:j,y:M,strategy:N}=Dt(O,A,{placement:`bottom-start`,whileElementsMounted:_t,middleware:[vt(6),bt(),yt({padding:8}),xt({apply({rects:e,elements:t}){e.reference.width>0&&(t.floating.style.width=`${e.reference.width}px`)}})]}),P=u(()=>({position:N.value,left:`${j.value??0}px`,top:`${M.value??0}px`})),ae=u(()=>l.options.find(e=>e.value===l.modelValue)),oe=u(()=>!l.searchable||!T.value?l.options:l.options.filter(e=>e.label.toLowerCase().includes(T.value.toLowerCase()))),F=()=>{l.disabled||l.loading||(h.value=!h.value)},{handleChangeValidate:I}=re(),L=e=>{e.disabled||(f(`update:modelValue`,e.value),f(`change`,e),h.value=!1,T.value=``,I())},se=e=>{e.stopPropagation(),f(`update:modelValue`,``),f(`clear`),I()},ce=e=>{let t=O.value;h.value&&t&&!t.contains(e.target)&&A.value&&!A.value.contains(e.target)&&(h.value=!1)};i(()=>{document.addEventListener(`mousedown`,ce),l.animate&&setTimeout(()=>{y.value=!0},l.delay)}),g(()=>{document.removeEventListener(`mousedown`,ce)});let R=u(()=>{let e=l.disabled||l.loading;return k(`relative flex items-center justify-between w-full border rounded-base transition-all duration-200 select-none bg-background overflow-hidden cursor-pointer`,{"h-8 px-2.5 text-xs":l.size===`sm`,"h-10 px-3.5 text-sm":l.size===`md`,"h-12 px-4 text-base":l.size===`lg`},l.error?`border-destructive text-destructive`:`border-border hover:border-border/80 focus-within:border-primary`,h.value?`border-primary ring-2 ring-primary/15`:``,e?`opacity-60 cursor-not-allowed pointer-events-none bg-muted/30`:``)}),le=u(()=>k({"w-3.5 h-3.5":l.size===`sm`,"w-4 h-4":l.size===`md`,"w-4.5 h-4.5":l.size===`lg`})),ue=u(()=>l.animate?l.entryClass?y.value?l.entryClass:`opacity-0`:k(`transform transition-all duration-700 ease-swift`,y.value?`opacity-100 translate-y-0 scale-100 blur-none`:`opacity-0 translate-y-1.5 scale-98 blur-md pointer-events-none`):``);return(r,i)=>(o(),p(`div`,{class:e([ue.value,`w-full`])},[v(`div`,{ref_key:`triggerRef`,ref:O,class:e(R.value),onClick:F},[v(`div`,{class:e([`flex items-center justify-between w-full h-full transition-all duration-300`,l.loading?`opacity-35 blur-[1.5px] scale-[0.99]`:`opacity-100 blur-none scale-100`])},[ae.value?(o(),p(`span`,Ot,_(ae.value.label),1)):(o(),p(`span`,kt,_(l.placeholder),1)),v(`div`,At,[m(D,{name:`icon-pop`},{default:n(()=>[l.clearable&&l.modelValue!==``&&!l.disabled&&!l.loading?(o(),p(`button`,{key:0,type:`button`,onClick:se,class:`text-muted-foreground hover:text-foreground transition-colors p-0.5 active:scale-90 shrink-0`},[m(w(ne),{class:e(le.value)},null,8,[`class`])])):d(``,!0)]),_:1}),m(w(te),{class:e([le.value,`text-muted-foreground transition-transform duration-300 shrink-0`]),style:a({transform:h.value?`rotate(180deg)`:`rotate(0deg)`})},null,8,[`class`,`style`])])],2),m(D,{name:`fade`},{default:n(()=>[l.loading?(o(),p(`div`,jt,[...i[1]||=[v(`div`,{class:`absolute inset-0 overflow-hidden rounded-[inherit]`},[v(`div`,{class:`w-[200%] h-full bg-gradient-to-r from-transparent via-foreground/[0.08] to-transparent animate-kinetic-shimmer rounded-[inherit]`})],-1)]])):d(``,!0)]),_:1})],2),(o(),C(x,{to:`body`},[m(D,{name:`dropdown`},{default:n(()=>[h.value&&!l.loading?(o(),p(`div`,{key:0,ref_key:`panelRef`,ref:A,style:a(P.value),class:`z-[99999] pointer-events-auto bg-background text-foreground border border-border/80 shadow-[0_12px_40px_rgba(0,0,0,0.14)] rounded-base p-1 overflow-hidden`},[l.searchable?(o(),p(`div`,Mt,[m(w(ie),{class:`w-3.5 h-3.5 text-muted-foreground ml-1.5 shrink-0`}),s(v(`input`,{"onUpdate:modelValue":i[0]||=e=>T.value=e,placeholder:`搜索选项...`,class:`w-full bg-transparent border-none outline-none text-xs py-1 text-foreground placeholder:text-muted-foreground/60 font-medium`},null,512),[[E,T.value]])])):d(``,!0),v(`div`,Nt,[(o(!0),p(S,null,t(oe.value,t=>(o(),p(`div`,{key:t.value,onClick:e=>L(t),class:e([`flex items-center justify-between px-3 py-2 text-xs font-bold rounded-[calc(var(--radius)-4px)] cursor-pointer transition-colors`,w(k)(t.value===l.modelValue?`bg-secondary text-secondary-foreground`:`hover:bg-muted text-foreground`,t.disabled?`opacity-40 cursor-not-allowed pointer-events-none`:``)])},[v(`span`,null,_(t.label),1),t.value===l.modelValue?(o(),C(w(ee),{key:0,class:`w-3.5 h-3.5 text-primary shrink-0`})):d(``,!0)],10,Pt))),128)),oe.value.length===0?(o(),p(`div`,Ft,` 未找到匹配选项 `)):d(``,!0)])],4)):d(``,!0)]),_:1})]))],2))}});export{It as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/PJ4Qaee8.js b/server/adminui/_nuxt/PJ4Qaee8.js new file mode 100644 index 0000000..27a8569 --- /dev/null +++ b/server/adminui/_nuxt/PJ4Qaee8.js @@ -0,0 +1 @@ +import{J as e,P as t,f as n,g as r,h as i,kt as a,l as o}from"./Bx_a1Ri3.js";import{t as s}from"./Djcrsm7t.js";import{n as c,t as l}from"#entry";var u={class:`antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide`},d={class:`max-w-520px text-center`},f=[`textContent`],p=[`textContent`],m=[`textContent`],h={class:`flex items-center justify-center w-full`},g=l({__name:`error-404`,props:{appName:{type:String,default:`Nuxt`},status:{type:Number,default:404},statusText:{type:String,default:`Page not found`},description:{type:String,default:`Sorry, the page you are looking for could not be found.`},backHome:{type:String,default:`Go back home`}},setup(l){let g=l;return s({title:`${g.status} - ${g.statusText} | ${g.appName}`,script:[{innerHTML:`!function(){let e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(let e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(let t of e)if("childList"===t.type)for(let e of t.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;let r=function(e){let r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),r.credentials="use-credentials"===e.crossOrigin?"include":"anonymous"===e.crossOrigin?"omit":"same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:`*,:after,:before{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}h1,h2{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 #0000;--un-ring-shadow:0 0 #0000;--un-shadow-inset: ;--un-shadow:0 0 #0000;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:#93c5fd80;--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }`}]}),(s,g)=>{let _=c;return t(),n(`div`,u,[o(`div`,d,[o(`h1`,{class:`font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]`,textContent:a(l.status)},null,8,f),o(`h2`,{class:`font-semibold mb-2 sm:text-3xl text-2xl`,textContent:a(l.statusText)},null,8,p),o(`p`,{class:`mb-4 px-2 text-[#64748B] text-md`,textContent:a(l.description)},null,8,m),o(`div`,h,[r(_,{to:`/`,class:`font-medium hover:text-[#00DC82] text-sm underline underline-offset-3`},{default:e(()=>[i(a(l.backHome),1)]),_:1})])])])}}},[[`__scopeId`,`data-v-b8cc6c10`]]);export{g as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/bazXKP70.js b/server/adminui/_nuxt/bazXKP70.js new file mode 100644 index 0000000..f883ea7 --- /dev/null +++ b/server/adminui/_nuxt/bazXKP70.js @@ -0,0 +1 @@ +import{t as e}from"./BOgT-xSl.js";var t=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),n=e(`minus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}]]);export{t as n,n as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/builds/latest.json b/server/adminui/_nuxt/builds/latest.json new file mode 100644 index 0000000..bb3cc33 --- /dev/null +++ b/server/adminui/_nuxt/builds/latest.json @@ -0,0 +1 @@ +{"id":"d933897f-2539-426e-ae79-a93f55f29d2a","timestamp":1790500353819} \ No newline at end of file diff --git a/server/adminui/_nuxt/builds/meta/d933897f-2539-426e-ae79-a93f55f29d2a.json b/server/adminui/_nuxt/builds/meta/d933897f-2539-426e-ae79-a93f55f29d2a.json new file mode 100644 index 0000000..5c6ca9b --- /dev/null +++ b/server/adminui/_nuxt/builds/meta/d933897f-2539-426e-ae79-a93f55f29d2a.json @@ -0,0 +1 @@ +{"id":"d933897f-2539-426e-ae79-a93f55f29d2a","timestamp":1790500353819,"prerendered":[]} \ No newline at end of file diff --git a/server/adminui/_nuxt/entry.Yd717Buk.css b/server/adminui/_nuxt/entry.Yd717Buk.css new file mode 100644 index 0000000..811fc4f --- /dev/null +++ b/server/adminui/_nuxt/entry.Yd717Buk.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:host,:root{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-zinc-50:oklch(98.5% 0 none);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:1.33333;--text-sm:.875rem;--text-sm--line-height:1.42857;--text-base:1rem;--text-base--line-height:1.5;--text-lg:1.125rem;--text-lg--line-height:1.55556;--text-xl:1.25rem;--text-xl--line-height:1.4;--text-2xl:1.5rem;--text-2xl--line-height:1.33333;--text-3xl:1.875rem;--text-3xl--line-height:1.2;--text-4xl:2.25rem;--text-4xl--line-height:1.11111;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--leading-loose:2;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-3xl:64px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:var(--background);--color-foreground:var(--foreground);--color-primary:var(--primary);--color-primary-foreground:var(--primary-foreground);--color-secondary:var(--secondary);--color-secondary-foreground:var(--secondary-foreground);--color-muted:var(--muted);--color-muted-foreground:var(--muted-foreground);--color-destructive:var(--destructive);--color-destructive-foreground:var(--destructive-foreground);--color-success:var(--success);--color-warning:var(--warning);--color-border:var(--border);--color-ring:var(--ring);--radius-base:var(--radius);--ease-smooth:cubic-bezier(.25, 1, .5, 1);--ease-swift:cubic-bezier(.16, 1, .3, 1);--ease-spring:cubic-bezier(.34, 1.56, .64, 1)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden}.absolute,.sr-only{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-2{inset-inline:calc(var(--spacing)*2)}.-top-1{top:calc(var(--spacing)*-1)}.-top-1\.5{top:calc(var(--spacing)*-1.5)}.-top-2{top:calc(var(--spacing)*-2)}.top-0{top:0}.top-0\.5{top:calc(var(--spacing)*.5)}.top-1\/2{top:50%}.top-2\.5{top:calc(var(--spacing)*2.5)}.top-3{top:calc(var(--spacing)*3)}.top-6{top:calc(var(--spacing)*6)}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing)*-.5)}.-right-1{right:calc(var(--spacing)*-1)}.-right-1\.5{right:calc(var(--spacing)*-1.5)}.-right-2{right:calc(var(--spacing)*-2)}.right-0{right:0}.right-1\.5{right:calc(var(--spacing)*1.5)}.right-3{right:calc(var(--spacing)*3)}.right-full{right:100%}.-bottom-0\.5{bottom:calc(var(--spacing)*-.5)}.bottom-0{bottom:0}.bottom-0\.5{bottom:calc(var(--spacing)*.5)}.bottom-1\.5{bottom:calc(var(--spacing)*1.5)}.bottom-3{bottom:calc(var(--spacing)*3)}.bottom-6{bottom:calc(var(--spacing)*6)}.bottom-full{bottom:100%}.left-0{left:0}.left-1\.5{left:calc(var(--spacing)*1.5)}.left-1\/2{left:50%}.left-\[5px\]{left:5px}.left-full{left:100%}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-500{z-index:500}.z-\[9999\]{z-index:9999}.z-\[99998\]{z-index:99998}.z-\[99999\]{z-index:99999}.z-\[999999\]{z-index:999999}.order-first{order:-9999}.order-last{order:9999}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.m-auto{margin:auto}.mx-1{margin-inline:var(--spacing)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-auto{margin-inline:auto}.my-0{margin-block:0}.my-4{margin-block:calc(var(--spacing)*4)}.my-6{margin-block:calc(var(--spacing)*6)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-2\.5{margin-top:calc(var(--spacing)*2.5)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-3\.5{margin-top:calc(var(--spacing)*3.5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-\[1px\]{margin-top:1px}.mr-0{margin-right:0}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-0{margin-bottom:0}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3\.5{margin-bottom:calc(var(--spacing)*3.5)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-auto{margin-left:auto}.ml-px{margin-left:1px}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.\!h-8{height:calc(var(--spacing)*8)!important}.h-0{height:0}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-1\/2{height:50%}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-4\.5{height:calc(var(--spacing)*4.5)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-6\.5{height:calc(var(--spacing)*6.5)}.h-7{height:calc(var(--spacing)*7)}.h-7\.5{height:calc(var(--spacing)*7.5)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-40{height:calc(var(--spacing)*40)}.h-\[2\.5px\]{height:2.5px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.max-h-28{max-height:calc(var(--spacing)*28)}.max-h-52{max-height:calc(var(--spacing)*52)}.max-h-56{max-height:calc(var(--spacing)*56)}.max-h-\[35vh\]{max-height:35vh}.max-h-\[50vh\]{max-height:50vh}.max-h-\[75vh\]{max-height:75vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.min-h-\[5rem\]{min-height:5rem}.min-h-\[6\.5rem\]{min-height:6.5rem}.min-h-\[8rem\]{min-height:8rem}.min-h-\[calc\(100vh-2rem\)\]{min-height:calc(100vh - 2rem)}.\!w-8{width:calc(var(--spacing)*8)!important}.w-0{width:0}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-2\/3{width:66.6667%}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-4\.5{width:calc(var(--spacing)*4.5)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-6\.5{width:calc(var(--spacing)*6.5)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-36{width:calc(var(--spacing)*36)}.w-40{width:calc(var(--spacing)*40)}.w-72{width:calc(var(--spacing)*72)}.w-\[1px\]{width:1px}.w-\[20px\]{width:20px}.w-\[200\%\]{width:200%}.w-\[250px\]{width:250px}.w-\[290px\]{width:290px}.w-\[330px\]{width:330px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[85vw\]{max-width:85vw}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-\[2\.6rem\]{min-width:2.6rem}.min-w-\[2rem\]{min-width:2rem}.min-w-\[3\.5rem\]{min-width:3.5rem}.min-w-\[3rem\]{min-width:3rem}.min-w-\[16px\]{min-width:16px}.min-w-\[20px\]{min-width:20px}.min-w-\[24px\]{min-width:24px}.min-w-\[32px\]{min-width:32px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-fit{min-width:fit-content}.min-w-max{min-width:max-content}.flex-1{flex:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:50%}.origin-top-left{transform-origin:0 0}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.translate-x-0{translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0px}.translate-x-3\.5{--tw-translate-x:calc(var(--spacing)*3.5)}.translate-x-3\.5,.translate-x-5{translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing)*5)}.translate-x-6\.5{--tw-translate-x:calc(var(--spacing)*6.5)}.-translate-y-1\.5,.translate-x-6\.5{translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\.5{--tw-translate-y:calc(var(--spacing)*-1.5)}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.translate-y-0{translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px}.translate-y-1{--tw-translate-y:var(--spacing)}.translate-y-1,.translate-y-1\.5{translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-1\.5{--tw-translate-y:calc(var(--spacing)*1.5)}.translate-y-2{--tw-translate-y:calc(var(--spacing)*2);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%}.scale-0,.scale-50{scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-50{--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%}.scale-95,.scale-96{scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-96{--tw-scale-x:96%;--tw-scale-y:96%;--tw-scale-z:96%}.scale-98{--tw-scale-x:98%;--tw-scale-y:98%;--tw-scale-z:98%}.scale-100,.scale-98{scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%}.scale-105,.scale-125{scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%}.scale-\[0\.98\]{scale:.98}.scale-\[0\.99\]{scale:.99}.-rotate-90{rotate:-90deg}.rotate-0{rotate:0deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.rotate-\[135deg\]{rotate:135deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.resize-x{resize:horizontal}.resize-y{resize:vertical}.scrollbar-none{scrollbar-width:none}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-3\.5{gap:calc(var(--spacing)*3.5)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.-space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*-1*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*-1*(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*.5*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*.5*(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*1.5*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*1.5*(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*5*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*5*(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*6*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*6*(1 - var(--tw-space-y-reverse)))}:where(.-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing)*-2*var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing)*-2*(1 - var(--tw-space-x-reverse)))}:where(.-space-x-\[1px\]>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-1px*var(--tw-space-x-reverse));margin-inline-end:calc(-1px*(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing)*.5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}:where(.divide-border\/40>:not(:last-child)){border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){:where(.divide-border\/40>:not(:last-child)){border-color:color-mix(in oklab,var(--color-border) 40%,transparent)}}:where(.divide-border\/50>:not(:last-child)){border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){:where(.divide-border\/50>:not(:last-child)){border-color:color-mix(in oklab,var(--color-border) 50%,transparent)}}:where(.divide-border\/60>:not(:last-child)){border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){:where(.divide-border\/60>:not(:last-child)){border-color:color-mix(in oklab,var(--color-border) 60%,transparent)}}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[calc\(var\(--radius\)-2px\)\]{border-radius:calc(var(--radius) - 2px)}.rounded-\[calc\(var\(--radius\)-3px\)\]{border-radius:calc(var(--radius) - 3px)}.rounded-\[calc\(var\(--radius\)-4px\)\]{border-radius:calc(var(--radius) - 4px)}.rounded-\[calc\(var\(--radius\)-5px\)\]{border-radius:calc(var(--radius) - 5px)}.rounded-\[calc\(var\(--radius\)-6px\)\]{border-radius:calc(var(--radius) - 6px)}.rounded-\[inherit\]{border-radius:inherit}.rounded-base{border-radius:var(--radius-base)}.rounded-full{border-radius:2147483647px}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-t-base{border-top-left-radius:var(--radius-base);border-top-right-radius:var(--radius-base)}.border{border-width:1px}.border,.border-2{border-style:var(--tw-border-style)}.border-2{border-width:2px}.border-x-4{border-inline-style:var(--tw-border-style);border-inline-width:4px}.border-t{border-top-width:1px}.border-t,.border-t-4{border-top-style:var(--tw-border-style)}.border-t-4{border-top-width:4px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-width:1px}.border-l,.border-l-2{border-left-style:var(--tw-border-style)}.border-l-2{border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-border,.border-border\/20{border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.border-border\/20{border-color:color-mix(in oklab,var(--color-border) 20%,transparent)}}.border-border\/30{border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,var(--color-border) 30%,transparent)}}.border-border\/40{border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,var(--color-border) 40%,transparent)}}.border-border\/50{border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,var(--color-border) 50%,transparent)}}.border-border\/60{border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,var(--color-border) 60%,transparent)}}.border-border\/70{border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,var(--color-border) 70%,transparent)}}.border-border\/80{border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.border-border\/80{border-color:color-mix(in oklab,var(--color-border) 80%,transparent)}}.border-destructive,.border-destructive\/20{border-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/20{border-color:color-mix(in oklab,var(--color-destructive) 20%,transparent)}}.border-destructive\/30{border-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,var(--color-destructive) 30%,transparent)}}.border-destructive\/50{border-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/50{border-color:color-mix(in oklab,var(--color-destructive) 50%,transparent)}}.border-primary,.border-primary\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-primary\/30{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.border-primary\/40{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-primary\/40{border-color:color-mix(in oklab,var(--color-primary) 40%,transparent)}}.border-primary\/60{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-primary\/60{border-color:color-mix(in oklab,var(--color-primary) 60%,transparent)}}.border-success,.border-success\/20{border-color:var(--color-success)}@supports (color:color-mix(in lab,red,red)){.border-success\/20{border-color:color-mix(in oklab,var(--color-success) 20%,transparent)}}.border-success\/50{border-color:var(--color-success)}@supports (color:color-mix(in lab,red,red)){.border-success\/50{border-color:color-mix(in oklab,var(--color-success) 50%,transparent)}}.border-transparent{border-color:#0000}.border-warning,.border-warning\/25{border-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/25{border-color:color-mix(in oklab,var(--color-warning) 25%,transparent)}}.border-warning\/50{border-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/50{border-color:color-mix(in oklab,var(--color-warning) 50%,transparent)}}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-x-transparent{border-inline-color:#0000}.border-t-primary{border-top-color:var(--color-primary)}.bg-\[\#7e22ce\]{background-color:#7e22ce}.bg-\[\#9be9a8\]{background-color:#9be9a8}.bg-\[\#30a14e\]{background-color:#30a14e}.bg-\[\#40a9ff\]{background-color:#40a9ff}.bg-\[\#40c463\]{background-color:#40c463}.bg-\[\#0064c8\]{background-color:#0064c8}.bg-\[\#216e39\]{background-color:#216e39}.bg-\[\#218bff\]{background-color:#218bff}.bg-\[\#9333ea\]{background-color:#9333ea}.bg-\[\#a855f7\]{background-color:#a855f7}.bg-\[\#c6e48b\]{background-color:#c6e48b}.bg-\[\#d8b4fe\]{background-color:#d8b4fe}.bg-\[\#ea580c\]{background-color:#ea580c}.bg-\[\#ebedf0\]{background-color:#ebedf0}.bg-\[\#f97316\]{background-color:#f97316}.bg-\[\#fb923c\]{background-color:#fb923c}.bg-\[\#fdba74\]{background-color:#fdba74}.bg-background,.bg-background\/10{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/10{background-color:color-mix(in oklab,var(--color-background) 10%,transparent)}}.bg-background\/20{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/20{background-color:color-mix(in oklab,var(--color-background) 20%,transparent)}}.bg-background\/25{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/25{background-color:color-mix(in oklab,var(--color-background) 25%,transparent)}}.bg-background\/40{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/40{background-color:color-mix(in oklab,var(--color-background) 40%,transparent)}}.bg-background\/50{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/50{background-color:color-mix(in oklab,var(--color-background) 50%,transparent)}}.bg-background\/60{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,var(--color-background) 60%,transparent)}}.bg-background\/70{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/70{background-color:color-mix(in oklab,var(--color-background) 70%,transparent)}}.bg-background\/80{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--color-background) 80%,transparent)}}.bg-background\/90{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/90{background-color:color-mix(in oklab,var(--color-background) 90%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-border\/70{background-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.bg-border\/70{background-color:color-mix(in oklab,var(--color-border) 70%,transparent)}}.bg-border\/80{background-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.bg-border\/80{background-color:color-mix(in oklab,var(--color-border) 80%,transparent)}}.bg-destructive,.bg-destructive\/5{background-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/5{background-color:color-mix(in oklab,var(--color-destructive) 5%,transparent)}}.bg-destructive\/10{background-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--color-destructive) 10%,transparent)}}.bg-destructive\/80{background-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/80{background-color:color-mix(in oklab,var(--color-destructive) 80%,transparent)}}.bg-foreground,.bg-foreground\/25{background-color:var(--color-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-foreground\/25{background-color:color-mix(in oklab,var(--color-foreground) 25%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground,.bg-muted-foreground\/10{background-color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/10{background-color:color-mix(in oklab,var(--color-muted-foreground) 10%,transparent)}}.bg-muted-foreground\/20{background-color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/20{background-color:color-mix(in oklab,var(--color-muted-foreground) 20%,transparent)}}.bg-muted-foreground\/25{background-color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/25{background-color:color-mix(in oklab,var(--color-muted-foreground) 25%,transparent)}}.bg-muted-foreground\/30{background-color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/30{background-color:color-mix(in oklab,var(--color-muted-foreground) 30%,transparent)}}.bg-muted-foreground\/40{background-color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab,var(--color-muted-foreground) 40%,transparent)}}.bg-muted\/10{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,var(--color-muted) 10%,transparent)}}.bg-muted\/20{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,var(--color-muted) 20%,transparent)}}.bg-muted\/30{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--color-muted) 30%,transparent)}}.bg-muted\/40{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,var(--color-muted) 40%,transparent)}}.bg-muted\/50{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.bg-muted\/60{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/60{background-color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}.bg-muted\/70{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/70{background-color:color-mix(in oklab,var(--color-muted) 70%,transparent)}}.bg-primary,.bg-primary\/5{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,var(--color-primary) 5%,transparent)}}.bg-primary\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-primary\/50{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/50{background-color:color-mix(in oklab,var(--color-primary) 50%,transparent)}}.bg-secondary,.bg-secondary\/30{background-color:var(--color-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-secondary\/30{background-color:color-mix(in oklab,var(--color-secondary) 30%,transparent)}}.bg-secondary\/40{background-color:var(--color-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-secondary\/40{background-color:color-mix(in oklab,var(--color-secondary) 40%,transparent)}}.bg-secondary\/60{background-color:var(--color-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-secondary\/60{background-color:color-mix(in oklab,var(--color-secondary) 60%,transparent)}}.bg-success,.bg-success\/5{background-color:var(--color-success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/5{background-color:color-mix(in oklab,var(--color-success) 5%,transparent)}}.bg-success\/12{background-color:var(--color-success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/12{background-color:color-mix(in oklab,var(--color-success) 12%,transparent)}}.bg-transparent{background-color:#0000}.bg-warning,.bg-warning\/5{background-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/5{background-color:color-mix(in oklab,var(--color-warning) 5%,transparent)}}.bg-warning\/20{background-color:var(--color-warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/20{background-color:color-mix(in oklab,var(--color-warning) 20%,transparent)}}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[linear-gradient\(45deg\,rgba\(255\,255\,255\,0\.15\)_25\%\,transparent_25\%\,transparent_50\%\,rgba\(255\,255\,255\,0\.15\)_50\%\,rgba\(255\,255\,255\,0\.15\)_75\%\,transparent_75\%\,transparent\)\]{background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0 50%,#ffffff26 0 75%,#0000 0,#0000)}.from-foreground{--tw-gradient-from:var(--color-foreground)}.from-foreground,.from-transparent{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent}.via-foreground\/\[0\.1\]{--tw-gradient-via:var(--color-foreground)}@supports (color:color-mix(in lab,red,red)){.via-foreground\/\[0\.1\]{--tw-gradient-via:color-mix(in oklab, var(--color-foreground) 10%, transparent)}}.via-foreground\/\[0\.1\]{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-foreground\/\[0\.06\]{--tw-gradient-via:var(--color-foreground)}@supports (color:color-mix(in lab,red,red)){.via-foreground\/\[0\.06\]{--tw-gradient-via:color-mix(in oklab, var(--color-foreground) 6%, transparent)}}.via-foreground\/\[0\.06\]{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-foreground\/\[0\.08\]{--tw-gradient-via:var(--color-foreground)}@supports (color:color-mix(in lab,red,red)){.via-foreground\/\[0\.08\]{--tw-gradient-via:color-mix(in oklab, var(--color-foreground) 8%, transparent)}}.via-foreground\/\[0\.08\]{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-foreground\/\[0\.12\]{--tw-gradient-via:var(--color-foreground)}@supports (color:color-mix(in lab,red,red)){.via-foreground\/\[0\.12\]{--tw-gradient-via:color-mix(in oklab, var(--color-foreground) 12%, transparent)}}.via-foreground\/\[0\.12\],.via-primary{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-primary{--tw-gradient-via:var(--color-primary)}.to-muted-foreground{--tw-gradient-to:var(--color-muted-foreground)}.to-muted-foreground,.to-transparent{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent}.bg-\[length\:1rem_1rem\]{background-size:1rem 1rem}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-none{fill:none}.stroke-\[1\.3\]{stroke-width:1.3px}.stroke-\[1\.5\]{stroke-width:1.5px}.stroke-\[2\.5\]{stroke-width:2.5px}.stroke-\[3\]{stroke-width:3px}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-3\.5{padding:calc(var(--spacing)*3.5)}.p-4{padding:calc(var(--spacing)*4)}.p-4\.5{padding:calc(var(--spacing)*4.5)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-7{padding:calc(var(--spacing)*7)}.p-10{padding:calc(var(--spacing)*10)}.p-14{padding:calc(var(--spacing)*14)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-3\.5{padding-inline:calc(var(--spacing)*3.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-4\.5{padding-inline:calc(var(--spacing)*4.5)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-6\.5{padding-inline:calc(var(--spacing)*6.5)}.px-7{padding-inline:calc(var(--spacing)*7)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-4\.5{padding-block:calc(var(--spacing)*4.5)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-0\.5{padding-top:calc(var(--spacing)*.5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pr-0{padding-right:0}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-6{padding-right:calc(var(--spacing)*6)}.pr-9{padding-right:calc(var(--spacing)*9)}.pb-1\.5{padding-bottom:calc(var(--spacing)*1.5)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-4\.5{padding-bottom:calc(var(--spacing)*4.5)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pl-0{padding-left:0}.pl-1{padding-left:var(--spacing)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-bottom{vertical-align:bottom}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.92em\]{font-size:.92em}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-loose{--tw-leading:var(--leading-loose);line-height:var(--leading-loose)}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-background{color:var(--color-background)}.text-border{color:var(--color-border)}.text-destructive{color:var(--color-destructive)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground,.text-foreground\/80{color:var(--color-foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,var(--color-foreground) 80%,transparent)}}.text-muted-foreground,.text-muted-foreground\/25{color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/25{color:color-mix(in oklab,var(--color-muted-foreground) 25%,transparent)}}.text-muted-foreground\/30{color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/30{color:color-mix(in oklab,var(--color-muted-foreground) 30%,transparent)}}.text-muted-foreground\/40{color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,var(--color-muted-foreground) 40%,transparent)}}.text-muted-foreground\/50{color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,var(--color-muted-foreground) 50%,transparent)}}.text-muted-foreground\/60{color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,var(--color-muted-foreground) 60%,transparent)}}.text-muted-foreground\/70{color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,var(--color-muted-foreground) 70%,transparent)}}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-secondary{color:var(--color-secondary)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-success{color:var(--color-success)}.text-transparent{color:#0000}.text-warning{color:var(--color-warning)}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-zinc-50{color:var(--color-zinc-50)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-35{opacity:.35}.opacity-40{opacity:.4}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.shadow,.shadow-2xl{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040)}.shadow-\[0_0_0_3px_color-mix\(in_srgb\,var\(--primary\)_12\%\,transparent\)\]{--tw-shadow:0 0 0 3px var(--tw-shadow-color,var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-\[0_0_0_3px_color-mix\(in_srgb\,var\(--primary\)_12\%\,transparent\)\]{--tw-shadow:0 0 0 3px var(--tw-shadow-color,color-mix(in srgb,var(--primary) 12%,transparent))}}.shadow-\[0_0_0_3px_color-mix\(in_srgb\,var\(--primary\)_12\%\,transparent\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_4px_color-mix\(in_srgb\,var\(--primary\)_18\%\,transparent\)\]{--tw-shadow:0 0 0 4px var(--tw-shadow-color,var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-\[0_0_0_4px_color-mix\(in_srgb\,var\(--primary\)_18\%\,transparent\)\]{--tw-shadow:0 0 0 4px var(--tw-shadow-color,color-mix(in srgb,var(--primary) 18%,transparent))}}.shadow-\[0_0_0_4px_color-mix\(in_srgb\,var\(--primary\)_18\%\,transparent\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_2px_8px_color-mix\(in_srgb\,var\(--primary\)_18\%\,transparent\)\]{--tw-shadow:0 2px 8px var(--tw-shadow-color,var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-\[0_2px_8px_color-mix\(in_srgb\,var\(--primary\)_18\%\,transparent\)\]{--tw-shadow:0 2px 8px var(--tw-shadow-color,color-mix(in srgb,var(--primary) 18%,transparent))}}.shadow-\[0_2px_8px_color-mix\(in_srgb\,var\(--primary\)_18\%\,transparent\)\],.shadow-\[0_2px_8px_rgba\(0\,0\,0\,0\.015\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_2px_8px_rgba\(0\,0\,0\,0\.015\)\]{--tw-shadow:0 2px 8px var(--tw-shadow-color,#00000004)}.shadow-\[0_4px_14px_rgba\(0\,0\,0\,0\.06\)\,0_1px_3px_rgba\(0\,0\,0\,0\.03\)\]{--tw-shadow:0 4px 14px var(--tw-shadow-color,#0000000f), 0 1px 3px var(--tw-shadow-color,#00000008);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_4px_16px_rgba\(0\,0\,0\,0\.02\)\,0_1px_4px_rgba\(0\,0\,0\,0\.01\)\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#00000005), 0 1px 4px var(--tw-shadow-color,#00000003)}.shadow-\[0_4px_16px_rgba\(0\,0\,0\,0\.02\)\,0_1px_4px_rgba\(0\,0\,0\,0\.01\)\],.shadow-\[0_8px_24px_rgba\(0\,0\,0\,0\.14\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_8px_24px_rgba\(0\,0\,0\,0\.14\)\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#00000024)}.shadow-\[0_8px_30px_rgba\(0\,0\,0\,0\.08\)\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#00000014)}.shadow-\[0_12px_32px_rgba\(0\,0\,0\,0\.03\)\,0_2px_8px_rgba\(0\,0\,0\,0\.01\)\],.shadow-\[0_8px_30px_rgba\(0\,0\,0\,0\.08\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_12px_32px_rgba\(0\,0\,0\,0\.03\)\,0_2px_8px_rgba\(0\,0\,0\,0\.01\)\]{--tw-shadow:0 12px 32px var(--tw-shadow-color,#00000008), 0 2px 8px var(--tw-shadow-color,#00000003)}.shadow-\[0_12px_36px_rgba\(0\,0\,0\,0\.14\)\]{--tw-shadow:0 12px 36px var(--tw-shadow-color,#00000024)}.shadow-\[0_12px_36px_rgba\(0\,0\,0\,0\.14\)\],.shadow-\[0_12px_40px_rgba\(0\,0\,0\,0\.14\)\,0_2px_6px_rgba\(0\,0\,0\,0\.04\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_12px_40px_rgba\(0\,0\,0\,0\.14\)\,0_2px_6px_rgba\(0\,0\,0\,0\.04\)\]{--tw-shadow:0 12px 40px var(--tw-shadow-color,#00000024), 0 2px 6px var(--tw-shadow-color,#0000000a)}.shadow-\[0_12px_40px_rgba\(0\,0\,0\,0\.14\)\]{--tw-shadow:0 12px 40px var(--tw-shadow-color,#00000024)}.shadow-\[0_12px_40px_rgba\(0\,0\,0\,0\.14\)\],.shadow-\[0_16px_40px_rgba\(0\,0\,0\,0\.2\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_16px_40px_rgba\(0\,0\,0\,0\.2\)\]{--tw-shadow:0 16px 40px var(--tw-shadow-color,#0003)}.shadow-\[0_16px_48px_rgba\(0\,0\,0\,0\.22\)\]{--tw-shadow:0 16px 48px var(--tw-shadow-color,#00000038)}.shadow-\[0_16px_48px_rgba\(0\,0\,0\,0\.22\)\],.shadow-\[0_20px_50px_rgba\(0\,0\,0\,0\.2\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_20px_50px_rgba\(0\,0\,0\,0\.2\)\]{--tw-shadow:0 20px 50px var(--tw-shadow-color,#0003)}.shadow-\[0_20px_60px_rgba\(0\,0\,0\,0\.24\)\]{--tw-shadow:0 20px 60px var(--tw-shadow-color,#0000003d)}.shadow-\[0_20px_60px_rgba\(0\,0\,0\,0\.24\)\],.shadow-lg{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a)}.shadow-md,.shadow-none{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.shadow-sm,.shadow-xl{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.ring-1,.ring-2{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.ring-background{--tw-ring-color:var(--color-background)}.ring-primary,.ring-primary\/15{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.ring-primary\/15{--tw-ring-color:color-mix(in oklab, var(--color-primary) 15%, transparent)}}.ring-primary\/40{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.ring-primary\/40{--tw-ring-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px)}.blur,.blur-\[1\.5px\]{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-\[1\.5px\]{--tw-blur:blur(1.5px)}.blur-\[1px\]{--tw-blur:blur(1px)}.blur-\[1px\],.blur-\[2\.5px\]{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-\[2\.5px\]{--tw-blur:blur(2.5px)}.blur-\[2px\]{--tw-blur:blur(2px)}.blur-\[2px\],.blur-\[3px\]{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-\[3px\]{--tw-blur:blur(3px)}.blur-md{--tw-blur:blur(var(--blur-md))}.blur-md,.blur-none{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-none{--tw-blur:}.blur-sm{--tw-blur:blur(var(--blur-sm))}.blur-sm,.grayscale{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%)}.grayscale-0{--tw-grayscale:grayscale(0%)}.filter,.grayscale-0{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[1\.5px\]{--tw-backdrop-blur:blur(1.5px)}.backdrop-blur-\[1\.5px\],.backdrop-blur-\[1px\]{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-\[1px\]{--tw-backdrop-blur:blur(1px)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg))}.backdrop-blur-lg,.backdrop-blur-md{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md))}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm))}.backdrop-blur-sm,.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events}.transition,.transition-all{transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to}.transition-colors,.transition-opacity{transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.ease-smooth{--tw-ease:var(--ease-smooth);transition-timing-function:var(--ease-smooth)}.ease-spring{--tw-ease:var(--ease-spring);transition-timing-function:var(--ease-spring)}.ease-swift{--tw-ease:var(--ease-swift);transition-timing-function:var(--ease-swift)}.will-change-\[border-radius\,width\]{will-change:border-radius,width}.will-change-\[border-radius\]{will-change:border-radius}.will-change-\[opacity\]{will-change:opacity}.will-change-\[transform\,opacity\,filter\]{will-change:transform,opacity,filter}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}.ring-inset{--tw-ring-inset:inset}.group-last\:hidden:is(:where(.group):last-child *){display:none}@media (hover:hover){.group-hover\:scale-125:is(:where(.group):hover *){--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.peer-focus-visible\:outline-2:is(:where(.peer):focus-visible~*){outline-style:var(--tw-outline-style);outline-width:2px}.peer-focus-visible\:outline-offset-2:is(:where(.peer):focus-visible~*){outline-offset:2px}.peer-focus-visible\:outline-ring:is(:where(.peer):focus-visible~*){outline-color:var(--color-ring)}.placeholder\:text-muted-foreground\/60::placeholder{color:var(--color-muted-foreground)}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-muted-foreground\/60::placeholder{color:color-mix(in oklab,var(--color-muted-foreground) 60%,transparent)}}.first\:rounded-l-base:first-child{border-top-left-radius:var(--radius-base);border-bottom-left-radius:var(--radius-base)}.last\:rounded-r-base:last-child{border-top-right-radius:var(--radius-base);border-bottom-right-radius:var(--radius-base)}.focus-within\:scale-\[1\.03\]:focus-within{scale:1.03}.focus-within\:border-primary:focus-within{border-color:var(--color-primary)}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-destructive\/20:focus-within{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.focus-within\:ring-destructive\/20:focus-within{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.focus-within\:ring-primary\/15:focus-within{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.focus-within\:ring-primary\/15:focus-within{--tw-ring-color:color-mix(in oklab, var(--color-primary) 15%, transparent)}}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.006\]:hover{scale:1.006}.hover\:border-border:hover,.hover\:border-border\/80:hover{border-color:var(--color-border)}@supports (color:color-mix(in lab,red,red)){.hover\:border-border\/80:hover{border-color:color-mix(in oklab,var(--color-border) 80%,transparent)}}.hover\:border-destructive\/60:hover{border-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:border-destructive\/60:hover{border-color:color-mix(in oklab,var(--color-destructive) 60%,transparent)}}.hover\:border-primary\/40:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,var(--color-primary) 40%,transparent)}}.hover\:border-primary\/60:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/60:hover{border-color:color-mix(in oklab,var(--color-primary) 60%,transparent)}}.hover\:bg-background\/80:hover{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/80:hover{background-color:color-mix(in oklab,var(--color-background) 80%,transparent)}}.hover\:bg-background\/90:hover{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/90:hover{background-color:color-mix(in oklab,var(--color-background) 90%,transparent)}}.hover\:bg-black\/10:hover{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/10:hover{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.hover\:bg-destructive\/10:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab,var(--color-destructive) 10%,transparent)}}.hover\:bg-destructive\/20:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,var(--color-destructive) 20%,transparent)}}.hover\:bg-foreground\/50:hover{background-color:var(--color-foreground)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-foreground\/50:hover{background-color:color-mix(in oklab,var(--color-foreground) 50%,transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/30:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/30:hover{background-color:color-mix(in oklab,var(--color-muted) 30%,transparent)}}.hover\:bg-muted\/40:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab,var(--color-muted) 40%,transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.hover\:bg-muted\/60:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/60:hover{background-color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}.hover\:bg-muted\/70:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/70:hover{background-color:color-mix(in oklab,var(--color-muted) 70%,transparent)}}.hover\:bg-muted\/80:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/80:hover{background-color:color-mix(in oklab,var(--color-muted) 80%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--color-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--color-secondary) 80%,transparent)}}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:text-destructive:hover{color:var(--color-destructive)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-primary:hover,.hover\:text-primary\/80:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,var(--color-primary) 80%,transparent)}}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-\[0_16px_36px_rgba\(0\,0\,0\,0\.04\)\,0_2px_12px_rgba\(0\,0\,0\,0\.01\)\]:hover{--tw-shadow:0 16px 36px var(--tw-shadow-color,#0000000a), 0 2px 12px var(--tw-shadow-color,#00000003)}.hover\:ring-2:hover,.hover\:shadow-\[0_16px_36px_rgba\(0\,0\,0\,0\.04\)\,0_2px_12px_rgba\(0\,0\,0\,0\.01\)\]:hover{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-2:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)}.hover\:ring-foreground\/20:hover{--tw-ring-color:var(--color-foreground)}@supports (color:color-mix(in lab,red,red)){.hover\:ring-foreground\/20:hover{--tw-ring-color:color-mix(in oklab, var(--color-foreground) 20%, transparent)}}.hover\:ring-offset-1:hover{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-primary\/20:focus-visible{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-primary\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--color-ring)}.active\:scale-90:active{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-\[0\.9\]:active{scale:.9}.active\:scale-\[0\.96\]:active{scale:.96}.active\:scale-\[0\.97\]:active{scale:.97}.active\:scale-\[0\.98\]:active{scale:.98}.active\:scale-\[0\.993\]:active{scale:.993}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-muted\/80:active{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.active\:bg-muted\/80:active{background-color:color-mix(in oklab,var(--color-muted) 80%,transparent)}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}@supports ((-webkit-backdrop-filter:var(--tw )) or (backdrop-filter:var(--tw ))){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:color-mix(in oklab,var(--color-background) 60%,transparent)}}}@media (width>=40rem){.sm\:right-6{right:calc(var(--spacing)*6)}.sm\:left-6{left:calc(var(--spacing)*6)}.sm\:left-auto{left:auto}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-\[360px\]{max-width:360px}.sm\:max-w-md{max-width:var(--container-md)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:max-w-xl{max-width:var(--container-xl)}.sm\:max-w-xs{max-width:var(--container-xs)}.sm\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:p-5{padding:calc(var(--spacing)*5)}.sm\:px-5{padding-inline:calc(var(--spacing)*5)}.sm\:py-3\.5{padding-block:calc(var(--spacing)*3.5)}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}@media (width>=48rem){.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}@media (prefers-color-scheme:dark){.dark\:border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}}.dark\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}@media (prefers-color-scheme:dark){.dark\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}}.dark\:border-white\/10:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/10:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-\[\#161b22\]{background-color:#161b22}}.dark\:bg-\[\#161b22\]:where(.dark,.dark *){background-color:#161b22}@media (prefers-color-scheme:dark){.dark\:bg-background\/10{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/10{background-color:color-mix(in oklab,var(--color-background) 10%,transparent)}}}.dark\:bg-background\/10:where(.dark,.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-background) 10%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-background\/15{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/15{background-color:color-mix(in oklab,var(--color-background) 15%,transparent)}}}.dark\:bg-background\/15:where(.dark,.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/15:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-background) 15%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-background\/30{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/30{background-color:color-mix(in oklab,var(--color-background) 30%,transparent)}}}.dark\:bg-background\/30:where(.dark,.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-background) 30%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-background\/40{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/40{background-color:color-mix(in oklab,var(--color-background) 40%,transparent)}}}.dark\:bg-background\/40:where(.dark,.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-background) 40%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-background\/50{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/50{background-color:color-mix(in oklab,var(--color-background) 50%,transparent)}}}.dark\:bg-background\/50:where(.dark,.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-background) 50%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-background\/60{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/60{background-color:color-mix(in oklab,var(--color-background) 60%,transparent)}}}.dark\:bg-background\/60:where(.dark,.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/60:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-background) 60%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-background\/70{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/70{background-color:color-mix(in oklab,var(--color-background) 70%,transparent)}}}.dark\:bg-background\/70:where(.dark,.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/70:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-background) 70%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-background\/80{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/80{background-color:color-mix(in oklab,var(--color-background) 80%,transparent)}}}.dark\:bg-background\/80:where(.dark,.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-background\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-background) 80%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-muted\/25{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-muted\/25{background-color:color-mix(in oklab,var(--color-muted) 25%,transparent)}}}.dark\:bg-muted\/25:where(.dark,.dark *){background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-muted\/25:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-muted) 25%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-muted\/50{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-muted\/50{background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}}.dark\:bg-muted\/50:where(.dark,.dark *){background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-muted\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-primary\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}}.dark\:bg-primary\/10:where(.dark,.dark *){background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-primary\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-zinc-50{background-color:var(--color-zinc-50)}}.dark\:bg-zinc-50:where(.dark,.dark *){background-color:var(--color-zinc-50)}@media (prefers-color-scheme:dark){.dark\:text-zinc-900{color:var(--color-zinc-900)}}.dark\:text-zinc-900:where(.dark,.dark *){color:var(--color-zinc-900)}@media (prefers-color-scheme:dark){.dark\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.dark\:shadow-none:where(.dark,.dark *){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media (prefers-color-scheme:dark){@media (hover:hover){.dark\:hover\:bg-destructive\/20:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,var(--color-destructive) 20%,transparent)}}}}@media (hover:hover){.dark\:hover\:bg-destructive\/20:where(.dark,.dark *):hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-destructive\/20:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-destructive) 20%,transparent)}}}@media (prefers-color-scheme:dark){@media (hover:hover){.dark\:hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}}}@media (hover:hover){.dark\:hover\:bg-white\/20:where(.dark,.dark *):hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/20:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}}@media (prefers-color-scheme:dark){@media (hover:hover){.dark\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}}@media (hover:hover){.dark\:hover\:shadow-none:where(.dark,.dark *):hover{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.\[\&_button\:not\(\:first-child\)\]\:-ml-px button:not(:first-child){margin-left:-1px}}@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{inset-block:0}.-top-40{top:calc(var(--spacing)*-40)}.top-0{top:0}.top-1\/2{top:50%}.right-1\/4{right:25%}.right-2{right:calc(var(--spacing)*2)}.-bottom-40{bottom:calc(var(--spacing)*-40)}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:calc(var(--spacing)*3)}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:var(--spacing)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-6{margin-top:calc(var(--spacing)*6)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-80{height:calc(var(--spacing)*80)}.h-96{height:calc(var(--spacing)*96)}.h-\[88px\]{height:88px}.max-h-\[420px\]{max-height:420px}.min-h-screen{min-height:100vh}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-12{width:calc(var(--spacing)*12)}.w-32{width:calc(var(--spacing)*32)}.w-60{width:calc(var(--spacing)*60)}.w-64{width:calc(var(--spacing)*64)}.w-80{width:calc(var(--spacing)*80)}.w-96{width:calc(var(--spacing)*96)}.w-full{width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-x-full{translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%}.translate-x-0{--tw-translate-x:0px}.-translate-y-1\/2,.translate-x-0{translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:-50%}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*1.5*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*1.5*(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*4*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*4*(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing)*5*var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing)*5*(1 - var(--tw-space-y-reverse)))}.gap-x-6{-moz-column-gap:calc(var(--spacing)*6);column-gap:calc(var(--spacing)*6)}.gap-y-1{row-gap:var(--spacing)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.border-destructive\/40{border-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/40{border-color:color-mix(in oklab,var(--color-destructive) 40%,transparent)}}.\!bg-muted{background-color:var(--color-muted)!important}.bg-background,.bg-background\/80{background-color:var(--color-background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--color-background) 80%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-destructive\/10{background-color:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--color-destructive) 10%,transparent)}}.bg-muted\/40{background-color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,var(--color-muted) 40%,transparent)}}.bg-primary,.bg-primary\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-primary\/20{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/20{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-1{padding-inline:var(--spacing)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-4{padding-block:calc(var(--spacing)*4)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-6{padding-top:calc(var(--spacing)*6)}.pr-9{padding-right:calc(var(--spacing)*9)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pl-9{padding-left:calc(var(--spacing)*9)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-foreground{color:var(--color-foreground)!important}.text-destructive{color:var(--color-destructive)}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-warning{color:var(--color-warning)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a)}.shadow-lg,.shadow-xl{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a)}.shadow-primary\/20{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-primary) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md))}.backdrop-blur-md,.backdrop-blur-sm{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm))}.transition-all{transition-property:all}.transition-all,.transition-colors{transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing)*-.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:text-foreground:hover{color:var(--color-foreground)}}.focus\:border-ring:focus{border-color:var(--color-ring)}@media (width>=40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr_auto_1fr_1fr_auto\]{grid-template-columns:1fr auto 1fr 1fr auto}.sm\:p-6{padding:calc(var(--spacing)*6)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}}@media (width>=64rem){.lg\:static{position:static}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}}@media (width>=80rem){.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}:root{--background:#fff;--foreground:#09090b;--primary:#18181b;--primary-foreground:#fafafa;--secondary:#f4f4f5;--secondary-foreground:#18181b;--muted:#f4f4f5;--muted-foreground:#71717a;--accent:#f4f4f5;--accent-foreground:#18181b;--destructive:#ef4444;--destructive-foreground:#fafafa;--success:#10b981;--success-foreground:#fafafa;--warning:#f59e0b;--warning-foreground:#18181b;--border:#e4e4e7;--input:#e4e4e7;--ring:#18181b;--radius:.5rem;--duration-fast:.15s;--duration-base:.25s;--duration-slow:.3s;--duration-slower:.4s;--duration-enter:.7s;--dark-background:#000;--dark-foreground:#fafafa;--dark-primary:#fafafa;--dark-primary-foreground:#18181b;--dark-secondary:#27272a;--dark-secondary-foreground:#fafafa;--dark-muted:#27272a;--dark-muted-foreground:#a1a1aa;--dark-accent:#27272a;--dark-accent-foreground:#fafafa;--dark-destructive:#7f1d1d;--dark-destructive-foreground:#fafafa;--dark-success:#059669;--dark-success-foreground:#fafafa;--dark-warning:#d97706;--dark-warning-foreground:#fff;--dark-border:#27272a;--dark-input:#27272a;--dark-ring:#d4d4d8}@media (prefers-color-scheme:dark){:root{--background:var(--dark-background);--foreground:var(--dark-foreground);--primary:var(--dark-primary);--primary-foreground:var(--dark-primary-foreground);--secondary:var(--dark-secondary);--secondary-foreground:var(--dark-secondary-foreground);--muted:var(--dark-muted);--muted-foreground:var(--dark-muted-foreground);--accent:var(--dark-accent);--accent-foreground:var(--dark-accent-foreground);--destructive:var(--dark-destructive);--destructive-foreground:var(--dark-destructive-foreground);--success:var(--dark-success);--success-foreground:var(--dark-success-foreground);--warning:var(--dark-warning);--warning-foreground:var(--dark-warning-foreground);--border:var(--dark-border);--input:var(--dark-input);--ring:var(--dark-ring)}}.dark{--background:var(--dark-background);--foreground:var(--dark-foreground);--primary:var(--dark-primary);--primary-foreground:var(--dark-primary-foreground);--secondary:var(--dark-secondary);--secondary-foreground:var(--dark-secondary-foreground);--muted:var(--dark-muted);--muted-foreground:var(--dark-muted-foreground);--accent:var(--dark-accent);--accent-foreground:var(--dark-accent-foreground);--destructive:var(--dark-destructive);--destructive-foreground:var(--dark-destructive-foreground);--success:var(--dark-success);--success-foreground:var(--dark-success-foreground);--warning:var(--dark-warning);--warning-foreground:var(--dark-warning-foreground);--border:var(--dark-border);--input:var(--dark-input);--ring:var(--dark-ring)}@keyframes kineticShimmer{0%{transform:translate(-100%)}45%{transform:translate(100%)}to{transform:translate(100%)}}.animate-kinetic-shimmer{animation:1.8s cubic-bezier(.85,0,.15,1) infinite kineticShimmer}.scrollbar-none::-webkit-scrollbar{display:none}.scrollbar-none{-ms-overflow-style:none;scrollbar-width:none}@keyframes fuxstoTextShimmer{0%{background-position:100% 0}to{background-position:-100% 0}}.fuxsto-text-shimmer{-webkit-text-fill-color:transparent;transition:color var(--duration-slower) ease,-webkit-text-fill-color var(--duration-slower) ease;background-image:linear-gradient(90deg,#8080804d,#808080b3 50%,#8080804d);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;animation:1.4s ease-in-out infinite fuxstoTextShimmer;color:#0000!important}.fuxsto-streaming-outer{display:inline-block;overflow:hidden}.fuxsto-streaming-inner{align-items:baseline;line-height:1.5;display:inline-flex}.fuxsto-text-row{white-space:nowrap;isolation:isolate;align-items:baseline;display:inline-flex;position:relative}.fuxsto-text-cell{white-space:nowrap;vertical-align:baseline;will-change:width;width:auto;line-height:1.5;display:inline-block;overflow:hidden}.fuxsto-text-stable{width:auto;overflow:visible}.dot-pop-enter-active{transition:all var(--duration-slow) var(--ease-spring)}.dot-pop-leave-active{transition:all .2s ease-in}.dot-pop-enter-from,.dot-pop-leave-to{opacity:0;filter:blur(4px);transform:scale(.2)}.badge-pop-enter-active,.badge-pop-leave-active{transition:opacity var(--duration-slow) var(--ease-swift),transform var(--duration-slow) var(--ease-swift),filter var(--duration-slow) var(--ease-swift)}.badge-pop-enter-from,.badge-pop-leave-to{opacity:0;filter:blur(8px);transform:scale(.3)}.dropdown-enter-active,.dropdown-leave-active{transition:opacity var(--duration-slower) var(--ease-swift),transform var(--duration-slower) var(--ease-swift),filter var(--duration-slower) var(--ease-swift);transform-origin:0 0}.dropdown-enter-from,.dropdown-leave-to{opacity:0;filter:blur(16px);transform:scale(0)}.-webkit-touch-callout-none{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}@keyframes rowFade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.animate-row-fade{animation:rowFade var(--duration-slow) var(--ease-swift) both;animation-delay:var(--row-delay,0s)}.chevron-enter-active,.chevron-leave-active{transition:all var(--duration-base) var(--ease-smooth)}.chevron-enter-from,.chevron-leave-to{opacity:0;transform:scale(.5)}.slide-forward-enter-active,.slide-forward-leave-active{transition:all var(--duration-slow) var(--ease-swift)}.slide-forward-enter-from{opacity:0;transform:translate(12px)}.slide-forward-leave-to{opacity:0;transform:translate(-12px)}.slide-backward-enter-active,.slide-backward-leave-active{transition:all var(--duration-slow) var(--ease-swift)}.slide-backward-enter-from{opacity:0;transform:translate(-12px)}.slide-backward-leave-to{opacity:0;transform:translate(12px)}@keyframes progressStripe{0%{background-position:1rem 0}to{background-position:0 0}}.animate-progress-stripe{animation:1s linear infinite progressStripe}.dialog-mask-enter-active,.dialog-mask-leave-active{transition:opacity var(--duration-slower) var(--ease-swift)}.dialog-mask-enter-from,.dialog-mask-leave-to{opacity:0}.dialog-pop-enter-active,.dialog-pop-leave-active{transition:opacity var(--duration-slower) var(--ease-swift),transform var(--duration-slower) var(--ease-swift),filter var(--duration-slower) var(--ease-swift)}.dialog-pop-enter-from,.dialog-pop-leave-to{opacity:0;filter:blur(16px);transform:scale(.92)}.drawer-mask-enter-active,.drawer-mask-leave-active{transition:opacity var(--duration-slower) var(--ease-swift)}.drawer-mask-enter-from,.drawer-mask-leave-to{opacity:0}.drawer-bottom-enter-active,.drawer-bottom-leave-active,.drawer-left-enter-active,.drawer-left-leave-active,.drawer-right-enter-active,.drawer-right-leave-active,.drawer-top-enter-active,.drawer-top-leave-active{transition:all var(--duration-slower) var(--ease-swift)}.drawer-right-enter-from,.drawer-right-leave-to{transform:translate(100%);box-shadow:0 20px 60px #0000}.drawer-left-enter-from,.drawer-left-leave-to{transform:translate(-100%);box-shadow:0 20px 60px #0000}.drawer-top-enter-from,.drawer-top-leave-to{transform:translateY(-100%);box-shadow:0 20px 60px #0000}.drawer-bottom-enter-from,.drawer-bottom-leave-to{transform:translateY(100%);box-shadow:0 20px 60px #0000}@keyframes tipPop{0%{opacity:0;filter:blur(4px);transform:scale(.85)}to{opacity:1;filter:blur();transform:scale(1)}}.animate-tip-pop{animation:tipPop var(--duration-slow) var(--ease-swift) forwards}.message-flip-enter-active,.message-flip-leave-active,.message-flip-move{transition:all var(--duration-slower) var(--ease-swift)}.message-flip-enter-from{opacity:0;filter:blur(15px);transform:translateY(-20px)scale(.5)}.message-flip-leave-to{opacity:0;filter:blur(10px);transform:translateY(-15px)scale(0)}.message-flip-leave-active{position:absolute}.pop-enter-active{transition:all var(--duration-slow) var(--ease-spring)}.pop-leave-active{transition:all .15s ease-in;position:absolute}.pop-enter-from{opacity:0;transform:scale(.3)translateY(4px)}.pop-leave-to{opacity:0;transform:scale(.8)}.notif-flip-right-enter-active,.notif-flip-right-leave-active,.notif-flip-right-move{transition:all var(--duration-slower) var(--ease-swift)}.notif-flip-right-enter-from{opacity:0;filter:blur(8px);transform:translate(40px)scale(.95)}.notif-flip-right-leave-to{opacity:0;filter:blur(4px);transform:translate(20px)scale(.95)}.notif-flip-right-leave-active{position:absolute}.notif-flip-left-enter-active,.notif-flip-left-leave-active,.notif-flip-left-move{transition:all var(--duration-slower) var(--ease-swift)}.notif-flip-left-enter-from{opacity:0;filter:blur(8px);transform:translate(-40px)scale(.95)}.notif-flip-left-leave-to{opacity:0;filter:blur(4px);transform:translate(-20px)scale(.95)}.notif-flip-left-leave-active{position:absolute}.notif-flip-top-enter-active,.notif-flip-top-leave-active,.notif-flip-top-move{transition:all var(--duration-slower) var(--ease-swift)}.notif-flip-top-enter-from{opacity:0;filter:blur(8px);transform:translateY(-40px)scale(.95)}.notif-flip-top-leave-to{opacity:0;filter:blur(4px);transform:translateY(-20px)scale(.95)}.notif-flip-top-leave-active{position:absolute}.notif-flip-bottom-enter-active,.notif-flip-bottom-leave-active,.notif-flip-bottom-move{transition:all var(--duration-slower) var(--ease-swift)}.notif-flip-bottom-enter-from{opacity:0;filter:blur(8px);transform:translateY(40px)scale(.95)}.notif-flip-bottom-leave-to{opacity:0;filter:blur(4px);transform:translateY(20px)scale(.95)}.notif-flip-bottom-leave-active{position:absolute}.popconfirm-scale-enter-active,.popconfirm-scale-leave-active{transition:opacity var(--duration-slower) var(--ease-swift),transform var(--duration-slower) var(--ease-swift),filter var(--duration-slower) var(--ease-swift)}.popconfirm-scale-enter-from,.popconfirm-scale-leave-to{opacity:0;filter:blur(10px);transform:scale(.9)}.tooltip-fade-enter-active,.tooltip-fade-leave-active{transition:opacity var(--duration-slower) var(--ease-swift),transform var(--duration-slower) var(--ease-swift),filter var(--duration-slower) var(--ease-swift)}.tooltip-fade-enter-from,.tooltip-fade-leave-to{opacity:0;filter:blur(8px);transform:scale(.88)}.icon-pop-enter-active,.icon-pop-leave-active{transition:all .22s var(--ease-spring)}.icon-pop-enter-from,.icon-pop-leave-to{opacity:0;transform:scale(.4)rotate(-45deg)}.icon-flip-enter-active,.icon-flip-leave-active{transition:all .2s var(--ease-swift)}.icon-flip-enter-from{opacity:0;transform:scale(.5)rotate(45deg)}.icon-flip-leave-to{opacity:0;transform:scale(.5)rotate(-45deg)}@keyframes shake{0%,to{transform:translate(0)}20%,60%{transform:translate(-4px)}40%,80%{transform:translate(4px)}}.animate-shake{animation:shake var(--duration-slow) cubic-bezier(.36,.07,.19,.97) both}.expand-error-enter-active,.expand-error-leave-active{transition:all var(--duration-slow) var(--ease-swift);max-height:30px;overflow:hidden}.expand-error-enter-from,.expand-error-leave-to{opacity:0;max-height:0;transform:translateY(-4px)}.backtop-fade-enter-active,.backtop-fade-leave-active{transition:opacity var(--duration-slower) var(--ease-swift),filter var(--duration-slower) var(--ease-swift)}.backtop-fade-enter-from,.backtop-fade-leave-to{opacity:0;filter:blur(12px)}.alert-expand-enter-active,.alert-expand-leave-active{transition:all var(--duration-slower) var(--ease-swift);overflow:hidden}.alert-expand-enter-from,.alert-expand-leave-to{opacity:0;max-height:0;transform:translateY(-4px)}.alert-icon-pop-enter-active,.alert-icon-pop-leave-active{transition:all var(--duration-slow) var(--ease-spring)}.alert-icon-pop-enter-from,.alert-icon-pop-leave-to{opacity:0;transform:scale(.4)}.calendar-cell-pop-enter-active,.calendar-cell-pop-leave-active{transition:all .2s var(--ease-spring)}.calendar-cell-pop-enter-from,.calendar-cell-pop-leave-to{opacity:0;transform:scale(.6)}.calendar-panel-enter-active{animation:calendarPanelIn .32s var(--ease-swift)}@keyframes calendarPanelIn{0%{opacity:0;transform:rotateX(12deg)translateY(-4px)scale(.97)}to{opacity:1;transform:rotateX(0)translateY(0)scale(1)}}@keyframes calendarMonthInRight{0%{opacity:0;transform:translate(28px)}to{opacity:1;transform:translate(0)}}@keyframes calendarMonthInLeft{0%{opacity:0;transform:translate(-28px)}to{opacity:1;transform:translate(0)}}.calendar-view-enter-right{animation:calendarMonthInRight .32s var(--ease-swift)}.calendar-view-enter-left{animation:calendarMonthInLeft .32s var(--ease-swift)}.time-option-in-enter-active{transition:all var(--duration-base) var(--ease-swift)}.time-option-in-enter-from{opacity:0;transform:translateY(6px)}.cascader-col-enter-active,.cascader-col-leave-active{transition:opacity var(--duration-slow) var(--ease-swift),transform var(--duration-slow) var(--ease-swift)}.cascader-col-enter-from{opacity:0;transform:translate(10px)}.cascader-col-leave-to{opacity:0;transform:translate(-10px)}.animate-cascader-col{animation:cascaderColIn .28s var(--ease-swift) both}@keyframes cascaderColIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.upload-drag-active{animation:1.4s ease-in-out infinite uploadBreath}@keyframes uploadBreath{0%,to{border-color:rgb(var(--ring-rgb,24,24,27));box-shadow:0 0 #18181b00}50%{border-color:rgb(var(--ring-rgb,24,24,27));box-shadow:0 0 0 6px #18181b1f}}.upload-flip-enter-active,.upload-flip-leave-active,.upload-flip-move{transition:all var(--duration-slow) var(--ease-swift)}.upload-flip-enter-from{opacity:0;transform:translateY(-10px)scale(.95)}.upload-flip-leave-to{opacity:0;transform:translateY(8px)scale(.92)}.upload-flip-leave-active{position:absolute}.slider-thumb-active{transform:scale(1.18)}.slider-thumb-pop{transition:transform .2s var(--ease-spring)}.slider-bubble-enter-active{transition:all .22s var(--ease-swift)}.slider-bubble-leave-active{transition:all .18s var(--ease-swift)}.slider-bubble-enter-from,.slider-bubble-leave-to{opacity:0;filter:blur(4px);transform:translate(-50%)scale(.6)}.rate-star-pop{animation:rateStarPop var(--duration-slow) var(--ease-spring) both}@keyframes rateStarPop{0%{transform:scale(.4)}60%{transform:scale(1.2)}to{transform:scale(1)}}.carousel-slide-enter-active,.carousel-slide-leave-active{transition:all .5s var(--ease-swift)}.carousel-slide-enter-from{opacity:0;transform:translate(40px)}.carousel-slide-leave-to{opacity:0;transform:translate(-40px)}.carousel-fade-enter-active,.carousel-fade-leave-active{transition:opacity .6s}.carousel-fade-enter-from,.carousel-fade-leave-to{opacity:0}.carousel-dot-active{background-color:var(--primary);transform:scale(1.2)}.carousel-arrow-enter-active,.carousel-arrow-leave-active{transition:opacity var(--duration-slow) var(--ease-swift),transform var(--duration-slow) var(--ease-swift),filter var(--duration-slow) var(--ease-swift)}.carousel-arrow-enter-from,.carousel-arrow-leave-to{opacity:0;filter:blur(6px);transform:translateY(-50%)scale(.9)}.image-mask-enter-active,.image-mask-leave-active{transition:opacity var(--duration-slower) var(--ease-swift)}.image-mask-enter-from,.image-mask-leave-to{opacity:0}.image-zoom-enter-active,.image-zoom-leave-active{transition:opacity .45s var(--ease-swift),transform .45s var(--ease-swift)}.image-zoom-enter-from,.image-zoom-leave-to{opacity:0;transform:scale(.92)}.image-toolbar-enter-active,.image-toolbar-leave-active{transition:opacity var(--duration-slow) var(--ease-swift),transform var(--duration-slow) var(--ease-swift),filter var(--duration-slow) var(--ease-swift)}.image-toolbar-enter-from,.image-toolbar-leave-to{opacity:0;filter:blur(8px);transform:translate(-50%,18px)scale(.85)}.transfer-flip-move{transition:transform .36s var(--ease-swift)}.transfer-flip-enter-active{transition:opacity .32s var(--ease-swift),transform .32s var(--ease-swift)}.transfer-flip-leave-active{width:100%;transition:opacity .28s var(--ease-swift),transform .28s var(--ease-swift),height .28s var(--ease-swift);will-change:height;position:absolute;overflow:hidden}.transfer-flip-enter-from{opacity:0;transform:translate(20px)scale(.94)}.transfer-flip-leave-to{opacity:0;height:0;transform:translate(-20px)scale(.94)}.tour-mask-enter-active,.tour-mask-leave-active{transition:opacity .45s var(--ease-swift)}.tour-mask-enter-from,.tour-mask-leave-to{opacity:0}.tour-step-enter-active,.tour-step-leave-active{transition:opacity var(--duration-slower) var(--ease-swift),transform var(--duration-slower) var(--ease-swift)}.tour-step-enter-from,.tour-step-leave-to{opacity:0;transform:translateY(12px)scale(.9)}.color-panel-enter-active{animation:colorPanelIn .32s var(--ease-swift)}@keyframes colorPanelIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.color-swatch-pop{animation:colorSwatchPop var(--duration-base) var(--ease-spring) both}@keyframes colorSwatchPop{0%{transform:scale(.6)}to{transform:scale(1)}}.tree-rows-transition{transition:grid-template-rows .32s var(--ease-swift);grid-template-rows:0fr;display:grid}.tree-rows-transition.is-open{grid-template-rows:1fr}.tree-rows-inner{min-height:0;overflow:hidden}.tree-node-item{animation:treeNodeIn .28s var(--ease-swift) both}@keyframes treeNodeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.count-flip-enter-active,.count-flip-leave-active{transition:all .32s var(--ease-swift)}.count-flip-enter-from{opacity:0;filter:blur(8px);transform:translateY(-12px)scale(.86)}.count-flip-leave-to{opacity:0;filter:blur(8px);transform:translateY(12px)scale(.86)}.copy-flip-enter-active,.copy-flip-leave-active,.copy-icon-flip-enter-active,.copy-icon-flip-leave-active{transition:opacity .28s var(--ease-swift),transform .32s var(--ease-spring),filter .28s var(--ease-swift)}.copy-flip-enter-from,.copy-icon-flip-enter-from{opacity:0;filter:blur(4px);transform:scale(.4)rotate(-90deg)}.copy-flip-leave-to,.copy-icon-flip-leave-to{opacity:0;filter:blur(4px);transform:scale(.4)rotate(90deg)}.anchor-item-active{color:var(--primary);font-weight:700}.anchor-item-enter-active{transition:color var(--duration-base) ease,padding-left var(--duration-base) ease}.fuxso-scroll::-webkit-scrollbar{width:8px;height:8px}.fuxso-scroll::-webkit-scrollbar-track{background:var(--scrollbar-track,#787882)}@supports (color:color-mix(in lab,red,red)){.fuxso-scroll::-webkit-scrollbar-track{background:color-mix(in srgb,var(--scrollbar-track,#787882) 5%,transparent)}}.fuxso-scroll::-webkit-scrollbar-track{border-radius:var(--radius)}.fuxso-scroll::-webkit-scrollbar-thumb{background:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.fuxso-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--muted-foreground) 30%,transparent)}}.fuxso-scroll::-webkit-scrollbar-thumb{border-radius:calc(var(--radius) - 2px)}.fuxso-scroll::-webkit-scrollbar-thumb:hover{background:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.fuxso-scroll::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--muted-foreground) 50%,transparent)}}.fuxso-scroll-thin::-webkit-scrollbar{width:5px;height:5px}.fuxso-scroll-thick::-webkit-scrollbar{width:12px;height:12px}.fuxso-scroll-autohide::-webkit-scrollbar-thumb{-webkit-transition:background-color var(--duration-slow);transition:background-color var(--duration-slow);background-color:#0000}.fuxso-scroll-autohide:hover::-webkit-scrollbar-thumb{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.fuxso-scroll-autohide:hover::-webkit-scrollbar-thumb{background-color:color-mix(in srgb,var(--muted-foreground) 30%,transparent)}}.fuxso-scroll-autohide:focus::-webkit-scrollbar-thumb{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.fuxso-scroll-autohide:focus::-webkit-scrollbar-thumb{background-color:color-mix(in srgb,var(--muted-foreground) 30%,transparent)}}.fuxso-scroll-autohide{scrollbar-color:transparent transparent}.fuxso-scroll-autohide:focus,.fuxso-scroll-autohide:hover{scrollbar-color:var(--muted-foreground) transparent}@supports (color:color-mix(in lab,red,red)){.fuxso-scroll-autohide:focus,.fuxso-scroll-autohide:hover{scrollbar-color:color-mix(in srgb,var(--muted-foreground) 30%,transparent) transparent}}.fuxso-scroll{scrollbar-width:thin;scrollbar-color:var(--muted-foreground) transparent}@supports (color:color-mix(in lab,red,red)){.fuxso-scroll{scrollbar-color:color-mix(in srgb,var(--muted-foreground) 30%,transparent) transparent}}@media (prefers-reduced-motion:reduce){*,:after,:before{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(1turn)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}tr.row-loading>td[data-v-f7880f7d]{position:relative}tr.row-loading>td[data-v-f7880f7d]:after{content:"";pointer-events:none;background-color:var(--background);position:absolute;inset:0}@supports (color:color-mix(in lab,red,red)){tr.row-loading>td[data-v-f7880f7d]:after{background-color:color-mix(in srgb,var(--background) 20%,transparent)}}tr.row-loading>td[data-v-f7880f7d]:after{-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);background-image:linear-gradient(90deg,transparent,var(--foreground),transparent)}@supports (color:color-mix(in lab,red,red)){tr.row-loading>td[data-v-f7880f7d]:after{background-image:linear-gradient(90deg,transparent,color-mix(in srgb,var(--foreground) 8%,transparent),transparent)}}tr.row-loading>td[data-v-f7880f7d]:after{background-repeat:no-repeat;background-size:200% 100%;animation:1.6s linear infinite table-row-shimmer-f7880f7d}@keyframes table-row-shimmer-f7880f7d{0%{background-position:100% 0}to{background-position:-100% 0}}.tour-mask-enter-active[data-v-172e255d]{transition:opacity .32s cubic-bezier(.16,1,.3,1)}.tour-mask-leave-active[data-v-172e255d]{transition:opacity .24s cubic-bezier(.16,1,.3,1)}.tour-mask-enter-from[data-v-172e255d],.tour-mask-leave-to[data-v-172e255d]{opacity:0}.tour-mask-enter-active .tour-highlight[data-v-172e255d]{transition:opacity .32s cubic-bezier(.16,1,.3,1),transform .32s cubic-bezier(.16,1,.3,1)}.tour-mask-enter-from .tour-highlight[data-v-172e255d]{opacity:0;transform:scale(.92)}.tour-step-enter-active[data-v-172e255d]{transition:opacity .28s cubic-bezier(.16,1,.3,1),transform .28s cubic-bezier(.16,1,.3,1)}.tour-step-leave-active[data-v-172e255d]{transition:opacity .18s cubic-bezier(.16,1,.3,1),transform .18s cubic-bezier(.16,1,.3,1)}.tour-step-enter-from[data-v-172e255d]{opacity:0;transform:translateY(10px)scale(.96)}.tour-step-leave-to[data-v-172e255d]{opacity:0;transform:translateY(-8px)scale(.96)}:root{--liapi-accent:var(--color-primary,#6366f1)}#__nuxt,body,html{height:100%}body{-webkit-font-smoothing:antialiased;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif}.page-enter-active,.page-leave-active{transition:opacity .22s cubic-bezier(.4,0,.2,1),transform .22s cubic-bezier(.4,0,.2,1)}.page-enter-from{opacity:0;transform:translateY(8px)}.page-leave-to{opacity:0;transform:translateY(-6px)}.fade-enter-active,.fade-leave-active{transition:opacity .18s}.fade-enter-from,.fade-leave-to{opacity:0}*{scrollbar-width:thin}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:currentColor}@supports (color:color-mix(in lab,red,red)){::-webkit-scrollbar-thumb{background:color-mix(in oklab,currentColor 18%,transparent)}}::-webkit-scrollbar-thumb{border-radius:999px}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1} diff --git a/server/adminui/_nuxt/error-404.Bb87HomL.css b/server/adminui/_nuxt/error-404.Bb87HomL.css new file mode 100644 index 0000000..fbc7270 --- /dev/null +++ b/server/adminui/_nuxt/error-404.Bb87HomL.css @@ -0,0 +1 @@ +.grid[data-v-b8cc6c10]{display:grid}.mb-2[data-v-b8cc6c10]{margin-bottom:.5rem}.mb-4[data-v-b8cc6c10]{margin-bottom:1rem}.max-w-520px[data-v-b8cc6c10]{max-width:520px}.min-h-screen[data-v-b8cc6c10]{min-height:100vh}.w-full[data-v-b8cc6c10]{width:100%}.flex[data-v-b8cc6c10]{display:flex}.place-content-center[data-v-b8cc6c10]{place-content:center}.items-center[data-v-b8cc6c10]{align-items:center}.justify-center[data-v-b8cc6c10]{justify-content:center}.overflow-hidden[data-v-b8cc6c10]{overflow:hidden}.bg-white[data-v-b8cc6c10]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2[data-v-b8cc6c10]{padding-left:.5rem;padding-right:.5rem}.text-center[data-v-b8cc6c10]{text-align:center}.text-\[80px\][data-v-b8cc6c10]{font-size:80px}.text-2xl[data-v-b8cc6c10]{font-size:1.5rem;line-height:2rem}.text-sm[data-v-b8cc6c10]{font-size:.875rem;line-height:1.25rem}.text-\[\#020420\][data-v-b8cc6c10]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\[\#64748B\][data-v-b8cc6c10]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.hover\:text-\[\#00DC82\][data-v-b8cc6c10]:hover{--un-text-opacity:1;color:rgb(0 220 130/var(--un-text-opacity))}.font-medium[data-v-b8cc6c10]{font-weight:500}.font-semibold[data-v-b8cc6c10]{font-weight:600}.leading-none[data-v-b8cc6c10]{line-height:1}.tracking-wide[data-v-b8cc6c10]{letter-spacing:.025em}.font-sans[data-v-b8cc6c10]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.tabular-nums[data-v-b8cc6c10]{--un-numeric-spacing:tabular-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction)}.underline[data-v-b8cc6c10]{text-decoration-line:underline}.underline-offset-3[data-v-b8cc6c10]{text-underline-offset:3px}.antialiased[data-v-b8cc6c10]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-\[\#020420\][data-v-b8cc6c10]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\:text-white[data-v-b8cc6c10]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (width>=640px){.sm\:text-\[110px\][data-v-b8cc6c10]{font-size:110px}.sm\:text-3xl[data-v-b8cc6c10]{font-size:1.875rem;line-height:2.25rem}} diff --git a/server/adminui/_nuxt/error-500.Bwd7zAaE.css b/server/adminui/_nuxt/error-500.Bwd7zAaE.css new file mode 100644 index 0000000..1f3d214 --- /dev/null +++ b/server/adminui/_nuxt/error-500.Bwd7zAaE.css @@ -0,0 +1 @@ +.grid[data-v-f91406c7]{display:grid}.mb-2[data-v-f91406c7]{margin-bottom:.5rem}.mb-4[data-v-f91406c7]{margin-bottom:1rem}.max-w-520px[data-v-f91406c7]{max-width:520px}.min-h-screen[data-v-f91406c7]{min-height:100vh}.place-content-center[data-v-f91406c7]{place-content:center}.overflow-hidden[data-v-f91406c7]{overflow:hidden}.bg-white[data-v-f91406c7]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2[data-v-f91406c7]{padding-left:.5rem;padding-right:.5rem}.text-center[data-v-f91406c7]{text-align:center}.text-\[80px\][data-v-f91406c7]{font-size:80px}.text-2xl[data-v-f91406c7]{font-size:1.5rem;line-height:2rem}.text-\[\#020420\][data-v-f91406c7]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\[\#64748B\][data-v-f91406c7]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.font-semibold[data-v-f91406c7]{font-weight:600}.leading-none[data-v-f91406c7]{line-height:1}.tracking-wide[data-v-f91406c7]{letter-spacing:.025em}.font-sans[data-v-f91406c7]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.tabular-nums[data-v-f91406c7]{--un-numeric-spacing:tabular-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction)}.antialiased[data-v-f91406c7]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-\[\#020420\][data-v-f91406c7]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\:text-white[data-v-f91406c7]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (width>=640px){.sm\:text-\[110px\][data-v-f91406c7]{font-size:110px}.sm\:text-3xl[data-v-f91406c7]{font-size:1.875rem;line-height:2.25rem}} diff --git a/server/adminui/_nuxt/i8vU1wpO.js b/server/adminui/_nuxt/i8vU1wpO.js new file mode 100644 index 0000000..062e992 --- /dev/null +++ b/server/adminui/_nuxt/i8vU1wpO.js @@ -0,0 +1 @@ +import{t as e}from"./BOgT-xSl.js";var t=e(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]);export{t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/kaartF-h.js b/server/adminui/_nuxt/kaartF-h.js new file mode 100644 index 0000000..15b69fc --- /dev/null +++ b/server/adminui/_nuxt/kaartF-h.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DDlQRUFs.js","./Bx_a1Ri3.js","./Dw7E2aQ0.js","./CMHCZ1c-.js","./BOgT-xSl.js","./bazXKP70.js","./DQKjIeim.js","./D2-o7L18.js","./z_P_bNzM.js","./i8vU1wpO.js","./D-_L2MRs.js","./CAJW6uLT.js","./CMKGzL4T.js","./D5UXUZnN.js","./nj6DwLzD.js","./DeZOVV_X.js","./DMJkRJ-9.js","./BTFs9w_Z.js","./BjW-HIZC.js","./Di5spq1Y.js","./BH8nemMl.js","./CjfA7_9d.js","./C8yIGsZb.js","./Dk1h4UcG.js","./DRUQkVH5.js","./BCSPyKdf.js","./DXIMwwdP.js","./zZGEHylc.js","./EBK3dIz3.js","./B2oFgaBj.js","./11441PgY.js","./NDcEePfh.js","./CC5v17Ca.js","./DvnvAQHt.js","./DpmZExze.js","./BkfABsWB.js","./Cxvr5SZe.js","./DsoWRbkX.js","./rHT2Oyk9.js","./PJ4Qaee8.js","./Djcrsm7t.js","./error-404.Bb87HomL.css","./CnEaNhAK.js","./error-500.Bwd7zAaE.css"])))=>i.map(i=>d[i]); +import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,t as m,u as h,v as g}from"./CMHCZ1c-.js";import{C as _,D as v,Dt as y,E as b,F as x,J as S,K as ee,M as C,P as w,Q as T,R as E,S as D,T as te,_ as O,a as ne,at as re,c as k,d as ie,f as ae,g as oe,i as se,j as ce,k as le,nt as ue,r as de,rt as fe,tt as A,u as j,ut as M,v as N,w as P,x as pe,z as me}from"./Bx_a1Ri3.js";import{A as he,C as ge,D as _e,E as ve,N as ye,O as be,P as xe,S as Se,T as Ce,_ as we,a as Te,b as Ee,c as De,d as Oe,f as ke,g as Ae,h as je,i as Me,j as Ne,k as F,l as Pe,m as Fe,n as Ie,o as Le,p as I,r as Re,s as ze,t as Be,u as Ve,v as He,w as Ue,x as We,y as Ge}from"./Dw7E2aQ0.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var Ke=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,qe=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,Je=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function Ye(e,t){if(e===`__proto__`||e===`constructor`&&t&&typeof t==`object`&&`prototype`in t){Xe(e);return}return t}function Xe(e){console.warn(`[destr] Dropping "${e}" key to prevent prototype pollution.`)}function Ze(e,t={}){if(typeof e!=`string`)return e;if(e[0]===`"`&&e[e.length-1]===`"`&&e.indexOf(`\\`)===-1)return e.slice(1,-1);let n=e.trim();if(n.length<=9)switch(n.toLowerCase()){case`true`:return!0;case`false`:return!1;case`undefined`:return;case`null`:return null;case`nan`:return NaN;case`infinity`:return 1/0;case`-infinity`:return-1/0}if(!Je.test(e)){if(t.strict)throw SyntaxError(`[destr] Invalid JSON`);return e}try{if(Ke.test(e)||qe.test(e)){if(t.strict)throw Error(`[destr] Possible prototype pollution`);return JSON.parse(e,Ye)}return JSON.parse(e)}catch(n){if(t.strict)throw n;return e}}var Qe=class extends Error{constructor(e,t){super(e,t),this.name=`FetchError`,t?.cause&&!this.cause&&(this.cause=t.cause)}};function $e(e){let t=e.error?.message||e.error?.toString()||``,n=e.request?.method||e.options?.method||`GET`,r=e.request?.url||String(e.request)||`/`,i=new Qe(`${`[${n}] ${JSON.stringify(r)}`}: ${e.response?`${e.response.status} ${e.response.statusText}`:``}${t?` ${t}`:``}`,e.error?{cause:e.error}:void 0);for(let t of[`request`,`options`,`response`])Object.defineProperty(i,t,{get(){return e[t]}});for(let[t,n]of[[`data`,`_data`],[`status`,`status`],[`statusCode`,`status`],[`statusText`,`statusText`],[`statusMessage`,`statusText`]])Object.defineProperty(i,t,{get(){return e.response&&e.response[n]}});return i}var et=new Set(Object.freeze([`PATCH`,`POST`,`PUT`,`DELETE`]));function tt(e=`GET`){return et.has(e.toUpperCase())}function nt(e){if(e===void 0)return!1;let t=typeof e;return t===`string`||t===`number`||t===`boolean`||t===null?!0:t===`object`?Array.isArray(e)?!0:e.buffer||e instanceof FormData||e instanceof URLSearchParams?!1:e.constructor&&e.constructor.name===`Object`||typeof e.toJSON==`function`:!1}var rt=new Set([`image/svg`,`application/xml`,`application/xhtml`,`application/html`]),it=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function at(e=``){if(!e)return`json`;let t=e.split(`;`).shift()||``;return it.test(t)?`json`:t===`text/event-stream`?`stream`:rt.has(t)||t.startsWith(`text/`)?`text`:`blob`}function ot(e,t,n,r){let i=st(t?.headers??e?.headers,n?.headers,r),a;return(n?.query||n?.params||t?.params||t?.query)&&(a={...n?.params,...n?.query,...t?.params,...t?.query}),{...n,...t,query:a,params:a,headers:i}}function st(e,t,n){if(!t)return new n(e);let r=new n(t);if(e)for(let[t,i]of Symbol.iterator in e||Array.isArray(e)?e:new n(e))r.set(t,i);return r}async function ct(e,t){if(t){if(Array.isArray(t))for(let n of t)await n(e);else await t(e)}}var lt=new Set([408,409,425,429,500,502,503,504]),ut=new Set([101,204,205,304]);function dt(e={}){let{fetch:t=globalThis.fetch,Headers:n=globalThis.Headers,AbortController:r=globalThis.AbortController}=e;async function i(e){let t=e.error&&e.error.name===`AbortError`&&!e.options.timeout||!1;if(e.options.retry!==!1&&!t){let t;t=typeof e.options.retry==`number`?e.options.retry:+!tt(e.options.method);let n=e.response&&e.response.status||500;if(t>0&&(Array.isArray(e.options.retryStatusCodes)?e.options.retryStatusCodes.includes(n):lt.has(n))){let n=typeof e.options.retryDelay==`function`?e.options.retryDelay(e):e.options.retryDelay||0;return n>0&&await new Promise(e=>setTimeout(e,n)),a(e.request,{...e.options,retry:t-1})}}let n=$e(e);throw Error.captureStackTrace&&Error.captureStackTrace(n,a),n}let a=async function(a,o={}){let s={request:a,options:ot(a,o,e.defaults,n),response:void 0,error:void 0};if(s.options.method&&(s.options.method=s.options.method.toUpperCase()),s.options.onRequest&&(await ct(s,s.options.onRequest),s.options.headers instanceof n||(s.options.headers=new n(s.options.headers||{}))),typeof s.request==`string`&&(s.options.baseURL&&(s.request=We(s.request,s.options.baseURL)),s.options.query&&(s.request=Se(s.request,s.options.query),delete s.options.query),`query`in s.options&&delete s.options.query,`params`in s.options&&delete s.options.params),s.options.body&&tt(s.options.method)){if(nt(s.options.body)){let e=s.options.headers.get(`content-type`);typeof s.options.body!=`string`&&(s.options.body=e===`application/x-www-form-urlencoded`?new URLSearchParams(s.options.body).toString():JSON.stringify(s.options.body)),e||s.options.headers.set(`content-type`,`application/json`),s.options.headers.has(`accept`)||s.options.headers.set(`accept`,`application/json`)}else(`pipeTo`in s.options.body&&typeof s.options.body.pipeTo==`function`||typeof s.options.body.pipe==`function`)&&(`duplex`in s.options||(s.options.duplex=`half`))}let c;if(!s.options.signal&&s.options.timeout){let e=new r;c=setTimeout(()=>{let t=Error(`[TimeoutError]: The operation was aborted due to timeout`);t.name=`TimeoutError`,t.code=23,e.abort(t)},s.options.timeout),s.options.signal=e.signal}try{s.response=await t(s.request,s.options)}catch(e){return s.error=e,s.options.onRequestError&&await ct(s,s.options.onRequestError),await i(s)}finally{c&&clearTimeout(c)}if((s.response.body||s.response._bodyInit)&&!ut.has(s.response.status)&&s.options.method!==`HEAD`){let e=(s.options.parseResponse?`json`:s.options.responseType)||at(s.response.headers.get(`content-type`)||``);switch(e){case`json`:{let e=await s.response.text(),t=s.options.parseResponse||Ze;s.response._data=t(e);break}case`stream`:s.response._data=s.response.body||s.response._bodyInit;break;default:s.response._data=await s.response[e]()}}return s.options.onResponse&&await ct(s,s.options.onResponse),!s.options.ignoreResponseError&&s.response.status>=400&&s.response.status<600?(s.options.onResponseError&&await ct(s,s.options.onResponseError),await i(s)):s.response},o=async function(e,t){return(await a(e,t))._data};return o.raw=a,o.native=(...e)=>t(...e),o.create=(t={},n={})=>dt({...e,...n,defaults:{...e.defaults,...n.defaults,...t}}),o}var ft=(function(){if(typeof globalThis<`u`)return globalThis;if(typeof self<`u`)return self;if(typeof window<`u`)return window;if(typeof global<`u`)return global;throw Error(`unable to locate global object`)})(),pt=ft.fetch?(...e)=>ft.fetch(...e):()=>Promise.reject(Error(`[ofetch] global.fetch is not supported!`)),mt=ft.Headers,ht=ft.AbortController,gt=dt({fetch:pt,Headers:mt,AbortController:ht}),_t=()=>window?.__NUXT__?.config||window?.useNuxtApp?.().payload?.config,vt=()=>_t().app,yt=()=>vt().baseURL,bt=()=>vt().buildAssetsDir,xt=(...e)=>He(St(),bt(),...e),St=(...e)=>{let t=vt(),n=t.cdnURL||t.baseURL;return e.length?He(n,...e):n};globalThis.__buildAssetsURL=xt,globalThis.__publicAssetsURL=St,globalThis.$fetch||(globalThis.$fetch=gt.create({baseURL:yt()}));var Ct=globalThis.$fetch;`global`in globalThis||(globalThis.global=globalThis);function wt(e,t){t.push(d),e.vueApp.use(t);let n=!0,r=()=>{n=!1,t.render()};t.hooks?.hook(`dom:beforeRender`,e=>{e.shouldRender=!n}),e.hooks.hook(`page:start`,()=>{n=!0}),e.hooks.hook(`page:finish`,()=>{e.isHydrating||r()}),e.hooks.hook(`app:error`,r),e.hooks.hook(`app:suspense:resolve`,r);let i=t.push.bind(t);t.push=((t,n)=>{let r=i(t,n),a=r.dispose.bind(r);return r.dispose=()=>{let t=e[`~transitionPromise`];t?t.finally(a):a()},r})}function Tt(e,t){if(typeof t==`function`&&t.key&&e.plugins.has(t.key))return;let n=typeof t==`function`?t(e):t,r=n.key||String(e.plugins.size+1);if(!e.plugins.get(r)){e.plugins.set(r,n);for(let t in n.hooks||{})e.hooks?.hook(t,n.hooks[t])}}function Et(e,t={}){let n=!t.document,r=new Map,i={_entryCount:1,_h:0,plugins:new Map,resolvedOptions:t,ssr:n,entries:r,hooks:void 0,render:()=>e(i),use:e=>Tt(i,e),push(e,t){let a=t?._index??i._entryCount++,o=t?{...t}:{};delete o.head,delete o.onRendered,delete o._index;let s={_i:a,input:e,options:o};return r.set(a,s),{_i:a,dispose(){r.delete(a)},patch(e){n?(s.input=e,delete s._tags):s._pending=e,r.has(a)||r.set(a,s)}}}};return t.init?.forEach(e=>e&&i.push(e)),i}var Dt=new Set([`link`,`style`,`script`,`noscript`]),Ot=new Set([`title`,`titleTemplate`,`script`,`style`,`noscript`]),kt=new Set([`base`,`meta`,`link`,`style`,`script`,`noscript`]),At=new Set([`title`,`base`,`htmlAttrs`,`bodyAttrs`,`meta`,`link`,`style`,`script`,`noscript`]),jt=new Set([`base`,`title`,`titleTemplate`,`bodyAttrs`,`htmlAttrs`,`templateParams`]),Mt=new Set([`key`,`tagPosition`,`tagPriority`,`tagDuplicateStrategy`,`innerHTML`,`textContent`,`processTemplateParams`]),Nt=new Set([`templateParams`,`htmlAttrs`,`bodyAttrs`]),Pt=new Set([`theme-color`,`google-site-verification`,`author`,`og:locale:alternate`,`og:image`,`og:video`,`og:audio`,`article:author`,`article:tag`,`book:author`,`book:tag`,`twitter:image`]),Ft={critical:-8,high:-1,low:2},It=e=>typeof e==`number`?Number.isFinite(e):e;function Lt(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function Rt(e){let t=new l;for(let n in e||{})t.hook(n,e[n]);return t}function L(e,t,n){if(e.hooks?._hooks?.[t]?.length)return e.hooks?.callHook(t,n)}function zt(e,t,n){let r=e.push,i=e;i.ssr=!1,i.hooks=t,i.dirty=!!i.dirty,i.use=e=>Tt(i,e),i.render=()=>n(i);function a(){t.callHook(`entries:updated`,i),i._b||i.render()}return i.invalidate=()=>{for(let e of i.entries.values())delete e._tags;i.dirty=!0,a()},i.push=(n,o)=>{let s=o?.onRendered?t.hook(`dom:rendered`,o.onRendered):void 0,c=r(n,o),l=e.entries.get(c._i);return l&&(l._o=n),i.dirty=!0,a(),{_i:c._i,patch(e){c.patch(e),i.dirty=!0,a()},dispose(){s?.(),e.entries.has(c._i)&&(c.dispose(),i.invalidate())}}},i}var Bt=/^(?:viewport|description|keywords|robots)$/,Vt=[`name`,`property`,`http-equiv`];function Ht(e){let t=e.indexOf(`:`);if(t===-1)return!1;let n=e.slice(t+1);return Pt.has(n)||n.startsWith(`og:image:`)||n.startsWith(`og:video:`)||n.startsWith(`og:audio:`)||n.startsWith(`twitter:image:`)}function Ut(e){let{props:t,tag:n,key:r}=e;if(jt.has(n))return n;if(n===`link`){if(t.rel===`canonical`)return`canonical`;if(t.rel===`alternate`&&t.hreflang)return`alternate:${t.hreflang}`}if(t.charset)return`charset`;if(n===`meta`)for(let e of Vt){let n=t[e];if(n!==void 0)return`meta:${n}${(typeof n!=`string`||!n.includes(`:`))&&!Bt.test(n)&&r?`:key:${r}`:``}`}return r?`${n}:key:${r}`:t.id?`${n}:id:${t.id}`:n===`link`&&t.rel&&t.href?`link:${t.rel}:${t.href}`:Ot.has(n)&&(e.textContent||e.innerHTML)?`${n}:content:${e.textContent||e.innerHTML}`:void 0}function Wt(e){let t=e._h||e._d||e.textContent||e.innerHTML;if(t)return t;let n=Object.keys(e.props).sort(),r=`${e.tag}:`,i=``;for(let t of n)r+=`${i}${t}:${String(e.props[t])}`,i=`,`;return r}function Gt(e,t,n){if(n===`_resolver`)return e;typeof e==`function`&&(!n||n!==`titleTemplate`&&!n.startsWith(`on`))&&(e=e());let r=t?t(n,e):e;if(Array.isArray(r)){let e;for(let n=0;n/=\x00-\x1F\x7F]/;function qt(e,t){let n=e===`style`,r=n?new Map:new Set,i=e=>{if(e){if(n){let t=e.indexOf(`:`);t>0&&r.set(e.slice(0,t).trim(),e.slice(t+1).trim())}else e.split(` `).forEach(e=>e&&r.add(e))}};if(typeof t==`string`)(n?t.split(`;`):[t]).forEach(i);else if(Array.isArray(t))t.forEach(i);else if(t&&typeof t==`object`)for(let e in t){let a=t[e];a&&a!==`false`&&(n?r.set(e.trim(),String(a)):i(e))}return r}function Jt(e,t){if(e.props=e.props||{},!t)return e;if(e.tag===`templateParams`)return e.props=t,e;let n=kt.has(e.tag)||e.tag===`htmlAttrs`||e.tag===`bodyAttrs`;for(let r in t){if(Lt(r))continue;let i=r.startsWith(`data-`),a=n&&!Mt.has(r),o=a&&!i?r.toLowerCase():r;if(a&&(!o||Kt.test(o)))continue;let s=t[r];if(s===null)e.props[o]=null;else if(r===`class`||r===`style`)e.props[r]=qt(r,s);else if(Mt.has(r)){if((r===`textContent`||r===`innerHTML`)&&typeof s==`object`){let n=t.type||`application/json`;(n.endsWith(`json`)||n===`speculationrules`||n===`importmap`)&&(e.props.type=n,e[r]=JSON.stringify(s))}else e[r]=s}else if(s!==void 0){let t=String(s),n=e.tag===`meta`&&o===`content`;e.props[o]=t===`true`||t===``?i||n?t:!0:!s&&i&&t===`false`?`false`:s}}return e}function Yt(e,t){let n;return t.length&&(n=(e,n)=>{for(let r=0;re._w===t._w?e._p-t._p:e._w-t._w,nn=()=>100;function rn(e){for(let t in e)return!1;return!0}var an=/^tags:|:render/;function on(e,t){let n=(t[`entries:resolve`]?.length||0)+(t[`entries:normalize`]?.length||0);if(e._h!==n){e._h=n;for(let t of e.entries.values())delete t._tags}}function sn(e){for(let t=0;t>10==i._p>>10&&n.tag===`meta`&&Ht(r)?(e.tagMap.set(r,Object.assign([...Array.isArray(i)?i:[i],n],n)),t=!0):(n._w===i._w?n._p>i._p:n._wt?(typeof e==`string`?e:JSON.stringify(e)).replace($t,`\\u003C`):typeof e==`string`?e.replace(en,`<\\/script`):e;n={...n},r&&(n.innerHTML=i(r)),n.textContent&&(n.textContent=i(n.textContent)),n._d=Ut(n)}e[t++]=n}}return e.length=t,e}function fn(e,t){let n=t?.tagWeight??e.resolvedOptions._tagWeight??nn,r={tagMap:new Map,tags:[]},i=e.hooks?._hooks||{};on(e,i);for(let t of e.entries.values())t._pending!==void 0&&(t.input=t._pending,delete t._pending,delete t._tags,delete t._precomputedTags);let a;(i[`entries:resolve`]?.length||i[`entries:normalize`]?.length)&&(a=[...e.entries.values()],i[`entries:resolve`]?.length&&L(e,`entries:resolve`,{entries:a,...r})),on(e,i);for(let t of a||e.entries.values()){let a=t._tags;if(!a){if(t._precomputedTags&&n===e.resolvedOptions._tagWeight&&!i[`entries:normalize`]?.length&&!i[`entries:resolve`]?.length&&(!t.options||rn(t.options)))a=t._precomputedTags;else{if(a=Qt(t.input,e.resolvedOptions.propResolvers||[]),t.options&&!rn(t.options))for(let e of a)Object.assign(e,t.options);if(i[`entries:normalize`]?.length){let n={tags:a,entry:t};L(e,`entries:normalize`,n),a=n.tags}for(let e=0;e_n(t,e)}function hn(e){for(let t of e.entries.values())if(t._pending!==void 0)return!0;return!1}function gn(e,t){let n={_d:t,_t:t.title,_e:new Map([[`htmlAttrs`,t.documentElement],[`bodyAttrs`,t.body]]),_p:{},_s:{},_l:new Map};for(let t of e.entries.values())if(t._o!==void 0){let e=t._o;for(let t of[`bodyAttrs`,`htmlAttrs`]){let r=e[t]?.class;if(typeof r==`string`){let e=n._e.get(t);for(let i of r.split(pn))i&&(n._p[`${t}:attr:class:${i}`]=()=>e.classList.remove(i))}}}return n}function _n(e,t={}){let n=t.document||e.resolvedOptions.document,r=e._dom;if(!n||e._du||r&&r._d===n&&!e.dirty&&!hn(e))return!1;let i=n.defaultView;e._du=!0;let a=!1;try{let o=function(e,t,n){d._s[e]=!n&&f[e]||t,delete f[e]},s=function(e,t,n,r,i,a){let s=`${e}:event:${t}`,c=d._l.get(s);if(c&&c[0]===a&&c[1]===n&&c[2]===r){o(s,c[4]);return}c?.[4]();let l=`data-${t}`,u=(e=>r.call(i,e)),f=()=>{a.removeEventListener(n,u),i.getAttribute(l)===``&&i.removeAttribute(l),d._l.get(s)?.[3]===u&&d._l.delete(s)};a.addEventListener(n,u),d._l.set(s,[a,n,r,u,f]),i.setAttribute(l,``),o(s,f,!0)},c=function({id:e,$el:t,tag:n}){if(d._e.set(e,t),!n.tag.endsWith(`Attrs`)){let r=n.textContent;r!=null&&r!==``&&(r!==t.textContent&&(t.textContent=r),o(`${e}:text`,()=>{t.textContent===r&&(t.textContent=``)},!0));let i=n.innerHTML;i!=null&&i!==``&&(i!==t.innerHTML&&(t.innerHTML=i),o(`${e}:html`,()=>{t.innerHTML===i&&(t.innerHTML=``)},!0));let a=`${e}:el`;o(a,f[a]||(()=>{t?.remove(),d._e.delete(e)}))}for(let r in n.props){let a=n.props[r];if(r[0]===`o`&&r[1]===`n`&&typeof a==`function`){let o=r.slice(2);t?.dataset?.[`${r}fired`]&&a.call(t,new((i?.Event)||Event)(o)),s(e,r,o,a,t,n.tag===`bodyAttrs`&&i?i:t);continue}let c=`${e}:attr:${r}`;if(r===`class`&&a)for(let e of a){let n=`${c}:${e}`;o(n,f[n]||(()=>t.classList.remove(e))),t.classList.contains(e)||t.classList.add(e)}else if(r===`style`&&a)for(let[e,n]of a){let r=`${c}:${e}`;o(r,f[r]||(()=>t.style.removeProperty(e))),t.style.setProperty(e,n)}else a!==!1&&a!==null&&(t.getAttribute(r)!==a&&t.setAttribute(r,a===!0?``:String(a)),o(c,f[c]||(()=>t.removeAttribute(r))))}},l={shouldRender:!0,tags:[]};if(L(e,`dom:beforeRender`,l),!l.shouldRender)return!1;let u=r;if(u?._d!==n){if(u){for(let e in u._s)u._s[e]();for(let e in u._p)u._p[e]();u._s=u._p={},u._e.clear(),u._l.clear()}u=void 0}u?u._p=u._s:u=gn(e,n),u._s={};let d=u,f=d._p,p=[],m={};e.dirty=!1;let h=fn(e,t.tagWeight?{tagWeight:t.tagWeight}:void 0),g=[],_={};for(let e of h){let t=_[e._d]||0,r=(t?`${e._d}:${t}`:e._d)||e._h,i={tag:e,id:r,shouldRender:!0};if(e.tag===`meta`&&e._d&&Ht(e._d)&&(_[e._d]=t+1),g.push(i),e.tag===`title`){n.title=e.textContent,o(`title:`,()=>n.title=d._t);continue}i.$el=d._e.get(r),i.$el?c(i):kt.has(e.tag)&&p.push(i)}if(p.length){let e=new Set(d._e.values());for(let t of[...n.body.children,...n.head.children]){let n=t.tagName.toLowerCase();if(!kt.has(n)||e.has(t))continue;let r={innerHTML:t.innerHTML};for(let e of t.getAttributeNames())r[e]=t.getAttribute(e);let i=Jt({tag:n,props:{}},r);i.key=t.getAttribute(`data-hid`)||void 0;let a=Ut(i)||Wt(i),o=a,s=1;for(;d._e.has(o);)o=`${a}:${s++}`;d._e.set(o,t)}}for(let e of p){let t=d._e.get(e.id);e.$el=t||n.createElement(e.tag.tag),c(e),t||(m[e.tag.tagPosition||`head`]??=n.createDocumentFragment()).appendChild(e.$el)}m.head&&n.head.appendChild(m.head),m.bodyOpen&&n.body.insertBefore(m.bodyOpen,n.body.firstChild),m.bodyClose&&n.body.appendChild(m.bodyClose);for(let e in f)f[e]();e._dom=d,a=!0,L(e,`dom:rendered`,{renders:g})}catch(t){throw e.dirty=!0,t}finally{e._du=!1}return a&&(e.dirty||hn(e))&&_n(e,t),a}var vn=e=>typeof e.tagPriority==`number`?e.tagPriority:100+(Ft[e.tagPriority]||0);function yn(e={}){e.document=e.document||(typeof window<`u`?document:void 0);let t=e.render||mn({document:e.document}),n=zt(Et(t,{document:e.document,propResolvers:e.propResolvers,_tagWeight:vn,init:[]}),Rt(e.hooks),t);return e.plugins?.forEach(e=>n.use(e)),e.init?.forEach(e=>e&&n.push(e)),n}var bn=`usehead`;function xn(){if(_()){let e=P(bn);if(e)return e}throw Error(`useHead() was called without provide context, ensure you call it through the setup() function.`)}function Sn(e){return{install(t){t.config.globalProperties.$unhead=e,t.config.globalProperties.$head=e,t.provide(bn,e)}}.install}function Cn(e,t){return t&&typeof e==`function`&&(e.key=t),e}var wn=/\\/g,Tn=/{if(e===On||!a.includes(e))return e;let n=kn(t,e.slice(1),r);return n===void 0?e:n}).trim(),o&&(e=e.split(On).map(e=>e.trim()).filter(e=>e!==``).join(n?` ${n} `:` `)),e}var jn=(e,t)=>e._w===t._w?e._p-t._p:e._w-t._w,Mn=e=>e.includes(`:key`)?e:e.split(`:`).join(`:key:`),Nn=Cn({key:`aliasSorting`,hooks:{"tags:resolve":e=>{let t=!1;for(let n of e.tags){let r=n.tagPriority;if(!r)continue;let i=String(r);if(i.startsWith(`before:`)){let r=Mn(i.slice(7)),a=e.tagMap.get(r);a&&(typeof a.tagPriority==`number`&&(n.tagPriority=a.tagPriority),n._p=a._p-1,t=!0)}else if(i.startsWith(`after:`)){let r=Mn(i.slice(6)),a=e.tagMap.get(r);a&&(typeof a.tagPriority==`number`&&(n.tagPriority=a.tagPriority),n._p=a._p+1,t=!0)}}t&&(e.tags=e.tags.sort(jn))}}}),Pn=Cn({key:`deprecations`,hooks:{"entries:normalize":({tags:e})=>{for(let t of e)t.props.children&&(t.innerHTML=t.props.children,delete t.props.children),t.props.hid&&(t.key=t.props.hid,delete t.props.hid),t.props.vmid&&(t.key=t.props.vmid,delete t.props.vmid),`body`in t.props&&(t.props.body&&(t.tagPosition=`bodyClose`),delete t.props.body),t.props.renderPriority!=null&&(t.tagPriority=t.props.renderPriority,delete t.props.renderPriority)}}});function R(e){return typeof e?.then==`function`}var Fn=256;function In(e,t){if(t===e.length)return;if(t===Fn){let n=Array(e.length),r=!1;for(;tObject.fromEntries(t.map((t,n)=>[t,e[n]])))}return e}var Rn=Cn(e=>{let t=new WeakMap;return{key:`promises`,hooks:{"entries:resolve":n=>{for(let r=n.entries.length-1;r>=0;r--){let i=n.entries[r],a=i.input;if(t.get(i)===a){n.entries.splice(r,1);continue}let o=z(a);if(!R(o)){t.delete(i);continue}t.set(i,a),n.entries.splice(r,1),Promise.resolve(o).then(n=>{t.get(i)===a&&(t.delete(i),i.input=n,delete i._tags,e.invalidate?.())},()=>{t.get(i)===a&&t.delete(i)})}}}}},`promises`),zn={meta:`content`,link:`href`,htmlAttrs:`lang`},Bn=[`innerHTML`,`textContent`];function Vn(e,t,n,r=!1){return typeof e==`string`&&e.includes(`%`)?An(e,t,n,r):e}var Hn=Cn(e=>({key:`template-params`,hooks:{"tags:resolve":({tagMap:t,tags:n})=>{let r=t.get(`templateParams`)?.props||{},i=r.separator||`|`;delete r.separator,r.pageTitle=Vn(r.pageTitle||e._title||``,r,i);for(let e of n){if(e.processTemplateParams===!1)continue;let t=zn[e.tag];if(t&&typeof e.props[t]==`string`)e.props[t]=Vn(e.props[t],r,i);else if(e.processTemplateParams||e.tag===`titleTemplate`||e.tag===`title`)for(let t of Bn)typeof e[t]==`string`&&(e[t]=Vn(e[t],r,i,e.tag===`script`&&typeof e.props.type==`string`&&e.props.type.endsWith(`json`)))}e._templateParams=r,e._separator=i},"tags:afterResolve":({tagMap:t})=>{let n=t.get(`title`);n?.textContent&&n.processTemplateParams!==!1&&(n.textContent=Vn(n.textContent,e._templateParams,e._separator))}}}),`template-params`);function Un(e={}){let t=mn(),n,r=0;return n=yn({render:()=>{let e=++r;setTimeout(()=>{e===r&&t(n)},0)},...e}),n.install=Sn(n),n}var Wn={disableDefaults:!0,plugins:[Pn,Rn,Hn,Nn]},Gn=p({name:`nuxt:head`,enforce:`pre`,setup(e){wt(e,Un(Wn))}}),Kn=/(:\w+)\([^)]+\)/g,qn=/(:\w+)[?+*]/g,Jn=/:\w+/g,Yn=(e,t)=>t.path.replace(Kn,`$1`).replace(qn,`$1`).replace(Jn,t=>e.params[t.slice(1)]?.toString()||``),Xn=(e,t)=>{let n=e.route.matched.find(t=>t.components?.default===e.Component.type),r=t??n?.meta.key??(n&&Yn(e.route,n));return typeof r==`function`?r(e.route):r},Zn=(e,t)=>({default:()=>e?D(se,e===!0?{}:e,t):t});function Qn(e){return Array.isArray(e)?e:[e]}var B=typeof document<`u`;function $n(e){return typeof e==`object`||`displayName`in e||`props`in e||`__vccOpts`in e}function er(e){return e.__esModule||e[Symbol.toStringTag]===`Module`||e.default&&$n(e.default)}var V=Object.assign;function tr(e,t){let n={};for(let r in t){let i=t[r];n[r]=H(i)?i.map(e):e(i)}return n}var nr=()=>{},H=Array.isArray;function rr(e,t){let n={};for(let r in e)n[r]=r in t?t[r]:e[r];return n}var ir=/#/g,ar=/&/g,or=/\//g,sr=/=/g,cr=/\?/g,lr=/\+/g,ur=/%5B/g,dr=/%5D/g,fr=/%5E/g,pr=/%60/g,mr=/%7B/g,hr=/%7C/g,gr=/%7D/g,_r=/%20/g;function vr(e){return e==null?``:encodeURI(``+e).replace(hr,`|`).replace(ur,`[`).replace(dr,`]`)}function yr(e){return vr(e).replace(mr,`{`).replace(gr,`}`).replace(fr,`^`)}function br(e){return vr(e).replace(lr,`%2B`).replace(_r,`+`).replace(ir,`%23`).replace(ar,`%26`).replace(pr,"`").replace(mr,`{`).replace(gr,`}`).replace(fr,`^`)}function xr(e){return br(e).replace(sr,`%3D`)}function Sr(e){return vr(e).replace(ir,`%23`).replace(cr,`%3F`)}function Cr(e){return Sr(e).replace(or,`%2F`)}function wr(e){if(e==null)return null;try{return decodeURIComponent(``+e)}catch{}return``+e}var Tr=/\/$/,Er=e=>e.replace(Tr,``);function Dr(e,t,n=`/`){let r,i={},a=``,o=``,s=t.indexOf(`#`),c=t.indexOf(`?`);return c=s>=0&&c>s?-1:c,c>=0&&(r=t.slice(0,c),a=t.slice(c,s>0?s:t.length),i=e(a.slice(1))),s>=0&&(r||=t.slice(0,s),o=t.slice(s,t.length)),r=Pr(r??t,n),{fullPath:r+a+o,path:r,query:i,hash:wr(o)}}function Or(e,t){let n=t.query?e(t.query):``;return t.path+(n&&`?`)+n+(t.hash||``)}function kr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||`/`}function Ar(e,t,n){let r=t.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&U(t.matched[r],n.matched[i])&&jr(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function U(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function jr(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Mr(e[n],t[n]))return!1;return!0}function Mr(e,t){return H(e)?Nr(e,t):H(t)?Nr(t,e):e?.valueOf()===t?.valueOf()}function Nr(e,t){return H(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function Pr(e,t){if(e.startsWith(`/`))return e;if(!e)return t;let n=t.split(`/`),r=e.split(`/`),i=r[r.length-1];(i===`..`||i===`.`)&&r.push(``);let a=n.length-1,o,s;for(o=0;o1&&a--;else break}return n.slice(0,a).join(`/`)+`/`+r.slice(o).join(`/`)}var W={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0},Fr=function(e){return e.pop=`pop`,e.push=`push`,e}({}),Ir=function(e){return e.back=`back`,e.forward=`forward`,e.unknown=``,e}({});function Lr(e){if(!e){if(B){let t=document.querySelector(`base`);e=t&&t.getAttribute(`href`)||`/`,e=e.replace(/^\w+:\/\/[^\/]+/,``)}else e=`/`}return e[0]!==`/`&&e[0]!==`#`&&(e=`/`+e),Er(e)}var Rr=/^[^#]+#/;function zr(e,t){return e.replace(Rr,`#`)+t}function Br(e,t){let n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}var Vr=()=>({left:window.scrollX,top:window.scrollY});function Hr(e){let t;if(`el`in e){let n=e.el,r=typeof n==`string`&&n.startsWith(`#`),i=typeof n==`string`?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return;t=Br(i,e)}else t=e;`scrollBehavior`in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left==null?window.scrollX:t.left,t.top==null?window.scrollY:t.top)}function Ur(e,t){return(history.state?history.state.position-t:-1)+e}var Wr=new Map;function Gr(e,t){Wr.set(e,t)}function Kr(e){let t=Wr.get(e);return Wr.delete(e),t}function qr(e){return typeof e==`string`||e&&typeof e==`object`}function Jr(e){return typeof e==`string`||typeof e==`symbol`}var G=function(e){return e[e.MATCHER_NOT_FOUND=1]=`MATCHER_NOT_FOUND`,e[e.NAVIGATION_GUARD_REDIRECT=2]=`NAVIGATION_GUARD_REDIRECT`,e[e.NAVIGATION_ABORTED=4]=`NAVIGATION_ABORTED`,e[e.NAVIGATION_CANCELLED=8]=`NAVIGATION_CANCELLED`,e[e.NAVIGATION_DUPLICATED=16]=`NAVIGATION_DUPLICATED`,e}({}),Yr=Symbol(``);G.MATCHER_NOT_FOUND,G.NAVIGATION_GUARD_REDIRECT,G.NAVIGATION_ABORTED,G.NAVIGATION_CANCELLED,G.NAVIGATION_DUPLICATED;function Xr(e,t){return V(Error(),{type:e,[Yr]:!0},t)}function K(e,t){return e instanceof Error&&Yr in e&&(t==null||!!(e.type&t))}function Zr(e){let t={};if(e===``||e===`?`)return t;let n=(e[0]===`?`?e.slice(1):e).split(`&`);for(let e=0;ee&&br(e)):[r&&br(r)]).forEach(e=>{e!==void 0&&(t+=(t.length?`&`:``)+n,e!=null&&(t+=`=`+e))})}return t}function $r(e){let t={};for(let n in e){let r=e[n];r!==void 0&&(t[n]=H(r)?r.map(e=>e==null?null:``+e):r==null?r:``+r)}return t}var ei=Symbol(``),ti=Symbol(``),ni=Symbol(``),ri=Symbol(``),ii=Symbol(``);function ai(){let e=[];function t(t){return e.push(t),()=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function q(e,t,n,r,i,a=e=>e()){let o=r&&(r.enterCallbacks[i]=r.enterCallbacks[i]||[]);return()=>new Promise((s,c)=>{let l=e=>{e===!1?c(Xr(G.NAVIGATION_ABORTED,{from:n,to:t})):e instanceof Error?c(e):qr(e)?c(Xr(G.NAVIGATION_GUARD_REDIRECT,{from:t,to:e})):(o&&r.enterCallbacks[i]===o&&typeof e==`function`&&o.push(e),s())},u=a(()=>e.call(r&&r.instances[i],t,n,l)),d=Promise.resolve(u);e.length<3&&(d=d.then(l)),d.catch(e=>c(e))})}function oi(e,t,n,r,i=e=>e()){let a=[];for(let o of e)for(let e in o.components){let s=o.components[e];if(t===`beforeRouteEnter`||o.instances[e]){if($n(s)){let c=(s.__vccOpts||s)[t];c&&a.push(q(c,n,r,o,e,i))}else{let c=s();a.push(()=>c.then(a=>{if(!a)throw Error(`Couldn't resolve component "${e}" at "${o.path}"`);let s=er(a)?a.default:a;o.mods[e]=a,o.components[e]=s;let c=(s.__vccOpts||s)[t];return c&&q(c,n,r,o,e,i)()}))}}}return a}function si(e,t){let n=[],r=[],i=[],a=Math.max(t.matched.length,e.matched.length);for(let o=0;oU(e,a))?r.push(a):n.push(a));let s=e.matched[o];s&&(t.matched.find(e=>U(e,s))||i.push(s))}return[n,r,i]}var ci=()=>location.protocol+`//`+location.host;function li(e,t){let{pathname:n,search:r,hash:i}=t,a=e.indexOf(`#`);if(a>-1){let t=i.includes(e.slice(a))?e.slice(a).length:1,n=i.slice(t);return n[0]!==`/`&&(n=`/`+n),kr(n,``)}return kr(n,e)+r+i}function ui(e,t,n,r){let i=[],a=[],o=null,s=({state:a})=>{let s=li(e,location),c=n.value,l=t.value,u=0;if(a){if(n.value=s,t.value=a,o&&o===c){o=null;return}u=l?a.position-l.position:0}else r(s);i.forEach(e=>{e(n.value,c,{delta:u,type:Fr.pop,direction:u?u>0?Ir.forward:Ir.back:Ir.unknown})})};function c(){o=n.value}function l(e){i.push(e);let t=()=>{let t=i.indexOf(e);t>-1&&i.splice(t,1)};return a.push(t),t}function u(){if(document.visibilityState===`hidden`){let{history:e}=window;if(!e.state)return;e.replaceState(V({},e.state,{scroll:Vr()}),``)}}function d(){for(let e of a)e();a=[],window.removeEventListener(`popstate`,s),window.removeEventListener(`pagehide`,u),document.removeEventListener(`visibilitychange`,u)}return window.addEventListener(`popstate`,s),window.addEventListener(`pagehide`,u),document.addEventListener(`visibilitychange`,u),{pauseListeners:c,listen:l,destroy:d}}function di(e,t,n,r=!1,i=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:i?Vr():null}}function fi(e){let{history:t,location:n}=window,r={value:li(e,n)},i={value:t.state};i.value||a(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function a(r,a,o){let s=e.indexOf(`#`),c=s>-1?(n.host&&document.querySelector(`base`)?e:e.slice(s))+r:ci()+e+r;try{t[o?`replaceState`:`pushState`](a,``,c),i.value=a}catch(e){console.error(e),n[o?`replace`:`assign`](c)}}function o(e,n){a(e,V({},t.state,di(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),r.value=e}function s(e,n){let o=V({},i.value,t.state,{forward:e,scroll:Vr()});a(o.current,o,!0),a(e,V({},di(r.value,e,null),{position:o.position+1},n),!1),r.value=e}return{location:r,state:i,push:s,replace:o}}function pi(e){e=Lr(e);let t=fi(e),n=ui(e,t.state,t.location,t.replace);function r(e,t=!0){t||n.pauseListeners(),history.go(e)}let i=V({location:``,base:e,go:r,createHref:zr.bind(null,e)},t,n);return Object.defineProperty(i,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,"state",{enumerable:!0,get:()=>t.state.value}),i}var J=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.Group=2]=`Group`,e}({}),Y=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.ParamRegExp=2]=`ParamRegExp`,e[e.ParamRegExpEnd=3]=`ParamRegExpEnd`,e[e.EscapeNext=4]=`EscapeNext`,e}(Y||{}),mi={type:J.Static,value:``},hi=/[a-zA-Z0-9_]/;function gi(e){if(!e)return[[]];if(e===`/`)return[[mi]];if(!e.startsWith(`/`))throw Error(`Invalid path "${e}"`);function t(e){throw Error(`ERR (${n})/"${l}": ${e}`)}let n=Y.Static,r=n,i=[],a;function o(){a&&i.push(a),a=[]}let s=0,c,l=``,u=``;function d(){l&&=(n===Y.Static?a.push({type:J.Static,value:l}):n===Y.Param||n===Y.ParamRegExp||n===Y.ParamRegExpEnd?(a.length>1&&(c===`*`||c===`+`)&&t(`A repeatable param (${l}) must be alone in its segment. eg: '/:ids+.`),a.push({type:J.Param,value:l,regexp:u,repeatable:c===`*`||c===`+`,optional:c===`*`||c===`?`})):t(`Invalid state to consume buffer`),``)}function f(){l+=c}for(;st.length?t.length===1&&t[0]===X.Static+X.Segment?1:-1:0}function Si(e,t){let n=0,r=e.score,i=t.score;for(;n0&&t[t.length-1]<0}var wi={strict:!1,end:!0,sensitive:!1};function Ti(e,t,n){let r=V(bi(gi(e.path),n),{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function Ei(e,t){let n=[],r=new Map;t=rr(wi,t);function i(e){return r.get(e)}function a(e,n,r){let i=!r,s=Oi(e);s.aliasOf=r&&r.record;let l=rr(t,e),u=[s];if(`alias`in e){let t=typeof e.alias==`string`?[e.alias]:e.alias;for(let e of t)u.push(Oi(V({},s,{components:r?r.record.components:s.components,path:e,aliasOf:r?r.record:s})))}let d,f;for(let t of u){let{path:u}=t;if(n&&u[0]!==`/`){let e=n.record.path,r=e[e.length-1]===`/`?``:`/`;t.path=n.record.path+(u&&r+u)}if(d=Ti(t,n,l),r?r.alias.push(d):(f||=d,f!==d&&f.alias.push(d),i&&e.name&&!Ai(d)&&o(e.name)),Pi(d)&&c(d),s.children){let e=s.children;for(let t=0;t{o(f)}:nr}function o(e){if(Jr(e)){let t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(o),t.alias.forEach(o))}else{let t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(o),e.alias.forEach(o))}}function s(){return n}function c(e){let t=Mi(e,n);n.splice(t,0,e),e.record.name&&!Ai(e)&&r.set(e.record.name,e)}function l(e,t){let i,a={},o,s;if(`name`in e&&e.name){if(i=r.get(e.name),!i)throw Xr(G.MATCHER_NOT_FOUND,{location:e});s=i.record.name,a=V(Di(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&Di(e.params,i.keys.map(e=>e.name))),o=i.stringify(a)}else if(e.path!=null)o=e.path,i=n.find(e=>e.re.test(o)),i&&(a=i.parse(o),s=i.record.name);else{if(i=t.name?r.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw Xr(G.MATCHER_NOT_FOUND,{location:e,currentLocation:t});s=i.record.name,a=V({},t.params,e.params),o=i.stringify(a)}let c=[],l=i;for(;l;)c.unshift(l.record),l=l.parent;return{name:s,path:o,params:a,matched:c,meta:ji(c)}}e.forEach(e=>a(e));function u(){n.length=0,r.clear()}return{addRoute:a,resolve:l,removeRoute:o,clearRoutes:u,getRoutes:s,getRecordMatcher:i}}function Di(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function Oi(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:ki(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:`components`in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function ki(e){let t={},n=e.props||!1;if(`component`in e)t.default=n;else for(let r in e.components)t[r]=typeof n==`object`?n[r]:n;return t}function Ai(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function ji(e){return e.reduce((e,t)=>V(e,t.meta),{})}function Mi(e,t){let n=0,r=t.length;for(;n!==r;){let i=n+r>>1;Si(e,t[i])<0?r=i:n=i+1}let i=Ni(e);return i&&(r=t.lastIndexOf(i,r-1)),r}function Ni(e){let t=e;for(;t=t.parent;)if(Pi(t)&&Si(e,t)===0)return t}function Pi({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Fi(e){let t=P(ni),n=P(ri),r=k(()=>{let n=M(e.to);return t.resolve(n)}),i=k(()=>{let{matched:e}=r.value,{length:t}=e,i=e[t-1],a=n.matched;if(!i||!a.length)return-1;let o=a.findIndex(U.bind(null,i));if(o>-1)return o;let s=Bi(e[t-2]);return t>1&&Bi(i)===s&&a[a.length-1].path!==s?a.findIndex(U.bind(null,e[t-2])):o}),a=k(()=>i.value>-1&&zi(n.params,r.value.params)),o=k(()=>i.value>-1&&i.value===n.matched.length-1&&jr(n.params,r.value.params));function s(n={}){if(Ri(n)){let n=t[M(e.replace)?`replace`:`push`](M(e.to)).catch(nr);return e.viewTransition&&typeof document<`u`&&`startViewTransition`in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}return{route:r,href:k(()=>r.value.href),isActive:a,isExactActive:o,navigate:s}}function Ii(e){return e.length===1?e[0]:e}var Li=N({name:`RouterLink`,compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:`page`},viewTransition:Boolean},useLink:Fi,setup(e,{slots:t}){let n=A(Fi(e)),{options:r}=P(ni),i=k(()=>({[Vi(e.activeClass,r.linkActiveClass,`router-link-active`)]:n.isActive,[Vi(e.exactActiveClass,r.linkExactActiveClass,`router-link-exact-active`)]:n.isExactActive}));return()=>{let r=t.default&&Ii(t.default(n));return e.custom?r:D(`a`,{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},r)}}});function Ri(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&(e.button===void 0||e.button===0)){if(e.currentTarget&&e.currentTarget.getAttribute){let t=e.currentTarget.getAttribute(`target`);if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function zi(e,t){for(let n in t){let r=t[n],i=e[n];if(typeof r==`string`){if(r!==i)return!1}else if(!H(i)||i.length!==r.length||r.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}return!0}function Bi(e){return e?e.aliasOf?e.aliasOf.path:e.path:``}var Vi=(e,t,n)=>e??t??n,Hi=N({name:`RouterView`,inheritAttrs:!1,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){let r=P(ii),i=k(()=>e.route||r.value),a=P(ti,0),o=k(()=>{let e=M(a),{matched:t}=i.value,n;for(;(n=t[e])&&!n.components;)e++;return e}),s=k(()=>i.value.matched[o.value]);x(ti,k(()=>o.value+1)),x(ei,s),x(ii,i);let c=ue();return ee(()=>[c.value,s.value,e.name],([e,t,n],[r,i,a])=>{t&&(t.instances[n]=e,i&&i!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=i.leaveGuards),t.updateGuards.size||(t.updateGuards=i.updateGuards))),e&&t&&(!i||!U(t,i)||!r)&&(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:`post`}),()=>{let r=i.value,a=e.name,o=s.value,l=o&&o.components[a];if(!l)return Ui(n.default,{Component:l,route:r});let u=o.props[a],d=u?u===!0?r.params:typeof u==`function`?u(r):u:null,f=D(l,V({},d,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(o.instances[a]=null)},ref:c}));return Ui(n.default,{Component:f,route:r})||f}}});function Ui(e,t){if(!e)return null;let n=e(t);return n.length===1?n[0]:n}var Wi=Hi;function Gi(e){let t=Ei(e.routes,e),n=e.parseQuery||Zr,r=e.stringifyQuery||Qr,i=e.history,a=ai(),o=ai(),s=ai(),c=re(W),l=W;B&&e.scrollBehavior&&`scrollRestoration`in history&&(history.scrollRestoration=`manual`);let u=tr.bind(null,e=>``+e),d=tr.bind(null,Cr),f=tr.bind(null,wr);function p(e,n){let r,i;return Jr(e)?(r=t.getRecordMatcher(e),i=n):i=e,t.addRoute(i,r)}function m(e){let n=t.getRecordMatcher(e);n&&t.removeRoute(n)}function h(){return t.getRoutes().map(e=>e.record)}function g(e){return!!t.getRecordMatcher(e)}function _(e,a){if(a=V({},a||c.value),typeof e==`string`){let r=Dr(n,e,a.path),o=t.resolve({path:r.path},a),s=i.createHref(r.fullPath);return V(r,o,{params:f(o.params),hash:wr(r.hash),redirectedFrom:void 0,href:s})}let o;if(e.path!=null)o=V({},e,{path:Dr(n,e.path,a.path).path});else{let t=V({},e.params);for(let e in t)t[e]??delete t[e];o=V({},e,{params:d(t)}),a.params=d(a.params)}let s=t.resolve(o,a),l=e.hash||``;s.params=u(f(s.params));let p=Or(r,V({},e,{hash:yr(l),path:s.path})),m=i.createHref(p);return V({fullPath:p,hash:l,query:r===Qr?$r(e.query):e.query||{}},s,{redirectedFrom:void 0,href:m})}function y(e){return typeof e==`string`?Dr(n,e,c.value.path):V({},e)}function b(e,t){if(l!==e)return Xr(G.NAVIGATION_CANCELLED,{from:t,to:e})}function x(e){return C(e)}function S(e){return x(V(y(e),{replace:!0}))}function ee(e,t){let n=e.matched[e.matched.length-1];if(n&&n.redirect){let{redirect:r}=n,i=typeof r==`function`?r(e,t):r;return typeof i==`string`&&(i=i.includes(`?`)||i.includes(`#`)?i=y(i):{path:i},i.params={}),V({query:e.query,hash:e.hash,params:i.path==null?e.params:{}},i)}}function C(e,t){let n=l=_(e),i=c.value,a=e.state,o=e.force,s=e.replace===!0,u=ee(n,i);if(u)return C(V(y(u),{state:typeof u==`object`?V({},a,u.state):a,force:o,replace:s}),t||n);let d=n;d.redirectedFrom=t;let f;return!o&&Ar(r,i,n)&&(f=Xr(G.NAVIGATION_DUPLICATED,{to:d,from:i}),le(i,i,!0,!1)),(f?Promise.resolve(f):E(d,i)).catch(e=>K(e)?K(e,G.NAVIGATION_GUARD_REDIRECT)?e:ce(e):oe(e,d,i)).then(e=>{if(e){if(K(e,G.NAVIGATION_GUARD_REDIRECT))return C(V({replace:s},y(e.to),{state:typeof e.to==`object`?V({},a,e.to.state):a,force:o}),t||d)}else e=te(d,i,!0,s,a);return D(d,i,e),e})}function w(e,t){let n=b(e,t);return n?Promise.reject(n):Promise.resolve()}function T(e){let t=A.values().next().value;return t&&typeof t.runWithContext==`function`?t.runWithContext(e):e()}function E(e,t){let n,[r,i,s]=si(e,t);n=oi(r.reverse(),`beforeRouteLeave`,e,t);for(let i of r)i.leaveGuards.forEach(r=>{n.push(q(r,e,t))});let c=w.bind(null,e,t);return n.push(c),N(n).then(()=>{n=[];for(let r of a.list())n.push(q(r,e,t));return n.push(c),N(n)}).then(()=>{n=oi(i,`beforeRouteUpdate`,e,t);for(let r of i)r.updateGuards.forEach(r=>{n.push(q(r,e,t))});return n.push(c),N(n)}).then(()=>{n=[];for(let r of s)if(r.beforeEnter){if(H(r.beforeEnter))for(let i of r.beforeEnter)n.push(q(i,e,t));else n.push(q(r.beforeEnter,e,t))}return n.push(c),N(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=oi(s,`beforeRouteEnter`,e,t,T),n.push(c),N(n))).then(()=>{n=[];for(let r of o.list())n.push(q(r,e,t));return n.push(c),N(n)}).catch(e=>K(e,G.NAVIGATION_CANCELLED)?e:Promise.reject(e))}function D(e,t,n){s.list().forEach(r=>T(()=>r(e,t,n)))}function te(e,t,n,r,a){let o=b(e,t);if(o)return o;let s=t===W,l=B?history.state:{};n&&(r||s?i.replace(e.fullPath,V({scroll:s&&l&&l.scroll},a)):i.push(e.fullPath,a)),c.value=e,le(e,t,n,s),ce()}let O;function ne(){O||=i.listen((e,t,n)=>{if(!j.listening)return;let r=_(e),a=ee(r,j.currentRoute.value);if(a){C(V(a,{replace:!0,force:!0}),r).catch(nr);return}l=r;let o=c.value;B&&Gr(Ur(o.fullPath,n.delta),Vr()),E(r,o).catch(e=>K(e,G.NAVIGATION_ABORTED|G.NAVIGATION_CANCELLED)?e:K(e,G.NAVIGATION_GUARD_REDIRECT)?(C(V(y(e.to),{force:!0}),r).then(e=>{K(e,G.NAVIGATION_ABORTED|G.NAVIGATION_DUPLICATED)&&!n.delta&&n.type===Fr.pop&&i.go(-1,!1)}).catch(nr),Promise.reject()):(n.delta&&i.go(-n.delta,!1),oe(e,r,o))).then(e=>{e||=te(r,o,!1),e&&(n.delta&&!K(e,G.NAVIGATION_CANCELLED)?i.go(-n.delta,!1):n.type===Fr.pop&&K(e,G.NAVIGATION_ABORTED|G.NAVIGATION_DUPLICATED)&&i.go(-1,!1)),D(r,o,e)}).catch(nr)})}let k=ai(),ie=ai(),ae;function oe(e,t,n){ce(e);let r=ie.list();return r.length?r.forEach(r=>r(e,t,n)):console.error(e),Promise.reject(e)}function se(){return ae&&c.value!==W?Promise.resolve():new Promise((e,t)=>{k.add([e,t])})}function ce(e){return ae||(ae=!e,ne(),k.list().forEach(([t,n])=>e?n(e):t()),k.reset()),e}function le(t,n,r,i){let{scrollBehavior:a}=e;if(!B||!a)return Promise.resolve();let o=!r&&Kr(Ur(t.fullPath,0))||(i||!r)&&history.state&&history.state.scroll||null;return v().then(()=>a(t,n,o)).then(e=>e&&Hr(e)).catch(e=>oe(e,t,n))}let ue=e=>i.go(e),de,A=new Set,j={currentRoute:c,listening:!0,addRoute:p,removeRoute:m,clearRoutes:t.clearRoutes,hasRoute:g,getRoutes:h,resolve:_,options:e,push:x,replace:S,go:ue,back:()=>ue(-1),forward:()=>ue(1),beforeEach:a.add,beforeResolve:o.add,afterEach:s.add,onError:ie.add,isReady:se,install(e){e.component(`RouterLink`,Li),e.component(`RouterView`,Wi),e.config.globalProperties.$router=j,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>M(c)}),B&&!de&&c.value===W&&(de=!0,x(i.location).catch(e=>{}));let t={};for(let e in W)Object.defineProperty(t,e,{get:()=>c.value[e],enumerable:!0});e.provide(ni,j),e.provide(ri,fe(t)),e.provide(ii,c);let n=e.unmount;A.add(e),e.unmount=function(){A.delete(e),A.size<1&&(l=W,O&&O(),O=null,c.value=W,de=!1,ae=!1),n()}}};function N(e){return e.reduce((e,t)=>e.then(()=>T(t)),Promise.resolve())}return j}function Ki(e){return P(ri)}var qi=(e,t)=>({default:()=>e?D(Ne,e===!0?{}:e,t):t.default?.()}),Ji=/(:\w+)\([^)]+\)/g,Yi=/(:\w+)[?+*]/g,Xi=/:\w+/g;function Zi(e){let t=e?.meta.key??e.path.replace(Ji,`$1`).replace(Yi,`$1`).replace(Xi,t=>e.params[t.slice(1)]?.toString()||``);return typeof t==`function`?t(e):t}function Qi(e,t){return e===t||t===W?!1:Zi(e)!==Zi(t)||!e.matched.every((e,n)=>e.components&&e.components.default===t.matched[n]?.components?.default)}function $i(e){return Array.isArray(e)?e:[e]}function ea(e){let t=[];for(let n of e)n&&t.push({...n,onAfterLeave:n.onAfterLeave?$i(n.onAfterLeave):void 0,onBeforeLeave:n.onBeforeLeave?$i(n.onBeforeLeave):void 0});return Fe(...t)}var ta={scrollBehavior(e,t,n){let r=s(),i=I(),a=i.options?.scrollBehaviorType??`auto`;return e.path.replace(/\/$/,``)===t.path.replace(/\/$/,``)?t.hash&&!e.hash?n??{left:0,top:0}:e.hash?{el:e.hash,top:na(e.hash),behavior:a}:!1:(typeof e.meta.scrollToTop==`function`?e.meta.scrollToTop(e,t):e.meta.scrollToTop)===!1?!1:t===W?ra(e,t,n,a):new Promise(o=>{let s=()=>{requestAnimationFrame(()=>{if(i.currentRoute.value.fullPath!==e.fullPath){o(!1);return}o(ra(e,t,n,a))})};r.hooks.hookOnce(`page:loading:end`,()=>{let e=r[`~transitionPromise`];e?e.then(s):s()})})}};function na(e){try{let t=document.querySelector(e);if(t)return(Number.parseFloat(getComputedStyle(t).scrollMarginTop)||0)+(Number.parseFloat(getComputedStyle(document.documentElement).scrollPaddingTop)||0)}catch{}return 0}function ra(e,t,n,r){return n||(e.hash?{el:e.hash,top:na(e.hash),behavior:Qi(e,t)?r:`instant`}:{left:0,top:0})}var Z={hashMode:!1,scrollBehaviorType:`auto`,...ta},ia=De(async e=>{let t,n;if(!e.meta?.validate)return;let r=([t,n]=f(()=>Promise.resolve(e.meta.validate(e))),t=await t,n(),t);if(r!==!0)return Me({fatal:!0,status:r&&(r.status||r.statusCode)||404,statusText:r&&(r.statusText||r.statusMessage)||`Page Not Found: ${e.fullPath}`,data:{path:e.fullPath}})},1),aa=g({docsBase:a,reporters:e}),oa=(e,t)=>[],sa=oa,ca=function(e){if(!e.includes(`%`))return e;let t=e.indexOf(`?`),n=t===-1?e:e.slice(0,t);try{return t===-1?decodeURI(n):decodeURI(n)+e.slice(t)}catch{return e}},la=(e,t)=>{if(typeof e!=`string`)return e;let n=ca(e);return t?n.toLowerCase():n},ua=e=>Z.sensitive?Fe({},...oa(``,la(e,!1)).map(e=>e.data).reverse()):Fe({},...sa(``,la(e,!0)).map(e=>e.data).reverse()),da=`modulepreload`,fa=function(e,t){return new URL(e,t).href},pa={},Q=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=fa(t,n),t=s(t),t in pa)return;pa[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:da,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},ma=Ct,ha=ua,ga;function _a(){let e;return e=ma(xt(`builds/meta/${t().app.buildId}.json`),{responseType:`json`}).then(e=>{if(!e||typeof e!=`object`||!Array.isArray(e.prerendered))throw aa.NUXT_E5004();return e}),ga=e,e.catch(t=>{ga===e&&(ga=void 0),aa.NUXT_E5002({cause:t})}),e}function va(){return ga||_a()}function ya(e){let t=typeof e==`string`?e:e.path;try{return ha(t)}catch(e){return aa.NUXT_E5003({path:t,cause:e}),{}}}var ba=[ia,De(e=>{let t=ya({path:e.path});if(t.redirect){let n=t.redirect.includes(`#`)?t.redirect:t.redirect+e.hash;return je(n,{acceptRelative:!0})?(window.location.href=n,!1):n}})],xa={},Sa=[{name:`config`,path:`/config`,component:()=>Q(()=>import(`./DDlQRUFs.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]),import.meta.url)},{name:`debug`,path:`/debug`,component:()=>Q(()=>import(`./Di5spq1Y.js`),__vite__mapDeps([19,1,2,3,4,6,7,8,10,11,14,15,17,16]),import.meta.url)},{name:`devices`,path:`/devices`,component:()=>Q(()=>import(`./BH8nemMl.js`),__vite__mapDeps([20,1,21,2,3,4,5,7,6,8,10,11,12,13,14,15,22,23,18,16,24]),import.meta.url)},{name:`health`,path:`/health`,component:()=>Q(()=>import(`./BCSPyKdf.js`),__vite__mapDeps([25,1,4,26,21,2,3,5,7,6,8,13,14,22,27]),import.meta.url)},{name:`login`,path:`/login`,meta:{layout:`auth`},component:()=>Q(()=>import(`./EBK3dIz3.js`),__vite__mapDeps([28,1,2,3,4,7,10,11,29,14]),import.meta.url)},{name:`logs`,path:`/logs`,component:()=>Q(()=>import(`./11441PgY.js`),__vite__mapDeps([30,1,21,2,3,4,5,7,6,8,10,11,13,31,14,22,27]),import.meta.url)},{name:`stats`,path:`/stats`,component:()=>Q(()=>import(`./CC5v17Ca.js`),__vite__mapDeps([32,1,2,3,21,4,5,7,6,8,9,13,31,11,14,22,27]),import.meta.url)},{name:`tokens`,path:`/tokens`,component:()=>Q(()=>import(`./DvnvAQHt.js`),__vite__mapDeps([33,1,2,3,21,4,5,7,6,8,10,11,12,14,23]),import.meta.url)},{name:`upstreams`,path:`/upstreams`,component:()=>Q(()=>import(`./DpmZExze.js`),__vite__mapDeps([34,1,4,21,2,3,5,7,6,8,10,11,12,14,15,22,23,24]),import.meta.url)},{name:`index`,path:`/`,component:()=>Q(()=>import(`./BkfABsWB.js`),__vite__mapDeps([35,1,2,3,6,4,7,8,14,27]),import.meta.url)}];function Ca(e,t,n){let{pathname:r,search:i,hash:a}=t,o=e.indexOf(`#`);if(o>-1){let t=a.includes(e.slice(o))?e.slice(o).length:1,n=a.slice(t);return n[0]!==`/`&&(n=`/`+n),Ue(n,``)}let s=Ue(r,e),c=!n||Ae(s,n)?s:n;return c+(c.includes(`?`)?``:i)+a}var wa=p({name:`nuxt:router`,enforce:`pre`,async setup(e){let n,r,i=t().app.baseURL,a=Z.history?.(i)??pi(i),o=Z.routes?([n,r]=f(()=>Z.routes(Sa)),n=await n,r(),n??Sa):Sa,s,c=Gi({...Z,scrollBehavior:(e,t,n)=>{if(t===W){s=n;return}if(Z.scrollBehavior){if(c.options.scrollBehavior=Z.scrollBehavior,`scrollRestoration`in window.history){let e=c.beforeEach(()=>{e(),window.history.scrollRestoration=`manual`})}return Z.scrollBehavior(e,W,s||n)}},history:a,routes:o});`scrollRestoration`in window.history&&(window.history.scrollRestoration=`auto`),e.vueApp.use(c);let l=re(c.currentRoute.value);c.afterEach((e,t)=>{l.value=t}),Object.defineProperty(e.vueApp.config.globalProperties,"previousRoute",{get:()=>l.value});let u=Ca(i,window.location,e.payload.path),d=re(c.currentRoute.value),p=()=>{d.value=c.currentRoute.value};c.afterEach((e,t)=>{let n=e.matched.at(-1)?.components?.default,r=t.matched.at(-1)?.components?.default;if(n===r){Xn({route:e,Component:{type:n}})===Xn({route:t,Component:{type:r}})&&p();return}e.matched.lengthe.components?.default===t.matched[n]?.components?.default)&&p()});let m={sync:p};for(let e in d.value)Object.defineProperty(m,e,{get:()=>d.value[e],enumerable:!0});e._route=fe(m),e._middleware||={global:[],named:{}};let h=ze();c.afterEach(async(t,n,r)=>{delete e._processingMiddleware,!e.isHydrating&&h.value&&await e.runWithContext(Re),r&&await e.callHook(`page:loading:end`)});try{[n,r]=f(()=>c.isReady()),await n,r()}catch(t){[n,r]=f(()=>Ie(e,t)),await n,r()}let g=u===c.currentRoute.value.fullPath?c.currentRoute.value:c.resolve(u),_=c.currentRoute.value.fullPath,v=e.isHydrating&&e.payload.prerenderedAt&&e.payload.path&&u!==e.payload.path&&Ae(c.currentRoute.value.path,e.payload.path);p();function y(t){!e.isHydrating&&t.fullPath!==Ca(i,window.location)&&a.push(t.fullPath)}let b=e.payload.state._layout;return c.beforeEach(async(t,n)=>{await e.callHook(`page:loading:start`),t.meta=A(t.meta),e.isHydrating&&b&&!T(t.meta.layout)&&(t.meta.layout=b),e._processingMiddleware=!0;{let r=new Set([...ba,...e._middleware.global]);for(let e of t.matched){let t=e.meta.middleware;if(t)for(let e of Qn(t))r.add(e)}let i=ya({path:t.path});if(i.appMiddleware)for(let e in i.appMiddleware)i.appMiddleware[e]?r.add(e):r.delete(e);for(let i of r){let r=typeof i==`string`?e._middleware.named[i]||await xa[i]?.().then(e=>e.default||e):i;if(!r)throw ve.NUXT_E2004({entry:String(i),validMiddleware:void 0});try{let i=await e.runWithContext(()=>r(t,n));if(!e.payload.serverRendered&&e.isHydrating&&(i===!1||i instanceof Error)){let t=i||Me({status:404,statusText:`Page Not Found: ${u}`});return await e.runWithContext(()=>Le(t)),!1}if(i===!0)continue;if(i===!1)return i;if(i)return Te(i)&&i.fatal&&(await e.runWithContext(()=>Le(i)),y(t)),i}catch(n){let r=Me(n);return r.fatal&&(await e.runWithContext(()=>Le(r)),y(t)),r}}}}),c.onError(async()=>{delete e._processingMiddleware,await e.callHook(`page:loading:end`)}),c.afterEach(t=>{if(t.matched.length===0&&!h.value)return e.runWithContext(()=>Le(Me({status:404,fatal:!1,statusText:`Page not found: ${t.fullPath}`,data:{path:t.fullPath}})))}),e.hooks.hookOnce(`app:created`,async()=>{try{if(`name`in g&&(g.name=void 0),c.currentRoute.value.fullPath===_){if(v){let t=c.resolve(e.payload.path);`name`in t&&(t.name=void 0),await c.replace({...t,force:!0});let n=()=>{e[`~restoreDeferredRoute`]&&(e[`~restoreDeferredRoute`]=void 0,c.currentRoute.value=c.resolve(u),p(),c.replace({...g,force:!0}).catch(()=>{}))};e[`~restoreDeferredRoute`]=n,e.hooks.hookOnce(`app:suspense:resolve`,n)}else await c.replace({...g,force:!0})}c.options.scrollBehavior=Z.scrollBehavior}catch(t){await Ie(e,t)}}),{provide:{router:c}}}},1),Ta=globalThis.requestIdleCallback||(e=>{let t=Date.now(),n={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-t))};return setTimeout(()=>{e(n)},1)}),Ea=globalThis.cancelIdleCallback||(e=>{clearTimeout(e)}),Da=e=>{let t=s();t.isHydrating?t.hooks.hookOnce(`app:suspense:resolve`,()=>{Ta(()=>e())}):Ta(()=>e())},Oa=p(()=>{let e=I();Da(()=>{e.beforeResolve(async()=>{await new Promise(e=>{setTimeout(e,100),requestAnimationFrame(()=>{setTimeout(e,0)})})})})}),ka=p(e=>{let t;async function n(){let i;try{i=await va()}catch(e){let t=e;if(!(`status`in t&&(t.status===404||t.status===403)))throw t}t&&clearTimeout(t),t=setTimeout(n,r);try{let n=await Ct(xt(`builds/latest.json`)+`?${Date.now()}`);n.id!==i?.id&&(e.hooks.callHook(`app:manifest:update`,n),t&&clearTimeout(t))}catch{}}Da(()=>{t=setTimeout(n,r)})});function Aa(e={}){let t=e.path||window.location.pathname,n=new URL(t,window.location.href);if(n.host!==window.location.host)throw ve.NUXT_E2010({path:t});if(n.protocol&&we(n.protocol))throw ve.NUXT_E2002({toPath:t,protocol:n.protocol});let r={};try{r=JSON.parse(sessionStorage.getItem(`nuxt:reload`)||`{}`)}catch{}if(e.force||r?.path!==t||r?.expires{t=!1}),e.hook(`app:chunkError`,()=>{t&&he(navigator.userAgent)&&Aa()})}}),Ma=p({name:`nuxt:chunk-reload`,setup(e){let n=I(),r=t(),i=new Set;n.beforeEach(()=>{i.clear()}),e.hook(`app:chunkError`,({error:e})=>{i.add(e)});function a(e){Aa({path:Ge(r.app.baseURL,e.fullPath),persistState:!0})}e.hook(`app:manifest:update`,()=>{n.beforeResolve(a)}),n.onError((e,t)=>{i.has(e)&&a(t)})}});function Na(e){if(e?.__asyncLoader&&!e.__asyncResolved)return e.__asyncLoader()}async function Pa(e,t=I()){let{path:n,matched:r}=t.resolve(e);if(!r.length||(t._routePreloaded||=new Set,t._routePreloaded.has(n)))return;let i=t._preloadPromises||=[];if(i.length>4)return Promise.all(i).then(()=>Pa(e,t));t._routePreloaded.add(n);for(let e of r){let t=e.components?.default;if(typeof t!=`function`)continue;let n=Promise.resolve(t()).catch(()=>{}).finally(()=>i.splice(i.indexOf(n),1));i.push(n)}await Promise.all(i)}var Fa=(...e)=>e.find(e=>e!==void 0);function Ia(e){let t=e.replace(/[\u0000-\u001F\s]+/g,``);for(;t.toLowerCase().startsWith(`view-source:`);)t=t.slice(12);let n=t.indexOf(`:`);return n>0&&we(t.slice(0,n+1))?null:e}function La(e){let n=e.componentName||`NuxtLink`;function r(e){return typeof e==`string`&&e.startsWith(`#`)}function i(t,n,r){let i=r??e.trailingSlash;if(!t||i!==`append`&&i!==`remove`)return t;if(typeof t==`string`)return za(t,i);let a=`path`in t&&t.path!==void 0?t.path:n(t).path;return{...t,name:void 0,path:za(a,i)}}function a(n){let a=I(),o=t(),s=k(()=>!!M(n.target)&&M(n.target)!==`_self`),c=k(()=>{let e=M(n.to)||M(n.href)||``;return typeof e==`string`&&je(e,{acceptRelative:!0})}),l=E(`RouterLink`),u=l&&typeof l!=`string`?l.useLink:void 0,d=k(()=>{if(M(n.external))return!0;let e=M(n.to)||M(n.href)||``;return typeof e==`object`?!1:e===``||c.value}),f=k(()=>{let e=M(n.to)||M(n.href)||``;return d.value?e:i(e,a.resolve,M(n.trailingSlash))}),p=d.value?void 0:u?.({...n,to:f,viewTransition:M(n.viewTransition)}),m=k(()=>{let t=M(n.trailingSlash)??e.trailingSlash;if(!f.value||c.value||r(f.value)){let e=f.value;return typeof e==`string`?Ia(e):e}if(d.value){let e=typeof f.value==`object`&&`path`in f.value?Oe(f.value):f.value,n=typeof e==`object`?a.resolve(e).href:e,r=typeof n==`string`?Ia(n):n;return r===null?null:za(r,t)}return typeof f.value==`object`?a.resolve(f.value)?.href??null:za(Ge(o.app.baseURL,f.value),t)});return{to:f,hasTarget:s,isAbsoluteUrl:c,isExternal:d,href:m,isActive:p?.isActive??k(()=>f.value===a.currentRoute.value.path),isExactActive:p?.isExactActive??k(()=>f.value===a.currentRoute.value.path),route:p?.route??k(()=>a.resolve(f.value)),async navigate(e){m.value!==null&&await Ve(m.value,{replace:M(n.replace),external:d.value||s.value})}}}return N({name:n,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},prefetchOn:{type:[String,Object],default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1},trailingSlash:{type:String,default:void 0,required:!1}},useLink:a,setup(t,{slots:n}){let i=I(),{to:o,href:c,navigate:l,isExternal:u,hasTarget:d,isAbsoluteUrl:f}=a(t),p=re(!1),m=ue(null),h=e=>{m.value=t.custom?e?.$el?.nextElementSibling:e?.$el};function g(n){return!!(!p.value&&(typeof t.prefetchOn==`string`?t.prefetchOn===n:t.prefetchOn?.[n]??e.prefetchOn?.[n])&&(t.prefetch??e.prefetch)!==!1&&t.noPrefetch!==!0&&t.target!==`_blank`&&!Ha())}async function _(e=s()){if(p.value||c.value===null)return;p.value=!0;let t=typeof o.value==`string`?o.value:u.value?Oe(o.value):i.resolve(o.value).fullPath,n=u.value?new URL(t,window.location.href).href:t;await Promise.all([e.hooks.callHook(`link:prefetch`,n)?.catch(()=>{}),!u.value&&!d.value&&Pa(o.value,i).catch(()=>{})])}if(!t.custom&&g(`visibility`)){let e=s(),t,n=null;C(()=>{let r=Ba();Da(()=>{t=Ta(()=>{m?.value?.tagName&&(n=r.observe(m.value,async()=>{n?.(),n=null,await _(e)}))})})}),le(()=>{t&&Ea(t),n?.(),n=null})}return()=>{let a=t.target||null,s=Fa(t.noRel?``:t.rel,e.externalRelAttribute,f.value||d.value?`noopener noreferrer`:``)||null,v=e=>({href:c.value,navigate:l,get route(){if(!c.value)return;let e=new URL(c.value,window.location.href);return{path:e.pathname,fullPath:e.pathname,get query(){return Ee(e.search)},hash:e.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:c.value}},rel:s,target:a,isExternal:u.value||d.value,isActive:!1,isExactActive:!1,...e,prefetch:_,prefetched:p.value,shouldPrefetch:g});if(!u.value&&!d.value&&!r(o.value)){let r={ref:h,to:o.value,activeClass:t.activeClass||e.activeClass,exactActiveClass:t.exactActiveClass||e.exactActiveClass,replace:t.replace,ariaCurrentValue:t.ariaCurrentValue,custom:t.custom};return t.custom||(g(`interaction`)&&(r.onPointerenter=_.bind(null,void 0),r.onFocus=_.bind(null,void 0)),p.value&&(r.class=t.prefetchedClass||e.prefetchedClass),r.rel=t.rel||void 0),D(E(`RouterLink`),r,t.custom&&n.default?{default:e=>n.default(v(e))}:n.default)}return t.custom?n.default?n.default(v()):null:D(`a`,{ref:m,href:c.value||null,rel:s,target:a,onClick:async e=>{if(!(u.value||d.value)){e.preventDefault();try{let e=Pe(c.value??``);return await(t.replace?i.replace(e):i.push(e))}finally{if(r(o.value)){let e=o.value.slice(1),t=e;try{t=decodeURIComponent(e)}catch{}document.getElementById(t)?.focus()}}}}},n.default?.())}}})}var Ra=La(h);function za(e,t){if(t!==`append`&&t!==`remove`)return e;let n=t===`append`?ge:Ce;return je(e)&&!e.startsWith(`http`)?e:n(e,!0)}function Ba(){let e=s();if(e._observer)return e._observer;let t=null,n=new Map;return e._observer={observe:(e,r)=>(t||=new IntersectionObserver(e=>{for(let t of e){let e=n.get(t.target);(t.isIntersecting||t.intersectionRatio>0)&&e&&e()}}),n.set(e,r),t.observe(e),()=>{n.delete(e),t?.unobserve(e),n.size===0&&(t?.disconnect(),t=null)})}}var Va=/2g/;function Ha(){let e=navigator.connection;return!!(e&&(e.saveData||Va.test(e.effectiveType)))}var Ua=p({name:`nuxt:island-link-navigation`,setup(e){}}),Wa=p({name:`nuxt:global-components`}),$={auth:O(()=>Q(()=>import(`./Cxvr5SZe.js`).then(e=>e.default||e),__vite__mapDeps([36,1,37,4]),import.meta.url)),default:O(()=>Q(()=>import(`./rHT2Oyk9.js`).then(e=>e.default||e),__vite__mapDeps([38,1,2,3,4,26,37,29,8,14]),import.meta.url))},Ga=[Gn,wa,Oa,ka,ja,Ma,Ua,Wa,p({name:`nuxt:prefetch`,setup(e){let t=I();e.hooks.hook(`app:mounted`,()=>{t.beforeEach(async e=>{let t=e?.meta?.layout;t&&typeof $[t]==`function`&&await $[t]()})}),e.hooks.hook(`link:prefetch`,e=>{if(je(e))return;let n=t.resolve(e);if(!n)return;let r=n.meta.layout,i=Qn(n.meta.middleware).filter(e=>typeof e==`string`);for(let e of i){let t=xa[e];typeof t==`function`&&t()}typeof r==`string`&&r in $&&Na($[r])})}})],Ka=(e=`RouteProvider`)=>N({name:e,props:{route:{type:Object,required:!0},vnode:Object,vnodeRef:Object,renderKey:String,trackRootNodes:Boolean,routeRecord:Object},setup(e){let t=e.renderKey,n=e.route,r={};for(let i in e.route)Object.defineProperty(r,i,{get:()=>t===e.renderKey?e.route[i]:n[i],enumerable:!0});return x(F,fe(r)),()=>e.vnode?D(e.vnode,{ref:e.vnodeRef}):e.vnode}}),qa=Ka(),Ja=new WeakMap,Ya=N({name:`NuxtPage`,inheritAttrs:!1,props:{name:{type:String},transition:{type:[Boolean,Object],default:void 0},keepalive:{type:[Boolean,Object],default:void 0},route:{type:Object},pageKey:{type:[Function,String],default:null}},setup(e,{attrs:t,slots:r,expose:i}){let a=s(),o=ue(),c=P(F,null),l=new Set,u;i({pageRef:o});let d=P(_e,null),f,p=a.deferHydration(),m=!1,h=!1,g,_=0;if(a.isHydrating){let e=a.hooks.hookOnce(`app:error`,p),t=I().beforeEach(()=>{e(),t()})}e.pageKey&&ee(()=>e.pageKey,(e,t)=>{e!==t&&a.callHook(`page:loading:start`)});let y=!1;{let e=I().beforeResolve(()=>{y=!1});le(()=>{e(),p()})}return()=>D(Wi,{name:e.name,route:e.route,...t},{default:Qa(t=>{let i=Xa(c,t.route,t.Component),s=c&&c.matched.length===t.route.matched.length;if(!t.Component){if(f&&!s&&!eo(f))return f;p();return}if(f&&d&&!eo(f)&&!d.isCurrent(t.route))return f;if(i&&c&&(!d||d?.isCurrent(c)))return(s||f)&&!eo(f)?f:null;let b=Xn(t,e.pageKey),x=Za(c,t.route,t.Component);!a.isHydrating&&u===b&&!x&&v(()=>{y||(y=!0,a.callHook(`page:loading:end`))}),m&&u!==b&&h&&_++,u=b;let S=!!(e.transition??t.route.meta.pageTransition??n),ee=S&&ea([e.transition,t.route.meta.pageTransition,n,{onAfterLeave(){a[`~transitionFinish`]?.(),delete a[`~transitionFinish`],delete a[`~transitionPromise`],a.callHook(`page:transition:finish`,t.Component)}}]),C=e.keepalive??t.route.meta.keepalive??!1,w=t.Component.type,T=w.name||w.__name;t.route.meta.keepalive&&T&&l.add(T);let E;if(l.size>0&&e.keepalive==null&&(!C||typeof C==`object`&&C&&C.include)){let e=typeof C==`object`&&C?{...C}:{},t=e.include?Array.isArray(e.include)?e.include:[e.include]:[];E={...e,include:Array.from(new Set([...t,...l]))}}else E=C;return f=qi(S&&ee,Zn(E,D(ne,{key:_,suspensible:!0,onPending:()=>{m=!0,S&&!a[`~transitionPromise`]&&(a[`~transitionPromise`]=new Promise(e=>{a[`~transitionFinish`]=e})),g=a.callHook(`page:start`,t.Component)},onResolve:async()=>{m=!1,h=!0,a.isHydrating&&a[`~restoreDeferredRoute`]?.();try{await v(),a._route.sync?.(),await g,await a.callHook(`page:finish`,t.Component),!y&&!x&&(y=!0,await a.callHook(`page:loading:end`))}finally{p()}}},{default:()=>{let e={key:b||void 0,vnode:r.default?$a(r.default,t):t.Component,route:t.route,renderKey:b||void 0,trackRootNodes:S,vnodeRef:o,routeRecord:void 0};if(!E)return D(qa,e);let n=w,i=Ja.get(n);return i||(i=Ka(T),Ja.set(n,i)),D(i,e)}}))).default(),f})})}});function Xa(e,t,n){if(!e)return!1;let r=t.matched.findIndex(e=>e.components?.default===n?.type);if(r===-1)return!1;let i=t.matched.slice(0,r).filter(e=>e.components?.default);if(!i.length)return!1;let a=e.matched.filter(e=>e.components?.default);return i.some((e,t)=>e.components?.default!==a[t]?.components?.default)||n&&Xn({route:t,Component:n})!==Xn({route:e,Component:n})}function Za(e,t,n){return e?t.matched.findIndex(e=>e.components?.default===n?.type){let n=e(t);return Array.isArray(n)?n:n==null||!te(n)?[ie()]:[n]});return t._n=!0,t}function $a(e,t){let n=e(t);return n.length===1?D(n[0]):D(de,void 0,n)}function eo(e){return!!e&&(!!e.suspense?.isUnmounted||!!e.component?.isUnmounted)}var to=ua;function no(e,t){return M(t)??e?.meta.layout??to(e?.path??`/`).appLayout??`default`}var ro=N({name:`LayoutLoader`,inheritAttrs:!1,props:{name:String,layoutProps:Object},setup(e,t){return()=>D($[e.name],e.layoutProps,t.slots)}}),io=N({name:`NuxtLayout`,inheritAttrs:!1,props:{name:{type:[String,Boolean,Object],default:null},fallback:{type:[String,Object],default:null}},setup(e,t){let n=s(),r=P(F),i=!r||r===ke()?Ki():r,a=k(()=>{let t=no(i,e.name);return t&&!(t in $)&&e.fallback&&(t=M(e.fallback)),t});x(be,a);let o=re();t.expose({layoutRef:o});let c=n.deferHydration();if(n.isHydrating){let e=n.hooks.hookOnce(`app:error`,c),t=I().beforeEach(()=>{e(),t()})}let l;return()=>{let r=!!a.value&&a.value in $&&!!(i?.meta.layoutTransition??!1),s=r&&ea([i?.meta.layoutTransition,!1,{onBeforeLeave(){n[`~transitionPromise`]=new Promise(e=>{n[`~transitionFinish`]=e})},onAfterLeave(){n[`~transitionFinish`]?.(),delete n[`~transitionFinish`],delete n[`~transitionPromise`]}}]),u=l;return l=a.value,qi(s,{default:()=>D(ne,{suspensible:!0,onResolve:async()=>{await v(c)}},{default:()=>D(ao,{layoutProps:b(t.attrs,i.meta.layoutProps??{},{ref:o}),key:a.value||void 0,name:a.value,shouldProvide:!e.name,isRenderingNewLayout:e=>e!==u&&e===a.value,hasTransition:r},t.slots)})}).default()}}}),ao=N({name:`NuxtLayoutProvider`,inheritAttrs:!1,props:{name:{type:[String,Boolean]},layoutProps:{type:Object},hasTransition:{type:Boolean},shouldProvide:{type:Boolean},isRenderingNewLayout:{type:Function,required:!0}},setup(e,t){let n=e.name;e.shouldProvide&&x(_e,{isCurrent:e=>n===!1||n===no(e)});let r=P(F),i=r&&r===ke(),a=P(_e,null);if(i){let t=Ki(),n={};for(let i in t){let o=i;Object.defineProperty(n,o,{enumerable:!0,get:()=>e.isRenderingNewLayout(e.name)&&(!a||a.isCurrent(t))?t[o]:r[o]})}x(F,fe(n))}return()=>!n||typeof n==`string`&&!(n in $)?t.slots.default?.():D(ro,{key:n,layoutProps:e.layoutProps,name:n},t.slots)}}),oo=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},so={},co={class:`min-h-screen bg-background text-foreground`};function lo(e,t){let n=Ya,r=io;return w(),ae(`div`,co,[oe(r,null,{default:S(()=>[oe(n)]),_:1})])}var uo=oo(so,[[`render`,lo]]),fo={__name:`nuxt-error-page`,props:{error:Object},setup(e){let t=e.error,n=Number(t.statusCode||500),r=n===404,i=t.statusMessage??(r?`Page Not Found`:`Internal Server Error`),a=t.message||t.toString(),o=O(()=>Q(()=>import(`./PJ4Qaee8.js`),__vite__mapDeps([39,1,40,3,41]),import.meta.url)),s=O(()=>Q(()=>import(`./CnEaNhAK.js`),__vite__mapDeps([42,1,40,3,43]),import.meta.url)),c=r?o:s;return(e,t)=>(w(),j(M(c),y(pe({status:M(n),statusText:M(i),statusCode:M(n),statusMessage:M(i),description:M(a),stack:M(void 0)})),null,16))}},po=()=>null,mo={key:0},ho={__name:`nuxt-root`,setup(e){let t=s(),n=t.deferHydration();if(t.isHydrating){let e=t.hooks.hookOnce(`app:error`,n),r=I().beforeEach(()=>{e(),r()})}window.location.pathname,x(F,ke()),t.hooks.callHookWith(e=>e.map(e=>e()),`vue:setup`,[]);let r=ze();function i(e,n,r){let i=t.vueApp.config.errorHandler;if(i&&!i.__nuxt_default)try{i(e,n,r)}catch(e){console.error("[nuxt] Error in `app.config.errorHandler`",e)}}return ce((e,n,r)=>{if(t.hooks.callHook(`vue:error`,e,n,r)?.catch(e=>console.error("[nuxt] Error in `vue:error` hook",e)),he(navigator.userAgent))return Be(t,e),!1;if(Te(e)&&(e.fatal||e.unhandled))return t.runWithContext(()=>Le(e)),i(e,n,r),!1}),(e,t)=>(w(),j(ne,{onResolve:M(n)},{default:S(()=>[M(!1)?(w(),ae(`div`,mo)):M(r)?(w(),j(M(fo),{key:1,error:M(r)},null,8,[`error`])):M(!1)?(w(),j(M(po),{key:2,context:M(!1)},null,8,[`context`])):M(!1)?(w(),j(me(M(!1)),{key:3})):(w(),j(M(uo),{key:4}))]),_:1},8,[`onResolve`]))}},go;{let e;go=async function(){if(e)return e;let t=!!(window.__NUXT__?.serverRendered??document.getElementById(`__NUXT_DATA__`)?.dataset.ssr===`true`),n=t?xe(ho):ye(ho),r=u({vueApp:n});async function a(e){await r.callHook(`app:error`,e),r.payload.error||=Me(e)}a.__nuxt_default=!0,n.config.errorHandler=a,r.hook(`app:suspense:resolve`,()=>{n.config.errorHandler===a&&(n.config.errorHandler=void 0)}),!t&&c.id&&r.hook(`app:suspense:resolve`,()=>{document.getElementById(c.id)?.remove()});try{await m(r,Ga)}catch(e){a(e)}try{await r.hooks.callHook(`app:created`,n),await r.hooks.callHook(`app:beforeMount`,n),n.mount(i),await r.hooks.callHook(`app:mounted`,n),await v()}catch(e){a(e)}return n},e=go().catch(e=>{throw o.NUXT_E1009({cause:e}),e})}export{Gt as a,xn as i,Ra as n,bn as r,oo as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/nj6DwLzD.js b/server/adminui/_nuxt/nj6DwLzD.js new file mode 100644 index 0000000..5524630 --- /dev/null +++ b/server/adminui/_nuxt/nj6DwLzD.js @@ -0,0 +1 @@ +import{_ as e,g as t,i as n,v as r}from"./CMHCZ1c-.js";import{$ as i,st as a}from"./Bx_a1Ri3.js";import"./Dw7E2aQ0.js";var o=r({docsBase:t,reporters:e}),s=`$s`;function c(...e){let t=typeof e[e.length-1]==`string`?e.pop():void 0;typeof e[0]!=`string`&&e.unshift(t);let[r,c]=e;if(!r||typeof r!=`string`)throw o.NUXT_E7009({key:r});if(c!==void 0&&typeof c!=`function`)throw o.NUXT_E7007({type:typeof c});let l=s+r,u=n(),d=a(u.payload.state,l);if(c&&(u._state[l]??={_default:c}),d.value===void 0&&c){let e=c();if(i(e))return u.payload.state[l]=e,e;d.value=e}return d}var l=`liapi_admin_token`,u=()=>c(`admin-token`,()=>``);function d(){let e=u(),t=`/admin/api`;function n(){e.value||=localStorage.getItem(l)||``}function r(t){e.value=t.trim(),e.value?localStorage.setItem(l,e.value):localStorage.removeItem(l)}function i(){r(``)}async function a(r,i={}){n();let a=new Headers(i.headers||{});return!a.has(`Content-Type`)&&i.body&&a.set(`Content-Type`,`application/json`),e.value&&a.set(`Authorization`,`Bearer ${e.value}`),fetch(t+r,{...i,headers:a})}async function o(e,t={}){let n;try{n=await a(e,t)}catch(e){throw Error(`网络错误: `+e.message)}let r=await n.text(),i={};if(r)try{i=JSON.parse(r)}catch{i={raw:r}}if(n.status===401){let e=Error(`unauthorized`);throw e.unauthorized=!0,e}if(!n.ok){let e=i.error?.message||r||`HTTP `+n.status;throw Error(e)}return i}async function s(e,n){let i=await fetch(t+`/login`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({username:e,password:n})}),a=await i.text(),o={};if(a)try{o=JSON.parse(a)}catch{o={}}if(!i.ok)throw Error(o?.error?.message||a||`HTTP `+i.status);if(!o?.token)throw Error(`登录响应缺少 token`);r(o.token)}async function c(){try{e.value&&await a(`/logout`,{method:`POST`})}catch{}finally{i()}}async function d(e,t){let n=await a(e);if(!n.ok)throw Error(`HTTP `+n.status);let r=await n.blob(),i=URL.createObjectURL(r),o=document.createElement(`a`);o.href=i,o.download=t,o.click(),URL.revokeObjectURL(i)}return{token:e,loadToken:n,setToken:r,clearToken:i,login:s,logout:c,request:o,download:d}}export{d as t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/rHT2Oyk9.js b/server/adminui/_nuxt/rHT2Oyk9.js new file mode 100644 index 0000000..6654613 --- /dev/null +++ b/server/adminui/_nuxt/rHT2Oyk9.js @@ -0,0 +1 @@ +import{Et as e,I as t,J as n,K as r,L as i,M as a,P as o,c as s,d as ee,f as c,g as l,kt as u,l as d,nt as f,r as te,u as p,ut as m,v as h,z as g}from"./Bx_a1Ri3.js";import{f as ne,j as re,p as ie}from"./Dw7E2aQ0.js";import{n as ae}from"#entry";import{t as _}from"./BOgT-xSl.js";import{t as v}from"./DXIMwwdP.js";import{t as y}from"./DsoWRbkX.js";import{t as b}from"./B2oFgaBj.js";import{t as x}from"./z_P_bNzM.js";import{t as S}from"./nj6DwLzD.js";var C=_(`chart-column`,[[`path`,{d:`M3 3v16a2 2 0 0 0 2 2h16`,key:`c24i48`}],[`path`,{d:`M18 17V9`,key:`2bz60n`}],[`path`,{d:`M13 17V5`,key:`1frdt8`}],[`path`,{d:`M8 17v-3`,key:`17ska0`}]]),w=_(`circle-user`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`circle`,{cx:`12`,cy:`10`,r:`3`,key:`ilqhr7`}],[`path`,{d:`M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662`,key:`154egf`}]]),T=_(`flask-conical`,[[`path`,{d:`M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2`,key:`18mbvz`}],[`path`,{d:`M6.453 15h11.094`,key:`3shlmq`}],[`path`,{d:`M8.5 2h7`,key:`csnxdl`}]]),E=_(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),D=_(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),O=_(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),k=_(`moon`,[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]),A=_(`scroll-text`,[[`path`,{d:`M15 12h-5`,key:`r7krc0`}],[`path`,{d:`M15 8h-5`,key:`1khuty`}],[`path`,{d:`M19 17V5a2 2 0 0 0-2-2H4`,key:`zz82l3`}],[`path`,{d:`M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3`,key:`1ph1d7`}]]),j=_(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]),M=_(`server`,[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]),N=_(`smartphone`,[[`rect`,{width:`14`,height:`20`,x:`5`,y:`2`,rx:`2`,ry:`2`,key:`1yt0o3`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}]]),P=_(`sun`,[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]),F={class:`flex min-h-screen bg-background text-foreground`},I={class:`flex h-16 items-center gap-2.5 border-b border-border px-5`},oe={class:`grid h-8 w-8 place-items-center rounded-lg bg-primary text-primary-foreground`},L={class:`flex-1 space-y-1 overflow-y-auto p-3`},R={class:`border-t border-border p-3`},z={class:`flex min-w-0 flex-1 flex-col`},B={class:`sticky top-0 z-20 flex h-16 items-center gap-3 border-b border-border bg-background/80 px-4 backdrop-blur-md sm:px-6`},V={class:`text-base font-semibold tracking-tight`},H={class:`ml-auto flex items-center gap-2`},U=[`title`],W=[`title`],G={class:`hidden sm:inline`},K={class:`flex-1 p-4 sm:p-6`},q=h({__name:`default`,setup(h){let{token:_,loadToken:q,logout:se}=S(),J=ne(),ce=ie(),Y=[{to:`/`,label:`概览`,icon:E},{to:`/upstreams`,label:`上游`,icon:M},{to:`/tokens`,label:`令牌`,icon:b},{to:`/devices`,label:`设备`,icon:N},{to:`/stats`,label:`统计`,icon:C},{to:`/logs`,label:`日志`,icon:A},{to:`/health`,label:`健康`,icon:v},{to:`/config`,label:`配置`,icon:j},{to:`/debug`,label:`调试`,icon:T}],X=f(!1),Z=f(!0);a(()=>{q();let e=localStorage.getItem(`liapi_theme`);Z.value=!e||e===`dark`,Q(),_.value||$()});function Q(){document.documentElement.classList.toggle(`dark`,Z.value),localStorage.setItem(`liapi_theme`,Z.value?`dark`:`light`)}function le(){Z.value=!Z.value,Q()}function $(){ce.push({path:`/login`,query:{redirect:J.fullPath}})}r(()=>J.path,()=>{X.value=!1});let ue=s(()=>Y.find(e=>e.to===J.path)?.label||`概览`);return(r,a)=>{let s=ae;return o(),c(`div`,F,[d(`aside`,{class:e([`fixed inset-y-0 left-0 z-40 flex w-60 shrink-0 flex-col border-r border-border bg-background transition-transform duration-300 lg:static lg:translate-x-0`,m(X)?`translate-x-0`:`-translate-x-full`])},[d(`div`,I,[d(`div`,oe,[l(m(y),{size:18})]),a[3]||=d(`div`,{class:`leading-tight`},[d(`div`,{class:`text-sm font-semibold tracking-tight`},`Liapi`),d(`div`,{class:`text-[11px] text-muted-foreground`},`API Gateway`)],-1)]),d(`nav`,L,[(o(),c(te,null,t(Y,e=>l(s,{key:e.to,to:e.to,class:`group flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium text-muted-foreground transition-all duration-200 hover:bg-muted hover:text-foreground`,"active-class":`!bg-muted !text-foreground`,"exact-active-class":e.to===`/`?`!bg-muted !text-foreground`:``},{default:n(()=>[(o(),p(g(e.icon),{size:17,class:`transition-transform duration-200 group-hover:scale-110`})),d(`span`,null,u(e.label),1)]),_:2},1032,[`to`,`exact-active-class`])),64))]),d(`div`,R,[d(`button`,{class:`flex w-full items-center gap-3 rounded-lg px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,onClick:a[0]||=e=>m(se)().then($)},[l(m(D),{size:16}),a[4]||=d(`span`,null,`退出登录`,-1)])])],2),l(re,{name:`fade`},{default:n(()=>[m(X)?(o(),c(`div`,{key:0,class:`fixed inset-0 z-30 bg-black/40 lg:hidden`,onClick:a[1]||=e=>X.value=!1})):ee(``,!0)]),_:1}),d(`div`,z,[d(`header`,B,[d(`button`,{class:`grid h-9 w-9 place-items-center rounded-lg text-muted-foreground transition-colors hover:bg-muted hover:text-foreground lg:hidden`,onClick:a[2]||=e=>X.value=!m(X)},[(o(),p(g(m(X)?m(x):m(O)),{size:19}))]),d(`h1`,V,u(m(ue)),1),d(`div`,H,[d(`button`,{class:`grid h-9 w-9 place-items-center rounded-lg text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,title:m(Z)?`切换到亮色`:`切换到暗色`,onClick:le},[(o(),p(g(m(Z)?m(P):m(k)),{size:18}))],8,U),d(`button`,{class:`flex items-center gap-2 rounded-lg border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,title:m(_)?`切换账号`:`登录`,onClick:$},[l(m(w),{size:15}),d(`span`,G,u(m(_)?`已认证`:`未认证`),1)],8,W)])]),d(`main`,K,[i(r.$slots,`default`)])])])}}});export{q as default}; \ No newline at end of file diff --git a/server/adminui/_nuxt/zZGEHylc.js b/server/adminui/_nuxt/zZGEHylc.js new file mode 100644 index 0000000..489c9a0 --- /dev/null +++ b/server/adminui/_nuxt/zZGEHylc.js @@ -0,0 +1 @@ +function e(e){let t=Number(e||0);return t>=1e9?(t/1e9).toFixed(2)+`B`:t>=1e6?(t/1e6).toFixed(2)+`M`:t>=1e3?(t/1e3).toFixed(2)+`K`:String(t)}function t(e){return Number(e||0).toFixed(4)}function n(e){return e?e.length>=19?e.slice(11,19):e:`-`}function r(e){return e>=200&&e<300?`success`:e>=400&&e<500?`warning`:`danger`}export{r as i,e as n,n as r,t}; \ No newline at end of file diff --git a/server/adminui/_nuxt/z_P_bNzM.js b/server/adminui/_nuxt/z_P_bNzM.js new file mode 100644 index 0000000..4586833 --- /dev/null +++ b/server/adminui/_nuxt/z_P_bNzM.js @@ -0,0 +1 @@ +import{t as e}from"./BOgT-xSl.js";var t=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t}; \ No newline at end of file diff --git a/server/adminui/config/index.html b/server/adminui/config/index.html new file mode 100644 index 0000000..57b13ff --- /dev/null +++ b/server/adminui/config/index.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/debug/index.html b/server/adminui/debug/index.html new file mode 100644 index 0000000..40dbcbd --- /dev/null +++ b/server/adminui/debug/index.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/devices/index.html b/server/adminui/devices/index.html new file mode 100644 index 0000000..40dbcbd --- /dev/null +++ b/server/adminui/devices/index.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/health/index.html b/server/adminui/health/index.html new file mode 100644 index 0000000..018eaf6 --- /dev/null +++ b/server/adminui/health/index.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/index.html b/server/adminui/index.html index e074a8b..9230448 100644 --- a/server/adminui/index.html +++ b/server/adminui/index.html @@ -1,942 +1 @@ - - - - - -Liapi Admin - - - -
-

Liapi Admin

- - -
-
- -
-
-

概览

-
-
-
- - - - - - - - - - - - - - - - - -
-
- - - \ No newline at end of file +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/login/index.html b/server/adminui/login/index.html new file mode 100644 index 0000000..018eaf6 --- /dev/null +++ b/server/adminui/login/index.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/logs/index.html b/server/adminui/logs/index.html new file mode 100644 index 0000000..d63dffd --- /dev/null +++ b/server/adminui/logs/index.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/stats/index.html b/server/adminui/stats/index.html new file mode 100644 index 0000000..d63dffd --- /dev/null +++ b/server/adminui/stats/index.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/tokens/index.html b/server/adminui/tokens/index.html new file mode 100644 index 0000000..d63dffd --- /dev/null +++ b/server/adminui/tokens/index.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui/upstreams/index.html b/server/adminui/upstreams/index.html new file mode 100644 index 0000000..da5c5cb --- /dev/null +++ b/server/adminui/upstreams/index.html @@ -0,0 +1 @@ +Liapi Admin
\ No newline at end of file diff --git a/server/adminui_test.go b/server/adminui_test.go new file mode 100644 index 0000000..8d91dfe --- /dev/null +++ b/server/adminui_test.go @@ -0,0 +1,66 @@ +package server + +import ( + "net/http" + "strings" + "testing" +) + +// The admin UI is a Nuxt-generated static SPA embedded via go:embed. These +// tests pin the serving contract: / → index.html, /_nuxt/* → hashed assets, +// and any other GET path → index.html (client-side router fallback). +func TestAdminUIServesSPA(t *testing.T) { + srv, _ := newTestServer(t, nil) + + t.Run("root serves index.html", func(t *testing.T) { + rec := serve(srv, newRequest("GET", "/", "", "")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200", rec.Code) + } + if ct := rec.Header().Get("Content-Type"); !strings.Contains(ct, "text/html") { + t.Fatalf("content-type = %q, want text/html", ct) + } + if !strings.Contains(rec.Body.String(), "Liapi") { + t.Fatalf("index.html body missing expected marker") + } + }) + + t.Run("client route falls back to index.html", func(t *testing.T) { + rec := serve(srv, newRequest("GET", "/upstreams", "", "")) + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want 200", rec.Code) + } + if !strings.Contains(rec.Header().Get("Content-Type"), "text/html") { + t.Fatalf("content-type = %q, want text/html", rec.Header().Get("Content-Type")) + } + }) + + t.Run("admin redirects to root", func(t *testing.T) { + rec := serve(srv, newRequest("GET", "/admin", "", "")) + if rec.Code != http.StatusMovedPermanently { + t.Fatalf("status = %d, want 301", rec.Code) + } + }) + + t.Run("admin api still requires auth", func(t *testing.T) { + rec := serve(srv, newRequest("GET", "/admin/api/overview", "", "")) + if rec.Code != http.StatusUnauthorized { + t.Fatalf("status = %d, want 401", rec.Code) + } + }) +} + +func TestContentTypeFor(t *testing.T) { + cases := map[string]string{ + "index.html": "text/html; charset=utf-8", + "_nuxt/entry.abc.js": "text/javascript; charset=utf-8", + "_nuxt/entry.abc.css": "text/css; charset=utf-8", + "favicon.ico": "image/x-icon", + "logo.svg": "image/svg+xml", + } + for in, want := range cases { + if got := contentTypeFor(in); got != want { + t.Errorf("contentTypeFor(%q) = %q, want %q", in, got, want) + } + } +} diff --git a/server/handler_admin.go b/server/handler_admin.go index dfe55dd..3f38cba 100644 --- a/server/handler_admin.go +++ b/server/handler_admin.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + pathpkg "path" "strconv" "strings" "time" @@ -17,6 +18,20 @@ import ( ) func (s *Server) adminUI(w http.ResponseWriter, r *http.Request) { + path := strings.TrimPrefix(r.URL.Path, "/") + if path == "" { + path = "index.html" + } + + // Serve the exact asset when it exists in the embedded FS. + if data, err := ui.ReadFile("adminui/" + path); err == nil { + writeEmbedded(w, path, data) + return + } + + // SPA fallback: unknown paths are client-side routes → index.html. + // (Static asset paths like /_nuxt/*.js should never reach here, but if a + // hashed asset is missing, falling back to HTML keeps the app booting.) data, err := ui.ReadFile("adminui/index.html") if err != nil { http.Error(w, "admin ui not embedded", http.StatusInternalServerError) @@ -27,6 +42,125 @@ func (s *Server) adminUI(w http.ResponseWriter, r *http.Request) { _, _ = w.Write(data) } +// writeEmbedded serves an embedded asset with an appropriate content type and +// aggressive caching for immutable hashed assets under /_nuxt/. +func writeEmbedded(w http.ResponseWriter, path string, data []byte) { + switch { + case strings.HasPrefix(path, "_nuxt/"): + // Hashed filenames — safe to cache forever. + w.Header().Set("Cache-Control", "public, max-age=31536000, immutable") + default: + w.Header().Set("Cache-Control", "no-store") + } + w.Header().Set("Content-Type", contentTypeFor(path)) + _, _ = w.Write(data) +} + +// contentTypeFor maps a filename extension to a MIME type for the handful of +// asset kinds produced by the Nuxt build. +func contentTypeFor(path string) string { + switch strings.ToLower(pathpkg.Ext(path)) { + case ".html": + return "text/html; charset=utf-8" + case ".js", ".mjs": + return "text/javascript; charset=utf-8" + case ".css": + return "text/css; charset=utf-8" + case ".json": + return "application/json; charset=utf-8" + case ".svg": + return "image/svg+xml" + case ".png": + return "image/png" + case ".jpg", ".jpeg": + return "image/jpeg" + case ".ico": + return "image/x-icon" + case ".woff": + return "font/woff" + case ".woff2": + return "font/woff2" + case ".map": + return "application/json; charset=utf-8" + default: + return "application/octet-stream" + } +} + +// adminLogin exchanges username/password for a short-lived session token. +// It is not wrapped in requireAdmin (there is no session yet) but still +// enforces the IP allowlist, per-IP lockout and rate limit so the login form +// cannot be brute-forced. +func (s *Server) adminLogin(w http.ResponseWriter, r *http.Request) { + cfg := s.holder.Get() + ip := clientIP(r) + audit := func(ok bool, reason string) { + s.audit.Add(stats.AuditEvent{ + IP: ip, Method: r.Method, Path: r.URL.Path, OK: ok, Reason: reason, + }) + } + if !ipAllowed(ip, cfg.AdminAllowIPs) { + s.metrics.IncAdminDenied() + audit(false, "ip_forbidden") + common.WriteError(w, http.StatusForbidden, "ip not allowed", "permission_error", "ip_forbidden") + return + } + if locked, until := s.adminAuth.Locked(ip); locked { + s.metrics.IncAdminLocked() + audit(false, "locked_out") + common.WriteError(w, http.StatusTooManyRequests, + "account temporarily locked after repeated failures ("+until.Round(time.Second).String()+" left)", + "rate_limit_error", "admin_locked") + return + } + if !s.adminLimit.Allow("ip:" + ip) { + s.metrics.IncAdminDenied() + audit(false, "rate_limited") + common.WriteError(w, http.StatusTooManyRequests, "admin rate limit exceeded", "rate_limit_error", "rate_limit_exceeded") + return + } + var req struct { + Username string `json:"username"` + Password string `json:"password"` + } + if err := json.NewDecoder(io.LimitReader(r.Body, 1<<20)).Decode(&req); err != nil { + common.WriteError(w, http.StatusBadRequest, "invalid JSON body", "invalid_request_error", "") + return + } + token, ok := s.adminAuth.Login(req.Username, req.Password) + if !ok { + s.metrics.IncAdminDenied() + lockedNow := s.adminAuth.RecordFailure(ip) + if lockedNow { + s.metrics.IncAdminLocked() + audit(false, "bad_login_locked") + } else { + audit(false, "bad_login") + } + common.WriteError(w, http.StatusUnauthorized, "invalid username or password", "invalid_request_error", "invalid_credentials") + return + } + s.adminAuth.ClearFailures(ip) + audit(true, "") + common.WriteJSON(w, http.StatusOK, map[string]string{ + "token": token, + "username": req.Username, + }) +} + +// adminLogout invalidates the caller's session token. +func (s *Server) adminLogout(w http.ResponseWriter, r *http.Request) { + if t := s.adminAuth.Credential(r); t != "" { + s.adminAuth.Logout(t) + } + common.WriteJSON(w, http.StatusOK, map[string]bool{"ok": true}) +} + +// adminMe reports the identity behind the current credential. +func (s *Server) adminMe(w http.ResponseWriter, r *http.Request) { + common.WriteJSON(w, http.StatusOK, map[string]string{"username": s.holder.Get().AdminUsername}) +} + func (s *Server) adminOverview(w http.ResponseWriter, r *http.Request) { snap := s.totals.Snapshot() cfg := s.holder.Get() @@ -591,6 +725,9 @@ func (s *Server) adminGetConfig(w http.ResponseWriter, r *http.Request) { if cfg.AdminToken != "" { cfg.AdminToken = common.MaskToken(cfg.AdminToken) } + if cfg.AdminPasswordHash != "" { + cfg.AdminPasswordHash = common.MaskToken(cfg.AdminPasswordHash) + } for i := range cfg.ClientTokens { cfg.ClientTokens[i] = common.MaskToken(cfg.ClientTokens[i]) } @@ -759,6 +896,9 @@ func resolveMaskedSecrets(old, next *config.Config) { if isMasked(next.AdminToken) { next.AdminToken = old.AdminToken } + if isMasked(next.AdminPasswordHash) { + next.AdminPasswordHash = old.AdminPasswordHash + } oldUps := make(map[string]string, len(old.Upstreams)) for _, u := range old.Upstreams { diff --git a/server/server.go b/server/server.go index 16f385b..d755415 100644 --- a/server/server.go +++ b/server/server.go @@ -16,7 +16,7 @@ import ( "liapi/stats" ) -//go:embed adminui/index.html +//go:embed all:adminui var ui embed.FS type Server struct { @@ -128,19 +128,22 @@ func (s *Server) Handler() http.Handler { // Observability (metrics token OR admin token) mux.HandleFunc("GET /metrics", s.handleMetrics) - // Admin UI at / (primary); /admin kept as redirect for old bookmarks. + // Admin UI: a Nuxt-generated static SPA embedded in the binary. + // / → index.html + // /_nuxt/ → hashed JS/CSS from the build + // / → index.html (client-side router handles it) + // /admin, /admin/ → 301 to / + // The moar-specific /admin/api/* and /v1/* patterns below take precedence. mux.HandleFunc("GET /{$}", s.adminUI) mux.HandleFunc("GET /admin", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/", http.StatusMovedPermanently) }) mux.HandleFunc("GET /admin/", func(w http.ResponseWriter, r *http.Request) { - // Only exact /admin/ (no API path) → redirect; API falls through below. - if r.URL.Path == "/admin/" { - http.Redirect(w, r, "/", http.StatusMovedPermanently) - return - } - s.adminUI(w, r) + http.Redirect(w, r, "/", http.StatusMovedPermanently) }) + mux.HandleFunc("POST /admin/api/login", s.adminLogin) + mux.HandleFunc("POST /admin/api/logout", s.requireAdmin(s.adminLogout)) + mux.HandleFunc("GET /admin/api/me", s.requireAdmin(s.adminMe)) mux.HandleFunc("GET /admin/api/overview", s.requireAdmin(s.adminOverview)) mux.HandleFunc("GET /admin/api/upstreams", s.requireAdmin(s.adminListUpstreams)) mux.HandleFunc("POST /admin/api/upstreams", s.requireAdmin(s.adminAddUpstream)) @@ -168,6 +171,11 @@ func (s *Server) Handler() http.Handler { mux.HandleFunc("GET /admin/api/stats/export", s.requireAdmin(s.adminStatsExport)) mux.HandleFunc("GET /admin/api/stats/devices", s.requireAdmin(s.adminStatsDevices)) + // SPA catch-all: static assets + any client-side route fall back to the + // embedded index.html. Registered last; every more-specific pattern above + // (including all /v1/*, /metrics and /admin/api/*) wins over this. + mux.HandleFunc("GET /", s.adminUI) + // Request-ID middleware: echo X-Request-ID (generate when absent) on // every response so clients/logs/upstream headers correlate. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/server/server_test.go b/server/server_test.go index 5733df3..955e6db 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -10,6 +10,7 @@ import ( "testing" "liapi/auth" + "liapi/common" "liapi/config" "liapi/relay" "liapi/routing" @@ -371,3 +372,59 @@ func TestConfigExportEndpoint(t *testing.T) { t.Fatalf("reimport: %d %s", rec2.Code, rec2.Body.String()) } } + +func TestAdminLoginFlow(t *testing.T) { + const username = "root" + const password = "sup3r-secret" + srv, holder := newTestServer(t, nil) + // Seed a known password on the live config. + hash, err := common.HashPassword(password) + if err != nil { + t.Fatal(err) + } + cur := holder.Get().Clone() + cur.AdminUsername = username + cur.AdminPasswordHash = hash + holder.Set(cur) + h := srv.Handler() + + // Wrong password → 401. + rec := do(h, "POST", "/admin/api/login", "", `{"username":"root","password":"nope"}`) + if rec.Code != http.StatusUnauthorized { + t.Fatalf("bad login want 401, got %d", rec.Code) + } + + // Correct password → session token. + rec = do(h, "POST", "/admin/api/login", "", `{"username":"root","password":"sup3r-secret"}`) + if rec.Code != http.StatusOK { + t.Fatalf("login want 200, got %d %s", rec.Code, rec.Body.String()) + } + var out struct { + Token string `json:"token"` + } + if err := json.Unmarshal(rec.Body.Bytes(), &out); err != nil || out.Token == "" { + t.Fatalf("login response: %s", rec.Body.String()) + } + + // Session token authorizes admin API. + rec = do(h, "GET", "/admin/api/me", out.Token, "") + if rec.Code != http.StatusOK { + t.Fatalf("session auth want 200, got %d", rec.Code) + } + + // Logout invalidates it. + rec = do(h, "POST", "/admin/api/logout", out.Token, "") + if rec.Code != http.StatusOK { + t.Fatalf("logout want 200, got %d", rec.Code) + } + rec = do(h, "GET", "/admin/api/me", out.Token, "") + if rec.Code != http.StatusUnauthorized { + t.Fatalf("post-logout want 401, got %d", rec.Code) + } + + // Static admin token still works for automation. + rec = do(h, "GET", "/admin/api/me", adminTok, "") + if rec.Code != http.StatusOK { + t.Fatalf("static token want 200, got %d", rec.Code) + } +} diff --git a/web/app/app.vue b/web/app/app.vue new file mode 100644 index 0000000..19e4fe0 --- /dev/null +++ b/web/app/app.vue @@ -0,0 +1,7 @@ + diff --git a/web/app/assets/css/main.css b/web/app/assets/css/main.css new file mode 100644 index 0000000..0b57224 --- /dev/null +++ b/web/app/assets/css/main.css @@ -0,0 +1,72 @@ +/* + * Liapi admin stylesheet. + * fuxsto-design compiles and ships all of its own component styles, so the + * consumer only needs plain Tailwind v4 + the library stylesheet. + */ +@import 'tailwindcss'; +@import 'fuxsto-design/styles'; + +/* + * Tailwind v4 auto-detects sources relative to this file. Explicitly include + * the Nuxt source tree so utility classes used in pages/components are kept. + */ +@source '../../app'; +@source '../../components'; +@source '../../layouts'; + +/* ---- liapi brand tokens (zinc monochrome, NewAPI-ish accent) ---- */ +:root { + --liapi-accent: var(--color-primary, #6366f1); +} + +html, +body, +#__nuxt { + height: 100%; +} + +body { + margin: 0; + font-family: + -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', + 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; + -webkit-font-smoothing: antialiased; +} + +/* Route + list transition helpers (smooth, GPU-friendly). */ +.page-enter-active, +.page-leave-active { + transition: + opacity 0.22s cubic-bezier(0.4, 0, 0.2, 1), + transform 0.22s cubic-bezier(0.4, 0, 0.2, 1); +} +.page-enter-from { + opacity: 0; + transform: translateY(8px); +} +.page-leave-to { + opacity: 0; + transform: translateY(-6px); +} + +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.18s ease; +} +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +/* Slim scrollbars to match the admin shell. */ +* { + scrollbar-width: thin; +} +*::-webkit-scrollbar { + width: 8px; + height: 8px; +} +*::-webkit-scrollbar-thumb { + background: color-mix(in oklab, currentColor 18%, transparent); + border-radius: 999px; +} diff --git a/web/app/components/DialogPanel.vue b/web/app/components/DialogPanel.vue new file mode 100644 index 0000000..78c963f --- /dev/null +++ b/web/app/components/DialogPanel.vue @@ -0,0 +1,31 @@ + + + diff --git a/web/app/components/Field.vue b/web/app/components/Field.vue new file mode 100644 index 0000000..55fac8a --- /dev/null +++ b/web/app/components/Field.vue @@ -0,0 +1,12 @@ + + + diff --git a/web/app/components/StatTile.vue b/web/app/components/StatTile.vue new file mode 100644 index 0000000..6594262 --- /dev/null +++ b/web/app/components/StatTile.vue @@ -0,0 +1,10 @@ + + + diff --git a/web/app/composables/useApi.ts b/web/app/composables/useApi.ts new file mode 100644 index 0000000..9878818 --- /dev/null +++ b/web/app/composables/useApi.ts @@ -0,0 +1,122 @@ +import type { ApiError } from '~/types/api' + +const TOKEN_KEY = 'liapi_admin_token' + +export const useAdminToken = () => + useState('admin-token', () => '') + +export function useApi() { + const token = useAdminToken() + + const apiBase = '/admin/api' + + function loadToken() { + if (import.meta.client && !token.value) { + token.value = localStorage.getItem(TOKEN_KEY) || '' + } + } + + function setToken(value: string) { + token.value = value.trim() + if (import.meta.client) { + if (token.value) localStorage.setItem(TOKEN_KEY, token.value) + else localStorage.removeItem(TOKEN_KEY) + } + } + + function clearToken() { + setToken('') + } + + /** Raw fetch that attaches the admin bearer token. */ + async function raw(path: string, opts: RequestInit = {}): Promise { + loadToken() + const headers = new Headers(opts.headers || {}) + if (!headers.has('Content-Type') && opts.body) { + headers.set('Content-Type', 'application/json') + } + if (token.value) headers.set('Authorization', `Bearer ${token.value}`) + return fetch(apiBase + path, { ...opts, headers }) + } + + async function request(path: string, opts: RequestInit = {}): Promise { + let res: Response + try { + res = await raw(path, opts) + } catch (e) { + throw new Error('网络错误: ' + (e as Error).message) + } + const text = await res.text() + let data: any = {} + if (text) { + try { + data = JSON.parse(text) + } catch { + data = { raw: text } + } + } + if (res.status === 401) { + const err = new Error('unauthorized') as Error & { unauthorized?: boolean } + err.unauthorized = true + throw err + } + if (!res.ok) { + const apiErr = data as ApiError + const msg = + apiErr.error?.message || text || 'HTTP ' + res.status + throw new Error(msg) + } + return data as T + } + + /** Exchange username/password for a session token and store it. */ + async function login(username: string, password: string): Promise { + const res = await fetch(apiBase + '/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password }), + }) + const text = await res.text() + let data: any = {} + if (text) { + try { + data = JSON.parse(text) + } catch { + data = {} + } + } + if (!res.ok) { + throw new Error( + data?.error?.message || text || 'HTTP ' + res.status, + ) + } + if (!data?.token) throw new Error('登录响应缺少 token') + setToken(data.token as string) + } + + /** Invalidate the current session server-side, then clear it locally. */ + async function logout(): Promise { + try { + if (token.value) await raw('/logout', { method: 'POST' }) + } catch { + // ignore network errors on logout + } finally { + clearToken() + } + } + + /** Download a file with auth applied (stats/config export). */ + async function download(path: string, filename: string): Promise { + const res = await raw(path) + if (!res.ok) throw new Error('HTTP ' + res.status) + const blob = await res.blob() + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = filename + a.click() + URL.revokeObjectURL(url) + } + + return { token, loadToken, setToken, clearToken, login, logout, request, download } +} diff --git a/web/app/composables/useUi.ts b/web/app/composables/useUi.ts new file mode 100644 index 0000000..709ae29 --- /dev/null +++ b/web/app/composables/useUi.ts @@ -0,0 +1,44 @@ +import { Message, Dialog } from 'fuxsto-design' + +/** Thin wrappers so pages get consistent feedback + a promise-based confirm. */ +export function useUi() { + const router = useRouter() + + const toast = { + success: (m: string) => Message.success(m), + error: (m: string) => Message.error(m), + warning: (m: string) => Message.warning(m), + info: (m: string) => Message.info(m), + } + + function confirm( + title: string, + description: string, + opts: { danger?: boolean; confirmText?: string } = {}, + ): Promise { + return new Promise((resolve) => { + Dialog.confirm({ + title, + description, + danger: opts.danger, + confirmText: opts.confirmText || '确认', + cancelText: '取消', + onConfirm: () => resolve(true), + onCancel: () => resolve(false), + onClose: () => resolve(false), + }) + }) + } + + /** Handle API errors; on 401 route to the login page (no browser dialog). */ + function handleError(e: unknown) { + const err = e as Error & { unauthorized?: boolean } + if (err.unauthorized) { + router.push({ path: '/login', query: { redirect: router.currentRoute.value.fullPath } }) + return + } + toast.error(err.message || String(e)) + } + + return { toast, confirm, handleError } +} diff --git a/web/app/layouts/auth.vue b/web/app/layouts/auth.vue new file mode 100644 index 0000000..3b9a95a --- /dev/null +++ b/web/app/layouts/auth.vue @@ -0,0 +1,49 @@ + + + diff --git a/web/app/layouts/default.vue b/web/app/layouts/default.vue new file mode 100644 index 0000000..b302908 --- /dev/null +++ b/web/app/layouts/default.vue @@ -0,0 +1,178 @@ + + + diff --git a/web/app/pages/config.vue b/web/app/pages/config.vue new file mode 100644 index 0000000..8769d93 --- /dev/null +++ b/web/app/pages/config.vue @@ -0,0 +1,639 @@ + + +