From 7bca26d648be9edd7f757b03a035eea3af32ddec Mon Sep 17 00:00:00 2001 From: fanlusky <1730976608@qq.com> Date: Mon, 28 Sep 2026 22:13:42 +0800 Subject: [PATCH] feat(niya-demo): declare decoration, background and toolbar styles in skin.toml - Move the decoration image into [candidate_window.decoration] (102x88, right-aligned) - Add [candidate_window.background] with a translucent texture and 12dip corner radius - Replace toolbar.css with [toolbar] / [toolbar.dark] / [toolbar.light] - Bump version to 0.2.0 - Update tests, preview.html and schema docs for the new fields - Rewrite README --- examples/skin-examples/README.md | 118 +++++++++++------- examples/skin-examples/preview.html | 8 +- examples/skin-examples/schema/README.md | 47 ++++++- .../skins/niya-demo/assets/background.png | Bin 0 -> 64346 bytes .../skin-examples/skins/niya-demo/skin.toml | 45 ++++++- .../skin-examples/skins/niya-demo/toolbar.css | 36 ------ .../test_manifests.cpython-314.pyc | Bin 0 -> 4439 bytes examples/skin-examples/tests/install.ps1 | 2 +- .../skin-examples/tests/test_manifests.py | 29 ++++- 9 files changed, 187 insertions(+), 98 deletions(-) create mode 100644 examples/skin-examples/skins/niya-demo/assets/background.png delete mode 100644 examples/skin-examples/skins/niya-demo/toolbar.css create mode 100644 examples/skin-examples/tests/__pycache__/test_manifests.cpython-314.pyc diff --git a/examples/skin-examples/README.md b/examples/skin-examples/README.md index 7dd60617..a0544928 100644 --- a/examples/skin-examples/README.md +++ b/examples/skin-examples/README.md @@ -1,90 +1,124 @@ # Metasequoia IME skin example -[![CI](https://img.shields.io/github/actions/workflow/status/metasequoiaime/metasequoia-ime-skin-example/ci.yml?branch=main&label=CI)](https://github.com/metasequoiaime/metasequoia-ime-skin-example/actions/workflows/ci.yml) -[![CodeQL](https://img.shields.io/github/actions/workflow/status/metasequoiaime/metasequoia-ime-skin-example/codeql.yml?branch=main&label=CodeQL)](https://github.com/metasequoiaime/metasequoia-ime-skin-example/actions/workflows/codeql.yml) -[![License](https://img.shields.io/github/license/metasequoiaime/metasequoia-ime-skin-example)](LICENSE) -[![Stars](https://img.shields.io/github/stars/metasequoiaime/metasequoia-ime-skin-example?style=flat)](https://github.com/metasequoiaime/metasequoia-ime-skin-example/stargazers) +[![CI](https://img.shields.io/github/actions/workflow/status/metasequoiaime/msime-skin-example/ci.yml?branch=main&label=CI)](https://github.com/metasequoiaime/msime-skin-example/actions/workflows/ci.yml) +[![CodeQL](https://img.shields.io/github/actions/workflow/status/metasequoiaime/msime-skin-example/codeql.yml?branch=main&label=CodeQL)](https://github.com/metasequoiaime/msime-skin-example/actions/workflows/codeql.yml) +[![License](https://img.shields.io/github/license/metasequoiaime/msime-skin-example)](LICENSE) +[![Stars](https://img.shields.io/github/stars/metasequoiaime/msime-skin-example?style=flat)](https://github.com/metasequoiaime/msime-skin-example/stargazers) -这是 Metasequoia IME 外部候选框皮肤的最小示例。候选框由 D2D 绘制,皮肤用 `skin.toml` 声明名称、装饰几何和配色;悬浮工具栏仍可用可选 CSS。 +水杉输入法(Metasequoia IME)外部皮肤的官方样例。一个皮肤就是一个文件夹,外观全部写在一份 `skin.toml` 里:候选框的装饰图、背景图、圆角和配色,以及悬浮工具栏的配色。不需要写 CSS,也不会加载任何脚本。 -字段说明见 [manifest 文档](schema/README.md),预览入口为 [preview.html](preview.html)。 +- 字段说明:[schema/README.md](schema/README.md) +- 本地预览:[preview.html](preview.html) ## 快速开始 -1. 用自己的透明 PNG 替换 `skins/niya-demo/assets/character.png`。 -2. 打开 `preview.html`,同时检查横向和纵向候选框。 -3. 修改 `skins/niya-demo/skin.toml` 中的名称、作者、装饰尺寸和 `[candidate.*]` 颜色。 -4. 将整个皮肤文件夹复制到 `%LOCALAPPDATA%\metasequoiaime\skins\`,打开设置的“皮肤”页面(会自动扫描目录),也可以点击“刷新皮肤”或运行 `./install.ps1`。 +1. 复制 `skins/niya-demo/`,把文件夹名和 `skin.toml` 里的 `id` 改成同一个新名字。 +2. 替换 `assets/` 里的图片: + - `character.png`:卡片上方的人物装饰,建议透明 PNG。 + - `background.png`:卡片背景纹理。深浅两套主题共用这张图,建议大部分透明。 +3. 修改 `skin.toml` 中的名称、作者、尺寸和配色。 +4. 用浏览器打开 `preview.html`,大致确认横向、纵向两种候选框的效果。 +5. 把皮肤文件夹复制到 `%LOCALAPPDATA%\metasequoiaime\skins\`,打开设置里的“皮肤”页面(会自动扫描),或者点“刷新皮肤”。 -安装脚本会将皮肤复制到: +也可以直接运行安装脚本装上样例皮肤: -```text -%LOCALAPPDATA%\metasequoiaime\skins\niya-demo\ +```powershell +./install.ps1 # 复制到 %LOCALAPPDATA%\metasequoiaime\skins\niya-demo\ 并启用 +./install.ps1 -NoActivate # 只复制,不改 config.toml ``` -默认还会将 `config.toml` 中的 `appearance.candidate_skin` 设置为 `niya-demo`;只想复制、不立即启用时使用 `./install.ps1 -NoActivate`。 +启用即把 `config.toml` 中的 `appearance.candidate_skin` 设为 `niya-demo`。装好后重启水杉输入法服务即可生效。 -设置页面会读取每个一级子目录中的 `skin.toml`。目录名必须与 manifest 的 `id` 一致;字段不合法或工具栏 CSS 缺失的目录不会进入可选列表,并会显示在页面底部的诊断信息中。 +设置页会读取 `skins\` 下每个一级子目录中的 `skin.toml`。目录名与 `id` 不一致或字段不合法时,该皮肤不会出现在可选列表里,原因会显示在页面底部的诊断信息中。 -## 仓库与皮肤包结构 +## 目录结构 ```text -metasequoia-ime-skin-example/ +msime-skin-example/ ├─ skins/ -│ └─ niya-demo/ # 一个皮肤一个文件夹 -│ ├─ skin.toml # 名称、继承关系、能力、几何、候选配色 -│ ├─ toolbar.css # 可选:悬浮工具栏视觉 +│ └─ niya-demo/ # 一个皮肤一个文件夹,文件夹名 = id +│ ├─ skin.toml # 元信息、候选框、工具栏、授权 │ └─ assets/ -│ └─ character.png # 本地静态资源 -├─ schema/ # 字段说明 -├─ preview.html # 仓库级预览入口 -└─ install.ps1 # demo 安装工具 +│ ├─ character.png # 卡片上方的装饰图 +│ └─ background.png # 卡片背景图 +├─ schema/ # manifest 字段说明 +├─ tests/ # CI 用的 manifest 与安装脚本测试 +├─ preview.html # 本地预览 +└─ install.ps1 # 样例安装脚本 ``` -仓库中的 `preview.html`、`schema/` 和安装脚本是制作工具,不会复制进已安装的皮肤目录。 +只有 `skins//` 会被安装,`preview.html`、`schema/`、`tests/` 和安装脚本都只是制作工具。 -## 最常修改的参数 +## 样例皮肤能演示什么 + +`niya-demo` 的 `skin.toml` 每一段都带注释,下面是最常改的几处: ```toml [candidate_window] min_width_dip = 176 +corner_radius_dip = 12 # 0–32,不写则沿用 base [candidate_window.decoration] -top_inset_dip = 88 -width_dip = 136 +image = "assets/character.png" +top_inset_dip = 88 # 装饰框高度 +width_dip = 102 # 装饰框宽度 +align = "right" # left | center | right + +[candidate_window.background] +image = "assets/background.png" +fit = "cover" # cover | contain | stretch +opacity = 0.3 # 0–1 [candidate.dark] -accent = "#e08aa8" +accent = "#e08aa8" # 光标与选中胶囊条 selected = "rgba(224, 138, 168, 0.28)" hover = "rgba(224, 138, 168, 0.16)" + +[toolbar] +corner_radius_dip = 8 + +[toolbar.dark] +background = "#221a1e" +handle = "#e08aa8" +icon = "#f6e4eb" ``` -- `top_inset_dip`:候选框上方为图片预留的高度。 -- `width_dip`:顶部装饰宽度。 -- `min_width_dip`:候选框最小宽度,通常不应小于 `width_dip`。 -- `accent` / `selected` / `hover`:光标与胶囊条、高亮行、悬停行。 +几个要点: -示例图片高 `118px`,其中下方约 `30px` 被候选框遮住,所以只露出头部。 +- 装饰图放在一个 `width_dip × top_inset_dip` 的框里等比缩放,框贴在卡片正上方,不会与卡片重叠。框的比例和原图一致时就不会留白,比如样例原图是 408×353,所以用了 102×88。 +- 卡片实际最小宽度取 `min_width_dip` 和装饰图 `width_dip` 中较大的那个。 +- 背景图画在底色之上、文字之下,并按圆角裁剪。 +- `[toolbar]` 下的所有键都可以省略,没写的沿用 `base` 皮肤;配置对 D2D 和 WebView2 两种工具栏渲染器都生效。 +- `[supports].themes` 里声明的每套主题都要有对应的 `[candidate.]`;写了 `[toolbar]` 的话,也要有对应的 `[toolbar.]`。 + +完整字段见 [schema/README.md](schema/README.md)。 ## 制作约束 -- 皮肤使用 `skin.toml`、可选 `toolbar.css` 和本地图片,不加载自定义 JavaScript。 -- 候选框不要再写 `cand.css`。 -- ID 只能包含小写字母、数字、点、下划线和连字符,最长 64 个字符。 -- 图片建议控制在 500 KB 内。 +- 只用 `skin.toml` 和本地图片,不支持自定义 JavaScript,也不再读取 `cand.css` 或工具栏 CSS。 +- 图片路径相对于皮肤目录,不能指向目录之外。 +- `id` 只能包含小写字母、数字、点、下划线和连字符,最长 64 个字符。 +- 单张图片建议不超过 500 KB(CI 会检查)。 + +## 测试 + +```powershell +python -m unittest discover -s tests -v # 检查 manifest 与引用的图片 +./tests/install.ps1 # 在临时目录里测试安装、启用和重复安装 +``` ## 授权提示 -**本仓库是 MIT 授权的**(见 [LICENSE](LICENSE))。这个仓库存在的意义就是被复制——直接 fork、或者把 `skins/niya-demo/` 整个拷走改成自己的皮肤,都不需要额外授权。选 MIT 而不是产品仓的 GPL-3.0,正是为了让做出来的皮肤可以按作者自己的意愿授权,不被传染。 +**本仓库采用 MIT 授权**(见 [LICENSE](LICENSE))。这个仓库就是拿来复制的:直接 fork,或者把 `skins/niya-demo/` 整个拷走改成自己的皮肤,都不需要额外授权。之所以用 MIT 而不是产品仓库的 GPL-3.0,就是为了让你做出来的皮肤可以按自己的意愿授权。 -皮肤代码和图片资源可以使用不同的许可。发布前请在 `skin.toml` 的 `[license]` 中分别写明 `code` 与 `assets`。示例里的 `assets` 标为 `UNVERIFIED-DEMO-ONLY`,意思是那些图只用于演示、来源未经核实,**不要直接拿去发布**,换成你自己有权使用的图片。 +皮肤代码和图片资源可以用不同的许可,发布前请在 `skin.toml` 的 `[license]` 里分别写明 `code` 和 `assets`。样例中的 `assets` 标为 `UNVERIFIED-DEMO-ONLY`,意思是这些图片只用于演示、来源未经核实,**请不要直接拿去发布**,换成你有权使用的图片。 ## Star History - - Star History Chart + + Star History Chart diff --git a/examples/skin-examples/preview.html b/examples/skin-examples/preview.html index 7aa2aa6c..22d5b5d9 100644 --- a/examples/skin-examples/preview.html +++ b/examples/skin-examples/preview.html @@ -13,10 +13,14 @@ .preview-label { margin-bottom:8px; color:#aaa; } .containerParent { width:fit-content; padding-top:88px; position:relative; } .containerParent:not(:empty)::before { - content:""; position:absolute; z-index:0; top:0; right:0; width:136px; height:118px; + content:""; position:absolute; z-index:0; top:0; right:0; width:102px; height:88px; background: url("./skins/niya-demo/assets/character.png") center / contain no-repeat; pointer-events:none; } - .container { width:fit-content; padding:2px; border:1.5px solid #9b9b9b2e; border-radius:6px; background:#202020; box-shadow:5px 5px 10px #0008; user-select:none; position:relative; z-index:1; } + .container { width:fit-content; min-width:176px; padding:2px; border:1.5px solid #9b9b9b2e; border-radius:12px; background:#202020; box-shadow:5px 5px 10px #0008; user-select:none; position:relative; z-index:1; overflow:hidden; } + .container::before { + content:""; position:absolute; inset:0; z-index:-1; opacity:.3; + background: url("./skins/niya-demo/assets/background.png") center / cover no-repeat; pointer-events:none; + } .row { margin-top:2px; padding:0 12px 0 2px; } .pinyin { display:flex; min-width:140px; } .cursor { display:inline-block; width:1.5px; height:1.2em; margin-left:1px; background:#e08aa8; vertical-align:middle; } diff --git a/examples/skin-examples/schema/README.md b/examples/skin-examples/schema/README.md index 549e596f..cec794d8 100644 --- a/examples/skin-examples/schema/README.md +++ b/examples/skin-examples/schema/README.md @@ -2,12 +2,47 @@ 每个皮肤目录需要 `skin.toml`,`id` 必须与文件夹名一致。`schema_version` 当前为 `1`。 -候选框由 D2D 绘制,颜色写在 `[candidate.dark]` / `[candidate.light]`,不要再提供 `cand.css`。 +候选框和悬浮工具栏都由 `skin.toml` 声明,不要再提供 `cand.css` 或工具栏 CSS。所有图片路径都相对于皮肤目录,且不能指向目录之外。 -可选字段: +## 顶层字段 -- `toolbar_stylesheet`:悬浮工具栏仍是 WebView,可继续用 CSS -- `preview`:设置页装饰图,相对皮肤目录 -- `[candidate.*.]`:`accent`、`selected`、`hover`、`surface`、`border`、`text`、`number`、`show_selected_bar` +- 必填:`schema_version`、`id`、`name`、`version`、`author` +- 可选:`description`、`base`(继承的内置皮肤,如 `fluent`) +- `[supports]`:`layouts`(`horizontal` / `vertical`)、`themes`(`dark` / `light`) +- `[license]`:`code`、`assets` -颜色支持 `#rgb` / `#rrggbb` / `#rrggbbaa` 和 `rgb()` / `rgba()`。 +## `[candidate_window]` + +- `min_width_dip`:卡片最小宽度;实际最小宽度还会被装饰图的 `width_dip` 撑大 +- `corner_radius_dip`:卡片圆角,`0`–`32`;不写则沿用 `base` + +### `[candidate_window.decoration]`(可选) + +卡片上方的装饰图。写了这张表就必须同时给出 `image`、`top_inset_dip`、`width_dip`。 + +- `image`:图片路径 +- `top_inset_dip` / `width_dip`:装饰框的高和宽,框贴在卡片上方,不与卡片重叠;图片在框内等比缩放 +- `align`:`left` | `center` | `right`,相对卡片 + +### `[candidate_window.background]`(可选) + +卡片背景图,画在底色之上、文字之下,按圆角裁剪,对深浅两套主题都生效。 + +- `image`:图片路径 +- `fit`:`cover`(铺满裁切)| `contain`(完整显示)| `stretch`(拉伸) +- `opacity`:`0`–`1` + +## `[candidate.dark]` / `[candidate.light]` + +`accent`、`selected`、`hover`、`surface`、`border`、`text`、`number`、`show_selected_bar` + +## `[toolbar]` + +悬浮工具栏样式,D2D 与 WebView2 两个渲染器都生效。所有键都可省略,不写的沿用 `base`。 + +- `corner_radius_dip`:`0`–`32` +- `[toolbar.dark]` / `[toolbar.light]`:`background`、`border`、`handle`(左侧拖动条)、`divider`、`icon`、`hover` + +## 颜色格式 + +支持 `#rgb` / `#rrggbb` / `#rrggbbaa` 和 `rgb()` / `rgba()`。 diff --git a/examples/skin-examples/skins/niya-demo/assets/background.png b/examples/skin-examples/skins/niya-demo/assets/background.png new file mode 100644 index 0000000000000000000000000000000000000000..40fb357cf435b9121c67348dd3882fb80c70b40d GIT binary patch literal 64346 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 literal 0 HcmV?d00001 diff --git a/examples/skin-examples/skins/niya-demo/skin.toml b/examples/skin-examples/skins/niya-demo/skin.toml index bdaa64b1..e054b13f 100644 --- a/examples/skin-examples/skins/niya-demo/skin.toml +++ b/examples/skin-examples/skins/niya-demo/skin.toml @@ -1,23 +1,37 @@ +# 水杉输入法官方外部皮肤样例:演示候选框的装饰图、背景图、自定义圆角、配色和工具栏样式。 +# 所有图片路径都相对于本皮肤目录,且必须留在目录之内。 schema_version = 1 id = "niya-demo" name = "Niya Demo" -version = "0.1.1" +version = "0.2.0" author = "Metasequoia IME contributors" -description = "天元突破·妮娅 演示候选框外部图片、右侧对齐、后置层级,以及悬浮工具栏配色。" +description = "天元突破·妮娅:卡片上方右对齐的人物装饰、带星点的背景图、12dip 圆角,以及配套的悬浮工具栏配色。" base = "fluent" -toolbar_stylesheet = "toolbar.css" -preview = "assets/character.png" [supports] layouts = ["horizontal", "vertical"] themes = ["dark", "light"] [candidate_window] +# 卡片的最小宽度;实际最小宽度还会被装饰图的 width_dip 撑大。 min_width_dip = 176 +# 候选框圆角,0–32。不写则沿用 base 皮肤的圆角。 +corner_radius_dip = 12 +# 卡片上方的装饰图。不需要装饰就整张表不写;写了就必须给出 image、top_inset_dip 和 width_dip。 +# 图片在 width_dip × top_inset_dip 的框里等比缩放,框贴在卡片上方,不与卡片重叠。 [candidate_window.decoration] +image = "assets/character.png" top_inset_dip = 88 -width_dip = 136 +width_dip = 102 # 与 408×353 的原图比例一致,框里不留空白 +align = "right" # left | center | right,相对卡片 + +# 卡片背景图,画在底色之上、文字之下,按圆角裁剪。背景图对深浅两套主题都生效, +# 所以这里用的是大部分透明的纹理,而不是一张实心图。 +[candidate_window.background] +image = "assets/background.png" +fit = "cover" # cover(铺满裁切)| contain(完整显示)| stretch(拉伸) +opacity = 0.3 # 0–1 [candidate.dark] accent = "#e08aa8" @@ -31,6 +45,27 @@ hover = "rgba(196, 92, 122, 0.10)" surface = "#fff7fa" border = "rgba(176, 80, 110, 0.22)" +# 悬浮工具栏。键都可省略,不写的沿用 base 皮肤;D2D 与 WebView2 两个渲染器都生效。 +# 可用键:background、border、handle(左侧拖动条)、divider、icon、hover。 +[toolbar] +corner_radius_dip = 8 # 0–32 + +[toolbar.dark] +background = "#221a1e" +border = "rgba(224, 138, 168, 0.38)" +handle = "#e08aa8" +divider = "rgba(224, 138, 168, 0.30)" +icon = "#f6e4eb" +hover = "rgba(224, 138, 168, 0.20)" + +[toolbar.light] +background = "#fff7fa" +border = "rgba(176, 80, 110, 0.22)" +handle = "#c45c7a" +divider = "rgba(176, 80, 110, 0.22)" +icon = "#3a2a30" +hover = "rgba(196, 92, 122, 0.12)" + [license] code = "MIT" assets = "UNVERIFIED-DEMO-ONLY" diff --git a/examples/skin-examples/skins/niya-demo/toolbar.css b/examples/skin-examples/skins/niya-demo/toolbar.css deleted file mode 100644 index c40e3328..00000000 --- a/examples/skin-examples/skins/niya-demo/toolbar.css +++ /dev/null @@ -1,36 +0,0 @@ -/* Layered on the built-in floating-toolbar HTML (Fluent / default template). */ -.status-bar, -.ftb-preview-host .status-bar { - border-color: rgba(224, 138, 168, 0.38); -} - -.drag-handle, -.ftb-preview-host .drag-handle { - background: #e08aa8; -} - -html[data-candidate-theme="light"] .status-bar, -.theme-light .status-bar, -.ftb-preview-host.theme-light .status-bar { - background-color: #fff7fa; - border-color: rgba(176, 80, 110, 0.22); - box-shadow: 4px 4px 8px rgba(80, 40, 50, 0.12); -} - -html[data-candidate-theme="light"] .drag-handle, -.theme-light .drag-handle, -.ftb-preview-host.theme-light .drag-handle { - background: #c45c7a; -} - -html[data-candidate-theme="light"] .divider, -.theme-light .divider, -.ftb-preview-host.theme-light .divider { - background-color: rgba(176, 80, 110, 0.22); -} - -html[data-candidate-theme="light"] .icon, -.theme-light .icon, -.ftb-preview-host.theme-light .icon { - color: #3a2a30; -} diff --git a/examples/skin-examples/tests/__pycache__/test_manifests.cpython-314.pyc b/examples/skin-examples/tests/__pycache__/test_manifests.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a28833cfc5c020ca75631e47e7e37126f0d449f2 GIT binary patch literal 4439 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 literal 0 HcmV?d00001 diff --git a/examples/skin-examples/tests/install.ps1 b/examples/skin-examples/tests/install.ps1 index 8f0d4a14..187f3b25 100644 --- a/examples/skin-examples/tests/install.ps1 +++ b/examples/skin-examples/tests/install.ps1 @@ -8,7 +8,7 @@ try { $config = Join-Path $imeRoot 'config.toml' & "$PSScriptRoot/../install.ps1" -NoActivate if (Test-Path $config) { throw 'NoActivate must not create settings' } - foreach ($file in @('skin.toml', 'toolbar.css', 'assets/character.png')) { + foreach ($file in @('skin.toml', 'assets/character.png', 'assets/background.png')) { $source = Join-Path "$PSScriptRoot/../skins/niya-demo" $file $copy = Join-Path $destination $file if ((Get-FileHash $source).Hash -ne (Get-FileHash $copy).Hash) { diff --git a/examples/skin-examples/tests/test_manifests.py b/examples/skin-examples/tests/test_manifests.py index 74f1ee6e..b5e7e54e 100644 --- a/examples/skin-examples/tests/test_manifests.py +++ b/examples/skin-examples/tests/test_manifests.py @@ -19,14 +19,31 @@ class ManifestTests(unittest.TestCase): self.assertRegex(data["id"], r"^[a-z0-9._-]{1,64}$") for key in ("name", "version", "author"): self.assertTrue(data[key].strip(), key) - for key in ("toolbar_stylesheet", "preview"): - if key in data: - asset = (path.parent / data[key]).resolve() - self.assertTrue(asset.is_relative_to(path.parent.resolve()), key) - self.assertTrue(asset.is_file(), f"Missing {key}: {asset}") + window = data.get("candidate_window", {}) + assets = {key: data.get(key) for key in ("toolbar_stylesheet", "preview")} + for table in ("decoration", "background"): + if table in window: + assets[f"candidate_window.{table}.image"] = window[table]["image"] + if "decoration" in window: + for key in ("top_inset_dip", "width_dip"): + self.assertGreater(window["decoration"][key], 0, key) + for key, rel in assets.items(): + if rel is None: + continue + asset = (path.parent / rel).resolve() + self.assertTrue(asset.is_relative_to(path.parent.resolve()), key) + self.assertTrue(asset.is_file(), f"Missing {key}: {asset}") + if asset.suffix.lower() == ".png": + self.assertLessEqual(asset.stat().st_size, 500 * 1024, key) + for scope in ("candidate_window", "toolbar"): + if "corner_radius_dip" in data.get(scope, {}): + self.assertTrue(0 <= data[scope]["corner_radius_dip"] <= 32, scope) + if "background" in window: + self.assertTrue(0 <= window["background"].get("opacity", 1) <= 1) for theme in data["supports"]["themes"]: self.assertIn(theme, data["candidate"]) - self.assertLessEqual((path.parent / data["preview"]).stat().st_size, 500 * 1024) + if "toolbar" in data: + self.assertIn(theme, data["toolbar"]) if __name__ == "__main__":