@camstack/ui-library 1.2.227 → 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 +4 -0
- package/dist/index.cjs +1086 -308
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1069 -309
- 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
|
@@ -7572,8 +7572,12 @@ var useNodesExecuteQuery = trpc.nodes.executeQuery.useMutation;
|
|
|
7572
7572
|
var useNotificationOutputListTargetKinds = trpc.notificationOutput.listTargetKinds.useQuery;
|
|
7573
7573
|
/** Generated alias around `trpc.notificationOutput.listTargets.useQuery`. */
|
|
7574
7574
|
var useNotificationOutputListTargets = trpc.notificationOutput.listTargets.useQuery;
|
|
7575
|
+
/** Generated alias around `trpc.notificationOutput.getTarget.useQuery`. */
|
|
7576
|
+
var useNotificationOutputGetTarget = trpc.notificationOutput.getTarget.useQuery;
|
|
7575
7577
|
/** Generated alias around `trpc.notificationOutput.discoverTargets.useQuery`. */
|
|
7576
7578
|
var useNotificationOutputDiscoverTargets = trpc.notificationOutput.discoverTargets.useQuery;
|
|
7579
|
+
/** Generated alias around `trpc.notificationOutput.probeTargetConfig.useMutation`. */
|
|
7580
|
+
var useNotificationOutputProbeTargetConfig = trpc.notificationOutput.probeTargetConfig.useMutation;
|
|
7577
7581
|
/** Generated alias around `trpc.notificationOutput.send.useMutation`. */
|
|
7578
7582
|
var useNotificationOutputSend = trpc.notificationOutput.send.useMutation;
|
|
7579
7583
|
/** Generated alias around `trpc.notificationOutput.testTarget.useMutation`. */
|
|
@@ -12368,8 +12372,8 @@ function selectedDeviceOptions(options, selected) {
|
|
|
12368
12372
|
*/
|
|
12369
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";
|
|
12370
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";
|
|
12371
|
-
var LABEL_CLASS$
|
|
12372
|
-
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";
|
|
12373
12377
|
/** The compact projection of the listAll rows the device fields consume. */
|
|
12374
12378
|
function toCandidates(rows) {
|
|
12375
12379
|
if (!Array.isArray(rows)) return [];
|
|
@@ -12456,14 +12460,14 @@ function FacetDropdown$1({ label, values, chosen, onChange }) {
|
|
|
12456
12460
|
})]
|
|
12457
12461
|
})] });
|
|
12458
12462
|
}
|
|
12459
|
-
function FieldShell({ label, description, required, translationFn, children }) {
|
|
12463
|
+
function FieldShell$1({ label, description, required, translationFn, children }) {
|
|
12460
12464
|
const resolvedLabel = resolveLabel(label, translationFn);
|
|
12461
12465
|
const resolvedDescription = resolveLabel(description, translationFn);
|
|
12462
12466
|
return /* @__PURE__ */ jsxs("div", {
|
|
12463
12467
|
className: "min-w-0",
|
|
12464
12468
|
children: [
|
|
12465
12469
|
resolvedLabel !== void 0 && resolvedLabel !== "" && /* @__PURE__ */ jsxs("label", {
|
|
12466
|
-
className: LABEL_CLASS$
|
|
12470
|
+
className: LABEL_CLASS$3,
|
|
12467
12471
|
children: [resolvedLabel, required && /* @__PURE__ */ jsx("span", {
|
|
12468
12472
|
className: "text-danger ml-0.5",
|
|
12469
12473
|
children: "*"
|
|
@@ -12471,7 +12475,7 @@ function FieldShell({ label, description, required, translationFn, children }) {
|
|
|
12471
12475
|
}),
|
|
12472
12476
|
children,
|
|
12473
12477
|
resolvedDescription && /* @__PURE__ */ jsx("p", {
|
|
12474
|
-
className: DESC_CLASS$
|
|
12478
|
+
className: DESC_CLASS$2,
|
|
12475
12479
|
children: resolvedDescription
|
|
12476
12480
|
})
|
|
12477
12481
|
]
|
|
@@ -12481,7 +12485,7 @@ function DeviceSelectField({ field, value, onChange, disabled, translationFn })
|
|
|
12481
12485
|
const { data } = useDeviceManagerListAll({});
|
|
12482
12486
|
const options = useMemo(() => devicesToOptions(toCandidates(data), field.deviceFilter), [data, field.deviceFilter]);
|
|
12483
12487
|
const current = value === void 0 || value === null ? "" : String(value);
|
|
12484
|
-
return /* @__PURE__ */ jsx(FieldShell, {
|
|
12488
|
+
return /* @__PURE__ */ jsx(FieldShell$1, {
|
|
12485
12489
|
label: field.label,
|
|
12486
12490
|
description: field.description,
|
|
12487
12491
|
required: field.required,
|
|
@@ -12559,7 +12563,7 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
|
|
|
12559
12563
|
className: "min-w-0",
|
|
12560
12564
|
children: [
|
|
12561
12565
|
label !== void 0 && label !== "" && /* @__PURE__ */ jsx("label", {
|
|
12562
|
-
className: LABEL_CLASS$
|
|
12566
|
+
className: LABEL_CLASS$3,
|
|
12563
12567
|
children: label
|
|
12564
12568
|
}),
|
|
12565
12569
|
selectedOptions.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
@@ -12682,6 +12686,720 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
|
|
|
12682
12686
|
})
|
|
12683
12687
|
}),
|
|
12684
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", {
|
|
12685
13403
|
className: DESC_CLASS$1,
|
|
12686
13404
|
children: description
|
|
12687
13405
|
})
|
|
@@ -12689,6 +13407,242 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
|
|
|
12689
13407
|
});
|
|
12690
13408
|
}
|
|
12691
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
|
|
12692
13646
|
//#region src/contexts/custom-field-renderers.tsx
|
|
12693
13647
|
/**
|
|
12694
13648
|
* Custom field renderer registry.
|
|
@@ -12742,115 +13696,6 @@ function useCustomFieldRenderer(type) {
|
|
|
12742
13696
|
return useContext(CustomFieldRenderersContext)[type] ?? null;
|
|
12743
13697
|
}
|
|
12744
13698
|
//#endregion
|
|
12745
|
-
//#region src/composites/event-kind-visuals.tsx
|
|
12746
|
-
/**
|
|
12747
|
-
* Event-kind VISUALS — the UI-side half of the unified taxonomy dictionary
|
|
12748
|
-
* (`@camstack/types` `EVENT_TAXONOMY` owns the serializable data:
|
|
12749
|
-
* color / iconId / labelKey; this owns `iconId → lucide component` and
|
|
12750
|
-
* `labelKey → t()`).
|
|
12751
|
-
*
|
|
12752
|
-
* Every UI that renders an event kind (timeline, events tree, chips,
|
|
12753
|
-
* detection canvas/tree) resolves its glyph + translated label here — no
|
|
12754
|
-
* per-component hardcoded icon or label.
|
|
12755
|
-
*/
|
|
12756
|
-
/**
|
|
12757
|
-
* `iconId` → lucide component. Built ONLY from statically-imported icons
|
|
12758
|
-
* (bundle-safe). Unknown ids resolve to the neutral `Tag` fallback.
|
|
12759
|
-
*/
|
|
12760
|
-
var EVENT_KIND_ICONS = {
|
|
12761
|
-
motion: Activity,
|
|
12762
|
-
audio: Volume2,
|
|
12763
|
-
person: User,
|
|
12764
|
-
vehicle: Car,
|
|
12765
|
-
animal: PawPrint,
|
|
12766
|
-
package: Package,
|
|
12767
|
-
sensor: Radio,
|
|
12768
|
-
control: SlidersHorizontal,
|
|
12769
|
-
car: Car,
|
|
12770
|
-
truck: Truck,
|
|
12771
|
-
bus: Bus,
|
|
12772
|
-
motorcycle: Bike,
|
|
12773
|
-
bicycle: Bike,
|
|
12774
|
-
airplane: Plane,
|
|
12775
|
-
boat: Sailboat,
|
|
12776
|
-
train: TrainFront,
|
|
12777
|
-
bird: Bird,
|
|
12778
|
-
cat: Cat,
|
|
12779
|
-
dog: Dog,
|
|
12780
|
-
horse: PawPrint,
|
|
12781
|
-
sheep: PawPrint,
|
|
12782
|
-
cow: PawPrint,
|
|
12783
|
-
elephant: PawPrint,
|
|
12784
|
-
bear: PawPrint,
|
|
12785
|
-
zebra: PawPrint,
|
|
12786
|
-
giraffe: PawPrint,
|
|
12787
|
-
door: DoorOpen,
|
|
12788
|
-
pir: Radar,
|
|
12789
|
-
smoke: Flame,
|
|
12790
|
-
water: Droplet,
|
|
12791
|
-
gas: Wind,
|
|
12792
|
-
vibration: Vibrate,
|
|
12793
|
-
tamper: ShieldAlert,
|
|
12794
|
-
presence: UserCheck,
|
|
12795
|
-
generic: Tag,
|
|
12796
|
-
lock: Lock,
|
|
12797
|
-
siren: Siren,
|
|
12798
|
-
switch: ToggleRight,
|
|
12799
|
-
doorbell: BellRing,
|
|
12800
|
-
button: CircleDot,
|
|
12801
|
-
"audio-speech": MessageSquare,
|
|
12802
|
-
"audio-scream": Megaphone,
|
|
12803
|
-
"audio-crying": Baby,
|
|
12804
|
-
"audio-laughter": Laugh,
|
|
12805
|
-
"audio-music": Music,
|
|
12806
|
-
"audio-dog": Dog,
|
|
12807
|
-
"audio-cat": Cat,
|
|
12808
|
-
"audio-bird": Bird,
|
|
12809
|
-
"audio-animal": PawPrint,
|
|
12810
|
-
"audio-alarm": BellRing,
|
|
12811
|
-
"audio-doorbell": BellRing,
|
|
12812
|
-
"audio-glass_breaking": TriangleAlert,
|
|
12813
|
-
"audio-gunshot": Crosshair,
|
|
12814
|
-
"audio-vehicle": Car,
|
|
12815
|
-
"audio-siren": Siren,
|
|
12816
|
-
"audio-fire": Flame,
|
|
12817
|
-
"audio-water": Droplets,
|
|
12818
|
-
"audio-wind": Wind,
|
|
12819
|
-
"audio-door": DoorOpen,
|
|
12820
|
-
"audio-footsteps": Footprints,
|
|
12821
|
-
"audio-crowd": Users,
|
|
12822
|
-
"audio-telephone": Phone,
|
|
12823
|
-
"audio-engine": Cog,
|
|
12824
|
-
"audio-tools": Hammer,
|
|
12825
|
-
"audio-silence": VolumeX
|
|
12826
|
-
};
|
|
12827
|
-
/** Resolve an `iconId` to a lucide component (falls back to `Tag`). */
|
|
12828
|
-
function resolveEventKindIcon(iconId) {
|
|
12829
|
-
if (Object.hasOwn(EVENT_KIND_ICONS, iconId)) return EVENT_KIND_ICONS[iconId];
|
|
12830
|
-
if (iconId.startsWith("audio-")) return Volume2;
|
|
12831
|
-
return Tag;
|
|
12832
|
-
}
|
|
12833
|
-
/**
|
|
12834
|
-
* Translated label for an event kind — `t(labelKey)` when a translation
|
|
12835
|
-
* exists, else the English `label` fallback. Robust to a missing key: an
|
|
12836
|
-
* i18n backend that echoes the key unchanged (react-i18next default) is
|
|
12837
|
-
* treated as "no translation" and the fallback label is returned, so the UI
|
|
12838
|
-
* never renders a raw `eventKind.*` key.
|
|
12839
|
-
*/
|
|
12840
|
-
function eventKindLabel(descriptor, t) {
|
|
12841
|
-
if (t === void 0) return descriptor.label;
|
|
12842
|
-
const translated = t(descriptor.labelKey);
|
|
12843
|
-
return translated === descriptor.labelKey || translated.length === 0 ? descriptor.label : translated;
|
|
12844
|
-
}
|
|
12845
|
-
/** Small convenience component: renders the lucide glyph for an `iconId`. */
|
|
12846
|
-
function EventKindGlyph({ iconId, size = 16, color, className }) {
|
|
12847
|
-
return createElement(resolveEventKindIcon(iconId), {
|
|
12848
|
-
size,
|
|
12849
|
-
color,
|
|
12850
|
-
className
|
|
12851
|
-
});
|
|
12852
|
-
}
|
|
12853
|
-
//#endregion
|
|
12854
13699
|
//#region src/composites/confirm-dialog.tsx
|
|
12855
13700
|
/**
|
|
12856
13701
|
* The ONE modal dialog of the product — confirm, alert and prompt.
|
|
@@ -19098,59 +19943,6 @@ function useCapabilityPresence(capabilityName) {
|
|
|
19098
19943
|
return classifyCapability(query.data);
|
|
19099
19944
|
}
|
|
19100
19945
|
//#endregion
|
|
19101
|
-
//#region ../../node_modules/class-variance-authority/dist/index.mjs
|
|
19102
|
-
/**
|
|
19103
|
-
* Copyright 2022 Joe Bell. All rights reserved.
|
|
19104
|
-
*
|
|
19105
|
-
* This file is licensed to you under the Apache License, Version 2.0
|
|
19106
|
-
* (the "License"); you may not use this file except in compliance with the
|
|
19107
|
-
* License. You may obtain a copy of the License at
|
|
19108
|
-
*
|
|
19109
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
19110
|
-
*
|
|
19111
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
19112
|
-
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
19113
|
-
* WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the
|
|
19114
|
-
* License for the specific language governing permissions and limitations under
|
|
19115
|
-
* the License.
|
|
19116
|
-
*/ var falsyToString = (value) => typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
|
|
19117
|
-
var cx = clsx;
|
|
19118
|
-
var cva = (base, config) => (props) => {
|
|
19119
|
-
var _config_compoundVariants;
|
|
19120
|
-
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);
|
|
19121
|
-
const { variants, defaultVariants } = config;
|
|
19122
|
-
const getVariantClassNames = Object.keys(variants).map((variant) => {
|
|
19123
|
-
const variantProp = props === null || props === void 0 ? void 0 : props[variant];
|
|
19124
|
-
const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
|
|
19125
|
-
if (variantProp === null) return null;
|
|
19126
|
-
const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
|
|
19127
|
-
return variants[variant][variantKey];
|
|
19128
|
-
});
|
|
19129
|
-
const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param) => {
|
|
19130
|
-
let [key, value] = param;
|
|
19131
|
-
if (value === void 0) return acc;
|
|
19132
|
-
acc[key] = value;
|
|
19133
|
-
return acc;
|
|
19134
|
-
}, {});
|
|
19135
|
-
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) => {
|
|
19136
|
-
let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
|
|
19137
|
-
return Object.entries(compoundVariantOptions).every((param) => {
|
|
19138
|
-
let [key, value] = param;
|
|
19139
|
-
return Array.isArray(value) ? value.includes({
|
|
19140
|
-
...defaultVariants,
|
|
19141
|
-
...propsWithoutUndefined
|
|
19142
|
-
}[key]) : {
|
|
19143
|
-
...defaultVariants,
|
|
19144
|
-
...propsWithoutUndefined
|
|
19145
|
-
}[key] === value;
|
|
19146
|
-
}) ? [
|
|
19147
|
-
...acc,
|
|
19148
|
-
cvClass,
|
|
19149
|
-
cvClassName
|
|
19150
|
-
] : acc;
|
|
19151
|
-
}, []), props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
19152
|
-
};
|
|
19153
|
-
//#endregion
|
|
19154
19946
|
//#region src/primitives/button.tsx
|
|
19155
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", {
|
|
19156
19948
|
variants: {
|
|
@@ -20013,38 +20805,6 @@ function ClipPanel({ deviceId, clip, profile, onProfileChange }) {
|
|
|
20013
20805
|
});
|
|
20014
20806
|
}
|
|
20015
20807
|
//#endregion
|
|
20016
|
-
//#region src/primitives/badge.tsx
|
|
20017
|
-
var badgeVariants = cva("inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5", {
|
|
20018
|
-
variants: {
|
|
20019
|
-
variant: {
|
|
20020
|
-
default: "bg-surface-hover text-foreground",
|
|
20021
|
-
success: "bg-success/15 text-success",
|
|
20022
|
-
warning: "bg-warning/15 text-warning",
|
|
20023
|
-
danger: "bg-danger/15 text-danger",
|
|
20024
|
-
info: "bg-info/15 text-info"
|
|
20025
|
-
},
|
|
20026
|
-
styleVariant: {
|
|
20027
|
-
solid: "",
|
|
20028
|
-
outline: "border bg-transparent"
|
|
20029
|
-
}
|
|
20030
|
-
},
|
|
20031
|
-
defaultVariants: {
|
|
20032
|
-
variant: "default",
|
|
20033
|
-
styleVariant: "solid"
|
|
20034
|
-
}
|
|
20035
|
-
});
|
|
20036
|
-
var Badge = forwardRef(({ className, variant, style, ...props }, ref) => {
|
|
20037
|
-
return /* @__PURE__ */ jsx("span", {
|
|
20038
|
-
ref,
|
|
20039
|
-
className: cn(badgeVariants({
|
|
20040
|
-
variant,
|
|
20041
|
-
styleVariant: style
|
|
20042
|
-
}), className),
|
|
20043
|
-
...props
|
|
20044
|
-
});
|
|
20045
|
-
});
|
|
20046
|
-
Badge.displayName = "Badge";
|
|
20047
|
-
//#endregion
|
|
20048
20808
|
//#region src/lib/format-duration.ts
|
|
20049
20809
|
/**
|
|
20050
20810
|
* How long something lasted, the way this product says it.
|
|
@@ -26075,6 +26835,7 @@ function MultiSelectField({ field, value, onChange, disabled, translationFn }) {
|
|
|
26075
26835
|
function PasswordField({ field, value, onChange, disabled, translationFn }) {
|
|
26076
26836
|
const [show, setShow] = useState(false);
|
|
26077
26837
|
const showToggle = field.showToggle !== false;
|
|
26838
|
+
const text = value === void 0 || value === null ? "" : String(value);
|
|
26078
26839
|
return /* @__PURE__ */ jsx(FieldWrapper, {
|
|
26079
26840
|
label: field.label,
|
|
26080
26841
|
description: field.description,
|
|
@@ -26086,14 +26847,20 @@ function PasswordField({ field, value, onChange, disabled, translationFn }) {
|
|
|
26086
26847
|
children: [/* @__PURE__ */ jsx("input", {
|
|
26087
26848
|
type: show ? "text" : "password",
|
|
26088
26849
|
className: INPUT_CLASS + (showToggle ? " pr-9" : ""),
|
|
26089
|
-
value:
|
|
26850
|
+
value: text,
|
|
26090
26851
|
placeholder: field.placeholder,
|
|
26091
26852
|
disabled: disabled || field.disabled,
|
|
26092
|
-
|
|
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
|
+
}
|
|
26093
26859
|
}), showToggle && /* @__PURE__ */ jsx("button", {
|
|
26094
26860
|
type: "button",
|
|
26095
26861
|
className: "absolute right-2 top-1/2 -translate-y-1/2 text-foreground-subtle hover:text-foreground",
|
|
26096
26862
|
tabIndex: -1,
|
|
26863
|
+
"aria-label": show ? "Hide password" : "Show password",
|
|
26097
26864
|
onClick: () => setShow((s) => !s),
|
|
26098
26865
|
children: show ? /* @__PURE__ */ jsx(EyeOff, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx(Eye, { className: "h-3.5 w-3.5" })
|
|
26099
26866
|
})]
|
|
@@ -26239,70 +27006,30 @@ function SliderField({ field, value, onChange, disabled, translationFn }) {
|
|
|
26239
27006
|
});
|
|
26240
27007
|
}
|
|
26241
27008
|
function TagsField({ field, value, onChange, disabled, translationFn }) {
|
|
26242
|
-
const tags = Array.isArray(value) ? value : [];
|
|
26243
|
-
const
|
|
26244
|
-
const
|
|
26245
|
-
|
|
26246
|
-
|
|
26247
|
-
|
|
26248
|
-
|
|
26249
|
-
onChange([...tags, trimmed]);
|
|
26250
|
-
setInput("");
|
|
26251
|
-
}, [
|
|
26252
|
-
tags,
|
|
26253
|
-
field.maxTags,
|
|
26254
|
-
onChange
|
|
26255
|
-
]);
|
|
26256
|
-
const removeTag = (tag) => onChange(tags.filter((t) => t !== tag));
|
|
26257
|
-
const handleKeyDown = (e) => {
|
|
26258
|
-
if (e.key === "Enter" || e.key === ",") {
|
|
26259
|
-
e.preventDefault();
|
|
26260
|
-
addTag(input);
|
|
26261
|
-
} else if (e.key === "Backspace" && input === "" && tags.length > 0) removeTag(tags[tags.length - 1]);
|
|
26262
|
-
};
|
|
26263
|
-
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;
|
|
26264
27016
|
return /* @__PURE__ */ jsx(FieldWrapper, {
|
|
26265
27017
|
label: field.label,
|
|
26266
27018
|
description: field.description,
|
|
26267
27019
|
required: field.required,
|
|
26268
27020
|
span: field.span,
|
|
26269
27021
|
translationFn,
|
|
26270
|
-
children: /* @__PURE__ */
|
|
26271
|
-
|
|
26272
|
-
|
|
26273
|
-
|
|
26274
|
-
|
|
26275
|
-
|
|
26276
|
-
|
|
26277
|
-
|
|
26278
|
-
|
|
26279
|
-
|
|
26280
|
-
|
|
26281
|
-
type: "button",
|
|
26282
|
-
onClick: () => removeTag(tag),
|
|
26283
|
-
className: "hover:text-danger",
|
|
26284
|
-
children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
|
|
26285
|
-
})]
|
|
26286
|
-
}, tag)),
|
|
26287
|
-
/* @__PURE__ */ jsx("input", {
|
|
26288
|
-
ref: inputRef,
|
|
26289
|
-
type: "text",
|
|
26290
|
-
className: "flex-1 min-w-[80px] bg-transparent text-sm text-foreground outline-none placeholder:text-foreground-disabled",
|
|
26291
|
-
value: input,
|
|
26292
|
-
placeholder: tags.length === 0 ? field.placeholder ?? "Add tags…" : "",
|
|
26293
|
-
disabled: isDisabled,
|
|
26294
|
-
list: `tags-suggestions-${field.key}`,
|
|
26295
|
-
onChange: (e) => setInput(e.target.value),
|
|
26296
|
-
onKeyDown: handleKeyDown,
|
|
26297
|
-
onBlur: () => {
|
|
26298
|
-
if (input.trim()) addTag(input);
|
|
26299
|
-
}
|
|
26300
|
-
}),
|
|
26301
|
-
field.suggestions && /* @__PURE__ */ jsx("datalist", {
|
|
26302
|
-
id: `tags-suggestions-${field.key}`,
|
|
26303
|
-
children: field.suggestions.map((s) => /* @__PURE__ */ jsx("option", { value: s }, s))
|
|
26304
|
-
})
|
|
26305
|
-
]
|
|
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}`
|
|
26306
27033
|
})
|
|
26307
27034
|
});
|
|
26308
27035
|
}
|
|
@@ -27534,6 +28261,20 @@ function FormField({ field, values, onChange, disabled, translationFn, onTestFie
|
|
|
27534
28261
|
disabled,
|
|
27535
28262
|
translationFn
|
|
27536
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
|
+
});
|
|
27537
28278
|
case "probe": return /* @__PURE__ */ jsx(ProbeField, {
|
|
27538
28279
|
field,
|
|
27539
28280
|
value,
|
|
@@ -29066,9 +29807,6 @@ var DialogContent = forwardRef(({ className, width, placement, scroll, children,
|
|
|
29066
29807
|
if (open && !el.open) el.showModal();
|
|
29067
29808
|
if (!open && el.open) el.close();
|
|
29068
29809
|
}, [open, dialogRef]);
|
|
29069
|
-
const handleClick = (e) => {
|
|
29070
|
-
if (e.target === e.currentTarget) setOpen(false);
|
|
29071
|
-
};
|
|
29072
29810
|
return /* @__PURE__ */ jsx("dialog", {
|
|
29073
29811
|
ref: dialogRef,
|
|
29074
29812
|
id: contentId,
|
|
@@ -29077,7 +29815,6 @@ var DialogContent = forwardRef(({ className, width, placement, scroll, children,
|
|
|
29077
29815
|
placement,
|
|
29078
29816
|
scroll
|
|
29079
29817
|
}), className),
|
|
29080
|
-
onClick: handleClick,
|
|
29081
29818
|
onClose: () => setOpen(false),
|
|
29082
29819
|
...props,
|
|
29083
29820
|
children
|
|
@@ -39274,7 +40011,7 @@ function ControlWidget({ slice, busy, setValueFn, layout }) {
|
|
|
39274
40011
|
value: e.target.value
|
|
39275
40012
|
} });
|
|
39276
40013
|
},
|
|
39277
|
-
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"),
|
|
39278
40015
|
children: slice.options.map((opt) => /* @__PURE__ */ jsx("option", {
|
|
39279
40016
|
value: opt,
|
|
39280
40017
|
children: opt
|
|
@@ -40353,12 +41090,13 @@ function BatteryBar({ percent }) {
|
|
|
40353
41090
|
});
|
|
40354
41091
|
}
|
|
40355
41092
|
function SensorHeroInner({ trpc, device }) {
|
|
40356
|
-
const roleDescriptor = device.role != null ? ROLE_DESCRIPTOR[device.role] :
|
|
41093
|
+
const roleDescriptor = device.role != null ? ROLE_DESCRIPTOR[device.role] : ROLE_DESCRIPTOR["temperature-sensor"];
|
|
40357
41094
|
const isBattery = isBatterySensorRole(device.role);
|
|
40358
41095
|
const { data: roleDefaultsData } = useDeviceManagerGetRoleDisplayDefaults({}, { staleTime: 6e4 });
|
|
40359
41096
|
const dev = useDeviceProxy(trpc, device.id);
|
|
40360
41097
|
const numericSlice = useDeviceStateSlice(dev !== null && roleDescriptor !== void 0 ? roleDescriptor.getSliceHandle(dev.state) : void 0);
|
|
40361
41098
|
const binaryBatterySlice = useDeviceStateSlice(dev !== null && isBattery ? dev.state.binary : void 0);
|
|
41099
|
+
const occupancySlice = useDeviceStateSlice(dev !== null && !isBattery ? dev.state.binary : void 0);
|
|
40362
41100
|
const useBinaryBattery = isBattery && roleDescriptor?.kind === "numeric" && !hasBatteryNumericValue(numericSlice, roleDescriptor.field) && binaryBatterySlice !== void 0;
|
|
40363
41101
|
const descriptor = useBinaryBattery ? BINARY_BATTERY_DESCRIPTOR : roleDescriptor;
|
|
40364
41102
|
const slice = useBinaryBattery ? binaryBatterySlice : numericSlice;
|
|
@@ -40382,12 +41120,14 @@ function SensorHeroInner({ trpc, device }) {
|
|
|
40382
41120
|
const resolved = resolveSensorDisplay({
|
|
40383
41121
|
display: device.display,
|
|
40384
41122
|
capName: device.role === "numeric-sensor" ? "numeric-sensor" : void 0,
|
|
40385
|
-
roleDefault: device.role != null ? roleDefaultsData?.defaults[device.role] :
|
|
41123
|
+
roleDefault: device.role != null ? roleDefaultsData?.defaults[device.role] : roleDefaultsData?.defaults["temperature-sensor"],
|
|
40386
41124
|
sliceUnit: liveUnit,
|
|
40387
41125
|
slicePrecision,
|
|
40388
41126
|
canonicalUnit: descriptor.canonicalUnit
|
|
40389
41127
|
});
|
|
40390
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;
|
|
40391
41131
|
return /* @__PURE__ */ jsxs("div", {
|
|
40392
41132
|
className: "flex flex-col items-center justify-center gap-2 rounded-lg border border-border bg-surface p-4",
|
|
40393
41133
|
children: [
|
|
@@ -40395,13 +41135,18 @@ function SensorHeroInner({ trpc, device }) {
|
|
|
40395
41135
|
className: "flex items-baseline gap-1",
|
|
40396
41136
|
children: [/* @__PURE__ */ jsx("span", {
|
|
40397
41137
|
className: "text-3xl font-semibold tabular-nums text-foreground",
|
|
40398
|
-
children:
|
|
41138
|
+
children: formatted
|
|
40399
41139
|
}), unit && /* @__PURE__ */ jsx("span", {
|
|
40400
41140
|
className: "text-base text-foreground-subtle",
|
|
40401
41141
|
children: unit
|
|
40402
41142
|
})]
|
|
40403
41143
|
}),
|
|
40404
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
|
+
}),
|
|
40405
41150
|
/* @__PURE__ */ jsx("span", {
|
|
40406
41151
|
className: "text-sm text-foreground-subtle",
|
|
40407
41152
|
children: device.name
|
|
@@ -48231,11 +48976,11 @@ function useDeviceAdminLink(trpc, deviceId) {
|
|
|
48231
48976
|
cap: (d) => d.deviceAdminLink,
|
|
48232
48977
|
slice: () => void 0
|
|
48233
48978
|
});
|
|
48234
|
-
const
|
|
48979
|
+
const capBound = dev !== null && cap !== void 0 && cap !== null && (dev.binding?.entries.some((e) => e.capName === "device-admin-link") ?? true);
|
|
48235
48980
|
const [state, setState] = useState({ kind: "pending" });
|
|
48236
48981
|
useEffect(() => {
|
|
48237
|
-
if (!
|
|
48238
|
-
setState({ kind: "
|
|
48982
|
+
if (!capBound || cap === void 0 || cap === null) {
|
|
48983
|
+
setState({ kind: "none" });
|
|
48239
48984
|
return;
|
|
48240
48985
|
}
|
|
48241
48986
|
let live = true;
|
|
@@ -48256,7 +49001,7 @@ function useDeviceAdminLink(trpc, deviceId) {
|
|
|
48256
49001
|
live = false;
|
|
48257
49002
|
};
|
|
48258
49003
|
}, [
|
|
48259
|
-
|
|
49004
|
+
capBound,
|
|
48260
49005
|
cap,
|
|
48261
49006
|
deviceId
|
|
48262
49007
|
]);
|
|
@@ -49330,6 +50075,51 @@ function DeviceItemPreview({ trpc, device, status, enabled, showStatusPills = fa
|
|
|
49330
50075
|
});
|
|
49331
50076
|
}
|
|
49332
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
|
|
49333
50123
|
//#region src/composites/device-item/status-dot.tsx
|
|
49334
50124
|
/** The states that breathe (are "alive"). Offline + disabled are static. */
|
|
49335
50125
|
function isAlive(status) {
|
|
@@ -49607,6 +50397,7 @@ function DeviceItem(props) {
|
|
|
49607
50397
|
flags,
|
|
49608
50398
|
controlPlacement: "right"
|
|
49609
50399
|
}),
|
|
50400
|
+
/* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
|
|
49610
50401
|
renderRowAction && /* @__PURE__ */ jsx("span", {
|
|
49611
50402
|
onClick: (e) => e.stopPropagation(),
|
|
49612
50403
|
children: renderRowAction(device)
|
|
@@ -49689,6 +50480,7 @@ function DeviceItem(props) {
|
|
|
49689
50480
|
flags,
|
|
49690
50481
|
controlPlacement: "right"
|
|
49691
50482
|
}),
|
|
50483
|
+
/* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
|
|
49692
50484
|
renderRowAction && /* @__PURE__ */ jsx("span", {
|
|
49693
50485
|
onClick: (e) => e.stopPropagation(),
|
|
49694
50486
|
children: renderRowAction(device)
|
|
@@ -49790,6 +50582,7 @@ function DeviceItemTableRow(props) {
|
|
|
49790
50582
|
enabled: showSnapshot && isCamera,
|
|
49791
50583
|
showStatusPills: true
|
|
49792
50584
|
}),
|
|
50585
|
+
/* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
|
|
49793
50586
|
renderRowAction && /* @__PURE__ */ jsx("span", {
|
|
49794
50587
|
onClick: (e) => e.stopPropagation(),
|
|
49795
50588
|
children: renderRowAction(device)
|
|
@@ -50887,10 +51680,10 @@ function useDeviceListRealtimeSync() {
|
|
|
50887
51680
|
* `renderItem`.
|
|
50888
51681
|
*/
|
|
50889
51682
|
function GenericModeList(props) {
|
|
50890
|
-
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;
|
|
50891
51684
|
const [searchInput, setSearchInput] = useState("");
|
|
50892
51685
|
const debouncedSearch = useDebouncedString(searchInput, 300);
|
|
50893
|
-
const [typeFilters, setTypeFilters] = useState([]);
|
|
51686
|
+
const [typeFilters, setTypeFilters] = useState(() => [...initialTypeFilters]);
|
|
50894
51687
|
const [page, setPage] = useState(1);
|
|
50895
51688
|
useEffect(() => {
|
|
50896
51689
|
setPage(1);
|
|
@@ -55756,39 +56549,6 @@ function VersionBadge({ version, preRelease, className }) {
|
|
|
55756
56549
|
});
|
|
55757
56550
|
}
|
|
55758
56551
|
//#endregion
|
|
55759
|
-
//#region src/composites/device-picker/SelectedChip.tsx
|
|
55760
|
-
/**
|
|
55761
|
-
* Removable selection chip + the search-box shell shared by DevicePicker and
|
|
55762
|
-
* SearchableMultiSelectField (admin-ui). Lives here so addon MFEs can render
|
|
55763
|
-
* the same picker without importing admin-ui.
|
|
55764
|
-
*/
|
|
55765
|
-
/** The search box's shell — shared with multiselect fields that mirror this picker. */
|
|
55766
|
-
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";
|
|
55767
|
-
/** One selected entry as a removable chip. */
|
|
55768
|
-
function SelectedChip({ label, onRemove, warning = false, iconId, testId }) {
|
|
55769
|
-
return /* @__PURE__ */ jsxs("span", {
|
|
55770
|
-
"data-testid": testId,
|
|
55771
|
-
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",
|
|
55772
|
-
children: [
|
|
55773
|
-
iconId !== void 0 && /* @__PURE__ */ jsx(EventKindGlyph, {
|
|
55774
|
-
iconId,
|
|
55775
|
-
size: 12
|
|
55776
|
-
}),
|
|
55777
|
-
/* @__PURE__ */ jsx("span", {
|
|
55778
|
-
className: "truncate",
|
|
55779
|
-
children: label
|
|
55780
|
-
}),
|
|
55781
|
-
onRemove !== void 0 && /* @__PURE__ */ jsx("button", {
|
|
55782
|
-
type: "button",
|
|
55783
|
-
className: "shrink-0 hover:text-danger",
|
|
55784
|
-
"aria-label": `Remove ${label}`,
|
|
55785
|
-
onClick: onRemove,
|
|
55786
|
-
children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
|
|
55787
|
-
})
|
|
55788
|
-
]
|
|
55789
|
-
});
|
|
55790
|
-
}
|
|
55791
|
-
//#endregion
|
|
55792
56552
|
//#region src/composites/device-picker/device-picker-model.ts
|
|
55793
56553
|
/** Numbers numerically, anything else by its text — the name tie-break. */
|
|
55794
56554
|
function compareIds(a, b) {
|
|
@@ -58119,4 +58879,4 @@ var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-vfWTm6qv.js").t
|
|
|
58119
58879
|
/** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
|
|
58120
58880
|
var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-DMkchqO1.js").then((m) => ({ default: m.PrivacyMaskSettings })));
|
|
58121
58881
|
//#endregion
|
|
58122
|
-
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, 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, 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, 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 };
|
|
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 };
|