@camstack/ui-library 1.2.355 → 1.2.357

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/index.cjs CHANGED
@@ -3521,6 +3521,42 @@ var Route = require_createLucideIcon.createLucideIcon("route", [
3521
3521
  * This source code is licensed under the ISC license.
3522
3522
  * See the LICENSE file in the root directory of this source tree.
3523
3523
  */
3524
+ var Router = require_createLucideIcon.createLucideIcon("router", [
3525
+ ["rect", {
3526
+ width: "20",
3527
+ height: "8",
3528
+ x: "2",
3529
+ y: "14",
3530
+ rx: "2",
3531
+ key: "w68u3i"
3532
+ }],
3533
+ ["path", {
3534
+ d: "M6.01 18H6",
3535
+ key: "19vcac"
3536
+ }],
3537
+ ["path", {
3538
+ d: "M10.01 18H10",
3539
+ key: "uamcmx"
3540
+ }],
3541
+ ["path", {
3542
+ d: "M15 10v4",
3543
+ key: "qjz1xs"
3544
+ }],
3545
+ ["path", {
3546
+ d: "M17.84 7.17a4 4 0 0 0-5.66 0",
3547
+ key: "1rif40"
3548
+ }],
3549
+ ["path", {
3550
+ d: "M20.66 4.34a8 8 0 0 0-11.31 0",
3551
+ key: "6a5xfq"
3552
+ }]
3553
+ ]);
3554
+ /**
3555
+ * @license lucide-react v0.576.0 - ISC
3556
+ *
3557
+ * This source code is licensed under the ISC license.
3558
+ * See the LICENSE file in the root directory of this source tree.
3559
+ */
3524
3560
  var Sailboat = require_createLucideIcon.createLucideIcon("sailboat", [
3525
3561
  ["path", {
3526
3562
  d: "M10 2v15",
@@ -5215,9 +5251,11 @@ function useEventStreamMap(category, keyOf, filter) {
5215
5251
  * `nodes.getNodeAddons`, which is one node and does not walk the fleet.
5216
5252
  */
5217
5253
  function useClusterTopology() {
5218
- const { data: bootstrapTopology, isLoading, isError } = trpc.nodes.topology.useQuery(void 0, { staleTime: Number.POSITIVE_INFINITY });
5254
+ const { data: bootstrapTopology, dataUpdatedAt, isLoading, isError } = trpc.nodes.topology.useQuery(void 0, { staleTime: Number.POSITIVE_INFINITY });
5255
+ const snapshot = useEventStreamLatest("cluster.topology-snapshot");
5256
+ const snapshotReceivedAt = (0, react$1.useMemo)(() => snapshot === null ? 0 : Date.now(), [snapshot]);
5219
5257
  return {
5220
- nodes: useEventStreamLatest("cluster.topology-snapshot")?.nodes ?? bootstrapTopology,
5258
+ nodes: snapshot !== null && !(bootstrapTopology !== void 0 && dataUpdatedAt > snapshotReceivedAt) ? snapshot.nodes : bootstrapTopology,
5221
5259
  isLoading,
5222
5260
  isError
5223
5261
  };
@@ -5432,6 +5470,11 @@ var DEVICE_TYPE_META = {
5432
5470
  icon: Wind,
5433
5471
  labelKey: "uiLibrary.deviceMeta.type.dryer",
5434
5472
  labelFallback: "Dryer"
5473
+ },
5474
+ [_camstack_types.DeviceType.Gateway]: {
5475
+ icon: Router,
5476
+ labelKey: "uiLibrary.deviceMeta.type.gateway",
5477
+ labelFallback: "Gateway"
5435
5478
  }
5436
5479
  };
5437
5480
  var DEVICE_ROLE_META = {
@@ -5918,7 +5961,7 @@ function lucideExportName(key) {
5918
5961
  function loadIconGlyphs() {
5919
5962
  if (fullTable !== void 0) return Promise.resolve();
5920
5963
  if (failure$1 !== void 0) return Promise.reject(failure$1);
5921
- pending ??= Promise.resolve().then(() => require("./icons-BJpFQcLH.cjs")).then((module) => {
5964
+ pending ??= Promise.resolve().then(() => require("./icons-Bxx_Side.cjs")).then((module) => {
5922
5965
  fullTable = module;
5923
5966
  publish();
5924
5967
  }, (error) => {
@@ -10405,6 +10448,14 @@ var Select = (0, react$1.forwardRef)(({ className, options, disabled, ...props }
10405
10448
  });
10406
10449
  Select.displayName = "Select";
10407
10450
  //#endregion
10451
+ //#region src/primitives/disclosure-chevron.tsx
10452
+ function DisclosureChevron({ expanded, className }) {
10453
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(expanded ? ChevronDown : ChevronRight, {
10454
+ "aria-hidden": "true",
10455
+ className: cn("h-4 w-4 shrink-0 text-foreground-subtle", className)
10456
+ });
10457
+ }
10458
+ //#endregion
10408
10459
  //#region src/composites/config-secret-field.tsx
10409
10460
  /**
10410
10461
  * A keychain-stored secret in a settings form (D787, D789) — drawn as ONE
@@ -10668,6 +10719,10 @@ var useAddonSettingsGetGlobalSettings = trpc.addonSettings.getGlobalSettings.use
10668
10719
  var useAddonSettingsUpdateGlobalSettings = trpc.addonSettings.updateGlobalSettings.useMutation;
10669
10720
  /** Generated alias around `trpc.addonSettings.getIntegrationSettings.useQuery`. */
10670
10721
  var useAddonSettingsGetIntegrationSettings = trpc.addonSettings.getIntegrationSettings.useQuery;
10722
+ /** Generated alias around `trpc.addonSettings.getDeclaredSettingsKeys.useQuery`. */
10723
+ var useAddonSettingsGetDeclaredSettingsKeys = trpc.addonSettings.getDeclaredSettingsKeys.useQuery;
10724
+ /** Generated alias around `trpc.addonSettings.unsetStoredSettingsKeys.useMutation`. */
10725
+ var useAddonSettingsUnsetStoredSettingsKeys = trpc.addonSettings.unsetStoredSettingsKeys.useMutation;
10671
10726
  /** Generated alias around `trpc.addonSettings.getDeviceSettings.useQuery`. */
10672
10727
  var useAddonSettingsGetDeviceSettings = trpc.addonSettings.getDeviceSettings.useQuery;
10673
10728
  /** Generated alias around `trpc.addonSettings.updateDeviceSettings.useMutation`. */
@@ -11304,6 +11359,10 @@ var useDeviceProviderReloadDevice = trpc.deviceProvider.reloadDevice.useMutation
11304
11359
  var useDeviceProviderSupportsDiscovery = trpc.deviceProvider.supportsDiscovery.useQuery;
11305
11360
  /** Generated alias around `trpc.deviceProvider.discoverDevices.useMutation`. */
11306
11361
  var useDeviceProviderDiscoverDevices = trpc.deviceProvider.discoverDevices.useMutation;
11362
+ /** Generated alias around `trpc.deviceProvider.getDiscoveryModes.useQuery`. */
11363
+ var useDeviceProviderGetDiscoveryModes = trpc.deviceProvider.getDiscoveryModes.useQuery;
11364
+ /** Generated alias around `trpc.deviceProvider.classifyDiscoveryHits.useMutation`. */
11365
+ var useDeviceProviderClassifyDiscoveryHits = trpc.deviceProvider.classifyDiscoveryHits.useMutation;
11307
11366
  /** Generated alias around `trpc.deviceProvider.getDiscoveryParamsSchema.useQuery`. */
11308
11367
  var useDeviceProviderGetDiscoveryParamsSchema = trpc.deviceProvider.getDiscoveryParamsSchema.useQuery;
11309
11368
  /** Generated alias around `trpc.deviceProvider.getManualCreationType.useQuery`. */
@@ -11610,6 +11669,12 @@ var useLocalNetworkUploadCertificate = trpc.localNetwork.uploadCertificate.useMu
11610
11669
  var useLocalNetworkDownloadCa = trpc.localNetwork.downloadCa.useQuery;
11611
11670
  /** Generated alias around `trpc.localNetwork.useStoredUploadedCertificate.useMutation`. */
11612
11671
  var useLocalNetworkUseStoredUploadedCertificate = trpc.localNetwork.useStoredUploadedCertificate.useMutation;
11672
+ /** Generated alias around `trpc.localNetwork.scanNetwork.useMutation`. */
11673
+ var useLocalNetworkScanNetwork = trpc.localNetwork.scanNetwork.useMutation;
11674
+ /** Generated alias around `trpc.localNetwork.getScanSubnets.useQuery`. */
11675
+ var useLocalNetworkGetScanSubnets = trpc.localNetwork.getScanSubnets.useQuery;
11676
+ /** Generated alias around `trpc.localNetwork.setScanSubnets.useMutation`. */
11677
+ var useLocalNetworkSetScanSubnets = trpc.localNetwork.setScanSubnets.useMutation;
11613
11678
  /** Generated alias around `trpc.localNetwork.revertToGeneratedCertificate.useMutation`. */
11614
11679
  var useLocalNetworkRevertToGeneratedCertificate = trpc.localNetwork.revertToGeneratedCertificate.useMutation;
11615
11680
  /** Generated alias around `trpc.lockControl.lock.useMutation`. */
@@ -12400,6 +12465,16 @@ var usePlateGalleryUnassignPlate = trpc.plateGallery.unassignPlate.useMutation;
12400
12465
  var usePlateGalleryAssignPlates = trpc.plateGallery.assignPlates.useMutation;
12401
12466
  /** Generated alias around `trpc.plateGallery.unassignPlates.useMutation`. */
12402
12467
  var usePlateGalleryUnassignPlates = trpc.plateGallery.unassignPlates.useMutation;
12468
+ /** Generated alias around `trpc.platformProbe.getCapabilities.useQuery`. */
12469
+ var usePlatformProbeGetCapabilities = trpc.platformProbe.getCapabilities.useQuery;
12470
+ /** Generated alias around `trpc.platformProbe.getHardware.useQuery`. */
12471
+ var usePlatformProbeGetHardware = trpc.platformProbe.getHardware.useQuery;
12472
+ /** Generated alias around `trpc.platformProbe.resolveInferenceConfig.useQuery`. */
12473
+ var usePlatformProbeResolveInferenceConfig = trpc.platformProbe.resolveInferenceConfig.useQuery;
12474
+ /** Generated alias around `trpc.platformProbe.resolveHwAccel.useQuery`. */
12475
+ var usePlatformProbeResolveHwAccel = trpc.platformProbe.resolveHwAccel.useQuery;
12476
+ /** Generated alias around `trpc.platformProbe.rescanAccelerators.useMutation`. */
12477
+ var usePlatformProbeRescanAccelerators = trpc.platformProbe.rescanAccelerators.useMutation;
12403
12478
  /** Generated alias around `trpc.powerMeter.getStatus.useQuery`. */
12404
12479
  var usePowerMeterGetStatus = trpc.powerMeter.getStatus.useQuery;
12405
12480
  /** Generated alias around `trpc.presence.getStatus.useQuery`. */
@@ -29263,7 +29338,7 @@ function DialogTrigger({ children, ...props }) {
29263
29338
  * whenever they are asymmetric (they are: ~59px top vs ~34px bottom). Every
29264
29339
  * term collapses to the previous `100dvh - 2rem` where the insets are 0.
29265
29340
  */
29266
- var contentVariants = cva("relative fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 m-0 w-[calc(100vw-2rem)] bg-background-elevated text-foreground border border-border rounded-lg p-4 backdrop:bg-black/50 backdrop:backdrop-blur-sm max-h-[calc(100dvh-2rem-2*max(env(safe-area-inset-top),env(safe-area-inset-bottom)))] [&:not([open])]:hidden", {
29341
+ var contentVariants = cva("relative fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 m-0 w-[calc(100vw-2rem)] whitespace-normal bg-background-elevated text-foreground border border-border rounded-lg p-4 backdrop:bg-black/50 backdrop:backdrop-blur-sm max-h-[calc(100dvh-2rem-2*max(env(safe-area-inset-top),env(safe-area-inset-bottom)))] [&:not([open])]:hidden", {
29267
29342
  variants: {
29268
29343
  width: {
29269
29344
  sm: "max-w-sm",
@@ -32469,16 +32544,24 @@ function GroupField({ field, values, onChange, onChangeMany, disabled, translati
32469
32544
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
32470
32545
  className: "@container rounded-lg border border-border bg-surface/50 overflow-hidden",
32471
32546
  style: { containerType: "inline-size" },
32472
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
32473
- className: ["px-3 py-2 flex items-center justify-between min-w-0", isAccordion ? "cursor-pointer hover:bg-surface" : ""].join(" "),
32474
- onClick: isAccordion ? () => setCollapsed((c) => !c) : void 0,
32547
+ children: [isAccordion ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
32548
+ type: "button",
32549
+ "aria-expanded": !collapsed,
32550
+ onClick: () => setCollapsed((c) => !c),
32551
+ className: "px-3 py-2 flex w-full items-center justify-between min-w-0 text-left hover:bg-surface",
32475
32552
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
32476
32553
  className: "text-xs font-semibold text-foreground min-w-0 break-words",
32477
32554
  children: resolveLabel(field.label, translationFn)
32478
- }), isAccordion && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
32479
- className: "text-foreground-subtle text-xs shrink-0 ml-2",
32480
- children: collapsed ? "▸" : "▾"
32555
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DisclosureChevron, {
32556
+ expanded: !collapsed,
32557
+ className: "ml-2"
32481
32558
  })]
32559
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
32560
+ className: "px-3 py-2 flex items-center justify-between min-w-0",
32561
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
32562
+ className: "text-xs font-semibold text-foreground min-w-0 break-words",
32563
+ children: resolveLabel(field.label, translationFn)
32564
+ })
32482
32565
  }), !collapsed && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
32483
32566
  className: "px-3 pb-3 grid grid-cols-1 @[480px]:grid-cols-2 gap-x-4 gap-y-3",
32484
32567
  children: field.fields.map((subField) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FormField, {
@@ -33691,19 +33774,30 @@ function SectionCard$1({ section, values, onChange, disabled, translationFn, onT
33691
33774
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
33692
33775
  className: "@container rounded-lg border border-border bg-surface p-3",
33693
33776
  style: { containerType: "inline-size" },
33694
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
33695
- className: ["flex items-center justify-between mb-2", isAccordion ? "cursor-pointer" : ""].join(" "),
33696
- onClick: isAccordion ? () => setCollapsed((c) => !c) : void 0,
33777
+ children: [isAccordion ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
33778
+ type: "button",
33779
+ "aria-expanded": !collapsed,
33780
+ onClick: () => setCollapsed((c) => !c),
33781
+ className: "flex w-full items-center justify-between mb-2 text-left",
33697
33782
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
33698
33783
  className: "text-[11px] font-semibold text-foreground-subtle uppercase tracking-wider",
33699
33784
  children: resolveLabel(section.title, translationFn)
33700
33785
  }), section.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
33701
33786
  className: "text-[10px] text-foreground-subtle mt-0.5",
33702
33787
  children: resolveLabel(section.description, translationFn)
33703
- })] }), isAccordion && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
33704
- className: "text-foreground-subtle text-xs ml-2",
33705
- children: collapsed ? "▸" : "▾"
33788
+ })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DisclosureChevron, {
33789
+ expanded: !collapsed,
33790
+ className: "ml-2"
33706
33791
  })]
33792
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
33793
+ className: "flex items-center justify-between mb-2",
33794
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
33795
+ className: "text-[11px] font-semibold text-foreground-subtle uppercase tracking-wider",
33796
+ children: resolveLabel(section.title, translationFn)
33797
+ }), section.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
33798
+ className: "text-[10px] text-foreground-subtle mt-0.5",
33799
+ children: resolveLabel(section.description, translationFn)
33800
+ })] })
33707
33801
  }), !collapsed && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
33708
33802
  className: `grid ${gridClass} gap-x-3 gap-y-2.5`,
33709
33803
  children: section.fields.map((field) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FormField, {
@@ -43098,12 +43192,11 @@ function AlternateLabelsSection({ alternateLabels, colors }) {
43098
43192
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
43099
43193
  className: "mt-1",
43100
43194
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
43195
+ type: "button",
43196
+ "aria-expanded": expanded,
43101
43197
  onClick: () => setExpanded((v) => !v),
43102
43198
  className: "text-[9px] text-foreground-subtle hover:text-foreground transition-colors flex items-center gap-1",
43103
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
43104
- className: `transition-transform ${expanded ? "rotate-90" : ""}`,
43105
- children: "▶"
43106
- }), t("uiLibrary.detectionResultTree.alternates", {
43199
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DisclosureChevron, { expanded }), t("uiLibrary.detectionResultTree.alternates", {
43107
43200
  one: "Alternates ({{count}} source)",
43108
43201
  other: "Alternates ({{count}} sources)"
43109
43202
  }, { count: sources.length })]
@@ -48248,7 +48341,7 @@ function MediaPlayerPanel({ trpc, deviceId, features: _features, layout, optimis
48248
48341
  }
48249
48342
  },
48250
48343
  className: cn("inline-flex h-5 w-5 items-center justify-center rounded text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors text-xs", busy && "opacity-40 cursor-not-allowed"),
48251
- children: action === "play" ? "▶" : "⏸"
48344
+ children: action === "play" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Play, { className: "h-3 w-3" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Pause, { className: "h-3 w-3" })
48252
48345
  })]
48253
48346
  }), layout === "full" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
48254
48347
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -57283,6 +57376,7 @@ var CONTROL_FILLS = {
57283
57376
  [_camstack_types.DeviceType.Generic]: false,
57284
57377
  [_camstack_types.DeviceType.Weather]: false,
57285
57378
  [_camstack_types.DeviceType.Container]: false,
57379
+ [_camstack_types.DeviceType.Gateway]: false,
57286
57380
  [_camstack_types.DeviceType.Image]: false,
57287
57381
  [_camstack_types.DeviceType.PetFeeder]: false,
57288
57382
  [_camstack_types.DeviceType.PetFountain]: false,
@@ -65943,15 +66037,14 @@ function ResponseLog({ data, label = "Response", className = "" }) {
65943
66037
  const json = JSON.stringify(data, null, 2);
65944
66038
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
65945
66039
  className: `rounded-xl border border-border bg-surface overflow-hidden ${className}`,
65946
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
65947
- className: "px-3 py-2 border-b border-border flex items-center justify-between cursor-pointer select-none hover:bg-surface-hover/30",
66040
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
66041
+ type: "button",
66042
+ "aria-expanded": expanded,
66043
+ className: "w-full px-3 py-2 border-b border-border flex items-center justify-between text-left select-none hover:bg-surface-hover/30",
65948
66044
  onClick: () => setExpanded((e) => !e),
65949
66045
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
65950
66046
  className: "flex items-center gap-2",
65951
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
65952
- className: "text-[10px] text-foreground-subtle",
65953
- children: expanded ? "▼" : "▶"
65954
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
66047
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DisclosureChevron, { expanded }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
65955
66048
  className: "text-xs font-medium text-foreground",
65956
66049
  children: label
65957
66050
  })]
@@ -68919,7 +69012,7 @@ function noItemsSentence(noun, emptyMeansAll, t) {
68919
69012
  noun: pickerNounLabel(noun, t)
68920
69013
  });
68921
69014
  }
68922
- function DevicePicker({ devices: devicesIn, listState, fleet, value, onChange, selection = "multiple", groupBy: pinnedGroupBy, emptyMeansAll = false, savedHadDevices = false, noun = "camera", groupTitle: groupTitleProp, emptyLabel, annotate, disabled = false, testId, showAll = false, lockedIds, lockedNote: lockedNoteProp }) {
69015
+ function DevicePicker({ devices: devicesIn, listState, fleet, value, onChange, selection = "multiple", groupBy: pinnedGroupBy, emptyMeansAll = false, savedHadDevices = false, noun = "camera", groupTitle: groupTitleProp, emptyLabel, annotate, disabled = false, testId, showAll = false, fillHeight = false, lockedIds, lockedNote: lockedNoteProp }) {
68923
69016
  const t = useUiText();
68924
69017
  const groupTitle = groupTitleProp ?? ((group) => deviceGroupTitle(group, t));
68925
69018
  const lockedNote = lockedNoteProp ?? t("uiLibrary.devicePicker.alreadyAdded", "Already added");
@@ -68947,7 +69040,7 @@ function DevicePicker({ devices: devicesIn, listState, fleet, value, onChange, s
68947
69040
  }), widening && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DevicesWidenWarning, { noun })]
68948
69041
  });
68949
69042
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
68950
- className: "mt-1 space-y-1.5",
69043
+ className: fillHeight ? "mt-1 flex min-h-0 flex-1 flex-col gap-1.5" : "mt-1 space-y-1.5",
68951
69044
  "data-testid": testId,
68952
69045
  children: [
68953
69046
  listState === "pending" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DevicesLoadingLine, { noun: plural }),
@@ -68997,6 +69090,7 @@ function DevicePicker({ devices: devicesIn, listState, fleet, value, onChange, s
68997
69090
  noun,
68998
69091
  disabled,
68999
69092
  showAll,
69093
+ fillHeight,
69000
69094
  selection,
69001
69095
  ...pinnedGroupBy !== void 0 ? { pinnedGroupBy } : {}
69002
69096
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PickerPanel, {
@@ -69010,6 +69104,7 @@ function DevicePicker({ devices: devicesIn, listState, fleet, value, onChange, s
69010
69104
  noun,
69011
69105
  disabled,
69012
69106
  showAll,
69107
+ fillHeight,
69013
69108
  selection
69014
69109
  })),
69015
69110
  widening && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DevicesWidenWarning, { noun })
@@ -69058,7 +69153,7 @@ var NO_ZONES = {
69058
69153
  zones: []
69059
69154
  };
69060
69155
  /** The searchable, grouped list — rendered one page at a time. */
69061
- function PickerPanel({ devices, value, onChange, annotate, groupTitle, noun, disabled, locked, lockedNote, showAll, selection, grouping, providers = NO_PROVIDERS }) {
69156
+ function PickerPanel({ devices, value, onChange, annotate, groupTitle, noun, disabled, locked, lockedNote, showAll, fillHeight, selection, grouping, providers = NO_PROVIDERS }) {
69062
69157
  const t = useUiText();
69063
69158
  const radioName = (0, react$1.useId)();
69064
69159
  const [filters, setFilters] = (0, react$1.useState)(PICKER_NO_FILTERS);
@@ -69110,7 +69205,7 @@ function PickerPanel({ devices, value, onChange, annotate, groupTitle, noun, dis
69110
69205
  const page = pageRows(rows, showAll ? rows.length : shown);
69111
69206
  const toggleGroup = (group, expanded) => setToggles((current) => new Map([...current, [group.key, !expanded]]));
69112
69207
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
69113
- className: "rounded-md border border-border bg-surface p-2",
69208
+ className: fillHeight ? "flex min-h-0 flex-1 flex-col rounded-md border border-border bg-surface p-2" : "rounded-md border border-border bg-surface p-2",
69114
69209
  "data-testid": "device-picker-panel",
69115
69210
  children: [
69116
69211
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DeviceFilterBar, {
@@ -69147,7 +69242,7 @@ function PickerPanel({ devices, value, onChange, annotate, groupTitle, noun, dis
69147
69242
  className: "py-2 text-[11px] text-foreground-subtle italic",
69148
69243
  children: noun === "camera" || noun === "device" ? t("uiLibrary.devicePicker.noDeviceMatches", "No device matches.") : t("uiLibrary.devicePicker.noNounMatches", "No {{noun}} matches.", { noun: pickerNounLabel(noun, t) })
69149
69244
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
69150
- className: showAll ? "mt-1" : "mt-1 max-h-72 overflow-y-auto",
69245
+ className: fillHeight ? "mt-1 min-h-0 flex-1 overflow-y-auto" : showAll ? "mt-1" : "mt-1 max-h-72 overflow-y-auto",
69151
69246
  "data-testid": "device-picker-rows",
69152
69247
  children: [page.rows.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PickerRowView, {
69153
69248
  row,
@@ -69207,7 +69302,7 @@ function PickerRowView({ row, value, onChange, onToggleGroup, annotate, groupTit
69207
69302
  onClick: () => onToggleGroup(group, expanded),
69208
69303
  className: "flex min-w-0 flex-1 items-center gap-1 text-left text-[10px] font-semibold uppercase tracking-wide text-foreground-subtle",
69209
69304
  children: [
69210
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: expanded ? "▾" : "▸" }),
69305
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DisclosureChevron, { expanded }),
69211
69306
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
69212
69307
  className: "truncate",
69213
69308
  children: groupTitle(group)
@@ -72758,6 +72853,7 @@ exports.DialogFooter = DialogFooter;
72758
72853
  exports.DialogHeader = DialogHeader;
72759
72854
  exports.DialogTitle = DialogTitle;
72760
72855
  exports.DialogTrigger = DialogTrigger;
72856
+ exports.DisclosureChevron = DisclosureChevron;
72761
72857
  exports.DiscoveryPanel = DiscoveryPanel;
72762
72858
  exports.DisplayPaletteProvider = DisplayPaletteProvider;
72763
72859
  exports.Dog = Dog;
@@ -73007,6 +73103,7 @@ exports.RootSuppliedModelNote = RootSuppliedModelNote;
73007
73103
  exports.RotateCcw = RotateCcw;
73008
73104
  exports.RotateCw = RotateCw;
73009
73105
  exports.Route = Route;
73106
+ exports.Router = Router;
73010
73107
  exports.RunReport = RunReport;
73011
73108
  exports.RunningBadge = RunningBadge;
73012
73109
  exports.RunningStatusLine = RunningStatusLine;
@@ -73562,9 +73659,11 @@ exports.useActionsSetLinks = useActionsSetLinks;
73562
73659
  exports.useActionsStop = useActionsStop;
73563
73660
  exports.useActionsUpdate = useActionsUpdate;
73564
73661
  exports.useAddonPagesListPages = useAddonPagesListPages;
73662
+ exports.useAddonSettingsGetDeclaredSettingsKeys = useAddonSettingsGetDeclaredSettingsKeys;
73565
73663
  exports.useAddonSettingsGetDeviceSettings = useAddonSettingsGetDeviceSettings;
73566
73664
  exports.useAddonSettingsGetGlobalSettings = useAddonSettingsGetGlobalSettings;
73567
73665
  exports.useAddonSettingsGetIntegrationSettings = useAddonSettingsGetIntegrationSettings;
73666
+ exports.useAddonSettingsUnsetStoredSettingsKeys = useAddonSettingsUnsetStoredSettingsKeys;
73568
73667
  exports.useAddonSettingsUpdateDeviceSettings = useAddonSettingsUpdateDeviceSettings;
73569
73668
  exports.useAddonSettingsUpdateGlobalSettings = useAddonSettingsUpdateGlobalSettings;
73570
73669
  exports.useAddonT = useAddonT;
@@ -73940,10 +74039,12 @@ exports.useDeviceOpsRemoveDevice = useDeviceOpsRemoveDevice;
73940
74039
  exports.useDeviceOpsRunAction = useDeviceOpsRunAction;
73941
74040
  exports.useDeviceOpsSetConfig = useDeviceOpsSetConfig;
73942
74041
  exports.useDeviceProviderAdoptDiscoveredDevice = useDeviceProviderAdoptDiscoveredDevice;
74042
+ exports.useDeviceProviderClassifyDiscoveryHits = useDeviceProviderClassifyDiscoveryHits;
73943
74043
  exports.useDeviceProviderCreateDevice = useDeviceProviderCreateDevice;
73944
74044
  exports.useDeviceProviderDiscoverDevices = useDeviceProviderDiscoverDevices;
73945
74045
  exports.useDeviceProviderGetChildCreationSchema = useDeviceProviderGetChildCreationSchema;
73946
74046
  exports.useDeviceProviderGetDevices = useDeviceProviderGetDevices;
74047
+ exports.useDeviceProviderGetDiscoveryModes = useDeviceProviderGetDiscoveryModes;
73947
74048
  exports.useDeviceProviderGetDiscoveryParamsSchema = useDeviceProviderGetDiscoveryParamsSchema;
73948
74049
  exports.useDeviceProviderGetManualCreationType = useDeviceProviderGetManualCreationType;
73949
74050
  exports.useDeviceProviderGetStatus = useDeviceProviderGetStatus;
@@ -74115,6 +74216,7 @@ exports.useLocalNetworkGetConnectionEndpoints = useLocalNetworkGetConnectionEndp
74115
74216
  exports.useLocalNetworkGetHubAddresses = useLocalNetworkGetHubAddresses;
74116
74217
  exports.useLocalNetworkGetNotificationEndpoint = useLocalNetworkGetNotificationEndpoint;
74117
74218
  exports.useLocalNetworkGetPreferred = useLocalNetworkGetPreferred;
74219
+ exports.useLocalNetworkGetScanSubnets = useLocalNetworkGetScanSubnets;
74118
74220
  exports.useLocalNetworkGetTlsStatus = useLocalNetworkGetTlsStatus;
74119
74221
  exports.useLocalNetworkGetViewerEndpoints = useLocalNetworkGetViewerEndpoints;
74120
74222
  exports.useLocalNetworkList = useLocalNetworkList;
@@ -74122,9 +74224,11 @@ exports.useLocalNetworkRegenerateCertificate = useLocalNetworkRegenerateCertific
74122
74224
  exports.useLocalNetworkRemoveCustomAddress = useLocalNetworkRemoveCustomAddress;
74123
74225
  exports.useLocalNetworkResetAllowlistToBestMatch = useLocalNetworkResetAllowlistToBestMatch;
74124
74226
  exports.useLocalNetworkRevertToGeneratedCertificate = useLocalNetworkRevertToGeneratedCertificate;
74227
+ exports.useLocalNetworkScanNetwork = useLocalNetworkScanNetwork;
74125
74228
  exports.useLocalNetworkSetAddressRole = useLocalNetworkSetAddressRole;
74126
74229
  exports.useLocalNetworkSetAllowedAddresses = useLocalNetworkSetAllowedAddresses;
74127
74230
  exports.useLocalNetworkSetNotificationEndpoint = useLocalNetworkSetNotificationEndpoint;
74231
+ exports.useLocalNetworkSetScanSubnets = useLocalNetworkSetScanSubnets;
74128
74232
  exports.useLocalNetworkSetViewerEndpoints = useLocalNetworkSetViewerEndpoints;
74129
74233
  exports.useLocalNetworkUploadCertificate = useLocalNetworkUploadCertificate;
74130
74234
  exports.useLocalNetworkUseStoredUploadedCertificate = useLocalNetworkUseStoredUploadedCertificate;
@@ -74530,6 +74634,11 @@ exports.usePlateGallerySearchPlates = usePlateGallerySearchPlates;
74530
74634
  exports.usePlateGallerySuggestPlateClusters = usePlateGallerySuggestPlateClusters;
74531
74635
  exports.usePlateGalleryUnassignPlate = usePlateGalleryUnassignPlate;
74532
74636
  exports.usePlateGalleryUnassignPlates = usePlateGalleryUnassignPlates;
74637
+ exports.usePlatformProbeGetCapabilities = usePlatformProbeGetCapabilities;
74638
+ exports.usePlatformProbeGetHardware = usePlatformProbeGetHardware;
74639
+ exports.usePlatformProbeRescanAccelerators = usePlatformProbeRescanAccelerators;
74640
+ exports.usePlatformProbeResolveHwAccel = usePlatformProbeResolveHwAccel;
74641
+ exports.usePlatformProbeResolveInferenceConfig = usePlatformProbeResolveInferenceConfig;
74533
74642
  exports.usePlayerOverlayLayer = usePlayerOverlayLayer;
74534
74643
  exports.usePlayerOverlayLayers = usePlayerOverlayLayers;
74535
74644
  exports.usePlayerToolbarButton = usePlayerToolbarButton;