@camstack/ui-library 1.2.226 → 1.2.228
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/composites/device-item/quick-detail-action.d.ts +6 -0
- package/dist/composites/device-list/generic-mode.d.ts +5 -0
- package/dist/composites/device-picker/SelectedChip.d.ts +3 -1
- package/dist/composites/index.d.ts +4 -0
- package/dist/composites/notification-targets-field.d.ts +66 -0
- package/dist/composites/notification-targets-options.d.ts +11 -0
- package/dist/composites/option-select/OptionSelect.d.ts +30 -0
- package/dist/composites/option-select/index.d.ts +4 -0
- package/dist/composites/option-select/option-select-model.d.ts +56 -0
- package/dist/contexts/device-quick-detail.d.ts +9 -0
- package/dist/generated/system-hooks.d.ts +22 -2
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/use-url-query.d.ts +5 -0
- package/dist/index.cjs +1150 -311
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1123 -311
- package/dist/primitives/badge.d.ts +1 -1
- package/dist/primitives/button.d.ts +1 -1
- package/dist/primitives/icon-button.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -6738,8 +6738,10 @@ var useButtonPress = trpc.button.press.useMutation;
|
|
|
6738
6738
|
var useCalendarsListCalendars = trpc.calendars.listCalendars.useQuery;
|
|
6739
6739
|
/** Generated alias around `trpc.calendars.listEvents.useQuery`. */
|
|
6740
6740
|
var useCalendarsListEvents = trpc.calendars.listEvents.useQuery;
|
|
6741
|
-
/** Generated alias around `trpc.calendars.
|
|
6742
|
-
var
|
|
6741
|
+
/** Generated alias around `trpc.calendars.getPreferences.useQuery`. */
|
|
6742
|
+
var useCalendarsGetPreferences = trpc.calendars.getPreferences.useQuery;
|
|
6743
|
+
/** Generated alias around `trpc.calendars.setCalendarPreference.useMutation`. */
|
|
6744
|
+
var useCalendarsSetCalendarPreference = trpc.calendars.setCalendarPreference.useMutation;
|
|
6743
6745
|
/** Generated alias around `trpc.cameraCredentials.getCredentials.useQuery`. */
|
|
6744
6746
|
var useCameraCredentialsGetCredentials = trpc.cameraCredentials.getCredentials.useQuery;
|
|
6745
6747
|
/** Generated alias around `trpc.cameraCredentials.getStatus.useQuery`. */
|
|
@@ -6826,6 +6828,10 @@ var useCoreBlocksSetEnabled = trpc.coreBlocks.setEnabled.useMutation;
|
|
|
6826
6828
|
var useCoreBlocksRestart = trpc.coreBlocks.restart.useMutation;
|
|
6827
6829
|
/** Generated alias around `trpc.coreBlocks.compile.useMutation`. */
|
|
6828
6830
|
var useCoreBlocksCompile = trpc.coreBlocks.compile.useMutation;
|
|
6831
|
+
/** Generated alias around `trpc.coreBlocks.getBlockSettings.useQuery`. */
|
|
6832
|
+
var useCoreBlocksGetBlockSettings = trpc.coreBlocks.getBlockSettings.useQuery;
|
|
6833
|
+
/** Generated alias around `trpc.coreBlocks.updateBlockSettings.useMutation`. */
|
|
6834
|
+
var useCoreBlocksUpdateBlockSettings = trpc.coreBlocks.updateBlockSettings.useMutation;
|
|
6829
6835
|
/** Generated alias around `trpc.coreBlocks.getTypeDefs.useQuery`. */
|
|
6830
6836
|
var useCoreBlocksGetTypeDefs = trpc.coreBlocks.getTypeDefs.useQuery;
|
|
6831
6837
|
/** Generated alias around `trpc.coreBlocks.createComposition.useMutation`. */
|
|
@@ -7566,8 +7572,12 @@ var useNodesExecuteQuery = trpc.nodes.executeQuery.useMutation;
|
|
|
7566
7572
|
var useNotificationOutputListTargetKinds = trpc.notificationOutput.listTargetKinds.useQuery;
|
|
7567
7573
|
/** Generated alias around `trpc.notificationOutput.listTargets.useQuery`. */
|
|
7568
7574
|
var useNotificationOutputListTargets = trpc.notificationOutput.listTargets.useQuery;
|
|
7575
|
+
/** Generated alias around `trpc.notificationOutput.getTarget.useQuery`. */
|
|
7576
|
+
var useNotificationOutputGetTarget = trpc.notificationOutput.getTarget.useQuery;
|
|
7569
7577
|
/** Generated alias around `trpc.notificationOutput.discoverTargets.useQuery`. */
|
|
7570
7578
|
var useNotificationOutputDiscoverTargets = trpc.notificationOutput.discoverTargets.useQuery;
|
|
7579
|
+
/** Generated alias around `trpc.notificationOutput.probeTargetConfig.useMutation`. */
|
|
7580
|
+
var useNotificationOutputProbeTargetConfig = trpc.notificationOutput.probeTargetConfig.useMutation;
|
|
7571
7581
|
/** Generated alias around `trpc.notificationOutput.send.useMutation`. */
|
|
7572
7582
|
var useNotificationOutputSend = trpc.notificationOutput.send.useMutation;
|
|
7573
7583
|
/** Generated alias around `trpc.notificationOutput.testTarget.useMutation`. */
|
|
@@ -7590,6 +7600,16 @@ var useNotificationRulesUpdateRule = trpc.notificationRules.updateRule.useMutati
|
|
|
7590
7600
|
var useNotificationRulesDeleteRule = trpc.notificationRules.deleteRule.useMutation;
|
|
7591
7601
|
/** Generated alias around `trpc.notificationRules.setRuleEnabled.useMutation`. */
|
|
7592
7602
|
var useNotificationRulesSetRuleEnabled = trpc.notificationRules.setRuleEnabled.useMutation;
|
|
7603
|
+
/** Generated alias around `trpc.notificationRules.listSequences.useQuery`. */
|
|
7604
|
+
var useNotificationRulesListSequences = trpc.notificationRules.listSequences.useQuery;
|
|
7605
|
+
/** Generated alias around `trpc.notificationRules.getSequence.useQuery`. */
|
|
7606
|
+
var useNotificationRulesGetSequence = trpc.notificationRules.getSequence.useQuery;
|
|
7607
|
+
/** Generated alias around `trpc.notificationRules.createSequence.useMutation`. */
|
|
7608
|
+
var useNotificationRulesCreateSequence = trpc.notificationRules.createSequence.useMutation;
|
|
7609
|
+
/** Generated alias around `trpc.notificationRules.updateSequence.useMutation`. */
|
|
7610
|
+
var useNotificationRulesUpdateSequence = trpc.notificationRules.updateSequence.useMutation;
|
|
7611
|
+
/** Generated alias around `trpc.notificationRules.deleteSequence.useMutation`. */
|
|
7612
|
+
var useNotificationRulesDeleteSequence = trpc.notificationRules.deleteSequence.useMutation;
|
|
7593
7613
|
/** Generated alias around `trpc.notificationRules.getClipRetentionAsks.useQuery`. */
|
|
7594
7614
|
var useNotificationRulesGetClipRetentionAsks = trpc.notificationRules.getClipRetentionAsks.useQuery;
|
|
7595
7615
|
/** Generated alias around `trpc.notificationRules.listDeviceMutes.useQuery`. */
|
|
@@ -12352,8 +12372,8 @@ function selectedDeviceOptions(options, selected) {
|
|
|
12352
12372
|
*/
|
|
12353
12373
|
var INPUT_CLASS$1 = "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-xs text-foreground focus:border-primary focus:ring-1 focus:ring-primary/30 outline-none disabled:opacity-50 disabled:cursor-not-allowed";
|
|
12354
12374
|
var INPUT_SHELL$1 = "flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1.5 focus-within:border-primary focus-within:ring-1 focus-within:ring-primary/30";
|
|
12355
|
-
var LABEL_CLASS$
|
|
12356
|
-
var DESC_CLASS$
|
|
12375
|
+
var LABEL_CLASS$3 = "block text-[11px] font-medium text-foreground mb-1 break-words";
|
|
12376
|
+
var DESC_CLASS$2 = "text-[10px] text-foreground-subtle mt-0.5 break-words";
|
|
12357
12377
|
/** The compact projection of the listAll rows the device fields consume. */
|
|
12358
12378
|
function toCandidates(rows) {
|
|
12359
12379
|
if (!Array.isArray(rows)) return [];
|
|
@@ -12440,14 +12460,14 @@ function FacetDropdown$1({ label, values, chosen, onChange }) {
|
|
|
12440
12460
|
})]
|
|
12441
12461
|
})] });
|
|
12442
12462
|
}
|
|
12443
|
-
function FieldShell({ label, description, required, translationFn, children }) {
|
|
12463
|
+
function FieldShell$1({ label, description, required, translationFn, children }) {
|
|
12444
12464
|
const resolvedLabel = resolveLabel(label, translationFn);
|
|
12445
12465
|
const resolvedDescription = resolveLabel(description, translationFn);
|
|
12446
12466
|
return /* @__PURE__ */ jsxs("div", {
|
|
12447
12467
|
className: "min-w-0",
|
|
12448
12468
|
children: [
|
|
12449
12469
|
resolvedLabel !== void 0 && resolvedLabel !== "" && /* @__PURE__ */ jsxs("label", {
|
|
12450
|
-
className: LABEL_CLASS$
|
|
12470
|
+
className: LABEL_CLASS$3,
|
|
12451
12471
|
children: [resolvedLabel, required && /* @__PURE__ */ jsx("span", {
|
|
12452
12472
|
className: "text-danger ml-0.5",
|
|
12453
12473
|
children: "*"
|
|
@@ -12455,7 +12475,7 @@ function FieldShell({ label, description, required, translationFn, children }) {
|
|
|
12455
12475
|
}),
|
|
12456
12476
|
children,
|
|
12457
12477
|
resolvedDescription && /* @__PURE__ */ jsx("p", {
|
|
12458
|
-
className: DESC_CLASS$
|
|
12478
|
+
className: DESC_CLASS$2,
|
|
12459
12479
|
children: resolvedDescription
|
|
12460
12480
|
})
|
|
12461
12481
|
]
|
|
@@ -12465,7 +12485,7 @@ function DeviceSelectField({ field, value, onChange, disabled, translationFn })
|
|
|
12465
12485
|
const { data } = useDeviceManagerListAll({});
|
|
12466
12486
|
const options = useMemo(() => devicesToOptions(toCandidates(data), field.deviceFilter), [data, field.deviceFilter]);
|
|
12467
12487
|
const current = value === void 0 || value === null ? "" : String(value);
|
|
12468
|
-
return /* @__PURE__ */ jsx(FieldShell, {
|
|
12488
|
+
return /* @__PURE__ */ jsx(FieldShell$1, {
|
|
12469
12489
|
label: field.label,
|
|
12470
12490
|
description: field.description,
|
|
12471
12491
|
required: field.required,
|
|
@@ -12543,7 +12563,7 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
|
|
|
12543
12563
|
className: "min-w-0",
|
|
12544
12564
|
children: [
|
|
12545
12565
|
label !== void 0 && label !== "" && /* @__PURE__ */ jsx("label", {
|
|
12546
|
-
className: LABEL_CLASS$
|
|
12566
|
+
className: LABEL_CLASS$3,
|
|
12547
12567
|
children: label
|
|
12548
12568
|
}),
|
|
12549
12569
|
selectedOptions.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
@@ -12666,6 +12686,720 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
|
|
|
12666
12686
|
})
|
|
12667
12687
|
}),
|
|
12668
12688
|
description && /* @__PURE__ */ jsx("p", {
|
|
12689
|
+
className: DESC_CLASS$2,
|
|
12690
|
+
children: description
|
|
12691
|
+
})
|
|
12692
|
+
]
|
|
12693
|
+
});
|
|
12694
|
+
}
|
|
12695
|
+
//#endregion
|
|
12696
|
+
//#region ../../node_modules/class-variance-authority/dist/index.mjs
|
|
12697
|
+
/**
|
|
12698
|
+
* Copyright 2022 Joe Bell. All rights reserved.
|
|
12699
|
+
*
|
|
12700
|
+
* This file is licensed to you under the Apache License, Version 2.0
|
|
12701
|
+
* (the "License"); you may not use this file except in compliance with the
|
|
12702
|
+
* License. You may obtain a copy of the License at
|
|
12703
|
+
*
|
|
12704
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12705
|
+
*
|
|
12706
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12707
|
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
12708
|
+
* WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the
|
|
12709
|
+
* License for the specific language governing permissions and limitations under
|
|
12710
|
+
* the License.
|
|
12711
|
+
*/ var falsyToString = (value) => typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
|
|
12712
|
+
var cx = clsx;
|
|
12713
|
+
var cva = (base, config) => (props) => {
|
|
12714
|
+
var _config_compoundVariants;
|
|
12715
|
+
if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
12716
|
+
const { variants, defaultVariants } = config;
|
|
12717
|
+
const getVariantClassNames = Object.keys(variants).map((variant) => {
|
|
12718
|
+
const variantProp = props === null || props === void 0 ? void 0 : props[variant];
|
|
12719
|
+
const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
|
|
12720
|
+
if (variantProp === null) return null;
|
|
12721
|
+
const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
|
|
12722
|
+
return variants[variant][variantKey];
|
|
12723
|
+
});
|
|
12724
|
+
const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param) => {
|
|
12725
|
+
let [key, value] = param;
|
|
12726
|
+
if (value === void 0) return acc;
|
|
12727
|
+
acc[key] = value;
|
|
12728
|
+
return acc;
|
|
12729
|
+
}, {});
|
|
12730
|
+
return cx(base, getVariantClassNames, config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param) => {
|
|
12731
|
+
let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
|
|
12732
|
+
return Object.entries(compoundVariantOptions).every((param) => {
|
|
12733
|
+
let [key, value] = param;
|
|
12734
|
+
return Array.isArray(value) ? value.includes({
|
|
12735
|
+
...defaultVariants,
|
|
12736
|
+
...propsWithoutUndefined
|
|
12737
|
+
}[key]) : {
|
|
12738
|
+
...defaultVariants,
|
|
12739
|
+
...propsWithoutUndefined
|
|
12740
|
+
}[key] === value;
|
|
12741
|
+
}) ? [
|
|
12742
|
+
...acc,
|
|
12743
|
+
cvClass,
|
|
12744
|
+
cvClassName
|
|
12745
|
+
] : acc;
|
|
12746
|
+
}, []), props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
12747
|
+
};
|
|
12748
|
+
//#endregion
|
|
12749
|
+
//#region src/primitives/badge.tsx
|
|
12750
|
+
var badgeVariants = cva("inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5", {
|
|
12751
|
+
variants: {
|
|
12752
|
+
variant: {
|
|
12753
|
+
default: "bg-surface-hover text-foreground",
|
|
12754
|
+
success: "bg-success/15 text-success",
|
|
12755
|
+
warning: "bg-warning/15 text-warning",
|
|
12756
|
+
danger: "bg-danger/15 text-danger",
|
|
12757
|
+
info: "bg-info/15 text-info"
|
|
12758
|
+
},
|
|
12759
|
+
styleVariant: {
|
|
12760
|
+
solid: "",
|
|
12761
|
+
outline: "border bg-transparent"
|
|
12762
|
+
}
|
|
12763
|
+
},
|
|
12764
|
+
defaultVariants: {
|
|
12765
|
+
variant: "default",
|
|
12766
|
+
styleVariant: "solid"
|
|
12767
|
+
}
|
|
12768
|
+
});
|
|
12769
|
+
var Badge = forwardRef(({ className, variant, style, ...props }, ref) => {
|
|
12770
|
+
return /* @__PURE__ */ jsx("span", {
|
|
12771
|
+
ref,
|
|
12772
|
+
className: cn(badgeVariants({
|
|
12773
|
+
variant,
|
|
12774
|
+
styleVariant: style
|
|
12775
|
+
}), className),
|
|
12776
|
+
...props
|
|
12777
|
+
});
|
|
12778
|
+
});
|
|
12779
|
+
Badge.displayName = "Badge";
|
|
12780
|
+
//#endregion
|
|
12781
|
+
//#region src/composites/event-kind-visuals.tsx
|
|
12782
|
+
/**
|
|
12783
|
+
* Event-kind VISUALS — the UI-side half of the unified taxonomy dictionary
|
|
12784
|
+
* (`@camstack/types` `EVENT_TAXONOMY` owns the serializable data:
|
|
12785
|
+
* color / iconId / labelKey; this owns `iconId → lucide component` and
|
|
12786
|
+
* `labelKey → t()`).
|
|
12787
|
+
*
|
|
12788
|
+
* Every UI that renders an event kind (timeline, events tree, chips,
|
|
12789
|
+
* detection canvas/tree) resolves its glyph + translated label here — no
|
|
12790
|
+
* per-component hardcoded icon or label.
|
|
12791
|
+
*/
|
|
12792
|
+
/**
|
|
12793
|
+
* `iconId` → lucide component. Built ONLY from statically-imported icons
|
|
12794
|
+
* (bundle-safe). Unknown ids resolve to the neutral `Tag` fallback.
|
|
12795
|
+
*/
|
|
12796
|
+
var EVENT_KIND_ICONS = {
|
|
12797
|
+
motion: Activity,
|
|
12798
|
+
audio: Volume2,
|
|
12799
|
+
person: User,
|
|
12800
|
+
vehicle: Car,
|
|
12801
|
+
animal: PawPrint,
|
|
12802
|
+
package: Package,
|
|
12803
|
+
sensor: Radio,
|
|
12804
|
+
control: SlidersHorizontal,
|
|
12805
|
+
car: Car,
|
|
12806
|
+
truck: Truck,
|
|
12807
|
+
bus: Bus,
|
|
12808
|
+
motorcycle: Bike,
|
|
12809
|
+
bicycle: Bike,
|
|
12810
|
+
airplane: Plane,
|
|
12811
|
+
boat: Sailboat,
|
|
12812
|
+
train: TrainFront,
|
|
12813
|
+
bird: Bird,
|
|
12814
|
+
cat: Cat,
|
|
12815
|
+
dog: Dog,
|
|
12816
|
+
horse: PawPrint,
|
|
12817
|
+
sheep: PawPrint,
|
|
12818
|
+
cow: PawPrint,
|
|
12819
|
+
elephant: PawPrint,
|
|
12820
|
+
bear: PawPrint,
|
|
12821
|
+
zebra: PawPrint,
|
|
12822
|
+
giraffe: PawPrint,
|
|
12823
|
+
door: DoorOpen,
|
|
12824
|
+
pir: Radar,
|
|
12825
|
+
smoke: Flame,
|
|
12826
|
+
water: Droplet,
|
|
12827
|
+
gas: Wind,
|
|
12828
|
+
vibration: Vibrate,
|
|
12829
|
+
tamper: ShieldAlert,
|
|
12830
|
+
presence: UserCheck,
|
|
12831
|
+
generic: Tag,
|
|
12832
|
+
lock: Lock,
|
|
12833
|
+
siren: Siren,
|
|
12834
|
+
switch: ToggleRight,
|
|
12835
|
+
doorbell: BellRing,
|
|
12836
|
+
button: CircleDot,
|
|
12837
|
+
"audio-speech": MessageSquare,
|
|
12838
|
+
"audio-scream": Megaphone,
|
|
12839
|
+
"audio-crying": Baby,
|
|
12840
|
+
"audio-laughter": Laugh,
|
|
12841
|
+
"audio-music": Music,
|
|
12842
|
+
"audio-dog": Dog,
|
|
12843
|
+
"audio-cat": Cat,
|
|
12844
|
+
"audio-bird": Bird,
|
|
12845
|
+
"audio-animal": PawPrint,
|
|
12846
|
+
"audio-alarm": BellRing,
|
|
12847
|
+
"audio-doorbell": BellRing,
|
|
12848
|
+
"audio-glass_breaking": TriangleAlert,
|
|
12849
|
+
"audio-gunshot": Crosshair,
|
|
12850
|
+
"audio-vehicle": Car,
|
|
12851
|
+
"audio-siren": Siren,
|
|
12852
|
+
"audio-fire": Flame,
|
|
12853
|
+
"audio-water": Droplets,
|
|
12854
|
+
"audio-wind": Wind,
|
|
12855
|
+
"audio-door": DoorOpen,
|
|
12856
|
+
"audio-footsteps": Footprints,
|
|
12857
|
+
"audio-crowd": Users,
|
|
12858
|
+
"audio-telephone": Phone,
|
|
12859
|
+
"audio-engine": Cog,
|
|
12860
|
+
"audio-tools": Hammer,
|
|
12861
|
+
"audio-silence": VolumeX
|
|
12862
|
+
};
|
|
12863
|
+
/** Resolve an `iconId` to a lucide component (falls back to `Tag`). */
|
|
12864
|
+
function resolveEventKindIcon(iconId) {
|
|
12865
|
+
if (Object.hasOwn(EVENT_KIND_ICONS, iconId)) return EVENT_KIND_ICONS[iconId];
|
|
12866
|
+
if (iconId.startsWith("audio-")) return Volume2;
|
|
12867
|
+
return Tag;
|
|
12868
|
+
}
|
|
12869
|
+
/**
|
|
12870
|
+
* Translated label for an event kind — `t(labelKey)` when a translation
|
|
12871
|
+
* exists, else the English `label` fallback. Robust to a missing key: an
|
|
12872
|
+
* i18n backend that echoes the key unchanged (react-i18next default) is
|
|
12873
|
+
* treated as "no translation" and the fallback label is returned, so the UI
|
|
12874
|
+
* never renders a raw `eventKind.*` key.
|
|
12875
|
+
*/
|
|
12876
|
+
function eventKindLabel(descriptor, t) {
|
|
12877
|
+
if (t === void 0) return descriptor.label;
|
|
12878
|
+
const translated = t(descriptor.labelKey);
|
|
12879
|
+
return translated === descriptor.labelKey || translated.length === 0 ? descriptor.label : translated;
|
|
12880
|
+
}
|
|
12881
|
+
/** Small convenience component: renders the lucide glyph for an `iconId`. */
|
|
12882
|
+
function EventKindGlyph({ iconId, size = 16, color, className }) {
|
|
12883
|
+
return createElement(resolveEventKindIcon(iconId), {
|
|
12884
|
+
size,
|
|
12885
|
+
color,
|
|
12886
|
+
className
|
|
12887
|
+
});
|
|
12888
|
+
}
|
|
12889
|
+
//#endregion
|
|
12890
|
+
//#region src/composites/device-picker/SelectedChip.tsx
|
|
12891
|
+
/**
|
|
12892
|
+
* Removable selection chip + the search-box shell shared by DevicePicker and
|
|
12893
|
+
* SearchableMultiSelectField (admin-ui). Lives here so addon MFEs can render
|
|
12894
|
+
* the same picker without importing admin-ui.
|
|
12895
|
+
*/
|
|
12896
|
+
/** The search box's shell — shared with multiselect fields that mirror this picker. */
|
|
12897
|
+
var INPUT_SHELL = "flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1.5 focus-within:border-primary focus-within:ring-1 focus-within:ring-primary/30";
|
|
12898
|
+
/** One selected entry as a removable chip. */
|
|
12899
|
+
function SelectedChip({ label, onRemove, warning = false, iconId, iconUrl, testId }) {
|
|
12900
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
12901
|
+
"data-testid": testId,
|
|
12902
|
+
className: warning ? "inline-flex items-center gap-1 rounded-md bg-warning/10 px-1.5 py-0.5 text-[11px] text-warning max-w-full" : "inline-flex items-center gap-1 rounded-md bg-primary/10 px-1.5 py-0.5 text-[11px] text-primary max-w-full",
|
|
12903
|
+
children: [
|
|
12904
|
+
iconUrl !== void 0 ? /* @__PURE__ */ jsx("img", {
|
|
12905
|
+
src: iconUrl,
|
|
12906
|
+
alt: "",
|
|
12907
|
+
className: "h-3 w-3 shrink-0 rounded-sm object-contain"
|
|
12908
|
+
}) : iconId !== void 0 ? /* @__PURE__ */ jsx(EventKindGlyph, {
|
|
12909
|
+
iconId,
|
|
12910
|
+
size: 12
|
|
12911
|
+
}) : null,
|
|
12912
|
+
/* @__PURE__ */ jsx("span", {
|
|
12913
|
+
className: "truncate",
|
|
12914
|
+
children: label
|
|
12915
|
+
}),
|
|
12916
|
+
onRemove !== void 0 && /* @__PURE__ */ jsx("button", {
|
|
12917
|
+
type: "button",
|
|
12918
|
+
className: "shrink-0 hover:text-danger",
|
|
12919
|
+
"aria-label": `Remove ${label}`,
|
|
12920
|
+
onClick: onRemove,
|
|
12921
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
|
|
12922
|
+
})
|
|
12923
|
+
]
|
|
12924
|
+
});
|
|
12925
|
+
}
|
|
12926
|
+
//#endregion
|
|
12927
|
+
//#region src/composites/option-select/option-select-model.ts
|
|
12928
|
+
/** Number of options at/above which search is enabled by default (unless creatable). */
|
|
12929
|
+
var OPTION_SELECT_SEARCH_MIN_OPTIONS = 8;
|
|
12930
|
+
/** Fold an option into a single lower-cased haystack (value + label + description). */
|
|
12931
|
+
function optionSearchText(opt) {
|
|
12932
|
+
return [
|
|
12933
|
+
opt.value,
|
|
12934
|
+
opt.label,
|
|
12935
|
+
opt.description
|
|
12936
|
+
].filter((p) => typeof p === "string" && p.length > 0).join(" ").toLowerCase();
|
|
12937
|
+
}
|
|
12938
|
+
/**
|
|
12939
|
+
* Filter options by a free-text query. An empty / whitespace-only query
|
|
12940
|
+
* returns every option (identity, preserving order).
|
|
12941
|
+
*/
|
|
12942
|
+
function filterOptions(options, query) {
|
|
12943
|
+
const tokens = query.trim().toLowerCase().split(/\s+/).filter(Boolean);
|
|
12944
|
+
if (tokens.length === 0) return options;
|
|
12945
|
+
return options.filter((opt) => {
|
|
12946
|
+
const hay = optionSearchText(opt);
|
|
12947
|
+
return tokens.every((t) => hay.includes(t));
|
|
12948
|
+
});
|
|
12949
|
+
}
|
|
12950
|
+
/**
|
|
12951
|
+
* Split options into the currently-selected set (in selection order) and the
|
|
12952
|
+
* rest. Selected values with no matching option are surfaced as synthetic
|
|
12953
|
+
* options whose label falls back to the raw value.
|
|
12954
|
+
*/
|
|
12955
|
+
function partitionSelected(options, selected) {
|
|
12956
|
+
const byValue = new Map(options.map((o) => [o.value, o]));
|
|
12957
|
+
const selectedSet = new Set(selected);
|
|
12958
|
+
return {
|
|
12959
|
+
selectedOptions: selected.map((v) => byValue.get(v) ?? {
|
|
12960
|
+
value: v,
|
|
12961
|
+
label: v
|
|
12962
|
+
}),
|
|
12963
|
+
unselected: options.filter((o) => !selectedSet.has(o.value))
|
|
12964
|
+
};
|
|
12965
|
+
}
|
|
12966
|
+
function resolveSearchable(optionCount, creatable, searchable) {
|
|
12967
|
+
if (searchable !== void 0) return searchable;
|
|
12968
|
+
return optionCount >= 8 || creatable;
|
|
12969
|
+
}
|
|
12970
|
+
/** Trimmed non-empty draft from the search box, or null when absent. */
|
|
12971
|
+
function draftFromQuery(query) {
|
|
12972
|
+
const trimmed = query.trim();
|
|
12973
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
12974
|
+
}
|
|
12975
|
+
/**
|
|
12976
|
+
* True when an existing catalog option already represents this draft (value or
|
|
12977
|
+
* label, case-insensitive). Used to hide the “Use «query»” row when redundant.
|
|
12978
|
+
*/
|
|
12979
|
+
function catalogHasDraft(options, draft) {
|
|
12980
|
+
const lower = draft.toLowerCase();
|
|
12981
|
+
return options.some((o) => o.value.toLowerCase() === lower || o.label.toLowerCase() === lower);
|
|
12982
|
+
}
|
|
12983
|
+
/**
|
|
12984
|
+
* Show the footer “Add new…” action only when creatable AND the caller
|
|
12985
|
+
* provided `onCreateRequest` (e.g. open a dedicated create dialog).
|
|
12986
|
+
*
|
|
12987
|
+
* Without that hook the footer was a no-op (it only focused the search box),
|
|
12988
|
+
* which read as “Add new is broken”. Free-form create already works via the
|
|
12989
|
+
* “Use «query»” row once the operator types — no footer needed.
|
|
12990
|
+
*/
|
|
12991
|
+
function shouldShowAddNewFooter(creatable, hasCreateRequest) {
|
|
12992
|
+
return creatable && hasCreateRequest;
|
|
12993
|
+
}
|
|
12994
|
+
/**
|
|
12995
|
+
* Show the “Use «query»” commit row: creatable, a non-empty draft, and no
|
|
12996
|
+
* catalog option that already matches the draft.
|
|
12997
|
+
*/
|
|
12998
|
+
function shouldShowUseQueryRow(creatable, query, options) {
|
|
12999
|
+
if (!creatable) return false;
|
|
13000
|
+
const draft = draftFromQuery(query);
|
|
13001
|
+
if (draft === null) return false;
|
|
13002
|
+
return !catalogHasDraft(options, draft);
|
|
13003
|
+
}
|
|
13004
|
+
//#endregion
|
|
13005
|
+
//#region src/composites/option-select/OptionSelect.tsx
|
|
13006
|
+
var LISTBOX_GAP_PX = 4;
|
|
13007
|
+
var LISTBOX_MAX_HEIGHT_PX = 224;
|
|
13008
|
+
var VIEWPORT_MARGIN_PX = 8;
|
|
13009
|
+
var LABEL_CLASS$2 = "block text-[11px] font-medium text-foreground mb-1 break-words";
|
|
13010
|
+
var DESC_CLASS$1 = "text-[10px] text-foreground-subtle mt-0.5 break-words";
|
|
13011
|
+
function OptionIcon({ opt }) {
|
|
13012
|
+
if (opt.iconUrl !== void 0) return /* @__PURE__ */ jsx("img", {
|
|
13013
|
+
src: opt.iconUrl,
|
|
13014
|
+
alt: "",
|
|
13015
|
+
className: "h-3.5 w-3.5 shrink-0 rounded-sm object-contain"
|
|
13016
|
+
});
|
|
13017
|
+
if (opt.iconId !== void 0) return /* @__PURE__ */ jsx(EventKindGlyph, {
|
|
13018
|
+
iconId: opt.iconId,
|
|
13019
|
+
size: 13
|
|
13020
|
+
});
|
|
13021
|
+
return null;
|
|
13022
|
+
}
|
|
13023
|
+
function OptionSelect(props) {
|
|
13024
|
+
const { mode, options, placeholder = "Select…", disabled = false, emptyMessage = "No options available.", creatable = false, createLabel = "Add new…", onCreateRequest, label, description, testId, optionTestIdPrefix, listboxId: listboxIdProp } = props;
|
|
13025
|
+
const isDisabled = disabled;
|
|
13026
|
+
const searchable = resolveSearchable(options.length, creatable, props.searchable);
|
|
13027
|
+
const listboxId = listboxIdProp ?? testId ?? "option-select-listbox";
|
|
13028
|
+
const selectedValues = mode === "single" ? props.value.length > 0 ? [props.value] : [] : props.value;
|
|
13029
|
+
const maxItems = mode === "multi" ? props.maxItems : void 0;
|
|
13030
|
+
const atMax = mode === "multi" && maxItems !== void 0 && selectedValues.length >= maxItems;
|
|
13031
|
+
const [query, setQuery] = useState("");
|
|
13032
|
+
const [open, setOpen] = useState(false);
|
|
13033
|
+
const [highlight, setHighlight] = useState(0);
|
|
13034
|
+
const [coords, setCoords] = useState(null);
|
|
13035
|
+
const inputRef = useRef(null);
|
|
13036
|
+
const triggerRef = useRef(null);
|
|
13037
|
+
const listboxRef = useRef(null);
|
|
13038
|
+
const blurTimer = useRef(null);
|
|
13039
|
+
const computeListboxCoords = () => {
|
|
13040
|
+
const trigger = triggerRef.current;
|
|
13041
|
+
if (trigger === null) return null;
|
|
13042
|
+
const rect = trigger.getBoundingClientRect();
|
|
13043
|
+
const spaceBelow = window.innerHeight - rect.bottom - VIEWPORT_MARGIN_PX;
|
|
13044
|
+
const spaceAbove = rect.top - VIEWPORT_MARGIN_PX;
|
|
13045
|
+
const preferBelow = spaceBelow >= Math.min(LISTBOX_MAX_HEIGHT_PX, spaceAbove) || spaceBelow >= 120;
|
|
13046
|
+
const maxHeight = Math.max(96, Math.min(LISTBOX_MAX_HEIGHT_PX, preferBelow ? spaceBelow : spaceAbove));
|
|
13047
|
+
const left = Math.max(VIEWPORT_MARGIN_PX, Math.min(rect.left, window.innerWidth - rect.width - VIEWPORT_MARGIN_PX));
|
|
13048
|
+
if (preferBelow) return {
|
|
13049
|
+
top: rect.bottom + LISTBOX_GAP_PX,
|
|
13050
|
+
left,
|
|
13051
|
+
width: rect.width,
|
|
13052
|
+
maxHeight,
|
|
13053
|
+
placement: "below"
|
|
13054
|
+
};
|
|
13055
|
+
return {
|
|
13056
|
+
top: Math.max(VIEWPORT_MARGIN_PX, rect.top - LISTBOX_GAP_PX - maxHeight),
|
|
13057
|
+
left,
|
|
13058
|
+
width: rect.width,
|
|
13059
|
+
maxHeight,
|
|
13060
|
+
placement: "above"
|
|
13061
|
+
};
|
|
13062
|
+
};
|
|
13063
|
+
const { selectedOptions } = useMemo(() => partitionSelected(options, selectedValues), [options, selectedValues]);
|
|
13064
|
+
const filtered = useMemo(() => filterOptions(options, query), [options, query]);
|
|
13065
|
+
const showUseQuery = shouldShowUseQueryRow(creatable, query, options);
|
|
13066
|
+
const showAddNewFooter = shouldShowAddNewFooter(creatable, onCreateRequest !== void 0);
|
|
13067
|
+
const dropdownRows = useMemo(() => {
|
|
13068
|
+
const rows = filtered.map((opt, index) => ({
|
|
13069
|
+
kind: "option",
|
|
13070
|
+
opt,
|
|
13071
|
+
index
|
|
13072
|
+
}));
|
|
13073
|
+
if (showUseQuery) {
|
|
13074
|
+
const draft = draftFromQuery(query);
|
|
13075
|
+
if (draft !== null) rows.push({
|
|
13076
|
+
kind: "use-query",
|
|
13077
|
+
draft
|
|
13078
|
+
});
|
|
13079
|
+
}
|
|
13080
|
+
return rows;
|
|
13081
|
+
}, [
|
|
13082
|
+
filtered,
|
|
13083
|
+
showUseQuery,
|
|
13084
|
+
query
|
|
13085
|
+
]);
|
|
13086
|
+
useLayoutEffect(() => {
|
|
13087
|
+
if (!open || isDisabled) {
|
|
13088
|
+
setCoords(null);
|
|
13089
|
+
return;
|
|
13090
|
+
}
|
|
13091
|
+
const update = () => {
|
|
13092
|
+
setCoords(computeListboxCoords());
|
|
13093
|
+
};
|
|
13094
|
+
update();
|
|
13095
|
+
window.addEventListener("resize", update);
|
|
13096
|
+
window.addEventListener("scroll", update, true);
|
|
13097
|
+
return () => {
|
|
13098
|
+
window.removeEventListener("resize", update);
|
|
13099
|
+
window.removeEventListener("scroll", update, true);
|
|
13100
|
+
};
|
|
13101
|
+
}, [
|
|
13102
|
+
open,
|
|
13103
|
+
isDisabled,
|
|
13104
|
+
selectedValues.length,
|
|
13105
|
+
query,
|
|
13106
|
+
dropdownRows.length
|
|
13107
|
+
]);
|
|
13108
|
+
useEffect(() => {
|
|
13109
|
+
if (!open) return;
|
|
13110
|
+
const onPointer = (e) => {
|
|
13111
|
+
const target = e.target;
|
|
13112
|
+
if (listboxRef.current?.contains(target)) return;
|
|
13113
|
+
if (triggerRef.current?.contains(target)) return;
|
|
13114
|
+
setOpen(false);
|
|
13115
|
+
};
|
|
13116
|
+
document.addEventListener("mousedown", onPointer);
|
|
13117
|
+
return () => {
|
|
13118
|
+
document.removeEventListener("mousedown", onPointer);
|
|
13119
|
+
};
|
|
13120
|
+
}, [open]);
|
|
13121
|
+
const commitDraft = (draft) => {
|
|
13122
|
+
const trimmed = draft.trim();
|
|
13123
|
+
if (trimmed.length === 0) return;
|
|
13124
|
+
if (onCreateRequest !== void 0) {
|
|
13125
|
+
onCreateRequest(trimmed);
|
|
13126
|
+
setQuery("");
|
|
13127
|
+
setOpen(false);
|
|
13128
|
+
return;
|
|
13129
|
+
}
|
|
13130
|
+
if (mode === "single") {
|
|
13131
|
+
props.onChange(trimmed);
|
|
13132
|
+
setQuery("");
|
|
13133
|
+
setOpen(false);
|
|
13134
|
+
return;
|
|
13135
|
+
}
|
|
13136
|
+
if (props.value.includes(trimmed)) return;
|
|
13137
|
+
if (maxItems !== void 0 && props.value.length >= maxItems) return;
|
|
13138
|
+
props.onChange([...props.value, trimmed]);
|
|
13139
|
+
setQuery("");
|
|
13140
|
+
};
|
|
13141
|
+
const toggleMulti = (optValue) => {
|
|
13142
|
+
if (mode !== "multi" || isDisabled) return;
|
|
13143
|
+
if (props.value.includes(optValue)) props.onChange(props.value.filter((v) => v !== optValue));
|
|
13144
|
+
else {
|
|
13145
|
+
if (maxItems !== void 0 && props.value.length >= maxItems) return;
|
|
13146
|
+
props.onChange([...props.value, optValue]);
|
|
13147
|
+
}
|
|
13148
|
+
};
|
|
13149
|
+
const selectSingle = (optValue) => {
|
|
13150
|
+
if (mode !== "single" || isDisabled) return;
|
|
13151
|
+
props.onChange(optValue);
|
|
13152
|
+
setQuery("");
|
|
13153
|
+
setOpen(false);
|
|
13154
|
+
};
|
|
13155
|
+
const activateRow = (row) => {
|
|
13156
|
+
if (row.kind === "option") {
|
|
13157
|
+
if (row.opt.disabled === true) return;
|
|
13158
|
+
if (mode === "single") selectSingle(row.opt.value);
|
|
13159
|
+
else toggleMulti(row.opt.value);
|
|
13160
|
+
} else if (row.kind === "use-query") commitDraft(row.draft);
|
|
13161
|
+
};
|
|
13162
|
+
const rowCount = dropdownRows.length + (showAddNewFooter && !showUseQuery ? 1 : 0);
|
|
13163
|
+
const handleKeyDown = (e) => {
|
|
13164
|
+
if (e.key === "ArrowDown") {
|
|
13165
|
+
e.preventDefault();
|
|
13166
|
+
setOpen(true);
|
|
13167
|
+
setHighlight((h) => rowCount === 0 ? 0 : (h + 1) % rowCount);
|
|
13168
|
+
} else if (e.key === "ArrowUp") {
|
|
13169
|
+
e.preventDefault();
|
|
13170
|
+
setOpen(true);
|
|
13171
|
+
setHighlight((h) => rowCount === 0 ? 0 : (h - 1 + rowCount) % rowCount);
|
|
13172
|
+
} else if (e.key === "Enter") {
|
|
13173
|
+
e.preventDefault();
|
|
13174
|
+
if (showUseQuery && highlight === dropdownRows.length) {
|
|
13175
|
+
const draft = draftFromQuery(query);
|
|
13176
|
+
if (draft !== null) commitDraft(draft);
|
|
13177
|
+
return;
|
|
13178
|
+
}
|
|
13179
|
+
if (showAddNewFooter && !showUseQuery && highlight === dropdownRows.length) {
|
|
13180
|
+
inputRef.current?.focus();
|
|
13181
|
+
return;
|
|
13182
|
+
}
|
|
13183
|
+
const row = dropdownRows[highlight];
|
|
13184
|
+
if (row) activateRow(row);
|
|
13185
|
+
else if (creatable) {
|
|
13186
|
+
const draft = draftFromQuery(query);
|
|
13187
|
+
if (draft !== null) commitDraft(draft);
|
|
13188
|
+
}
|
|
13189
|
+
} else if (e.key === "Escape") setOpen(false);
|
|
13190
|
+
else if (e.key === "Backspace" && query === "" && mode === "multi" && props.value.length > 0) props.onChange(props.value.slice(0, -1));
|
|
13191
|
+
};
|
|
13192
|
+
const handleNonSearchKeyDown = (e) => {
|
|
13193
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
13194
|
+
e.preventDefault();
|
|
13195
|
+
setOpen((o) => !o);
|
|
13196
|
+
} else if (e.key === "Escape") setOpen(false);
|
|
13197
|
+
};
|
|
13198
|
+
const removeChip = (value) => {
|
|
13199
|
+
if (mode === "single") props.onChange("");
|
|
13200
|
+
else props.onChange(props.value.filter((v) => v !== value));
|
|
13201
|
+
};
|
|
13202
|
+
const triggerPlaceholder = atMax === true ? `Max ${maxItems} selected` : placeholder;
|
|
13203
|
+
const showEmptyCatalog = options.length === 0 && !showUseQuery && dropdownRows.length === 0 && open;
|
|
13204
|
+
let dropdownBody;
|
|
13205
|
+
if (showEmptyCatalog) dropdownBody = /* @__PURE__ */ jsx("div", {
|
|
13206
|
+
className: "px-2.5 py-2 text-[11px] text-foreground-subtle",
|
|
13207
|
+
children: emptyMessage
|
|
13208
|
+
});
|
|
13209
|
+
else if (dropdownRows.length === 0 && !creatable) dropdownBody = /* @__PURE__ */ jsxs("div", {
|
|
13210
|
+
className: "px-2.5 py-2 text-[11px] text-foreground-subtle italic",
|
|
13211
|
+
children: [
|
|
13212
|
+
"No matches for “",
|
|
13213
|
+
query,
|
|
13214
|
+
"”"
|
|
13215
|
+
]
|
|
13216
|
+
});
|
|
13217
|
+
else dropdownBody = /* @__PURE__ */ jsx(Fragment$1, { children: dropdownRows.map((row, i) => {
|
|
13218
|
+
if (row.kind === "use-query") return /* @__PURE__ */ jsxs("button", {
|
|
13219
|
+
type: "button",
|
|
13220
|
+
role: "option",
|
|
13221
|
+
"aria-selected": false,
|
|
13222
|
+
className: [
|
|
13223
|
+
"flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs transition-colors",
|
|
13224
|
+
i === highlight ? "bg-primary/10" : "hover:bg-surface-hover",
|
|
13225
|
+
"cursor-pointer"
|
|
13226
|
+
].join(" "),
|
|
13227
|
+
onMouseEnter: () => setHighlight(i),
|
|
13228
|
+
onClick: () => commitDraft(row.draft),
|
|
13229
|
+
children: [/* @__PURE__ */ jsx(Plus, { className: "h-3.5 w-3.5 shrink-0 text-primary" }), /* @__PURE__ */ jsxs("span", {
|
|
13230
|
+
className: "truncate text-foreground",
|
|
13231
|
+
children: [
|
|
13232
|
+
"Use “",
|
|
13233
|
+
row.draft,
|
|
13234
|
+
"”"
|
|
13235
|
+
]
|
|
13236
|
+
})]
|
|
13237
|
+
}, "__use-query__");
|
|
13238
|
+
if (row.kind !== "option") return null;
|
|
13239
|
+
const { opt } = row;
|
|
13240
|
+
const checked = mode === "single" ? props.value === opt.value : props.value.includes(opt.value);
|
|
13241
|
+
const blockedByMax = mode === "multi" && !checked && atMax === true;
|
|
13242
|
+
const optionDisabled = opt.disabled === true || blockedByMax;
|
|
13243
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
13244
|
+
type: "button",
|
|
13245
|
+
role: "option",
|
|
13246
|
+
"aria-selected": checked,
|
|
13247
|
+
disabled: optionDisabled,
|
|
13248
|
+
"data-testid": optionTestIdPrefix !== void 0 ? `${optionTestIdPrefix}-${opt.value}` : void 0,
|
|
13249
|
+
className: [
|
|
13250
|
+
"flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs transition-colors",
|
|
13251
|
+
i === highlight ? "bg-primary/10" : "hover:bg-surface-hover",
|
|
13252
|
+
optionDisabled ? "opacity-40 cursor-not-allowed" : "cursor-pointer"
|
|
13253
|
+
].join(" "),
|
|
13254
|
+
onMouseEnter: () => setHighlight(i),
|
|
13255
|
+
onClick: () => activateRow(row),
|
|
13256
|
+
children: [
|
|
13257
|
+
/* @__PURE__ */ jsx("span", {
|
|
13258
|
+
className: ["flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded border", checked ? "border-primary bg-primary text-white" : "border-border"].join(" "),
|
|
13259
|
+
children: checked && /* @__PURE__ */ jsx(Check, { className: "h-2.5 w-2.5" })
|
|
13260
|
+
}),
|
|
13261
|
+
/* @__PURE__ */ jsx(OptionIcon, { opt }),
|
|
13262
|
+
/* @__PURE__ */ jsx("span", {
|
|
13263
|
+
className: "min-w-0 flex-1 truncate text-foreground",
|
|
13264
|
+
children: opt.label
|
|
13265
|
+
}),
|
|
13266
|
+
opt.badge !== void 0 && opt.badge.length > 0 ? /* @__PURE__ */ jsx(Badge, {
|
|
13267
|
+
variant: "default",
|
|
13268
|
+
children: opt.badge
|
|
13269
|
+
}) : null
|
|
13270
|
+
]
|
|
13271
|
+
}, opt.value);
|
|
13272
|
+
}) });
|
|
13273
|
+
const footerAddNewIndex = dropdownRows.length;
|
|
13274
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
13275
|
+
className: "min-w-0 space-y-1",
|
|
13276
|
+
"data-testid": testId,
|
|
13277
|
+
children: [
|
|
13278
|
+
label !== void 0 && label.length > 0 && /* @__PURE__ */ jsx("label", {
|
|
13279
|
+
className: LABEL_CLASS$2,
|
|
13280
|
+
children: label
|
|
13281
|
+
}),
|
|
13282
|
+
mode === "multi" && selectedOptions.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
13283
|
+
className: "flex flex-wrap gap-1 mb-1.5",
|
|
13284
|
+
children: selectedOptions.map((opt) => /* @__PURE__ */ jsx(SelectedChip, {
|
|
13285
|
+
label: opt.label,
|
|
13286
|
+
...opt.iconUrl !== void 0 ? { iconUrl: opt.iconUrl } : {},
|
|
13287
|
+
...opt.iconId !== void 0 ? { iconId: opt.iconId } : {},
|
|
13288
|
+
...!isDisabled ? { onRemove: () => removeChip(opt.value) } : {},
|
|
13289
|
+
...optionTestIdPrefix !== void 0 ? { testId: `${optionTestIdPrefix}-chip-${opt.value}` } : {}
|
|
13290
|
+
}, opt.value))
|
|
13291
|
+
}),
|
|
13292
|
+
mode === "single" && selectedOptions.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
13293
|
+
className: "flex flex-wrap gap-1 mb-1.5",
|
|
13294
|
+
children: selectedOptions.map((opt) => /* @__PURE__ */ jsx(SelectedChip, {
|
|
13295
|
+
label: opt.label,
|
|
13296
|
+
...opt.iconUrl !== void 0 ? { iconUrl: opt.iconUrl } : {},
|
|
13297
|
+
...opt.iconId !== void 0 ? { iconId: opt.iconId } : {},
|
|
13298
|
+
...!isDisabled ? { onRemove: () => removeChip(opt.value) } : {}
|
|
13299
|
+
}, opt.value))
|
|
13300
|
+
}),
|
|
13301
|
+
searchable ? /* @__PURE__ */ jsxs("div", {
|
|
13302
|
+
ref: (el) => {
|
|
13303
|
+
triggerRef.current = el;
|
|
13304
|
+
},
|
|
13305
|
+
className: INPUT_SHELL + (isDisabled ? " opacity-50" : ""),
|
|
13306
|
+
children: [
|
|
13307
|
+
/* @__PURE__ */ jsx(Search, { className: "h-3.5 w-3.5 shrink-0 text-foreground-subtle" }),
|
|
13308
|
+
/* @__PURE__ */ jsx("input", {
|
|
13309
|
+
ref: inputRef,
|
|
13310
|
+
type: "text",
|
|
13311
|
+
role: "combobox",
|
|
13312
|
+
"aria-expanded": open,
|
|
13313
|
+
"aria-controls": listboxId,
|
|
13314
|
+
className: "min-w-0 flex-1 bg-transparent text-xs text-foreground outline-none placeholder:text-foreground-disabled",
|
|
13315
|
+
value: query,
|
|
13316
|
+
placeholder: triggerPlaceholder,
|
|
13317
|
+
disabled: isDisabled,
|
|
13318
|
+
onChange: (e) => {
|
|
13319
|
+
setQuery(e.target.value);
|
|
13320
|
+
setOpen(true);
|
|
13321
|
+
setHighlight(0);
|
|
13322
|
+
},
|
|
13323
|
+
onFocus: () => setOpen(true),
|
|
13324
|
+
onBlur: () => {
|
|
13325
|
+
blurTimer.current = setTimeout(() => {
|
|
13326
|
+
const active = document.activeElement;
|
|
13327
|
+
if (listboxRef.current?.contains(active)) return;
|
|
13328
|
+
setOpen(false);
|
|
13329
|
+
}, 120);
|
|
13330
|
+
},
|
|
13331
|
+
onKeyDown: handleKeyDown
|
|
13332
|
+
}),
|
|
13333
|
+
/* @__PURE__ */ jsx(ChevronDown, {
|
|
13334
|
+
className: "h-3.5 w-3.5 shrink-0 cursor-pointer text-foreground-subtle",
|
|
13335
|
+
onMouseDown: (e) => {
|
|
13336
|
+
e.preventDefault();
|
|
13337
|
+
if (blurTimer.current) clearTimeout(blurTimer.current);
|
|
13338
|
+
setOpen((o) => !o);
|
|
13339
|
+
inputRef.current?.focus();
|
|
13340
|
+
}
|
|
13341
|
+
})
|
|
13342
|
+
]
|
|
13343
|
+
}) : /* @__PURE__ */ jsxs("button", {
|
|
13344
|
+
ref: (el) => {
|
|
13345
|
+
triggerRef.current = el;
|
|
13346
|
+
},
|
|
13347
|
+
type: "button",
|
|
13348
|
+
role: "combobox",
|
|
13349
|
+
"aria-expanded": open,
|
|
13350
|
+
"aria-controls": listboxId,
|
|
13351
|
+
disabled: isDisabled,
|
|
13352
|
+
className: [
|
|
13353
|
+
INPUT_SHELL,
|
|
13354
|
+
"w-full justify-between text-xs text-foreground",
|
|
13355
|
+
isDisabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"
|
|
13356
|
+
].join(" "),
|
|
13357
|
+
onClick: () => !isDisabled && setOpen((o) => !o),
|
|
13358
|
+
onKeyDown: handleNonSearchKeyDown,
|
|
13359
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
13360
|
+
className: "truncate text-foreground-subtle",
|
|
13361
|
+
children: selectedOptions[0]?.label ?? triggerPlaceholder
|
|
13362
|
+
}), /* @__PURE__ */ jsx(ChevronDown, { className: "h-3.5 w-3.5 shrink-0 text-foreground-subtle" })]
|
|
13363
|
+
}),
|
|
13364
|
+
open && !isDisabled && coords !== null && typeof document !== "undefined" && createPortal(/* @__PURE__ */ jsxs("div", {
|
|
13365
|
+
ref: listboxRef,
|
|
13366
|
+
id: listboxId,
|
|
13367
|
+
role: "listbox",
|
|
13368
|
+
style: {
|
|
13369
|
+
position: "fixed",
|
|
13370
|
+
top: coords.top,
|
|
13371
|
+
left: coords.left,
|
|
13372
|
+
width: coords.width,
|
|
13373
|
+
maxHeight: coords.maxHeight,
|
|
13374
|
+
zIndex: 9999
|
|
13375
|
+
},
|
|
13376
|
+
className: "overflow-y-auto rounded-md border border-border bg-surface shadow-lg",
|
|
13377
|
+
onMouseDown: (e) => {
|
|
13378
|
+
e.preventDefault();
|
|
13379
|
+
if (blurTimer.current) clearTimeout(blurTimer.current);
|
|
13380
|
+
},
|
|
13381
|
+
children: [dropdownBody, showAddNewFooter && /* @__PURE__ */ jsxs("button", {
|
|
13382
|
+
type: "button",
|
|
13383
|
+
className: [
|
|
13384
|
+
"flex w-full items-center gap-2 border-t border-border px-2.5 py-1.5 text-left text-xs transition-colors",
|
|
13385
|
+
footerAddNewIndex === highlight ? "bg-primary/10" : "hover:bg-surface-hover",
|
|
13386
|
+
"cursor-pointer text-primary"
|
|
13387
|
+
].join(" "),
|
|
13388
|
+
onMouseEnter: () => setHighlight(footerAddNewIndex),
|
|
13389
|
+
onClick: () => {
|
|
13390
|
+
const draft = draftFromQuery(query);
|
|
13391
|
+
if (draft !== null) {
|
|
13392
|
+
onCreateRequest?.(draft);
|
|
13393
|
+
setQuery("");
|
|
13394
|
+
setOpen(false);
|
|
13395
|
+
return;
|
|
13396
|
+
}
|
|
13397
|
+
inputRef.current?.focus();
|
|
13398
|
+
},
|
|
13399
|
+
children: [/* @__PURE__ */ jsx(Plus, { className: "h-3.5 w-3.5 shrink-0" }), createLabel]
|
|
13400
|
+
})]
|
|
13401
|
+
}), document.body),
|
|
13402
|
+
description !== void 0 && description.length > 0 && /* @__PURE__ */ jsx("p", {
|
|
12669
13403
|
className: DESC_CLASS$1,
|
|
12670
13404
|
children: description
|
|
12671
13405
|
})
|
|
@@ -12673,6 +13407,242 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
|
|
|
12673
13407
|
});
|
|
12674
13408
|
}
|
|
12675
13409
|
//#endregion
|
|
13410
|
+
//#region src/composites/notification-targets-options.ts
|
|
13411
|
+
function kindIconKey(addonId, kind) {
|
|
13412
|
+
return `${addonId}:${kind}`;
|
|
13413
|
+
}
|
|
13414
|
+
function targetsToOptions(targets, kindIconUrls, noteIds, noteLabel) {
|
|
13415
|
+
return targets.map((target) => {
|
|
13416
|
+
const iconUrl = target.addonId !== void 0 && target.kind !== void 0 ? kindIconUrls.get(kindIconKey(target.addonId, target.kind)) : void 0;
|
|
13417
|
+
let badge;
|
|
13418
|
+
if (noteIds?.has(target.id) === true) badge = noteLabel;
|
|
13419
|
+
else if (!target.enabled) badge = "disabled";
|
|
13420
|
+
return {
|
|
13421
|
+
value: target.id,
|
|
13422
|
+
label: target.name,
|
|
13423
|
+
...iconUrl !== void 0 ? { iconUrl } : {},
|
|
13424
|
+
...badge !== void 0 ? { badge } : {}
|
|
13425
|
+
};
|
|
13426
|
+
});
|
|
13427
|
+
}
|
|
13428
|
+
function buildKindIconMap(rows) {
|
|
13429
|
+
const map = /* @__PURE__ */ new Map();
|
|
13430
|
+
if (!Array.isArray(rows)) return map;
|
|
13431
|
+
for (const row of rows) {
|
|
13432
|
+
if (row === null || typeof row !== "object") continue;
|
|
13433
|
+
const kind = Reflect.get(row, "kind");
|
|
13434
|
+
const addonId = Reflect.get(row, "addonId");
|
|
13435
|
+
const iconUrl = Reflect.get(row, "iconUrl");
|
|
13436
|
+
if (typeof kind !== "string" || typeof addonId !== "string") continue;
|
|
13437
|
+
if (typeof iconUrl === "string" && iconUrl.length > 0) map.set(kindIconKey(addonId, kind), iconUrl);
|
|
13438
|
+
}
|
|
13439
|
+
return map;
|
|
13440
|
+
}
|
|
13441
|
+
function toTargetOptions(rows) {
|
|
13442
|
+
if (!Array.isArray(rows)) return [];
|
|
13443
|
+
const out = [];
|
|
13444
|
+
for (const row of rows) {
|
|
13445
|
+
if (row === null || typeof row !== "object") continue;
|
|
13446
|
+
const id = Reflect.get(row, "id");
|
|
13447
|
+
const name = Reflect.get(row, "name");
|
|
13448
|
+
const enabled = Reflect.get(row, "enabled");
|
|
13449
|
+
const kind = Reflect.get(row, "kind");
|
|
13450
|
+
const addonId = Reflect.get(row, "addonId");
|
|
13451
|
+
if (typeof id !== "string" || typeof name !== "string") continue;
|
|
13452
|
+
if (typeof kind !== "string" || typeof addonId !== "string") continue;
|
|
13453
|
+
out.push({
|
|
13454
|
+
id,
|
|
13455
|
+
name,
|
|
13456
|
+
enabled: enabled === true,
|
|
13457
|
+
kind,
|
|
13458
|
+
addonId
|
|
13459
|
+
});
|
|
13460
|
+
}
|
|
13461
|
+
return out;
|
|
13462
|
+
}
|
|
13463
|
+
//#endregion
|
|
13464
|
+
//#region src/composites/notification-targets-field.tsx
|
|
13465
|
+
/**
|
|
13466
|
+
* Shared notification-output target pickers.
|
|
13467
|
+
*
|
|
13468
|
+
* The Notification Center editors (Summaries, Timelapses, Rules, Calendar
|
|
13469
|
+
* events) and ConfigUISchema forms (script settings, addon settings) all
|
|
13470
|
+
* pick the same catalog — `notificationOutput.listTargets`. One presentational
|
|
13471
|
+
* control plus two ConfigUISchema wrappers so a script can declare
|
|
13472
|
+
* `notification-target-select` / `notification-target-multiselect` without
|
|
13473
|
+
* inventing a parallel picker.
|
|
13474
|
+
*
|
|
13475
|
+
* A DISABLED target is offered and marked, never hidden: it is a legitimate
|
|
13476
|
+
* choice (the operator re-enables it later), and hiding it would make a rule
|
|
13477
|
+
* whose only target is off look like a rule with no target at all.
|
|
13478
|
+
*
|
|
13479
|
+
* Single and multi both render through `OptionSelect` (dropdown + pills,
|
|
13480
|
+
* searchable, kind brand icons via `iconUrl`).
|
|
13481
|
+
*/
|
|
13482
|
+
var DEFAULT_EMPTY = "No delivery target is configured. Add one on the Targets tab first — without one the notification is rendered and thrown away.";
|
|
13483
|
+
/**
|
|
13484
|
+
* Multi-select of delivery targets (NC Summaries / Timelapses / Rules shape).
|
|
13485
|
+
*/
|
|
13486
|
+
function NotificationTargetsField({ targets, value, onChange, disabled = false, maxItems, testIdPrefix = "notification-target", emptyMessage = DEFAULT_EMPTY, noteIds, noteLabel = "note", label, description, kindIconUrls: kindIconUrlsProp }) {
|
|
13487
|
+
const kindsQuery = useNotificationOutputListTargetKinds({});
|
|
13488
|
+
const kindIconUrlsFromQuery = useMemo(() => buildKindIconMap(kindsQuery.data), [kindsQuery.data]);
|
|
13489
|
+
const kindIconUrls = kindIconUrlsProp ?? kindIconUrlsFromQuery;
|
|
13490
|
+
return /* @__PURE__ */ jsx(OptionSelect, {
|
|
13491
|
+
mode: "multi",
|
|
13492
|
+
options: useMemo(() => targetsToOptions(targets, kindIconUrls, noteIds, noteLabel), [
|
|
13493
|
+
targets,
|
|
13494
|
+
kindIconUrls,
|
|
13495
|
+
noteIds,
|
|
13496
|
+
noteLabel
|
|
13497
|
+
]),
|
|
13498
|
+
value,
|
|
13499
|
+
onChange,
|
|
13500
|
+
disabled,
|
|
13501
|
+
searchable: true,
|
|
13502
|
+
creatable: false,
|
|
13503
|
+
...maxItems !== void 0 ? { maxItems } : {},
|
|
13504
|
+
emptyMessage,
|
|
13505
|
+
placeholder: "Search targets…",
|
|
13506
|
+
label,
|
|
13507
|
+
description,
|
|
13508
|
+
testId: `${testIdPrefix}s`,
|
|
13509
|
+
optionTestIdPrefix: testIdPrefix,
|
|
13510
|
+
listboxId: `${testIdPrefix}-listbox`
|
|
13511
|
+
});
|
|
13512
|
+
}
|
|
13513
|
+
/**
|
|
13514
|
+
* Single-select of one delivery target (Calendar events / script settings).
|
|
13515
|
+
*/
|
|
13516
|
+
function NotificationTargetSelectField({ targets, value, onChange, disabled = false, emptyMessage = DEFAULT_EMPTY, placeholder = "Select…", testId = "notification-target-select", label, description, kindIconUrls: kindIconUrlsProp }) {
|
|
13517
|
+
const kindsQuery = useNotificationOutputListTargetKinds({});
|
|
13518
|
+
const kindIconUrlsFromQuery = useMemo(() => buildKindIconMap(kindsQuery.data), [kindsQuery.data]);
|
|
13519
|
+
const kindIconUrls = kindIconUrlsProp ?? kindIconUrlsFromQuery;
|
|
13520
|
+
return /* @__PURE__ */ jsx(OptionSelect, {
|
|
13521
|
+
mode: "single",
|
|
13522
|
+
options: useMemo(() => targetsToOptions(targets, kindIconUrls, void 0, "note"), [targets, kindIconUrls]),
|
|
13523
|
+
value,
|
|
13524
|
+
onChange,
|
|
13525
|
+
disabled,
|
|
13526
|
+
searchable: true,
|
|
13527
|
+
creatable: false,
|
|
13528
|
+
emptyMessage,
|
|
13529
|
+
placeholder,
|
|
13530
|
+
label,
|
|
13531
|
+
description,
|
|
13532
|
+
testId,
|
|
13533
|
+
optionTestIdPrefix: testId,
|
|
13534
|
+
listboxId: `${testId}-listbox`
|
|
13535
|
+
});
|
|
13536
|
+
}
|
|
13537
|
+
function FieldShell({ label, description, required, translationFn, children }) {
|
|
13538
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
13539
|
+
className: "space-y-1",
|
|
13540
|
+
children: [
|
|
13541
|
+
/* @__PURE__ */ jsxs("label", {
|
|
13542
|
+
className: "block text-[11px] font-medium text-foreground mb-1 break-words",
|
|
13543
|
+
children: [resolveLabel(label, translationFn), required === true ? /* @__PURE__ */ jsx("span", {
|
|
13544
|
+
className: "text-danger",
|
|
13545
|
+
children: " *"
|
|
13546
|
+
}) : null]
|
|
13547
|
+
}),
|
|
13548
|
+
children,
|
|
13549
|
+
description !== void 0 && /* @__PURE__ */ jsx("p", {
|
|
13550
|
+
className: "text-[10px] text-foreground-subtle mt-0.5 break-words",
|
|
13551
|
+
children: resolveLabel(description, translationFn)
|
|
13552
|
+
})
|
|
13553
|
+
]
|
|
13554
|
+
});
|
|
13555
|
+
}
|
|
13556
|
+
/**
|
|
13557
|
+
* ConfigUISchema `notification-target-multiselect` — fetches listTargets and
|
|
13558
|
+
* stores a `string[]` of target ids.
|
|
13559
|
+
*/
|
|
13560
|
+
function ConfigNotificationTargetMultiSelectFieldView({ field, value, onChange, disabled, translationFn }) {
|
|
13561
|
+
const targetsQuery = useNotificationOutputListTargets({});
|
|
13562
|
+
const kindsQuery = useNotificationOutputListTargetKinds({});
|
|
13563
|
+
const targets = useMemo(() => toTargetOptions(targetsQuery.data), [targetsQuery.data]);
|
|
13564
|
+
const kindIconUrls = useMemo(() => buildKindIconMap(kindsQuery.data), [kindsQuery.data]);
|
|
13565
|
+
const selected = Array.isArray(value) ? value.filter((v) => typeof v === "string") : typeof value === "string" && value.length > 0 ? [value] : [];
|
|
13566
|
+
const pending = targetsQuery.isPending || kindsQuery.isPending;
|
|
13567
|
+
const error = targetsQuery.isError ? targetsQuery.error : kindsQuery.isError ? kindsQuery.error : null;
|
|
13568
|
+
if (pending) return /* @__PURE__ */ jsx(FieldShell, {
|
|
13569
|
+
label: field.label,
|
|
13570
|
+
description: field.description,
|
|
13571
|
+
required: field.required,
|
|
13572
|
+
translationFn,
|
|
13573
|
+
children: /* @__PURE__ */ jsx("p", {
|
|
13574
|
+
className: "text-[11px] text-foreground-subtle",
|
|
13575
|
+
children: "Loading targets…"
|
|
13576
|
+
})
|
|
13577
|
+
});
|
|
13578
|
+
if (error !== null) return /* @__PURE__ */ jsx(FieldShell, {
|
|
13579
|
+
label: field.label,
|
|
13580
|
+
description: field.description,
|
|
13581
|
+
required: field.required,
|
|
13582
|
+
translationFn,
|
|
13583
|
+
children: /* @__PURE__ */ jsxs("p", {
|
|
13584
|
+
className: "text-[11px] text-danger",
|
|
13585
|
+
children: ["Could not load targets: ", error instanceof Error ? error.message : String(error)]
|
|
13586
|
+
})
|
|
13587
|
+
});
|
|
13588
|
+
return /* @__PURE__ */ jsx(NotificationTargetsField, {
|
|
13589
|
+
targets,
|
|
13590
|
+
value: selected,
|
|
13591
|
+
onChange: (next) => onChange(next),
|
|
13592
|
+
disabled: disabled === true || field.disabled === true,
|
|
13593
|
+
...field.maxItems !== void 0 ? { maxItems: field.maxItems } : {},
|
|
13594
|
+
kindIconUrls,
|
|
13595
|
+
label: resolveLabel(field.label, translationFn),
|
|
13596
|
+
description: field.description !== void 0 ? resolveLabel(field.description, translationFn) : void 0,
|
|
13597
|
+
emptyMessage: "No delivery target is configured. Add one under Notification Center → Targets first.",
|
|
13598
|
+
testIdPrefix: `config-target-${field.key}`
|
|
13599
|
+
});
|
|
13600
|
+
}
|
|
13601
|
+
/**
|
|
13602
|
+
* ConfigUISchema `notification-target-select` — fetches listTargets and stores
|
|
13603
|
+
* one target id string.
|
|
13604
|
+
*/
|
|
13605
|
+
function ConfigNotificationTargetSelectFieldView({ field, value, onChange, disabled, translationFn }) {
|
|
13606
|
+
const targetsQuery = useNotificationOutputListTargets({});
|
|
13607
|
+
const kindsQuery = useNotificationOutputListTargetKinds({});
|
|
13608
|
+
const targets = useMemo(() => toTargetOptions(targetsQuery.data), [targetsQuery.data]);
|
|
13609
|
+
const kindIconUrls = useMemo(() => buildKindIconMap(kindsQuery.data), [kindsQuery.data]);
|
|
13610
|
+
const current = typeof value === "string" ? value : "";
|
|
13611
|
+
const pending = targetsQuery.isPending || kindsQuery.isPending;
|
|
13612
|
+
const error = targetsQuery.isError ? targetsQuery.error : kindsQuery.isError ? kindsQuery.error : null;
|
|
13613
|
+
if (pending) return /* @__PURE__ */ jsx(FieldShell, {
|
|
13614
|
+
label: field.label,
|
|
13615
|
+
description: field.description,
|
|
13616
|
+
required: field.required,
|
|
13617
|
+
translationFn,
|
|
13618
|
+
children: /* @__PURE__ */ jsx("p", {
|
|
13619
|
+
className: "text-[11px] text-foreground-subtle",
|
|
13620
|
+
children: "Loading targets…"
|
|
13621
|
+
})
|
|
13622
|
+
});
|
|
13623
|
+
if (error !== null) return /* @__PURE__ */ jsx(FieldShell, {
|
|
13624
|
+
label: field.label,
|
|
13625
|
+
description: field.description,
|
|
13626
|
+
required: field.required,
|
|
13627
|
+
translationFn,
|
|
13628
|
+
children: /* @__PURE__ */ jsxs("p", {
|
|
13629
|
+
className: "text-[11px] text-danger",
|
|
13630
|
+
children: ["Could not load targets: ", error instanceof Error ? error.message : String(error)]
|
|
13631
|
+
})
|
|
13632
|
+
});
|
|
13633
|
+
return /* @__PURE__ */ jsx(NotificationTargetSelectField, {
|
|
13634
|
+
targets,
|
|
13635
|
+
value: current,
|
|
13636
|
+
onChange: (next) => onChange(next),
|
|
13637
|
+
disabled: disabled === true || field.disabled === true,
|
|
13638
|
+
kindIconUrls,
|
|
13639
|
+
label: resolveLabel(field.label, translationFn),
|
|
13640
|
+
description: field.description !== void 0 ? resolveLabel(field.description, translationFn) : void 0,
|
|
13641
|
+
emptyMessage: "No delivery target is configured. Add one under Notification Center → Targets first.",
|
|
13642
|
+
testId: `config-target-${field.key}`
|
|
13643
|
+
});
|
|
13644
|
+
}
|
|
13645
|
+
//#endregion
|
|
12676
13646
|
//#region src/contexts/custom-field-renderers.tsx
|
|
12677
13647
|
/**
|
|
12678
13648
|
* Custom field renderer registry.
|
|
@@ -12726,115 +13696,6 @@ function useCustomFieldRenderer(type) {
|
|
|
12726
13696
|
return useContext(CustomFieldRenderersContext)[type] ?? null;
|
|
12727
13697
|
}
|
|
12728
13698
|
//#endregion
|
|
12729
|
-
//#region src/composites/event-kind-visuals.tsx
|
|
12730
|
-
/**
|
|
12731
|
-
* Event-kind VISUALS — the UI-side half of the unified taxonomy dictionary
|
|
12732
|
-
* (`@camstack/types` `EVENT_TAXONOMY` owns the serializable data:
|
|
12733
|
-
* color / iconId / labelKey; this owns `iconId → lucide component` and
|
|
12734
|
-
* `labelKey → t()`).
|
|
12735
|
-
*
|
|
12736
|
-
* Every UI that renders an event kind (timeline, events tree, chips,
|
|
12737
|
-
* detection canvas/tree) resolves its glyph + translated label here — no
|
|
12738
|
-
* per-component hardcoded icon or label.
|
|
12739
|
-
*/
|
|
12740
|
-
/**
|
|
12741
|
-
* `iconId` → lucide component. Built ONLY from statically-imported icons
|
|
12742
|
-
* (bundle-safe). Unknown ids resolve to the neutral `Tag` fallback.
|
|
12743
|
-
*/
|
|
12744
|
-
var EVENT_KIND_ICONS = {
|
|
12745
|
-
motion: Activity,
|
|
12746
|
-
audio: Volume2,
|
|
12747
|
-
person: User,
|
|
12748
|
-
vehicle: Car,
|
|
12749
|
-
animal: PawPrint,
|
|
12750
|
-
package: Package,
|
|
12751
|
-
sensor: Radio,
|
|
12752
|
-
control: SlidersHorizontal,
|
|
12753
|
-
car: Car,
|
|
12754
|
-
truck: Truck,
|
|
12755
|
-
bus: Bus,
|
|
12756
|
-
motorcycle: Bike,
|
|
12757
|
-
bicycle: Bike,
|
|
12758
|
-
airplane: Plane,
|
|
12759
|
-
boat: Sailboat,
|
|
12760
|
-
train: TrainFront,
|
|
12761
|
-
bird: Bird,
|
|
12762
|
-
cat: Cat,
|
|
12763
|
-
dog: Dog,
|
|
12764
|
-
horse: PawPrint,
|
|
12765
|
-
sheep: PawPrint,
|
|
12766
|
-
cow: PawPrint,
|
|
12767
|
-
elephant: PawPrint,
|
|
12768
|
-
bear: PawPrint,
|
|
12769
|
-
zebra: PawPrint,
|
|
12770
|
-
giraffe: PawPrint,
|
|
12771
|
-
door: DoorOpen,
|
|
12772
|
-
pir: Radar,
|
|
12773
|
-
smoke: Flame,
|
|
12774
|
-
water: Droplet,
|
|
12775
|
-
gas: Wind,
|
|
12776
|
-
vibration: Vibrate,
|
|
12777
|
-
tamper: ShieldAlert,
|
|
12778
|
-
presence: UserCheck,
|
|
12779
|
-
generic: Tag,
|
|
12780
|
-
lock: Lock,
|
|
12781
|
-
siren: Siren,
|
|
12782
|
-
switch: ToggleRight,
|
|
12783
|
-
doorbell: BellRing,
|
|
12784
|
-
button: CircleDot,
|
|
12785
|
-
"audio-speech": MessageSquare,
|
|
12786
|
-
"audio-scream": Megaphone,
|
|
12787
|
-
"audio-crying": Baby,
|
|
12788
|
-
"audio-laughter": Laugh,
|
|
12789
|
-
"audio-music": Music,
|
|
12790
|
-
"audio-dog": Dog,
|
|
12791
|
-
"audio-cat": Cat,
|
|
12792
|
-
"audio-bird": Bird,
|
|
12793
|
-
"audio-animal": PawPrint,
|
|
12794
|
-
"audio-alarm": BellRing,
|
|
12795
|
-
"audio-doorbell": BellRing,
|
|
12796
|
-
"audio-glass_breaking": TriangleAlert,
|
|
12797
|
-
"audio-gunshot": Crosshair,
|
|
12798
|
-
"audio-vehicle": Car,
|
|
12799
|
-
"audio-siren": Siren,
|
|
12800
|
-
"audio-fire": Flame,
|
|
12801
|
-
"audio-water": Droplets,
|
|
12802
|
-
"audio-wind": Wind,
|
|
12803
|
-
"audio-door": DoorOpen,
|
|
12804
|
-
"audio-footsteps": Footprints,
|
|
12805
|
-
"audio-crowd": Users,
|
|
12806
|
-
"audio-telephone": Phone,
|
|
12807
|
-
"audio-engine": Cog,
|
|
12808
|
-
"audio-tools": Hammer,
|
|
12809
|
-
"audio-silence": VolumeX
|
|
12810
|
-
};
|
|
12811
|
-
/** Resolve an `iconId` to a lucide component (falls back to `Tag`). */
|
|
12812
|
-
function resolveEventKindIcon(iconId) {
|
|
12813
|
-
if (Object.hasOwn(EVENT_KIND_ICONS, iconId)) return EVENT_KIND_ICONS[iconId];
|
|
12814
|
-
if (iconId.startsWith("audio-")) return Volume2;
|
|
12815
|
-
return Tag;
|
|
12816
|
-
}
|
|
12817
|
-
/**
|
|
12818
|
-
* Translated label for an event kind — `t(labelKey)` when a translation
|
|
12819
|
-
* exists, else the English `label` fallback. Robust to a missing key: an
|
|
12820
|
-
* i18n backend that echoes the key unchanged (react-i18next default) is
|
|
12821
|
-
* treated as "no translation" and the fallback label is returned, so the UI
|
|
12822
|
-
* never renders a raw `eventKind.*` key.
|
|
12823
|
-
*/
|
|
12824
|
-
function eventKindLabel(descriptor, t) {
|
|
12825
|
-
if (t === void 0) return descriptor.label;
|
|
12826
|
-
const translated = t(descriptor.labelKey);
|
|
12827
|
-
return translated === descriptor.labelKey || translated.length === 0 ? descriptor.label : translated;
|
|
12828
|
-
}
|
|
12829
|
-
/** Small convenience component: renders the lucide glyph for an `iconId`. */
|
|
12830
|
-
function EventKindGlyph({ iconId, size = 16, color, className }) {
|
|
12831
|
-
return createElement(resolveEventKindIcon(iconId), {
|
|
12832
|
-
size,
|
|
12833
|
-
color,
|
|
12834
|
-
className
|
|
12835
|
-
});
|
|
12836
|
-
}
|
|
12837
|
-
//#endregion
|
|
12838
13699
|
//#region src/composites/confirm-dialog.tsx
|
|
12839
13700
|
/**
|
|
12840
13701
|
* The ONE modal dialog of the product — confirm, alert and prompt.
|
|
@@ -19082,59 +19943,6 @@ function useCapabilityPresence(capabilityName) {
|
|
|
19082
19943
|
return classifyCapability(query.data);
|
|
19083
19944
|
}
|
|
19084
19945
|
//#endregion
|
|
19085
|
-
//#region ../../node_modules/class-variance-authority/dist/index.mjs
|
|
19086
|
-
/**
|
|
19087
|
-
* Copyright 2022 Joe Bell. All rights reserved.
|
|
19088
|
-
*
|
|
19089
|
-
* This file is licensed to you under the Apache License, Version 2.0
|
|
19090
|
-
* (the "License"); you may not use this file except in compliance with the
|
|
19091
|
-
* License. You may obtain a copy of the License at
|
|
19092
|
-
*
|
|
19093
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
19094
|
-
*
|
|
19095
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
19096
|
-
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
19097
|
-
* WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the
|
|
19098
|
-
* License for the specific language governing permissions and limitations under
|
|
19099
|
-
* the License.
|
|
19100
|
-
*/ var falsyToString = (value) => typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
|
|
19101
|
-
var cx = clsx;
|
|
19102
|
-
var cva = (base, config) => (props) => {
|
|
19103
|
-
var _config_compoundVariants;
|
|
19104
|
-
if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
19105
|
-
const { variants, defaultVariants } = config;
|
|
19106
|
-
const getVariantClassNames = Object.keys(variants).map((variant) => {
|
|
19107
|
-
const variantProp = props === null || props === void 0 ? void 0 : props[variant];
|
|
19108
|
-
const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
|
|
19109
|
-
if (variantProp === null) return null;
|
|
19110
|
-
const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
|
|
19111
|
-
return variants[variant][variantKey];
|
|
19112
|
-
});
|
|
19113
|
-
const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param) => {
|
|
19114
|
-
let [key, value] = param;
|
|
19115
|
-
if (value === void 0) return acc;
|
|
19116
|
-
acc[key] = value;
|
|
19117
|
-
return acc;
|
|
19118
|
-
}, {});
|
|
19119
|
-
return cx(base, getVariantClassNames, config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param) => {
|
|
19120
|
-
let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
|
|
19121
|
-
return Object.entries(compoundVariantOptions).every((param) => {
|
|
19122
|
-
let [key, value] = param;
|
|
19123
|
-
return Array.isArray(value) ? value.includes({
|
|
19124
|
-
...defaultVariants,
|
|
19125
|
-
...propsWithoutUndefined
|
|
19126
|
-
}[key]) : {
|
|
19127
|
-
...defaultVariants,
|
|
19128
|
-
...propsWithoutUndefined
|
|
19129
|
-
}[key] === value;
|
|
19130
|
-
}) ? [
|
|
19131
|
-
...acc,
|
|
19132
|
-
cvClass,
|
|
19133
|
-
cvClassName
|
|
19134
|
-
] : acc;
|
|
19135
|
-
}, []), props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
19136
|
-
};
|
|
19137
|
-
//#endregion
|
|
19138
19946
|
//#region src/primitives/button.tsx
|
|
19139
19947
|
var buttonVariants = cva("inline-flex items-center justify-center rounded-md font-medium transition-colors cursor-pointer disabled:opacity-50 disabled:pointer-events-none", {
|
|
19140
19948
|
variants: {
|
|
@@ -19997,38 +20805,6 @@ function ClipPanel({ deviceId, clip, profile, onProfileChange }) {
|
|
|
19997
20805
|
});
|
|
19998
20806
|
}
|
|
19999
20807
|
//#endregion
|
|
20000
|
-
//#region src/primitives/badge.tsx
|
|
20001
|
-
var badgeVariants = cva("inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5", {
|
|
20002
|
-
variants: {
|
|
20003
|
-
variant: {
|
|
20004
|
-
default: "bg-surface-hover text-foreground",
|
|
20005
|
-
success: "bg-success/15 text-success",
|
|
20006
|
-
warning: "bg-warning/15 text-warning",
|
|
20007
|
-
danger: "bg-danger/15 text-danger",
|
|
20008
|
-
info: "bg-info/15 text-info"
|
|
20009
|
-
},
|
|
20010
|
-
styleVariant: {
|
|
20011
|
-
solid: "",
|
|
20012
|
-
outline: "border bg-transparent"
|
|
20013
|
-
}
|
|
20014
|
-
},
|
|
20015
|
-
defaultVariants: {
|
|
20016
|
-
variant: "default",
|
|
20017
|
-
styleVariant: "solid"
|
|
20018
|
-
}
|
|
20019
|
-
});
|
|
20020
|
-
var Badge = forwardRef(({ className, variant, style, ...props }, ref) => {
|
|
20021
|
-
return /* @__PURE__ */ jsx("span", {
|
|
20022
|
-
ref,
|
|
20023
|
-
className: cn(badgeVariants({
|
|
20024
|
-
variant,
|
|
20025
|
-
styleVariant: style
|
|
20026
|
-
}), className),
|
|
20027
|
-
...props
|
|
20028
|
-
});
|
|
20029
|
-
});
|
|
20030
|
-
Badge.displayName = "Badge";
|
|
20031
|
-
//#endregion
|
|
20032
20808
|
//#region src/lib/format-duration.ts
|
|
20033
20809
|
/**
|
|
20034
20810
|
* How long something lasted, the way this product says it.
|
|
@@ -26059,6 +26835,7 @@ function MultiSelectField({ field, value, onChange, disabled, translationFn }) {
|
|
|
26059
26835
|
function PasswordField({ field, value, onChange, disabled, translationFn }) {
|
|
26060
26836
|
const [show, setShow] = useState(false);
|
|
26061
26837
|
const showToggle = field.showToggle !== false;
|
|
26838
|
+
const text = value === void 0 || value === null ? "" : String(value);
|
|
26062
26839
|
return /* @__PURE__ */ jsx(FieldWrapper, {
|
|
26063
26840
|
label: field.label,
|
|
26064
26841
|
description: field.description,
|
|
@@ -26070,14 +26847,20 @@ function PasswordField({ field, value, onChange, disabled, translationFn }) {
|
|
|
26070
26847
|
children: [/* @__PURE__ */ jsx("input", {
|
|
26071
26848
|
type: show ? "text" : "password",
|
|
26072
26849
|
className: INPUT_CLASS + (showToggle ? " pr-9" : ""),
|
|
26073
|
-
value:
|
|
26850
|
+
value: text,
|
|
26074
26851
|
placeholder: field.placeholder,
|
|
26075
26852
|
disabled: disabled || field.disabled,
|
|
26076
|
-
|
|
26853
|
+
autoComplete: "new-password",
|
|
26854
|
+
spellCheck: false,
|
|
26855
|
+
onChange: (e) => onChange(e.target.value),
|
|
26856
|
+
onFocus: (e) => {
|
|
26857
|
+
if (text.length > 0 && /^[•●*]{4,}$/u.test(text)) e.currentTarget.select();
|
|
26858
|
+
}
|
|
26077
26859
|
}), showToggle && /* @__PURE__ */ jsx("button", {
|
|
26078
26860
|
type: "button",
|
|
26079
26861
|
className: "absolute right-2 top-1/2 -translate-y-1/2 text-foreground-subtle hover:text-foreground",
|
|
26080
26862
|
tabIndex: -1,
|
|
26863
|
+
"aria-label": show ? "Hide password" : "Show password",
|
|
26081
26864
|
onClick: () => setShow((s) => !s),
|
|
26082
26865
|
children: show ? /* @__PURE__ */ jsx(EyeOff, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx(Eye, { className: "h-3.5 w-3.5" })
|
|
26083
26866
|
})]
|
|
@@ -26223,70 +27006,30 @@ function SliderField({ field, value, onChange, disabled, translationFn }) {
|
|
|
26223
27006
|
});
|
|
26224
27007
|
}
|
|
26225
27008
|
function TagsField({ field, value, onChange, disabled, translationFn }) {
|
|
26226
|
-
const tags = Array.isArray(value) ? value : [];
|
|
26227
|
-
const
|
|
26228
|
-
const
|
|
26229
|
-
|
|
26230
|
-
|
|
26231
|
-
|
|
26232
|
-
|
|
26233
|
-
onChange([...tags, trimmed]);
|
|
26234
|
-
setInput("");
|
|
26235
|
-
}, [
|
|
26236
|
-
tags,
|
|
26237
|
-
field.maxTags,
|
|
26238
|
-
onChange
|
|
26239
|
-
]);
|
|
26240
|
-
const removeTag = (tag) => onChange(tags.filter((t) => t !== tag));
|
|
26241
|
-
const handleKeyDown = (e) => {
|
|
26242
|
-
if (e.key === "Enter" || e.key === ",") {
|
|
26243
|
-
e.preventDefault();
|
|
26244
|
-
addTag(input);
|
|
26245
|
-
} else if (e.key === "Backspace" && input === "" && tags.length > 0) removeTag(tags[tags.length - 1]);
|
|
26246
|
-
};
|
|
26247
|
-
const isDisabled = disabled || field.disabled;
|
|
27009
|
+
const tags = Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
|
|
27010
|
+
const creatable = field.creatable !== false;
|
|
27011
|
+
const options = (field.suggestions ?? []).map((s) => ({
|
|
27012
|
+
value: s,
|
|
27013
|
+
label: s
|
|
27014
|
+
}));
|
|
27015
|
+
const isDisabled = disabled === true || field.disabled === true;
|
|
26248
27016
|
return /* @__PURE__ */ jsx(FieldWrapper, {
|
|
26249
27017
|
label: field.label,
|
|
26250
27018
|
description: field.description,
|
|
26251
27019
|
required: field.required,
|
|
26252
27020
|
span: field.span,
|
|
26253
27021
|
translationFn,
|
|
26254
|
-
children: /* @__PURE__ */
|
|
26255
|
-
|
|
26256
|
-
|
|
26257
|
-
|
|
26258
|
-
|
|
26259
|
-
|
|
26260
|
-
|
|
26261
|
-
|
|
26262
|
-
|
|
26263
|
-
|
|
26264
|
-
|
|
26265
|
-
type: "button",
|
|
26266
|
-
onClick: () => removeTag(tag),
|
|
26267
|
-
className: "hover:text-danger",
|
|
26268
|
-
children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
|
|
26269
|
-
})]
|
|
26270
|
-
}, tag)),
|
|
26271
|
-
/* @__PURE__ */ jsx("input", {
|
|
26272
|
-
ref: inputRef,
|
|
26273
|
-
type: "text",
|
|
26274
|
-
className: "flex-1 min-w-[80px] bg-transparent text-sm text-foreground outline-none placeholder:text-foreground-disabled",
|
|
26275
|
-
value: input,
|
|
26276
|
-
placeholder: tags.length === 0 ? field.placeholder ?? "Add tags…" : "",
|
|
26277
|
-
disabled: isDisabled,
|
|
26278
|
-
list: `tags-suggestions-${field.key}`,
|
|
26279
|
-
onChange: (e) => setInput(e.target.value),
|
|
26280
|
-
onKeyDown: handleKeyDown,
|
|
26281
|
-
onBlur: () => {
|
|
26282
|
-
if (input.trim()) addTag(input);
|
|
26283
|
-
}
|
|
26284
|
-
}),
|
|
26285
|
-
field.suggestions && /* @__PURE__ */ jsx("datalist", {
|
|
26286
|
-
id: `tags-suggestions-${field.key}`,
|
|
26287
|
-
children: field.suggestions.map((s) => /* @__PURE__ */ jsx("option", { value: s }, s))
|
|
26288
|
-
})
|
|
26289
|
-
]
|
|
27022
|
+
children: /* @__PURE__ */ jsx(OptionSelect, {
|
|
27023
|
+
mode: "multi",
|
|
27024
|
+
options,
|
|
27025
|
+
value: tags,
|
|
27026
|
+
onChange: (next) => onChange(next),
|
|
27027
|
+
disabled: isDisabled,
|
|
27028
|
+
creatable,
|
|
27029
|
+
...field.createLabel !== void 0 ? { createLabel: field.createLabel } : {},
|
|
27030
|
+
...field.maxTags !== void 0 ? { maxItems: field.maxTags } : {},
|
|
27031
|
+
placeholder: field.placeholder ?? "Search or add…",
|
|
27032
|
+
testId: `config-tags-${field.key}`
|
|
26290
27033
|
})
|
|
26291
27034
|
});
|
|
26292
27035
|
}
|
|
@@ -27518,6 +28261,20 @@ function FormField({ field, values, onChange, disabled, translationFn, onTestFie
|
|
|
27518
28261
|
disabled,
|
|
27519
28262
|
translationFn
|
|
27520
28263
|
});
|
|
28264
|
+
case "notification-target-select": return /* @__PURE__ */ jsx(ConfigNotificationTargetSelectFieldView, {
|
|
28265
|
+
field,
|
|
28266
|
+
value,
|
|
28267
|
+
onChange: handleChange,
|
|
28268
|
+
disabled,
|
|
28269
|
+
translationFn
|
|
28270
|
+
});
|
|
28271
|
+
case "notification-target-multiselect": return /* @__PURE__ */ jsx(ConfigNotificationTargetMultiSelectFieldView, {
|
|
28272
|
+
field,
|
|
28273
|
+
value,
|
|
28274
|
+
onChange: handleChange,
|
|
28275
|
+
disabled,
|
|
28276
|
+
translationFn
|
|
28277
|
+
});
|
|
27521
28278
|
case "probe": return /* @__PURE__ */ jsx(ProbeField, {
|
|
27522
28279
|
field,
|
|
27523
28280
|
value,
|
|
@@ -29050,9 +29807,6 @@ var DialogContent = forwardRef(({ className, width, placement, scroll, children,
|
|
|
29050
29807
|
if (open && !el.open) el.showModal();
|
|
29051
29808
|
if (!open && el.open) el.close();
|
|
29052
29809
|
}, [open, dialogRef]);
|
|
29053
|
-
const handleClick = (e) => {
|
|
29054
|
-
if (e.target === e.currentTarget) setOpen(false);
|
|
29055
|
-
};
|
|
29056
29810
|
return /* @__PURE__ */ jsx("dialog", {
|
|
29057
29811
|
ref: dialogRef,
|
|
29058
29812
|
id: contentId,
|
|
@@ -29061,7 +29815,6 @@ var DialogContent = forwardRef(({ className, width, placement, scroll, children,
|
|
|
29061
29815
|
placement,
|
|
29062
29816
|
scroll
|
|
29063
29817
|
}), className),
|
|
29064
|
-
onClick: handleClick,
|
|
29065
29818
|
onClose: () => setOpen(false),
|
|
29066
29819
|
...props,
|
|
29067
29820
|
children
|
|
@@ -39258,7 +40011,7 @@ function ControlWidget({ slice, busy, setValueFn, layout }) {
|
|
|
39258
40011
|
value: e.target.value
|
|
39259
40012
|
} });
|
|
39260
40013
|
},
|
|
39261
|
-
className: cn("w-full max-w-full min-w-0 truncate rounded
|
|
40014
|
+
className: cn("w-full max-w-full min-w-0 truncate rounded bg-transparent px-0.5 py-0.5 text-xs", busy && "opacity-40 cursor-not-allowed"),
|
|
39262
40015
|
children: slice.options.map((opt) => /* @__PURE__ */ jsx("option", {
|
|
39263
40016
|
value: opt,
|
|
39264
40017
|
children: opt
|
|
@@ -40337,12 +41090,13 @@ function BatteryBar({ percent }) {
|
|
|
40337
41090
|
});
|
|
40338
41091
|
}
|
|
40339
41092
|
function SensorHeroInner({ trpc, device }) {
|
|
40340
|
-
const roleDescriptor = device.role != null ? ROLE_DESCRIPTOR[device.role] :
|
|
41093
|
+
const roleDescriptor = device.role != null ? ROLE_DESCRIPTOR[device.role] : ROLE_DESCRIPTOR["temperature-sensor"];
|
|
40341
41094
|
const isBattery = isBatterySensorRole(device.role);
|
|
40342
41095
|
const { data: roleDefaultsData } = useDeviceManagerGetRoleDisplayDefaults({}, { staleTime: 6e4 });
|
|
40343
41096
|
const dev = useDeviceProxy(trpc, device.id);
|
|
40344
41097
|
const numericSlice = useDeviceStateSlice(dev !== null && roleDescriptor !== void 0 ? roleDescriptor.getSliceHandle(dev.state) : void 0);
|
|
40345
41098
|
const binaryBatterySlice = useDeviceStateSlice(dev !== null && isBattery ? dev.state.binary : void 0);
|
|
41099
|
+
const occupancySlice = useDeviceStateSlice(dev !== null && !isBattery ? dev.state.binary : void 0);
|
|
40346
41100
|
const useBinaryBattery = isBattery && roleDescriptor?.kind === "numeric" && !hasBatteryNumericValue(numericSlice, roleDescriptor.field) && binaryBatterySlice !== void 0;
|
|
40347
41101
|
const descriptor = useBinaryBattery ? BINARY_BATTERY_DESCRIPTOR : roleDescriptor;
|
|
40348
41102
|
const slice = useBinaryBattery ? binaryBatterySlice : numericSlice;
|
|
@@ -40366,12 +41120,14 @@ function SensorHeroInner({ trpc, device }) {
|
|
|
40366
41120
|
const resolved = resolveSensorDisplay({
|
|
40367
41121
|
display: device.display,
|
|
40368
41122
|
capName: device.role === "numeric-sensor" ? "numeric-sensor" : void 0,
|
|
40369
|
-
roleDefault: device.role != null ? roleDefaultsData?.defaults[device.role] :
|
|
41123
|
+
roleDefault: device.role != null ? roleDefaultsData?.defaults[device.role] : roleDefaultsData?.defaults["temperature-sensor"],
|
|
40370
41124
|
sliceUnit: liveUnit,
|
|
40371
41125
|
slicePrecision,
|
|
40372
41126
|
canonicalUnit: descriptor.canonicalUnit
|
|
40373
41127
|
});
|
|
40374
41128
|
const unit = resolved.unit;
|
|
41129
|
+
const formatted = formatNumeric(resolved.toDisplayValue(rawValue), resolved.precision);
|
|
41130
|
+
const occupancyOn = occupancySlice !== void 0 && isBinarySliceValue(occupancySlice) && typeof occupancySlice["on"] === "boolean" ? Boolean(occupancySlice["on"]) : null;
|
|
40375
41131
|
return /* @__PURE__ */ jsxs("div", {
|
|
40376
41132
|
className: "flex flex-col items-center justify-center gap-2 rounded-lg border border-border bg-surface p-4",
|
|
40377
41133
|
children: [
|
|
@@ -40379,13 +41135,18 @@ function SensorHeroInner({ trpc, device }) {
|
|
|
40379
41135
|
className: "flex items-baseline gap-1",
|
|
40380
41136
|
children: [/* @__PURE__ */ jsx("span", {
|
|
40381
41137
|
className: "text-3xl font-semibold tabular-nums text-foreground",
|
|
40382
|
-
children:
|
|
41138
|
+
children: formatted
|
|
40383
41139
|
}), unit && /* @__PURE__ */ jsx("span", {
|
|
40384
41140
|
className: "text-base text-foreground-subtle",
|
|
40385
41141
|
children: unit
|
|
40386
41142
|
})]
|
|
40387
41143
|
}),
|
|
40388
41144
|
isBattery && /* @__PURE__ */ jsx(BatteryBar, { percent: rawValue }),
|
|
41145
|
+
occupancyOn !== null && /* @__PURE__ */ jsx("span", {
|
|
41146
|
+
className: cn("inline-flex items-center rounded px-2 py-0.5 text-xs font-medium", occupancyOn ? "bg-warning/15 text-warning" : "bg-surface-subtle text-foreground-subtle"),
|
|
41147
|
+
"data-testid": "sensor-hero-occupancy",
|
|
41148
|
+
children: occupancyOn ? "Occupied" : "Clear"
|
|
41149
|
+
}),
|
|
40389
41150
|
/* @__PURE__ */ jsx("span", {
|
|
40390
41151
|
className: "text-sm text-foreground-subtle",
|
|
40391
41152
|
children: device.name
|
|
@@ -48215,11 +48976,11 @@ function useDeviceAdminLink(trpc, deviceId) {
|
|
|
48215
48976
|
cap: (d) => d.deviceAdminLink,
|
|
48216
48977
|
slice: () => void 0
|
|
48217
48978
|
});
|
|
48218
|
-
const
|
|
48979
|
+
const capBound = dev !== null && cap !== void 0 && cap !== null && (dev.binding?.entries.some((e) => e.capName === "device-admin-link") ?? true);
|
|
48219
48980
|
const [state, setState] = useState({ kind: "pending" });
|
|
48220
48981
|
useEffect(() => {
|
|
48221
|
-
if (!
|
|
48222
|
-
setState({ kind: "
|
|
48982
|
+
if (!capBound || cap === void 0 || cap === null) {
|
|
48983
|
+
setState({ kind: "none" });
|
|
48223
48984
|
return;
|
|
48224
48985
|
}
|
|
48225
48986
|
let live = true;
|
|
@@ -48240,7 +49001,7 @@ function useDeviceAdminLink(trpc, deviceId) {
|
|
|
48240
49001
|
live = false;
|
|
48241
49002
|
};
|
|
48242
49003
|
}, [
|
|
48243
|
-
|
|
49004
|
+
capBound,
|
|
48244
49005
|
cap,
|
|
48245
49006
|
deviceId
|
|
48246
49007
|
]);
|
|
@@ -49314,6 +50075,51 @@ function DeviceItemPreview({ trpc, device, status, enabled, showStatusPills = fa
|
|
|
49314
50075
|
});
|
|
49315
50076
|
}
|
|
49316
50077
|
//#endregion
|
|
50078
|
+
//#region src/contexts/device-quick-detail.tsx
|
|
50079
|
+
/**
|
|
50080
|
+
* Optional host-provided "open quick detail for this device id" callback.
|
|
50081
|
+
*
|
|
50082
|
+
* The devices table (`DeviceItem` / `DeviceList`) draws a discreet quick-
|
|
50083
|
+
* detail glyph whenever a host has published a handler — admin-ui mounts
|
|
50084
|
+
* ONE provider at the app shell with the modal. Call sites never wire the
|
|
50085
|
+
* button themselves; absence of a provider means no glyph (unit tests,
|
|
50086
|
+
* embeds that do not host the modal).
|
|
50087
|
+
*/
|
|
50088
|
+
var DeviceQuickDetailContext = createSharedContext("camstack:device-quick-detail", null);
|
|
50089
|
+
function DeviceQuickDetailProvider({ open, children }) {
|
|
50090
|
+
return /* @__PURE__ */ jsx(DeviceQuickDetailContext.Provider, {
|
|
50091
|
+
value: open,
|
|
50092
|
+
children
|
|
50093
|
+
});
|
|
50094
|
+
}
|
|
50095
|
+
/** The host's open callback, or null when no provider is mounted. */
|
|
50096
|
+
function useDeviceQuickDetailOpen() {
|
|
50097
|
+
return useContext(DeviceQuickDetailContext);
|
|
50098
|
+
}
|
|
50099
|
+
//#endregion
|
|
50100
|
+
//#region src/composites/device-item/quick-detail-action.tsx
|
|
50101
|
+
/**
|
|
50102
|
+
* Built-in row glyph for the host's quick-detail modal. Renders nothing
|
|
50103
|
+
* unless a `DeviceQuickDetailProvider` is mounted above — same "draw
|
|
50104
|
+
* nothing rather than something dead" rule as `AdminLinkQuickAction`.
|
|
50105
|
+
*/
|
|
50106
|
+
function DeviceQuickDetailAction({ deviceId, className }) {
|
|
50107
|
+
const open = useDeviceQuickDetailOpen();
|
|
50108
|
+
if (open === null) return null;
|
|
50109
|
+
return /* @__PURE__ */ jsx("button", {
|
|
50110
|
+
type: "button",
|
|
50111
|
+
onClick: (e) => {
|
|
50112
|
+
e.stopPropagation();
|
|
50113
|
+
open(deviceId);
|
|
50114
|
+
},
|
|
50115
|
+
className: cn("inline-flex items-center justify-center rounded text-foreground-subtle hover:text-foreground transition-colors flex-shrink-0", className),
|
|
50116
|
+
title: "Quick detail",
|
|
50117
|
+
"aria-label": "Quick detail",
|
|
50118
|
+
"data-testid": "device-quick-detail",
|
|
50119
|
+
children: /* @__PURE__ */ jsx(Settings, { className: "h-3 w-3" })
|
|
50120
|
+
});
|
|
50121
|
+
}
|
|
50122
|
+
//#endregion
|
|
49317
50123
|
//#region src/composites/device-item/status-dot.tsx
|
|
49318
50124
|
/** The states that breathe (are "alive"). Offline + disabled are static. */
|
|
49319
50125
|
function isAlive(status) {
|
|
@@ -49591,6 +50397,7 @@ function DeviceItem(props) {
|
|
|
49591
50397
|
flags,
|
|
49592
50398
|
controlPlacement: "right"
|
|
49593
50399
|
}),
|
|
50400
|
+
/* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
|
|
49594
50401
|
renderRowAction && /* @__PURE__ */ jsx("span", {
|
|
49595
50402
|
onClick: (e) => e.stopPropagation(),
|
|
49596
50403
|
children: renderRowAction(device)
|
|
@@ -49673,6 +50480,7 @@ function DeviceItem(props) {
|
|
|
49673
50480
|
flags,
|
|
49674
50481
|
controlPlacement: "right"
|
|
49675
50482
|
}),
|
|
50483
|
+
/* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
|
|
49676
50484
|
renderRowAction && /* @__PURE__ */ jsx("span", {
|
|
49677
50485
|
onClick: (e) => e.stopPropagation(),
|
|
49678
50486
|
children: renderRowAction(device)
|
|
@@ -49774,6 +50582,7 @@ function DeviceItemTableRow(props) {
|
|
|
49774
50582
|
enabled: showSnapshot && isCamera,
|
|
49775
50583
|
showStatusPills: true
|
|
49776
50584
|
}),
|
|
50585
|
+
/* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
|
|
49777
50586
|
renderRowAction && /* @__PURE__ */ jsx("span", {
|
|
49778
50587
|
onClick: (e) => e.stopPropagation(),
|
|
49779
50588
|
children: renderRowAction(device)
|
|
@@ -50871,10 +51680,10 @@ function useDeviceListRealtimeSync() {
|
|
|
50871
51680
|
* `renderItem`.
|
|
50872
51681
|
*/
|
|
50873
51682
|
function GenericModeList(props) {
|
|
50874
|
-
const { items, getKey, getSearchText, renderItem, getFilterType, mapFilterOption, filterOptions, filterLabel = "Type", columns, renderExpanded, isExpanded, rowClassName, onRowClick, isLoading = false, searchPlaceholder = "Search", emptyLabel = "No items found.", pageSize = 100, toolbar } = props;
|
|
51683
|
+
const { items, getKey, getSearchText, renderItem, getFilterType, mapFilterOption, filterOptions, filterLabel = "Type", initialTypeFilters = [], columns, renderExpanded, isExpanded, rowClassName, onRowClick, isLoading = false, searchPlaceholder = "Search", emptyLabel = "No items found.", pageSize = 100, toolbar } = props;
|
|
50875
51684
|
const [searchInput, setSearchInput] = useState("");
|
|
50876
51685
|
const debouncedSearch = useDebouncedString(searchInput, 300);
|
|
50877
|
-
const [typeFilters, setTypeFilters] = useState([]);
|
|
51686
|
+
const [typeFilters, setTypeFilters] = useState(() => [...initialTypeFilters]);
|
|
50878
51687
|
const [page, setPage] = useState(1);
|
|
50879
51688
|
useEffect(() => {
|
|
50880
51689
|
setPage(1);
|
|
@@ -55740,39 +56549,6 @@ function VersionBadge({ version, preRelease, className }) {
|
|
|
55740
56549
|
});
|
|
55741
56550
|
}
|
|
55742
56551
|
//#endregion
|
|
55743
|
-
//#region src/composites/device-picker/SelectedChip.tsx
|
|
55744
|
-
/**
|
|
55745
|
-
* Removable selection chip + the search-box shell shared by DevicePicker and
|
|
55746
|
-
* SearchableMultiSelectField (admin-ui). Lives here so addon MFEs can render
|
|
55747
|
-
* the same picker without importing admin-ui.
|
|
55748
|
-
*/
|
|
55749
|
-
/** The search box's shell — shared with multiselect fields that mirror this picker. */
|
|
55750
|
-
var INPUT_SHELL = "flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1.5 focus-within:border-primary focus-within:ring-1 focus-within:ring-primary/30";
|
|
55751
|
-
/** One selected entry as a removable chip. */
|
|
55752
|
-
function SelectedChip({ label, onRemove, warning = false, iconId, testId }) {
|
|
55753
|
-
return /* @__PURE__ */ jsxs("span", {
|
|
55754
|
-
"data-testid": testId,
|
|
55755
|
-
className: warning ? "inline-flex items-center gap-1 rounded-md bg-warning/10 px-1.5 py-0.5 text-[11px] text-warning max-w-full" : "inline-flex items-center gap-1 rounded-md bg-primary/10 px-1.5 py-0.5 text-[11px] text-primary max-w-full",
|
|
55756
|
-
children: [
|
|
55757
|
-
iconId !== void 0 && /* @__PURE__ */ jsx(EventKindGlyph, {
|
|
55758
|
-
iconId,
|
|
55759
|
-
size: 12
|
|
55760
|
-
}),
|
|
55761
|
-
/* @__PURE__ */ jsx("span", {
|
|
55762
|
-
className: "truncate",
|
|
55763
|
-
children: label
|
|
55764
|
-
}),
|
|
55765
|
-
onRemove !== void 0 && /* @__PURE__ */ jsx("button", {
|
|
55766
|
-
type: "button",
|
|
55767
|
-
className: "shrink-0 hover:text-danger",
|
|
55768
|
-
"aria-label": `Remove ${label}`,
|
|
55769
|
-
onClick: onRemove,
|
|
55770
|
-
children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
|
|
55771
|
-
})
|
|
55772
|
-
]
|
|
55773
|
-
});
|
|
55774
|
-
}
|
|
55775
|
-
//#endregion
|
|
55776
56552
|
//#region src/composites/device-picker/device-picker-model.ts
|
|
55777
56553
|
/** Numbers numerically, anything else by its text — the name tie-break. */
|
|
55778
56554
|
function compareIds(a, b) {
|
|
@@ -57225,6 +58001,42 @@ function useZoneEditing() {
|
|
|
57225
58001
|
return useContext(ZoneEditingContext);
|
|
57226
58002
|
}
|
|
57227
58003
|
//#endregion
|
|
58004
|
+
//#region src/hooks/use-url-query.ts
|
|
58005
|
+
/**
|
|
58006
|
+
* Tiny URL query sync for surfaces that cannot assume react-router
|
|
58007
|
+
* (federated addon pages) or that only need a handful of params.
|
|
58008
|
+
*
|
|
58009
|
+
* Reads on mount + `popstate`; writes with `history.replaceState`. Empty /
|
|
58010
|
+
* null values are deleted so the URL stays short.
|
|
58011
|
+
*/
|
|
58012
|
+
function readParam(key) {
|
|
58013
|
+
return new URLSearchParams(window.location.search).get(key);
|
|
58014
|
+
}
|
|
58015
|
+
function writeParam(key, value) {
|
|
58016
|
+
const params = new URLSearchParams(window.location.search);
|
|
58017
|
+
if (value === null || value === "") params.delete(key);
|
|
58018
|
+
else params.set(key, value);
|
|
58019
|
+
const qs = params.toString();
|
|
58020
|
+
const url = qs ? `${window.location.pathname}?${qs}` : window.location.pathname;
|
|
58021
|
+
window.history.replaceState(null, "", url);
|
|
58022
|
+
}
|
|
58023
|
+
/**
|
|
58024
|
+
* One query param as React state. `null` means absent.
|
|
58025
|
+
* Changing it replaces the URL without a navigation.
|
|
58026
|
+
*/
|
|
58027
|
+
function useUrlQueryParam(key) {
|
|
58028
|
+
const [value, setValue] = useState(() => readParam(key));
|
|
58029
|
+
useEffect(() => {
|
|
58030
|
+
const onPop = () => setValue(readParam(key));
|
|
58031
|
+
window.addEventListener("popstate", onPop);
|
|
58032
|
+
return () => window.removeEventListener("popstate", onPop);
|
|
58033
|
+
}, [key]);
|
|
58034
|
+
return [value, useCallback((next) => {
|
|
58035
|
+
writeParam(key, next);
|
|
58036
|
+
setValue(next);
|
|
58037
|
+
}, [key])];
|
|
58038
|
+
}
|
|
58039
|
+
//#endregion
|
|
57228
58040
|
//#region src/hooks/use-device-cap-slice.ts
|
|
57229
58041
|
/**
|
|
57230
58042
|
* useDeviceCapSlice — generic runtime-state slice reader for an arbitrary
|
|
@@ -58067,4 +58879,4 @@ var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-vfWTm6qv.js").t
|
|
|
58067
58879
|
/** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
|
|
58068
58880
|
var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-DMkchqO1.js").then((m) => ({ default: m.PrivacyMaskSettings })));
|
|
58069
58881
|
//#endregion
|
|
58070
|
-
export { AddonGlobalSettingsForm, AdminLinkQuickAction, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_PICKER_GROUP_STORAGE_KEY, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DataTableFilterBar, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceFilterBar, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DevicePicker, DeviceSelectField, DeviceSelectorPicker, DeviceStepMatrix, DevicesFailedLine, DevicesLoadingLine, DevicesWidenWarning, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EMPTY_DATA_TABLE_FILTER, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, ExtensionsPanel, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, INPUT_SHELL, IconAction, IconButton, IconPicker, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NAVIGATION_DRIVE_INTERVAL_MS, NavigationPanel, NetworkLinkBadge, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PICKER_CHIP_LIMIT, PICKER_DEFAULT_GROUP_BY, PICKER_GROUP_BY_MODES, PICKER_GROUP_COLLAPSE_AT, PICKER_NONE_KEY, PICKER_NOUN_PLURAL, PICKER_NO_FILTERS, PICKER_PAGE_SIZE, PICKER_SEARCH_DEBOUNCE_MS, PICKER_WINDOW, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlaceholderChipField, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, RoleDisplayDefaultsFromServer, RoleDisplayDefaultsProvider, SCENE_CAPTURE_VARIANTS, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SNAPSHOT_MEDIA_PATH, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, Select, SelectedChip, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, SortHeaderButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamDebugOverlay, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TABLE_SCROLL_MAX_H, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, UnitPicker, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, MicOff as a, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, applyPickerFilters, ariaSortForColumn, badgeFor, buildStepTreeFromSchema, EyeOff as c, childEntityId, childListName, chipOverflow, classifyCapability, clearPickerGroup, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, dataTableFacets, defaultTheme, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceIntegrationResolver, deviceListStateOf, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, emptyDevicesWidens, ensureMfHostInit, eventKindLabel, filterDataTableRows, filterDeviceOptions, filterPickerDevices, findTimezone, flattenPickerGrouping, flattenPickerRows, fleetViewOf, formatControlDateTime, formatLastSeen, formatNumeric, freezeVerdict, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, groupPickerDevices, groupPickerDevicesBy, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, insertAtSelection, isAbsentProvider, isDataTableFilterActive, isFieldVisible, isGroupExpanded, Camera as l, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, mountPath, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, ImageOff as o, offListSelections, openTopLayer, orphanDeviceLabel, overrideEntityIdFromLink, pageRows, parsePickerGroupBy, parseRecordedServerMessage, pickerFacetFilterShown, pickerFacetKey, pickerFacetOptions, pickerFiltersActive, pickerGroupKey, pickerHiddenSelectedCount, pickerLocationKey, pickerQueryTokens, pickerRowFacts, pickerSearchText, pickerZoneFilterSuspended, providerIcons, RotateCcw as r, readStoredGroupBy, resetHubMountForTests, resetPickerFilters, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDeviceIntegration, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSelectedDevices, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, routerBasename, Grid2x2 as s, scrubReducer, selectPickerGroup, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, showsNoCamerasHint, sortRows, sortRowsByColumn, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, toggleDataTableFacet, togglePickerDevice, togglePickerKey, trpc, typeLabel, createLucideIcon as u, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlert, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerAttachDevice, useAudioAnalyzerClassify, useAudioAnalyzerDetachDevice, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupCancel, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCalendarsImportFromHomeAssistant, useCalendarsListCalendars, useCalendarsListEvents, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateComposition, useCoreBlocksValidateComposition, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDataTableFilter, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdminLink, useDeviceAdminLinkGetAdminLink, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceExtensionListCandidates, useDeviceExtensionListSlots, useDeviceExtensionListSources, useDeviceExtensionSetSlot, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerGetWrapperActivation, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListDeviceIdsByCaps, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateClaimFields, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetNativeCapSlice, useDeviceStateGetSnapshot, useDeviceStateListClaims, useDeviceStatePatchOwnedFields, useDeviceStateReleaseClaim, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellEvents, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkDownloadCa, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetLoadSeries, useMetricsProviderGetProcessStats, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetOptions, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNativeObjectDetectionSetSettings, useNavigation, useNavigationGetFeatures, useNavigationGetStatus, useNavigationGoToPoint, useNavigationListActions, useNavigationMove, useNavigationPlaySound, useNavigationRunAction, useNavigationSetLightLevel, useNavigationSetLightMode, useNavigationSetLightOn, useNavigationStop, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkLinkGetStatus, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesDirectory, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesActivateAlarmProfile, useNotificationRulesCancelSnooze, useNotificationRulesCreateAlarmProfile, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteAlarmProfile, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesRenameAlarmProfile, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerDeleteTemplate, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerListTemplates, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdManagerUpsertTemplate, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePickerSiteZones, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTrackRelation, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTrackRelations, usePipelineAnalyticsListTracks, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsSetTrackPurity, usePipelineAnalyticsSetTrackRelation, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetClusterModelChoice, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorRequestOccupancyLook, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraSensors, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePrompt, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzCaptureHomeHere, usePtzContinuousMove, usePtzDeletePreset, usePtzGetHomePreset, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingArchiveApplyDeviceSettingsPatch, useRecordingArchiveCancelRelocateJob, useRecordingArchiveCancelStorageMigrationMove, useRecordingArchiveDeleteFootprint, useRecordingArchiveGetAvailabilityBatch, useRecordingArchiveGetDaysWithRecordingsBatch, useRecordingArchiveGetDeviceConfig, useRecordingArchiveGetDeviceLiveContribution, useRecordingArchiveGetDeviceSettingsContribution, useRecordingArchiveGetPlacement, useRecordingArchiveGetRelocateResidue, useRecordingArchiveGetStatus, useRecordingArchiveGetStorageMigrationMoveStatus, useRecordingArchiveGetStorageUsage, useRecordingArchiveListOpsLog, useRecordingArchiveListRelocateJobs, useRecordingArchiveLocateSegment, useRecordingArchivePauseForStorageMigration, useRecordingArchivePlanStorageRebalance, useRecordingArchivePruneFootage, useRecordingArchiveReadGopBytes, useRecordingArchiveReadSegmentBytes, useRecordingArchiveReadWindowBytes, useRecordingArchiveReconcileLedgerAgainstDisk, useRecordingArchiveRefreshStorageLocationsForMigration, useRecordingArchiveRelocateFootage, useRecordingArchiveRenderClip, useRecordingArchiveRenderGif, useRecordingArchiveRescanStorage, useRecordingArchiveResumeForStorageMigration, useRecordingArchiveSetDeviceConfig, useRecordingArchiveSetDevicePlacement, useRecordingArchiveStartStorageMigrationMove, useRecordingArchiveStartStorageRebalance, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetPlayback, useRecordingGetPlaybackOptions, useRecordingListSources, useRecordingOnboardGetOptions, useRecordingOnboardGetStatus, useRecordingOnboardSetSettings, useRecordingSignalGetStatus, useRemoteComponent, useRoleDisplayDefaults, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStationaryOverlay, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageList, useStorageListDrainProgress, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationCleanupCancel, useStorageMigrationCleanupStart, useStorageMigrationCleanupStatus, useStorageMigrationDrain, useStorageMigrationHistory, useStorageMigrationMovers, useStorageMigrationPlan, useStorageMigrationResidue, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStoredGroupBy, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useStreamSignalsListSignals, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetFailureContributions, useSystemGetLoadContributions, useSystemGetLoggingSettings, useSystemGetRequestCensus, useSystemGetRetentionConfig, useSystemGetSiteLocation, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetLoggingSettings, useSystemSetRetentionConfig, useSystemSetSiteLocation, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionAdoptLegacyMonitor, useTerminalSessionClose, useTerminalSessionCreateInstance, useTerminalSessionDeleteInstance, useTerminalSessionListInstances, useTerminalSessionListLegacyCameras, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionPullOutput, useTerminalSessionResize, useTerminalSessionSetInstanceEnabled, useTerminalSessionUpdateInstance, useTerminalSessionWriteInput, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsDialClipStream, useVideoclipsGetClipPlayback, useVideoclipsGetPlaybackOptions, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsOfferClipBytes, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint, writeStoredGroupBy };
|
|
58882
|
+
export { AddonGlobalSettingsForm, AdminLinkQuickAction, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigNotificationTargetMultiSelectFieldView, ConfigNotificationTargetSelectFieldView, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_PICKER_GROUP_STORAGE_KEY, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DataTableFilterBar, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceFilterBar, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DevicePicker, DeviceQuickDetailProvider, DeviceSelectField, DeviceSelectorPicker, DeviceStepMatrix, DevicesFailedLine, DevicesLoadingLine, DevicesWidenWarning, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EMPTY_DATA_TABLE_FILTER, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, ExtensionsPanel, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, INPUT_SHELL, IconAction, IconButton, IconPicker, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NAVIGATION_DRIVE_INTERVAL_MS, NavigationPanel, NetworkLinkBadge, NodeMultiSelectField, NodePicker, NodeSelectField, NotificationTargetSelectField, NotificationTargetsField, OPTION_SELECT_SEARCH_MIN_OPTIONS, OfflineBadge, OptionSelect, PHASE_CONFIG, PICKER_CHIP_LIMIT, PICKER_DEFAULT_GROUP_BY, PICKER_GROUP_BY_MODES, PICKER_GROUP_COLLAPSE_AT, PICKER_NONE_KEY, PICKER_NOUN_PLURAL, PICKER_NO_FILTERS, PICKER_PAGE_SIZE, PICKER_SEARCH_DEBOUNCE_MS, PICKER_WINDOW, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlaceholderChipField, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, RoleDisplayDefaultsFromServer, RoleDisplayDefaultsProvider, SCENE_CAPTURE_VARIANTS, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SNAPSHOT_MEDIA_PATH, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, Select, SelectedChip, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, SortHeaderButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamDebugOverlay, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TABLE_SCROLL_MAX_H, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, UnitPicker, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, MicOff as a, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, applyPickerFilters, ariaSortForColumn, badgeFor, buildStepTreeFromSchema, EyeOff as c, catalogHasDraft, childEntityId, childListName, chipOverflow, classifyCapability, clearPickerGroup, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, dataTableFacets, defaultTheme, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceIntegrationResolver, deviceListStateOf, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, draftFromQuery, emptyDevicesWidens, ensureMfHostInit, eventKindLabel, filterDataTableRows, filterDeviceOptions, filterOptions as filterOptionSelectOptions, filterPickerDevices, findTimezone, flattenPickerGrouping, flattenPickerRows, fleetViewOf, formatControlDateTime, formatLastSeen, formatNumeric, freezeVerdict, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, groupPickerDevices, groupPickerDevicesBy, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, insertAtSelection, isAbsentProvider, isDataTableFilterActive, isFieldVisible, isGroupExpanded, Camera as l, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, mountPath, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, ImageOff as o, offListSelections, openTopLayer, optionSearchText as optionSelectSearchText, orphanDeviceLabel, overrideEntityIdFromLink, pageRows, parsePickerGroupBy, parseRecordedServerMessage, partitionSelected as partitionOptionSelectSelected, pickerFacetFilterShown, pickerFacetKey, pickerFacetOptions, pickerFiltersActive, pickerGroupKey, pickerHiddenSelectedCount, pickerLocationKey, pickerQueryTokens, pickerRowFacts, pickerSearchText, pickerZoneFilterSuspended, providerIcons, RotateCcw as r, readStoredGroupBy, resetHubMountForTests, resetPickerFilters, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDeviceIntegration, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolveSearchable as resolveOptionSelectSearchable, resolvePrimaryChild, resolveSelectedDevices, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, routerBasename, Grid2x2 as s, scrubReducer, selectPickerGroup, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldShowAddNewFooter, shouldShowUseQueryRow, shouldUseSingleNode, showsNoCamerasHint, sortRows, sortRowsByColumn, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, toggleDataTableFacet, togglePickerDevice, togglePickerKey, trpc, typeLabel, createLucideIcon as u, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlert, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerAttachDevice, useAudioAnalyzerClassify, useAudioAnalyzerDetachDevice, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupCancel, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCalendarsGetPreferences, useCalendarsListCalendars, useCalendarsListEvents, useCalendarsSetCalendarPreference, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetBlockSettings, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateBlockSettings, useCoreBlocksUpdateComposition, useCoreBlocksValidateComposition, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDataTableFilter, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdminLink, useDeviceAdminLinkGetAdminLink, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceExtensionListCandidates, useDeviceExtensionListSlots, useDeviceExtensionListSources, useDeviceExtensionSetSlot, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerGetWrapperActivation, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListDeviceIdsByCaps, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceQuickDetailOpen, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateClaimFields, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetNativeCapSlice, useDeviceStateGetSnapshot, useDeviceStateListClaims, useDeviceStatePatchOwnedFields, useDeviceStateReleaseClaim, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellEvents, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkDownloadCa, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetLoadSeries, useMetricsProviderGetProcessStats, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetOptions, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNativeObjectDetectionSetSettings, useNavigation, useNavigationGetFeatures, useNavigationGetStatus, useNavigationGoToPoint, useNavigationListActions, useNavigationMove, useNavigationPlaySound, useNavigationRunAction, useNavigationSetLightLevel, useNavigationSetLightMode, useNavigationSetLightOn, useNavigationStop, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkLinkGetStatus, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesDirectory, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputGetTarget, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputProbeTargetConfig, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesActivateAlarmProfile, useNotificationRulesCancelSnooze, useNotificationRulesCreateAlarmProfile, useNotificationRulesCreateRule, useNotificationRulesCreateSequence, useNotificationRulesCreateSnooze, useNotificationRulesDeleteAlarmProfile, useNotificationRulesDeleteRule, useNotificationRulesDeleteSequence, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetSequence, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSequences, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesRenameAlarmProfile, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotificationRulesUpdateSequence, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerDeleteTemplate, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerListTemplates, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdManagerUpsertTemplate, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePickerSiteZones, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTrackRelation, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTrackRelations, usePipelineAnalyticsListTracks, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsSetTrackPurity, usePipelineAnalyticsSetTrackRelation, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetClusterModelChoice, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorRequestOccupancyLook, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraSensors, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePrompt, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzCaptureHomeHere, usePtzContinuousMove, usePtzDeletePreset, usePtzGetHomePreset, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingArchiveApplyDeviceSettingsPatch, useRecordingArchiveCancelRelocateJob, useRecordingArchiveCancelStorageMigrationMove, useRecordingArchiveDeleteFootprint, useRecordingArchiveGetAvailabilityBatch, useRecordingArchiveGetDaysWithRecordingsBatch, useRecordingArchiveGetDeviceConfig, useRecordingArchiveGetDeviceLiveContribution, useRecordingArchiveGetDeviceSettingsContribution, useRecordingArchiveGetPlacement, useRecordingArchiveGetRelocateResidue, useRecordingArchiveGetStatus, useRecordingArchiveGetStorageMigrationMoveStatus, useRecordingArchiveGetStorageUsage, useRecordingArchiveListOpsLog, useRecordingArchiveListRelocateJobs, useRecordingArchiveLocateSegment, useRecordingArchivePauseForStorageMigration, useRecordingArchivePlanStorageRebalance, useRecordingArchivePruneFootage, useRecordingArchiveReadGopBytes, useRecordingArchiveReadSegmentBytes, useRecordingArchiveReadWindowBytes, useRecordingArchiveReconcileLedgerAgainstDisk, useRecordingArchiveRefreshStorageLocationsForMigration, useRecordingArchiveRelocateFootage, useRecordingArchiveRenderClip, useRecordingArchiveRenderGif, useRecordingArchiveRescanStorage, useRecordingArchiveResumeForStorageMigration, useRecordingArchiveSetDeviceConfig, useRecordingArchiveSetDevicePlacement, useRecordingArchiveStartStorageMigrationMove, useRecordingArchiveStartStorageRebalance, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetPlayback, useRecordingGetPlaybackOptions, useRecordingListSources, useRecordingOnboardGetOptions, useRecordingOnboardGetStatus, useRecordingOnboardSetSettings, useRecordingSignalGetStatus, useRemoteComponent, useRoleDisplayDefaults, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStationaryOverlay, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageList, useStorageListDrainProgress, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationCleanupCancel, useStorageMigrationCleanupStart, useStorageMigrationCleanupStatus, useStorageMigrationDrain, useStorageMigrationHistory, useStorageMigrationMovers, useStorageMigrationPlan, useStorageMigrationResidue, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStoredGroupBy, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useStreamSignalsListSignals, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetFailureContributions, useSystemGetLoadContributions, useSystemGetLoggingSettings, useSystemGetRequestCensus, useSystemGetRetentionConfig, useSystemGetSiteLocation, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetLoggingSettings, useSystemSetRetentionConfig, useSystemSetSiteLocation, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionAdoptLegacyMonitor, useTerminalSessionClose, useTerminalSessionCreateInstance, useTerminalSessionDeleteInstance, useTerminalSessionListInstances, useTerminalSessionListLegacyCameras, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionPullOutput, useTerminalSessionResize, useTerminalSessionSetInstanceEnabled, useTerminalSessionUpdateInstance, useTerminalSessionWriteInput, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUrlQueryParam, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsDialClipStream, useVideoclipsGetClipPlayback, useVideoclipsGetPlaybackOptions, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsOfferClipBytes, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint, writeStoredGroupBy };
|