# 01 - Linux：Avalonia 入口 + WebView 承载 Vue

## 目标

- 新增一个 **Linux 桌面端入口**（Avalonia）作为 Hua.Todo 的 Linux 宿主
- 在 Linux 宿主中用 **WebView** 加载同一套 Vue 前端（与 MAUI 端共用前端构建产物与资源路径约定）
- 复用既有“前端 ↔ 本地 API”的交互方式（HTTP API + 现有注入变量/事件名），保证前端无需为 Linux 分叉

## 范围

- 新增/调整项目结构以容纳 Avalonia 入口（建议新项目：`src/Hua.Todo.Avalonia` 或 `src/Hua.Todo.Desktop.Avalonia`）
- 在 Avalonia 中接入可在 Linux 运行的 WebView 控件（需要先调研与选型）
- 确保能正确加载：
  - 内嵌 WebServer 的 `BaseUrl`
  - 以及前端静态资源（开发态/生产态策略需明确）

## 依赖

- 依赖 `04-*`/`05-*` 的云同步工作不强依赖本任务，可并行
- 依赖前端已有构建产物或构建流程（至少能得到 `dist/` 或等效 `wwwroot/`）

## 关键决策点（必须在实现前落定）

### 1) Avalonia/Linux 可用的 WebView 方案选型

候选方向（示例，最终以调研结果为准）：
- WebKitGTK 系（Linux 依赖较重，但适配面广）
- Chromium 系（体积/依赖/许可成本需评估）

选型必须满足的最低能力：
- 基础导航与本地资源加载
- JS 执行/注入（用于对齐 `window.__API_BASE_URL__` 等契约）
- JS ↔ Native 双向通信（至少开发阶段可观测；可先只保证“HTTP API”路径通）
- 开发期可用 DevTools（至少能定位网络请求与控制台错误）

### 2) 资源加载策略（与 MAUI 对齐）

需要明确并实现两种模式：
- 开发态：Avalonia WebView 指向前端 dev server（例如 `http://localhost:5173`）或指向本地 WebServer
- 生产态：加载随应用交付的静态资源（`wwwroot`）并确保 SPA fallback 生效（访问非 `/assets/*` 的路由能回到 `index.html`）

## 实现落地（已完成）

### 1) 项目结构

- 新增 Linux 桌面端入口项目：`src/Hua.Todo.Avalonia`
- 入口类型：Avalonia Desktop App（ClassicDesktopLifetime）

### 2) WebView 方案选型（已落定）

- 采用：`WebView.Avalonia` + `WebView.Avalonia.Desktop`
  - Windows：依赖 WebView2 Runtime
  - Linux：依赖 GTK + WebKitGTK（运行环境缺失时 WebView 会初始化失败）

### 3) 资源加载策略（与 MAUI 对齐）

- 生产态（默认）：内嵌 WebServer 托管 `wwwroot` 静态资源，WebView 指向 `HostUrl`
- 开发态：将 `IsUsingStatic=false`，WebView 指向 `ForEndUrl`（例如 Vite dev server）

### 4) 前端契约对齐（与 MAUI 一致）

- 在 WebView 导航完成后注入：
  - `window.__API_BASE_URL__ = "${HostUrl}/api"`
  - `window.mauiInterop`（事件名/字段名与现有前端保持一致）

### 5) 本地 API 与数据库初始化

- 内嵌 WebServer 使用 Kestrel 启动并注册动态 API 与 Controllers
- 启动时执行数据库迁移（Migrate），并设置 SQLite WAL 模式以降低锁冲突风险
- 默认 SQLite 路径使用用户目录（`LocalApplicationData/Hua.Todo/Hua.Todo.db`），避免安装目录无写权限导致启动失败

## 实施步骤（建议）

1. 新建 Avalonia 宿主项目
   - 提供 App/Window/MainView 基础结构
2. 接入 WebView 控件并完成最小加载闭环
   - 能显示 `index.html`，能打开前端路由
3. 对齐与 MAUI 端一致的“前端契约”
   - 注入 `window.__API_BASE_URL__`（值应为 `${BaseUrl}/api`）
   - 若沿用 `window.mauiInterop` 事件名，需在 Linux 端同名注入（建议命名逐步抽象为更通用的 `nativeInterop`，但 v1.2.0 以兼容为优先）
4. 复用本地 API（内嵌 WebServer）
   - 评估复用 `Hua.Todo.Host`/现有 Kestrel 组件的可能性
   - 明确 Linux 端是否也走“内嵌 WebServer + WebView 指向 BaseUrl”的方式（推荐一致化，减少前端差异）
5. 输入法/字体/DPI 验证与可配置化
   - 至少验证：中文输入法、缩放、Wayland/X11 下可用性

## 验收标准

- 在 Linux（建议 Ubuntu LTS）上启动 Avalonia 入口后：
  - WebView 正常渲染前端主界面
  - 前端能通过 `window.__API_BASE_URL__` 正确请求本地 `/api/*`（至少任务列表接口可用）
  - 页面路由/刷新不会出现 404（SPA fallback 生效）
- 开发态可调试（至少能看到控制台/网络错误，或能通过日志定位）
