Files
Lu Fan(SonnyCalcr) e701cebbe4 feat(server,ui,installer): 内置皮肤改由皮肤清单定义,新增微信绿(卷轴)内置皮肤 (#1061)
* feat(ui): CandidateList 支持等宽网格列与关闭选中态

- Appearance::gridColumns:横排时按可用宽度均分成等宽列(列数不超过 gridColumns,每列不窄于
  minItemWidth),放不下一列的项占多列。
- Appearance::selectable:为 false 时不画任何选中态,首项也能正常显示悬停与按下效果。

* feat(server,installer): 内置皮肤改由皮肤清单定义,新增微信绿(卷轴)内置皮肤

内置皮肤数据化:
- skins/default/<id>/skin.toml 从只放开关改为完整的出厂清单(配色、圆角、版式、工具栏、名称与说明),
  并新增 canvas 基底的清单。候选窗、悬浮工具栏、光标状态徽标不再在代码里写死任何内置皮肤的参数。
- 出厂清单在构建时编进程序;数据目录里的清单写了的键覆盖出厂值,缺失或写错时退回出厂外观。
  安装包改为每次整份覆盖 skins\default。
- 皮肤清单新增版式键(padding、item_gap、number_inset 等,长度可写 DIP 或 "0.3em"),以及
  [candidate_window.horizontal] / [candidate_window.vertical] 分排列覆盖、page_arrow_divider、
  toolbar.icon_corner_radius_dip。
- test_candidate_skin_tokens 保留改动前的内置分支作参照,逐个皮肤、主题、排列与字号比对清单解析结果。

共用候选窗场景:
- 候选框的场景搭建与套皮肤抽成 CandidateSkinScene,候选窗与设置页的皮肤预览共用;设置页预览改用
  真实的候选窗控件绘制,删除原先移植自网页样式的预览绘制与各皮肤硬编码。

卷轴展开(expand_panel)与微信绿(卷轴):
- 皮肤开关 expand_panel / expand_rows:横排候选行右端的展开按钮,展开后首行与后续候选网格一起滚动,
  右侧细滚动条;展开与收起只认按钮,展开时滚轮上下滚动、不翻页。
- 网格点选按绝对下标上屏并在工作线程核对显示文字;滚到底部时自动再展开一批候选。
- 新增内置皮肤 wechat_scroll「微信绿(卷轴)」。
2026-10-18 20:42:06 +08:00

110 lines
3.2 KiB
TOML

# 内置皮肤「微信绿(卷轴)」的出厂清单:皮肤级的开关与完整外观都在这里,输入法按它绘制候选框与悬浮工具栏。
# 安装或升级时整份覆盖,不建议直接修改;想要自己的样式,复制一份到 skins\<新 id>\ 做成外部皮肤
# (写 base = "wechat_scroll",只写想改的键)。基于 wechat_scroll 的外部皮肤没写的键沿用这里的值。
# 字段说明见 skins/README.md。
#
# 和其他皮肤最大的不同是卷轴展开(expand_panel):横排候选行右端没有翻页箭头,而是一个“∨”按钮,
# 点开后首行下面展开后续候选的网格,右侧是细滚动条,鼠标滚轮让首行与网格一起上下滚动(其他皮肤的滚轮是翻页)。
# 展开与收起都只能点这个按钮;收起时滚轮照常翻页。卷轴展开只在横排生效。
schema_version = 1
id = "wechat_scroll"
name = "微信绿(卷轴)"
description = "深浅两套中性配色、微信绿高亮,横排候选可像微信输入法一样卷轴展开、滚轮上下滚动"
[candidate_window]
# 翻页箭头(开了卷轴展开时横排不显示,竖排仍按这个开关)
page_arrows = false
# 候选框严格按文字所需的宽度收紧(默认关闭)
fit_content = false
# 卷轴展开:横排候选行右端放展开按钮,展开后网格一屏 expand_rows 行(2–8),超出的滚动查看
expand_panel = true
expand_rows = 4
corner_radius_dip = 10
border_width_dip = 1
item_corner_radius_dip = 6
shadow = "soft"
padding = 5
item_gap = 2
item_extra_height = 2
number_inset = 5
item_padding_right = 0
number_scale = 0.8
number_gap = 1.5
selected_bar_width = 3
selected_bar_height_em = 0.85
selected_bar_inside = false
justify_rows = false
trim_hidden_preedit_gap = false
page_arrow_style = "chevron"
preedit_margin_dip = [0, 0, 0, 0]
[candidate_window.horizontal]
item_corners_follow_card = true
[candidate.dark]
surface = "#1A1A1A"
border = "#2E2E2E"
text = "#EDEDED"
candidate_text = "#EDEDED"
preedit_text = "#D0D0D0"
preedit_caret = "#07C160"
number = "#8A8A8A" # 序号;展开按钮与滚动条也用这个颜色
accent = "#07C160"
selected = "#07C160"
selected_text = "#FFFFFF"
selected_number = "#FFFFFFCC"
hover = "#07C16033" # 悬停底色(网格里的候选也用它)
show_selected_bar = false
translation = "#529CCA"
selected_translation = "#FFFFFFCC"
[candidate.dark.menu]
background = "#1F1F1F"
border = "#343434"
text = "#D8D8D8"
hover = "#2A2A2A"
[candidate.light]
surface = "#FFFFFF"
border = "#E3E3E3"
text = "#1F1F1F"
candidate_text = "#1F1F1F"
preedit_text = "#555555"
preedit_caret = "#07C160"
number = "#8C8C8C"
accent = "#07C160"
selected = "#07C160"
selected_text = "#FFFFFF"
selected_number = "#FFFFFFCC"
hover = "#07C16024"
show_selected_bar = false
translation = "#0B6E99"
selected_translation = "#FFFFFFCC"
[candidate.light.menu]
background = "#FFFFFF"
border = "#D9D9D9"
text = "#333333"
hover = "#EEEEEE"
[toolbar]
corner_radius_dip = 8
icon_corner_radius_dip = 6
[toolbar.dark]
background = "#1A1A1A"
border = "#2E2E2E"
handle = "#07C160"
divider = "#2E2E2E"
icon = "#EDEDED"
hover = "#FFFFFF14"
[toolbar.light]
background = "#FFFFFF"
border = "#E3E3E3"
handle = "#07C160"
divider = "#E3E3E3"
icon = "#1F1F1F"
hover = "#0000000D"