Commit Graph
264 Commits
Author SHA1 Message Date
Jia Sui 9dbb020ac3 feat(ui-html): 模糊音分区改为可折叠风格并接总开关
分区头改为主题模式同款折叠结构:折叠标题按钮(标题 + chevron,
aria-expanded/aria-controls,默认收起)加右侧总开关 toggle;展开后是
既有 11 个规则复选。总开关关闭时规则复选置灰禁用并提示开启总开关后
生效。折叠样式在 input.css 用 fuzzy 专名类复制 theme-surface 规则,
不跨模块借用类名;复选禁用联动抽到 shared.ts 供点击与快照回填两侧
共用。
2026-09-13 09:12:52 +08:00
Jia Sui 575b236231 feat(ui-html): 设置页输入分区新增模糊音开关
- 「输入纠错」后新增「模糊音」分区,声母 6 + 韵母 5 共 11 个复选,
  复用翻页方式的流式复选布局,文案形如 z ⇄ zh
- 复选变更即发 configUpdate(input.fuzzy_*),configSnapshot 按
  boolean 守卫逐键回填,重开设置页状态保持
2026-09-13 08:35:25 +08:00
fanlusky 7c9856c767 fix(settings): 界面渲染下拉框的弹出菜单与按钮同宽
弹出菜单此前靠内容撑宽,和按钮宽度对不齐;改成 left/right 都贴住
.dropdown(与 .font-dropdown-menu 同样的做法),并把按钮文字右侧留白
收一半,同时给按钮固定最小宽度,避免切换渲染方式时按钮忽宽忽窄。
2026-09-13 03:59:33 +08:00
fanlusky 426bb9d544 feat(server): WebView2 候选窗口支持滚轮翻页,并加上开关
PR #351 只给 D2D 候选窗口加了滚轮翻页,WebView2 后端还没有。

网页端只上报一个以 WHEEL_DELTA 为单位的原始 delta,notch 累加仍然
交给 CandidateWheel::ConsumeWheelDelta,两个宿主最终都汇聚到
WM_PAGE_CANDIDATE,翻页逻辑一份不重复。Chromium 的 wheelDeltaY 本身
就是 ±120/格,正是原生累加器期望的单位,deltaY 作标准回退。

同时把滚轮翻页做成可配置的 general.paging_mouse_wheel,默认关闭:
候选宿主是 NOACTIVATE 且从不获得焦点,滚轮只有在 Windows「当我悬停
在非活动窗口上方时滚动它们」开启时才会送达,无法无条件承诺,所以设为
opt-in,设置页里也写明了这个前提。开关只在 WM_PAGE_CANDIDATE 一处
判断;D2D 那边在 WM_MOUSEWHEEL 顶部提前返回 false,关闭时消息照旧
交给 DefWindowProc,与功能加入前一致。
2026-09-13 01:02:02 +08:00
fanlusky e860eaab43 fix(server): 避免 WebView2 候选窗阴影被裁切 2026-09-12 23:50:31 +08:00
fanlusky 559dd588a6 fix(ui-html): 设置页关闭按钮的红色高亮不再在下次打开时闪一下
关闭按钮是页面自己的元素,红色背景来自 CSS :hover。点下去时它先渲染成红色,
然后窗口才隐藏,于是 WebView2 保留的那一帧就是红的。窗口以前会被销毁,这一帧
再也不会回来;现在进程留着,下次打开会先把它显示出来,等页面按真实指针位置
(在托盘上,不在按钮上)重算 :hover 才消失,就成了开头的一次闪红。

最小化按钮早就解决过同一个问题:点击时加 window-controls-click-reset,再延迟
100ms 才发消息,让页面带着这个类重绘一次之后窗口才消失。关闭按钮照着做即可,
那个类会把标题栏按钮的背景压成透明,与指针位置无关,保留的帧因此是干净的。
下次指针移进标题栏时既有的 mouseenter 监听会把类摘掉,悬停照常。
2026-09-12 22:48:44 +08:00
fanlusky a2a23be1db fix(settings): 补充字体下拉框的箭头不再显示文本编辑光标
候选窗主字体的箭头包在 .arrow 容器里,补充字体的箭头则是直接挂在
按钮上的 img,原规则选不中它,.font-combobox 的 cursor: text 就继承
到了箭头上。补一个 .font-combobox > img 选择器,让两处表现一致。
2026-09-12 19:18:36 +08:00
fanlusky a8c10a63a6 feat(settings): add a restart-server button under the UI backend setting
界面渲染 only takes effect at Server startup, so the setting already told the
user to restart the IME process but offered no way to do it outside the
Ctrl+Shift+Alt+R developer shortcut. Add a 重启 button in the same section.

Settings runs in its own process, so the request travels the Aux pipe — the
supported cross-integrity control path the config notifications already use —
and the Server exits with the Watchdog restart code. The shortcut and the
button now share RestartServerProcess().
2026-09-12 16:41:13 +08:00
dependabot[bot] 4cec8f060f chore(deps): bump the npm group
Bumps the npm group in /ui-html/webview2/settings/ime-settings with 2 updates: [@types/chrome](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/chrome) and [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/chrome` from 0.2.8 to 0.2.9
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/chrome)

Updates `@types/node` from 26.4.1 to 26.5.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/chrome"
  dependency-version: 0.2.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@types/node"
  dependency-version: 26.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-11 19:59:30 +00:00
fanlusky a7779d2b05 refactor(engine): 将 engine 从 submodule 内嵌为仓内一等组件
`vendor/MetasequoiaImeEngine` submodule 改为 `engine/` 目录,导入的是
product-lock.json 原本钉住的提交 c810d201,逐文件核对过 blob,因此这是一次
搬迁而不是引擎升级。引擎自己的嵌套 submodule(googlepinyinime-rev、utfcpp、
miniaudio)按各自 gitlink 一并展开,来源与提交见 engine/UPSTREAM.md。

Windows 专门化裁掉了不属于本产品的部分:whisper.cpp 与本地推理 provider、
macOS 示例宿主、整个 dictionary/ 建库流水线、上游 CI 与 release-please 配置。
词库仍按 product-lock.json 在构建时取发布产物。

引擎不再进 product-lock.json:没有 gitlink 就没有可比对的东西,锁里写一个上游
commit 等于宣称这棵树仍等于上游,而第一个 Windows 专门化改动落地时这句话就假了。
verify-contracts / verify-checkout 随之移除,verify-published 保留。

CI 与工具链:引擎源码并入根 scripts/format.sh(删掉引擎自己的那份,避免两套排除
列表分叉);引擎 voice.yml 里的 silero_vad.onnx 摘要校验移到本仓 lock job;
engine-bump-triage 工作流与其测试删除;gitsubmodule 的 dependabot 频率由 daily
改为 monthly。

README、README.en、AGENTS.md、CONTRIBUTING、docs/product-release.md 及各子目录
文档同步说明新的位置与边界。
2026-09-12 03:40:48 +08:00
Neptrue_Lin 3eb82c7878 Merge branch 'develop' into feat/issue-234-rime-dict-import 2026-09-11 20:06:16 +08:00
Lu Fan(SonnyCalcr) 0eaa35eed1 Merge pull request #274 from linyanm/fix/issue-155-settings-lag
fix(server,ui-html): 降低设置窗口拖动与工具栏首屏卡顿
2026-09-10 21:33:31 +08:00
Jia Sui f9e8b73fce feat(ui-html): 设置页新增输入纠错双开关
input.html「输入纠错」区块复用现有 toggle 形态;input.ts 走
setupToggleButton + updateConfig 写 quanpin.autocorrect_transposition/
neighbor;config-sync 从 configSnapshot 回读选中态;文案注明默认关闭
2026-09-10 17:32:16 +08:00
Aegon8719 dea9292814 issue-55 候选窗支持可配置的有序回落字体 2026-09-09 18:03:56 +08:00
linym c07aa8e878 fix(server,ui-html): 降低设置窗口激活卡顿 (#155)
激活时不再重推整份配置;HTML 按 UTF-8 二进制读取;契约脚本移到标记之后;最大化按钮矩形用 rAF 合并。
2026-09-08 22:47:26 +08:00
linyanmandlinym 6e03f57747 fix(server): 全拼导入按汉字数选择切分并识别文件编码 (#270)
无分隔拼音按汉字数另选完整切分,避免西安/xian 误报音节数不一致。设置页按 BOM 识别 UTF-8/UTF-16,无效 UTF-8 再回退 GBK。带撇号的水杉导出三列 TSV 本身已合法,回归测试钉住该格式。

Co-authored-by: linym <lin.yanming@foxmail.com>
2026-09-08 22:52:45 +09:00
linym 28a0c03500 feat(server): 批量导入兼容 Rime userdb.txt 与 dict.yaml 2026-09-08 20:45:14 +08:00
Aegon8719 6ff1cff42d issue-52 加入简繁切换快捷键;增加候选词翻页快捷键组合、增加以词定字快捷键组合;
issue-55 候选词与辅助码间保留一个半角空格。
2026-09-08 14:07:48 +08:00
Ouchihao 3fc7ba295f feat(server): show translations in horizontal candidate windows 2026-09-06 18:09:01 +08:00
Evan Hu 1ec7bdd690 fix(settings): 检查更新时消费 update.json 的校验值与签名状态
update.json 一直发布四个关于安装包的字段(installerName / installerUrl / installerSha256 / signed),而设置页的 UpdateManifest 类型只声明了 version 和 releaseUrl,另外两个字段发布出来却没有任何人消费。结果是:在安装包未签名的当下,SHA256 是用户唯一的完整性防线,服务端早已算好,却要用户自己去官网翻。

现在发现新版本的对话框会显示:signed 为 false 时给出明确警告(SmartScreen 会拦截、uiAccess 失效导致候选窗无法浮在提权程序之上),以及 Get-FileHash 命令和应得到的摘要,可选中复制。

「不做后台自动检查」是 PRIVACY.md 明示的隐私设计,没有改动——改的只是用户按下检查更新之后看到什么。

校验与展示逻辑抽到 update-manifest.ts:validateManifest 收紧了 releaseUrl 的判断(此前 startsWith 前缀匹配会放过 …/releases.attacker.example 这类同前缀域名),并对三个可选字段做格式校验——安装包名会进入一段让用户粘贴的命令,限制成发布流水线实际产出的形状;格式不对的可选字段按缺失处理,不让整次更新检查失败,老版本 manifest 仍然可用。

接入 vitest,11 个用例覆盖版本解析与排序(0.10.0 > 0.9.0、0.3 == 0.3.0)、manifest 校验的拒绝路径、以及签名/未签名/未声明三种状态下的展示。CI 在 build 之前加一步 pnpm test。
2026-09-06 18:08:34 +09:00
Evan Hu 5d5b661e14 fix(ui): 给候选窗、悬浮工具栏与托盘菜单加 Content-Security-Policy
这些页面会内联第三方皮肤的 CSS,而全仓此前没有任何 CSP,也没有 WebResourceRequested 过滤。上一个提交在注入阶段丢掉了远程引用,这一条是第二道防线:即使将来某条路径漏过,浏览器层面也不会真的把请求发出去。

策略按这些页面实际用到的资源来定,没有多给:default-src 'none' 关闭其余一切(包括 connect-src,这些页面不含任何 fetch/XHR/WebSocket);script-src 放行 https://msime-contracts(schema.js 与 runtime.js)与内联脚本;style-src 放行内联样式;img-src 与 font-src 放行 data: 以及 https://appassets、https://candidate-skins 两个虚拟主机——皮肤被内联时正是变成这两种形式。

覆盖 candwnd、ftb、menu、default-themes 下的 15 个完整文档。body/ 下的 8 个文件是注入宿主文档的片段,没有 <head>,不适用。
2026-09-06 18:05:09 +09:00
Evan f70f64acaa fix(ci,ui): 修掉 6 条 CodeQL high 告警,补上发布目标的祖先校验
- validate-draft-release.sh 增加「target_sha 必须在 main 历史上」的校验。此前有 write 权限的人可以
  建一个指向任意 commit 的 draft release 再 dispatch,那份代码就会被编译并签进正式安装包;唯一的
  祖先检查跑在 checkout 之后的不可信工作树里,而负责编译的 TSF job 根本没有这道检查。校验放在
  prepare(默认分支上下文)里,所有构建 job 都 needs 它。
- 字体名引用只转义了 `"` 没转义反斜线,以 `\` 结尾的字体名能吃掉闭合引号让后续内容按 CSS 解析。
  两处(appearance.ts、shared.ts)都改为先转义转义符。
- voice_input_service.cpp: float 平方先提升到 double
- engine-bump-triage.yml 顶层权限从 write 收到 read,写权限下放到 job;runner 与同仓其他 workflow
  统一为 ubuntu-24.04

新增 CONTRIBUTING.md,把散在各 AGENTS.md / 组件 README 里的环境要求、构建顺序、打包步骤和提交前
检查串成外部贡献者能照着走完的一条路径,并从 README 首屏链出。
2026-09-06 12:09:50 +09:00
Evan 4fc16952b3 wip(windows): 补齐隐私与许可交付,修好外部人的构建入口
- 新增 PRIVACY.md:逐项写明每个联网端点、发送内容、默认开关与关闭方式,明确云候选默认开启、
  token 在 config.toml 明文存储、无任何遥测
- 设置页「用户协议」「隐私政策」两个无 handler 的死按钮接上;前者改名为「开源许可协议」指向
  LICENSE,开源产品的用户条款就是许可证本身,不再承诺一份不存在的 EULA
- 安装包随包装入 GPL 正文并在安装向导显示(GPLv3 §4/§6),补上打包测试断言
- release.yml 增加 build provenance attestation,并在发布后向 MSIME-Web 发 repository_dispatch,
  让 msime.app/update.json 不再等两小时一次的 cron
- 所有 CMakePresets 的 vcpkg 路径改用 $env{VCPKG_ROOT},server 的 Boost 回退不再指向个人目录
- ui/README.md 指向本机绝对路径的 markdown 死链改成相对链接
- 新增 check-developer-paths.sh 并接入 required 的 quality 检查,防止路径回潮
- docs/installation.md 不再写死版本号
2026-09-06 12:05:06 +09:00
Evan 2562026a2a fix: 修复审计发现的候选页竞态、管道权限、TSF 空指针与皮肤 CSS 逃逸等八项缺陷 (#169)
* fix(server): publish candidate pages as immutable snapshots

Global::candidate_ui is a plain global with no lock. The IPC worker rebuilds and destroys its vectors while the UI thread paints from them, and the handoff is an asynchronous PostMessage, so the worker returns to its loop and pops the next task without waiting. A second keystroke, or an async english.db candidate arrival, could free the page_views buffer and its strings while FillItemsFromUi held a reference into it. ShowItemContextMenu reads the same vectors from a mouse callback with no message handoff at all.

The worker now copies each finished page into an immutable snapshot and publishes it at the single point where the rebuild completes; every UI-thread reader loads that snapshot once and reads only its own copy. PostMessage is deliberately left alone: the worker also serves UI-originated tasks, so a synchronous handoff would invite a cross-thread deadlock.

* fix(server): bound the aux and diagnostic pipe reads

Both listeners serve a single pipe instance inline and polled a NOWAIT handle for as long as the process ran, breaking only on a read that succeeded or failed with something other than ERROR_NO_DATA. A client that connected and never wrote held the only instance forever, so the loop never returned to ConnectNamedPipe and no later client was accepted, permanently losing the langbar right-click channel and the terminal-deactivation teardown fallback.

Give both loops the same deadline the hello reads already use and go back to accepting when it expires.

* fix(server): snapshot the voice config and replace config.toml atomically

GetConfiguredVoiceInput handed out a reference to a global that LoadImeConfig rewrites from the IPC worker thread, clearing and refilling two std::map members and around twenty strings. The voice control thread and the low-level keyboard hook, which copies the struct on every keystroke, walked those nodes as they were freed. LoadImeConfig now parses into a local and publishes it in one step under a process-local shared_mutex, and the getter returns a snapshot by value. The file lock is deliberately not reused for readers: it is a named cross-process mutex with a five second wait, and taking it in a keyboard hook would stall typing system-wide.

WriteConfiguredValue also reopened the live config.toml with ios::trunc, so a crash mid-write destroyed the user settings and could leave the file unparseable for good. It now goes through WriteFileTextAtomically, which this file already uses elsewhere. That makes the directory entry swap atomic; it does not flush, so it is not a durability guarantee.

* fix(ipc): restrict the server pipes to the owning account

The pipe DACL granted Everyone FILE_ALL_ACCESS. That bit set includes FILE_CREATE_PIPE_INSTANCE, so any local account could add an instance to a name this server already owned and answer part of the connections in its place. The names are machine-global with no per-user component, and the TSF client opened them with no SQOS, so a squatter could also impersonate the connecting thread.

Build the descriptor from the process owner SID and admit only LocalSystem, that account, and app containers with connect-only rights so UWP text input still works; fail pipe creation outright when the SID cannot be resolved rather than falling back to something permissive. Pass FILE_FLAG_FIRST_PIPE_INSTANCE on the first instance of each name so a squatted name fails loudly, and request SECURITY_IDENTIFICATION on the client side.

Authenticating the peer process after connect is a larger change to the handshake and is not attempted here.

* fix(tsf): guard the null focus paths and unadvise the compartment sink

_CandidateChangeNotification treated ITfThreadMgr::GetFocus and ITfDocumentMgr::GetTop as if they could only fail through a FAILED HRESULT. Both return S_OK with a null out-pointer when nothing has focus or the document stack is empty, and the results were dereferenced unconditionally, so an external UILess host calling Finalize while focus moved away crashed the host application. The sibling _RequestCancelComposition in the same class already checks both.

CLangBarItemButton::CleanUp only unregistered the compartment inside the SUCCEEDED branch of a CoCreateInstance, then deleted the sink regardless. This TIP registers COM-less activation support, where that call does fail, and the sink was freed while TSF still held it advised. Unadvising never needed the thread manager, so it now runs unconditionally before the deletes.

* fix(ui): drop the cached visuals when the scene is replaced

Window caches focused, hovered and captured Visual pointers into the scene tree, and SetScene destroyed that tree without clearing them. Toggling the input mode rebuilds the floating toolbar scene, so the next mouse move dispatched a virtual call through a freed object.

Clear all three before the assignment, and release the capture only when this window actually holds it: an adopted HWND may never have called SetCapture, and capturedVisual_ is set even when it did not.

* fix(settings): scope external skin CSS through the CSS parser

injectScopedSkinCss concatenated a skin toolbar.css into an @scope block as text. Block nesting is textual, so a leading close brace in the skin ended the block early and the rest styled the whole settings window. The host validates only the skin file name, never the body, and candidatePreviewCss interpolated unvalidated colour strings into rule bodies the same way.

Create the scope rule empty and re-insert every rule parsed out of the skin as a child of it, so nothing lands outside however the braces are balanced, and accept a colour only in the plain notations we actually render.

* fix(release): gate the dictionary source commit on its default branch

verify_published iterated only data["repositories"], but the dictionary block pins a source_commit exactly like they do. The manifest check merely proves the release agrees with the lock about that commit, which a branch commit satisfies just as happily, so a dictionary built from an unmerged branch shipped with the provenance the gate exists to refuse.

Run the dictionary through the same loop under its own name, resolving its repository from the lock. A retired dictionary repository that no longer answers is reported rather than failing the release: its published artifacts are immutable history, and being unable to re-check them is not the same as finding them unmerged.
2026-09-06 10:31:48 +09:00
Evan Hu 06bba15d4f fix(server): keep settings I/O off UI thread and bound dictionary rendering 2026-09-06 03:31:40 +09:00
Evan Hu b5d07f11eb fix(server): reduce WebView message and first-paint overhead 2026-09-06 03:05:36 +09:00
Evan Hu 05036a763d docs: describe one repository instead of six
The product README was under windows/ after the move, but it was never a component readme: it is the download page, the feature guide and the contribution guide for the whole product, so it goes back to the root and windows/ gets a real component readme.

AGENTS.md at the root now carries the repository map, the component boundaries that used to be cross-repository rules, and the release process, since the scripts that process drives live at the root. The component files keep what is genuinely theirs and say which paths they are relative to. References that named sibling repositories now name sibling directories, and the lock documentation records that Server, the pages, the GUI framework and the installer are no longer inputs to pin.
2026-09-06 02:40:51 +09:00
Evan Hu 32e722c176 ci: build every component from the one checkout
The product lock existed because five repositories had to be pinned to reproduce one product. Four of them are directories now, so a commit of this repository already pins them and there is nothing left for the lock to say about them. What it still records is what the product consumes from outside: the engine submodule, the helpcodes and the dictionary release.

CI gains a job per component instead of a reusable workflow that checked out locked commits and rebuilt them. The release workflow no longer stages five sibling checkouts under historical names and no longer carries a second sparse checkout for its own scripts; Prepare-PackageFiles.ps1 already took the source directory names as parameters, so it is told the new ones, plus where the product-wide notice now lives.

Two checks the removed cross-repository pins used to provide are replaced in kind: the pages are verified against the engine submodule's web contract in CI rather than by locking UiHtml and Engine together, and the engine bump triage that Server carried moves here and now also says so when a bump leaves the lock behind.
2026-09-06 02:35:49 +09:00
Evan Hu 373f8d1473 refactor: collapse the duplicated submodules into one vendor/ directory
Windows, Server and UiHtml each carried their own gitlink to MSIME-Engine, all three pinned to the same commit, and Server carried a gitlink to MSIME-UI that is now the ui/ component. Git only reads the root .gitmodules, so the nested ones had to go regardless.

The engine and the two third-party dependencies now live once at vendor/MetasequoiaImeEngine, vendor/opencc and vendor/cpp-pinyin. Server reaches them through MSIME_VENDOR_DIR and builds ui/ as an out-of-tree subdirectory; the Windows tip's relative contract includes gained the extra level; the ui-html contract sync and the Server env/table generators follow the engine to its new location.
2026-09-06 02:27:52 +09:00
Evan Hu f31084162a chore(deps): pin verified partial-composition flush semantics 2026-09-06 01:34:33 +09:00
Evan Hu c0866292fd chore(deps): pin the shared portable composition contract 2026-09-06 01:30:07 +09:00
Evan Hu 7a91c1d20d fix(contracts): allow the tenth mouse candidate and pin shared format contracts 2026-09-06 00:47:05 +09:00
Evan Hu ea9e8797a0 chore: remove the orphaned Sciter resources
sciter/ held two HTML files and a .gitkeep for a rendering backend that no longer exists. Nothing selects them: appearance.ui_backend in MSIME-Server accepts only "d2d" and "webview2", no source file in any repository of the organisation mentions Sciter, and Prepare-PackageFiles.ps1 never packaged the directory, so the files did not reach an installation either.

The README described the directory as the old backend's resources while calling WebView2 the current default, which reads as though Sciter were still selectable. It is not, so the row goes with the files.

The history keeps the markup if the old candidate window layout is ever wanted as a reference.
2026-09-05 23:43:30 +09:00
Evan Hu 059957a491 feat(protocol): use pinned typed messages across WebView pages 2026-09-05 23:09:37 +09:00
Evan eafa4c6ca6 Merge pull request #2 from metasequoiaime/dependabot/npm_and_yarn/webview2/settings/ime-settings/npm-cb03e01d6e
chore(deps): bump the npm group in /webview2/settings/ime-settings with 4 updates
2026-09-05 21:53:38 +09:00
Evan 330cdd0cc8 fix(settings): point the About and Feedback links at MSIME-Windows (#3)
The releases link in the About page and both the href and the visible link
text in the Feedback page still pointed at MetasequoiaImeTsf, which only
resolves through GitHub's rename redirect. These are links users click from
inside the settings window, and the visible text showed the old repository
name back to them.

The TSF frontend has been MSIME-Windows for a while; every other cross-repo
reference in the organization already uses that name.
2026-09-05 21:16:08 +09:00
dependabot[bot] 9bd33c8f61 chore(deps): bump the npm group
Bumps the npm group in /webview2/settings/ime-settings with 4 updates: [@types/chrome](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/chrome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [typescript](https://github.com/microsoft/TypeScript) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@types/chrome` from 0.1.29 to 0.2.8
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/chrome)

Updates `@types/node` from 24.10.1 to 26.4.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `typescript` from 5.9.3 to 7.0.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.3...v7.0.2)

Updates `vite` from 7.2.2 to 8.2.2
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.2.2/packages/vite)

---
updated-dependencies:
- dependency-name: "@types/chrome"
  dependency-version: 0.2.8
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: "@types/node"
  dependency-version: 26.4.1
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: npm
- dependency-name: typescript
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: npm
- dependency-name: vite
  dependency-version: 8.2.2
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-05 10:51:59 +00:00
Evan Hu e11d69c754 ci: build the settings page on every change, and unbreak pnpm 11
This repository had no CI and no dependabot, while the settings page under
webview2/settings/ime-settings is a Vite and TypeScript project that the Windows release workflow
builds. Until now pnpm build only ever ran while cutting a release, so a break here surfaced at
the worst possible moment.

pnpm-workspace.yaml declared only onlyBuiltDependencies. pnpm 10 honours that key, which is why
releases worked, but pnpm 11 reads allowBuilds instead: it refuses to run esbuild's postinstall,
exits 1, and rewrites the file with a "set this to true or false" placeholder. So pnpm install
--frozen-lockfile fails outright for anyone on a current pnpm. Declaring allowBuilds alongside the
existing key satisfies both, verified against 10.34.5 and 11.25.0.

packageManager pins the pnpm version so a local checkout and CI agree through corepack.

dependabot now covers npm as well as actions. The template used across the other repositories only
declares github-actions and gitsubmodule, so the settings page dependencies were unwatched: they
sit one to two majors behind, with typescript at 5.9 against 7.0 and vite at 7.2 against 8.2.
Those bumps are left to dependabot rather than done here.

The README described only the symlink debug trick, through one developer's absolute paths, and
never mentioned that the settings page has to be built at all.
2026-09-05 17:39:12 +09:00
fanlusky 1709735ddd Revert the WebView2 changes and temporarily make it switchable between rendering backends. 2026-09-04 01:42:38 +08:00
fanlusky e82c5ce633 Add translations for Korean and German. 2026-09-03 00:49:13 +08:00
fanlusky db2efbaa0d Add an option for [ / ] page turning. 2026-09-02 21:13:13 +08:00
fanlusky 3d0dfd1aef Add a setting to always use Chinese/English punctuation. 2026-09-02 20:54:25 +08:00
fanlusky 30f2446cee Preview external skins from TOML color tokens instead of cand.css
Generate settings candidate previews from [candidate.dark]/[candidate.light]
and document skin.toml. Candidate HTML remains for the settings mockup;
the runtime window is no longer WebView2.
2026-09-02 15:30:29 +08:00
fanlusky a38989f52e Add candidate window follow-cursor setting and pointer diagnostics 2026-09-01 00:47:36 +08:00
fanlusky 6486e9ec4c Fix the regression issue introduced after the previous fix for slow candidate window response during high CPU usage: candidate window flickering and candidates being highlighted without mouse hover movement. 2026-08-30 17:54:14 +08:00
fanlusky 27c388dffc Add support for the DeepLX translation service. 2026-08-30 15:39:16 +08:00
fanlusky a81940faac Adjust some styles. 2026-08-29 23:39:56 +08:00
fanlusky bcd5ebe8f7 Optimize niya skin. 2026-08-29 22:52:46 +08:00
fanlusky 799e6d3d04 Optimize settings cold start speed. 2026-08-29 22:33:22 +08:00
fanlusky ba1922e33f Adjust some styles. 2026-08-29 21:48:17 +08:00