@camstack/addon-benchmark 1.2.118 → 1.2.120

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.
Files changed (17) hide show
  1. package/dist/{MotionZonesSettings-DtQbq3Im.mjs → MotionZonesSettings-Cm_Dvpz5.mjs} +129 -147
  2. package/dist/{PrivacyMaskSettings-CU-qTVdT.mjs → PrivacyMaskSettings-vinyIide.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-Dko81uSm.mjs → SceneMonitorEditor-CteqhKoH.mjs} +136 -136
  4. package/dist/_stub.js +4733 -4207
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_benchmark_page-N-eSnSOQ.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_benchmark_page-Djy8wQOo.mjs} +4 -4
  6. package/dist/{_virtual_mf___mfe_internal__addon_benchmark_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DbH7vZFO.mjs → _virtual_mf___mfe_internal__addon_benchmark_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B_8RNOgn.mjs} +1 -1
  7. package/dist/addon-benchmark.css +1 -1
  8. package/dist/grid-2x2-DAxEj9uR.mjs +21 -0
  9. package/dist/{hostInit-B9UzGjcE.mjs → hostInit-DImjZQfo.mjs} +3 -3
  10. package/dist/{player-overlays-JUg8MuVo.mjs → player-overlays-DuBK7_sR.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-CWeQn0TH.mjs → responsive-CIPaE71n.mjs} +1 -1
  13. package/dist/{use-device-snapshot-BMvs1K1x.mjs → scene-monitor-copy-Dm15cpj1.mjs} +46 -46
  14. package/dist/{square-DOq-wjEe.mjs → square-5phgB1vQ.mjs} +1 -1
  15. package/dist/{trash-2-BCuUDOir.mjs → trash-2-D24swekJ.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_benchmark_page__remoteEntry_js-18YTe0Ko.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_benchmark_page__remoteEntry_js-DnKwDDwd.mjs} +1 -1
  17. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
1
  import { c as e, g as t, h as n, p as r, u as i, x as a } from "./_virtual_mf___mfe_internal__addon_benchmark_page__loadShare__react__loadShare__.js-GeuxDuzQ.mjs";
2
- import { a as o, c as s, n as c, o as l, r as u, t as d } from "./responsive-CWeQn0TH.mjs";
3
- import { a as f, d as p, f as ee, i as te, l as m, n as h, o as g, r as ne, s as _, t as re, u as v } from "./use-device-snapshot-BMvs1K1x.mjs";
4
- import { t as y } from "./trash-2-BCuUDOir.mjs";
5
- import { n as b, r as x, t as S } from "./_virtual_mf___mfe_internal__addon_benchmark_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-SOU_VnTj.mjs";
6
- import { MaskShapeCanvas as C } from "./MaskShapeCanvas-BDvrLf-K.mjs";
7
- var ie = s("settings-2", [
2
+ import { a as o, c as s, n as c, o as l, r as u, t as d } from "./responsive-CIPaE71n.mjs";
3
+ import { a as f, d as p, f as ee, i as te, l as m, n as h, o as g, r as ne, s as re, t as ie, u as _ } from "./scene-monitor-copy-Dm15cpj1.mjs";
4
+ import { t as v } from "./trash-2-D24swekJ.mjs";
5
+ import { n as y, r as b, t as x } from "./_virtual_mf___mfe_internal__addon_benchmark_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-SOU_VnTj.mjs";
6
+ import { MaskShapeCanvas as S } from "./MaskShapeCanvas-BDvrLf-K.mjs";
7
+ var C = s("settings-2", [
8
8
  ["path", {
9
9
  d: "M14 17H5",
10
10
  key: "gfn3mx"
@@ -54,37 +54,37 @@ function D(e) {
54
54
  var O = "rounded border border-danger/50 bg-danger/10 px-1 py-0.5 text-[10px] font-medium text-danger hover:bg-danger/20 disabled:opacity-40 transition-colors";
55
55
  function k({ monitor: e, disabled: n, onDelete: r }) {
56
56
  let i = E(e), a = D(e), [o, s] = t(null);
57
- return i.length === 0 ? /* @__PURE__ */ b("p", {
57
+ return i.length === 0 ? /* @__PURE__ */ y("p", {
58
58
  className: `${d} leading-relaxed`,
59
59
  children: "No photographs captured yet. Press “Capture daylight” to take the one this scene will judge everything against."
60
- }) : /* @__PURE__ */ b("div", {
60
+ }) : /* @__PURE__ */ y("div", {
61
61
  className: "flex flex-col gap-2",
62
- children: i.map((e) => /* @__PURE__ */ x("div", {
62
+ children: i.map((e) => /* @__PURE__ */ b("div", {
63
63
  className: "flex flex-col gap-1",
64
- children: [/* @__PURE__ */ x("p", {
64
+ children: [/* @__PURE__ */ b("p", {
65
65
  className: "text-[10px] font-semibold uppercase tracking-wide text-foreground-subtle",
66
66
  children: [
67
- _(e.condition),
67
+ g(e.condition),
68
68
  " · ",
69
69
  e.tiles.length
70
70
  ]
71
- }), /* @__PURE__ */ b("ul", {
71
+ }), /* @__PURE__ */ y("ul", {
72
72
  className: "flex flex-wrap gap-1.5",
73
73
  children: e.tiles.map((t) => {
74
74
  let i = `${t.stateId}:${String(t.index)}`, c = a === 1, l = o === i;
75
- return /* @__PURE__ */ x("li", {
75
+ return /* @__PURE__ */ b("li", {
76
76
  className: "flex w-24 flex-col gap-1 rounded-md border border-border p-1",
77
77
  children: [
78
- /* @__PURE__ */ b(A, { reference: t.reference }),
79
- /* @__PURE__ */ b("span", {
78
+ /* @__PURE__ */ y(A, { reference: t.reference }),
79
+ /* @__PURE__ */ y("span", {
80
80
  className: `${d} tabular-nums`,
81
81
  children: j(t.reference.capturedAt)
82
82
  }),
83
- /* @__PURE__ */ x("button", {
83
+ /* @__PURE__ */ b("button", {
84
84
  type: "button",
85
85
  className: O,
86
86
  disabled: n,
87
- "aria-label": `Delete the ${_(e.condition).toLowerCase()} photograph from ${j(t.reference.capturedAt)}`,
87
+ "aria-label": `Delete the ${g(e.condition).toLowerCase()} photograph from ${j(t.reference.capturedAt)}`,
88
88
  onClick: () => {
89
89
  if (c && !l) {
90
90
  s(i);
@@ -95,9 +95,9 @@ function k({ monitor: e, disabled: n, onDelete: r }) {
95
95
  index: t.index
96
96
  });
97
97
  },
98
- children: [/* @__PURE__ */ b(y, { className: "mr-1 inline h-3 w-3" }), l ? "Confirm" : "Delete"]
98
+ children: [/* @__PURE__ */ y(v, { className: "mr-1 inline h-3 w-3" }), l ? "Confirm" : "Delete"]
99
99
  }),
100
- l && /* @__PURE__ */ b("p", {
100
+ l && /* @__PURE__ */ y("p", {
101
101
  className: "text-[10px] leading-snug text-warning",
102
102
  children: "This is the only photograph this scene has. Delete it and the scene no longer knows what normal looks like — it stops judging until you capture again."
103
103
  })
@@ -110,14 +110,14 @@ function k({ monitor: e, disabled: n, onDelete: r }) {
110
110
  }
111
111
  function A({ reference: e }) {
112
112
  let [n, r] = t(!1), i = e.thumbnailMediaId;
113
- return i === void 0 || n ? /* @__PURE__ */ x("div", {
113
+ return i === void 0 || n ? /* @__PURE__ */ b("div", {
114
114
  className: "flex h-16 w-full flex-col items-center justify-center gap-0.5 rounded bg-surface text-foreground-subtle",
115
115
  title: "The picture for this reference is no longer stored. The reference itself is intact and still being scored against.",
116
- children: [/* @__PURE__ */ b(p, { className: "h-4 w-4" }), /* @__PURE__ */ b("span", {
116
+ children: [/* @__PURE__ */ y(p, { className: "h-4 w-4" }), /* @__PURE__ */ y("span", {
117
117
  className: "text-[9px]",
118
118
  children: "no picture"
119
119
  })]
120
- }) : /* @__PURE__ */ b("img", {
120
+ }) : /* @__PURE__ */ y("img", {
121
121
  src: T(i),
122
122
  alt: "",
123
123
  loading: "lazy",
@@ -169,22 +169,22 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
169
169
  ...e.check,
170
170
  hysteresisCount: t.hysteresisCount ?? e.check.hysteresisCount
171
171
  }, f = e.confirm?.enabled === !0, p = e.check.mode === "similarity" ? e.check.threshold : null;
172
- return /* @__PURE__ */ x("div", {
172
+ return /* @__PURE__ */ b("div", {
173
173
  className: "flex flex-col gap-2",
174
174
  children: [
175
- /* @__PURE__ */ x("div", {
175
+ /* @__PURE__ */ b("div", {
176
176
  className: P,
177
177
  children: [
178
- /* @__PURE__ */ b("p", {
178
+ /* @__PURE__ */ y("p", {
179
179
  className: F,
180
180
  children: "What it watches"
181
181
  }),
182
- /* @__PURE__ */ x("label", {
182
+ /* @__PURE__ */ b("label", {
183
183
  className: "flex flex-col gap-1",
184
- children: [/* @__PURE__ */ b("span", {
184
+ children: [/* @__PURE__ */ y("span", {
185
185
  className: N,
186
186
  children: "Name"
187
- }), /* @__PURE__ */ b("input", {
187
+ }), /* @__PURE__ */ y("input", {
188
188
  type: "text",
189
189
  value: a.label,
190
190
  disabled: n,
@@ -200,28 +200,28 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
200
200
  }
201
201
  })]
202
202
  }),
203
- /* @__PURE__ */ x("label", {
203
+ /* @__PURE__ */ b("label", {
204
204
  className: "flex items-center gap-2",
205
- children: [/* @__PURE__ */ b("input", {
205
+ children: [/* @__PURE__ */ y("input", {
206
206
  type: "checkbox",
207
207
  checked: e.enabled,
208
208
  disabled: n,
209
209
  onChange: (e) => l({ enabled: e.target.checked })
210
- }), /* @__PURE__ */ b("span", {
210
+ }), /* @__PURE__ */ y("span", {
211
211
  className: N,
212
212
  children: "Watching"
213
213
  })]
214
214
  }),
215
- /* @__PURE__ */ b("p", {
215
+ /* @__PURE__ */ y("p", {
216
216
  className: d,
217
217
  children: "Turned off, the scene keeps its region, its references and its flag — it simply stops checking. Nothing is lost by pausing one for a while."
218
218
  }),
219
- /* @__PURE__ */ x("label", {
219
+ /* @__PURE__ */ b("label", {
220
220
  className: "flex flex-col gap-1",
221
- children: [/* @__PURE__ */ b("span", {
221
+ children: [/* @__PURE__ */ y("span", {
222
222
  className: N,
223
223
  children: "When to look"
224
- }), /* @__PURE__ */ x("select", {
224
+ }), /* @__PURE__ */ b("select", {
225
225
  value: e.triggerMode,
226
226
  disabled: n,
227
227
  className: M,
@@ -230,31 +230,31 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
230
230
  (t === "periodic" || t === "on-motion" || t === "both") && l({ triggerMode: t });
231
231
  },
232
232
  children: [
233
- /* @__PURE__ */ b("option", {
233
+ /* @__PURE__ */ y("option", {
234
234
  value: "both",
235
235
  children: "On the clock and after motion settles"
236
236
  }),
237
- /* @__PURE__ */ b("option", {
237
+ /* @__PURE__ */ y("option", {
238
238
  value: "periodic",
239
239
  children: "On the clock only"
240
240
  }),
241
- /* @__PURE__ */ b("option", {
241
+ /* @__PURE__ */ y("option", {
242
242
  value: "on-motion",
243
243
  children: "After motion settles only"
244
244
  })
245
245
  ]
246
246
  })]
247
247
  }),
248
- /* @__PURE__ */ b("p", {
248
+ /* @__PURE__ */ y("p", {
249
249
  className: d,
250
250
  children: R[e.triggerMode]
251
251
  }),
252
- /* @__PURE__ */ x("label", {
252
+ /* @__PURE__ */ b("label", {
253
253
  className: "flex flex-col gap-1",
254
- children: [/* @__PURE__ */ b("span", {
254
+ children: [/* @__PURE__ */ y("span", {
255
255
  className: N,
256
256
  children: "Check every (seconds)"
257
- }), /* @__PURE__ */ b("input", {
257
+ }), /* @__PURE__ */ y("input", {
258
258
  type: "number",
259
259
  min: I,
260
260
  max: L,
@@ -272,28 +272,28 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
272
272
  }
273
273
  })]
274
274
  }),
275
- /* @__PURE__ */ b("p", {
275
+ /* @__PURE__ */ y("p", {
276
276
  className: d,
277
277
  children: "60 s suits “is the bin still out”. Every check costs one photograph and one encode, so going below about 30 s buys latency you almost never need and multiplies the cost by the number of scenes you own."
278
278
  })
279
279
  ]
280
280
  }),
281
- /* @__PURE__ */ x("div", {
281
+ /* @__PURE__ */ b("div", {
282
282
  className: P,
283
283
  children: [
284
- /* @__PURE__ */ b("p", {
284
+ /* @__PURE__ */ y("p", {
285
285
  className: F,
286
286
  children: "How sure it has to be"
287
287
  }),
288
- e.check.mode === "similarity" && /* @__PURE__ */ x(S, { children: [/* @__PURE__ */ x("label", {
288
+ e.check.mode === "similarity" && /* @__PURE__ */ b(x, { children: [/* @__PURE__ */ b("label", {
289
289
  className: "flex flex-col gap-1",
290
- children: [/* @__PURE__ */ x("span", {
290
+ children: [/* @__PURE__ */ b("span", {
291
291
  className: N,
292
- children: ["Match threshold — ", /* @__PURE__ */ b("span", {
292
+ children: ["Match threshold — ", /* @__PURE__ */ y("span", {
293
293
  className: "tabular-nums",
294
294
  children: a.threshold.toFixed(2)
295
295
  })]
296
- }), /* @__PURE__ */ b("input", {
296
+ }), /* @__PURE__ */ y("input", {
297
297
  type: "range",
298
298
  min: .3,
299
299
  max: .99,
@@ -312,16 +312,16 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
312
312
  a.threshold === p ? c(!1) : l({ check: u({ threshold: a.threshold }) });
313
313
  }
314
314
  })]
315
- }), /* @__PURE__ */ b("p", {
315
+ }), /* @__PURE__ */ y("p", {
316
316
  className: "text-[10px] text-foreground-subtle",
317
317
  children: "How closely the region still has to resemble the photograph to count as unchanged. Higher means fussier: at 0.95 a passing cloud can read as a change; at 0.60 the bin can be taken and the scene will shrug. 0.80 is a sensible start — if it cries wolf, lower it; if it misses the thing you care about, raise it."
318
318
  })] }),
319
- /* @__PURE__ */ x("label", {
319
+ /* @__PURE__ */ b("label", {
320
320
  className: "flex flex-col gap-1",
321
- children: [/* @__PURE__ */ b("span", {
321
+ children: [/* @__PURE__ */ y("span", {
322
322
  className: N,
323
323
  children: "Agreeing checks before it changes its mind"
324
- }), /* @__PURE__ */ b("input", {
324
+ }), /* @__PURE__ */ y("input", {
325
325
  type: "number",
326
326
  min: 1,
327
327
  max: 10,
@@ -339,16 +339,16 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
339
339
  }
340
340
  })]
341
341
  }),
342
- /* @__PURE__ */ b("p", {
342
+ /* @__PURE__ */ y("p", {
343
343
  className: d,
344
344
  children: "One bad photograph must never be able to flip a scene. 3 agreeing checks at 60 s is about four minutes of latency and is what makes the answer trustworthy — leaving a state costs exactly the same as entering one."
345
345
  }),
346
- /* @__PURE__ */ x("label", {
346
+ /* @__PURE__ */ b("label", {
347
347
  className: "flex flex-col gap-1",
348
- children: [/* @__PURE__ */ b("span", {
348
+ children: [/* @__PURE__ */ y("span", {
349
349
  className: N,
350
350
  children: "Quiet for (seconds) before a check counts"
351
- }), /* @__PURE__ */ b("input", {
351
+ }), /* @__PURE__ */ y("input", {
352
352
  type: "number",
353
353
  min: 0,
354
354
  max: 3600,
@@ -366,16 +366,16 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
366
366
  }
367
367
  })]
368
368
  }),
369
- /* @__PURE__ */ b("p", {
369
+ /* @__PURE__ */ y("p", {
370
370
  className: d,
371
371
  children: "A check taken while something is moving is a photograph of the van parked in front of the bin, so it is discarded rather than merely delayed. 0 disables the gate."
372
372
  }),
373
- /* @__PURE__ */ x("label", {
373
+ /* @__PURE__ */ b("label", {
374
374
  className: "flex flex-col gap-1",
375
- children: [/* @__PURE__ */ b("span", {
375
+ children: [/* @__PURE__ */ y("span", {
376
376
  className: N,
377
377
  children: "Minimum gap between counted checks (seconds)"
378
- }), /* @__PURE__ */ b("input", {
378
+ }), /* @__PURE__ */ y("input", {
379
379
  type: "number",
380
380
  min: 0,
381
381
  max: 3600,
@@ -393,25 +393,25 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
393
393
  }
394
394
  })]
395
395
  }),
396
- /* @__PURE__ */ b("p", {
396
+ /* @__PURE__ */ y("p", {
397
397
  className: d,
398
398
  children: "Spreads the agreeing checks over real time instead of letting three adjacent polls inside one long occlusion be mistaken for three independent opinions."
399
399
  })
400
400
  ]
401
401
  }),
402
- /* @__PURE__ */ x("div", {
402
+ /* @__PURE__ */ b("div", {
403
403
  className: P,
404
404
  children: [
405
- /* @__PURE__ */ b("p", {
405
+ /* @__PURE__ */ y("p", {
406
406
  className: F,
407
407
  children: "Lighting"
408
408
  }),
409
- /* @__PURE__ */ x("label", {
409
+ /* @__PURE__ */ b("label", {
410
410
  className: "flex flex-col gap-1",
411
- children: [/* @__PURE__ */ b("span", {
411
+ children: [/* @__PURE__ */ y("span", {
412
412
  className: N,
413
413
  children: "When a light has no reference of its own"
414
- }), /* @__PURE__ */ x("select", {
414
+ }), /* @__PURE__ */ b("select", {
415
415
  value: e.onUncoveredCondition,
416
416
  disabled: n,
417
417
  className: M,
@@ -419,34 +419,34 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
419
419
  let t = e.target.value;
420
420
  (t === "skip" || t === "judge-anyway") && l({ onUncoveredCondition: t });
421
421
  },
422
- children: [/* @__PURE__ */ b("option", {
422
+ children: [/* @__PURE__ */ y("option", {
423
423
  value: "skip",
424
424
  children: "Skip the check (recommended)"
425
- }), /* @__PURE__ */ b("option", {
425
+ }), /* @__PURE__ */ y("option", {
426
426
  value: "judge-anyway",
427
427
  children: "Judge against the other light anyway"
428
428
  })]
429
429
  })]
430
430
  }),
431
- /* @__PURE__ */ b("p", {
431
+ /* @__PURE__ */ y("p", {
432
432
  className: d,
433
433
  children: z[e.onUncoveredCondition]
434
434
  })
435
435
  ]
436
436
  }),
437
- /* @__PURE__ */ x("div", {
437
+ /* @__PURE__ */ b("div", {
438
438
  className: P,
439
439
  children: [
440
- /* @__PURE__ */ b("p", {
440
+ /* @__PURE__ */ y("p", {
441
441
  className: F,
442
442
  children: "What you get told"
443
443
  }),
444
- /* @__PURE__ */ x("label", {
444
+ /* @__PURE__ */ b("label", {
445
445
  className: "flex flex-col gap-1",
446
- children: [/* @__PURE__ */ b("span", {
446
+ children: [/* @__PURE__ */ y("span", {
447
447
  className: N,
448
448
  children: "Notifications follow"
449
- }), /* @__PURE__ */ x("select", {
449
+ }), /* @__PURE__ */ b("select", {
450
450
  value: e.emit,
451
451
  disabled: n,
452
452
  className: M,
@@ -454,47 +454,47 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
454
454
  let t = e.target.value;
455
455
  (t === "latched" || t === "live") && l({ emit: t });
456
456
  },
457
- children: [/* @__PURE__ */ b("option", {
457
+ children: [/* @__PURE__ */ y("option", {
458
458
  value: "latched",
459
459
  children: "The flag — told once, still visible at breakfast"
460
- }), /* @__PURE__ */ b("option", {
460
+ }), /* @__PURE__ */ y("option", {
461
461
  value: "live",
462
462
  children: "The live state — follows the region as it changes"
463
463
  })]
464
464
  })]
465
465
  }),
466
- /* @__PURE__ */ b("p", {
466
+ /* @__PURE__ */ y("p", {
467
467
  className: d,
468
468
  children: "“Is the bin gone” is a flag: you want to be told once and still see it later. “Is the gate open” is a live state."
469
469
  }),
470
- /* @__PURE__ */ x("label", {
470
+ /* @__PURE__ */ b("label", {
471
471
  className: "flex items-center gap-2",
472
- children: [/* @__PURE__ */ b("input", {
472
+ children: [/* @__PURE__ */ y("input", {
473
473
  type: "checkbox",
474
474
  checked: e.autoRestore,
475
475
  disabled: n,
476
476
  onChange: (e) => l({ autoRestore: e.target.checked })
477
- }), /* @__PURE__ */ b("span", {
477
+ }), /* @__PURE__ */ y("span", {
478
478
  className: N,
479
479
  children: "Clear the flag by itself when things look normal again"
480
480
  })]
481
481
  }),
482
- /* @__PURE__ */ b("p", {
482
+ /* @__PURE__ */ y("p", {
483
483
  className: d,
484
484
  children: "Off by default, so an alarm never silently clears itself. The “back to normal” moment is recorded either way, so an automation can still react to it."
485
485
  })
486
486
  ]
487
487
  }),
488
- /* @__PURE__ */ x("div", {
488
+ /* @__PURE__ */ b("div", {
489
489
  className: P,
490
490
  children: [
491
- /* @__PURE__ */ b("p", {
491
+ /* @__PURE__ */ y("p", {
492
492
  className: F,
493
493
  children: "AI double-check"
494
494
  }),
495
- /* @__PURE__ */ x("label", {
495
+ /* @__PURE__ */ b("label", {
496
496
  className: "flex items-center gap-2",
497
- children: [/* @__PURE__ */ b("input", {
497
+ children: [/* @__PURE__ */ y("input", {
498
498
  type: "checkbox",
499
499
  checked: f,
500
500
  disabled: n || a.confirmPrompt.trim().length === 0,
@@ -502,17 +502,17 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
502
502
  ...U(a.confirmPrompt.trim()),
503
503
  enabled: !0
504
504
  } } : { confirm: null })
505
- }), /* @__PURE__ */ b("span", {
505
+ }), /* @__PURE__ */ y("span", {
506
506
  className: N,
507
507
  children: "Ask a vision model before changing the answer"
508
508
  })]
509
509
  }),
510
- /* @__PURE__ */ x("label", {
510
+ /* @__PURE__ */ b("label", {
511
511
  className: "flex flex-col gap-1",
512
- children: [/* @__PURE__ */ b("span", {
512
+ children: [/* @__PURE__ */ y("span", {
513
513
  className: N,
514
514
  children: "The question to ask"
515
- }), /* @__PURE__ */ b("input", {
515
+ }), /* @__PURE__ */ y("input", {
516
516
  type: "text",
517
517
  value: a.confirmPrompt,
518
518
  placeholder: "e.g. Is the wheelie bin still there?",
@@ -532,11 +532,11 @@ function V({ monitor: e, disabled: n, onPatch: r }) {
532
532
  }
533
533
  })]
534
534
  }),
535
- /* @__PURE__ */ x("p", {
535
+ /* @__PURE__ */ b("p", {
536
536
  className: d,
537
537
  children: [
538
538
  "The model is asked ",
539
- /* @__PURE__ */ b("strong", { children: "only" }),
539
+ /* @__PURE__ */ y("strong", { children: "only" }),
540
540
  " when the region has already changed enough to flip the answer — roughly twice a week for a bin, not once a minute. It reasons about the object rather than the pixels, so rain, shadows and a repositioned bin stop counting as the thing being taken. If it cannot be reached, the change is held rather than announced."
541
541
  ]
542
542
  })
@@ -635,19 +635,19 @@ function X({ deviceId: a }) {
635
635
  H,
636
636
  $
637
637
  ]);
638
- return s ? /* @__PURE__ */ b("div", {
638
+ return s ? /* @__PURE__ */ y("div", {
639
639
  className: "flex flex-col gap-3",
640
- children: E ? /* @__PURE__ */ b("p", {
640
+ children: E ? /* @__PURE__ */ y("p", {
641
641
  className: `${d} leading-relaxed`,
642
642
  children: "Scene monitoring is not available for this camera."
643
- }) : /* @__PURE__ */ x(S, { children: [
644
- /* @__PURE__ */ b("p", {
643
+ }) : /* @__PURE__ */ b(x, { children: [
644
+ /* @__PURE__ */ y("p", {
645
645
  className: `${d} leading-relaxed`,
646
646
  children: "A scene watches one region of this camera and tells you when it stops looking like the picture you captured. Draw a box around the thing you care about — a wheelie bin, a gate, a parking space — then capture what “normal” looks like. Daylight is enough to start: the night reference is optional, and without it the scene simply sits the infrared hours out instead of reporting a problem."
647
647
  }),
648
- /* @__PURE__ */ b("div", {
648
+ /* @__PURE__ */ y("div", {
649
649
  className: "relative overflow-hidden rounded-md border border-border",
650
- children: /* @__PURE__ */ b(C, {
650
+ children: /* @__PURE__ */ y(S, {
651
651
  items: oe,
652
652
  supportedShapes: ["rect"],
653
653
  selectedId: N ?? (z === null ? null : "__draft__"),
@@ -655,7 +655,7 @@ function X({ deviceId: a }) {
655
655
  onShapeChange: se,
656
656
  onDrawComplete: ce,
657
657
  drawingKind: L && z === null ? "rect" : null,
658
- backdrop: m.src === null ? null : /* @__PURE__ */ b("img", {
658
+ backdrop: m.src === null ? null : /* @__PURE__ */ y("img", {
659
659
  src: m.src,
660
660
  alt: "",
661
661
  className: "h-full w-full object-contain",
@@ -663,9 +663,9 @@ function X({ deviceId: a }) {
663
663
  })
664
664
  })
665
665
  }),
666
- /* @__PURE__ */ x("div", {
666
+ /* @__PURE__ */ b("div", {
667
667
  className: "flex flex-wrap items-center gap-2",
668
- children: [/* @__PURE__ */ b("button", {
668
+ children: [/* @__PURE__ */ y("button", {
669
669
  type: "button",
670
670
  className: L ? G : W,
671
671
  "aria-pressed": L,
@@ -674,7 +674,7 @@ function X({ deviceId: a }) {
674
674
  },
675
675
  disabled: O !== null,
676
676
  children: L ? "Cancel" : "+ New scene"
677
- }), /* @__PURE__ */ b("button", {
677
+ }), /* @__PURE__ */ y("button", {
678
678
  type: "button",
679
679
  className: W,
680
680
  onClick: m.refresh,
@@ -682,26 +682,26 @@ function X({ deviceId: a }) {
682
682
  children: "Refresh frame"
683
683
  })]
684
684
  }),
685
- L && /* @__PURE__ */ x("div", {
685
+ L && /* @__PURE__ */ b("div", {
686
686
  className: "flex flex-col gap-2 rounded-md border border-border bg-surface p-2",
687
687
  children: [
688
- /* @__PURE__ */ b("p", {
688
+ /* @__PURE__ */ y("p", {
689
689
  className: "text-[10px] text-foreground-subtle",
690
690
  children: z === null ? "Click on the frame to drop a box, then drag its corner to fit it around the thing you want watched." : "Name it, then create. You capture what “normal” looks like next."
691
691
  }),
692
- z !== null && f(z) && /* @__PURE__ */ b("p", {
692
+ z !== null && te(z) && /* @__PURE__ */ y("p", {
693
693
  className: "text-[11px] leading-relaxed text-warning",
694
694
  children: "That box covers most of the frame. A scene that big is dominated by the weather, the sky and passing cars — it will quietly stop noticing the thing you actually care about. Draw it tighter."
695
695
  }),
696
- /* @__PURE__ */ x("div", {
696
+ /* @__PURE__ */ b("div", {
697
697
  className: "flex items-center gap-2",
698
- children: [/* @__PURE__ */ b("input", {
698
+ children: [/* @__PURE__ */ y("input", {
699
699
  type: "text",
700
700
  value: H,
701
701
  onChange: (e) => U(e.target.value),
702
702
  placeholder: "e.g. Immondizia prelevata",
703
703
  className: "flex-1 rounded-md border border-border bg-surface px-2 py-1 text-[12px] text-foreground"
704
- }), /* @__PURE__ */ b("button", {
704
+ }), /* @__PURE__ */ y("button", {
705
705
  type: "button",
706
706
  className: G,
707
707
  onClick: () => void le(),
@@ -711,41 +711,41 @@ function X({ deviceId: a }) {
711
711
  })
712
712
  ]
713
713
  }),
714
- j !== null && /* @__PURE__ */ b("p", {
714
+ j !== null && /* @__PURE__ */ y("p", {
715
715
  className: "text-[11px] leading-relaxed text-danger",
716
716
  children: j
717
717
  }),
718
- Q.length === 0 ? /* @__PURE__ */ b("p", {
718
+ Q.length === 0 ? /* @__PURE__ */ y("p", {
719
719
  className: `${d} leading-relaxed`,
720
720
  children: "No scenes on this camera yet."
721
- }) : /* @__PURE__ */ b("ul", {
721
+ }) : /* @__PURE__ */ y("ul", {
722
722
  className: "flex flex-col gap-2",
723
723
  children: Q.map((e) => {
724
- let t = ne(e);
725
- return /* @__PURE__ */ x("li", {
724
+ let t = h(e);
725
+ return /* @__PURE__ */ b("li", {
726
726
  className: `flex flex-col gap-1.5 rounded-md border p-2 ${N === e.id ? "border-primary/50" : "border-border"}`,
727
727
  children: [
728
- /* @__PURE__ */ x("div", {
728
+ /* @__PURE__ */ b("div", {
729
729
  className: "flex items-center gap-2",
730
- children: [/* @__PURE__ */ b("button", {
730
+ children: [/* @__PURE__ */ y("button", {
731
731
  type: "button",
732
732
  className: "flex-1 text-left text-[12px] font-medium text-foreground",
733
733
  onClick: () => P(e.id),
734
734
  children: e.label
735
- }), /* @__PURE__ */ b("span", {
735
+ }), /* @__PURE__ */ y("span", {
736
736
  className: `rounded border px-1.5 py-0.5 text-[10px] font-medium ${q[t.tone]}`,
737
737
  children: t.text
738
738
  })]
739
739
  }),
740
- /* @__PURE__ */ b("p", {
740
+ /* @__PURE__ */ y("p", {
741
741
  className: `${d} leading-relaxed`,
742
- children: g(e, ae)
742
+ children: f(e, ae)
743
743
  }),
744
- /* @__PURE__ */ b("p", {
744
+ /* @__PURE__ */ y("p", {
745
745
  className: `${d} tabular-nums`,
746
- children: te(e)
746
+ children: ne(e)
747
747
  }),
748
- /* @__PURE__ */ b(k, {
748
+ /* @__PURE__ */ y(k, {
749
749
  monitor: e,
750
750
  disabled: O !== null,
751
751
  onDelete: ({ stateId: t, index: n }) => void $(`refdel-${e.id}-${t}-${String(n)}`, async () => s.sceneMonitor?.deleteReference({
@@ -754,65 +754,65 @@ function X({ deviceId: a }) {
754
754
  index: n
755
755
  }))
756
756
  }),
757
- /* @__PURE__ */ x("div", {
757
+ /* @__PURE__ */ b("div", {
758
758
  className: "flex flex-wrap items-center gap-1.5",
759
759
  children: [
760
- h.map((t) => {
760
+ ie.map((t) => {
761
761
  let n = t === "ir";
762
- return /* @__PURE__ */ x("button", {
762
+ return /* @__PURE__ */ b("button", {
763
763
  type: "button",
764
764
  className: W,
765
765
  disabled: O !== null,
766
- title: n ? "Optional. Without a night reference the checks in infrared are simply skipped — the scene keeps working in daylight and nothing is reported as broken." : `Take a fresh photo now and store it as the ${_(t).toLowerCase()} reference`,
766
+ title: n ? "Optional. Without a night reference the checks in infrared are simply skipped — the scene keeps working in daylight and nothing is reported as broken." : `Take a fresh photo now and store it as the ${g(t).toLowerCase()} reference`,
767
767
  onClick: () => void $(`cap-${e.id}-${t}`, async () => s.sceneMonitor?.captureReference({
768
768
  monitorId: e.id,
769
769
  condition: t
770
770
  })),
771
771
  children: [
772
- /* @__PURE__ */ b(ee, { className: "mr-1 inline h-3 w-3" }),
772
+ /* @__PURE__ */ y(ee, { className: "mr-1 inline h-3 w-3" }),
773
773
  "Capture ",
774
- _(t).toLowerCase(),
775
- n && /* @__PURE__ */ b("span", {
774
+ g(t).toLowerCase(),
775
+ n && /* @__PURE__ */ y("span", {
776
776
  className: "ml-1 text-foreground-subtle/70",
777
777
  children: "(optional)"
778
778
  })
779
779
  ]
780
780
  }, t);
781
781
  }),
782
- /* @__PURE__ */ x("button", {
782
+ /* @__PURE__ */ b("button", {
783
783
  type: "button",
784
784
  className: G,
785
785
  disabled: O !== null || e.states.length === 0,
786
786
  title: "Clear the flag and re-photograph what normal looks like right now",
787
787
  onClick: () => void $(`reset-${e.id}`, async () => s.sceneMonitor?.resetScene({ monitorId: e.id })),
788
- children: [/* @__PURE__ */ b(v, { className: "mr-1 inline h-3 w-3" }), "Reset"]
788
+ children: [/* @__PURE__ */ y(_, { className: "mr-1 inline h-3 w-3" }), "Reset"]
789
789
  }),
790
- /* @__PURE__ */ b("button", {
790
+ /* @__PURE__ */ y("button", {
791
791
  type: "button",
792
792
  className: W,
793
793
  disabled: O !== null,
794
794
  onClick: () => void $(`check-${e.id}`, async () => s.sceneMonitor?.recheckNow({ monitorId: e.id })),
795
795
  children: "Check now"
796
796
  }),
797
- /* @__PURE__ */ x("button", {
797
+ /* @__PURE__ */ b("button", {
798
798
  type: "button",
799
799
  className: F === e.id ? G : W,
800
800
  "aria-pressed": F === e.id,
801
801
  "aria-label": `Settings for ${e.label}`,
802
802
  disabled: O !== null,
803
803
  onClick: () => I((t) => t === e.id ? null : e.id),
804
- children: [/* @__PURE__ */ b(ie, { className: "mr-1 inline h-3 w-3" }), "Settings"]
804
+ children: [/* @__PURE__ */ y(C, { className: "mr-1 inline h-3 w-3" }), "Settings"]
805
805
  }),
806
- /* @__PURE__ */ b("button", {
806
+ /* @__PURE__ */ y("button", {
807
807
  type: "button",
808
808
  className: K,
809
809
  disabled: O !== null,
810
810
  onClick: () => void $(`del-${e.id}`, async () => s.sceneMonitor?.deleteScene({ monitorId: e.id })),
811
- children: /* @__PURE__ */ b(y, { className: "h-3 w-3" })
811
+ children: /* @__PURE__ */ y(v, { className: "h-3 w-3" })
812
812
  })
813
813
  ]
814
814
  }),
815
- F === e.id && /* @__PURE__ */ b(V, {
815
+ F === e.id && /* @__PURE__ */ y(V, {
816
816
  monitor: e,
817
817
  disabled: O !== null,
818
818
  onPatch: (t) => void $(`tune-${e.id}`, async () => s.sceneMonitor?.updateScene({