homematic-manager 3.0.0-beta.10 → 3.0.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/node_modules/@homematic-manager/backend/dist/api/backend.js +4 -2
- package/node_modules/@homematic-manager/backend/dist/rpc/server.js +4 -2
- package/node_modules/@homematic-manager/backend/package.json +1 -1
- package/node_modules/@homematic-manager/core/dist/devices/index.d.ts +12 -0
- package/node_modules/@homematic-manager/core/dist/devices/index.js +46 -0
- package/node_modules/@homematic-manager/core/dist/i18n/messages.js +12 -0
- package/node_modules/@homematic-manager/core/dist/rssi/index.d.ts +24 -1
- package/node_modules/@homematic-manager/core/dist/rssi/index.js +39 -3
- package/node_modules/@homematic-manager/core/package.json +1 -1
- package/package.json +3 -3
- package/ui/assets/index-C-Mop9IQ.css +1 -0
- package/ui/assets/index-iWwfWYMS.js +14 -0
- package/ui/index.html +2 -2
- package/ui/assets/index-CVRBLOTU.css +0 -1
- package/ui/assets/index-DS3NABVw.js +0 -14
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* main process with it, issue #127).
|
|
15
15
|
*/
|
|
16
16
|
import path from 'node:path';
|
|
17
|
-
import { RPC_METHOD_NAMES, RSSI_UNKNOWN, countsAsServiceMessage, isAcknowledgeable, maintenanceAddress, mergeMethodHelp, methodsFor, } from '@homematic-manager/core';
|
|
17
|
+
import { RPC_METHOD_NAMES, RSSI_UNKNOWN, countsAsServiceMessage, isAcknowledgeable, maintenanceAddress, mergeMethodHelp, methodsFor, normaliseDescription, } from '@homematic-manager/core';
|
|
18
18
|
import { CacheStore } from '../cache/store.js';
|
|
19
19
|
import { ConfigStore } from '../config/store.js';
|
|
20
20
|
import { LinkTemplateStore } from '../config/linkTemplates.js';
|
|
@@ -1294,7 +1294,9 @@ function asDescriptions(value) {
|
|
|
1294
1294
|
const descriptions = [];
|
|
1295
1295
|
for (const entry of value) {
|
|
1296
1296
|
if (isStruct(entry) && typeof entry['ADDRESS'] === 'string') {
|
|
1297
|
-
|
|
1297
|
+
// #143: the list fields of a description are made into lists here, once, for every
|
|
1298
|
+
// interface - the group process sends `PARAMSETS` as a string on some boxes.
|
|
1299
|
+
descriptions.push(normaliseDescription(entry));
|
|
1298
1300
|
}
|
|
1299
1301
|
}
|
|
1300
1302
|
return descriptions;
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import binrpc from 'binrpc';
|
|
19
19
|
import xmlrpc from 'homematic-xmlrpc';
|
|
20
|
-
import { interfaceNameFromIdent } from '@homematic-manager/core';
|
|
20
|
+
import { interfaceNameFromIdent, normaliseDescription, } from '@homematic-manager/core';
|
|
21
21
|
import { connectionError, errorMessage } from '../errors.js';
|
|
22
22
|
/** The callback methods this server answers, in the order `system.listMethods` returns them. */
|
|
23
23
|
export const CALLBACK_METHODS = [
|
|
@@ -266,7 +266,9 @@ function asDescriptions(value) {
|
|
|
266
266
|
entry !== null &&
|
|
267
267
|
!Array.isArray(entry) &&
|
|
268
268
|
typeof entry['ADDRESS'] === 'string') {
|
|
269
|
-
|
|
269
|
+
// #143: the list fields of a description are made into lists here, once, for every
|
|
270
|
+
// interface - the group process sends `PARAMSETS` as a string on some boxes.
|
|
271
|
+
descriptions.push(normaliseDescription(entry));
|
|
270
272
|
}
|
|
271
273
|
}
|
|
272
274
|
return descriptions;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@homematic-manager/backend",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.12",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Homematic Manager backend: XML-RPC/BIN-RPC clients and callback servers, caches, optional ReGa",
|
|
6
6
|
"license": "AGPL-3.0-or-later",
|
|
@@ -40,6 +40,18 @@ export interface DeviceDescription {
|
|
|
40
40
|
readonly INDEX?: number;
|
|
41
41
|
readonly SUBTYPE?: string;
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* One value of a list field as a list of strings: an array keeps its string entries, a string
|
|
45
|
+
* becomes its whitespace- or comma-separated words (`"MASTER VALUES"` is two paramsets, `"MASTER"`
|
|
46
|
+
* is one), and anything else - a number, an object, null - is nothing.
|
|
47
|
+
*/
|
|
48
|
+
export declare function asStringList(value: unknown): string[] | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* A description as it arrives from an interface process, with its list fields made into lists
|
|
51
|
+
* (#143). Everything else is passed through untouched: what a field means is the interface's
|
|
52
|
+
* business, only its *shape* is ours, and only where the UI iterates over it.
|
|
53
|
+
*/
|
|
54
|
+
export declare function normaliseDescription(entry: DeviceDescription): DeviceDescription;
|
|
43
55
|
/** `FLAGS` bits of a device description. */
|
|
44
56
|
export declare const DEVICE_FLAGS: {
|
|
45
57
|
readonly VISIBLE: 1;
|
|
@@ -7,6 +7,52 @@
|
|
|
7
7
|
* is one immutable index built once per `listDevices` answer.
|
|
8
8
|
*/
|
|
9
9
|
import { compareAddresses, MAINTENANCE_CHANNEL, tryParseAddress } from '../address/address.js';
|
|
10
|
+
/**
|
|
11
|
+
* The fields of a description that are lists of strings. What an interface process actually sends
|
|
12
|
+
* for them is not guaranteed: the CCU's group process (`VirtualDevices`) answers `PARAMSETS` as a
|
|
13
|
+
* plain string on some boxes, and a `?? []` guard does not catch that - `.filter` on a string
|
|
14
|
+
* throws, and in a reactive grid one throw takes the whole page down (#143: the device list stayed
|
|
15
|
+
* on "Loading Homematic Manager..." while the count beside it said 31).
|
|
16
|
+
*/
|
|
17
|
+
const LIST_FIELDS = ['CHILDREN', 'PARAMSETS', 'TEAM_CHANNELS'];
|
|
18
|
+
/**
|
|
19
|
+
* One value of a list field as a list of strings: an array keeps its string entries, a string
|
|
20
|
+
* becomes its whitespace- or comma-separated words (`"MASTER VALUES"` is two paramsets, `"MASTER"`
|
|
21
|
+
* is one), and anything else - a number, an object, null - is nothing.
|
|
22
|
+
*/
|
|
23
|
+
export function asStringList(value) {
|
|
24
|
+
if (Array.isArray(value)) {
|
|
25
|
+
return value.filter((entry) => typeof entry === 'string');
|
|
26
|
+
}
|
|
27
|
+
if (typeof value === 'string') {
|
|
28
|
+
const words = value.split(/[\s,]+/).filter((word) => word !== '');
|
|
29
|
+
return words.length > 0 ? words : [];
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A description as it arrives from an interface process, with its list fields made into lists
|
|
35
|
+
* (#143). Everything else is passed through untouched: what a field means is the interface's
|
|
36
|
+
* business, only its *shape* is ours, and only where the UI iterates over it.
|
|
37
|
+
*/
|
|
38
|
+
export function normaliseDescription(entry) {
|
|
39
|
+
let patch;
|
|
40
|
+
for (const field of LIST_FIELDS) {
|
|
41
|
+
const value = entry[field];
|
|
42
|
+
if (value === undefined || Array.isArray(value)) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const list = asStringList(value);
|
|
46
|
+
patch ??= {};
|
|
47
|
+
if (list === undefined) {
|
|
48
|
+
patch[field] = undefined;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
patch[field] = list;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return patch === undefined ? entry : { ...entry, ...patch };
|
|
55
|
+
}
|
|
10
56
|
/** `FLAGS` bits of a device description. */
|
|
11
57
|
export const DEVICE_FLAGS = {
|
|
12
58
|
VISIBLE: 1,
|
|
@@ -297,6 +297,18 @@ export const MESSAGES = {
|
|
|
297
297
|
de: 'Über Homematic Manager',
|
|
298
298
|
en: 'about Homematic Manager',
|
|
299
299
|
},
|
|
300
|
+
'Saving and reconnecting…': {
|
|
301
|
+
de: 'Wird gespeichert, die Verbindung wird neu aufgebaut…',
|
|
302
|
+
en: 'Saving and reconnecting…',
|
|
303
|
+
},
|
|
304
|
+
'This tab could not be drawn.': {
|
|
305
|
+
de: 'Dieser Reiter konnte nicht gezeichnet werden.',
|
|
306
|
+
en: 'This tab could not be drawn.',
|
|
307
|
+
},
|
|
308
|
+
'Try again': {
|
|
309
|
+
de: 'Erneut versuchen',
|
|
310
|
+
en: 'Try again',
|
|
311
|
+
},
|
|
300
312
|
'The device list could not be read - press Refresh to try again': {
|
|
301
313
|
de: 'Die Geräteliste konnte nicht gelesen werden - mit Aktualisieren erneut versuchen',
|
|
302
314
|
en: 'The device list could not be read - press Refresh to try again',
|
|
@@ -28,7 +28,30 @@ export type RawRssiInfo = Readonly<Record<string, Readonly<Record<string, readon
|
|
|
28
28
|
export type RssiMatrix = Record<string, Record<string, RssiPair>>;
|
|
29
29
|
/** How good a signal is, for the colour of the grid cell. */
|
|
30
30
|
export type RssiClass = 'unknown' | 'bad' | 'medium' | 'good';
|
|
31
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* One RSSI value as the CCU hands it out, as dBm - or `undefined` where it is not a measurement.
|
|
33
|
+
*
|
|
34
|
+
* Issue #154: a receive level in dBm is always negative, and yet `rssiInfo` and the `RSSI_*`
|
|
35
|
+
* datapoints produce positive numbers (`37`), numbers far below the noise floor (`-208`) and
|
|
36
|
+
* placeholders (`65536`, `128`). Three things are mixed in there:
|
|
37
|
+
*
|
|
38
|
+
* - **`65536`** is eQ-3's documented "no information" (the WebUI's `rssiinfo.tcl`: *"Der Wert 65536
|
|
39
|
+
* bedeutet, dass keine Informationen vorliegen"*), and `-65536`, `±256`, `0` and `±1` are used
|
|
40
|
+
* the same way by one component or another - `0`/`1` meaning nothing was received in that
|
|
41
|
+
* direction since the last start.
|
|
42
|
+
* - **`128` / `-128`** (`0x80`) is the radio chip's "no RSSI available", not a level.
|
|
43
|
+
* - The rest is a **sign that was lost on the way**: ReGaHss creates the maintenance datapoints as
|
|
44
|
+
* an unsigned byte (`ivtByte`) although the paramset says `INTEGER`, so values arrive with an
|
|
45
|
+
* offset of 256 or with the sign dropped. `130…255` is `value - 256`, `-255…-130` is
|
|
46
|
+
* `-value - 256` (which is what turns the maintainer's `-208` into a perfectly ordinary
|
|
47
|
+
* -48 dBm), and a bare positive `2…126` is the same level without its minus.
|
|
48
|
+
*
|
|
49
|
+
* The mapping is the one Home Assistant's `aiohomematic` applies (`model/generic/sensor.py`,
|
|
50
|
+
* `_fix_rssi`); OpenCCU's WebUI does the `- 256` half in
|
|
51
|
+
* `0144-WebUI-ControlForMaintenanceChannel` and hm2mqtt.js does it for the ReGa cache. The
|
|
52
|
+
* inversion of a small positive value is the one step no eQ-3 source confirms - it is
|
|
53
|
+
* `aiohomematic`'s reading, and it is what makes a `37` in the grid the -37 dBm it plainly is.
|
|
54
|
+
*/
|
|
32
55
|
export declare function normaliseRssiValue(value: unknown): number | undefined;
|
|
33
56
|
/** Turns an `rssiInfo` answer into the matrix, dropping the 65536 placeholders. */
|
|
34
57
|
export declare function normaliseRssiInfo(raw: RawRssiInfo): RssiMatrix;
|
|
@@ -13,12 +13,48 @@ export const RSSI_UNKNOWN = 65536;
|
|
|
13
13
|
export const RSSI_BAD = -120;
|
|
14
14
|
export const RSSI_MEDIUM = -100;
|
|
15
15
|
export const RSSI_GOOD = -20;
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* One RSSI value as the CCU hands it out, as dBm - or `undefined` where it is not a measurement.
|
|
18
|
+
*
|
|
19
|
+
* Issue #154: a receive level in dBm is always negative, and yet `rssiInfo` and the `RSSI_*`
|
|
20
|
+
* datapoints produce positive numbers (`37`), numbers far below the noise floor (`-208`) and
|
|
21
|
+
* placeholders (`65536`, `128`). Three things are mixed in there:
|
|
22
|
+
*
|
|
23
|
+
* - **`65536`** is eQ-3's documented "no information" (the WebUI's `rssiinfo.tcl`: *"Der Wert 65536
|
|
24
|
+
* bedeutet, dass keine Informationen vorliegen"*), and `-65536`, `±256`, `0` and `±1` are used
|
|
25
|
+
* the same way by one component or another - `0`/`1` meaning nothing was received in that
|
|
26
|
+
* direction since the last start.
|
|
27
|
+
* - **`128` / `-128`** (`0x80`) is the radio chip's "no RSSI available", not a level.
|
|
28
|
+
* - The rest is a **sign that was lost on the way**: ReGaHss creates the maintenance datapoints as
|
|
29
|
+
* an unsigned byte (`ivtByte`) although the paramset says `INTEGER`, so values arrive with an
|
|
30
|
+
* offset of 256 or with the sign dropped. `130…255` is `value - 256`, `-255…-130` is
|
|
31
|
+
* `-value - 256` (which is what turns the maintainer's `-208` into a perfectly ordinary
|
|
32
|
+
* -48 dBm), and a bare positive `2…126` is the same level without its minus.
|
|
33
|
+
*
|
|
34
|
+
* The mapping is the one Home Assistant's `aiohomematic` applies (`model/generic/sensor.py`,
|
|
35
|
+
* `_fix_rssi`); OpenCCU's WebUI does the `- 256` half in
|
|
36
|
+
* `0144-WebUI-ControlForMaintenanceChannel` and hm2mqtt.js does it for the ReGa cache. The
|
|
37
|
+
* inversion of a small positive value is the one step no eQ-3 source confirms - it is
|
|
38
|
+
* `aiohomematic`'s reading, and it is what makes a `37` in the grid the -37 dBm it plainly is.
|
|
39
|
+
*/
|
|
17
40
|
export function normaliseRssiValue(value) {
|
|
18
|
-
if (typeof value !== 'number' || !Number.isFinite(value)
|
|
41
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
19
42
|
return undefined;
|
|
20
43
|
}
|
|
21
|
-
|
|
44
|
+
if (value > -127 && value < 0) {
|
|
45
|
+
return value; // already a dBm value
|
|
46
|
+
}
|
|
47
|
+
if (value > 1 && value < 127) {
|
|
48
|
+
return -value; // the minus was lost
|
|
49
|
+
}
|
|
50
|
+
if (value > -256 && value < -129) {
|
|
51
|
+
return -value - 256; // -208 -> -48
|
|
52
|
+
}
|
|
53
|
+
if (value > 129 && value < 256) {
|
|
54
|
+
return value - 256; // 218 -> -38
|
|
55
|
+
}
|
|
56
|
+
// 0, ±1, ±128, ±129, ±256, ±65536 and anything outside: not a measurement
|
|
57
|
+
return undefined;
|
|
22
58
|
}
|
|
23
59
|
/** Turns an `rssiInfo` answer into the matrix, dropping the 65536 placeholders. */
|
|
24
60
|
export function normaliseRssiInfo(raw) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homematic-manager",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.12",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Configure and administer Homematic and HomematicIP devices - devices and channels, direct links, paramsets, RSSI, service messages, events and an RPC console - from a local HTTP/WebSocket server that also serves the web UI",
|
|
6
6
|
"keywords": [
|
|
@@ -67,8 +67,8 @@
|
|
|
67
67
|
"hm-simulator": "^1.0.0"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@homematic-manager/backend": "3.0.0-beta.
|
|
71
|
-
"@homematic-manager/core": "3.0.0-beta.
|
|
70
|
+
"@homematic-manager/backend": "3.0.0-beta.12",
|
|
71
|
+
"@homematic-manager/core": "3.0.0-beta.12",
|
|
72
72
|
"binrpc": "^4.2.0",
|
|
73
73
|
"homematic-rega": "^2.0.0",
|
|
74
74
|
"homematic-xmlrpc": "^2.0.0",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{color-scheme:light;--hmm-bg: #ffffff;--hmm-bg-sunken: #f8f8f8;--hmm-header-bg: #f3f3f3;--hmm-header-solid: #ececec;--hmm-control-bg: #f0f0f0;--hmm-control-bg-hover: #e4e4e4;--hmm-input-bg: #ffffff;--hmm-row-odd: #ffffff;--hmm-row-even: #ffffff;--hmm-row-hover: #f0f4f8;--hmm-row-selected: #cfe4f7;--hmm-row-selected-text: #12314d;--hmm-overlay: rgba(255, 255, 255, .72);--hmm-backdrop: rgba(0, 0, 0, .35);--hmm-shadow-menu: 0 4px 12px rgb(0 0 0 / 18%);--hmm-shadow-toast: 0 2px 10px rgb(0 0 0 / 16%);--hmm-border: #cecece;--hmm-border-muted: #e6e6e6;--hmm-border-strong: #b0b0b0;--hmm-fg: #3b3b3b;--hmm-fg-muted: #6d6d6d;--hmm-fg-faint: #9a9a9a;--hmm-link: #0070c1;--hmm-accent: #0070c1;--hmm-accent-bg: #e2eefa;--hmm-ok: #008000;--hmm-warn: #a06800;--hmm-error: #cd3131;--hmm-focus: #0070c1;--hmm-rssi-good: #c9e6c9;--hmm-rssi-medium: #f3e2ad;--hmm-rssi-bad: #f0c0c0;--hmm-rssi-text: #262626;--hmm-font: system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;--hmm-font-mono: ui-monospace, "Cascadia Mono", Consolas, Menlo, Monaco, monospace;--hmm-font-size: 13px;--hmm-font-size-grid: 12px;--hmm-font-size-small: 11px;--hmm-font-size-tiny: 9px;--hmm-row-height: 30px;--hmm-device-image-size: 20px;--hmm-mark-size: 22px;--hmm-header-height: 36px;--hmm-radius: 3px;--hmm-form-label-width: 210px;--hmm-form-column-gap: 10px;--hmm-form-row-gap: 6px;--hmm-form-section-gap: 14px;--hmm-form-help-gap: 2px;--hmm-field-narrow: 90px;--hmm-field-medium: 150px;--hmm-device-image-filter: none}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){color-scheme:dark;--hmm-bg: #1e1e1e;--hmm-bg-sunken: #191919;--hmm-header-bg: #252526;--hmm-header-solid: #2d2d2d;--hmm-control-bg: #333333;--hmm-control-bg-hover: #3f3f3f;--hmm-input-bg: #3c3c3c;--hmm-row-odd: #1e1e1e;--hmm-row-even: #1e1e1e;--hmm-row-hover: #2a2d2e;--hmm-row-selected: #264f78;--hmm-row-selected-text: #e8f2fb;--hmm-overlay: rgba(24, 24, 24, .72);--hmm-backdrop: rgba(0, 0, 0, .6);--hmm-shadow-menu: 0 4px 14px rgb(0 0 0 / 60%);--hmm-shadow-toast: 0 2px 12px rgb(0 0 0 / 55%);--hmm-border: #3c3c3c;--hmm-border-muted: #303030;--hmm-border-strong: #565656;--hmm-fg: #cccccc;--hmm-fg-muted: #8a8a8a;--hmm-fg-faint: #6a6a6a;--hmm-link: #569cd6;--hmm-accent: #569cd6;--hmm-accent-bg: #253b52;--hmm-ok: #4ec9b0;--hmm-warn: #cca700;--hmm-error: #f48771;--hmm-focus: #569cd6;--hmm-rssi-good: #2f5d3a;--hmm-rssi-medium: #6d5a1c;--hmm-rssi-bad: #6f2f2f;--hmm-rssi-text: #f0f0f0;--hmm-device-image-filter: invert(1) hue-rotate(180deg) contrast(.75) brightness(.9)}}:root[data-theme=dark]{color-scheme:dark;--hmm-bg: #1e1e1e;--hmm-bg-sunken: #191919;--hmm-header-bg: #252526;--hmm-header-solid: #2d2d2d;--hmm-control-bg: #333333;--hmm-control-bg-hover: #3f3f3f;--hmm-input-bg: #3c3c3c;--hmm-row-odd: #1e1e1e;--hmm-row-even: #1e1e1e;--hmm-row-hover: #2a2d2e;--hmm-row-selected: #264f78;--hmm-row-selected-text: #e8f2fb;--hmm-overlay: rgba(24, 24, 24, .72);--hmm-backdrop: rgba(0, 0, 0, .6);--hmm-shadow-menu: 0 4px 14px rgb(0 0 0 / 60%);--hmm-shadow-toast: 0 2px 12px rgb(0 0 0 / 55%);--hmm-border: #3c3c3c;--hmm-border-muted: #303030;--hmm-border-strong: #565656;--hmm-fg: #cccccc;--hmm-fg-muted: #8a8a8a;--hmm-fg-faint: #6a6a6a;--hmm-link: #569cd6;--hmm-accent: #569cd6;--hmm-accent-bg: #253b52;--hmm-ok: #4ec9b0;--hmm-warn: #cca700;--hmm-error: #f48771;--hmm-focus: #569cd6;--hmm-rssi-good: #2f5d3a;--hmm-rssi-medium: #6d5a1c;--hmm-rssi-bad: #6f2f2f;--hmm-rssi-text: #f0f0f0;--hmm-device-image-filter: invert(1) hue-rotate(180deg) contrast(.75) brightness(.9)}html,body{height:100%}#app{height:100%;min-height:0;overflow:hidden}body{margin:0;padding:0;background:var(--hmm-bg);color:var(--hmm-fg);font-family:var(--hmm-font);font-size:var(--hmm-font-size);min-width:1024px;min-height:584px}*,*:before,*:after{box-sizing:border-box}*{scrollbar-width:thin;scrollbar-color:var(--hmm-border-strong) transparent}:focus-visible{outline:2px solid var(--hmm-focus);outline-offset:-1px}.hmm-mono{font-family:var(--hmm-font-mono)}button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}.hmm-input,.hmm-select{height:24px;padding:2px 6px;border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-input-bg)}.hmm-input:focus-visible,.hmm-select:focus-visible{border-color:var(--hmm-accent)}.hmm-button{min-height:24px;padding:3px 10px;border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-control-bg);cursor:pointer}.hmm-button:hover:not(:disabled){background:var(--hmm-control-bg-hover)}.hmm-button:disabled{opacity:.45;cursor:default}.hmm-github.svelte-t2m24p{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:1px solid transparent;border-radius:var(--hmm-radius);color:var(--hmm-fg-muted)}.hmm-github.svelte-t2m24p:hover{background:var(--hmm-control-bg-hover);color:var(--hmm-fg)}.hmm-connection.svelte-18vw5u5{display:inline-block;flex:0 0 auto;width:14px;text-align:center;line-height:1;overflow:hidden}.hmm-connection-offline.svelte-18vw5u5{opacity:.45}.hmm-connection-ok.svelte-18vw5u5{color:var(--hmm-ok)}.hmm-connection-bad.svelte-18vw5u5{color:var(--hmm-error)}.hmm-connection-absent.svelte-18vw5u5{color:var(--hmm-fg-muted)}.hmm-connection-busy.svelte-18vw5u5{color:var(--hmm-warn)}.hmm-interface.svelte-m4i49t{position:relative;display:flex;align-items:center;flex:0 0 auto}.hmm-interface-trigger.svelte-m4i49t{display:flex;align-items:center;gap:6px;width:170px;height:24px;padding:0 6px;border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-control-bg);color:inherit;font:inherit;cursor:pointer}.hmm-interface-trigger.svelte-m4i49t:hover{background:var(--hmm-control-bg-hover)}.hmm-interface-trigger-name.svelte-m4i49t{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.hmm-interface-arrow.svelte-m4i49t{flex:0 0 auto;color:var(--hmm-fg-muted)}.hmm-interface-menu.svelte-m4i49t{position:absolute;z-index:50;top:calc(100% + 4px);left:0;min-width:280px;max-width:380px;border:1px solid var(--hmm-border-strong);border-radius:var(--hmm-radius);background:var(--hmm-bg);box-shadow:var(--hmm-shadow-menu);overflow:hidden}.hmm-interface-head.svelte-m4i49t{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:6px 10px;border-bottom:1px solid var(--hmm-border-muted);background:var(--hmm-header-bg)}.hmm-interface-host.svelte-m4i49t{font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hmm-interface-backend.svelte-m4i49t{flex:0 0 auto;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-interface-list.svelte-m4i49t{display:flex;flex-direction:column;padding:4px;gap:2px;max-height:60vh;overflow-y:auto}.hmm-interface-item.svelte-m4i49t{display:flex;flex-direction:column;gap:1px;padding:5px 8px;border:none;border-radius:var(--hmm-radius);background:none;color:var(--hmm-fg-muted);font:inherit;text-align:left;cursor:pointer}.hmm-interface-item.svelte-m4i49t:hover:not(.hmm-interface-item-current){background:var(--hmm-control-bg-hover);color:var(--hmm-fg)}.hmm-interface-item-current.svelte-m4i49t{background:var(--hmm-accent-bg);color:var(--hmm-fg);box-shadow:inset 2px 0 0 var(--hmm-accent)}.hmm-interface-store.svelte-m4i49t{display:flex;align-items:center;gap:6px;height:22px;margin:0 0 3px;padding:0 8px;border:none;border-bottom:1px solid var(--hmm-border-muted);border-radius:var(--hmm-radius) var(--hmm-radius) 0 0;background:none;color:var(--hmm-fg-muted);font:inherit;font-size:var(--hmm-font-size-small);text-align:left;cursor:pointer}.hmm-interface-store.svelte-m4i49t:hover:not(.hmm-interface-item-current):not(.hmm-interface-store-off){background:var(--hmm-control-bg-hover);color:var(--hmm-fg)}.hmm-interface-store-off.svelte-m4i49t{cursor:default;opacity:.6}.hmm-interface-store-label.svelte-m4i49t{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hmm-interface-store-dot.svelte-m4i49t{flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--hmm-fg-muted)}.hmm-meta-ok.svelte-m4i49t .hmm-interface-store-dot:where(.svelte-m4i49t){background:var(--hmm-ok)}.hmm-meta-readonly.svelte-m4i49t .hmm-interface-store-dot:where(.svelte-m4i49t){background:var(--hmm-warn)}.hmm-meta-bad.svelte-m4i49t .hmm-interface-store-dot:where(.svelte-m4i49t){background:var(--hmm-error)}.hmm-interface-item-head.svelte-m4i49t{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.hmm-interface-item-name.svelte-m4i49t{font-weight:500;color:var(--hmm-fg)}.hmm-interface-mark.svelte-m4i49t{flex:0 0 auto;font-size:var(--hmm-font-size-small);white-space:nowrap}.hmm-interface-glyph.svelte-m4i49t{display:inline-block;width:12px;text-align:center}.hmm-interface-item-line.svelte-m4i49t{color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-interface-mark-ok.svelte-m4i49t{color:var(--hmm-ok)}.hmm-interface-mark-bad.svelte-m4i49t{color:var(--hmm-error)}.hmm-interface-mark-absent.svelte-m4i49t{color:var(--hmm-fg-muted)}.hmm-interface-mark-busy.svelte-m4i49t{color:var(--hmm-warn)}.hmm-loader.svelte-v1tg6x{position:absolute;inset:0;z-index:500;display:flex;align-items:center;justify-content:center;background:var(--hmm-overlay)}.hmm-loader-box.svelte-v1tg6x{text-align:center}.hmm-loader-spinner.svelte-v1tg6x{width:28px;height:28px;margin:0 auto 10px;border:3px solid var(--hmm-border);border-top-color:var(--hmm-accent);border-radius:50%;animation:svelte-v1tg6x-hmm-spin .9s linear infinite}.hmm-loader-text.svelte-v1tg6x{font-size:14px;color:var(--hmm-fg-muted)}@keyframes svelte-v1tg6x-hmm-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.hmm-loader-spinner.svelte-v1tg6x{animation-duration:3s}}.hmm-notices.svelte-1pqi0mh{position:fixed;right:10px;bottom:10px;z-index:400;display:flex;flex-direction:column;align-items:stretch;gap:6px;max-width:460px;max-height:calc(100vh - 20px);overflow-y:auto}.hmm-notices-more.svelte-1pqi0mh{align-self:flex-end;padding:2px 8px;border:1px solid var(--hmm-border-strong);border-radius:var(--hmm-radius);background:var(--hmm-bg);color:var(--hmm-fg-muted);font:inherit;font-size:var(--hmm-font-size-small);cursor:pointer}.hmm-notice.svelte-1pqi0mh{display:flex;gap:8px;align-items:flex-start;padding:6px 8px;border:1px solid var(--hmm-border-strong);border-left-width:4px;border-radius:var(--hmm-radius);background:var(--hmm-bg);box-shadow:var(--hmm-shadow-toast)}.hmm-notice-warn.svelte-1pqi0mh{border-left-color:var(--hmm-warn)}.hmm-notice-error.svelte-1pqi0mh{border-left-color:var(--hmm-error)}.hmm-notice-text.svelte-1pqi0mh{flex:1 1 auto;overflow-wrap:anywhere}.hmm-notice-close.svelte-1pqi0mh{border:none;background:none;cursor:pointer;line-height:1;padding:0 2px}.hmm-rpclog.svelte-7sszxb{display:flex;flex-direction:column;position:relative;flex:0 0 auto;min-height:0;min-width:0;overflow:hidden;border-top:1px solid var(--hmm-border-strong);background:var(--hmm-bg-sunken)}.hmm-rpclog-handle.svelte-7sszxb{height:6px;flex:0 0 auto;cursor:ns-resize}.hmm-rpclog-handle.svelte-7sszxb:focus-visible{outline-offset:-2px}.hmm-rpclog-head.svelte-7sszxb{display:flex;align-items:center;gap:8px;flex:0 0 auto;padding:3px 6px;background:var(--hmm-header-bg);border-bottom:1px solid var(--hmm-border)}.hmm-rpclog-title.svelte-7sszxb{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hmm-rpclog-close.svelte-7sszxb{border:none;background:none;cursor:pointer;line-height:1;padding:0 4px}.hmm-rpclog-list.svelte-7sszxb{list-style:none;margin:0;padding:0;flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden}.hmm-rpclog-entry.svelte-7sszxb{display:grid;grid-template-columns:70px 220px minmax(0,1fr) 200px 70px;gap:6px;align-items:center;padding:1px 6px;border-bottom:1px solid var(--hmm-border-muted);white-space:nowrap}.hmm-rpclog-pending.svelte-7sszxb{grid-template-columns:70px 220px minmax(0,1fr) 270px;color:var(--hmm-fg-muted)}.hmm-rpclog-failed.svelte-7sszxb .hmm-rpclog-status:where(.svelte-7sszxb){color:var(--hmm-error);font-weight:700}.hmm-rpclog-params.svelte-7sszxb,.hmm-rpclog-status.svelte-7sszxb,.hmm-rpclog-method.svelte-7sszxb{overflow:hidden;text-overflow:ellipsis}.hmm-rpclog-time.svelte-7sszxb,.hmm-rpclog-duration.svelte-7sszxb{color:var(--hmm-fg-muted)}.hmm-rpclog-spinner.svelte-7sszxb{display:inline-block;width:10px;height:10px;margin-left:4px;border:2px solid var(--hmm-border);border-top-color:var(--hmm-accent);border-radius:50%;animation:svelte-7sszxb-hmm-rpclog-spin .8s linear infinite}.hmm-rpclog-empty.svelte-7sszxb{padding:6px;color:var(--hmm-fg-muted)}@keyframes svelte-7sszxb-hmm-rpclog-spin{to{transform:rotate(360deg)}}.hmm-dialog.svelte-jby388{max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);padding:0;border:1px solid var(--hmm-border-strong);border-radius:var(--hmm-radius);background:var(--hmm-bg);color:var(--hmm-fg);font-family:var(--hmm-font);font-size:var(--hmm-font-size)}.hmm-dialog[open].svelte-jby388{display:flex;flex-direction:column}.hmm-dialog-placed.svelte-jby388{margin:0;inset-inline-end:auto;inset-block-end:auto;max-width:none;max-height:none}.hmm-dialog.svelte-jby388::backdrop{background:var(--hmm-backdrop)}.hmm-dialog-titlebar.svelte-jby388{display:flex;flex:0 0 auto;align-items:center;gap:8px;padding:4px 6px;background:var(--hmm-header-bg);border-bottom:1px solid var(--hmm-border)}.hmm-dialog-titlebar-movable.svelte-jby388{cursor:move;user-select:none}.hmm-dialog-title.svelte-jby388{font-weight:700;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hmm-dialog-close.svelte-jby388{border:1px solid transparent;border-radius:var(--hmm-radius);background:none;cursor:pointer;line-height:1;padding:2px 6px}.hmm-dialog-close.svelte-jby388:hover{border-color:var(--hmm-border);background:var(--hmm-accent-bg)}.hmm-dialog-body.svelte-jby388{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;padding:10px;overflow:auto}.hmm-dialog-body.svelte-jby388>*{flex-shrink:0}.hmm-dialog-buttons.svelte-jby388{display:flex;flex:0 0 auto;justify-content:flex-end;gap:6px;padding:6px 10px;border-top:1px solid var(--hmm-border-muted);background:var(--hmm-bg-sunken)}.hmm-dialog-resize.svelte-jby388{position:absolute}.hmm-dialog-resize-n.svelte-jby388,.hmm-dialog-resize-s.svelte-jby388{left:0;right:0;height:6px;cursor:ns-resize}.hmm-dialog-resize-n.svelte-jby388{top:0}.hmm-dialog-resize-s.svelte-jby388{bottom:0}.hmm-dialog-resize-e.svelte-jby388,.hmm-dialog-resize-w.svelte-jby388{top:0;bottom:0;width:6px;cursor:ew-resize}.hmm-dialog-resize-e.svelte-jby388{right:0}.hmm-dialog-resize-w.svelte-jby388{left:0}.hmm-dialog-resize-se.svelte-jby388{right:0;bottom:0;width:16px;height:16px;cursor:nwse-resize}.hmm-progress.svelte-1r0w7uc{width:100%}.hmm-progress-line.svelte-1r0w7uc{margin:0 0 6px}.hmm-progress-last.svelte-1r0w7uc{margin:6px 0 0;color:var(--hmm-fg-muted)}.hmm-tabs.svelte-126ak3w{display:flex;align-self:stretch;align-items:stretch;gap:2px;margin-bottom:-1px;position:relative;z-index:1}.hmm-tab.svelte-126ak3w{display:flex;align-items:center;gap:4px;padding:0 12px;border:none;border-radius:var(--hmm-radius) var(--hmm-radius) 0 0;background:none;color:var(--hmm-fg-muted);font-weight:500;cursor:pointer;white-space:nowrap}.hmm-tab.svelte-126ak3w:hover:not(.hmm-tab-active){background:var(--hmm-control-bg-hover);color:var(--hmm-fg)}.hmm-tab-active.svelte-126ak3w{background:var(--hmm-accent-bg);color:var(--hmm-fg);box-shadow:inset 0 -2px 0 var(--hmm-accent)}.hmm-tab-badge.svelte-126ak3w{color:var(--hmm-fg-muted)}.hmm-theme-switch.svelte-mls84d{width:26px;height:24px;padding:0;border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-bg);cursor:pointer;line-height:1}.hmm-theme-switch.svelte-mls84d:hover{border-color:var(--hmm-border-strong);background:var(--hmm-accent-bg)}.hmm-update.svelte-puqwbv{display:flex;align-items:center;gap:8px;padding:4px 8px;background:var(--hmm-accent-bg);border-bottom:1px solid var(--hmm-border)}.hmm-update-text.svelte-puqwbv{flex:1 1 auto}.hmm-tooltip-anchor.svelte-11extwn{display:inline-flex;align-items:center}.hmm-tooltip.svelte-11extwn{position:fixed;z-index:1000;max-width:280px;padding:3px 6px;border:1px solid var(--hmm-border-strong);border-radius:var(--hmm-radius);background:var(--hmm-bg);color:var(--hmm-fg);font-size:var(--hmm-font-size-small);line-height:1.35;white-space:normal;pointer-events:none;box-shadow:var(--hmm-shadow-menu)}.hmm-toolbar-button.svelte-cmlgq7{width:26px;height:26px;padding:0;border:1px solid transparent;border-radius:var(--hmm-radius);background:none;color:var(--hmm-fg-muted);cursor:pointer;line-height:1}.hmm-toolbar-button.svelte-cmlgq7:hover:not(:disabled){background:var(--hmm-control-bg-hover);color:var(--hmm-fg)}.hmm-toolbar-button.svelte-cmlgq7:disabled{opacity:.4;cursor:default;pointer-events:none}.hmm-toolbar-icon.svelte-cmlgq7{display:inline-block;line-height:1}.hmm-toolbar-icon-busy.svelte-cmlgq7{animation:svelte-cmlgq7-hmm-toolbar-spin 1s linear infinite}@keyframes svelte-cmlgq7-hmm-toolbar-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.hmm-toolbar-icon-busy.svelte-cmlgq7{animation:none}}.hmm-toolbar-button-pressed.svelte-cmlgq7{background:var(--hmm-accent-bg);border-color:var(--hmm-accent);color:var(--hmm-fg)}.hmm-changes.svelte-1uqsmm6{margin:0;padding-left:20px}.hmm-change.svelte-1uqsmm6{margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-change-head.svelte-1uqsmm6{display:flex;align-items:center;justify-content:space-between;gap:8px}.hmm-change-title.svelte-1uqsmm6{font-weight:700}.hmm-change-call.svelte-1uqsmm6{margin:2px 0;font-family:var(--hmm-font-mono);font-size:var(--hmm-font-size-small);color:var(--hmm-fg-muted);word-break:break-all}.hmm-change-table.svelte-1uqsmm6{width:100%;border-collapse:collapse}.hmm-change-table.svelte-1uqsmm6 td:where(.svelte-1uqsmm6){text-align:left;padding:1px 4px}.hmm-change-new.svelte-1uqsmm6{font-weight:700}.hmm-change-error.svelte-1uqsmm6{color:var(--hmm-error);margin:4px 0 0}.hmm-change-count.svelte-1uqsmm6{color:var(--hmm-fg-muted)}.hmm-language.svelte-oq8zre{min-width:0}.hmm-multiselect.svelte-vbwhwd{position:relative;display:inline-block;max-width:100%}.hmm-multiselect-button.svelte-vbwhwd{display:inline-flex;align-items:center;gap:6px;min-width:120px;max-width:100%;justify-content:space-between}.hmm-multiselect-text.svelte-vbwhwd{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hmm-multiselect-menu.svelte-vbwhwd{position:absolute;z-index:50;top:calc(100% + 2px);left:0;min-width:220px;max-width:360px;border:1px solid var(--hmm-border-strong);border-radius:var(--hmm-radius);background:var(--hmm-bg);box-shadow:var(--hmm-shadow-menu)}.hmm-multiselect-head.svelte-vbwhwd{display:flex;gap:4px;align-items:center;padding:4px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-multiselect-filter.svelte-vbwhwd{flex:1 1 auto;min-width:60px}.hmm-multiselect-link.svelte-vbwhwd{border:none;background:none;color:var(--hmm-link);cursor:pointer;text-decoration:underline;font-size:var(--hmm-font-size-small);padding:0 2px}.hmm-multiselect-list.svelte-vbwhwd{list-style:none;margin:0;padding:0;max-height:260px;overflow:auto}.hmm-multiselect-option.svelte-vbwhwd{display:flex;gap:6px;align-items:center;width:100%;padding:2px 6px;border:none;background:none;font:inherit;text-align:left;cursor:pointer}.hmm-multiselect-option.svelte-vbwhwd:hover:not(:disabled),.hmm-multiselect-highlight.svelte-vbwhwd:not(:disabled){background:var(--hmm-row-hover)}.hmm-multiselect-selected.svelte-vbwhwd{background:var(--hmm-row-selected);color:var(--hmm-row-selected-text)}.hmm-multiselect-option.svelte-vbwhwd:disabled{opacity:.45;cursor:default}.hmm-multiselect-empty.svelte-vbwhwd{padding:4px 6px;color:var(--hmm-fg-muted)}.hmm-config-busy.svelte-1xydm3c{margin-right:auto;color:var(--hmm-fg-muted)}.hmm-config-error.svelte-1xydm3c{margin-right:auto;color:var(--hmm-error)}.hmm-config.svelte-1xydm3c{display:flex;flex-direction:column;gap:var(--hmm-form-section-gap)}.hmm-config-columns.svelte-1xydm3c{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--hmm-form-section-gap) 28px;align-items:start}.hmm-config-column.svelte-1xydm3c{display:flex;flex-direction:column;gap:var(--hmm-form-section-gap);min-width:0}.hmm-config-title.svelte-1xydm3c{margin:0 0 6px;padding-bottom:3px;border-bottom:1px solid var(--hmm-border-muted);font-size:var(--hmm-font-size);font-weight:600;color:var(--hmm-fg)}.hmm-config-grid.svelte-1xydm3c{display:flex;flex-direction:column;gap:var(--hmm-form-row-gap)}.hmm-config-row.svelte-1xydm3c{display:grid;grid-template-columns:var(--hmm-form-label-width) minmax(0,1fr);gap:var(--hmm-form-column-gap);align-items:start}.hmm-config-label.svelte-1xydm3c{text-align:right;padding-top:4px;overflow-wrap:break-word}.hmm-config-field.svelte-1xydm3c{display:flex;flex-direction:column;gap:var(--hmm-form-help-gap);align-items:flex-start;min-width:0}.hmm-config-inline.svelte-1xydm3c{display:flex;gap:6px;align-items:center;width:100%;min-width:0}.hmm-config-help.svelte-1xydm3c{color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-config-wide.svelte-1xydm3c{width:100%;min-width:0}.hmm-config-narrow.svelte-1xydm3c{width:var(--hmm-field-narrow)}.hmm-config-field.svelte-1xydm3c .hmm-language{width:var(--hmm-field-medium)}.hmm-config-field.svelte-1xydm3c .hmm-multiselect{width:100%}.hmm-config-extra.svelte-1xydm3c{border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);padding:6px;margin:0}.hmm-config-extra.svelte-1xydm3c legend:where(.svelte-1xydm3c){font-weight:600}.hmm-config-extra-row.svelte-1xydm3c{display:grid;grid-template-columns:1fr 1fr 90px 100px 1fr auto;gap:4px;margin-bottom:4px}.hmm-config-problem.svelte-1xydm3c{grid-column:1 / -1;color:var(--hmm-error);font-size:var(--hmm-font-size-small)}.hmm-config-info.svelte-1xydm3c{border-top:1px solid var(--hmm-border-muted);padding-top:6px;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-config-info.svelte-1xydm3c p:where(.svelte-1xydm3c){margin:0}.hmm-toolbar.svelte-1ld6r3r{display:flex;align-items:center;gap:4px;padding:0 0 6px}.hmm-toolbar-group.svelte-1ld6r3r{display:flex;align-items:center;gap:2px;flex:1 1 auto;flex-wrap:wrap}.hmm-toolbar-trailing.svelte-1ld6r3r{display:flex;align-items:center;gap:6px;color:var(--hmm-fg-muted);white-space:nowrap}.hmm-page.svelte-17kjuug{display:flex;flex-direction:column;gap:6px;height:100%;min-height:0;overflow:auto}.hmm-console-top.svelte-17kjuug{display:flex;gap:6px;align-items:center}.hmm-console-method.svelte-17kjuug{width:235px;flex:0 0 auto}.hmm-console-params.svelte-17kjuug{flex:1 1 auto;min-width:0;padding:2px 4px;border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-bg-sunken);overflow-x:auto;white-space:nowrap}.hmm-console-columns.svelte-17kjuug{display:grid;grid-template-columns:1fr 1fr;gap:12px;flex:1 1 auto;min-height:0}.hmm-console-panel.svelte-17kjuug{min-width:0;overflow:auto}.hmm-console-panel.svelte-17kjuug h3:where(.svelte-17kjuug){margin:0 0 6px;font-size:var(--hmm-font-size)}.hmm-console-arg.svelte-17kjuug{display:grid;grid-template-columns:160px 1fr;gap:6px;align-items:start;padding:3px 0;border-bottom:1px solid var(--hmm-border-muted)}.hmm-console-arg-label.svelte-17kjuug{display:flex;flex-direction:column}.hmm-console-arg-type.svelte-17kjuug{color:var(--hmm-fg-faint);font-size:var(--hmm-font-size-small)}.hmm-console-flags.svelte-17kjuug{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.hmm-console-struct.svelte-17kjuug{display:flex;flex-direction:column;gap:3px}.hmm-console-struct-row.svelte-17kjuug{display:grid;grid-template-columns:1fr 90px 1fr auto;gap:4px}.hmm-console-json.svelte-17kjuug{width:100%;height:80px;font-family:var(--hmm-font-mono)}.hmm-console-invalid.svelte-17kjuug{border-color:var(--hmm-error)}.hmm-console-response.svelte-17kjuug{width:100%;height:220px;border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-bg-sunken)}.hmm-console-error.svelte-17kjuug{color:var(--hmm-error)}.hmm-console-history.svelte-17kjuug{list-style:none;margin:0;padding:0;max-height:200px;overflow:auto}.hmm-console-history-item.svelte-17kjuug{display:flex;gap:6px;width:100%;padding:1px 3px;border:none;background:none;font:inherit;text-align:left;cursor:pointer}.hmm-console-history-item.svelte-17kjuug:hover{background:var(--hmm-row-hover)}.hmm-console-history-failed.svelte-17kjuug{color:var(--hmm-error)}.hmm-console-history-time.svelte-17kjuug{color:var(--hmm-fg-muted)}.hmm-console-help.svelte-17kjuug{border-top:1px solid var(--hmm-border);padding-top:6px}.hmm-console-help.svelte-17kjuug h3:where(.svelte-17kjuug){margin:0 0 4px;font-size:var(--hmm-font-size)}.hmm-console-hint.svelte-17kjuug{color:var(--hmm-fg-muted)}.hmm-context-menu.svelte-192vamk{position:fixed;z-index:100;min-width:180px;padding:2px 0;border:1px solid var(--hmm-border-strong);border-radius:var(--hmm-radius);background:var(--hmm-bg);box-shadow:var(--hmm-shadow-menu)}.hmm-context-item.svelte-192vamk{display:block;width:100%;padding:3px 10px;border:none;background:none;font:inherit;text-align:left;cursor:pointer}.hmm-context-item.svelte-192vamk:hover:not(:disabled){background:var(--hmm-row-selected);color:var(--hmm-row-selected-text)}.hmm-context-item.svelte-192vamk:disabled{opacity:.45;cursor:default}.hmm-context-danger.svelte-192vamk{color:var(--hmm-error)}.hmm-context-separator.svelte-192vamk{height:1px;margin:2px 0;background:var(--hmm-border-muted)}.hmm-table.svelte-16k18c8{display:flex;flex-direction:column;font-size:var(--hmm-font-size-grid);min-height:0;height:100%;border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-bg);overflow:hidden}.hmm-table-band.svelte-16k18c8{display:flex;align-items:center;gap:8px;padding:3px 6px;background:var(--hmm-header-bg);border-bottom:1px solid var(--hmm-border-muted)}.hmm-table-caption.svelte-16k18c8{font-weight:700}.hmm-table-actions.svelte-16k18c8{display:flex;align-items:center;gap:2px}.hmm-table-trailing.svelte-16k18c8{display:flex;align-items:center;gap:8px;margin-left:auto;padding-left:8px;color:var(--hmm-fg-muted);white-space:nowrap}.hmm-table-count.svelte-16k18c8{white-space:nowrap}.hmm-table-grid.svelte-16k18c8{display:flex;flex-direction:column;min-height:0;flex:1 1 auto;outline-offset:-2px}.hmm-table-head.svelte-16k18c8,.hmm-table-filters.svelte-16k18c8{display:grid;background:var(--hmm-header-bg);border-bottom:1px solid var(--hmm-border)}.hmm-table-groups.svelte-16k18c8{display:grid;background:var(--hmm-header-bg);border-bottom:1px solid var(--hmm-border-muted)}.hmm-th-group.svelte-16k18c8{display:flex;flex-direction:column;align-items:center;padding:3px 6px 2px;border-left:1px solid var(--hmm-border-muted);line-height:1.2;text-align:center}.hmm-th-group-sub.svelte-16k18c8{font-weight:400;color:var(--hmm-fg-faint)}.hmm-th.svelte-16k18c8{padding:6px;font-size:var(--hmm-font-size-small);font-weight:600;letter-spacing:.02em;color:var(--hmm-fg-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hmm-th-button.svelte-16k18c8{display:inline-flex;gap:4px;align-items:center;width:100%;padding:0;border:none;background:none;font:inherit;color:inherit;cursor:pointer;justify-content:inherit}.hmm-th-button.svelte-16k18c8:hover{color:var(--hmm-fg)}.hmm-th-sort.svelte-16k18c8{font-size:var(--hmm-font-size-small)}.hmm-tf.svelte-16k18c8{padding:3px 4px;min-width:0}.hmm-tf-input.svelte-16k18c8{width:100%;height:20px}.hmm-table-body.svelte-16k18c8{flex:1 1 auto;min-height:0;overflow:auto;scrollbar-gutter:stable;position:relative}.hmm-table-spacer.svelte-16k18c8{position:relative}.hmm-table-rows.svelte-16k18c8{position:absolute;top:0;left:0;right:0;will-change:transform}.hmm-tr.svelte-16k18c8{display:grid;align-items:center;border-bottom:1px solid var(--hmm-border-muted);background:var(--hmm-row-odd);cursor:default}.hmm-tr-even.svelte-16k18c8{background:var(--hmm-row-even)}.hmm-tr.svelte-16k18c8:hover{background:var(--hmm-row-hover)}.hmm-tr-child.svelte-16k18c8{background:var(--hmm-bg-sunken)}.hmm-tr-subhead.svelte-16k18c8,.hmm-tr-subhead.svelte-16k18c8:hover{background:var(--hmm-header-solid);font-weight:700;cursor:default}.hmm-tr-selected.svelte-16k18c8,.hmm-tr-selected.svelte-16k18c8:hover{background:var(--hmm-row-selected);color:var(--hmm-row-selected-text)}.hmm-td.svelte-16k18c8{padding:0 6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hmm-td-fixed.svelte-16k18c8{text-overflow:clip}.hmm-td-expander.svelte-16k18c8,.hmm-th-expander.svelte-16k18c8{padding:0;text-align:center}.hmm-expander.svelte-16k18c8{width:18px;height:18px;padding:0;line-height:1;border:1px solid var(--hmm-border);border-radius:2px;background:none;color:var(--hmm-fg-muted);cursor:pointer}.hmm-expander.svelte-16k18c8:hover{background:var(--hmm-control-bg-hover);color:var(--hmm-fg)}.hmm-table-empty.svelte-16k18c8{display:flex;align-items:center;gap:8px;padding:8px;color:var(--hmm-fg-muted)}.hmm-table-clear.svelte-16k18c8{height:22px;padding:0 8px;font-size:var(--hmm-font-size-small)}.hmm-device-image.svelte-rwoeeb{display:inline-block;vertical-align:middle;object-fit:contain}img.hmm-device-image.svelte-rwoeeb{filter:var(--hmm-device-image-filter)}.hmm-device-image-fallback.svelte-rwoeeb{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--hmm-border-muted);border-radius:2px;background:var(--hmm-bg-sunken);color:var(--hmm-fg-faint);line-height:1;overflow:hidden}.hmm-add-link.svelte-w1ajeb{display:grid;grid-template-columns:90px auto 1fr;gap:8px;align-items:center}.hmm-add-link-roles.svelte-w1ajeb{font-family:var(--hmm-font-mono);font-size:var(--hmm-font-size-small);color:var(--hmm-fg-muted);overflow:hidden;text-overflow:ellipsis}.hmm-add-link-empty.svelte-w1ajeb{color:var(--hmm-warn)}.hmm-pair-names.svelte-w1ajeb{width:100%;border-collapse:collapse;margin-top:10px}.hmm-pair-names.svelte-w1ajeb th:where(.svelte-w1ajeb){text-align:left;font-size:var(--hmm-font-size-small);color:var(--hmm-fg-muted)}.hmm-pair-names.svelte-w1ajeb td:where(.svelte-w1ajeb){padding:2px 4px 2px 0}.hmm-pair-names.svelte-w1ajeb input:where(.svelte-w1ajeb){width:100%}.hmm-team-row.svelte-1ervkxt{display:grid;grid-template-columns:120px 1fr;gap:8px;align-items:center}.hmm-team-members.svelte-1ervkxt{color:var(--hmm-fg-muted)}.hmm-team-empty.svelte-1ervkxt{color:var(--hmm-warn)}.hmm-editor.svelte-6iyslx{padding:4px;border-bottom:1px solid var(--hmm-border)}.hmm-editor.svelte-6iyslx h3:where(.svelte-6iyslx){margin:4px 0;font-size:var(--hmm-font-size)}.hmm-editor-hint.svelte-6iyslx{margin:0 0 6px;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-blind-row.svelte-6iyslx{display:grid;grid-template-columns:240px minmax(0,1fr) 200px;gap:8px;align-items:center;padding:2px 4px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-blind-label.svelte-6iyslx{display:flex;flex-direction:column;min-width:0}.hmm-blind-id.svelte-6iyslx{font-family:var(--hmm-font-mono);font-size:var(--hmm-font-size-small);color:var(--hmm-fg-faint);overflow:hidden;text-overflow:ellipsis}.hmm-blind-control.svelte-6iyslx{display:flex;align-items:center;gap:6px;min-width:0}.hmm-blind-number.svelte-6iyslx{width:110px}.hmm-blind-unit.svelte-6iyslx{color:var(--hmm-fg-muted)}.hmm-blind-raw.svelte-6iyslx{font-family:var(--hmm-font-mono);font-size:var(--hmm-font-size-small);color:var(--hmm-fg-faint)}.hmm-blind-meta.svelte-6iyslx{display:flex;flex-direction:column;align-items:flex-end;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-blind-warn.svelte-6iyslx{color:var(--hmm-warn)}.hmm-editor.svelte-1jozrc9{padding:4px;border-bottom:1px solid var(--hmm-border)}.hmm-editor.svelte-1jozrc9 h3:where(.svelte-1jozrc9){margin:4px 0;font-size:var(--hmm-font-size)}.hmm-editor-hint.svelte-1jozrc9{margin:0 0 6px;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-duration.svelte-1jozrc9{display:grid;grid-template-columns:240px minmax(0,1fr) 200px;gap:8px;align-items:center;padding:2px 4px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-duration-label.svelte-1jozrc9{display:flex;flex-direction:column;min-width:0}.hmm-duration-id.svelte-1jozrc9{font-family:var(--hmm-font-mono);font-size:var(--hmm-font-size-small);color:var(--hmm-fg-faint);overflow:hidden;text-overflow:ellipsis}.hmm-duration-control.svelte-1jozrc9{display:flex;align-items:center;gap:6px;min-width:0;flex-wrap:wrap}.hmm-duration-seconds.svelte-1jozrc9,.hmm-duration-count.svelte-1jozrc9{width:110px}.hmm-duration-unit.svelte-1jozrc9{color:var(--hmm-fg-muted)}.hmm-duration-notused.svelte-1jozrc9{display:flex;align-items:center;gap:4px}.hmm-duration-meta.svelte-1jozrc9{display:flex;flex-direction:column;align-items:flex-end;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-duration-broken.svelte-1jozrc9{color:var(--hmm-warn)}.hmm-editor.svelte-1d7xvi9{padding:4px;border-bottom:1px solid var(--hmm-border)}.hmm-editor.svelte-1d7xvi9 h3:where(.svelte-1d7xvi9){margin:4px 0;font-size:var(--hmm-font-size)}.hmm-editor-hint.svelte-1d7xvi9{margin:0 0 6px;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-enum-row.svelte-1d7xvi9{display:grid;grid-template-columns:240px minmax(0,1fr) 200px;gap:8px;align-items:center;padding:2px 4px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-enum-label.svelte-1d7xvi9{display:flex;flex-direction:column;min-width:0}.hmm-enum-id.svelte-1d7xvi9,.hmm-enum-raw.svelte-1d7xvi9{font-family:var(--hmm-font-mono);font-size:var(--hmm-font-size-small);color:var(--hmm-fg-faint);overflow:hidden;text-overflow:ellipsis}.hmm-enum-control.svelte-1d7xvi9{display:flex;align-items:center;gap:6px;min-width:0}.hmm-enum-meta.svelte-1d7xvi9{display:flex;justify-content:flex-end;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hmm-editor.svelte-hdzef5{padding:4px;border-bottom:1px solid var(--hmm-border)}.hmm-editor.svelte-hdzef5 h3:where(.svelte-hdzef5){margin:4px 0;font-size:var(--hmm-font-size)}.hmm-editor-hint.svelte-hdzef5{margin:0 0 6px;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-switch-option.svelte-hdzef5{display:flex;align-items:center;gap:4px;padding-bottom:4px}.hmm-switch-scroll.svelte-hdzef5{overflow-x:auto;max-height:40vh}.hmm-switch-table.svelte-hdzef5{border-collapse:collapse;white-space:nowrap}.hmm-switch-table.svelte-hdzef5 th:where(.svelte-hdzef5){text-align:left;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small);font-weight:400;border-bottom:1px solid var(--hmm-border);padding-right:8px}.hmm-switch-table.svelte-hdzef5 td:where(.svelte-hdzef5){border-bottom:1px solid var(--hmm-border-muted);padding:1px 8px 1px 0}.hmm-switch-index.svelte-hdzef5{color:var(--hmm-fg-muted);font-family:var(--hmm-font-mono)}.hmm-switch-days.svelte-hdzef5{display:flex;align-items:center;gap:2px}.hmm-switch-days.svelte-hdzef5 label:where(.svelte-hdzef5){display:flex;flex-direction:column;align-items:center;font-size:var(--hmm-font-size-small);color:var(--hmm-fg-muted)}.hmm-switch-time.svelte-hdzef5,.hmm-switch-number.svelte-hdzef5{width:80px}.hmm-switch-raw.svelte-hdzef5{font-family:var(--hmm-font-mono);font-size:var(--hmm-font-size-small);color:var(--hmm-fg-faint);margin-left:4px}.hmm-editor.svelte-1du5x7x{padding:4px;border-bottom:1px solid var(--hmm-border)}.hmm-editor.svelte-1du5x7x h3:where(.svelte-1du5x7x){margin:4px 0;font-size:var(--hmm-font-size)}.hmm-editor-hint.svelte-1du5x7x{margin:0 0 6px;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-week-bar.svelte-1du5x7x{display:flex;align-items:center;gap:4px;flex-wrap:wrap;padding:4px 0}.hmm-week-spacer.svelte-1du5x7x{flex:1 1 auto}.hmm-week-copy.svelte-1du5x7x{display:flex;align-items:center;gap:4px}.hmm-week-active.svelte-1du5x7x{background:var(--hmm-accent-bg);border-color:var(--hmm-accent)}.hmm-week-table.svelte-1du5x7x{width:100%;border-collapse:collapse}.hmm-week-table.svelte-1du5x7x th:where(.svelte-1du5x7x){text-align:left;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small);font-weight:400;border-bottom:1px solid var(--hmm-border)}.hmm-week-table.svelte-1du5x7x td:where(.svelte-1du5x7x){border-bottom:1px solid var(--hmm-border-muted);padding:1px 4px 1px 0}.hmm-week-index.svelte-1du5x7x,.hmm-week-from.svelte-1du5x7x{color:var(--hmm-fg-muted);font-family:var(--hmm-font-mono);width:60px}.hmm-week-time.svelte-1du5x7x,.hmm-week-value.svelte-1du5x7x{width:90px}.hmm-week-unit.svelte-1du5x7x{color:var(--hmm-fg-muted);margin-left:4px}.hmm-week-problems.svelte-1du5x7x{margin:6px 0 0;padding-left:18px;color:var(--hmm-warn)}.hmm-param.svelte-1qr2qb3{display:grid;grid-template-columns:240px minmax(0,1fr) 200px;gap:8px;align-items:center;padding:2px 4px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-param-changed.svelte-1qr2qb3{background:var(--hmm-accent-bg)}.hmm-param-label.svelte-1qr2qb3{display:flex;flex-direction:column;min-width:0}.hmm-param-id.svelte-1qr2qb3{font-family:var(--hmm-font-mono);font-size:var(--hmm-font-size-small);color:var(--hmm-fg-faint);overflow:hidden;text-overflow:ellipsis}.hmm-param-control.svelte-1qr2qb3{display:flex;align-items:center;gap:6px;min-width:0}.hmm-param-number.svelte-1qr2qb3{width:110px}.hmm-param-text.svelte-1qr2qb3{flex:1 1 auto;min-width:0}.hmm-param-special.svelte-1qr2qb3,.hmm-param-preset.svelte-1qr2qb3{max-width:130px}.hmm-param-unit.svelte-1qr2qb3{color:var(--hmm-fg-muted)}.hmm-param-set.svelte-1qr2qb3{margin-left:auto}.hmm-param-meta.svelte-1qr2qb3{display:flex;gap:8px;justify-content:flex-end;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small);white-space:nowrap}.hmm-param-flag.svelte-1qr2qb3{color:var(--hmm-warn)}.hmm-param-suppress.svelte-1qr2qb3{display:flex;align-items:center;gap:4px;color:var(--hmm-fg)}.hmm-param-help.svelte-1qr2qb3{grid-column:1 / -1;margin:0 0 4px;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-routing.svelte-10p79ns{display:flex;flex-direction:column;gap:10px}.hmm-routing-hint.svelte-10p79ns{margin:0;color:var(--hmm-fg-muted, inherit);font-size:.9em}.hmm-routing-graph.svelte-10p79ns{width:100%;max-width:560px;align-self:center;font-size:12px}.hmm-routing-graph.svelte-10p79ns line:where(.svelte-10p79ns){stroke:var(--hmm-fg-muted);stroke-width:1.5}.hmm-routing-graph.svelte-10p79ns line.hmm-routing-static:where(.svelte-10p79ns){stroke-dasharray:5 4}.hmm-routing-edge.svelte-10p79ns{fill:var(--hmm-fg-muted);font-size:10px;text-anchor:middle}.hmm-routing-node.svelte-10p79ns circle:where(.svelte-10p79ns){fill:var(--hmm-bg-sunken);stroke:var(--hmm-fg-muted);stroke-width:1.5}.hmm-routing-node.hmm-routing-router.svelte-10p79ns circle:where(.svelte-10p79ns){stroke:var(--hmm-accent)}.hmm-routing-node.hmm-routing-self.svelte-10p79ns circle:where(.svelte-10p79ns){fill:var(--hmm-accent);stroke:var(--hmm-accent)}.hmm-routing-node.svelte-10p79ns text:where(.svelte-10p79ns){fill:var(--hmm-fg)}.hmm-routing-node.hmm-routing-self.svelte-10p79ns .hmm-routing-mark:where(.svelte-10p79ns){fill:var(--hmm-bg)}.hmm-routing-mark.svelte-10p79ns{font-size:11px;font-weight:600}.hmm-routing-list.svelte-10p79ns td:where(.svelte-10p79ns),.hmm-routing-list.svelte-10p79ns th:where(.svelte-10p79ns){white-space:nowrap}.hmm-param.svelte-ery515{display:grid;grid-template-columns:240px minmax(0,1fr) 200px;gap:8px;align-items:center;padding:2px 4px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-param-changed.svelte-ery515{background:var(--hmm-accent-bg)}.hmm-param-label.svelte-ery515{display:flex;flex-direction:column;min-width:0}.hmm-param-id.svelte-ery515{font-family:var(--hmm-font-mono);font-size:var(--hmm-font-size-small);color:var(--hmm-fg-faint);overflow:hidden;text-overflow:ellipsis}.hmm-param-control.svelte-ery515{display:flex;align-items:center;gap:6px;min-width:0}.hmm-param-suppress.svelte-ery515{display:flex;align-items:center;gap:4px}.hmm-preview-call.svelte-1aaq6az{margin-top:0;font-family:var(--hmm-font-mono);color:var(--hmm-fg-muted);word-break:break-all}.hmm-preview-table.svelte-1aaq6az{width:100%;border-collapse:collapse}.hmm-preview-table.svelte-1aaq6az th:where(.svelte-1aaq6az),.hmm-preview-table.svelte-1aaq6az td:where(.svelte-1aaq6az){text-align:left;padding:2px 4px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-preview-new.svelte-1aaq6az{font-weight:700}.hmm-preview-count.svelte-1aaq6az{color:var(--hmm-fg-muted)}.hmm-preview-warnings.svelte-1aaq6az,.hmm-preview-problems.svelte-1aaq6az{margin:6px 0;padding-left:18px;color:var(--hmm-warn)}.hmm-preview-problems.svelte-1aaq6az{color:var(--hmm-error)}.hmm-preview-results.svelte-1aaq6az{margin:6px 0;padding-left:18px;color:var(--hmm-ok)}.hmm-preview-failed.svelte-1aaq6az{color:var(--hmm-error)}.hmm-preview-differs.svelte-1aaq6az,.hmm-preview-warn.svelte-1aaq6az{color:var(--hmm-warn)}.hmm-paramset-top.svelte-onngst{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding-bottom:6px;border-bottom:1px solid var(--hmm-border)}.hmm-paramset-suppress.svelte-onngst{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-top:6px;border-top:1px solid var(--hmm-border)}.hmm-paramset-suppress-hint.svelte-onngst{flex:1 1 auto;color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-paramset-raw.svelte-onngst{display:none}.hmm-paramset-option.svelte-onngst{display:flex;align-items:center;gap:4px}.hmm-paramset-warnings.svelte-onngst{margin:6px 0;padding-left:18px;color:var(--hmm-warn)}.hmm-paramset-list.svelte-onngst{flex:1 1 auto;min-height:120px;overflow-y:auto;overflow-x:hidden}.hmm-paramset-results.svelte-onngst{margin:6px 0 0;padding-left:18px;color:var(--hmm-ok)}.hmm-paramset-failed.svelte-onngst{color:var(--hmm-error)}.hmm-qr.svelte-1e4doc5{width:100%;max-height:240px;background:var(--hmm-bg-sunken);border:1px solid var(--hmm-border);border-radius:var(--hmm-radius)}.hmm-add-row.svelte-rkdrrf{display:grid;grid-template-columns:190px minmax(0,1fr);gap:8px;align-items:center;margin-bottom:6px}.hmm-add-row.svelte-rkdrrf>:where(.svelte-rkdrrf){min-width:0}.hmm-add-row.svelte-rkdrrf input:where(.svelte-rkdrrf),.hmm-add-row.svelte-rkdrrf select:where(.svelte-rkdrrf){max-width:100%}.hmm-add-seconds.svelte-rkdrrf{width:80px}.hmm-add-inline.svelte-rkdrrf{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-width:0}.hmm-add-actions.svelte-rkdrrf{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:6px}.hmm-add-invalid.svelte-rkdrrf{border-color:var(--hmm-error)}.hmm-add-error.svelte-rkdrrf{color:var(--hmm-error);margin-left:8px}.hmm-add-paired.svelte-rkdrrf{margin-top:10px;padding-top:8px;border-top:1px solid var(--hmm-border)}.hmm-add-paired.svelte-rkdrrf h4:where(.svelte-rkdrrf){margin:0 0 6px}.hmm-assign-count.svelte-17ogdox{margin:0 0 8px;color:var(--hmm-fg-muted)}.hmm-assign-mode.svelte-17ogdox{display:flex;gap:16px;margin-bottom:8px}.hmm-assign-mode.svelte-17ogdox label:where(.svelte-17ogdox){display:flex;align-items:center;gap:6px}.hmm-assign-select.svelte-17ogdox{width:100%;font-family:inherit}.hmm-assign-empty.svelte-17ogdox{margin:0;color:var(--hmm-fg-muted)}h4.svelte-y0v77l{margin:0 0 4px}.hmm-delete-address.svelte-y0v77l{margin:0 0 10px;font-family:var(--hmm-font-mono);color:var(--hmm-fg-muted)}.hmm-delete-select.svelte-y0v77l{width:100%}.hmm-delete-flags.svelte-y0v77l{margin-bottom:0;color:var(--hmm-fg-muted);font-family:var(--hmm-font-mono)}.hmm-danger.svelte-y0v77l{color:var(--hmm-error)}.hmm-rename-address.svelte-111tkcw{margin:0 0 6px;font-family:var(--hmm-font-mono);color:var(--hmm-fg-muted)}.hmm-rename-input.svelte-111tkcw{width:100%}.hmm-rename-children.svelte-111tkcw{display:flex;align-items:center;gap:6px;margin-top:8px}.hmm-repair-address.svelte-g84sn7{margin-top:0}.hmm-repair-note.svelte-g84sn7{color:var(--hmm-fg-muted)}.hmm-repair-unrepairable.svelte-g84sn7{color:var(--hmm-error)}.hmm-repair-unrepairable.svelte-g84sn7 ul:where(.svelte-g84sn7){margin:2px 0;padding-left:18px}.hmm-repair-table.svelte-g84sn7{width:100%;border-collapse:collapse}.hmm-repair-table.svelte-g84sn7 th:where(.svelte-g84sn7),.hmm-repair-table.svelte-g84sn7 td:where(.svelte-g84sn7){text-align:left;padding:2px 4px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-repair-recovery.svelte-g84sn7{display:flex;align-items:center;gap:8px;margin-top:8px}.hmm-repair-results.svelte-g84sn7{margin:8px 0 0;padding-left:18px;color:var(--hmm-ok)}.hmm-repair-failed.svelte-g84sn7{color:var(--hmm-error)}h4.svelte-novg4s{margin:0 0 4px}.hmm-replace-new.svelte-novg4s{color:var(--hmm-fg-muted)}.hmm-replace-select.svelte-novg4s{width:100%}.hmm-page.svelte-1fmr35a{display:flex;flex-direction:column;gap:6px;height:100%;min-height:0}.hmm-page-grid.svelte-1fmr35a{flex:1 1 auto;min-height:0}.hmm-taxonomy-filter.svelte-1fmr35a{max-width:160px;height:22px;padding:0 4px;font-size:var(--hmm-font-size-small)}.hmm-msg-mark.svelte-1fmr35a{padding:0 1px}.hmm-msg-error.svelte-1fmr35a{color:var(--hmm-error)}.hmm-msg-warn.svelte-1fmr35a{color:var(--hmm-warn)}.hmm-roaming.svelte-1fmr35a{padding-left:4px;color:var(--hmm-fg-muted)}.hmm-firmware-status.svelte-1fmr35a{color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small);padding-left:4px}.hmm-inline-button.svelte-1fmr35a{height:18px;padding:0 4px;margin-left:3px;border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-control-bg);color:var(--hmm-fg-muted);cursor:pointer;font-size:var(--hmm-font-size-small);line-height:1;vertical-align:middle}.hmm-inline-button.svelte-1fmr35a:hover{background:var(--hmm-control-bg-hover);color:var(--hmm-fg)}.hmm-page.svelte-dzof1w{display:flex;flex-direction:column;gap:6px;height:100%;min-height:0}.hmm-page-grid.svelte-dzof1w{flex:1 1 auto;min-height:0}.hmm-events-filter.svelte-dzof1w{width:150px}.hmm-link-info.svelte-1xlqelt{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;padding-bottom:6px;border-bottom:1px solid var(--hmm-border)}.hmm-link-info.svelte-1xlqelt label:where(.svelte-1xlqelt){display:flex;flex-direction:column;gap:2px;flex:1 1 auto}.hmm-link-targets.svelte-1xlqelt{padding:6px 0}.hmm-link-section.svelte-1xlqelt h4:where(.svelte-1xlqelt){margin:8px 0 4px}.hmm-link-toggle.svelte-1xlqelt{width:18px;height:18px;padding:0;border:1px solid var(--hmm-border);border-radius:2px;background:var(--hmm-bg);cursor:pointer;line-height:1}.hmm-link-profile.svelte-1xlqelt{display:flex;flex-direction:column;gap:6px;padding-bottom:6px}.hmm-link-row.svelte-1xlqelt{display:flex;align-items:center;gap:12px;flex-wrap:wrap;min-width:0}.hmm-link-row.svelte-1xlqelt label:where(.svelte-1xlqelt){display:flex;align-items:center;gap:6px}.hmm-link-expert.svelte-1xlqelt{white-space:nowrap}.hmm-link-profile-text.svelte-1xlqelt{margin:0;color:var(--hmm-fg-muted)}.hmm-link-list.svelte-1xlqelt{flex:1 1 auto;min-height:120px;overflow-y:auto;overflow-x:hidden}.hmm-link-results.svelte-1xlqelt{margin:6px 0 0;padding-left:18px;color:var(--hmm-ok)}.hmm-link-failed.svelte-1xlqelt{color:var(--hmm-error)}.hmm-remove-links.svelte-1suervc{margin:0;padding-left:18px;max-height:40vh;overflow:auto}.hmm-remove-names.svelte-1suervc{color:var(--hmm-fg-muted)}.hmm-danger.svelte-1suervc{color:var(--hmm-error)}.hmm-page.svelte-1pum174{display:flex;flex-direction:column;gap:6px;height:100%;min-height:0}.hmm-page-grid.svelte-1pum174{flex:1 1 auto;min-height:0}.hmm-links-defective.svelte-1pum174{color:var(--hmm-error)}.hmm-links-handover.svelte-1pum174{border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-accent-bg);color:var(--hmm-fg);font:inherit;line-height:1;padding:2px 6px;cursor:pointer}.hmm-link-broken.svelte-1pum174{color:var(--hmm-error)}.hmm-meta-delete-subject.svelte-1af2i6v{margin:0 0 6px;font-weight:600}.hmm-meta-delete-title.svelte-1af2i6v,.hmm-meta-delete-empty.svelte-1af2i6v{margin:0}.hmm-meta-delete-empty.svelte-1af2i6v{color:var(--hmm-fg-muted)}.hmm-meta-delete-members.svelte-1af2i6v{margin:6px 0 0;padding-left:20px;max-height:160px;overflow:auto}.hmm-meta-delete-danger.svelte-1af2i6v{color:var(--hmm-error)}.hmm-meta-move-subject.svelte-wmqa0d{margin:0 0 6px;font-weight:600}.hmm-meta-move-row.svelte-wmqa0d{display:flex;flex-direction:column;gap:4px}.hmm-meta-move-select.svelte-wmqa0d{width:100%}.hmm-meta-name-row.svelte-ue9nlv{display:flex;flex-direction:column;gap:4px}.hmm-meta-name-input.svelte-ue9nlv{width:100%}.hmm-page.svelte-147hcfo{display:flex;flex-direction:column;gap:6px;height:100%;min-height:0}.hmm-page-grid.svelte-147hcfo{flex:1 1 auto;min-height:0}.hmm-meta-name.svelte-147hcfo{display:inline-block}.hmm-meta-name-enum.svelte-147hcfo{font-weight:600}.hmm-meta-path.svelte-147hcfo{color:var(--hmm-fg-muted);font-size:var(--hmm-font-size-small)}.hmm-rssi.svelte-1wk3r6l{display:inline-block;min-width:62px;padding:0 4px;border-radius:2px;text-align:right;font-family:var(--hmm-font-mono)}.hmm-rssi-good.svelte-1wk3r6l{background:var(--hmm-rssi-good);color:var(--hmm-rssi-text)}.hmm-rssi-medium.svelte-1wk3r6l{background:var(--hmm-rssi-medium);color:var(--hmm-rssi-text)}.hmm-rssi-bad.svelte-1wk3r6l{background:var(--hmm-rssi-bad);color:var(--hmm-rssi-text)}.hmm-rssi-unknown.svelte-1wk3r6l{color:var(--hmm-fg-faint)}.hmm-best-receiver-intro.svelte-1gd5w9r{margin-top:0}.hmm-best-receiver-margin.svelte-1gd5w9r{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin-bottom:8px}.hmm-best-receiver-margin.svelte-1gd5w9r label:where(.svelte-1gd5w9r){display:inline-flex;align-items:center;gap:6px}.hmm-best-receiver-margin.svelte-1gd5w9r input:where(.svelte-1gd5w9r){width:60px}.hmm-best-receiver-hint.svelte-1gd5w9r,.hmm-best-receiver-note.svelte-1gd5w9r,.hmm-best-receiver-rest.svelte-1gd5w9r,.hmm-best-receiver-progress.svelte-1gd5w9r,.hmm-best-receiver-empty.svelte-1gd5w9r{color:var(--hmm-fg-muted)}.hmm-best-receiver-scroll.svelte-1gd5w9r{max-height:50vh;overflow:auto}.hmm-best-receiver-table.svelte-1gd5w9r{width:100%;border-collapse:collapse}.hmm-best-receiver-table.svelte-1gd5w9r th:where(.svelte-1gd5w9r),.hmm-best-receiver-table.svelte-1gd5w9r td:where(.svelte-1gd5w9r){text-align:left;padding:2px 4px;border-bottom:1px solid var(--hmm-border-muted);white-space:nowrap}.hmm-best-receiver-gain.svelte-1gd5w9r{text-align:right}.hmm-set-interface-device.svelte-1s1hrfj{margin-top:0}.hmm-set-interface-current.svelte-1s1hrfj{color:var(--hmm-fg-muted)}.hmm-set-interface-row.svelte-1s1hrfj{display:grid;grid-template-columns:120px 1fr;gap:8px;align-items:center;margin-bottom:6px}.hmm-set-interface-table.svelte-1s1hrfj{width:100%;border-collapse:collapse;margin-top:8px}.hmm-set-interface-table.svelte-1s1hrfj th:where(.svelte-1s1hrfj),.hmm-set-interface-table.svelte-1s1hrfj td:where(.svelte-1s1hrfj){text-align:left;padding:2px 4px;border-bottom:1px solid var(--hmm-border-muted)}.hmm-set-interface-configured.svelte-1s1hrfj{font-weight:700}.hmm-set-interface-mark.svelte-1s1hrfj{width:18px}.hmm-set-interface-name.svelte-1s1hrfj{padding-left:6px;color:var(--hmm-fg-muted)}.hmm-set-interface-best-note.svelte-1s1hrfj{color:var(--hmm-fg-muted)}.hmm-page.svelte-7f5yr6{display:flex;flex-direction:column;gap:6px;height:100%;min-height:0}.hmm-radio-gateways.svelte-7f5yr6{flex:0 0 auto;height:150px}.hmm-page-grid.svelte-7f5yr6{flex:1 1 auto;min-height:0}.hmm-receiver-mark.svelte-7f5yr6{width:var(--hmm-mark-size);height:18px;padding:0;border:none;background:none;color:var(--hmm-fg-faint);font:inherit;line-height:1;cursor:pointer}.hmm-receiver-mark.svelte-7f5yr6:hover,.hmm-receiver-configured.svelte-7f5yr6{color:var(--hmm-fg)}.hmm-page.svelte-u6ol56{display:flex;flex-direction:column;gap:6px;height:100%;min-height:0}.hmm-page-grid.svelte-u6ol56{flex:1 1 auto;min-height:0}.hmm-msg-name.svelte-u6ol56{font-family:var(--hmm-font-mono)}.hmm-msg-ackable.svelte-u6ol56{color:var(--hmm-accent)}.hmm-inline-button.svelte-u6ol56{height:18px;padding:0 4px;border:1px solid var(--hmm-border);border-radius:var(--hmm-radius);background:var(--hmm-control-bg);color:var(--hmm-fg-muted);cursor:pointer;font-size:var(--hmm-font-size-small);line-height:1;vertical-align:middle}.hmm-inline-button.svelte-u6ol56:hover:not(:disabled){background:var(--hmm-control-bg-hover);color:var(--hmm-fg)}.hmm-page-failed.svelte-1n46o8q{display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:16px}.hmm-page-failed-reason.svelte-1n46o8q{color:var(--hmm-error);font-family:var(--hmm-font-mono)}.hmm-app.svelte-1n46o8q{display:flex;flex-direction:column;height:100dvh;max-height:100dvh;min-height:0;overflow:hidden;position:relative;background:var(--hmm-bg);color:var(--hmm-fg)}.hmm-header.svelte-1n46o8q{display:flex;align-items:center;gap:8px;height:var(--hmm-header-height);padding:0 10px;background:var(--hmm-header-bg);border-bottom:1px solid var(--hmm-border);flex:0 0 auto}.hmm-header-actions.svelte-1n46o8q{display:flex;align-items:center;gap:4px;margin-left:auto}.hmm-header-user.svelte-1n46o8q{color:var(--hmm-fg-muted);max-width:12em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hmm-header-logout.svelte-1n46o8q{color:var(--hmm-link);margin-right:4px}.hmm-main.svelte-1n46o8q{flex:1 1 auto;min-height:0;padding:10px;overflow:hidden}.hmm-panel.svelte-1n46o8q{height:100%;min-height:0}.hmm-empty.svelte-1n46o8q{color:var(--hmm-fg-muted)}
|