Dev/mihomo control (#339)

* Add Mihomo Control plugin

Monitor and control a Mihomo (Clash Meta) external controller from the
bar: live traffic graph, proxy mode, proxy-group management with latency
tests, and core restart. Works locally (127.0.0.1) or remotely via
host/port/secret settings.

* Add Chinese (Simplified) translation

* Add test-all latency button

Adds a Test all button next to the Proxy groups heading that runs latency
tests on every group sequentially, with a single summary notification.

* Unify traffic and proxy groups section styles

Give both sections the same card look: muted medium-weight heading on the
left, secondary info on the right, and proxy-group cards restyled as
bordered sub-cards inside the section.

* Polish proxy group cards

Show the selected proxy next to the bold group name (ECS > ecs-proxy),
move the expand chevron to the type/members row where the list opens,
and drop the list glyph from the card header.

* Decouple heights of paired group cards

Keep each card in a two-column row at its natural height instead of
stretching the neighbor when one is expanded.

* Use thumbnail generator to generate thumbnail

* mihomo-control: theme-aware panel colors

Use theme roles for traffic and latency colors so they stay readable in
light mode, and keep the status chip's green/amber/red identity with
darker light-mode shades.
This commit is contained in:
MA Dingjie
2026-08-12 09:34:17 -04:00
committed by GitHub
parent 86e04099bc
commit 222fec4875
13 changed files with 1601 additions and 0 deletions
+92
View File
@@ -0,0 +1,92 @@
{
"settings": {
"host": {
"label": "Host",
"description": "Hostname or IP of the Mihomo external controller."
},
"port": {
"label": "Port",
"description": "Port of the Mihomo external controller (9090 by default)."
},
"secret": {
"label": "Secret",
"description": "External-controller secret from your Mihomo config; empty when authentication is disabled."
},
"use_https": {
"label": "HTTPS",
"description": "Connect with https:// instead of http:// (external-controller-tls or a TLS reverse proxy)."
},
"allow_insecure_tls": {
"label": "Allow insecure TLS",
"description": "Skip certificate verification when the controller uses a self-signed certificate."
},
"test_url": {
"label": "Test URL",
"description": "URL used for latency tests; empty uses each group's configured test URL."
},
"refresh_interval": {
"label": "Refresh interval",
"description": "Seconds between status polls (1–60)."
}
},
"panel": {
"title": "Mihomo Control",
"status_online": "Online",
"status_offline": "Offline",
"status_connecting": "Connecting",
"mode_rule": "Rule",
"mode_global": "Global",
"mode_direct": "Direct",
"refresh": "Refresh",
"traffic": "Traffic",
"connections": "connections",
"memory": "RAM",
"proxy_groups": "Proxy groups",
"no_groups": "No proxy groups found.",
"delay_test": "Test latency",
"test_all": "Test all",
"restart": "Restart",
"timeout": "timeout",
"no_members": "no members",
"members_count": {
"one": "{count} member",
"other": "{count} members"
},
"hidden": "hidden",
"online_with_version": "{version} · {endpoint}",
"online_plain": "{endpoint}",
"offline_with_error": "{error}",
"offline_plain": "{endpoint}"
},
"widget": {
"status": "Status",
"mode": "Mode",
"connections": "Connections",
"up": "Up total",
"down": "Down total",
"status_online_with_version": "Online · {version}",
"status_online_plain": "Online",
"status_connecting": "Connecting",
"status_offline_with_error": "Offline — {error}",
"status_offline_plain": "Offline"
},
"shortcut": {
"label": "Mihomo: {mode}",
"mode_rule": "Rule",
"mode_global": "Global",
"mode_direct": "Direct"
},
"notify": {
"mode_changed": "Mihomo mode changed",
"proxy_selected": "Proxy selected",
"proxy_selected_body": "{group} → {proxy}",
"delay_done": "Latency test finished",
"delay_all_done": "All groups tested",
"delay_body": "{count} nodes tested, selected {delay} ms",
"delay_body_no_selection": "{count} nodes tested",
"delay_timeout": "All nodes timed out (504) — check the test URL",
"restarting": "Mihomo is restarting",
"connections_closed": "All connections closed",
"request_failed": "Mihomo request failed"
}
}