homebridge-plugin-utils 1.15.2 → 1.16.0
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/README.md +4 -1
- package/build/eslint-rules.mjs +1 -0
- package/dist/featureoptions.d.ts +83 -5
- package/dist/featureoptions.js +65 -6
- package/dist/featureoptions.js.map +1 -1
- package/dist/ffmpeg/codecs.d.ts +172 -0
- package/dist/ffmpeg/codecs.js +374 -0
- package/dist/ffmpeg/codecs.js.map +1 -0
- package/dist/ffmpeg/exec.d.ts +108 -0
- package/dist/ffmpeg/exec.js +122 -0
- package/dist/ffmpeg/exec.js.map +1 -0
- package/dist/ffmpeg/index.d.ts +8 -0
- package/dist/ffmpeg/index.js +13 -0
- package/dist/ffmpeg/index.js.map +1 -0
- package/dist/ffmpeg/options.d.ts +345 -0
- package/dist/ffmpeg/options.js +750 -0
- package/dist/ffmpeg/options.js.map +1 -0
- package/dist/ffmpeg/process.d.ts +155 -0
- package/dist/ffmpeg/process.js +344 -0
- package/dist/ffmpeg/process.js.map +1 -0
- package/dist/ffmpeg/record.d.ts +230 -0
- package/dist/ffmpeg/record.js +504 -0
- package/dist/ffmpeg/record.js.map +1 -0
- package/dist/ffmpeg/rtp.d.ts +205 -0
- package/dist/ffmpeg/rtp.js +335 -0
- package/dist/ffmpeg/rtp.js.map +1 -0
- package/dist/ffmpeg/settings.d.ts +6 -0
- package/dist/ffmpeg/settings.js +17 -0
- package/dist/ffmpeg/settings.js.map +1 -0
- package/dist/ffmpeg/stream.d.ts +143 -0
- package/dist/ffmpeg/stream.js +186 -0
- package/dist/ffmpeg/stream.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mqttclient.d.ts +161 -1
- package/dist/mqttclient.js +161 -9
- package/dist/mqttclient.js.map +1 -1
- package/dist/service.d.ts +9 -2
- package/dist/service.js +6 -0
- package/dist/service.js.map +1 -1
- package/dist/ui/featureoptions.js +65 -6
- package/dist/ui/featureoptions.js.map +1 -1
- package/dist/ui/webUi-featureoptions.mjs +5 -4
- package/dist/util.d.ts +203 -12
- package/dist/util.js +95 -12
- package/dist/util.js.map +1 -1
- package/package.json +13 -9
- package/dist/rtp.d.ts +0 -32
- package/dist/rtp.js +0 -178
- package/dist/rtp.js.map +0 -1
package/dist/mqttclient.js
CHANGED
|
@@ -1,6 +1,43 @@
|
|
|
1
|
-
|
|
1
|
+
/* Copyright(C) 2017-2025, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* mqttclient.ts: MQTT connectivity class for Homebridge plugins.
|
|
4
|
+
*/
|
|
5
|
+
import { connect } from "mqtt";
|
|
2
6
|
import util from "node:util";
|
|
3
7
|
const MQTT_DEFAULT_RECONNECT_INTERVAL = 60;
|
|
8
|
+
/**
|
|
9
|
+
* MQTT connectivity and topic management class for Homebridge plugins.
|
|
10
|
+
*
|
|
11
|
+
* This class manages connection, publishing, subscription, and message handling for an MQTT broker, and provides convenience methods for Homebridge accessories to
|
|
12
|
+
* interact with MQTT topics using a standard topic prefix.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* const mqtt = new MqttClient("mqtt://localhost:1883", "homebridge", log);
|
|
18
|
+
*
|
|
19
|
+
* // Publish a message to a topic.
|
|
20
|
+
* mqtt.publish("device1", "status", "on");
|
|
21
|
+
*
|
|
22
|
+
* // Subscribe to a topic.
|
|
23
|
+
* mqtt.subscribe("device1", "status", (msg) => {
|
|
24
|
+
*
|
|
25
|
+
* console.log(msg.toString());
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // Subscribe to a 'get' topic and automatically publish a value in response.
|
|
29
|
+
* mqtt.subscribeGet("device1", "temperature", "Temperature", () => "21.5");
|
|
30
|
+
*
|
|
31
|
+
* // Subscribe to a 'set' topic and handle value changes.
|
|
32
|
+
* mqtt.subscribeSet("device1", "switch", "Switch", (value) => {
|
|
33
|
+
*
|
|
34
|
+
* console.log("Switch set to", value);
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // Unsubscribe from a topic.
|
|
38
|
+
* mqtt.unsubscribe("device1", "status");
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
4
41
|
export class MqttClient {
|
|
5
42
|
brokerUrl;
|
|
6
43
|
isConnected;
|
|
@@ -9,6 +46,22 @@ export class MqttClient {
|
|
|
9
46
|
mqtt;
|
|
10
47
|
subscriptions;
|
|
11
48
|
topicPrefix;
|
|
49
|
+
/**
|
|
50
|
+
* Creates a new MQTT client for connecting to a broker and managing topics with a given prefix.
|
|
51
|
+
*
|
|
52
|
+
* @param brokerUrl - The MQTT broker URL (e.g., "mqtt://localhost:1883").
|
|
53
|
+
* @param topicPrefix - Prefix to use for all MQTT topics (e.g., "homebridge").
|
|
54
|
+
* @param log - Logger for debug and info messages.
|
|
55
|
+
* @param reconnectInterval - Optional. Interval (in seconds) to wait between reconnection attempts. Defaults to 60 seconds.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* const mqtt = new MqttClient("mqtt://localhost", "homebridge", log);
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* @remarks URL must conform to formats supported by {@link https://github.com/mqttjs/MQTT.js | MQTT.js}.
|
|
64
|
+
*/
|
|
12
65
|
constructor(brokerUrl, topicPrefix, log, reconnectInterval = MQTT_DEFAULT_RECONNECT_INTERVAL) {
|
|
13
66
|
this.brokerUrl = brokerUrl;
|
|
14
67
|
this.isConnected = false;
|
|
@@ -19,11 +72,15 @@ export class MqttClient {
|
|
|
19
72
|
this.topicPrefix = topicPrefix;
|
|
20
73
|
this.configure();
|
|
21
74
|
}
|
|
22
|
-
|
|
75
|
+
/**
|
|
76
|
+
* Initializes and connects the MQTT client to the broker, setting up event handlers for connection, messages, and errors.
|
|
77
|
+
*
|
|
78
|
+
* Catches invalid broker URLs and logs errors. Handles all major MQTT client events internally.
|
|
79
|
+
*/
|
|
23
80
|
configure() {
|
|
24
81
|
// Try to connect to the MQTT broker and make sure we catch any URL errors.
|
|
25
82
|
try {
|
|
26
|
-
this.mqtt =
|
|
83
|
+
this.mqtt = connect(this.brokerUrl, { reconnectPeriod: this.reconnectInterval * 1000, rejectUnauthorized: false });
|
|
27
84
|
}
|
|
28
85
|
catch (error) {
|
|
29
86
|
if (error instanceof Error) {
|
|
@@ -81,7 +138,21 @@ export class MqttClient {
|
|
|
81
138
|
}
|
|
82
139
|
});
|
|
83
140
|
}
|
|
84
|
-
|
|
141
|
+
/**
|
|
142
|
+
* Publishes a message to a topic for a specific device.
|
|
143
|
+
*
|
|
144
|
+
* Expands the topic using the topic prefix and device ID, then publishes the provided message string.
|
|
145
|
+
*
|
|
146
|
+
* @param id - The device or accessory identifier.
|
|
147
|
+
* @param topic - The topic name to publish to.
|
|
148
|
+
* @param message - The message payload to publish.
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
*
|
|
152
|
+
* ```ts
|
|
153
|
+
* mqtt.publish("device1", "status", "on");
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
85
156
|
publish(id, topic, message) {
|
|
86
157
|
const expandedTopic = this.expandTopic(id, topic);
|
|
87
158
|
// No valid topic returned, we're done.
|
|
@@ -92,7 +163,24 @@ export class MqttClient {
|
|
|
92
163
|
// By default, we publish as: pluginTopicPrefix/id/topic
|
|
93
164
|
this.mqtt?.publish(expandedTopic, message);
|
|
94
165
|
}
|
|
95
|
-
|
|
166
|
+
/**
|
|
167
|
+
* Subscribes to a topic for a specific device and registers a handler for incoming messages.
|
|
168
|
+
*
|
|
169
|
+
* The topic is expanded using the prefix and device ID, and the callback will be called for each message received.
|
|
170
|
+
*
|
|
171
|
+
* @param id - The device or accessory identifier.
|
|
172
|
+
* @param topic - The topic name to subscribe to.
|
|
173
|
+
* @param callback - Handler function called with the message buffer.
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
*
|
|
177
|
+
* ```ts
|
|
178
|
+
* mqtt.subscribe("device1", "status", (msg) => {
|
|
179
|
+
*
|
|
180
|
+
* console.log(msg.toString());
|
|
181
|
+
* });
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
96
184
|
subscribe(id, topic, callback) {
|
|
97
185
|
const expandedTopic = this.expandTopic(id, topic);
|
|
98
186
|
// No valid topic returned, we're done.
|
|
@@ -106,7 +194,24 @@ export class MqttClient {
|
|
|
106
194
|
// By default, we subscribe as: pluginTopicPrefix/id/topic
|
|
107
195
|
this.mqtt?.subscribe(expandedTopic);
|
|
108
196
|
}
|
|
109
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Subscribes to a '<topic>/get' topic and publishes a value in response to "true" messages.
|
|
199
|
+
*
|
|
200
|
+
* When a message "true" is received on the '<topic>/get' topic, this method will publish the result of `getValue()` on the main topic. The log will record each status
|
|
201
|
+
* publication event.
|
|
202
|
+
*
|
|
203
|
+
* @param id - The device or accessory identifier.
|
|
204
|
+
* @param topic - The topic name to use.
|
|
205
|
+
* @param type - A human-readable label for log messages (e.g., "Temperature").
|
|
206
|
+
* @param getValue - Function to get the value to publish as a string.
|
|
207
|
+
* @param log - Optional logger for status output. Defaults to the class logger.
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
*
|
|
211
|
+
* ```ts
|
|
212
|
+
* mqtt.subscribeGet("device1", "temperature", "Temperature", () => "21.5");
|
|
213
|
+
* ```
|
|
214
|
+
*/
|
|
110
215
|
subscribeGet(id, topic, type, getValue, log = this.log) {
|
|
111
216
|
// Return the current status of a given sensor.
|
|
112
217
|
this.subscribe(id, topic + "/get", (message) => {
|
|
@@ -119,7 +224,27 @@ export class MqttClient {
|
|
|
119
224
|
log.info("MQTT: %s status published.", type);
|
|
120
225
|
});
|
|
121
226
|
}
|
|
122
|
-
|
|
227
|
+
/**
|
|
228
|
+
* Subscribes to a '<topic>/set' topic and calls a setter when a message is received.
|
|
229
|
+
*
|
|
230
|
+
* The `setValue` function is called with both a normalized value and the raw string. Handles both synchronous and promise-based setters. Logs when set messages are
|
|
231
|
+
* received and when errors occur.
|
|
232
|
+
*
|
|
233
|
+
* @param id - The device or accessory identifier.
|
|
234
|
+
* @param topic - The topic name to use.
|
|
235
|
+
* @param type - A human-readable label for log messages (e.g., "Switch").
|
|
236
|
+
* @param setValue - Function to call when a value is set. Can be synchronous or return a Promise.
|
|
237
|
+
* @param log - Optional logger for status output. Defaults to the class logger.
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
*
|
|
241
|
+
* ```ts
|
|
242
|
+
* mqtt.subscribeSet("device1", "switch", "Switch", (value) => {
|
|
243
|
+
*
|
|
244
|
+
* console.log("Switch set to", value);
|
|
245
|
+
* });
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
123
248
|
subscribeSet(id, topic, type, setValue, log = this.log) {
|
|
124
249
|
// Return the current status of a given sensor.
|
|
125
250
|
this.subscribe(id, topic + "/set", (message) => {
|
|
@@ -136,7 +261,18 @@ export class MqttClient {
|
|
|
136
261
|
logResult();
|
|
137
262
|
});
|
|
138
263
|
}
|
|
139
|
-
|
|
264
|
+
/**
|
|
265
|
+
* Unsubscribes from a topic for a specific device, removing its message handler.
|
|
266
|
+
*
|
|
267
|
+
* @param id - The device or accessory identifier.
|
|
268
|
+
* @param topic - The topic name to unsubscribe from.
|
|
269
|
+
*
|
|
270
|
+
* @example
|
|
271
|
+
*
|
|
272
|
+
* ```ts
|
|
273
|
+
* mqtt.unsubscribe("device1", "status");
|
|
274
|
+
* ```
|
|
275
|
+
*/
|
|
140
276
|
unsubscribe(id, topic) {
|
|
141
277
|
const expandedTopic = this.expandTopic(id, topic);
|
|
142
278
|
// No valid topic returned, we're done.
|
|
@@ -145,7 +281,23 @@ export class MqttClient {
|
|
|
145
281
|
}
|
|
146
282
|
delete this.subscriptions[expandedTopic];
|
|
147
283
|
}
|
|
148
|
-
|
|
284
|
+
/**
|
|
285
|
+
* Expands a topic string into a fully-formed topic path including the prefix and device ID.
|
|
286
|
+
*
|
|
287
|
+
* Returns `null` if the device ID is missing or empty.
|
|
288
|
+
*
|
|
289
|
+
* @param id - The device or accessory identifier.
|
|
290
|
+
* @param topic - The topic name to expand.
|
|
291
|
+
*
|
|
292
|
+
* @returns The expanded topic string, or `null` if the ID is missing.
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
*
|
|
296
|
+
* ```ts
|
|
297
|
+
* const topic = mqtt['expandTopic']("device1", "status");
|
|
298
|
+
* // topic = "homebridge/device1/status"
|
|
299
|
+
* ```
|
|
300
|
+
*/
|
|
149
301
|
expandTopic(id, topic) {
|
|
150
302
|
// No id, we're done.
|
|
151
303
|
if (!id) {
|
package/dist/mqttclient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mqttclient.js","sourceRoot":"","sources":["../src/mqttclient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mqttclient.js","sourceRoot":"","sources":["../src/mqttclient.ts"],"names":[],"mappings":"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"}
|
package/dist/service.d.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Homebridge service helper utilities.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { HAP, PlatformAccessory, Service, WithUUID } from "homebridge";
|
|
7
|
+
import { type Nullable } from "./util.js";
|
|
3
8
|
/**
|
|
4
9
|
* Utility method that either creates a new service on an accessory, if needed, or returns an existing one. It optionally executes a callback to initialize a new
|
|
5
10
|
* instance of a service, if needed. Additionally, the various name characteristics of the service will be set to the specified name, optionally adding them as needed.
|
|
11
|
+
*
|
|
6
12
|
* @param hap - HAP instance associated with the Homebridge plugin.
|
|
7
13
|
* @param accessory - Homebridge accessory to check.
|
|
8
14
|
* @param serviceType - Service type that is being instantiated or retrieved.
|
|
@@ -19,6 +25,7 @@ import { Nullable } from "./util.js";
|
|
|
19
25
|
export declare function acquireService(hap: HAP, accessory: PlatformAccessory, serviceType: WithUUID<typeof Service>, name: string, subtype?: string, onServiceCreate?: (svc: Service) => void): Nullable<Service>;
|
|
20
26
|
/**
|
|
21
27
|
* Validate whether a service should exist, removing it if needed.
|
|
28
|
+
*
|
|
22
29
|
* @param accessory - Homebridge accessory to check.
|
|
23
30
|
* @param serviceType - Service type that is being instantiated or retrieved.
|
|
24
31
|
* @param validate - Function to be used to test whether a service should exist or not.
|
package/dist/service.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
/* Copyright(C) 2017-2025, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* service.ts: Useful Homebridge service support functions.
|
|
4
|
+
*/
|
|
1
5
|
import { validateName } from "./util.js";
|
|
2
6
|
/**
|
|
3
7
|
* Utility method that either creates a new service on an accessory, if needed, or returns an existing one. It optionally executes a callback to initialize a new
|
|
4
8
|
* instance of a service, if needed. Additionally, the various name characteristics of the service will be set to the specified name, optionally adding them as needed.
|
|
9
|
+
*
|
|
5
10
|
* @param hap - HAP instance associated with the Homebridge plugin.
|
|
6
11
|
* @param accessory - Homebridge accessory to check.
|
|
7
12
|
* @param serviceType - Service type that is being instantiated or retrieved.
|
|
@@ -68,6 +73,7 @@ export function acquireService(hap, accessory, serviceType, name, subtype, onSer
|
|
|
68
73
|
}
|
|
69
74
|
/**
|
|
70
75
|
* Validate whether a service should exist, removing it if needed.
|
|
76
|
+
*
|
|
71
77
|
* @param accessory - Homebridge accessory to check.
|
|
72
78
|
* @param serviceType - Service type that is being instantiated or retrieved.
|
|
73
79
|
* @param validate - Function to be used to test whether a service should exist or not.
|
package/dist/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,71 @@
|
|
|
1
|
+
/* Copyright(C) 2017-2025, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* featureoptions.ts: Hierarchical feature option capabilities for use in plugins and applications.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* FeatureOptions provides a hierarchical feature option system for plugins and applications.
|
|
7
|
+
*
|
|
8
|
+
* Supports global, controller, and device-level configuration, value-centric feature options, grouping, and category management.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* // Define categories and options.
|
|
14
|
+
* const categories = [
|
|
15
|
+
*
|
|
16
|
+
* { name: "motion", description: "Motion Options" },
|
|
17
|
+
* { name: "audio", description: "Audio Options" }
|
|
18
|
+
* ];
|
|
19
|
+
*
|
|
20
|
+
* const options = {
|
|
21
|
+
*
|
|
22
|
+
* motion: [
|
|
23
|
+
* { name: "detect", default: true, description: "Enable motion detection." }
|
|
24
|
+
* ],
|
|
25
|
+
*
|
|
26
|
+
* audio: [
|
|
27
|
+
* { name: "volume", default: false, defaultValue: 50, description: "Audio volume." }
|
|
28
|
+
* ]
|
|
29
|
+
* };
|
|
30
|
+
*
|
|
31
|
+
* // Instantiate FeatureOptions.
|
|
32
|
+
* const featureOpts = new FeatureOptions(categories, options, ["Enable.motion.detect"]);
|
|
33
|
+
*
|
|
34
|
+
* // Check if a feature is enabled.
|
|
35
|
+
* const motionEnabled = featureOpts.test("motion.detect");
|
|
36
|
+
*
|
|
37
|
+
* // Get a value-centric feature option.
|
|
38
|
+
* const volume = featureOpts.value("audio.volume");
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @see FeatureOptionEntry
|
|
42
|
+
* @see FeatureCategoryEntry
|
|
43
|
+
* @see OptionScope
|
|
44
|
+
*/
|
|
1
45
|
export class FeatureOptions {
|
|
46
|
+
/**
|
|
47
|
+
* Default return value for unknown options (defaults to false).
|
|
48
|
+
*/
|
|
49
|
+
defaultReturnValue;
|
|
2
50
|
_categories;
|
|
3
51
|
_configuredOptions;
|
|
4
52
|
_groups;
|
|
5
53
|
_options;
|
|
6
|
-
defaultReturnValue;
|
|
7
54
|
defaults;
|
|
8
55
|
valueOptions;
|
|
9
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Create a new FeatureOptions instance.
|
|
58
|
+
*
|
|
59
|
+
* @param categories - Array of feature option categories.
|
|
60
|
+
* @param options - Dictionary mapping category names to arrays of feature options.
|
|
61
|
+
* @param configuredOptions - Optional. Array of currently configured option strings.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
*
|
|
65
|
+
* ```ts
|
|
66
|
+
* const featureOpts = new FeatureOptions(categories, options, ["Enable.motion.detect"]);
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
10
69
|
constructor(categories, options, configuredOptions = []) {
|
|
11
70
|
// Initialize our defaults.
|
|
12
71
|
this._categories = [];
|
|
@@ -200,9 +259,9 @@ export class FeatureOptions {
|
|
|
200
259
|
// Check to see if we have a device-level value first.
|
|
201
260
|
if (device) {
|
|
202
261
|
const value = getValue(option, device);
|
|
203
|
-
// The option
|
|
262
|
+
// The option's been explicitly disabled.
|
|
204
263
|
if (value === null) {
|
|
205
|
-
return
|
|
264
|
+
return null;
|
|
206
265
|
}
|
|
207
266
|
if (value) {
|
|
208
267
|
return value;
|
|
@@ -213,7 +272,7 @@ export class FeatureOptions {
|
|
|
213
272
|
const value = getValue(option, controller);
|
|
214
273
|
// The option's been explicitly disabled.
|
|
215
274
|
if (value === null) {
|
|
216
|
-
return
|
|
275
|
+
return null;
|
|
217
276
|
}
|
|
218
277
|
if (value) {
|
|
219
278
|
return value;
|
|
@@ -242,7 +301,7 @@ export class FeatureOptions {
|
|
|
242
301
|
/**
|
|
243
302
|
* Set the list of available feature option categories.
|
|
244
303
|
*
|
|
245
|
-
* @param
|
|
304
|
+
* @param category - Array of available categories.
|
|
246
305
|
*/
|
|
247
306
|
set categories(category) {
|
|
248
307
|
this._categories = category;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureoptions.js","sourceRoot":"","sources":["../src/featureoptions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"featureoptions.js","sourceRoot":"","sources":["../src/featureoptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -157,14 +157,14 @@ export class webUiFeatureOptions {
|
|
|
157
157
|
overrideStyles.innerHTML = "td { color: unset !important }";
|
|
158
158
|
|
|
159
159
|
// We emulate the styles that Bootstrap uses when hovering over a table, accounting for both light and dark modes.
|
|
160
|
-
overrideStyles.innerHTML += "@media (prefers-color-scheme: dark) { .
|
|
161
|
-
"@media (prefers-color-scheme: light) { .
|
|
160
|
+
overrideStyles.innerHTML += "@media (prefers-color-scheme: dark) { .hbpu-hover td:hover { background-color: #212121; color: #FFA000 !important } }" +
|
|
161
|
+
"@media (prefers-color-scheme: light) { .hbpu-hover td:hover { background-color: #ECECEC; } }";
|
|
162
162
|
|
|
163
163
|
document.head.appendChild(overrideStyles);
|
|
164
164
|
|
|
165
165
|
// Add our hover styles to the controllers and devices tables.
|
|
166
|
-
controllersTable.classList.add("
|
|
167
|
-
this.devicesTable.classList.add("
|
|
166
|
+
controllersTable.classList.add("hbpu-hover");
|
|
167
|
+
this.devicesTable.classList.add("hbpu-hover");
|
|
168
168
|
|
|
169
169
|
// Hide the UI until we're ready.
|
|
170
170
|
document.getElementById("sidebar").style.display = "none";
|
|
@@ -182,6 +182,7 @@ export class webUiFeatureOptions {
|
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
// Initialize our informational header.
|
|
185
|
+
document.getElementById("headerInfo").style.fontWeight = "bold";
|
|
185
186
|
document.getElementById("headerInfo").innerHTML = "Feature options are applied in prioritized order, from global to device-specific options:" +
|
|
186
187
|
"<br><i class=\"text-warning\">Global options</i> (lowest priority) → " +
|
|
187
188
|
(this.#hasControllers ? "<i class=\"text-success\">Controller options</i> → " : "") +
|