@camstack/addon-osd-manager 0.1.157 → 0.1.160
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/dist/{MotionZonesSettings-vYt4dibj.mjs → MotionZonesSettings-gJgHYJJc.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-BiQ78hst.mjs → PrivacyMaskSettings-HmUc5RFn.mjs} +4 -4
- package/dist/{SceneMonitorEditor-CJtJIyMf.mjs → SceneMonitorEditor-Dqc4eAZT.mjs} +3 -3
- package/dist/_stub.js +3065 -2707
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-DdAtpC7z.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-BX8u4O5k.mjs} +2 -2
- package/dist/{_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BtgV-Ym5.mjs → _virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BzuGVFNp.mjs} +1 -1
- package/dist/{hostInit-0Mc7Fm1R.mjs → hostInit-o9ggbWOT.mjs} +1 -1
- package/dist/index.js +260 -46
- package/dist/index.mjs +240 -47
- package/dist/{player-overlays-BPyna-eI.mjs → player-overlays-BgDqoYs3.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-B0yDP9vf.mjs → responsive-B7zCyVCX.mjs} +1 -1
- package/dist/{scene-monitor-copy-BzX20O6q.mjs → scene-monitor-copy-DWIcj1X6.mjs} +1 -1
- package/dist/{square-BOMOn_6j.mjs → square-D0YQUHMC.mjs} +1 -1
- package/dist/{trash-2-BolGRl2P.mjs → trash-2-C_1H5SIl.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-UY9P_4V2.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BAuPDG6y.mjs} +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -39340,24 +39340,45 @@ setOverlay: method(object({
|
|
|
39340
39340
|
* conditions it is shown at all. Named TEMPLATES combine many device
|
|
39341
39341
|
* fields into one overlay string (Scrypted OSD Manager parity).
|
|
39342
39342
|
*/
|
|
39343
|
-
/**
|
|
39344
|
-
var
|
|
39345
|
-
|
|
39343
|
+
/** What `{alias}` expands to for one template binding. Exactly one choice. */
|
|
39344
|
+
var OsdTemplateFormatSchema = _enum([
|
|
39345
|
+
"value+unit",
|
|
39346
|
+
"value",
|
|
39347
|
+
"unit"
|
|
39348
|
+
]);
|
|
39349
|
+
/**
|
|
39350
|
+
* How the operator reached the leaf device. `deviceId` is ALWAYS the
|
|
39351
|
+
* OSD-supported leaf that is read; `containerId` is set when the pick
|
|
39352
|
+
* went through a container (gateway) first.
|
|
39353
|
+
*/
|
|
39354
|
+
var OsdTemplatePickSchema = object({
|
|
39355
|
+
containerId: number().int().optional(),
|
|
39356
|
+
deviceId: number().int()
|
|
39357
|
+
});
|
|
39358
|
+
/**
|
|
39359
|
+
* One named binding inside a multi-device template. The parser only
|
|
39360
|
+
* sees `{alias}`; format / unit / decimals live here structurally.
|
|
39361
|
+
*/
|
|
39362
|
+
var OsdTemplateBindingSchema = object({
|
|
39363
|
+
/** Token in the parser, e.g. `t` → `{t}`. Unique within the template. */
|
|
39364
|
+
alias: string().min(1).max(32).regex(/^[A-Za-z][A-Za-z0-9_-]*$/, "alias must start with a letter"),
|
|
39365
|
+
pick: OsdTemplatePickSchema,
|
|
39346
39366
|
capName: string().min(1).max(64),
|
|
39347
39367
|
valuePath: string().min(1).max(64),
|
|
39368
|
+
format: OsdTemplateFormatSchema.default("value+unit"),
|
|
39348
39369
|
/** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
|
|
39349
39370
|
displayUnit: string().max(16).optional(),
|
|
39350
39371
|
maxDecimals: number().int().min(0).max(4).default(1)
|
|
39351
39372
|
});
|
|
39352
39373
|
/**
|
|
39353
|
-
* A named template:
|
|
39354
|
-
* `{
|
|
39374
|
+
* A named template: bindings (alias → leaf field) + a parser that only
|
|
39375
|
+
* references `{alias}` tokens.
|
|
39355
39376
|
*/
|
|
39356
39377
|
var OsdNamedTemplateSchema = object({
|
|
39357
39378
|
id: string().min(1).max(64),
|
|
39358
39379
|
name: string().min(1).max(64),
|
|
39359
|
-
|
|
39360
|
-
/** Parser with
|
|
39380
|
+
bindings: array(OsdTemplateBindingSchema).max(32).default([]),
|
|
39381
|
+
/** Parser with alias placeholders, e.g. `{t} / {h}`. */
|
|
39361
39382
|
parser: string().max(256).default("")
|
|
39362
39383
|
});
|
|
39363
39384
|
/** Where a slot's value comes from. */
|
|
@@ -58364,14 +58385,42 @@ function readStatePath(slice, path) {
|
|
|
58364
58385
|
}
|
|
58365
58386
|
//#endregion
|
|
58366
58387
|
//#region src/template-tokens.ts
|
|
58367
|
-
/** Build the placeholder token for one
|
|
58368
|
-
function
|
|
58369
|
-
return `{${
|
|
58388
|
+
/** Build the placeholder token for one binding alias. */
|
|
58389
|
+
function aliasToken(alias) {
|
|
58390
|
+
return `{${alias}}`;
|
|
58391
|
+
}
|
|
58392
|
+
/** Chip / parser token for a binding. */
|
|
58393
|
+
function bindingToken(binding) {
|
|
58394
|
+
return aliasToken(binding.alias);
|
|
58395
|
+
}
|
|
58396
|
+
/** Parse `{alias}` tokens from a parser string (letters, digits, `_`, `-`). */
|
|
58397
|
+
function parseAliasTokens(parser) {
|
|
58398
|
+
const out = [];
|
|
58399
|
+
for (const match of parser.matchAll(/\{([A-Za-z][A-Za-z0-9_-]*)\}/g)) {
|
|
58400
|
+
const alias = match[1];
|
|
58401
|
+
if (alias === void 0 || alias === "") continue;
|
|
58402
|
+
if (!out.includes(alias)) out.push(alias);
|
|
58403
|
+
}
|
|
58404
|
+
return out;
|
|
58370
58405
|
}
|
|
58371
58406
|
/** Replace every occurrence of `token` in `parser` with `value`. */
|
|
58372
58407
|
function replaceToken(parser, token, value) {
|
|
58373
58408
|
return parser.replaceAll(token, value);
|
|
58374
58409
|
}
|
|
58410
|
+
/**
|
|
58411
|
+
* Suggest a short unique alias from a device/field name.
|
|
58412
|
+
* Falls back to `b1`, `b2`, … when the slug collides.
|
|
58413
|
+
*/
|
|
58414
|
+
function suggestAlias(seed, taken, fallbackPrefix = "b") {
|
|
58415
|
+
const slug = seed.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "").replace(/^(\d)/, "a$1").slice(0, 24);
|
|
58416
|
+
const base = slug.length > 0 ? slug : fallbackPrefix;
|
|
58417
|
+
if (!taken.has(base)) return base;
|
|
58418
|
+
for (let i = 2; i < 1e3; i += 1) {
|
|
58419
|
+
const candidate = `${base}${i}`.slice(0, 32);
|
|
58420
|
+
if (!taken.has(candidate)) return candidate;
|
|
58421
|
+
}
|
|
58422
|
+
return `${fallbackPrefix}${Date.now().toString(36)}`;
|
|
58423
|
+
}
|
|
58375
58424
|
//#endregion
|
|
58376
58425
|
//#region src/unit-display.ts
|
|
58377
58426
|
/**
|
|
@@ -58427,24 +58476,48 @@ function inferSourceUnit(slice, valuePath) {
|
|
|
58427
58476
|
}
|
|
58428
58477
|
//#endregion
|
|
58429
58478
|
//#region src/named-template-render.ts
|
|
58479
|
+
/** Combine value/unit according to the binding's single format choice. */
|
|
58480
|
+
function applyTemplateFormat(value, unit, format) {
|
|
58481
|
+
if (format === "value") return value;
|
|
58482
|
+
if (format === "unit") return unit;
|
|
58483
|
+
const v = value.trim();
|
|
58484
|
+
const u = unit.trim();
|
|
58485
|
+
if (v === "") return u;
|
|
58486
|
+
if (u === "") return v;
|
|
58487
|
+
return `${v} ${u}`;
|
|
58488
|
+
}
|
|
58489
|
+
/** Resolve one binding to live value/unit/formatted parts (or a reason). */
|
|
58490
|
+
function resolveBindingLive(binding, facts) {
|
|
58491
|
+
const deviceId = binding.pick.deviceId;
|
|
58492
|
+
const deviceState = facts.stateByDevice.get(deviceId);
|
|
58493
|
+
if (deviceState === void 0) return { reason: `no state mirrored for device ${deviceId}` };
|
|
58494
|
+
const slice = deviceState[binding.capName];
|
|
58495
|
+
if (slice === void 0) return { reason: `device ${deviceId} publishes no "${binding.capName}" state` };
|
|
58496
|
+
const raw = readStatePath(slice, binding.valuePath);
|
|
58497
|
+
if (raw === void 0) return { reason: `"${binding.capName}.${binding.valuePath}" is absent on device ${deviceId}` };
|
|
58498
|
+
let value;
|
|
58499
|
+
let unit = "";
|
|
58500
|
+
if (typeof raw === "number") {
|
|
58501
|
+
const converted = convertForDisplay(raw, inferSourceUnit(slice, binding.valuePath), binding.displayUnit);
|
|
58502
|
+
value = truncateDecimals(converted.value, binding.maxDecimals);
|
|
58503
|
+
unit = converted.unit;
|
|
58504
|
+
} else if (typeof raw === "boolean") value = raw ? "ON" : "OFF";
|
|
58505
|
+
else if (raw === null) value = "";
|
|
58506
|
+
else value = String(raw);
|
|
58507
|
+
return {
|
|
58508
|
+
value,
|
|
58509
|
+
unit,
|
|
58510
|
+
formatted: applyTemplateFormat(value, unit, binding.format)
|
|
58511
|
+
};
|
|
58512
|
+
}
|
|
58430
58513
|
/** Render one named template's parser from live states. */
|
|
58431
58514
|
function renderNamedTemplate(template, facts) {
|
|
58432
58515
|
let text = template.parser;
|
|
58433
|
-
if (template.
|
|
58434
|
-
for (const
|
|
58435
|
-
const
|
|
58436
|
-
|
|
58437
|
-
|
|
58438
|
-
const slice = deviceState[field.capName];
|
|
58439
|
-
if (slice === void 0) return { reason: `device ${field.deviceId} publishes no "${field.capName}" state` };
|
|
58440
|
-
const raw = readStatePath(slice, field.valuePath);
|
|
58441
|
-
if (raw === void 0) return { reason: `"${field.capName}.${field.valuePath}" is absent on device ${field.deviceId}` };
|
|
58442
|
-
let rendered;
|
|
58443
|
-
if (typeof raw === "number") rendered = truncateDecimals(convertForDisplay(raw, inferSourceUnit(slice, field.valuePath), field.displayUnit).value, field.maxDecimals);
|
|
58444
|
-
else if (typeof raw === "boolean") rendered = raw ? "ON" : "OFF";
|
|
58445
|
-
else if (raw === null) rendered = "";
|
|
58446
|
-
else rendered = String(raw);
|
|
58447
|
-
text = replaceToken(text, token, rendered);
|
|
58516
|
+
if (template.bindings.length === 0) return text.trim() === "" ? { reason: `template "${template.id}" has no bindings` } : { text };
|
|
58517
|
+
for (const binding of template.bindings) {
|
|
58518
|
+
const live = resolveBindingLive(binding, facts);
|
|
58519
|
+
if ("reason" in live) return live;
|
|
58520
|
+
text = replaceToken(text, aliasToken(binding.alias), live.formatted);
|
|
58448
58521
|
}
|
|
58449
58522
|
return { text };
|
|
58450
58523
|
}
|
|
@@ -58546,20 +58619,98 @@ function settle(slotId, text, previousText, outcome, reason) {
|
|
|
58546
58619
|
};
|
|
58547
58620
|
}
|
|
58548
58621
|
//#endregion
|
|
58622
|
+
//#region src/osd-source-fields.ts
|
|
58623
|
+
/** Caps the OSD source picker may bind. */
|
|
58624
|
+
var OSD_SOURCE_CAP_NAMES = new Set([
|
|
58625
|
+
"temperature-sensor",
|
|
58626
|
+
"humidity-sensor",
|
|
58627
|
+
"climate-control",
|
|
58628
|
+
"numeric-sensor",
|
|
58629
|
+
"weather",
|
|
58630
|
+
"air-quality-sensor",
|
|
58631
|
+
"lock-control",
|
|
58632
|
+
"contact",
|
|
58633
|
+
"binary",
|
|
58634
|
+
"battery"
|
|
58635
|
+
]);
|
|
58636
|
+
/**
|
|
58637
|
+
* Per-cap leaf allowlist. Absent entry ⇒ every leaf from `stateLeavesOf`
|
|
58638
|
+
* that survives bookkeeping (single-metric sensors). Present ⇒ only these
|
|
58639
|
+
* paths (climate / weather / battery).
|
|
58640
|
+
*/
|
|
58641
|
+
var OSD_SOURCE_PATHS = new Map([
|
|
58642
|
+
["climate-control", new Set([
|
|
58643
|
+
"currentTemp",
|
|
58644
|
+
"currentHumidity",
|
|
58645
|
+
"target",
|
|
58646
|
+
"targetHumidity",
|
|
58647
|
+
"mode"
|
|
58648
|
+
])],
|
|
58649
|
+
["weather", new Set([
|
|
58650
|
+
"condition",
|
|
58651
|
+
"temperature",
|
|
58652
|
+
"humidity",
|
|
58653
|
+
"pressure",
|
|
58654
|
+
"windSpeed",
|
|
58655
|
+
"windBearing"
|
|
58656
|
+
])],
|
|
58657
|
+
["battery", new Set(["percentage"])],
|
|
58658
|
+
["temperature-sensor", new Set(["celsius"])],
|
|
58659
|
+
["humidity-sensor", new Set(["percent"])],
|
|
58660
|
+
["numeric-sensor", new Set(["value"])],
|
|
58661
|
+
["air-quality-sensor", new Set([
|
|
58662
|
+
"co2Ppm",
|
|
58663
|
+
"vocPpb",
|
|
58664
|
+
"pm25",
|
|
58665
|
+
"pm10",
|
|
58666
|
+
"aqi"
|
|
58667
|
+
])],
|
|
58668
|
+
["binary", new Set(["on"])],
|
|
58669
|
+
["contact", new Set(["entryOpen"])],
|
|
58670
|
+
["lock-control", new Set(["state"])]
|
|
58671
|
+
]);
|
|
58672
|
+
function isOsdSourceCap(capName) {
|
|
58673
|
+
return OSD_SOURCE_CAP_NAMES.has(capName);
|
|
58674
|
+
}
|
|
58675
|
+
/** Bindable OSD leaves for one cap — empty when the cap is not OSD-relevant. */
|
|
58676
|
+
function osdStateLeavesOf(cap) {
|
|
58677
|
+
if (!isOsdSourceCap(cap.name)) return [];
|
|
58678
|
+
const leaves = stateLeavesOf(cap);
|
|
58679
|
+
const allowed = OSD_SOURCE_PATHS.get(cap.name);
|
|
58680
|
+
if (allowed === void 0) return leaves;
|
|
58681
|
+
return leaves.filter((leaf) => allowed.has(leaf.path));
|
|
58682
|
+
}
|
|
58683
|
+
/** Device types that never contribute their OWN catalog leaves. */
|
|
58684
|
+
var OSD_NON_LEAF_TYPES = new Set(["container"]);
|
|
58685
|
+
/** True when this device type may expose OSD leaves (not a container gateway). */
|
|
58686
|
+
function isOsdLeafDeviceType(type) {
|
|
58687
|
+
if (type === null || type === void 0) return true;
|
|
58688
|
+
return !OSD_NON_LEAF_TYPES.has(type);
|
|
58689
|
+
}
|
|
58690
|
+
/** @deprecated Prefer {@link isOsdLeafDeviceType}. */
|
|
58691
|
+
var OSD_PICKER_EXCLUDED_TYPES = OSD_NON_LEAF_TYPES;
|
|
58692
|
+
/** @deprecated Prefer {@link isOsdLeafDeviceType}. */
|
|
58693
|
+
function isOsdPickerDeviceType(type) {
|
|
58694
|
+
return isOsdLeafDeviceType(type);
|
|
58695
|
+
}
|
|
58696
|
+
function isContainerDeviceType(type) {
|
|
58697
|
+
return type === "container";
|
|
58698
|
+
}
|
|
58699
|
+
//#endregion
|
|
58549
58700
|
//#region src/source-catalog.ts
|
|
58550
58701
|
/**
|
|
58551
|
-
* Build the editor's source picker from
|
|
58552
|
-
*
|
|
58553
|
-
*
|
|
58702
|
+
* Build the editor's source picker from OSD-relevant cap definitions.
|
|
58703
|
+
* Gateway / infrastructure caps (broker, mqtt, deviceExport, …) never
|
|
58704
|
+
* appear — see `osd-source-fields.ts`.
|
|
58554
58705
|
*/
|
|
58555
58706
|
/** Turn `air-quality-sensor` + `pm25` into `Air Quality Sensor · pm25`. */
|
|
58556
58707
|
function humanizeCapName(capName) {
|
|
58557
58708
|
return capName.split("-").map((part) => part.length === 0 ? part : part[0].toUpperCase() + part.slice(1)).join(" ");
|
|
58558
58709
|
}
|
|
58559
58710
|
/**
|
|
58560
|
-
* Every bindable value across the cluster, with the camera's own
|
|
58561
|
-
* first — that is what an operator reaches for, and a picker that
|
|
58562
|
-
* it under 200 other devices is a picker nobody uses.
|
|
58711
|
+
* Every OSD-bindable value across the cluster, with the camera's own
|
|
58712
|
+
* state first — that is what an operator reaches for, and a picker that
|
|
58713
|
+
* buries it under 200 other devices is a picker nobody uses.
|
|
58563
58714
|
*/
|
|
58564
58715
|
function sourceOptionsFor(cameraDeviceId, devices, capsByDevice) {
|
|
58565
58716
|
const capsByName = new Map(ALL_CAPABILITY_DEFINITIONS.map((cap) => [cap.name, cap]));
|
|
@@ -58569,18 +58720,22 @@ function sourceOptionsFor(cameraDeviceId, devices, capsByDevice) {
|
|
|
58569
58720
|
return a.id - b.id;
|
|
58570
58721
|
});
|
|
58571
58722
|
const options = [];
|
|
58572
|
-
for (const device of ordered)
|
|
58573
|
-
|
|
58574
|
-
|
|
58575
|
-
|
|
58576
|
-
|
|
58577
|
-
|
|
58578
|
-
|
|
58579
|
-
|
|
58580
|
-
|
|
58581
|
-
|
|
58582
|
-
|
|
58583
|
-
|
|
58723
|
+
for (const device of ordered) {
|
|
58724
|
+
if (!isOsdLeafDeviceType(device.type ?? null)) continue;
|
|
58725
|
+
for (const capName of capsByDevice.get(device.id) ?? []) {
|
|
58726
|
+
if (!isOsdSourceCap(capName)) continue;
|
|
58727
|
+
const cap = capsByName.get(capName);
|
|
58728
|
+
if (cap === void 0) continue;
|
|
58729
|
+
for (const leaf of osdStateLeavesOf(cap)) options.push({
|
|
58730
|
+
deviceId: device.id,
|
|
58731
|
+
deviceName: device.name,
|
|
58732
|
+
capName,
|
|
58733
|
+
valuePath: leaf.path,
|
|
58734
|
+
label: `${humanizeCapName(capName)} · ${leaf.path}`,
|
|
58735
|
+
valueType: leaf.valueType,
|
|
58736
|
+
...leaf.enumValues !== void 0 ? { enumValues: leaf.enumValues } : {}
|
|
58737
|
+
});
|
|
58738
|
+
}
|
|
58584
58739
|
}
|
|
58585
58740
|
return options;
|
|
58586
58741
|
}
|
|
@@ -58976,7 +59131,7 @@ var OsdManager = class {
|
|
|
58976
59131
|
if (stored === void 0) throw new Error(`osd-manager: template "${template.id}" missing after upsert`);
|
|
58977
59132
|
this.logger.info("osd-manager: named template upserted", { meta: {
|
|
58978
59133
|
templateId: stored.id,
|
|
58979
|
-
|
|
59134
|
+
bindingCount: stored.bindings.length
|
|
58980
59135
|
} });
|
|
58981
59136
|
return { template: stored };
|
|
58982
59137
|
};
|
|
@@ -59064,7 +59219,7 @@ var OsdManager = class {
|
|
|
59064
59219
|
const templatesById = /* @__PURE__ */ new Map();
|
|
59065
59220
|
for (const named of allTemplates) {
|
|
59066
59221
|
templatesById.set(named.id, named);
|
|
59067
|
-
if (templateIds.has(named.id)) for (const
|
|
59222
|
+
if (templateIds.has(named.id)) for (const binding of named.bindings) wanted.add(binding.pick.deviceId);
|
|
59068
59223
|
}
|
|
59069
59224
|
const stateByDevice = /* @__PURE__ */ new Map();
|
|
59070
59225
|
const gateState = /* @__PURE__ */ new Map();
|
|
@@ -59266,7 +59421,8 @@ var OsdManagerAddon = class extends BaseAddon {
|
|
|
59266
59421
|
listDevices: async () => {
|
|
59267
59422
|
return (await ctx.api.deviceManager.listAll.query({ projection: "slim" })).map((d) => ({
|
|
59268
59423
|
id: d.id,
|
|
59269
|
-
name: d.name
|
|
59424
|
+
name: d.name,
|
|
59425
|
+
type: d.type ?? null
|
|
59270
59426
|
}));
|
|
59271
59427
|
},
|
|
59272
59428
|
listCameras: async () => {
|
|
@@ -59364,4 +59520,41 @@ var OsdManagerAddon = class extends BaseAddon {
|
|
|
59364
59520
|
}
|
|
59365
59521
|
};
|
|
59366
59522
|
//#endregion
|
|
59367
|
-
|
|
59523
|
+
//#region src/osd-picker-devices.ts
|
|
59524
|
+
/**
|
|
59525
|
+
* Devices offered to the OSD DevicePicker — containers INCLUDED so the
|
|
59526
|
+
* operator can pick a gateway, then an OSD-supported child.
|
|
59527
|
+
*/
|
|
59528
|
+
function toOsdPickerDevices(devices) {
|
|
59529
|
+
return devices.map((d) => ({
|
|
59530
|
+
id: d.id,
|
|
59531
|
+
name: d.name,
|
|
59532
|
+
type: d.type ?? null,
|
|
59533
|
+
location: d.location ?? null,
|
|
59534
|
+
parentDeviceId: d.parentDeviceId ?? null
|
|
59535
|
+
}));
|
|
59536
|
+
}
|
|
59537
|
+
/** Children of a container that have at least one OSD catalog field. */
|
|
59538
|
+
function osdSupportedChildrenOf(containerId, devices, deviceIdsWithOsdFields) {
|
|
59539
|
+
return devices.filter((d) => d.parentDeviceId === containerId && isOsdLeafDeviceType(d.type) && deviceIdsWithOsdFields.has(d.id)).toSorted((a, b) => a.name.localeCompare(b.name));
|
|
59540
|
+
}
|
|
59541
|
+
function deviceById(devices, id) {
|
|
59542
|
+
return devices.find((d) => d.id === id);
|
|
59543
|
+
}
|
|
59544
|
+
//#endregion
|
|
59545
|
+
//#region src/template-id.ts
|
|
59546
|
+
/**
|
|
59547
|
+
* Named-template ids are system-generated — never an operator text field.
|
|
59548
|
+
* Create uses a uuid; the editable surface is the template name.
|
|
59549
|
+
*/
|
|
59550
|
+
function generateTemplateId() {
|
|
59551
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") return crypto.randomUUID();
|
|
59552
|
+
return `tpl-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
59553
|
+
}
|
|
59554
|
+
/** Optional slug helper when a stable short id from the name is preferred. */
|
|
59555
|
+
function templateIdFromName(name) {
|
|
59556
|
+
const slug = name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48);
|
|
59557
|
+
return `${slug.length > 0 ? slug : "template"}-${Date.now().toString(36)}`;
|
|
59558
|
+
}
|
|
59559
|
+
//#endregion
|
|
59560
|
+
export { DEFAULT_TICK_MS, EMPTY_BINDINGS, OSD_BINDINGS_KEY, OSD_NON_LEAF_TYPES, OSD_PICKER_EXCLUDED_TYPES, OSD_SOURCE_CAP_NAMES, OSD_SUPPORTED_CONDITIONS, OsdBindingsStore, OsdDeviceBindingsSchema, OsdManager, OsdManagerAddon, OsdManagerAddon as default, aliasToken, applyTemplate, applyTemplateFormat, assertSupportedConditions, bindingToken, deviceById, displayValue, evaluateGate, formatClock, formatSlotText, generateTemplateId, humanizeCapName, isContainerDeviceType, isOsdLeafDeviceType, isOsdPickerDeviceType, isOsdSourceCap, limitText, osdStateLeavesOf, osdSupportedChildrenOf, parseAliasTokens, readStatePath, renderNamedTemplate, renderSlot, replaceToken, resolveBindingLive, resolveSource, sourceOptionsFor, stateLeavesOf, suggestAlias, templateIdFromName, toOsdPickerDevices, truncateDecimals, unsupportedConditionKeys, withBinding, withoutBinding };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { b as e, g as t, l as n, u as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-C5jUMd7X.mjs";
|
|
2
|
-
import { c as i, s as a } from "./responsive-
|
|
2
|
+
import { c as i, s as a } from "./responsive-B7zCyVCX.mjs";
|
|
3
3
|
import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
|
|
4
4
|
var l = i("chevron-down", [["path", {
|
|
5
5
|
d: "m6 9 6 6 6-6",
|
package/dist/remoteEntry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-
|
|
1
|
+
import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BAuPDG6y.mjs";
|
|
2
2
|
export { t as get, e as init };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { _ as e, b as t, c as n, g as r, l as i, m as a, n as o, r as s, t as c, u as l } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-C5jUMd7X.mjs";
|
|
2
2
|
import "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
|
|
3
|
-
import { i as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-
|
|
3
|
+
import { i as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BzuGVFNp.mjs";
|
|
4
4
|
//#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
|
|
5
5
|
t();
|
|
6
6
|
var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { b as e, c as t, g as n, m as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-C5jUMd7X.mjs";
|
|
2
|
-
import { c as i } from "./responsive-
|
|
2
|
+
import { c as i } from "./responsive-B7zCyVCX.mjs";
|
|
3
3
|
var a = i("camera", [["path", {
|
|
4
4
|
d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
|
|
5
5
|
key: "18u6gg"
|
|
@@ -2753,7 +2753,7 @@ async function rr(e) {
|
|
|
2753
2753
|
}
|
|
2754
2754
|
}
|
|
2755
2755
|
async function ir() {
|
|
2756
|
-
return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-
|
|
2756
|
+
return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-BX8u4O5k.mjs")).catch((e) => {
|
|
2757
2757
|
throw tr = void 0, e;
|
|
2758
2758
|
}), tr;
|
|
2759
2759
|
}
|