@camstack/ui-library 1.2.348 → 1.2.350
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/CHANGELOG.md +15 -0
- package/dist/{SceneMonitorEditor-BgqJYVdM.js → SceneMonitorEditor-A1U5eCrC.js} +1 -1
- package/dist/composites/device-controls/pet-fountain-panel.d.ts +12 -0
- package/dist/composites/device-controls/types.d.ts +1 -1
- package/dist/composites/export-entity-rows.d.ts +33 -0
- package/dist/composites/sectioned-page.d.ts +3 -0
- package/dist/generated/system-hooks.d.ts +20 -0
- package/dist/hooks/merge-detections.d.ts +16 -0
- package/dist/{icons-CWmwnulO.cjs → icons-BJpFQcLH.cjs} +1 -14
- package/dist/{icons-Bd6sbDsv.js → icons-Cf1xnXkh.js} +1 -14
- package/dist/index.cjs +879 -103
- package/dist/index.js +871 -106
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.2.350] - 2026-10-29
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- The device export table also lists actions and notification targets, for the exporters that support them, with the same Expose toggle and type filter.
|
|
15
|
+
- Pages with a fixed-height body (Build-your-self Automations, Actions and Code tabs, OSD Manager) now scroll when their content is taller than the screen
|
|
16
|
+
- A pet fountain hero card with tank gauge, drinking totals and pump controls; the feeder shows the bowl in grams
|
|
17
|
+
|
|
18
|
+
## [1.2.349] - 2026-10-29
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Live detection boxes ignore out-of-order frames and fade by frame age
|
|
23
|
+
- Live detection boxes come straight from the detector; faces, plates and names attach as they arrive
|
|
24
|
+
|
|
10
25
|
## [1.2.348] - 2026-10-29
|
|
11
26
|
|
|
12
27
|
### Added
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as Settings2 } from "./settings-2-jT1iBqHD.js";
|
|
2
|
-
import { A as Trash2,
|
|
2
|
+
import { A as Trash2, Cr as Camera, SCENE_CAPTURE_VARIANTS, TEXT_HINT, UiTrans, badgeFor, coverageLine, fn as ImageOff, hubPath, isAbsentProvider, pt as RotateCcw, roiTooLarge, statusLine, useConfirm, useDeviceProxy, useDeviceSnapshotImage, useDeviceStateSlice, useSystem, useUiText, variantLabel } from "./index.js";
|
|
3
3
|
import { MaskShapeCanvas } from "./MaskShapeCanvas-C9cJlxvG.js";
|
|
4
4
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
5
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { ControlPanelProps } from "./types";
|
|
3
|
+
export declare function PetFountainPanel({ trpc, deviceId, layout, optimistic }: ControlPanelProps): ReactNode;
|
|
4
|
+
interface DeviceControlProps {
|
|
5
|
+
readonly trpc: ControlPanelProps["trpc"];
|
|
6
|
+
readonly deviceId: number;
|
|
7
|
+
readonly features: readonly string[] | undefined;
|
|
8
|
+
readonly optimistic?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function PetFountainInlineControl({ trpc, deviceId, features, optimistic }: DeviceControlProps): ReactNode;
|
|
11
|
+
export declare function PetFountainHeroCard({ trpc, deviceId, features, optimistic }: DeviceControlProps): ReactNode;
|
|
12
|
+
export {};
|
|
@@ -13,5 +13,5 @@ export interface ControlPanelProps {
|
|
|
13
13
|
/** Cap names whose presence (bound on a device) means it has a control surface.
|
|
14
14
|
* Single source of truth shared by the row registry and the detail Controls tab
|
|
15
15
|
* so the two never drift. */
|
|
16
|
-
export declare const CONTROL_CAP_NAMES: readonly ["cover", "lock-control", "switch", "brightness", "fan-control", "climate-control", "media-player", "control", "pet-feeder", "dishwasher"];
|
|
16
|
+
export declare const CONTROL_CAP_NAMES: readonly ["cover", "lock-control", "switch", "brightness", "fan-control", "climate-control", "media-player", "control", "pet-feeder", "pet-fountain", "dishwasher"];
|
|
17
17
|
export type ControlCapName = (typeof CONTROL_CAP_NAMES)[number];
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** The kinds this module builds rows for. A device is the table's own row. */
|
|
2
|
+
export type ExportEntityRowKind = "action" | "notifier";
|
|
3
|
+
export type ExportEntityRowRef = {
|
|
4
|
+
readonly kind: "action";
|
|
5
|
+
readonly actionId: string;
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: "notifier";
|
|
8
|
+
readonly targetId: string;
|
|
9
|
+
};
|
|
10
|
+
export interface ExportEntityRow {
|
|
11
|
+
readonly kind: ExportEntityRowKind;
|
|
12
|
+
/** Unique in the table and never a device id (those are numeric). */
|
|
13
|
+
readonly key: string;
|
|
14
|
+
readonly ref: ExportEntityRowRef;
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly exposed: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** The type-filter ids of the entity kinds, apart from every device type. */
|
|
19
|
+
export declare const ENTITY_FILTER_IDS: Readonly<Record<ExportEntityRowKind, string>>;
|
|
20
|
+
/**
|
|
21
|
+
* The non-device kinds the exporter answered, or null when it did not answer
|
|
22
|
+
* (unknown — never an empty set).
|
|
23
|
+
*/
|
|
24
|
+
export declare function supportedEntityKinds(data: unknown): ReadonlySet<ExportEntityRowKind> | null;
|
|
25
|
+
export interface BuildEntityRowsInput {
|
|
26
|
+
readonly kinds: ReadonlySet<ExportEntityRowKind> | null;
|
|
27
|
+
readonly actions: unknown;
|
|
28
|
+
readonly targets: unknown;
|
|
29
|
+
readonly exposed: unknown;
|
|
30
|
+
}
|
|
31
|
+
export declare function buildEntityRows(input: BuildEntityRowsInput): readonly ExportEntityRow[];
|
|
32
|
+
/** The type-filter ids to add beside the device types: one per SUPPORTED kind. */
|
|
33
|
+
export declare function entityFilterOptionIds(kinds: ReadonlySet<ExportEntityRowKind> | null): readonly string[];
|
|
@@ -45,6 +45,9 @@ export interface SectionedPageProps {
|
|
|
45
45
|
readonly onSectionChange?: (id: string, ownedParamsToClear: readonly string[]) => void;
|
|
46
46
|
/**
|
|
47
47
|
* Fill the parent height so a section body can host a flex-filling DataTable.
|
|
48
|
+
* The section body scrolls vertically on its own, so a section that is plain
|
|
49
|
+
* flow content (a form, an editor) stays reachable when the host `<main>`
|
|
50
|
+
* does not scroll; a `DataTable fill` inside fits the body and scrolls itself.
|
|
48
51
|
* Forwarded to `PageShell`; ignored for `sectionsOnly`.
|
|
49
52
|
*/
|
|
50
53
|
readonly fill?: boolean;
|
|
@@ -501,6 +501,14 @@ export declare const useDeviceExportListExposedDevices: typeof trpc.deviceExport
|
|
|
501
501
|
export declare const useDeviceExportExposeDevice: typeof trpc.deviceExport.exposeDevice.useMutation;
|
|
502
502
|
/** Generated alias around `trpc.deviceExport.unexposeDevice.useMutation`. */
|
|
503
503
|
export declare const useDeviceExportUnexposeDevice: typeof trpc.deviceExport.unexposeDevice.useMutation;
|
|
504
|
+
/** Generated alias around `trpc.deviceExport.listSupportedEntityKinds.useQuery`. */
|
|
505
|
+
export declare const useDeviceExportListSupportedEntityKinds: typeof trpc.deviceExport.listSupportedEntityKinds.useQuery;
|
|
506
|
+
/** Generated alias around `trpc.deviceExport.listExposedEntities.useQuery`. */
|
|
507
|
+
export declare const useDeviceExportListExposedEntities: typeof trpc.deviceExport.listExposedEntities.useQuery;
|
|
508
|
+
/** Generated alias around `trpc.deviceExport.exposeEntity.useMutation`. */
|
|
509
|
+
export declare const useDeviceExportExposeEntity: typeof trpc.deviceExport.exposeEntity.useMutation;
|
|
510
|
+
/** Generated alias around `trpc.deviceExport.unexposeEntity.useMutation`. */
|
|
511
|
+
export declare const useDeviceExportUnexposeEntity: typeof trpc.deviceExport.unexposeEntity.useMutation;
|
|
504
512
|
/** Generated alias around `trpc.deviceExport.getDeviceSettingsContribution.useQuery`. */
|
|
505
513
|
export declare const useDeviceExportGetDeviceSettingsContribution: typeof trpc.deviceExport.getDeviceSettingsContribution.useQuery;
|
|
506
514
|
/** Generated alias around `trpc.deviceExport.getDeviceLiveContribution.useQuery`. */
|
|
@@ -1403,6 +1411,18 @@ export declare const usePetFeederSetFeedSound: typeof trpc.petFeeder.setFeedSoun
|
|
|
1403
1411
|
export declare const usePetFeederSetVolume: typeof trpc.petFeeder.setVolume.useMutation;
|
|
1404
1412
|
/** Generated alias around `trpc.petFeeder.getStatus.useQuery`. */
|
|
1405
1413
|
export declare const usePetFeederGetStatus: typeof trpc.petFeeder.getStatus.useQuery;
|
|
1414
|
+
/** Generated alias around `trpc.petFountain.setPump.useMutation`. */
|
|
1415
|
+
export declare const usePetFountainSetPump: typeof trpc.petFountain.setPump.useMutation;
|
|
1416
|
+
/** Generated alias around `trpc.petFountain.setPumpInterval.useMutation`. */
|
|
1417
|
+
export declare const usePetFountainSetPumpInterval: typeof trpc.petFountain.setPumpInterval.useMutation;
|
|
1418
|
+
/** Generated alias around `trpc.petFountain.setPumpOnMinutes.useMutation`. */
|
|
1419
|
+
export declare const usePetFountainSetPumpOnMinutes: typeof trpc.petFountain.setPumpOnMinutes.useMutation;
|
|
1420
|
+
/** Generated alias around `trpc.petFountain.setPumpOffMinutes.useMutation`. */
|
|
1421
|
+
export declare const usePetFountainSetPumpOffMinutes: typeof trpc.petFountain.setPumpOffMinutes.useMutation;
|
|
1422
|
+
/** Generated alias around `trpc.petFountain.resetDailyConsumption.useMutation`. */
|
|
1423
|
+
export declare const usePetFountainResetDailyConsumption: typeof trpc.petFountain.resetDailyConsumption.useMutation;
|
|
1424
|
+
/** Generated alias around `trpc.petFountain.getStatus.useQuery`. */
|
|
1425
|
+
export declare const usePetFountainGetStatus: typeof trpc.petFountain.getStatus.useQuery;
|
|
1406
1426
|
/** Generated alias around `trpc.pipelineAnalytics.getActiveTracks.useQuery`. */
|
|
1407
1427
|
export declare const usePipelineAnalyticsGetActiveTracks: typeof trpc.pipelineAnalytics.getActiveTracks.useQuery;
|
|
1408
1428
|
/** Generated alias around `trpc.pipelineAnalytics.getTrack.useQuery`. */
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge of the two live overlay sources into the one flat list the overlay
|
|
3
|
+
* renders. Root boxes ALWAYS come from the raw detector frame; the enriched
|
|
4
|
+
* (post-analysis) frame contributes only EXTRAS — detail children (face,
|
|
5
|
+
* plate…) and identity labels — attached to the matching raw root.
|
|
6
|
+
*/
|
|
7
|
+
import type { ObjectDetection } from "@camstack/types";
|
|
8
|
+
/** Minimum IoU between an enriched root and a raw root to call them one subject
|
|
9
|
+
* when no trackId pairs them. */
|
|
10
|
+
export declare const EXTRA_MATCH_IOU_THRESHOLD = .3;
|
|
11
|
+
export interface FramePart {
|
|
12
|
+
readonly detections: readonly ObjectDetection[];
|
|
13
|
+
readonly frameWidth: number;
|
|
14
|
+
readonly frameHeight: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function mergeDetections(raw: FramePart | null, extras: FramePart | null): FramePart | null;
|
|
@@ -12748,19 +12748,6 @@ var Equal = require_createLucideIcon.createLucideIcon("equal", [["line", {
|
|
|
12748
12748
|
* This source code is licensed under the ISC license.
|
|
12749
12749
|
* See the LICENSE file in the root directory of this source tree.
|
|
12750
12750
|
*/
|
|
12751
|
-
var Eraser = require_createLucideIcon.createLucideIcon("eraser", [["path", {
|
|
12752
|
-
d: "M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21",
|
|
12753
|
-
key: "g5wo59"
|
|
12754
|
-
}], ["path", {
|
|
12755
|
-
d: "m5.082 11.09 8.828 8.828",
|
|
12756
|
-
key: "1wx5vj"
|
|
12757
|
-
}]]);
|
|
12758
|
-
/**
|
|
12759
|
-
* @license lucide-react v0.576.0 - ISC
|
|
12760
|
-
*
|
|
12761
|
-
* This source code is licensed under the ISC license.
|
|
12762
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
12763
|
-
*/
|
|
12764
12751
|
var EthernetPort = require_createLucideIcon.createLucideIcon("ethernet-port", [
|
|
12765
12752
|
["path", {
|
|
12766
12753
|
d: "m15 20 3-3h2a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h2l3 3z",
|
|
@@ -38376,7 +38363,7 @@ exports.EllipsisVertical = require_index.EllipsisVertical;
|
|
|
38376
38363
|
exports.Equal = Equal;
|
|
38377
38364
|
exports.EqualApproximately = EqualApproximately;
|
|
38378
38365
|
exports.EqualNot = EqualNot;
|
|
38379
|
-
exports.Eraser = Eraser;
|
|
38366
|
+
exports.Eraser = require_index.Eraser;
|
|
38380
38367
|
exports.EthernetPort = EthernetPort;
|
|
38381
38368
|
exports.Euro = Euro;
|
|
38382
38369
|
exports.EvCharger = EvCharger;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as createLucideIcon } from "./createLucideIcon-kNomBP27.js";
|
|
2
2
|
import { n as Hexagon, t as MicOff } from "./mic-off-C2VTYr91.js";
|
|
3
3
|
import { t as Settings2 } from "./settings-2-jT1iBqHD.js";
|
|
4
|
-
import { $ as Shield, $n as
|
|
4
|
+
import { $ as Shield, $n as CloudLightning, $t as LocateFixed, A as Trash2, An as Film, Ar as Blinds, At as PawPrint, B as Sun, Bn as Download, Br as Bath, Bt as Moon, C as Unlink2, Cn as Gauge, Cr as Camera, Ct as Plus, D as TriangleAlert, Dn as Flashlight, Dr as Box, Dt as Pin, E as Truck, En as Footprints, Er as Bug, Et as Pipette, F as Timer, Fn as ExternalLink, Fr as Battery, Ft as Music, G as Sparkles, Gn as Crosshair, Gr as ArrowRight, Gt as MessageSquare, H as Star, Hn as DoorClosed, Hr as Baby, Ht as Minus, I as Thermometer, In as Eraser, Ir as BatteryWarning, It as Move, J as SlidersHorizontal, Jn as Cog, Jr as ArrowDownToLine, Jt as Maximize2, K as Snowflake, Kn as Cpu, Kr as ArrowLeft, Kt as Menu, L as Target, Ln as EllipsisVertical, Lr as BatteryMedium, Lt as MoveVertical, M as Tractor, Mn as Fan, Mr as Bike, Mt as Package, N as ToggleRight, Nn as Eye, Nr as Bell, Nt as Network, O as TrendingDown, On as FlashlightOff, Or as Bot, Ot as Phone, P as ToggleLeft, Pn as EyeOff, Pr as BellRing, Pt as Navigation, Q as Ship, Qn as CloudRain, Qt as LockOpen, R as Tag, Rn as Droplets, Rr as BatteryLow, Rt as MoveHorizontal, S as Upload, Sn as GraduationCap, Sr as Car, St as Plug, T as Type, Tn as Funnel, Tr as Bus, Tt as Plane, U as Square, Un as Dog, Ur as ArrowUp, Ut as Minimize2, V as SunMedium, Vn as DoorOpen, Vr as Ban, Vt as MonitorPlay, W as Sprout, Wn as Database, Wr as ArrowUpToLine, Wt as Mic, X as SkipBack, Xn as CloudSun, Xr as AirVent, Xt as Mail, Y as SkipForward, Yn as Cloud, Yr as AlarmSmoke, Yt as MapPin, Z as Siren, Zn as CloudSnow, Zr as Activity, Zt as Lock, _ as Vibrate, _n as HardDrive, _r as ChevronDown, _t as Radar, a as Wrench, an as Leaf, ar as CircleQuestionMark, at as Server, b as User, bn as GripHorizontal, br as Cat, bt as Power, c as Wifi, cr as CircleDot, ct as Scan, d as WifiLow, dn as Image, dr as CircleAlert, dt as Route, en as LoaderCircle, er as CloudFog, et as ShieldOff, f as WifiHigh, fn as ImageOff, fr as ChevronsUpDown, ft as RotateCw, g as Volume2, gn as Hash, gr as ChevronLeft, gt as RadioTower, h as VolumeX, hn as Heater, hr as ChevronRight, ht as Radio, i as X, in as Lightbulb, ir as CircleStop, it as Settings, j as TrainFront, jn as Feather, jr as Bird, jt as Pause, k as TrendingUp, kn as Flame, kr as Bone, kt as Pencil, l as WifiZero, ln as Info, lr as CircleCheck, lt as Save, m as WashingMachine, mn as History, mr as ChevronUp, mt as RefreshCw, n as ZoomIn, nn as ListChecks, nr as Clapperboard, nt as ShieldAlert, o as Workflow, on as LayoutGrid, or as CirclePlus, ot as Search, p as Waves, pn as House, pr as ChevronsDownUp, pt as RotateCcw, q as Smartphone, qn as Copy, qr as ArrowDown, qt as Megaphone, r as Zap, rn as Link2, rr as CircleX, rt as Share2, s as Wind, sn as Laugh, sr as CirclePause, st as ScrollText, t as ZoomOut, tn as List, tr as Clock, tt as ShieldCheck, u as WifiOff, un as Inbox, ur as CircleCheckBig, ut as Sailboat, v as UtensilsCrossed, vn as Hand, vr as Check, vt as QrCode, w as Undo2, wn as Gamepad2, wr as Cable, wt as Play, x as UserCheck, xn as Grid2x2, xr as Cast, xt as PowerOff, y as Users, yn as Hammer, yr as ChartLine, yt as Puzzle, z as Sunrise, zn as Droplet, zr as BatteryFull, zt as MousePointerClick } from "./index.js";
|
|
5
5
|
/**
|
|
6
6
|
* @license lucide-react v0.576.0 - ISC
|
|
7
7
|
*
|
|
@@ -12748,19 +12748,6 @@ var Equal = createLucideIcon("equal", [["line", {
|
|
|
12748
12748
|
* This source code is licensed under the ISC license.
|
|
12749
12749
|
* See the LICENSE file in the root directory of this source tree.
|
|
12750
12750
|
*/
|
|
12751
|
-
var Eraser = createLucideIcon("eraser", [["path", {
|
|
12752
|
-
d: "M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21",
|
|
12753
|
-
key: "g5wo59"
|
|
12754
|
-
}], ["path", {
|
|
12755
|
-
d: "m5.082 11.09 8.828 8.828",
|
|
12756
|
-
key: "1wx5vj"
|
|
12757
|
-
}]]);
|
|
12758
|
-
/**
|
|
12759
|
-
* @license lucide-react v0.576.0 - ISC
|
|
12760
|
-
*
|
|
12761
|
-
* This source code is licensed under the ISC license.
|
|
12762
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
12763
|
-
*/
|
|
12764
12751
|
var EthernetPort = createLucideIcon("ethernet-port", [
|
|
12765
12752
|
["path", {
|
|
12766
12753
|
d: "m15 20 3-3h2a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h2l3 3z",
|