Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build/external-plugins.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export function externalPlugins(desktop: boolean): Plugin {
'study-statistics',
]
if (!desktop) ids.push('static-publish')
ids.push('web-lookup')
const files = new Map<string, string>()
const catalog = ids.map((id) => {
const bundle = JSON.parse(
Expand Down
36 changes: 36 additions & 0 deletions docs/DESKTOP_EXPERIENCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# 桌面启动、更新与诊断

“设置 → 通用 → 桌面”提供设备级选项。它们保存在应用数据目录,随学习库移动的备份不包含这些设置。

## 启动与后台

- 登录启动使用系统登录项,仅安装后的构建可设置;开发进程不会被注册到系统启动项。显示的是注册状态,系统管理员或系统设置仍可能禁用启动项。
- “登录启动时隐藏窗口”只影响系统传入的 `--background` 启动。手动启动或重复打开会显示已有窗口,不会创建第二个实例。CLI 和 MCP stdio 模式保留独立进程行为。
- “关闭窗口后留在后台”默认关闭。开启后,关闭请求仍经过原有编辑确认与学习库保存流程,成功后才隐藏。托盘提供打开与退出;退出也经过同一保存流程,取消保存会取消退出。
- 托盘创建失败时保持可见窗口和正常关闭行为,不会留下无法找回的后台窗口。Linux 桌面是否显示托盘取决于桌面环境。
- 全局收集继续使用“快捷收集”的既有设置;后台模式不改变其按学习库授权和保存约束。
- 窗口记忆大小、位置和最大化状态。隐藏状态与系统装饰不参与恢复,因此不会覆盖登录启动的可见性或自绘标题栏。更换显示器和 DPI 后的实际行为仍需逐平台验证。

## 更新

未配置签名渠道的构建只读取固定官方 GitHub 仓库的稳定 release 信息,显示版本说明与官方页面链接。网络失败保留已显示结果;开发构建同样不会提供安装按钮。应用不会自动发布版本或运行下载的非签名安装包。

签名渠道由发布维护者配置,不能由插件或普通设置替换:

1. 构建时设置 `REPEATY_UPDATER_PUBLIC_KEY` 为 Tauri updater 的公钥。私钥不进入代码、学习库或用户配置。
2. 官方仓库稳定 release 中提供 `latest.json`,固定入口为 `https://github.com/KraHsu/repeaty/releases/latest/download/latest.json`。使用 Tauri 平台清单,安装包 URL 必须位于本仓库的 `releases/download/`。
3. 发布与当前官方 updater 匹配的签名包,签名必须绑定应用版本(Tauri signer 的 `--app-version`);还需针对每个平台验证安装、重启和回退。当前发布脚本尚不产出该渠道,不应仅设置公钥就宣称升级可用。

更新元数据上限 1 MiB,安装包上限 512 MiB;只允许 HTTPS 和官方 GitHub 下载重定向。下载可以取消,取消或验证失败不会进入安装。下载完成后由用户选择“保存并安装更新”,沿用编辑/保存确认;拒绝保存不安装。安装前再次验证签名;版本不高于当前版本不能安装。失败时不主动关闭学习窗口。成功后使用平台安装器/重启流程。

已下载的包只保存在当前进程内,退出后需要重新下载;未实现静默安装。macOS/Windows 安装与 Linux AppImage 的具体系统限制以 Tauri updater 为准;目前 Linux 分发为 deb,不能把 AppImage 更新流程标作 deb 升级验收。

## 诊断

报告必须先预览,再复制或导出为 JSON;不自动上传。固定字段只有应用/版本、平台/架构、开发构建标志、缩放因子、最大化状态、托盘、登录启动、签名渠道和设置读取状态。没有学习正文、设备路径、令牌、原始异常、机器名或用户标识。

## 人工验证

每个平台单独记录结果:安装版登录启动/系统禁用、隐藏后托盘唤回、重复启动、后台全局收集、保存取消/失败后的关闭与退出、自绘标题栏拖动/缩放/最大化、Windows Snap、100%/150%/200% DPI、签名更新的成功/拒绝/断网/取消及安装后数据读回。单元测试和浏览器夹具不能替代这些原生实机验证。

实现依据:[Tauri autostart](https://v2.tauri.app/plugin/autostart/)、[single instance](https://v2.tauri.app/plugin/single-instance/)、[updater](https://v2.tauri.app/plugin/updater/)。
15 changes: 15 additions & 0 deletions docs/INPUT_CUSTOMIZATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# 快捷键与鼠标手势

在「设置 → 通用 → 操作」中按命令搜索、录制或填写快捷键。使用 `Mod` 表示 Windows / Linux 的 Ctrl 和 macOS 的 Command;也可以明确使用 `Control` 或 `Meta`。最多保存三个替代按键,以逗号分隔。每项都可以取消绑定或恢复默认,全部快捷键可以统一重置。

同一使用场景中重叠的按键会显示冲突,保存时需先解决冲突。若外部设置包含冲突,软件不会任意选择一个动作执行。插件命令出现在相同列表,只有当前视图和启用实例允许执行时才会响应;停用插件会移除可执行入口,保留已保存的配置,便于重新启用后恢复。

输入法组合输入、按键长按、输入框与菜单导航不会触发应用全局快捷键。文本编辑仍使用系统原生撤销、复制、粘贴及选区操作;保存表单和添加挖空可以单独改键,但不能占用这些原生按键。弹窗关闭及无障碍控件的导航键保留自己的语义。

鼠标手势默认关闭。启用后在非编辑内容区域按住右键划动、松开执行,普通右键点击仍打开菜单。触摸、笔、左键选择和输入框不参与识别。默认左划后退、右划前进、左后向上到页首、左后向下到页尾;可更改、删除或录制最多八段的新手势。设置中的绘图区也接受左键,或直接使用 `L/R/U/D` 输入方向。

可以调整识别距离、轨迹采样间隔、颜色、线宽、透明度、轨迹及动作提示。Escape、窗口失去焦点、取消指针操作、切换学习库、停用手势都会取消当前划动。前进和后退只恢复普通页面及其筛选状态,不恢复正在进行的复习;离开阅读仍经过原有保存检查,切库后清空导航历史。

阅读工具栏、选区工具栏、右键菜单与复习菜单的顺序和可见操作在「菜单与工具栏」中调整。必要的编辑或退出入口保留。菜单中的快捷键提示与实际绑定同步;隐藏菜单项不会删除对应数据。

这些配置通过当前设置适配器保存,网页只读工作目录试用仍保存到浏览器副本。保存失败会提示重试,不将未保存的改动报告为成功。插件卸载不删除学习记录。
40 changes: 40 additions & 0 deletions docs/INTERFACE_LANGUAGES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# 界面语言与语言包

在「设置 → 通用 → 界面」选择语言,默认跟随系统。切换只影响界面与日期、数字、时间单位,不会翻译卡片、材料、标签或已创建的入门卡组。

语言选择包含简体中文、繁体中文、英语、德语、西班牙语、法语、意大利语、日语、韩语、波兰语、巴西葡萄牙语和俄语。中英保留完整的现有消息目录;新增语言提供核心导航、学习操作、设置分类和公共控件译文。尚未翻译的技术说明与错误回退英文,官方插件按自身提供的翻译回退。新增译文尚未经过母语审校,不能把语言选择可用视为所有内容已翻译。

「设置 → 通用 → 语言」可导出当前有效译文为 JSON,编辑后导入当前学习库。导入先检查语言、消息名称及 `{name}` 等占位符,再预览并确认应用。它不会执行脚本,也不能改变学习内容。移除自定义翻译恢复内置文本。

```json
{
"version": 1,
"locale": "ja",
"messages": {
"保存": "保存",
"打开卡组 {p0}": "デッキ {p0} を開く"
}
}
```

消息名称以导出文件为准;可只保留需要覆写的条目。未知消息、丢失占位符、空译文或超大文件会被拒绝。语言包与设置随学习库保存,保存失败保留当前译文与导入预览。

## 插件本地化

SDK 1.15 的 `locale` 提供上述 BCP-47 语言标记。组件直接读取它会在切换语言时更新;不要假定除 `en` 外的语言都是中文。`createTranslator` 为插件提供隔离的目录及指定回退,不能覆写宿主或其他插件的文案:

```ts
import { createTranslator } from '@repeaty/plugin-api'

const text = createTranslator({
en: { saved: 'Saved {count} items' },
'zh-CN': { saved: '已保存 {count} 项' },
ja: { saved: '{count} 件を保存しました' },
})
// 在 computed 或渲染函数中读取,语言变化时会更新。
text('saved', { count: 2 })
```

共享控件的辅助功能文案使用宿主语言。正文、设备凭据和插件私有数据不应作为翻译目录输出。

需要等待设置实际保存的插件可使用 `await persistSetting(key, value)`;它与 `readSetting` / `writeSetting` 使用相同的插件命名空间,在停用或切库后拒绝迟到响应。
49 changes: 49 additions & 0 deletions docs/PERSONALIZATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# 外观、阅读与导航

在 **设置 → 通用 → 界面** 调整界面语言、跟随系统的明暗模式、阅读排版、配色及辅助功能。设置随当前学习库保存,不改变材料正文、卡片内容或学习进度。切换学习库会恢复该库自己的设置;只读网页试用只保存到浏览器副本。

## 阅读排版

界面、阅读正文和代码可以分别使用不同字体。填写设备上已安装的字体名称,留空使用默认字体;没有安装的字体会回退,不下载网络字体。

正文可调整字号、行宽、行高及段落间距。界面整体、侧栏导航文字和列表文字可分别缩放。预览即时更新,狭窄窗口会限制正文实际宽度。官方 EPUB / HTML 阅读插件使用相同排版变量;PDF 保留原件布局,提供原始颜色、暖色纸张和反色显示。

**恢复默认外观** 会恢复本页全部外观偏好及保存的配色,不改变学习内容。字体名称、配色和数值必须符合允许范围,保存失败会显示提示并保留当前会话的效果。

## 明暗配色

分别编辑浅色和深色的文字、强调色、页面、内容及侧栏背景,以及选区、高亮和挖空颜色。切换“编辑配色”只选择要编辑的配色;实际明暗模式仍由“颜色模式”控制。

强调按钮自动选择较清楚的前景色。文字与背景对比度过低会显示提示。配色会传递到宿主提供的插件控件、页面、滚动条和阅读区域;插件自定义的固定颜色不会被强制覆盖。

可以命名保存最多 12 组配色,也可以展开 **导入或导出配色**,复制 JSON 到另一学习库。导入只接受已知颜色字段,不包含可执行样式或脚本。格式不正确不会应用配色;**恢复此配色** 仅重置正在编辑的明暗配色。

## 侧栏与工作区

在 **设置 → 通用 → 侧栏与布局** 选择入口显示状态、图标和上下顺序。默认窄侧栏仅显示图标,也可始终显示文字。入口保留可访问名称和提示,紧凑模式仍保留可操作的点击区域。

设置、帮助和当前正在使用的页面始终可见,避免隐藏后无法恢复。停用或卸载插件会移除其实际入口;重新启用时仍保留用户的排序和图标偏好。**恢复默认侧栏** 恢复默认顺序、图标、密度及显示状态,不卸载插件。

主侧栏宽度与展开状态沿用拖动和键盘调整。在学习材料中,材料列表与右侧上下文面板的宽度、列表 / 树形方式、上下文面板的显示状态也按学习库保存;窄窗口使用响应式布局。

## 学习状态与辅助功能

“学习状态图标”分别配置材料与卡片。材料树区分未安排、已安排和归档;卡片列表区分新卡、已安排和暂停。原有状态文字及评分语义保持不变。可以调整图形、颜色、尺寸、描边、双线及淡化;自定义路径只接受 24×24 视框内的 SVG `path d` 数据,不执行 SVG 标签、脚本或外部资源。

辅助选项包括图片变暗、字体平滑、增强文字与分隔线对比度和减少动态效果。系统的减少动态效果和强制对比色始终优先。键盘仍可操作设置、侧栏和分栏调整器;本页设置不会接管输入法或文本输入的原生编辑快捷键。

## 插件开发者

宿主的 SDK 控件已自动使用同一外观。自定义阅读器可引用这些 CSS 变量:

| 变量 | 用途 |
| ----------------------------------------- | ---------------------------------------- |
| `--font-ui` / `--font-mono` | 界面 / 等宽字体 |
| `--reading-font` / `--font-size-reading` | 阅读字体与字号 |
| `--reading-width` | 阅读正文的最大宽度;应同时限制为容器宽度 |
| `--line-height-reading` | 正文行高 |
| `--reading-paragraph-spacing` | 段落间距 |
| `--reading-highlight` / `--reading-cloze` | 高亮与挖空颜色 |
| `--ui-text` / `--ui-bg` / `--ui-primary` | 文字、表面及强调色 |

使用变量不需要让插件源码参与 Repeaty 编译。插件仍独立构建、按学习目录安装,并在运行时加载。
2 changes: 2 additions & 0 deletions docs/PLUGINS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

[返回开发文档](DEVELOPMENT.md) · [LeetCode](LEETCODE.md)

SDK 1.15 新增[插件本地化与可靠设置保存](INTERFACE_LANGUAGES.md#插件本地化)。材料命令可以通过 `formats: ['*']` 参与所有阅读器,使用同一套可配置快捷键与菜单;停用和卸载清理入口,保留用户的绑定偏好。独立官方[选区查询](../plugins/web-lookup/README.md)提供可编辑的外部查询目标。

设置与表单使用 SDK 的 `SettingGroup`、`SettingSection`、`SettingField`,状态和提示分别使用 `UiStatus`、`UiNotice`,操作使用 `UiButton`、`UiIconButton`。这些接口由宿主中的 Nuxt UI 绘制;官方插件的编辑、答题、提交恢复及历史交互使用同一实现。复杂编辑器使用 `UiInput`、`UiTextarea` 等公开控件,不导入 Nuxt UI 或软件内部模块。见[界面规范](DESIGN_SYSTEM.md)及[控件独立示例](examples/settings-plugin/README.md)。

本页描述当前开发分支的外置插件机制,尚未随新安装包发布。发布页既有的 0.27.0 安装包不代表本分支的实现,也不能作为这套插件机制的安装或 GUI 验收产物。
Expand Down
Loading