Repository navigation
feat: 接入 macOS 原生 Liquid Glass 并分离玻璃层与阅读层 - #69
Merged
Merged
Conversation
tauri 2.10.3 → 2.12.5,连带 tauri-build 2.7.4、tauri-utils 2.10.2、 tauri-runtime 2.12.2、tauri-runtime-wry 2.12.3、wry 0.57.0、 tao 0.37.1、window-vibrancy 0.8.1、webview2-com 0.39.1、 tray-icon 0.25.1。前端 @tauri-apps/api 与 cli 同步到 2.12.4。 Cargo.toml 的版本下限锁到 2.12:2.10/2.11 的 Effect 枚举里没有 LiquidGlass 变体,后续接入原生材质需要这个下限。 本次只动依赖,窗口构建代码与材质参数保持原样,便于单独验证 wry/tao 跨 minor 升级是否影响透明窗口、拖动与焦点行为。
macOS 同时声明 LiquidGlassRegular 与 Popover:26 及以上用原生 Liquid Glass,15 及以下由 tauri 自动回退到 Visual Effect 材质。 两项必须成对声明,只留前者会让旧系统完全没有材质,而这段回退 在 tauri 内部,Windows 上的测试看不见。新增单测锁住这个契约。 建窗改为始终隐藏、材质声明走 builder 的 effects()、最后按需 show()。此前 visible(true) 让窗口在 build() 返回前就可见,而材质 是投递到主线程队列后才施加,首帧是一块没有玻璃的透明板。 材质施加结果无法从返回值判断:tauri 内层用 let _ 丢弃了错误, vibrancy 的 set_window_effects 恒返回 Ok,原先的 popup_material_unavailable 警告因此是死代码。改为在建窗时记录 popup_material_decision,至少能区分本机打算用哪一档材质。 Windows 的 Acrylic 声明与着色参数保持不变。macOS 材质状态维持 FollowsWindowActiveState:浮窗不可聚焦,会稳定渲染偏淡的 inactive 外观,符合当前的观感取向。
原先 --popup-bg 一个变量同时承担「玻璃染色」和「文字衬底」两个职责, 调哪个都会连带影响另一个:想提高可读性就得加厚整块面板,玻璃随之被 闷成色板;想保住通透又读不清字。历史上 0.55 与 0.22 两次数值反复 都卡在这个耦合上。 拆成两组: - --popup-glass-* 只负责玻璃感:极薄染色、边缘高光、外阴影 - --popup-reading-* 只负责可读性:正文区域的局部衬底 外层容器改用 --popup-glass-*,数值与拆分前完全一致,本次不改变任何 视觉表现。新增 .popup-reading-surface 语义类,双主题各有一套配方, 浅色 0.52 / 深色 0.56,起始值待真实合成截图校准。 分隔线单独提取为 --popup-divider,供正文区与操作栏之间使用。
译文不再直接压在玻璃高光渐变上,改为铺一层只覆盖正文区域的浅色 衬底。标题栏与底部操作栏保持通透,OS 原生材质仍然可见 —— 整块 面板加厚会把玻璃闷成色板,这正是外层染色反复调参想避开的结局。 正文排版按规格保持回归基线:14.5px / 500 字重 / 1.8 行高 / 360px 上限 / 自动滚动,均未改动。 正文上方那条分隔线移除:衬底自带内描边,再叠一条会形成双重 border。 正文与操作栏之间那条保留,两者都在衬底之外,仍需要一条分界。
加载态的骨架块与错误态的错误信息都落在与译文相同的衬底上。 加载态:骨架与译文占据同一块区域,衬底若只在结果态出现,切换时会 看到一块区域突然变暗,像是闪了一下。 错误态:错误信息是用户此刻唯一要读的内容,压在裸露玻璃上最容易在 杂乱背景里读丢。衬底只包文字,不包图标与操作行,避免变成一块覆盖 整个面板的暗板。
对比度实测(按 WCAG 相对亮度公式,取系统材质合成后的像素值): 深色主题最坏情况是纯白桌面:原配方 0.56 衬底 + #F5F5F7 正文只有 4.54:1,仅比 4.5 门槛高 0.04 —— 不足以覆盖不同 DPI 与系统缩放的 合成偏差。改为 0.58 衬底 + 纯白正文后升到 5.25:1,余量恢复到可接受 范围。正文色单独提取为 --popup-text-primary,只作用于阅读衬底内的 文字,设置页等其他深色界面仍用 #F5F5F7。 浅色主题配方不变:最坏情况(纯黑桌面)5.34:1,本就达标。 高度:阅读衬底自带 padding 与内描边,译文 maxHeight 360 会让容器 总高达到约 497px,超过后端 MAX_HEIGHT=480 的硬上限。被 clamp 的 后果是滚动区被压扁,用户看不到还有内容。降到 300 后容器 416px, 余量 64px,滚动区仍能显示约 11 行中文。
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
浮窗材质改造的前两步:接入 macOS 原生 Liquid Glass,并把「玻璃质感」与「正文可读性」拆成两套独立配方。
依赖升级
tauri-utils2.10.2、window-vibrancy0.8.1、wry0.57、tao0.37@tauri-apps/api/cli→ 2.12.4Effect枚举里没有 LiquidGlass 变体macOS 原生材质
LiquidGlassRegular与Popover:macOS 26+ 用原生 Liquid Glass,15 及以下由 Tauri 自动回退FollowsWindowActiveState:浮窗不可聚焦,会稳定渲染偏淡的 inactive 外观建窗时序
effects()、最后按需show()visible(true)让窗口在build()返回前就可见,而材质是投递到主线程队列后才施加,首帧是一块没有玻璃的透明板材质可观测性
popup_material_unavailable是死代码:Tauri 内层用let _ =丢弃错误,set_window_effects恒返回Okpopup_material_decision,能区分本机打算用哪一档玻璃层与阅读层分离
--popup-bg原先同时承担「玻璃染色」和「文字衬底」:想读清字就得加厚整块面板,玻璃随之闷成色板--popup-glass-*(极薄染色、边缘高光、外阴影)与--popup-reading-*(正文局部衬底).popup-reading-surface,只铺正文区域,标题栏与操作栏保持通透对比度实测
按 WCAG 相对亮度公式,取系统材质合成后的像素值:
深色主题原配方仅比 4.5 门槛高 0.04,不足以覆盖不同 DPI 与系统缩放的合成偏差。改为 0.58 衬底 + 纯白正文。正文色提取为
--popup-text-primary,只作用于阅读衬底内,设置页等其他深色界面仍用#F5F5F7。高度余量
阅读衬底带来 padding 与内描边,译文
maxHeight360 会让容器总高达到约 497px,超过后端MAX_HEIGHT=480。被 clamp 的后果是滚动区被压扁。降到 300 后容器 416px,余量 64px,仍可显示约 11 行中文。验证
npx tsc --noEmit通过npm test4 个文件 / 25 个用例通过npm run build通过cargo fmt --check通过cargo clippy -- -D warnings通过cargo test --lib232 个用例通过(新增 1 个材质契约测试)Windows 实机:材质决策日志顺序正确、Acrylic 生效(DWM
backdrop=3)、深色下immersiveDark=1、折叠 166→44→168、Escape 关闭、隐藏后重新弹出、拖拽禁区契约完好。未验证