@glasshome/widget-sdk 1.22.1 → 1.23.0

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.js CHANGED
@@ -4,12 +4,12 @@ import { z as a, z as o } from "zod";
4
4
  import { getForecasts as s, getStream as c, getWebRtcClientConfig as l, hassMediaUrl as u, sendWebRtcCandidate as d, startWebRtcSession as f, state as p, trackEntityHistory as m, untrackEntityHistory as h } from "@glasshome/sync-layer";
5
5
  import { byDomain as g, useArea as _, useCalendarEvents as v, useCamera as y, useConnection as b, useCurrency as x, useEntities as S, useEntity as ee, useEntity as C, useEntityHistory as w, useEntityStatistics as te, useForecast as ne, useHassConfig as re, useLocale as ie, useService as ae, useStore as oe, useTemperatureUnit as se, useToggle as ce, useTurnOff as le, useTurnOn as ue, useUnitSystem as de } from "@glasshome/sync-layer/solid";
6
6
  import { For as T, Show as E, children as fe, createContext as pe, createEffect as D, createMemo as O, createSignal as k, on as me, onCleanup as A, onMount as he, splitProps as ge, useContext as j } from "solid-js";
7
- import { addEventListener as _e, className as M, createComponent as N, delegateEvents as ve, effect as P, insert as F, memo as I, setAttribute as L, setStyleProperty as R, style as z, template as B, use as V } from "solid-js/web";
8
- import { Accordion as ye, AccordionContent as be, AccordionItem as xe, AccordionTrigger as Se, Badge as Ce, Badge as we, Button as Te, Button as Ee, ButtonGroup as De, ButtonGroup as Oe, Carousel as ke, CarouselContent as Ae, CarouselDots as je, CarouselItem as Me, CarouselNext as Ne, CarouselPrevious as Pe, ColorDisc as Fe, ColorSlider as Ie, ColorWheel as Le, CountPill as Re, CountPill as ze, Empty as Be, EmptyDescription as Ve, EmptyHeader as He, EmptyTitle as Ue, FactRow as H, FieldGroup as We, FieldTitle as Ge, HOLD_GRACE_MS as Ke, HOLD_MS as qe, Icon as Je, Icon as U, Input as Ye, Label as Xe, Popover as Ze, PopoverContent as Qe, Progress as $e, ResponsiveDialog as et, ResponsiveDialogBody as tt, ResponsiveDialogBody as nt, ResponsiveDialogClose as rt, ResponsiveDialogContent as it, ResponsiveDialogDescription as at, ResponsiveDialogFooter as ot, ResponsiveDialogFooter as st, ResponsiveDialogHeader as ct, ResponsiveDialogTitle as lt, SchemaForm as ut, SectionIcon as dt, SectionIcon as ft, SectionMeta as pt, SectionRow as mt, SectionTitle as ht, Select as gt, SelectContent as _t, SelectItem as vt, SelectTrigger as yt, SelectValue as bt, Slider as xt, SwatchPicker as St, Switch as Ct, Tabs as wt, Tabs as Tt, TabsContent as Et, TabsContent as Dt, TabsList as Ot, TabsList as kt, TabsTrigger as At, TabsTrigger as jt, TemperatureBar as Mt, Toggle as Nt, ToggleGroup as Pt, ToggleGroup as Ft, ToggleGroupItem as It, ToggleGroupItem as Lt, buttonVariants as Rt, imagePreset as zt, imagePreset as Bt, imageUrl as Vt, imageUrl as Ht, mediaUrl as Ut, parseColor as Wt, presetValue as Gt, spendLongPress as Kt } from "@glasshome/ui/solid";
9
- import { clsx as qt } from "clsx";
10
- import { twMerge as Jt } from "tailwind-merge";
7
+ import { addEventListener as M, className as N, createComponent as P, delegateEvents as _e, effect as F, insert as I, memo as L, setAttribute as R, setStyleProperty as z, style as B, template as V, use as H } from "solid-js/web";
8
+ import { Accordion as ve, AccordionContent as ye, AccordionItem as be, AccordionTrigger as xe, Badge as Se, Badge as Ce, Button as we, Button as Te, ButtonGroup as Ee, ButtonGroup as De, Carousel as Oe, CarouselContent as ke, CarouselDots as Ae, CarouselItem as je, CarouselNext as Me, CarouselPrevious as Ne, ColorDisc as Pe, ColorSlider as Fe, ColorWheel as Ie, CountPill as Le, CountPill as Re, Empty as ze, EmptyDescription as Be, EmptyHeader as Ve, EmptyTitle as He, FactRow as Ue, FieldGroup as We, FieldTitle as Ge, HOLD_GRACE_MS as Ke, HOLD_MS as qe, Icon as Je, Icon as U, Input as Ye, Label as Xe, Popover as Ze, PopoverContent as Qe, Progress as $e, ResponsiveDialog as et, ResponsiveDialogBody as tt, ResponsiveDialogBody as nt, ResponsiveDialogClose as rt, ResponsiveDialogContent as it, ResponsiveDialogDescription as at, ResponsiveDialogFooter as ot, ResponsiveDialogFooter as st, ResponsiveDialogHeader as ct, ResponsiveDialogTitle as lt, SchemaForm as ut, SectionIcon as dt, SectionIcon as ft, SectionMeta as pt, SectionRow as mt, SectionTitle as ht, Select as gt, SelectContent as _t, SelectItem as vt, SelectTrigger as yt, SelectValue as bt, Slider as xt, SwatchPicker as St, Switch as Ct, Tabs as wt, Tabs as Tt, TabsContent as Et, TabsContent as Dt, TabsList as Ot, TabsList as kt, TabsTrigger as At, TabsTrigger as jt, TemperatureBar as Mt, Toggle as Nt, ToggleGroup as Pt, ToggleGroup as Ft, ToggleGroupItem as It, ToggleGroupItem as Lt, buttonVariants as Rt, copyText as zt, imagePreset as Bt, imagePreset as Vt, imageUrl as Ht, imageUrl as Ut, mediaUrl as Wt, parseColor as Gt, presetValue as Kt, spendLongPress as qt, useCopyText as Jt, useCopyText as Yt } from "@glasshome/ui/solid";
9
+ import { clsx as Xt } from "clsx";
10
+ import { twMerge as Zt } from "tailwind-merge";
11
11
  //#region src/framework/to-form-schema.ts
12
- function Yt(e) {
12
+ function Qt(e) {
13
13
  return o.toJSONSchema(e, { override: (e) => {
14
14
  let t = o.globalRegistry.get(e.zodSchema);
15
15
  return t && typeof t == "object" && Object.keys(t).length > 0 ? {
@@ -18,7 +18,7 @@ function Yt(e) {
18
18
  } : e.jsonSchema;
19
19
  } });
20
20
  }
21
- function Xt(e) {
21
+ function $t(e) {
22
22
  try {
23
23
  return e.parse({});
24
24
  } catch {
@@ -27,59 +27,59 @@ function Xt(e) {
27
27
  }
28
28
  //#endregion
29
29
  //#region src/define-widget.ts
30
- function Zt(e) {
31
- return e.configSchema && (e.manifest.schema || (e.manifest.schema = Yt(e.configSchema)), e.manifest.defaultConfig || (e.manifest.defaultConfig = Xt(e.configSchema))), e;
30
+ function en(e) {
31
+ return e.configSchema && (e.manifest.schema || (e.manifest.schema = Qt(e.configSchema)), e.manifest.defaultConfig || (e.manifest.defaultConfig = $t(e.configSchema))), e;
32
32
  }
33
33
  //#endregion
34
34
  //#region src/framework/hooks/use-widget-context.ts
35
35
  var W = pe();
36
- function Qt() {
36
+ function tn() {
37
37
  let e = j(W);
38
38
  if (!e) throw Error("useWidgetContext must be used within a Widget component");
39
39
  return e;
40
40
  }
41
41
  //#endregion
42
42
  //#region src/framework/hooks/use-service.ts
43
- function $t(e) {
43
+ function nn(e) {
44
44
  let t = Array.isArray(e) ? e[0] : e, n = t?.split(".")[0];
45
45
  if (!n) throw Error(`Invalid entity ID: ${String(t)}`);
46
46
  return n;
47
47
  }
48
- function en(e, t) {
48
+ function rn(e, t) {
49
49
  return async (n, r = {}) => {
50
- await e($t(n), t, r, { entity_id: n });
50
+ await e(nn(n), t, r, { entity_id: n });
51
51
  };
52
52
  }
53
- function tn() {
53
+ function an() {
54
54
  let e = j(W)?.callService;
55
55
  return e ? {
56
56
  callService: e,
57
- turnOn: en(e, "turn_on"),
58
- turnOff: en(e, "turn_off"),
59
- toggle: en(e, "toggle")
57
+ turnOn: rn(e, "turn_on"),
58
+ turnOff: rn(e, "turn_off"),
59
+ toggle: rn(e, "toggle")
60
60
  } : ae();
61
61
  }
62
- function nn() {
62
+ function on() {
63
63
  let e = j(W)?.callService;
64
- return e ? en(e, "turn_on") : ue();
64
+ return e ? rn(e, "turn_on") : ue();
65
65
  }
66
- function rn() {
66
+ function sn() {
67
67
  let e = j(W)?.callService;
68
- return e ? en(e, "turn_off") : le();
68
+ return e ? rn(e, "turn_off") : le();
69
69
  }
70
- function an() {
70
+ function cn() {
71
71
  let e = j(W)?.callService;
72
- return e ? en(e, "toggle") : ce();
72
+ return e ? rn(e, "toggle") : ce();
73
73
  }
74
74
  //#endregion
75
75
  //#region src/framework/design-system/z-index.ts
76
- var on = {
76
+ var ln = {
77
77
  BACKGROUND: 0,
78
78
  CONTENT: 10,
79
79
  OVERLAY: 20,
80
80
  ACTIONS: 30
81
81
  }, G = /* @__PURE__ */ new WeakMap();
82
- function sn(e = "controls") {
82
+ function un(e = "controls") {
83
83
  let [t, n] = k(!1), [r, i] = k(e), a = (t) => {
84
84
  i(t ?? e), n(!0);
85
85
  }, o = j(W);
@@ -106,13 +106,13 @@ function sn(e = "controls") {
106
106
  }
107
107
  //#endregion
108
108
  //#region src/framework/hooks/widget-registry.ts
109
- var cn = /* @__PURE__ */ new WeakMap(), ln = Symbol("glasshome.widget.registry");
110
- function un(e) {
111
- return e[ln] ?? e;
109
+ var dn = /* @__PURE__ */ new WeakMap(), fn = Symbol("glasshome.widget.registry");
110
+ function pn(e) {
111
+ return e[fn] ?? e;
112
112
  }
113
- function dn(e) {
113
+ function mn(e) {
114
114
  if (!e) return;
115
- let t = un(e), n = cn.get(t);
115
+ let t = pn(e), n = dn.get(t);
116
116
  if (!n) {
117
117
  let [e, r] = k(!1), [i, a] = k(), [o, s] = k(), [c, l] = k(), [u, d] = k(!1);
118
118
  n = {
@@ -126,46 +126,46 @@ function dn(e) {
126
126
  setIcon: l,
127
127
  nothingMore: u,
128
128
  setNothingMore: d
129
- }, cn.set(t, n);
129
+ }, dn.set(t, n);
130
130
  }
131
131
  return n;
132
132
  }
133
133
  //#endregion
134
134
  //#region src/framework/gestures/cursors.ts
135
- var fn = 32, K = fn / 2, q = "white", pn = "rgba(0,0,0,0.4)", mn = 2, hn = 3;
136
- function gn(e) {
135
+ var hn = 32, K = hn / 2, q = "white", gn = "rgba(0,0,0,0.4)", _n = 2, vn = 3;
136
+ function yn(e) {
137
137
  return `url("data:image/svg+xml,${encodeURIComponent(e)}")`;
138
138
  }
139
- function _n(e) {
140
- return `<svg xmlns="http://www.w3.org/2000/svg" width="${fn}" height="${fn}" viewBox="0 0 ${fn} ${fn}">${e}</svg>`;
139
+ function bn(e) {
140
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${hn}" height="${hn}" viewBox="0 0 ${hn} ${hn}">${e}</svg>`;
141
141
  }
142
- var vn = _n(`
142
+ var xn = bn(`
143
143
  <g transform="translate(6, 2)">
144
144
  <!-- shadow -->
145
- <g stroke="${pn}" stroke-width="${hn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
145
+ <g stroke="${gn}" stroke-width="${vn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
146
146
  <path d="M10 8V3a2 2 0 0 1 4 0v10l4.5-4.5a2 2 0 0 1 2.83 2.83L14 18.5c-2 2-4 3.5-8 3.5-3 0-5-2-5-5v-6a2 2 0 0 1 4 0v2"/>
147
147
  </g>
148
148
  <!-- main -->
149
- <g stroke="${q}" stroke-width="${mn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
149
+ <g stroke="${q}" stroke-width="${_n}" fill="none" stroke-linecap="round" stroke-linejoin="round">
150
150
  <path d="M10 8V3a2 2 0 0 1 4 0v10l4.5-4.5a2 2 0 0 1 2.83 2.83L14 18.5c-2 2-4 3.5-8 3.5-3 0-5-2-5-5v-6a2 2 0 0 1 4 0v2"/>
151
151
  </g>
152
152
  </g>
153
- `), yn = _n(`
153
+ `), Sn = bn(`
154
154
  <g>
155
- <circle cx="${K}" cy="${K}" r="8" stroke="${pn}" stroke-width="${hn}" fill="none"/>
155
+ <circle cx="${K}" cy="${K}" r="8" stroke="${gn}" stroke-width="${vn}" fill="none"/>
156
156
  <circle cx="${K}" cy="${K}" r="8" stroke="${q}" stroke-width="1.5" fill="none"/>
157
157
  <circle cx="${K}" cy="${K}" r="1.5" fill="${q}"/>
158
158
  </g>
159
- `), bn = _n(`
159
+ `), Cn = bn(`
160
160
  <g>
161
161
  <!-- shadow -->
162
- <g stroke="${pn}" stroke-width="${hn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
162
+ <g stroke="${gn}" stroke-width="${vn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
163
163
  <line x1="6" y1="${K}" x2="26" y2="${K}"/>
164
164
  <polyline points="10,12 6,${K} 10,20"/>
165
165
  <polyline points="22,12 26,${K} 22,20"/>
166
166
  </g>
167
167
  <!-- main -->
168
- <g stroke="${q}" stroke-width="${mn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
168
+ <g stroke="${q}" stroke-width="${_n}" fill="none" stroke-linecap="round" stroke-linejoin="round">
169
169
  <line x1="6" y1="${K}" x2="26" y2="${K}"/>
170
170
  <polyline points="10,12 6,${K} 10,20"/>
171
171
  <polyline points="22,12 26,${K} 22,20"/>
@@ -175,16 +175,16 @@ var vn = _n(`
175
175
  <circle cx="11" cy="${K}" r="1" fill="${q}" opacity="0.6"/>
176
176
  <circle cx="21" cy="${K}" r="1" fill="${q}" opacity="0.6"/>
177
177
  </g>
178
- `), xn = _n(`
178
+ `), wn = bn(`
179
179
  <g>
180
180
  <!-- shadow -->
181
- <g stroke="${pn}" stroke-width="${hn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
181
+ <g stroke="${gn}" stroke-width="${vn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
182
182
  <line x1="${K}" y1="6" x2="${K}" y2="26"/>
183
183
  <polyline points="12,10 ${K},6 20,10"/>
184
184
  <polyline points="12,22 ${K},26 20,22"/>
185
185
  </g>
186
186
  <!-- main -->
187
- <g stroke="${q}" stroke-width="${mn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
187
+ <g stroke="${q}" stroke-width="${_n}" fill="none" stroke-linecap="round" stroke-linejoin="round">
188
188
  <line x1="${K}" y1="6" x2="${K}" y2="26"/>
189
189
  <polyline points="12,10 ${K},6 20,10"/>
190
190
  <polyline points="12,22 ${K},26 20,22"/>
@@ -194,10 +194,10 @@ var vn = _n(`
194
194
  <circle cx="${K}" cy="11" r="1" fill="${q}" opacity="0.6"/>
195
195
  <circle cx="${K}" cy="21" r="1" fill="${q}" opacity="0.6"/>
196
196
  </g>
197
- `), Sn = _n(`
197
+ `), Tn = bn(`
198
198
  <g>
199
199
  <!-- shadow -->
200
- <g stroke="${pn}" stroke-width="${hn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
200
+ <g stroke="${gn}" stroke-width="${vn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
201
201
  <line x1="7" y1="${K}" x2="25" y2="${K}"/>
202
202
  <line x1="${K}" y1="7" x2="${K}" y2="25"/>
203
203
  <polyline points="11,13 7,${K} 11,19"/>
@@ -206,7 +206,7 @@ var vn = _n(`
206
206
  <polyline points="13,21 ${K},25 19,21"/>
207
207
  </g>
208
208
  <!-- main -->
209
- <g stroke="${q}" stroke-width="${mn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
209
+ <g stroke="${q}" stroke-width="${_n}" fill="none" stroke-linecap="round" stroke-linejoin="round">
210
210
  <line x1="7" y1="${K}" x2="25" y2="${K}"/>
211
211
  <line x1="${K}" y1="7" x2="${K}" y2="25"/>
212
212
  <polyline points="11,13 7,${K} 11,19"/>
@@ -218,65 +218,53 @@ var vn = _n(`
218
218
  <circle cx="${K}" cy="${K}" r="2" fill="${q}"/>
219
219
  </g>
220
220
  `);
221
- function Cn(e, t, n) {
221
+ function En(e, t, n) {
222
222
  return {
223
- css: `${gn(e)} ${t} ${n}, auto`,
223
+ css: `${yn(e)} ${t} ${n}, auto`,
224
224
  hotspotX: t,
225
225
  hotspotY: n
226
226
  };
227
227
  }
228
- var wn = {
229
- tap: Cn(vn, 12, 4),
230
- hold: Cn(yn, 16, 16),
231
- slideHorizontal: Cn(bn, K, K),
232
- slideVertical: Cn(xn, K, K),
233
- slideAuto: Cn(Sn, K, K)
228
+ var Dn = {
229
+ tap: En(xn, 12, 4),
230
+ hold: En(Sn, 16, 16),
231
+ slideHorizontal: En(Cn, K, K),
232
+ slideVertical: En(wn, K, K),
233
+ slideAuto: En(Tn, K, K)
234
234
  };
235
235
  //#endregion
236
236
  //#region src/framework/gestures/haptics.ts
237
- function Tn() {
237
+ function On() {
238
238
  if (typeof window > "u") return null;
239
239
  let e = window;
240
240
  return e.Capacitor?.isNativePlatform?.() ? e.Capacitor.Plugins?.Haptics ?? null : null;
241
241
  }
242
- function En(e) {
242
+ function kn(e) {
243
243
  if (typeof navigator < "u" && typeof navigator.vibrate == "function") try {
244
244
  navigator.vibrate(e);
245
245
  } catch {}
246
246
  }
247
- var Dn = {
247
+ var An = {
248
248
  tick() {
249
- let e = Tn();
250
- if (e) {
251
- e.impact({ style: "Light" }).catch(() => {});
252
- return;
253
- }
254
- En(8);
249
+ let e = On();
250
+ e ? e.impact({ style: "Light" }).catch(() => {}) : kn(8);
255
251
  },
256
252
  bump() {
257
- let e = Tn();
258
- if (e) {
259
- e.impact({ style: "Medium" }).catch(() => {});
260
- return;
261
- }
262
- En(20);
253
+ let e = On();
254
+ e ? e.impact({ style: "Medium" }).catch(() => {}) : kn(20);
263
255
  },
264
256
  pulse() {
265
- let e = Tn();
266
- if (e) {
267
- e.impact({ style: "Heavy" }).catch(() => {});
268
- return;
269
- }
270
- En([
257
+ let e = On();
258
+ e ? e.impact({ style: "Heavy" }).catch(() => {}) : kn([
271
259
  0,
272
260
  15,
273
261
  40,
274
262
  15
275
263
  ]);
276
264
  }
277
- }, On = "button, a, input, select, textarea, [role=\"slider\"], [role=\"radio\"], [role=\"switch\"]";
278
- function kn(e, t) {
279
- let n = j(W), r = dn(n), i = () => {
265
+ }, jn = "button, a, input, select, textarea, [role=\"slider\"], [role=\"radio\"], [role=\"switch\"]";
266
+ function Mn(e, t) {
267
+ let n = j(W), r = mn(n), i = () => {
280
268
  let t = e();
281
269
  return t.hold || !n ? t : {
282
270
  ...t,
@@ -329,7 +317,7 @@ function kn(e, t) {
329
317
  let n = i().slide;
330
318
  return n?.orientation === "horizontal" ? "horizontal" : n?.orientation === "vertical" ? "vertical" : e && (c || p(e), c) ? c.height > c.width ? "vertical" : "horizontal" : (t?.() ?? "horizontal") === "horizontal" ? "horizontal" : "vertical";
331
319
  }, v = (e) => {
332
- let t = i(), r = e.target instanceof Element ? e.target.closest(`${On}, .glasshome-widget-controls`) : null, o = r !== null && r !== e.currentTarget;
320
+ let t = i(), r = e.target instanceof Element ? e.target.closest(`${jn}, .glasshome-widget-controls`) : null, o = r !== null && r !== e.currentTarget;
333
321
  if (!(o ? !t.hold : !t.tap && !t.hold && !t.slide)) {
334
322
  if (a.isDown = !0, a.holdOnly = o, a.isTouch = e.pointerType === "touch", a.element = e.currentTarget, p(a.element), a.startX = e.clientX, a.startY = e.clientY, a.startTime = Date.now(), a.hasMoved = !1, a.sliding = !1, t.hold) {
335
323
  let r = t.hold.delay ?? qe, i = a.element.getBoundingClientRect(), o = e.clientX - i.left, c = e.clientY - i.top, l = Math.hypot(Math.max(o, i.width - o), Math.max(c, i.height - c));
@@ -344,7 +332,7 @@ function kn(e, t) {
344
332
  a.holdTimer = null, a.isDown && !a.hasMoved && (s((e) => e && {
345
333
  ...e,
346
334
  fired: !0
347
- }), Dn.bump(), Kt(), a.element && h(a.element), t.hold?.action(), n?.onHeld?.(), a.isDown = !1);
335
+ }), An.bump(), qt(), a.element && h(a.element), t.hold?.action(), n?.onHeld?.(), a.isDown = !1);
348
336
  }, r);
349
337
  }
350
338
  if (!a.isTouch && t.slide && !o) try {
@@ -381,9 +369,9 @@ function kn(e, t) {
381
369
  let t = i();
382
370
  if (t.slide) {
383
371
  let n = t.slide.orientation;
384
- return n === "horizontal" ? wn.slideHorizontal.css : n === "vertical" ? wn.slideVertical.css : (c || p(e), c && c.height > c.width ? wn.slideVertical.css : wn.slideHorizontal.css);
372
+ return n === "horizontal" ? Dn.slideHorizontal.css : n === "vertical" ? Dn.slideVertical.css : (c || p(e), c && c.height > c.width ? Dn.slideVertical.css : Dn.slideHorizontal.css);
385
373
  }
386
- return t.tap ? wn.tap.css : t.hold ? wn.hold.css : "";
374
+ return t.tap ? Dn.tap.css : t.hold ? Dn.hold.css : "";
387
375
  };
388
376
  return {
389
377
  onKeyDown: (e) => {
@@ -419,16 +407,16 @@ function kn(e, t) {
419
407
  }
420
408
  //#endregion
421
409
  //#region src/framework/hooks/use-widget-dimensions.ts
422
- var An = pe();
423
- function jn() {
424
- let e = j(An);
410
+ var Nn = pe();
411
+ function Pn() {
412
+ let e = j(Nn);
425
413
  if (!e) throw Error("useWidgetDimensions must be called inside <Widget>: move the call into a component rendered within <Widget> (the top-level widget scope only sees the host stub).");
426
414
  return e;
427
415
  }
428
416
  //#endregion
429
417
  //#region src/framework/hooks/use-confirm.ts
430
- var Mn = 1600;
431
- function Nn() {
418
+ var Fn = 1600;
419
+ function In() {
432
420
  let [e, t] = k(/* @__PURE__ */ new Set()), n;
433
421
  return A(() => clearTimeout(n)), {
434
422
  has: (t) => e().has(t),
@@ -439,39 +427,39 @@ function Nn() {
439
427
  } catch {
440
428
  return !1;
441
429
  }
442
- return t(new Set(e)), clearTimeout(n), n = setTimeout(() => t(/* @__PURE__ */ new Set()), Mn), !0;
430
+ return t(new Set(e)), clearTimeout(n), n = setTimeout(() => t(/* @__PURE__ */ new Set()), Fn), !0;
443
431
  }
444
432
  };
445
433
  }
446
434
  //#endregion
447
435
  //#region src/framework/utils/cn.ts
448
436
  function J(...e) {
449
- return Jt(qt(e));
437
+ return Zt(Xt(e));
450
438
  }
451
439
  //#endregion
452
440
  //#region src/framework/components/WidgetIcon.tsx
453
- var Pn = /*#__PURE__*/ B("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-2 glass glass-tint\">"), Fn = /*#__PURE__*/ B("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-3 glass glass-tint\">"), In = /*#__PURE__*/ B("<div><div class=\"glasshome-widget-icon-glyph flex items-center justify-center\">");
454
- function Ln(e) {
441
+ var Ln = /*#__PURE__*/ V("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-2 glass glass-tint\">"), Rn = /*#__PURE__*/ V("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-3 glass glass-tint\">"), zn = /*#__PURE__*/ V("<div><div class=\"glasshome-widget-icon-glyph flex items-center justify-center\">");
442
+ function Bn(e) {
455
443
  let t = () => e.entityCount ?? 1;
456
444
  return (() => {
457
- var n = In(), r = n.firstChild;
458
- return F(n, N(E, {
445
+ var n = zn(), r = n.firstChild;
446
+ return I(n, P(E, {
459
447
  get when() {
460
448
  return t() >= 2;
461
449
  },
462
450
  get children() {
463
- return Pn();
451
+ return Ln();
464
452
  }
465
- }), r), F(n, N(E, {
453
+ }), r), I(n, P(E, {
466
454
  get when() {
467
455
  return t() >= 3;
468
456
  },
469
457
  get children() {
470
- return Fn();
458
+ return Rn();
471
459
  }
472
- }), r), F(r, () => e.icon), P((t) => {
460
+ }), r), I(r, () => e.icon), F((t) => {
473
461
  var r = J("glasshome-widget-icon glass glass-tint", "pointer-events-none relative flex shrink-0 items-center justify-center transition-all", e.dimmed && "opacity-50", e.class), i = e.color ? { "--widget-icon-color": e.color } : void 0;
474
- return r !== t.e && M(n, t.e = r), t.t = z(n, i, t.t), t;
462
+ return r !== t.e && N(n, t.e = r), t.t = B(n, i, t.t), t;
475
463
  }, {
476
464
  e: void 0,
477
465
  t: void 0
@@ -480,9 +468,9 @@ function Ln(e) {
480
468
  }
481
469
  //#endregion
482
470
  //#region src/framework/components/anatomy.tsx
483
- var Rn = /*#__PURE__*/ B("<span class=glasshome-widget-eyebrow>"), zn = /*#__PURE__*/ B("<div class=glasshome-widget-head-aside>"), Bn = /*#__PURE__*/ B("<div class=glasshome-widget-head><div class=glasshome-widget-head-text><span class=glasshome-widget-name>"), Vn = /*#__PURE__*/ B("<span class=glasshome-widget-sub>"), Hn = /*#__PURE__*/ B("<span class=glasshome-widget-unit>"), Un = /*#__PURE__*/ B("<div class=glasshome-widget-art>"), Wn = /*#__PURE__*/ B("<div><div class=glasshome-widget-reading><span class=glasshome-widget-reading-value>"), Gn = /*#__PURE__*/ B("<div class=glasshome-widget-controls>"), Kn = /*#__PURE__*/ B("<div>"), qn = /*#__PURE__*/ B("<div class=glasshome-widget-backdrop>"), Jn = /*#__PURE__*/ B("<div class=glasshome-widget-glyph aria-hidden=true>"), Yn = pe(() => !1), Xn = "mdi:check";
484
- function Zn(e) {
485
- let t = j(Yn), n = dn(j(W));
471
+ var Vn = /*#__PURE__*/ V("<span class=glasshome-widget-eyebrow>"), Hn = /*#__PURE__*/ V("<div class=glasshome-widget-head-aside>"), Un = /*#__PURE__*/ V("<div class=glasshome-widget-head><div class=glasshome-widget-head-text><span class=glasshome-widget-name>"), Wn = /*#__PURE__*/ V("<span class=glasshome-widget-sub>"), Gn = /*#__PURE__*/ V("<span class=glasshome-widget-unit>"), Kn = /*#__PURE__*/ V("<div class=glasshome-widget-art>"), qn = /*#__PURE__*/ V("<div><div class=glasshome-widget-reading><span class=glasshome-widget-reading-value>"), Jn = /*#__PURE__*/ V("<div class=glasshome-widget-controls>"), Yn = /*#__PURE__*/ V("<div>"), Xn = /*#__PURE__*/ V("<div class=glasshome-widget-backdrop>"), Zn = /*#__PURE__*/ V("<div class=glasshome-widget-glyph aria-hidden=true>"), Qn = pe(() => !1), $n = "mdi:check";
472
+ function er(e) {
473
+ let t = j(Qn), n = mn(j(W));
486
474
  D(() => n?.setIcon(e.icon)), A(() => {
487
475
  n?.icon() === e.icon && n?.setIcon(void 0);
488
476
  });
@@ -491,15 +479,15 @@ function Zn(e) {
491
479
  return typeof t == "string" && typeof e.name == "string" && t.trim().toLowerCase() === e.name.trim().toLowerCase();
492
480
  };
493
481
  return (() => {
494
- var n = Bn(), o = n.firstChild, s = o.firstChild;
495
- return F(n, N(E, {
482
+ var n = Un(), o = n.firstChild, s = o.firstChild;
483
+ return I(n, P(E, {
496
484
  get when() {
497
485
  return e.icon;
498
486
  },
499
- children: (n) => N(Ln, {
487
+ children: (n) => P(Bn, {
500
488
  get icon() {
501
- return N(U, { get icon() {
502
- return I(() => !!t())() ? Xn : n();
489
+ return P(U, { get icon() {
490
+ return L(() => !!t())() ? $n : n();
503
491
  } });
504
492
  },
505
493
  get entityCount() {
@@ -510,56 +498,56 @@ function Zn(e) {
510
498
  },
511
499
  class: "glasshome-widget-head-icon"
512
500
  })
513
- }), o), F(o, N(E, {
501
+ }), o), I(o, P(E, {
514
502
  get when() {
515
- return I(() => !!r())() && !a();
503
+ return L(() => !!r())() && !a();
516
504
  },
517
505
  get children() {
518
- var e = Rn();
519
- return F(e, r), e;
506
+ var e = Vn();
507
+ return I(e, r), e;
520
508
  }
521
- }), s), F(s, () => e.name), F(n, N(E, {
509
+ }), s), I(s, () => e.name), I(n, P(E, {
522
510
  get when() {
523
511
  return i();
524
512
  },
525
513
  get children() {
526
- var e = zn();
527
- return F(e, i), e;
514
+ var e = Hn();
515
+ return I(e, i), e;
528
516
  }
529
517
  }), null), n;
530
518
  })();
531
519
  }
532
- function Qn(e) {
520
+ function tr(e) {
533
521
  let t = fe(() => e.sub), n = fe(() => e.art), r = O(() => typeof e.value == "string" ? e.value.replace(/[\d\s.,:/%°+\-−]/g, "") : void 0), i = () => typeof e.value == "string" || typeof e.value == "number" ? String(e.value).length + (e.unit ? .5 : 0) : void 0, [a, o] = k();
534
522
  return D(me(r, () => o((e) => e === "a" ? "b" : "a"), { defer: !0 })), (() => {
535
- var r = Wn(), o = r.firstChild, s = o.firstChild;
536
- return F(o, N(E, {
523
+ var r = qn(), o = r.firstChild, s = o.firstChild;
524
+ return I(o, P(E, {
537
525
  get when() {
538
526
  return t();
539
527
  },
540
528
  get children() {
541
- var e = Vn();
542
- return F(e, t), e;
529
+ var e = Wn();
530
+ return I(e, t), e;
543
531
  }
544
- }), s), F(s, () => e.value, null), F(s, N(E, {
532
+ }), s), I(s, () => e.value, null), I(s, P(E, {
545
533
  get when() {
546
534
  return e.unit;
547
535
  },
548
536
  get children() {
549
- var t = Hn();
550
- return F(t, () => e.unit), P(() => L(t, "data-degree", e.unit === "°" || void 0)), t;
537
+ var t = Gn();
538
+ return I(t, () => e.unit), F(() => R(t, "data-degree", e.unit === "°" || void 0)), t;
551
539
  }
552
- }), null), F(r, N(E, {
540
+ }), null), I(r, P(E, {
553
541
  get when() {
554
542
  return n();
555
543
  },
556
544
  get children() {
557
- var e = Un();
558
- return F(e, n), e;
545
+ var e = Kn();
546
+ return I(e, n), e;
559
547
  }
560
- }), null), P((o) => {
548
+ }), null), F((o) => {
561
549
  var c = J("glasshome-widget-hero", e.class), l = n() ? "" : void 0, u = e.value === "" && !t() ? "" : void 0, d = a(), f = i();
562
- return c !== o.e && M(r, o.e = c), l !== o.t && L(r, "data-art", o.t = l), u !== o.a && L(r, "data-empty", o.a = u), d !== o.o && L(s, "data-turn", o.o = d), f !== o.i && R(s, "--value-len", o.i = f), o;
550
+ return c !== o.e && N(r, o.e = c), l !== o.t && R(r, "data-art", o.t = l), u !== o.a && R(r, "data-empty", o.a = u), d !== o.o && R(s, "data-turn", o.o = d), f !== o.i && z(s, "--value-len", o.i = f), o;
563
551
  }, {
564
552
  e: void 0,
565
553
  t: void 0,
@@ -569,43 +557,43 @@ function Qn(e) {
569
557
  }), r;
570
558
  })();
571
559
  }
572
- function $n(e) {
560
+ function nr(e) {
573
561
  return (() => {
574
- var t = Gn();
575
- return F(t, () => e.children), t;
562
+ var t = Jn();
563
+ return I(t, () => e.children), t;
576
564
  })();
577
565
  }
578
- function er(e) {
579
- return N(Oe, {
566
+ function rr(e) {
567
+ return P(De, {
580
568
  get "aria-label"() {
581
569
  return e.label;
582
570
  },
583
571
  class: "glasshome-widget-stepper",
584
572
  get children() {
585
- return [N(Ee, {
573
+ return [P(Te, {
586
574
  variant: "outline",
587
575
  size: "icon",
588
576
  "aria-label": "Lower",
589
577
  class: "glasshome-widget-control",
590
578
  onClick: () => e.onStep(-1),
591
579
  get children() {
592
- return N(U, { icon: "mdi:minus" });
580
+ return P(U, { icon: "mdi:minus" });
593
581
  }
594
- }), N(Ee, {
582
+ }), P(Te, {
595
583
  variant: "outline",
596
584
  size: "icon",
597
585
  "aria-label": "Raise",
598
586
  class: "glasshome-widget-control",
599
587
  onClick: () => e.onStep(1),
600
588
  get children() {
601
- return N(U, { icon: "mdi:plus" });
589
+ return P(U, { icon: "mdi:plus" });
602
590
  }
603
591
  })];
604
592
  }
605
593
  });
606
594
  }
607
- function tr(e) {
608
- return N(Ft, {
595
+ function ir(e) {
596
+ return P(Ft, {
609
597
  get "aria-label"() {
610
598
  return e.label;
611
599
  },
@@ -618,11 +606,11 @@ function tr(e) {
618
606
  onChange: (t) => t && e.onChange(t),
619
607
  class: "glasshome-widget-choice",
620
608
  get children() {
621
- return N(T, {
609
+ return P(T, {
622
610
  get each() {
623
611
  return e.options;
624
612
  },
625
- children: (t) => N(Lt, {
613
+ children: (t) => P(Lt, {
626
614
  get value() {
627
615
  return t.value;
628
616
  },
@@ -634,7 +622,7 @@ function tr(e) {
634
622
  return t.value === e.value ? void 0 : "";
635
623
  },
636
624
  get children() {
637
- return N(U, { get icon() {
625
+ return P(U, { get icon() {
638
626
  return t.icon;
639
627
  } });
640
628
  }
@@ -643,9 +631,9 @@ function tr(e) {
643
631
  }
644
632
  });
645
633
  }
646
- function nr(e) {
647
- let t = Nn(), n = () => e.confirm ?? t, r = () => e.id ?? e["aria-label"] ?? e.icon, i = () => n().has(r());
648
- return N(Ee, {
634
+ function ar(e) {
635
+ let t = In(), n = () => e.confirm ?? t, r = () => e.id ?? e["aria-label"] ?? e.icon, i = () => n().has(r());
636
+ return P(Te, {
649
637
  variant: "outline",
650
638
  get size() {
651
639
  return e.children ? "default" : "icon";
@@ -661,77 +649,77 @@ function nr(e) {
661
649
  },
662
650
  onClick: () => void n().run([r()], e.run),
663
651
  get children() {
664
- return [N(U, { get icon() {
665
- return I(() => !!i())() ? Xn : e.icon;
666
- } }), I(() => e.children)];
652
+ return [P(U, { get icon() {
653
+ return L(() => !!i())() ? $n : e.icon;
654
+ } }), L(() => e.children)];
667
655
  }
668
656
  });
669
657
  }
670
- function rr(e) {
671
- return N(we, {
658
+ function or(e) {
659
+ return P(Ce, {
672
660
  get tone() {
673
661
  return e.tone ?? "var(--muted-foreground)";
674
662
  },
675
663
  class: "gap-1 tabular-nums",
676
664
  get children() {
677
- return [N(E, {
665
+ return [P(E, {
678
666
  get when() {
679
667
  return e.icon;
680
668
  },
681
- children: (e) => N(U, { get icon() {
669
+ children: (e) => P(U, { get icon() {
682
670
  return e();
683
671
  } })
684
- }), I(() => e.children)];
672
+ }), L(() => e.children)];
685
673
  }
686
674
  });
687
675
  }
688
- function ir(e) {
676
+ function sr(e) {
689
677
  return (() => {
690
- var t = Kn();
691
- return F(t, () => e.children), P(() => M(t, J("glasshome-widget-layer", e.class))), t;
678
+ var t = Yn();
679
+ return I(t, () => e.children), F(() => N(t, J("glasshome-widget-layer", e.class))), t;
692
680
  })();
693
681
  }
694
- function ar(e) {
682
+ function cr(e) {
695
683
  return (() => {
696
- var t = qn();
697
- return F(t, () => e.children), t;
684
+ var t = Xn();
685
+ return I(t, () => e.children), t;
698
686
  })();
699
687
  }
700
- function or(e) {
701
- let t = j(Yn);
688
+ function lr(e) {
689
+ let t = j(Qn);
702
690
  return (() => {
703
- var n = Jn();
704
- return F(n, N(U, { get icon() {
705
- return I(() => !!t())() ? Xn : e.icon;
691
+ var n = Zn();
692
+ return I(n, P(U, { get icon() {
693
+ return L(() => !!t())() ? $n : e.icon;
706
694
  } })), n;
707
695
  })();
708
696
  }
709
697
  //#endregion
710
698
  //#region src/framework/theming/tokens.css?raw
711
- var sr = "/* Authoritative SDK CSS contract. Injected once on first Widget mount\n * via framework/theming/tokens.ts.\n *\n * All widget-internal visual scale is driven from CSS custom properties +\n * container queries on the `.glasshome-widget` shell (`container-type: size`).\n * No JS classifier, no size tier enum.\n */\n\n:root {\n --tone-success: oklch(0.7 0.18 145);\n --tone-warning: oklch(0.8 0.17 75);\n --tone-danger: oklch(0.64 0.22 27);\n --tone-info: oklch(0.66 0.2 245);\n --tone-neutral: oklch(0.65 0.02 250);\n --tone-accent: oklch(0.74 0.18 60);\n\n --widget-glow-default: 0.4;\n}\n\n.dark {\n --tone-success: oklch(0.74 0.18 145);\n --tone-warning: oklch(0.82 0.17 75);\n --tone-danger: oklch(0.68 0.22 27);\n --tone-info: oklch(0.7 0.2 245);\n --tone-neutral: oklch(0.69 0.02 250);\n --tone-accent: oklch(0.78 0.18 60);\n\n --widget-glow-default: 0.5;\n}\n\n@property --widget-color {\n syntax: \"<color>\";\n inherits: true;\n initial-value: oklch(0.65 0.02 250);\n}\n\n/* === Widget shell ===\n * One scale: --widget-unit is 1% of the shell's short side. Each size is a floor,\n * a line through the designed 2x2 and 4x4 sizes, and past 4x4 the share it has\n * at 4x4. A widget sizes its own text with these tokens and scales with every tile. */\n.glasshome-widget {\n --widget-color: var(--tone-neutral);\n --widget-glow-strength: var(--widget-glow-default);\n --widget-radius: var(--radius-xl, 12px);\n\n --widget-unit: 1cqmin;\n --widget-text-value: max(\n 22px,\n calc(8.5px + 13.4 * var(--widget-unit)),\n calc(16 * var(--widget-unit))\n );\n --widget-text-name: max(\n 14px,\n calc(8.9px + 4.37 * var(--widget-unit)),\n calc(7.07 * var(--widget-unit))\n );\n --widget-text-meta: max(\n 11px,\n calc(8px + 2.44 * var(--widget-unit)),\n calc(4.88 * var(--widget-unit))\n );\n --widget-text-sub: max(\n 12px,\n calc(10.1px + 1.22 * var(--widget-unit)),\n calc(4.3 * var(--widget-unit))\n );\n --widget-text-caption: max(11px, calc(3.6 * var(--widget-unit)));\n --widget-control-h: max(36px, calc(30px + 3.84 * var(--widget-unit)));\n --widget-grid-pad: max(\n 10px,\n calc(1.2px + 5.64 * var(--widget-unit)),\n calc(6 * var(--widget-unit))\n );\n --widget-grid-gap: max(6px, calc(2.5px + 2.23 * var(--widget-unit)));\n --widget-icon-box: max(\n 44px,\n calc(31.3px + 8.14 * var(--widget-unit)),\n calc(17.7 * var(--widget-unit))\n );\n --widget-icon-glyph: max(\n 24px,\n calc(16px + 5.12 * var(--widget-unit)),\n calc(10 * var(--widget-unit))\n );\n --widget-pad: clamp(8px, 3.5cqb, 22px);\n --widget-gap: clamp(6px, 2cqb, 14px);\n --widget-title-size: clamp(12px, 2cqi, 18px);\n --widget-subtitle: clamp(12px, 2.5cqi, 20px);\n --widget-status-size: clamp(14px, 5cqi, 36px);\n --widget-value-size: clamp(18px, 7cqi, 48px);\n --widget-badge-size: clamp(11px, 1.6cqi, 14px);\n}\n\n/* Shell material: ui's .glass, worn through the class Widget.tsx carries.\n * Unlayered and class-specific, so these beat the formula's :where() defaults\n * (wash-2 is re-declared there and cannot be set from a utility). The tone\n * stays the formula's transparent default until Widget.tsx sets one inline:\n * a widget without a tone is the plain card, never a neutral-grey wash. */\n.glasshome-widget {\n --widget-wash: 22%;\n --widget-wash-2: 11%;\n --glass-wash: var(--widget-wash);\n /* The material's wash style: fade keeps --widget-wash-2, flat runs it up to --widget-wash. */\n --glass-wash-2: calc(\n var(--widget-wash-2) + (var(--widget-wash) - var(--widget-wash-2)) *\n (3 - var(--_material-wash-split, 3)) / 2\n );\n --glass-wash-angle: var(--_material-wash-angle, 135deg);\n --glass-base: color-mix(in srgb, var(--card) var(--material-clarity, 60%), transparent);\n --glass-rim: 0.3;\n --glass-lift: 0.45;\n --glass-shade: 0.05;\n --glass-grain: var(--_material-grain, none);\n --glass-halo: 1;\n backdrop-filter: var(--widget-backdrop, none);\n -webkit-backdrop-filter: var(--widget-backdrop, none);\n}\n/* The shell's outer glow, beside it so the glow can lie over neighbouring widgets. */\n.glasshome-widget-halo {\n --glass-lift: 0.45;\n}\n/* The material's fill: an accent wash on a widget that passes no tone of its own. */\n.glasshome-widget:not([data-toned]),\n.glasshome-widget-halo:not([data-toned]) {\n --glass-tone: color-mix(\n in srgb,\n var(--material-accent, var(--primary)) calc(var(--_material-fill, 0) * 100%),\n transparent\n );\n --glass-wash: 100%;\n --glass-wash-2: 50%;\n}\n/* A fill widget keeps a neutral card; the fill carries the tone, so a full fill is the toned card. */\n.glasshome-widget:has(.glasshome-widget-slider-fill) {\n --glass-wash: 0%;\n --glass-wash-2: 0%;\n}\n.dark .glasshome-widget {\n --glass-shade: 0;\n}\n/* Ink: the shell's line goes above every widget layer (they stack to 30), or full-bleed media buries it. */\n@container not style(--material-ink-level: 0) {\n .glasshome-widget::after {\n z-index: 40;\n }\n}\n\n/* === Slot: content layout === */\n/* Default: column. Flip to row only on wide-and-short widgets (matches the\n * old contentLayout heuristic: aspect > 1 AND height < 150px). */\n.glasshome-widget-content {\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: var(--widget-pad);\n gap: var(--widget-gap);\n overflow: hidden;\n border-radius: var(--widget-radius);\n}\n@container widget (min-aspect-ratio: 1) and (max-height: 149px) {\n .glasshome-widget-content {\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n }\n}\n\n/* === Compact 1×1 ===\n * Small in BOTH axes → stack the tile: icon on top, label + status centered\n * under it. Icon stays moderate (not a hero) so the text keeps room. Wide\n * tiles (2×1) fail the width test and keep the row layout above. Placed after\n * the row-flip so it wins. */\n@container widget (max-width: 189px) and (max-height: 189px) {\n .glasshome-widget-content {\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n gap: clamp(4px, 2.5cqmin, 8px);\n }\n .glasshome-widget-content > * {\n align-items: center;\n text-align: center;\n }\n .glasshome-widget-icon {\n --widget-icon-box: clamp(36px, 30cqmin, 56px);\n --widget-icon-glyph: clamp(20px, 17cqmin, 32px);\n }\n .glasshome-widget-title {\n font-size: clamp(11px, 6cqmin, 14px);\n max-width: 100%;\n }\n .glasshome-widget-status,\n .glasshome-widget-value {\n font-size: clamp(13px, 7cqmin, 17px);\n }\n .glasshome-widget-content [class*=\"ml-auto\"] {\n margin-left: 0 !important;\n }\n}\n.glasshome-widget-content [class*=\"ml-auto\"] {\n position: relative;\n z-index: 30;\n}\n\n/* === Slot: icon ===\n * ui's tinted icon pill (ICON_PILL_TINT): the disc is .glass, so the material shapes it. */\n.glasshome-widget-icon {\n width: var(--widget-icon-box);\n height: var(--widget-icon-box);\n border-radius: var(--radius-sm, 12px);\n --glass-tone: var(--widget-icon-color, var(--widget-color));\n --glass-rim: 0.4;\n --glass-wash: 18%;\n}\n.glasshome-widget-icon-glyph {\n font-size: var(--widget-icon-glyph);\n line-height: 1;\n}\n.glasshome-widget-icon-stack {\n --stack-step: calc(var(--widget-icon-box) * 0.12);\n position: absolute;\n /* The pill's border would otherwise shrink each plate and widen the first step. */\n inset: -1px;\n width: auto;\n height: auto;\n border-radius: var(--radius-sm, 12px);\n}\n.glasshome-widget-icon-stack-2 {\n translate: var(--stack-step) var(--stack-step);\n opacity: 0.45;\n z-index: -2;\n}\n.glasshome-widget-icon-stack-3 {\n translate: calc(2 * var(--stack-step)) calc(2 * var(--stack-step));\n opacity: 0.2;\n z-index: -3;\n}\n\n/* === Slot: text === */\n.glasshome-widget-title {\n font-size: var(--widget-title-size);\n line-height: 1.2;\n color: var(--color-muted-foreground, currentColor);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.glasshome-widget-subtitle {\n font-size: var(--widget-subtitle);\n color: var(--color-muted-foreground, currentColor);\n}\n.glasshome-widget-status {\n font-size: var(--widget-status-size);\n font-weight: 700;\n color: var(--color-foreground, currentColor);\n line-height: 1.1;\n}\n.glasshome-widget-value {\n font-size: var(--widget-value-size);\n font-weight: 700;\n color: var(--color-foreground, currentColor);\n line-height: 1.05;\n}\n.glasshome-widget-badge {\n font-size: var(--widget-badge-size);\n font-weight: 500;\n padding: 0.125rem 0.5rem;\n border-radius: 9999px;\n background: color-mix(in oklch, var(--color-foreground, currentColor) 20%, transparent);\n color: var(--color-foreground, currentColor);\n}\n\n.glasshome-widget-loading {\n background: color-mix(in oklch, var(--widget-color) 20%, transparent);\n}\n\n/* === Slider fill ===\n * Value flows in via --widget-fill-value (0-100). Vertical orientation auto-\n * detected via container query. */\n.glasshome-widget-slider-fill {\n --widget-fill-value: 0;\n background: linear-gradient(\n 135deg,\n color-mix(\n in srgb,\n var(--widget-color) calc(var(--widget-wash) * var(--material-tint, 1)),\n transparent\n ),\n color-mix(\n in srgb,\n var(--widget-color-to, var(--widget-color))\n calc(var(--widget-wash-2) * var(--material-tint, 1)),\n transparent\n )\n );\n /* Inset: the clip-path cuts any outer shadow. */\n box-shadow: inset 0 0 calc(var(--material-glow, 0px) * 1.2)\n oklch(from var(--widget-color) l c h / 0.55);\n clip-path: inset(0 calc((100 - var(--widget-fill-value)) * 1%) 0 0 round var(--widget-radius));\n}\n@container widget (max-aspect-ratio: 1) {\n .glasshome-widget-slider-fill {\n clip-path: inset(calc((100 - var(--widget-fill-value)) * 1%) 0 0 0 round var(--widget-radius));\n }\n}\n\n/* === Anatomy: Widget.Content with a Widget.Head lays its parts out as a tile === */\n.glasshome-widget-grid {\n position: relative;\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr) auto;\n gap: var(--widget-grid-gap);\n height: 100%;\n padding: var(--widget-grid-pad);\n overflow: hidden;\n isolation: isolate;\n color: var(--foreground);\n}\n\n/* In-flow content spans the tile (the max-content first column would collapse it); absolute parts keep the padding box. */\n.glasshome-widget-grid\n > :where(:not(.glasshome-widget-backdrop, .glasshome-widget-layer, .glasshome-widget-glyph)) {\n grid-column: 1 / -1;\n}\n.glasshome-widget-layer {\n position: absolute;\n inset: 0;\n z-index: -1;\n overflow: hidden;\n}\n.glasshome-widget-head {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n min-width: 0;\n}\n.glasshome-widget-head-text {\n min-height: var(--widget-icon-box);\n justify-content: center;\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n flex: 1;\n}\n.glasshome-widget-head-aside {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 6px;\n max-height: 26px;\n overflow: hidden;\n flex-shrink: 1;\n}\n.glasshome-widget-eyebrow {\n font-size: var(--widget-text-meta);\n font-weight: 500;\n line-height: 1.25;\n color: var(--muted-foreground);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.glasshome-widget-name {\n font-size: var(--widget-text-name);\n font-weight: 650;\n line-height: 1.2;\n letter-spacing: -0.01em;\n color: var(--foreground);\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n overflow-wrap: break-word;\n}\n\n.glasshome-widget-hero {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: var(--widget-grid-gap);\n min-height: 0;\n min-width: 0;\n}\n.glasshome-widget-reading {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n z-index: 1;\n}\n.glasshome-widget-reading-value {\n font-size: var(--widget-text-value);\n font-weight: 650;\n line-height: 1;\n letter-spacing: -0.03em;\n font-variant-numeric: tabular-nums;\n color: var(--foreground);\n white-space: nowrap;\n}\n/* Alternating names restart the rise on each change without rebuilding the text. */\n.glasshome-widget-reading-value[data-turn=\"a\"] {\n animation: tile-value-in-a var(--duration-morph) var(--ease-morph);\n}\n.glasshome-widget-reading-value[data-turn=\"b\"] {\n animation: tile-value-in-b var(--duration-morph) var(--ease-morph);\n}\n@keyframes tile-value-in-a {\n from {\n opacity: 0;\n transform: translateY(0.25em);\n }\n}\n@keyframes tile-value-in-b {\n from {\n opacity: 0;\n transform: translateY(0.25em);\n }\n}\n.glasshome-widget-unit {\n font-size: 0.5em;\n font-weight: 550;\n letter-spacing: 0;\n margin-left: 0.08em;\n color: var(--muted-foreground);\n}\n.glasshome-widget-sub {\n font-size: var(--widget-text-sub);\n font-weight: 500;\n color: var(--muted-foreground);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Placed on the tile, not the hero, so a control row never moves or shrinks it. */\n.glasshome-widget-art {\n position: absolute;\n right: var(--widget-grid-pad);\n bottom: var(--widget-grid-pad);\n height: min(\n calc(100% - 2 * var(--widget-grid-pad) - var(--widget-icon-box) - var(--widget-grid-gap)),\n 48cqi\n );\n display: flex;\n align-items: flex-end;\n justify-content: flex-end;\n pointer-events: none;\n}\n/* Beside art a long word (\"Unlocked\") shrinks to end where the art starts, at about 50cqi; short values keep full size. */\n@container widget (min-width: 180px) and (min-height: 130px) {\n .glasshome-widget-hero[data-art] .glasshome-widget-reading-value {\n font-size: max(18px, min(var(--widget-text-value), calc(50cqi / (var(--value-len, 1) * 0.56))));\n }\n}\n.glasshome-widget-backdrop > img {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n/* Art keeps its shape and clears a state word at its largest (15cqi, about 3.4em); each art sets --art-aspect. */\n.glasshome-widget-grid .glasshome-widget-art > * {\n height: min(\n 100%,\n calc((52cqi - 2 * var(--widget-grid-pad) - var(--widget-grid-gap)) / var(--art-aspect, 1))\n );\n flex-shrink: 0;\n}\n.glasshome-widget-grid .glasshome-widget-art > img {\n width: auto;\n height: auto;\n max-height: 100%;\n max-width: calc(52cqi - 2 * var(--widget-grid-pad) - var(--widget-grid-gap));\n}\n\n.glasshome-widget-controls {\n display: flex;\n gap: 8px;\n min-width: 0;\n}\n\n.glasshome-widget-glyph {\n display: none;\n position: absolute;\n right: -8%;\n bottom: -22%;\n font-size: min(130cqb, 80cqi);\n line-height: 1;\n color: var(--widget-color);\n opacity: 0.16;\n pointer-events: none;\n z-index: -1;\n}\n\n/* Controls sit on the bottom row beside the value, or under it on a narrow tile; the art lifts above them. */\n.glasshome-widget-head {\n grid-column: 1 / -1;\n}\n.glasshome-widget-hero {\n grid-row: 3;\n grid-column: 1 / -1;\n}\n.glasshome-widget-grid:has(> .glasshome-widget-controls) > .glasshome-widget-hero {\n grid-column: 1;\n}\n.glasshome-widget-controls {\n grid-row: 3;\n grid-column: 2;\n align-self: end;\n position: relative;\n z-index: 1;\n}\n.glasshome-widget-grid:has(> .glasshome-widget-hero[data-empty]) > .glasshome-widget-controls {\n grid-column: 1 / -1;\n}\n@container widget (max-width: 519px) {\n .glasshome-widget-grid:has(> .glasshome-widget-controls) {\n grid-template-rows: auto minmax(0, 1fr) auto auto;\n }\n .glasshome-widget-grid:has(> .glasshome-widget-controls) > .glasshome-widget-hero {\n grid-column: 1 / -1;\n }\n .glasshome-widget-controls {\n grid-row: 4;\n grid-column: 1 / -1;\n }\n .glasshome-widget-grid:has(> .glasshome-widget-controls) .glasshome-widget-art {\n bottom: calc(var(--widget-grid-pad) + var(--widget-control-h) + var(--widget-grid-gap));\n height: min(\n calc(\n 100% - 2 * var(--widget-grid-pad) - var(--widget-icon-box) - 2 * var(--widget-grid-gap) -\n var(--widget-control-h)\n ),\n 48cqi\n );\n }\n}\n@container widget (max-height: 229px) {\n .glasshome-widget-controls {\n display: none;\n }\n .glasshome-widget-grid:has(> .glasshome-widget-controls) {\n grid-template-rows: auto minmax(0, 1fr) auto;\n }\n .glasshome-widget-grid:has(> .glasshome-widget-controls) .glasshome-widget-art {\n bottom: var(--widget-grid-pad);\n height: min(\n calc(100% - 2 * var(--widget-grid-pad) - var(--widget-icon-box) - var(--widget-grid-gap)),\n 48cqi\n );\n }\n}\n@container widget (max-width: 179px) {\n .glasshome-widget-art {\n display: none;\n }\n}\n@container widget (max-height: 169px) {\n .glasshome-widget-head-aside {\n display: none;\n }\n}\n@container widget ((max-height: 129px) or (max-width: 139px)) {\n .glasshome-widget-head-text {\n min-height: 0;\n }\n .glasshome-widget-name {\n -webkit-line-clamp: 1;\n }\n .glasshome-widget-grid {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 2px;\n }\n .glasshome-widget-head-icon,\n .glasshome-widget-art,\n .glasshome-widget-eyebrow,\n .glasshome-widget-sub {\n display: none;\n }\n .glasshome-widget-glyph {\n display: block;\n }\n .glasshome-widget-reading-value {\n font-size: clamp(18px, min(34cqb, 20cqi), 30px);\n }\n .glasshome-widget-name {\n font-size: clamp(12px, min(18cqb, 11cqi), 15px);\n font-weight: 550;\n color: var(--muted-foreground);\n }\n}\n@container widget (max-height: 129px) and (min-width: 260px) {\n .glasshome-widget-grid {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: var(--widget-grid-gap);\n }\n .glasshome-widget-name {\n font-size: clamp(14px, 22cqb, 18px);\n font-weight: 650;\n color: var(--foreground);\n }\n .glasshome-widget-eyebrow {\n display: block;\n }\n}\n\n.glasshome-widget-backdrop {\n position: absolute;\n inset: 0;\n z-index: -2;\n overflow: hidden;\n}\n.glasshome-widget-backdrop > img.area-night {\n opacity: 0;\n transition: opacity 700ms ease;\n}\n.glasshome-widget-backdrop > img.area-night[data-visible] {\n opacity: 1;\n}\n.glasshome-widget-backdrop > .glasshome-widget-backdrop-light {\n position: absolute;\n inset: 0;\n background: radial-gradient(90% 80% at 25% 30%, oklch(0.8 0.14 70), transparent 70%);\n mix-blend-mode: soft-light;\n opacity: var(--backdrop-light, 0);\n transition: opacity 500ms ease;\n}\n.glasshome-widget-backdrop::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(\n to bottom,\n color-mix(in oklch, var(--card) 82%, transparent) 0%,\n color-mix(in oklch, var(--card) 40%, transparent) 22%,\n transparent 42%,\n transparent 62%,\n color-mix(in oklch, var(--card) 45%, transparent) 82%,\n color-mix(in oklch, var(--card) 80%, transparent) 100%\n );\n}\n\n@container widget (max-width: 239px) {\n .glasshome-widget-choice [data-optional] {\n display: none;\n }\n}\n@container widget (max-width: 259px) {\n .glasshome-widget-head-aside {\n display: none;\n }\n}\n@container widget (max-width: 139px) {\n .glasshome-widget-controls {\n display: none;\n }\n}\n\n.glasshome-widget-controls {\n justify-content: flex-start;\n align-items: center;\n}\n.glasshome-widget-control.glasshome-widget-control {\n width: var(--widget-control-h);\n height: var(--widget-control-h);\n}\n.glasshome-widget-choice .glasshome-widget-control.glasshome-widget-control {\n width: calc(var(--widget-control-h) - 8px);\n height: calc(var(--widget-control-h) - 8px);\n}\n@container widget (max-width: 179px) and (min-height: 130px) {\n .glasshome-widget-grid:not(:has(> .glasshome-widget-backdrop)) .glasshome-widget-head-text {\n min-height: 0;\n }\n .glasshome-widget-grid:not(:has(> .glasshome-widget-backdrop)) .glasshome-widget-head {\n flex-direction: column;\n gap: 6px;\n }\n}\n.glasshome-widget-unit[data-degree] {\n vertical-align: top;\n margin-left: 0.02em;\n color: var(--foreground);\n}\n.glasshome-widget-control-wide.glasshome-widget-control-wide {\n height: var(--widget-control-h);\n gap: 6px;\n padding: 0 14px;\n}\n@container widget (max-width: 179px) {\n .glasshome-widget-grid:has(> .glasshome-widget-backdrop) .glasshome-widget-head-icon {\n display: none;\n }\n}\n.glasshome-widget-grid:has(> .glasshome-widget-backdrop)\n :is(\n .glasshome-widget-reading-value,\n .glasshome-widget-sub,\n .glasshome-widget-name,\n .glasshome-widget-eyebrow\n ) {\n text-shadow: 0 1px 8px color-mix(in oklch, var(--card) 75%, transparent);\n}\n.glasshome-widget-grid:has(> .glasshome-widget-backdrop)\n :is(.glasshome-widget-sub, .glasshome-widget-eyebrow) {\n color: color-mix(in oklch, var(--foreground) 82%, transparent);\n}\n/* Control glyphs and words keep their share of a control as it grows past 4x4. */\n.glasshome-widget-grid\n :is(.glasshome-widget-control, .glasshome-widget-control-wide)\n :is(iconify-icon, svg) {\n font-size: calc(var(--widget-control-h) * 0.43);\n width: 1em;\n height: 1em;\n}\n:is(.glasshome-widget-controls, .glasshome-widget-control-wide) {\n font-size: max(13px, calc(var(--widget-control-h) * 0.3));\n}\n/* A big tile with no art of its own carries its icon large and faint, so the glass is not an empty box. */\n@container widget (min-width: 300px) and (min-height: 260px) {\n .glasshome-widget-grid:not(\n :has(> .glasshome-widget-backdrop),\n :has(> .glasshome-widget-hero[data-art], > .glasshome-widget-art, > .glasshome-widget-layer)\n )\n > .glasshome-widget-glyph {\n display: block;\n right: -3%;\n bottom: -12%;\n font-size: min(78cqb, 52cqi);\n opacity: 0.1;\n }\n}\n/* A one-shot action confirms on its control and on the glyph, the one thing a compact tile shows. */\n.glasshome-widget-grid > .glasshome-widget-glyph {\n transition: opacity var(--duration-state) var(--ease-morph);\n}\n.glasshome-widget[data-confirmed] .glasshome-widget-glyph {\n opacity: 0.5;\n}\n.glasshome-widget-grid\n [data-confirmed]:is(.glasshome-widget-control, .glasshome-widget-control-wide) {\n --glass-base: color-mix(in srgb, var(--widget-color) 35%, transparent);\n transition: background-color var(--duration-state) var(--ease-morph);\n}\n\n/* === Sheet: what a held tile opens (framework/panel) ===\n * Rendered in a popover or dialog outside the widget's shadow root, so every rule\n * the sheet needs lives here, never in a widget's own utilities. */\n.glasshome-sheet {\n display: flex;\n flex-direction: column;\n gap: 18px;\n color: var(--foreground);\n}\n.glasshome-sheet [data-slot=\"swatch-picker\"] {\n max-width: 360px;\n}\n.glasshome-panel-section {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n.glasshome-panel-label {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--muted-foreground);\n}\n.glasshome-panel-rows {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 8px;\n}\n.glasshome-panel-row-wrap {\n position: relative;\n min-width: 0;\n}\n.glasshome-panel-row {\n --widget-wash: 22%;\n --widget-wash-2: 11%;\n --widget-radius: var(--radius-lg, 16px);\n --widget-icon-box: 34px;\n --widget-icon-glyph: 19px;\n position: relative;\n width: 100%;\n height: 56px;\n justify-content: flex-start;\n gap: 10px;\n padding: 0 12px 0 10px;\n overflow: hidden;\n text-align: left;\n touch-action: pan-y;\n}\n.glasshome-panel-row-static {\n cursor: default;\n scale: none;\n}\n.glasshome-panel-row-fill {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n.glasshome-panel-row-icon {\n position: relative;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n}\n.glasshome-panel-row-icon-off {\n color: var(--muted-foreground);\n}\n.glasshome-panel-row-text {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.glasshome-panel-row-name,\n.glasshome-panel-row-state,\n.glasshome-panel-fact-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n/* A reading may take a second line rather than lose its end (\"3 Moderate\"). */\n.glasshome-panel-fact-value {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n.glasshome-panel-row-name,\n.glasshome-panel-fact-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--foreground);\n}\n.glasshome-panel-row-state,\n.glasshome-panel-fact-label {\n font-size: 12px;\n font-weight: 400;\n color: var(--muted-foreground);\n}\n.glasshome-panel-row-trailing {\n position: absolute;\n top: 50%;\n right: 10px;\n translate: 0 -50%;\n}\n.glasshome-panel-facts {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));\n row-gap: 10px;\n padding: 10px 4px 10px 0;\n overflow: hidden;\n border-radius: var(--radius-lg, 16px);\n --glass-base: color-mix(in srgb, var(--card) var(--material-clarity, 60%), transparent);\n backdrop-filter: blur(calc(var(--material-blur, 24px) * 0.6)) saturate(1.6);\n -webkit-backdrop-filter: blur(calc(var(--material-blur, 24px) * 0.6)) saturate(1.6);\n}\n/* Without blur a see-through strip is just see-through: it takes the card fill. */\n.reduce-blur .glasshome-panel-facts {\n --glass-base: var(--card);\n}\n.glasshome-panel-fact {\n display: flex;\n min-width: 0;\n align-items: center;\n gap: 8px;\n padding: 0 12px;\n box-shadow: -1px 0 0 color-mix(in oklch, var(--foreground) 10%, transparent);\n}\n.glasshome-panel-fact-icon {\n flex-shrink: 0;\n font-size: 18px;\n color: var(--muted-foreground);\n}\n\n/* Inset: the grid cell clips anything drawn outside the tile. */\n.glasshome-widget:focus-visible {\n outline: 2px solid var(--ring);\n outline-offset: -2px;\n}\n\n/* === Hold flood: the dock's hold fill (ui HOLD_MOTION), grown from the finger === */\n.glasshome-widget-hold-flood {\n position: absolute;\n translate: -50% -50%;\n border-radius: 9999px;\n background: color-mix(in oklch, var(--primary) 45%, transparent);\n pointer-events: none;\n scale: 0;\n opacity: 0;\n transition:\n scale var(--duration-state, 200ms) var(--ease-contract, ease-in),\n opacity var(--duration-state, 200ms) var(--ease-contract, ease-in);\n}\n.glasshome-widget-hold-flood[data-hold] {\n scale: 1;\n opacity: 1;\n transition-duration: var(--duration-hold, 250ms);\n transition-timing-function: linear;\n}\n.glasshome-widget-hold-flood[data-fired] {\n scale: 1;\n opacity: 0;\n}\n/* A row of ui buttons in a sheet (scenes, one-tap actions). */\n.glasshome-sheet-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n/* The sheet wears its tile: the tile's tone washed into the glass, its picture as a band behind\n the head that fades into the glass, so the tile reads as having grown open. */\n.glasshome-sheet-surface {\n --glass-wash: 20%;\n --glass-wash-2: 7%;\n --widget-icon-box: 48px;\n --widget-icon-glyph: 26px;\n}\n.glasshome-sheet-band {\n position: absolute;\n inset: 0 0 auto;\n height: 150px;\n overflow: hidden;\n pointer-events: none;\n mask-image: linear-gradient(180deg, #000 30%, transparent);\n}\n.glasshome-sheet-band > img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0.55;\n}\n.glasshome-sheet-surface > [data-slot$=\"-header\"],\n.glasshome-sheet-surface > [data-slot$=\"-body\"] {\n position: relative;\n}\n.glasshome-sheet-icon {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n", cr = !1, lr, ur = /* @__PURE__ */ new WeakSet();
712
- function dr() {
713
- return lr || (lr = new CSSStyleSheet(), lr.replaceSync(sr.replace(/:root\b/g, ":host").replace(/^\.dark\b/gm, ":host(.dark)"))), lr;
699
+ var ur = "/* Authoritative SDK CSS contract. Injected once on first Widget mount\n * via framework/theming/tokens.ts.\n *\n * All widget-internal visual scale is driven from CSS custom properties +\n * container queries on the `.glasshome-widget` shell (`container-type: size`).\n * No JS classifier, no size tier enum.\n */\n\n:root {\n --tone-success: oklch(0.7 0.18 145);\n --tone-warning: oklch(0.8 0.17 75);\n --tone-danger: oklch(0.64 0.22 27);\n --tone-info: oklch(0.66 0.2 245);\n --tone-neutral: oklch(0.65 0.02 250);\n --tone-accent: oklch(0.74 0.18 60);\n\n --widget-glow-default: 0.4;\n}\n\n.dark {\n --tone-success: oklch(0.74 0.18 145);\n --tone-warning: oklch(0.82 0.17 75);\n --tone-danger: oklch(0.68 0.22 27);\n --tone-info: oklch(0.7 0.2 245);\n --tone-neutral: oklch(0.69 0.02 250);\n --tone-accent: oklch(0.78 0.18 60);\n\n --widget-glow-default: 0.5;\n}\n\n@property --widget-color {\n syntax: \"<color>\";\n inherits: true;\n initial-value: oklch(0.65 0.02 250);\n}\n\n/* === Widget shell ===\n * One scale: --widget-unit is 1% of the shell's short side. Each size is a floor,\n * a line through the designed 2x2 and 4x4 sizes, and past 4x4 the share it has\n * at 4x4. A widget sizes its own text with these tokens and scales with every tile. */\n.glasshome-widget {\n --widget-color: var(--tone-neutral);\n --widget-glow-strength: var(--widget-glow-default);\n --widget-radius: var(--radius-xl, 12px);\n\n --widget-unit: 1cqmin;\n --widget-text-value: max(\n 22px,\n calc(8.5px + 13.4 * var(--widget-unit)),\n calc(16 * var(--widget-unit))\n );\n --widget-text-name: max(\n 14px,\n calc(8.9px + 4.37 * var(--widget-unit)),\n calc(7.07 * var(--widget-unit))\n );\n --widget-text-meta: max(\n 11px,\n calc(8px + 2.44 * var(--widget-unit)),\n calc(4.88 * var(--widget-unit))\n );\n --widget-text-sub: max(\n 12px,\n calc(10.1px + 1.22 * var(--widget-unit)),\n calc(4.3 * var(--widget-unit))\n );\n --widget-text-caption: max(11px, calc(3.6 * var(--widget-unit)));\n --widget-control-h: max(36px, calc(30px + 3.84 * var(--widget-unit)));\n --widget-grid-pad: max(\n 10px,\n calc(1.2px + 5.64 * var(--widget-unit)),\n calc(6 * var(--widget-unit))\n );\n --widget-grid-gap: max(6px, calc(2.5px + 2.23 * var(--widget-unit)));\n --widget-icon-box: max(\n 44px,\n calc(31.3px + 8.14 * var(--widget-unit)),\n calc(17.7 * var(--widget-unit))\n );\n --widget-icon-glyph: max(\n 24px,\n calc(16px + 5.12 * var(--widget-unit)),\n calc(10 * var(--widget-unit))\n );\n --widget-pad: clamp(8px, 3.5cqb, 22px);\n --widget-gap: clamp(6px, 2cqb, 14px);\n --widget-title-size: clamp(12px, 2cqi, 18px);\n --widget-subtitle: clamp(12px, 2.5cqi, 20px);\n --widget-status-size: clamp(14px, 5cqi, 36px);\n --widget-value-size: clamp(18px, 7cqi, 48px);\n --widget-badge-size: clamp(11px, 1.6cqi, 14px);\n}\n\n/* Shell material: ui's .glass, worn through the class Widget.tsx carries.\n * Unlayered and class-specific, so these beat the formula's :where() defaults\n * (wash-2 is re-declared there and cannot be set from a utility). The tone\n * stays the formula's transparent default until Widget.tsx sets one inline:\n * a widget without a tone is the plain card, never a neutral-grey wash. */\n.glasshome-widget {\n --widget-wash: 22%;\n --widget-wash-2: 11%;\n --glass-wash: var(--widget-wash);\n /* The material's wash style: fade keeps --widget-wash-2, flat runs it up to --widget-wash. */\n --glass-wash-2: calc(\n var(--widget-wash-2) + (var(--widget-wash) - var(--widget-wash-2)) *\n (3 - var(--_material-wash-split, 3)) / 2\n );\n --glass-wash-angle: var(--_material-wash-angle, 135deg);\n --glass-base: color-mix(in srgb, var(--card) var(--material-clarity, 60%), transparent);\n --glass-rim: 0.3;\n --glass-lift: 0.45;\n --glass-shade: 0.05;\n --glass-grain: var(--_material-grain, none);\n --glass-halo: 1;\n backdrop-filter: var(--widget-backdrop, none);\n -webkit-backdrop-filter: var(--widget-backdrop, none);\n}\n/* The shell's outer glow, beside it so the glow can lie over neighbouring widgets. */\n.glasshome-widget-halo {\n --glass-lift: 0.45;\n}\n/* The material's fill: an accent wash on a widget that passes no tone of its own. */\n.glasshome-widget:not([data-toned]),\n.glasshome-widget-halo:not([data-toned]) {\n --glass-tone: color-mix(\n in srgb,\n var(--material-accent, var(--primary)) calc(var(--_material-fill, 0) * 100%),\n transparent\n );\n --glass-wash: 100%;\n --glass-wash-2: 50%;\n}\n/* A fill widget keeps a neutral card; the fill carries the tone, so a full fill is the toned card. */\n.glasshome-widget:has(.glasshome-widget-slider-fill) {\n --glass-wash: 0%;\n --glass-wash-2: 0%;\n}\n.dark .glasshome-widget {\n --glass-shade: 0;\n}\n/* Ink: the shell's line goes above every widget layer (they stack to 30), or full-bleed media buries it. */\n@container not style(--material-ink-level: 0) {\n .glasshome-widget::after {\n z-index: 40;\n }\n}\n\n/* === Slot: content layout === */\n/* Default: column. Flip to row only on wide-and-short widgets (matches the\n * old contentLayout heuristic: aspect > 1 AND height < 150px). */\n.glasshome-widget-content {\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: var(--widget-pad);\n gap: var(--widget-gap);\n overflow: hidden;\n border-radius: var(--widget-radius);\n}\n@container widget (min-aspect-ratio: 1) and (max-height: 149px) {\n .glasshome-widget-content {\n flex-direction: row;\n align-items: center;\n justify-content: flex-start;\n }\n}\n\n/* === Compact 1×1 ===\n * Small in BOTH axes → stack the tile: icon on top, label + status centered\n * under it. Icon stays moderate (not a hero) so the text keeps room. Wide\n * tiles (2×1) fail the width test and keep the row layout above. Placed after\n * the row-flip so it wins. */\n@container widget (max-width: 189px) and (max-height: 189px) {\n .glasshome-widget-content {\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n gap: clamp(4px, 2.5cqmin, 8px);\n }\n .glasshome-widget-content > * {\n align-items: center;\n text-align: center;\n }\n .glasshome-widget-icon {\n --widget-icon-box: clamp(36px, 30cqmin, 56px);\n --widget-icon-glyph: clamp(20px, 17cqmin, 32px);\n }\n .glasshome-widget-title {\n font-size: clamp(11px, 6cqmin, 14px);\n max-width: 100%;\n }\n .glasshome-widget-status,\n .glasshome-widget-value {\n font-size: clamp(13px, 7cqmin, 17px);\n }\n .glasshome-widget-content [class*=\"ml-auto\"] {\n margin-left: 0 !important;\n }\n}\n.glasshome-widget-content [class*=\"ml-auto\"] {\n position: relative;\n z-index: 30;\n}\n\n/* === Slot: icon ===\n * ui's tinted icon pill (ICON_PILL_TINT): the disc is .glass, so the material shapes it. */\n.glasshome-widget-icon {\n width: var(--widget-icon-box);\n height: var(--widget-icon-box);\n border-radius: var(--radius-sm, 12px);\n --glass-tone: var(--widget-icon-color, var(--widget-color));\n --glass-rim: 0.4;\n --glass-wash: 18%;\n}\n.glasshome-widget-icon-glyph {\n font-size: var(--widget-icon-glyph);\n line-height: 1;\n}\n.glasshome-widget-icon-stack {\n --stack-step: calc(var(--widget-icon-box) * 0.12);\n position: absolute;\n /* The pill's border would otherwise shrink each plate and widen the first step. */\n inset: -1px;\n width: auto;\n height: auto;\n border-radius: var(--radius-sm, 12px);\n}\n.glasshome-widget-icon-stack-2 {\n translate: var(--stack-step) var(--stack-step);\n opacity: 0.45;\n z-index: -2;\n}\n.glasshome-widget-icon-stack-3 {\n translate: calc(2 * var(--stack-step)) calc(2 * var(--stack-step));\n opacity: 0.2;\n z-index: -3;\n}\n\n/* === Slot: text === */\n.glasshome-widget-title {\n font-size: var(--widget-title-size);\n line-height: 1.2;\n color: var(--color-muted-foreground, currentColor);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.glasshome-widget-subtitle {\n font-size: var(--widget-subtitle);\n color: var(--color-muted-foreground, currentColor);\n}\n.glasshome-widget-status {\n font-size: var(--widget-status-size);\n font-weight: 700;\n color: var(--color-foreground, currentColor);\n line-height: 1.1;\n}\n.glasshome-widget-value {\n font-size: var(--widget-value-size);\n font-weight: 700;\n color: var(--color-foreground, currentColor);\n line-height: 1.05;\n}\n.glasshome-widget-badge {\n font-size: var(--widget-badge-size);\n font-weight: 500;\n padding: 0.125rem 0.5rem;\n border-radius: 9999px;\n background: color-mix(in oklch, var(--color-foreground, currentColor) 20%, transparent);\n color: var(--color-foreground, currentColor);\n}\n\n.glasshome-widget-loading {\n background: color-mix(in oklch, var(--widget-color) 20%, transparent);\n}\n\n/* === Slider fill ===\n * Value flows in via --widget-fill-value (0-100). Vertical orientation auto-\n * detected via container query. */\n.glasshome-widget-slider-fill {\n --widget-fill-value: 0;\n background: linear-gradient(\n 135deg,\n color-mix(\n in srgb,\n var(--widget-color) calc(var(--widget-wash) * var(--material-tint, 1)),\n transparent\n ),\n color-mix(\n in srgb,\n var(--widget-color-to, var(--widget-color))\n calc(var(--widget-wash-2) * var(--material-tint, 1)),\n transparent\n )\n );\n /* Inset: the clip-path cuts any outer shadow. */\n box-shadow: inset 0 0 calc(var(--material-glow, 0px) * 1.2)\n oklch(from var(--widget-color) l c h / 0.55);\n clip-path: inset(0 calc((100 - var(--widget-fill-value)) * 1%) 0 0 round var(--widget-radius));\n}\n@container widget (max-aspect-ratio: 1) {\n .glasshome-widget-slider-fill {\n clip-path: inset(calc((100 - var(--widget-fill-value)) * 1%) 0 0 0 round var(--widget-radius));\n }\n}\n\n/* === Anatomy: Widget.Content with a Widget.Head lays its parts out as a tile === */\n.glasshome-widget-grid {\n position: relative;\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr) auto;\n gap: var(--widget-grid-gap);\n height: 100%;\n padding: var(--widget-grid-pad);\n overflow: hidden;\n isolation: isolate;\n color: var(--foreground);\n}\n\n/* In-flow content spans the tile (the max-content first column would collapse it); absolute parts keep the padding box. */\n.glasshome-widget-grid\n > :where(:not(.glasshome-widget-backdrop, .glasshome-widget-layer, .glasshome-widget-glyph)) {\n grid-column: 1 / -1;\n}\n.glasshome-widget-layer {\n position: absolute;\n inset: 0;\n z-index: -1;\n overflow: hidden;\n}\n.glasshome-widget-head {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n min-width: 0;\n}\n.glasshome-widget-head-text {\n min-height: var(--widget-icon-box);\n justify-content: center;\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n flex: 1;\n}\n.glasshome-widget-head-aside {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 6px;\n max-height: 26px;\n overflow: hidden;\n flex-shrink: 1;\n}\n.glasshome-widget-eyebrow {\n font-size: var(--widget-text-meta);\n font-weight: 500;\n line-height: 1.25;\n color: var(--muted-foreground);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.glasshome-widget-name {\n font-size: var(--widget-text-name);\n font-weight: 650;\n line-height: 1.2;\n letter-spacing: -0.01em;\n color: var(--foreground);\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n overflow-wrap: break-word;\n}\n\n.glasshome-widget-hero {\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n gap: var(--widget-grid-gap);\n min-height: 0;\n min-width: 0;\n}\n.glasshome-widget-reading {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n z-index: 1;\n}\n.glasshome-widget-reading-value {\n font-size: var(--widget-text-value);\n font-weight: 650;\n line-height: 1;\n letter-spacing: -0.03em;\n font-variant-numeric: tabular-nums;\n color: var(--foreground);\n white-space: nowrap;\n}\n/* Alternating names restart the rise on each change without rebuilding the text. */\n.glasshome-widget-reading-value[data-turn=\"a\"] {\n animation: tile-value-in-a var(--duration-morph) var(--ease-morph);\n}\n.glasshome-widget-reading-value[data-turn=\"b\"] {\n animation: tile-value-in-b var(--duration-morph) var(--ease-morph);\n}\n@keyframes tile-value-in-a {\n from {\n opacity: 0;\n transform: translateY(0.25em);\n }\n}\n@keyframes tile-value-in-b {\n from {\n opacity: 0;\n transform: translateY(0.25em);\n }\n}\n.glasshome-widget-unit {\n font-size: 0.5em;\n font-weight: 550;\n letter-spacing: 0;\n margin-left: 0.08em;\n color: var(--muted-foreground);\n}\n.glasshome-widget-sub {\n font-size: var(--widget-text-sub);\n font-weight: 500;\n color: var(--muted-foreground);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Placed on the tile, not the hero, so a control row never moves or shrinks it. */\n.glasshome-widget-art {\n position: absolute;\n right: var(--widget-grid-pad);\n bottom: var(--widget-grid-pad);\n height: min(\n calc(100% - 2 * var(--widget-grid-pad) - var(--widget-icon-box) - var(--widget-grid-gap)),\n 48cqi\n );\n display: flex;\n align-items: flex-end;\n justify-content: flex-end;\n pointer-events: none;\n}\n/* Beside art a long word (\"Unlocked\") shrinks to end where the art starts, at about 50cqi; short values keep full size. */\n@container widget (min-width: 180px) and (min-height: 130px) {\n .glasshome-widget-hero[data-art] .glasshome-widget-reading-value {\n font-size: max(18px, min(var(--widget-text-value), calc(50cqi / (var(--value-len, 1) * 0.56))));\n }\n}\n.glasshome-widget-backdrop > img {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n/* Art keeps its shape and clears a state word at its largest (15cqi, about 3.4em); each art sets --art-aspect. */\n.glasshome-widget-grid .glasshome-widget-art > * {\n height: min(\n 100%,\n calc((52cqi - 2 * var(--widget-grid-pad) - var(--widget-grid-gap)) / var(--art-aspect, 1))\n );\n flex-shrink: 0;\n}\n.glasshome-widget-grid .glasshome-widget-art > img {\n width: auto;\n height: auto;\n max-height: 100%;\n max-width: calc(52cqi - 2 * var(--widget-grid-pad) - var(--widget-grid-gap));\n}\n\n.glasshome-widget-controls {\n display: flex;\n gap: 8px;\n min-width: 0;\n}\n\n.glasshome-widget-glyph {\n display: none;\n position: absolute;\n right: -8%;\n bottom: -22%;\n font-size: min(130cqb, 80cqi);\n line-height: 1;\n color: var(--widget-color);\n opacity: 0.16;\n pointer-events: none;\n z-index: -1;\n}\n\n/* Controls sit on the bottom row beside the value, or under it on a narrow tile; the art lifts above them. */\n.glasshome-widget-head {\n grid-column: 1 / -1;\n}\n.glasshome-widget-hero {\n grid-row: 3;\n grid-column: 1 / -1;\n}\n.glasshome-widget-grid:has(> .glasshome-widget-controls) > .glasshome-widget-hero {\n grid-column: 1;\n}\n.glasshome-widget-controls {\n grid-row: 3;\n grid-column: 2;\n align-self: end;\n position: relative;\n z-index: 1;\n}\n.glasshome-widget-grid:has(> .glasshome-widget-hero[data-empty]) > .glasshome-widget-controls {\n grid-column: 1 / -1;\n}\n@container widget (max-width: 519px) {\n .glasshome-widget-grid:has(> .glasshome-widget-controls) {\n grid-template-rows: auto minmax(0, 1fr) auto auto;\n }\n .glasshome-widget-grid:has(> .glasshome-widget-controls) > .glasshome-widget-hero {\n grid-column: 1 / -1;\n }\n .glasshome-widget-controls {\n grid-row: 4;\n grid-column: 1 / -1;\n }\n .glasshome-widget-grid:has(> .glasshome-widget-controls) .glasshome-widget-art {\n bottom: calc(var(--widget-grid-pad) + var(--widget-control-h) + var(--widget-grid-gap));\n height: min(\n calc(\n 100% - 2 * var(--widget-grid-pad) - var(--widget-icon-box) - 2 * var(--widget-grid-gap) -\n var(--widget-control-h)\n ),\n 48cqi\n );\n }\n}\n@container widget (max-height: 229px) {\n .glasshome-widget-controls {\n display: none;\n }\n .glasshome-widget-grid:has(> .glasshome-widget-controls) {\n grid-template-rows: auto minmax(0, 1fr) auto;\n }\n .glasshome-widget-grid:has(> .glasshome-widget-controls) .glasshome-widget-art {\n bottom: var(--widget-grid-pad);\n height: min(\n calc(100% - 2 * var(--widget-grid-pad) - var(--widget-icon-box) - var(--widget-grid-gap)),\n 48cqi\n );\n }\n}\n@container widget (max-width: 179px) {\n .glasshome-widget-art {\n display: none;\n }\n}\n@container widget (max-height: 169px) {\n .glasshome-widget-head-aside {\n display: none;\n }\n}\n@container widget ((max-height: 129px) or (max-width: 139px)) {\n .glasshome-widget-head-text {\n min-height: 0;\n }\n .glasshome-widget-name {\n -webkit-line-clamp: 1;\n }\n .glasshome-widget-grid {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 2px;\n }\n .glasshome-widget-head-icon,\n .glasshome-widget-art,\n .glasshome-widget-eyebrow,\n .glasshome-widget-sub {\n display: none;\n }\n .glasshome-widget-glyph {\n display: block;\n }\n .glasshome-widget-reading-value {\n font-size: clamp(18px, min(34cqb, 20cqi), 30px);\n }\n .glasshome-widget-name {\n font-size: clamp(12px, min(18cqb, 11cqi), 15px);\n font-weight: 550;\n color: var(--muted-foreground);\n }\n}\n@container widget (max-height: 129px) and (min-width: 260px) {\n .glasshome-widget-grid {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: var(--widget-grid-gap);\n }\n .glasshome-widget-name {\n font-size: clamp(14px, 22cqb, 18px);\n font-weight: 650;\n color: var(--foreground);\n }\n .glasshome-widget-eyebrow {\n display: block;\n }\n}\n\n.glasshome-widget-backdrop {\n position: absolute;\n inset: 0;\n z-index: -2;\n overflow: hidden;\n}\n.glasshome-widget-backdrop > img.area-night {\n opacity: 0;\n transition: opacity 700ms ease;\n}\n.glasshome-widget-backdrop > img.area-night[data-visible] {\n opacity: 1;\n}\n.glasshome-widget-backdrop > .glasshome-widget-backdrop-light {\n position: absolute;\n inset: 0;\n background: radial-gradient(90% 80% at 25% 30%, oklch(0.8 0.14 70), transparent 70%);\n mix-blend-mode: soft-light;\n opacity: var(--backdrop-light, 0);\n transition: opacity 500ms ease;\n}\n.glasshome-widget-backdrop::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(\n to bottom,\n color-mix(in oklch, var(--card) 82%, transparent) 0%,\n color-mix(in oklch, var(--card) 40%, transparent) 22%,\n transparent 42%,\n transparent 62%,\n color-mix(in oklch, var(--card) 45%, transparent) 82%,\n color-mix(in oklch, var(--card) 80%, transparent) 100%\n );\n}\n\n@container widget (max-width: 239px) {\n .glasshome-widget-choice [data-optional] {\n display: none;\n }\n}\n@container widget (max-width: 259px) {\n .glasshome-widget-head-aside {\n display: none;\n }\n}\n@container widget (max-width: 139px) {\n .glasshome-widget-controls {\n display: none;\n }\n}\n\n.glasshome-widget-controls {\n justify-content: flex-start;\n align-items: center;\n}\n.glasshome-widget-control.glasshome-widget-control {\n width: var(--widget-control-h);\n height: var(--widget-control-h);\n}\n.glasshome-widget-choice .glasshome-widget-control.glasshome-widget-control {\n width: calc(var(--widget-control-h) - 8px);\n height: calc(var(--widget-control-h) - 8px);\n}\n@container widget (max-width: 179px) and (min-height: 130px) {\n .glasshome-widget-grid:not(:has(> .glasshome-widget-backdrop)) .glasshome-widget-head-text {\n min-height: 0;\n }\n .glasshome-widget-grid:not(:has(> .glasshome-widget-backdrop)) .glasshome-widget-head {\n flex-direction: column;\n gap: 6px;\n }\n}\n.glasshome-widget-unit[data-degree] {\n vertical-align: top;\n margin-left: 0.02em;\n color: var(--foreground);\n}\n.glasshome-widget-control-wide.glasshome-widget-control-wide {\n height: var(--widget-control-h);\n gap: 6px;\n padding: 0 14px;\n}\n@container widget (max-width: 179px) {\n .glasshome-widget-grid:has(> .glasshome-widget-backdrop) .glasshome-widget-head-icon {\n display: none;\n }\n}\n.glasshome-widget-grid:has(> .glasshome-widget-backdrop)\n :is(\n .glasshome-widget-reading-value,\n .glasshome-widget-sub,\n .glasshome-widget-name,\n .glasshome-widget-eyebrow\n ) {\n text-shadow: 0 1px 8px color-mix(in oklch, var(--card) 75%, transparent);\n}\n.glasshome-widget-grid:has(> .glasshome-widget-backdrop)\n :is(.glasshome-widget-sub, .glasshome-widget-eyebrow) {\n color: color-mix(in oklch, var(--foreground) 82%, transparent);\n}\n/* Control glyphs and words keep their share of a control as it grows past 4x4. */\n.glasshome-widget-grid\n :is(.glasshome-widget-control, .glasshome-widget-control-wide)\n :is(iconify-icon, svg) {\n font-size: calc(var(--widget-control-h) * 0.43);\n width: 1em;\n height: 1em;\n}\n:is(.glasshome-widget-controls, .glasshome-widget-control-wide) {\n font-size: max(13px, calc(var(--widget-control-h) * 0.3));\n}\n/* A big tile with no art of its own carries its icon large and faint, so the glass is not an empty box. */\n@container widget (min-width: 300px) and (min-height: 260px) {\n .glasshome-widget-grid:not(\n :has(> .glasshome-widget-backdrop),\n :has(> .glasshome-widget-hero[data-art], > .glasshome-widget-art, > .glasshome-widget-layer)\n )\n > .glasshome-widget-glyph {\n display: block;\n right: -3%;\n bottom: -12%;\n font-size: min(78cqb, 52cqi);\n opacity: 0.1;\n }\n}\n/* A one-shot action confirms on its control and on the glyph, the one thing a compact tile shows. */\n.glasshome-widget-grid > .glasshome-widget-glyph {\n transition: opacity var(--duration-state) var(--ease-morph);\n}\n.glasshome-widget[data-confirmed] .glasshome-widget-glyph {\n opacity: 0.5;\n}\n.glasshome-widget-grid\n [data-confirmed]:is(.glasshome-widget-control, .glasshome-widget-control-wide) {\n --glass-base: color-mix(in srgb, var(--widget-color) 35%, transparent);\n transition: background-color var(--duration-state) var(--ease-morph);\n}\n\n/* === Sheet: what a held tile opens (framework/panel) ===\n * Rendered in a popover or dialog outside the widget's shadow root, so every rule\n * the sheet needs lives here, never in a widget's own utilities. */\n.glasshome-sheet {\n display: flex;\n flex-direction: column;\n gap: 18px;\n color: var(--foreground);\n}\n.glasshome-sheet [data-slot=\"swatch-picker\"] {\n max-width: 360px;\n}\n.glasshome-panel-section {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n.glasshome-panel-label {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--muted-foreground);\n}\n.glasshome-panel-rows {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 8px;\n}\n.glasshome-panel-row-wrap {\n position: relative;\n min-width: 0;\n}\n.glasshome-panel-row {\n --widget-wash: 22%;\n --widget-wash-2: 11%;\n --widget-radius: var(--radius-lg, 16px);\n --widget-icon-box: 34px;\n --widget-icon-glyph: 19px;\n position: relative;\n width: 100%;\n height: 56px;\n justify-content: flex-start;\n gap: 10px;\n padding: 0 12px 0 10px;\n overflow: hidden;\n text-align: left;\n touch-action: pan-y;\n}\n.glasshome-panel-row-static {\n cursor: default;\n scale: none;\n}\n.glasshome-panel-row-fill {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n.glasshome-panel-row-icon {\n position: relative;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n}\n.glasshome-panel-row-icon-off {\n color: var(--muted-foreground);\n}\n.glasshome-panel-row-text {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.glasshome-panel-row-name,\n.glasshome-panel-row-state,\n.glasshome-panel-fact-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n/* A reading may take a second line rather than lose its end (\"3 Moderate\"). */\n.glasshome-panel-fact-value {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n.glasshome-panel-row-name,\n.glasshome-panel-fact-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--foreground);\n}\n.glasshome-panel-row-state,\n.glasshome-panel-fact-label {\n font-size: 12px;\n font-weight: 400;\n color: var(--muted-foreground);\n}\n.glasshome-panel-row-trailing {\n position: absolute;\n top: 50%;\n right: 10px;\n translate: 0 -50%;\n}\n.glasshome-panel-facts {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));\n row-gap: 10px;\n padding: 10px 4px 10px 0;\n overflow: hidden;\n border-radius: var(--radius-lg, 16px);\n --glass-base: color-mix(in srgb, var(--card) var(--material-clarity, 60%), transparent);\n backdrop-filter: blur(calc(var(--material-blur, 24px) * 0.6)) saturate(1.6);\n -webkit-backdrop-filter: blur(calc(var(--material-blur, 24px) * 0.6)) saturate(1.6);\n}\n/* Without blur a see-through strip is just see-through: it takes the card fill. */\n.reduce-blur .glasshome-panel-facts {\n --glass-base: var(--card);\n}\n.glasshome-panel-fact {\n display: flex;\n min-width: 0;\n align-items: center;\n gap: 8px;\n padding: 0 12px;\n box-shadow: -1px 0 0 color-mix(in oklch, var(--foreground) 10%, transparent);\n}\n.glasshome-panel-fact-icon {\n flex-shrink: 0;\n font-size: 18px;\n color: var(--muted-foreground);\n}\n\n/* Inset: the grid cell clips anything drawn outside the tile. */\n.glasshome-widget:focus-visible {\n outline: 2px solid var(--ring);\n outline-offset: -2px;\n}\n\n/* === Hold flood: the dock's hold fill (ui HOLD_MOTION), grown from the finger === */\n.glasshome-widget-hold-flood {\n position: absolute;\n translate: -50% -50%;\n border-radius: 9999px;\n background: color-mix(in oklch, var(--primary) 45%, transparent);\n pointer-events: none;\n scale: 0;\n opacity: 0;\n transition:\n scale var(--duration-state, 200ms) var(--ease-contract, ease-in),\n opacity var(--duration-state, 200ms) var(--ease-contract, ease-in);\n}\n.glasshome-widget-hold-flood[data-hold] {\n scale: 1;\n opacity: 1;\n transition-duration: var(--duration-hold, 250ms);\n transition-timing-function: linear;\n}\n.glasshome-widget-hold-flood[data-fired] {\n scale: 1;\n opacity: 0;\n}\n/* A row of ui buttons in a sheet (scenes, one-tap actions). */\n.glasshome-sheet-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n/* The sheet wears its tile: the tile's tone washed into the glass, its picture as a band behind\n the head that fades into the glass, so the tile reads as having grown open. */\n.glasshome-sheet-surface {\n --glass-wash: 20%;\n --glass-wash-2: 7%;\n --widget-icon-box: 48px;\n --widget-icon-glyph: 26px;\n}\n.glasshome-sheet-band {\n position: absolute;\n inset: 0 0 auto;\n height: 150px;\n overflow: hidden;\n pointer-events: none;\n mask-image: linear-gradient(180deg, #000 30%, transparent);\n}\n.glasshome-sheet-band > img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0.55;\n}\n.glasshome-sheet-surface > [data-slot$=\"-header\"],\n.glasshome-sheet-surface > [data-slot$=\"-body\"] {\n position: relative;\n}\n.glasshome-sheet-icon {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n", dr = !1, fr, pr = /* @__PURE__ */ new WeakSet();
700
+ function mr() {
701
+ return fr || (fr = new CSSStyleSheet(), fr.replaceSync(ur.replace(/:root\b/g, ":host").replace(/^\.dark\b/gm, ":host(.dark)"))), fr;
714
702
  }
715
- function fr(e) {
703
+ function hr(e) {
716
704
  if (typeof ShadowRoot < "u" && e instanceof ShadowRoot) {
717
- if (ur.has(e)) return;
718
- let t = dr();
719
- e.adoptedStyleSheets.includes(t) || (e.adoptedStyleSheets = [...e.adoptedStyleSheets, t]), ur.add(e);
705
+ if (pr.has(e)) return;
706
+ let t = mr();
707
+ e.adoptedStyleSheets.includes(t) || (e.adoptedStyleSheets = [...e.adoptedStyleSheets, t]), pr.add(e);
720
708
  return;
721
709
  }
722
- if (cr) return;
710
+ if (dr) return;
723
711
  let t = e ?? (typeof document > "u" ? void 0 : document);
724
712
  if (!t) return;
725
713
  if (t.head.querySelector?.("style[data-glasshome-tokens]")) {
726
- cr = !0;
714
+ dr = !0;
727
715
  return;
728
716
  }
729
717
  let n = t.createElement("style");
730
- n.setAttribute("data-glasshome-tokens", ""), n.textContent = sr, t.head.appendChild(n), cr = !0;
718
+ n.setAttribute("data-glasshome-tokens", ""), n.textContent = ur, t.head.appendChild(n), dr = !0;
731
719
  }
732
720
  //#endregion
733
721
  //#region src/framework/variants/built-in-variants.ts
734
- var pr = {
722
+ var gr = {
735
723
  "classic-glass": { cssVars: {
736
724
  "--widget-padding": "1.5rem",
737
725
  "--widget-backdrop": "blur(var(--glass-blur, var(--material-blur, 24px))) saturate(calc(1.8 * var(--_material-vibrancy, 1))) brightness(calc(1 + (var(--_material-vibrancy, 1) - 1) * 0.2))"
@@ -751,21 +739,21 @@ var pr = {
751
739
  "--widget-backdrop": "blur(16px) saturate(1.8)"
752
740
  } }
753
741
  };
754
- function mr(e) {
755
- return Object.hasOwn(pr, e) ? pr[e] : void 0;
742
+ function _r(e) {
743
+ return Object.hasOwn(gr, e) ? gr[e] : void 0;
756
744
  }
757
745
  //#endregion
758
746
  //#region src/framework/backgrounds/WidgetSliderFill.tsx
759
- var hr = /*#__PURE__*/ B("<div>"), gr = e(() => void 0, "sliderFill.color");
760
- function _r(e) {
761
- return e.color !== void 0 && gr(), (() => {
762
- var t = hr();
763
- return P((n) => {
747
+ var vr = /*#__PURE__*/ V("<div>"), yr = e(() => void 0, "sliderFill.color");
748
+ function br(e) {
749
+ return e.color !== void 0 && yr(), (() => {
750
+ var t = vr();
751
+ return F((n) => {
764
752
  var r = J("glasshome-widget-slider-fill pointer-events-none absolute inset-0", e.isDragging ? "duration-0" : "transition-all duration-300 ease-out", e.class), i = {
765
753
  "--widget-fill-value": e.value,
766
- "z-index": on.BACKGROUND
754
+ "z-index": ln.BACKGROUND
767
755
  };
768
- return r !== n.e && M(t, n.e = r), n.t = z(t, i, n.t), n;
756
+ return r !== n.e && N(t, n.e = r), n.t = B(t, i, n.t), n;
769
757
  }, {
770
758
  e: void 0,
771
759
  t: void 0
@@ -774,16 +762,16 @@ function _r(e) {
774
762
  }
775
763
  //#endregion
776
764
  //#region src/framework/components/WidgetContent.tsx
777
- var vr = /*#__PURE__*/ B("<div>"), yr = /\bglasshome-widget-(head|hero|controls|backdrop|glyph|layer)\b/;
778
- function br(e) {
779
- let t = dn(j(W));
765
+ var xr = /*#__PURE__*/ V("<div>"), Sr = /\bglasshome-widget-(head|hero|controls|backdrop|glyph|layer)\b/;
766
+ function Cr(e) {
767
+ let t = mn(j(W));
780
768
  D(() => t?.setAccent(e.accent)), A(() => t?.setAccent(void 0));
781
- let n = fe(() => e.children), r = O(() => n.toArray().some((e) => e instanceof Element && yr.test(e.className)));
769
+ let n = fe(() => e.children), r = O(() => n.toArray().some((e) => e instanceof Element && Sr.test(e.className)));
782
770
  return (() => {
783
- var t = vr();
784
- return F(t, n), P((n) => {
771
+ var t = xr();
772
+ return I(t, n), F((n) => {
785
773
  var i = J(r() ? "glasshome-widget-grid" : "glasshome-widget-content", e.class), a = e.accent ? { "--widget-color": e.accent } : void 0;
786
- return i !== n.e && M(t, n.e = i), n.t = z(t, a, n.t), n;
774
+ return i !== n.e && N(t, n.e = i), n.t = B(t, a, n.t), n;
787
775
  }, {
788
776
  e: void 0,
789
777
  t: void 0
@@ -792,16 +780,16 @@ function br(e) {
792
780
  }
793
781
  //#endregion
794
782
  //#region src/framework/components/WidgetStatus.tsx
795
- var xr = /*#__PURE__*/ B("<p>");
796
- function Sr(e) {
783
+ var wr = /*#__PURE__*/ V("<p>");
784
+ function Tr(e) {
797
785
  return (() => {
798
- var t = xr();
799
- return F(t, (() => {
800
- var t = I(() => !!e.isUnavailable);
786
+ var t = wr();
787
+ return I(t, (() => {
788
+ var t = L(() => !!e.isUnavailable);
801
789
  return () => t() ? "Unavailable" : e.children;
802
- })()), P((n) => {
803
- var r = J("glasshome-widget-status", "relative", e.dimmed && "opacity-40", e.class), i = on.ACTIONS;
804
- return r !== n.e && M(t, n.e = r), i !== n.t && R(t, "z-index", n.t = i), n;
790
+ })()), F((n) => {
791
+ var r = J("glasshome-widget-status", "relative", e.dimmed && "opacity-40", e.class), i = ln.ACTIONS;
792
+ return r !== n.e && N(t, n.e = r), i !== n.t && z(t, "z-index", n.t = i), n;
805
793
  }, {
806
794
  e: void 0,
807
795
  t: void 0
@@ -810,21 +798,21 @@ function Sr(e) {
810
798
  }
811
799
  //#endregion
812
800
  //#region src/framework/components/WidgetTitle.tsx
813
- var Cr = /*#__PURE__*/ B("<span class=\"glasshome-widget-badge shrink-0\">"), wr = /*#__PURE__*/ B("<div><h3 class=glasshome-widget-title>");
814
- function Tr(e) {
801
+ var Er = /*#__PURE__*/ V("<span class=\"glasshome-widget-badge shrink-0\">"), Dr = /*#__PURE__*/ V("<div><h3 class=glasshome-widget-title>");
802
+ function Or(e) {
815
803
  return (() => {
816
- var t = wr(), n = t.firstChild;
817
- return F(n, () => e.children), F(t, N(E, {
804
+ var t = Dr(), n = t.firstChild;
805
+ return I(n, () => e.children), I(t, P(E, {
818
806
  get when() {
819
- return I(() => e.badge !== void 0)() && e.badge > 0;
807
+ return L(() => e.badge !== void 0)() && e.badge > 0;
820
808
  },
821
809
  get children() {
822
- var t = Cr();
823
- return F(t, () => e.badge), t;
810
+ var t = Er();
811
+ return I(t, () => e.badge), t;
824
812
  }
825
- }), null), P((n) => {
826
- var r = J("relative flex items-center gap-2", e.class), i = on.ACTIONS;
827
- return r !== n.e && M(t, n.e = r), i !== n.t && R(t, "z-index", n.t = i), n;
813
+ }), null), F((n) => {
814
+ var r = J("relative flex items-center gap-2", e.class), i = ln.ACTIONS;
815
+ return r !== n.e && N(t, n.e = r), i !== n.t && z(t, "z-index", n.t = i), n;
828
816
  }, {
829
817
  e: void 0,
830
818
  t: void 0
@@ -832,41 +820,8 @@ function Tr(e) {
832
820
  })();
833
821
  }
834
822
  //#endregion
835
- //#region src/framework/utils/clipboard.ts
836
- async function Er(e) {
837
- if (navigator.clipboard?.writeText) try {
838
- return await navigator.clipboard.writeText(e), !0;
839
- } catch {}
840
- return Dr(e);
841
- }
842
- function Dr(e) {
843
- let t = Or(), n = document.createElement("textarea");
844
- n.value = e, n.setAttribute("readonly", ""), n.style.position = "fixed", n.style.top = "0", n.style.left = "0", n.style.opacity = "0", (t?.parentElement ?? document.body).append(n);
845
- try {
846
- return n.focus(), n.select(), n.setSelectionRange(0, e.length), n.getRootNode().activeElement === n && document.execCommand("copy");
847
- } catch {
848
- return !1;
849
- } finally {
850
- n.remove(), t?.focus();
851
- }
852
- }
853
- function Or() {
854
- let e = document.activeElement;
855
- for (; e?.shadowRoot?.activeElement;) e = e.shadowRoot.activeElement;
856
- return e instanceof HTMLElement ? e : null;
857
- }
858
- function kr(e = 2e3) {
859
- let [t, n] = k("idle"), r;
860
- return A(() => clearTimeout(r)), {
861
- state: t,
862
- copy: async (t) => {
863
- n(await Er(t) ? "copied" : "failed"), clearTimeout(r), r = setTimeout(() => n("idle"), e);
864
- }
865
- };
866
- }
867
- //#endregion
868
823
  //#region src/framework/utils/entity-aggregation.ts
869
- function Ar(e, t = !1) {
824
+ function kr(e, t = !1) {
870
825
  let n = e[0];
871
826
  if (!n) return {
872
827
  isGroup: !1,
@@ -890,7 +845,7 @@ function Ar(e, t = !1) {
890
845
  isUnavailable: e.state === "unavailable",
891
846
  brightness: r,
892
847
  brightnessPercent: i,
893
- color: Nr(e),
848
+ color: Mr(e),
894
849
  onCount: +!!t,
895
850
  totalCount: 1,
896
851
  description: t ? "On" : "Off"
@@ -902,7 +857,7 @@ function Ar(e, t = !1) {
902
857
  if (i++, t.attributes?.brightness !== void 0 && (c += t.attributes.brightness, l++), t.attributes?.rgb_color) u.push(t.attributes.rgb_color);
903
858
  else if (t.attributes?.hs_color) {
904
859
  let [e, n] = t.attributes.hs_color;
905
- u.push(Mr(e, n));
860
+ u.push(jr(e, n));
906
861
  }
907
862
  break;
908
863
  case "off":
@@ -919,7 +874,7 @@ function Ar(e, t = !1) {
919
874
  if (u.length > 0) {
920
875
  let e = Math.round(u.reduce((e, t) => e + t[0], 0) / u.length), t = Math.round(u.reduce((e, t) => e + t[1], 0) / u.length), n = Math.round(u.reduce((e, t) => e + t[2], 0) / u.length), r = y / 255;
921
876
  x = `rgb(${Math.round(e * r)}, ${Math.round(t * r)}, ${Math.round(n * r)})`;
922
- } else x = Nr(n);
877
+ } else x = Mr(n);
923
878
  let S;
924
879
  return S = h ? "All on" : g ? "All off" : i > 0 ? `${i} of ${d} on` : "Off", {
925
880
  isGroup: r,
@@ -934,7 +889,7 @@ function Ar(e, t = !1) {
934
889
  description: S
935
890
  };
936
891
  }
937
- function jr(e, t = "mean", n = !0) {
892
+ function Ar(e, t = "mean", n = !0) {
938
893
  let r = e[0];
939
894
  if (!r) return {
940
895
  isGroup: !1,
@@ -1031,7 +986,7 @@ function jr(e, t = "mean", n = !0) {
1031
986
  memberValues: o
1032
987
  };
1033
988
  }
1034
- function Mr(e, t) {
989
+ function jr(e, t) {
1035
990
  let n = t / 100, r = n * (1 - Math.abs(e / 60 % 2 - 1)), i = 1 - n, a = 0, o = 0, s = 0;
1036
991
  return e < 60 ? [a, o] = [n, r] : e < 120 ? [a, o] = [r, n] : e < 180 ? [o, s] = [n, r] : e < 240 ? [o, s] = [r, n] : e < 300 ? [a, s] = [r, n] : [a, s] = [n, r], [
1037
992
  (a + i) * 255,
@@ -1039,7 +994,7 @@ function Mr(e, t) {
1039
994
  (s + i) * 255
1040
995
  ];
1041
996
  }
1042
- function Nr(e) {
997
+ function Mr(e) {
1043
998
  if (e.state !== "on") return "rgb(100, 100, 100)";
1044
999
  let t = (e.attributes?.brightness ?? 255) / 255;
1045
1000
  if (e.attributes?.rgb_color) {
@@ -1047,7 +1002,7 @@ function Nr(e) {
1047
1002
  return `rgb(${Math.round(n * t)}, ${Math.round(r * t)}, ${Math.round(i * t)})`;
1048
1003
  }
1049
1004
  if (e.attributes?.hs_color) {
1050
- let [n, r] = e.attributes.hs_color, [i, a, o] = Mr(n, r);
1005
+ let [n, r] = e.attributes.hs_color, [i, a, o] = jr(n, r);
1051
1006
  return `rgb(${Math.round(i * t)}, ${Math.round(a * t)}, ${Math.round(o * t)})`;
1052
1007
  }
1053
1008
  if (e.attributes?.color_temp) {
@@ -1058,7 +1013,7 @@ function Nr(e) {
1058
1013
  }
1059
1014
  //#endregion
1060
1015
  //#region src/framework/utils/entity-state.ts
1061
- function Pr(e) {
1016
+ function Nr(e) {
1062
1017
  if (!e) return !1;
1063
1018
  if ([
1064
1019
  "on",
@@ -1074,15 +1029,15 @@ function Pr(e) {
1074
1029
  }
1075
1030
  return !1;
1076
1031
  }
1077
- function Fr(e, t, n) {
1032
+ function Pr(e, t, n) {
1078
1033
  return e?.attributes ? e.attributes[t] ?? n : n;
1079
1034
  }
1080
- function Ir(e) {
1081
- return e.filter(Pr).length;
1035
+ function Fr(e) {
1036
+ return e.filter(Nr).length;
1082
1037
  }
1083
1038
  //#endregion
1084
1039
  //#region src/framework/utils/format-value.ts
1085
- function Lr(e, t, n) {
1040
+ function Ir(e, t, n) {
1086
1041
  let { decimals: r, scale: i = !0 } = n || {};
1087
1042
  if (typeof e == "string") return t ? `${e}${t}` : e;
1088
1043
  if (e == null || Number.isNaN(e)) return t ? `--${t}` : "--";
@@ -1093,38 +1048,38 @@ function Lr(e, t, n) {
1093
1048
  }
1094
1049
  //#endregion
1095
1050
  //#region src/framework/utils/interpret-value.ts
1096
- function Rr(e, t) {
1051
+ function Lr(e, t) {
1097
1052
  return e == null || isNaN(e) ? null : t === "°C" ? e < 10 ? "Cold" : e < 18 ? "Cool" : e < 24 ? "Comfortable" : e < 28 ? "Warm" : "Hot" : t === "°F" ? e < 50 ? "Cold" : e < 64 ? "Cool" : e < 75 ? "Comfortable" : e < 82 ? "Warm" : "Hot" : t === "%" ? e < 20 ? "Very Low" : e < 40 ? "Low" : e < 60 ? "Medium" : e < 80 ? "High" : "Very High" : t === "ppm" ? e < 400 ? "Excellent" : e < 600 ? "Good" : e < 1e3 ? "Acceptable" : e < 1500 ? "Mediocre" : "Poor" : t === "lx" ? e < 50 ? "Dark" : e < 200 ? "Dim" : e < 500 ? "Moderate" : e < 1e3 ? "Bright" : "Very Bright" : t === "AQI" ? e <= 50 ? "Good" : e <= 100 ? "Moderate" : e <= 150 ? "Unhealthy for Sensitive" : e <= 200 ? "Unhealthy" : e <= 300 ? "Very Unhealthy" : "Hazardous" : t === "dB" ? e < 30 ? "Very Quiet" : e < 50 ? "Quiet" : e < 70 ? "Moderate" : e < 85 ? "Loud" : "Very Loud" : null;
1098
1053
  }
1099
1054
  //#endregion
1100
1055
  //#region src/framework/components/WidgetValue.tsx
1101
- var zr = /*#__PURE__*/ B("<div class=glasshome-widget-subtitle>"), Br = /*#__PURE__*/ B("<div><div class=glasshome-widget-value>");
1102
- function Vr(e) {
1056
+ var Rr = /*#__PURE__*/ V("<div class=glasshome-widget-subtitle>"), zr = /*#__PURE__*/ V("<div><div class=glasshome-widget-value>");
1057
+ function Br(e) {
1103
1058
  return (() => {
1104
- var t = Br(), n = t.firstChild;
1105
- return F(n, () => Lr(e.value, e.unit)), F(t, N(E, {
1059
+ var t = zr(), n = t.firstChild;
1060
+ return I(n, () => Ir(e.value, e.unit)), I(t, P(E, {
1106
1061
  get when() {
1107
- return I(() => !!e.interpret)() && typeof e.value == "number";
1062
+ return L(() => !!e.interpret)() && typeof e.value == "number";
1108
1063
  },
1109
1064
  get children() {
1110
- var t = zr();
1111
- return F(t, () => Rr(e.value, e.unit)), t;
1065
+ var t = Rr();
1066
+ return I(t, () => Lr(e.value, e.unit)), t;
1112
1067
  }
1113
- }), null), P(() => M(t, J("flex flex-col", e.class))), t;
1068
+ }), null), F(() => N(t, J("flex flex-col", e.class))), t;
1114
1069
  })();
1115
1070
  }
1116
1071
  //#endregion
1117
1072
  //#region src/framework/core/Widget.tsx
1118
- var Hr = /*#__PURE__*/ B("<span class=glasshome-widget-hold-flood aria-hidden=true>"), Ur = /*#__PURE__*/ B("<div class=\"glasshome-widget-frame relative h-full w-full\"><div><div class=\"relative h-full w-full\"></div></div><div class=\"glasshome-widget-halo glass-halo rounded-xl\"aria-hidden=true>"), Wr = /*#__PURE__*/ B("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), Gr = /*#__PURE__*/ B("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), Kr = /*#__PURE__*/ B("<div class=\"text-muted-foreground flex items-center justify-center\">"), qr = /*#__PURE__*/ B("<h3 class=\"text-foreground text-sm font-semibold\">"), Jr = /*#__PURE__*/ B("<p class=\"text-muted-foreground text-xs\">"), Yr = 2e3;
1119
- function Xr(t) {
1120
- let n = j(W), r = kn(() => ({ hold: { action: () => (G.get(n ?? {}) ?? G.get(f))?.("edit") } }));
1073
+ var Vr = /*#__PURE__*/ V("<span class=glasshome-widget-hold-flood aria-hidden=true>"), Hr = /*#__PURE__*/ V("<div class=\"glasshome-widget-frame relative h-full w-full\"><div><div class=\"relative h-full w-full\"></div></div><div class=\"glasshome-widget-halo glass-halo rounded-xl\"aria-hidden=true>"), Ur = /*#__PURE__*/ V("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), Wr = /*#__PURE__*/ V("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), Gr = /*#__PURE__*/ V("<div class=\"text-muted-foreground flex items-center justify-center\">"), Kr = /*#__PURE__*/ V("<h3 class=\"text-foreground text-sm font-semibold\">"), qr = /*#__PURE__*/ V("<p class=\"text-muted-foreground text-xs\">"), Jr = 2e3;
1074
+ function Yr(t) {
1075
+ let n = j(W), r = Mn(() => ({ hold: { action: () => (G.get(n ?? {}) ?? G.get(f))?.("edit") } }));
1121
1076
  A(r.dispose);
1122
- let i = dn(n), a = !!n && !(ln in n), o = kn(() => ({ hold: i?.hasSheet() ? { action: () => (G.get(n ?? {}) ?? G.get(f))?.() } : void 0 }));
1077
+ let i = mn(n), a = !!n && !(fn in n), o = Mn(() => ({ hold: i?.hasSheet() ? { action: () => (G.get(n ?? {}) ?? G.get(f))?.() } : void 0 }));
1123
1078
  A(o.dispose);
1124
1079
  let s = () => t.emptyState && n ? r : t.gestures ?? (a ? o : void 0);
1125
1080
  a && (D(() => n?.onHoldable?.(!t.emptyState && !!s()?.holds?.())), A(() => n?.onHoldable?.(!1))), D(() => {
1126
1081
  if (!a || !i?.nothingMore()) return;
1127
- let e = setTimeout(() => i.setNothingMore(!1), Yr);
1082
+ let e = setTimeout(() => i.setNothingMore(!1), Jr);
1128
1083
  A(() => clearTimeout(e));
1129
1084
  }), D(() => i?.setTone(t.color ?? (t.tone ? `var(--tone-${t.tone})` : void 0)));
1130
1085
  let [c, l] = k(), [u, d] = k({
@@ -1148,16 +1103,16 @@ function Xr(t) {
1148
1103
  t.observe(e), A(() => t.disconnect());
1149
1104
  }), he(() => {
1150
1105
  let e = c()?.getRootNode();
1151
- fr(typeof ShadowRoot < "u" && e instanceof ShadowRoot || typeof Document < "u" && e instanceof Document ? e : void 0);
1106
+ hr(typeof ShadowRoot < "u" && e instanceof ShadowRoot || typeof Document < "u" && e instanceof Document ? e : void 0);
1152
1107
  });
1153
1108
  let f = {
1154
1109
  ...n,
1155
1110
  updateConfig: n?.updateConfig ?? (() => {}),
1156
1111
  dimensions: e(() => u(), "ctx.dimensions")
1157
1112
  };
1158
- n && Object.defineProperty(f, ln, { value: n });
1113
+ n && Object.defineProperty(f, fn, { value: n });
1159
1114
  let p = O(() => {
1160
- if (t.variant) return typeof t.variant == "string" ? mr(t.variant) : t.variant.styles;
1115
+ if (t.variant) return typeof t.variant == "string" ? _r(t.variant) : t.variant.styles;
1161
1116
  }), m = e(() => t.gradient, "widget.gradient"), h = () => !!t.tone && t.tone !== "neutral" || !!t.color, g = O(() => ({
1162
1117
  ...p()?.cssVars || {},
1163
1118
  ...t.tone ? { "--widget-color": `var(--tone-${t.tone})` } : {},
@@ -1197,41 +1152,41 @@ function Xr(t) {
1197
1152
  top: `${w.y}px`,
1198
1153
  width: `${w.r * 2}px`,
1199
1154
  height: `${w.r * 2}px`,
1200
- "z-index": on.BACKGROUND
1155
+ "z-index": ln.BACKGROUND
1201
1156
  });
1202
- return N(W.Provider, {
1157
+ return P(W.Provider, {
1203
1158
  value: f,
1204
1159
  get children() {
1205
- return N(Yn.Provider, {
1160
+ return P(Qn.Provider, {
1206
1161
  value: () => t.confirmed === !0,
1207
1162
  get children() {
1208
- return N(An.Provider, {
1163
+ return P(Nn.Provider, {
1209
1164
  value: u,
1210
1165
  get children() {
1211
1166
  return [(() => {
1212
- var e = Ur(), n = e.firstChild, i = n.firstChild, a = n.nextSibling;
1167
+ var e = Hr(), n = e.firstChild, i = n.firstChild, a = n.nextSibling;
1213
1168
  return n.$$keydown = (e) => {
1214
1169
  v() && s()?.onKeyDown?.(e);
1215
- }, _e(n, "pointercancel", ee), _e(n, "pointerup", S), _e(n, "pointermove", x), _e(n, "pointerdown", b), _e(n, "pointerenter", y), V((e) => {
1170
+ }, M(n, "pointercancel", ee), M(n, "pointerup", S), M(n, "pointermove", x), M(n, "pointerdown", b), M(n, "pointerenter", y), H((e) => {
1216
1171
  l(e), t.gestures?.bindElement(e), r.bindElement(e);
1217
- }, n), F(n, N(E, {
1172
+ }, n), I(n, P(E, {
1218
1173
  get when() {
1219
1174
  return s()?.hold;
1220
1175
  },
1221
1176
  get children() {
1222
- var e = Hr();
1223
- return P((t) => {
1177
+ var e = Vr();
1178
+ return F((t) => {
1224
1179
  var n = C() && !C()?.fired ? "" : void 0, r = C()?.fired ? "" : void 0, i = te(C());
1225
- return n !== t.e && L(e, "data-hold", t.e = n), r !== t.t && L(e, "data-fired", t.t = r), t.a = z(e, i, t.a), t;
1180
+ return n !== t.e && R(e, "data-hold", t.e = n), r !== t.t && R(e, "data-fired", t.t = r), t.a = B(e, i, t.a), t;
1226
1181
  }, {
1227
1182
  e: void 0,
1228
1183
  t: void 0,
1229
1184
  a: void 0
1230
1185
  }), e;
1231
1186
  }
1232
- }), i), F(i, (() => {
1233
- var e = I(() => !!t.emptyState);
1234
- return () => e() ? N(Zr, {
1187
+ }), i), I(i, (() => {
1188
+ var e = L(() => !!t.emptyState);
1189
+ return () => e() ? P(Xr, {
1235
1190
  get icon() {
1236
1191
  return t.emptyState.icon;
1237
1192
  },
@@ -1242,15 +1197,15 @@ function Xr(t) {
1242
1197
  return t.emptyState.message;
1243
1198
  }
1244
1199
  }) : t.children;
1245
- })()), F(n, (() => {
1246
- var e = I(() => !!t.loading);
1200
+ })()), I(n, (() => {
1201
+ var e = L(() => !!t.loading);
1247
1202
  return () => e() && (() => {
1248
- var e = Wr();
1249
- return P((t) => R(e, "z-index", on.OVERLAY)), e;
1203
+ var e = Ur();
1204
+ return F((t) => z(e, "z-index", ln.OVERLAY)), e;
1250
1205
  })();
1251
- })(), null), P((e) => {
1252
- var r = J("glasshome-widget glass", "relative h-full w-full overflow-hidden rounded-xl select-none", p()?.class, t.class), o = _(), s = h() ? "" : void 0, c = t.confirmed || void 0, l = v() ? 0 : void 0, u = on.CONTENT, d = g(), f = h() ? "" : void 0;
1253
- return r !== e.e && M(n, e.e = r), e.t = z(n, o, e.t), s !== e.a && L(n, "data-toned", e.a = s), c !== e.o && L(n, "data-confirmed", e.o = c), l !== e.i && L(n, "tabindex", e.i = l), u !== e.n && R(i, "z-index", e.n = u), e.s = z(a, d, e.s), f !== e.h && L(a, "data-toned", e.h = f), e;
1206
+ })(), null), F((e) => {
1207
+ var r = J("glasshome-widget glass", "relative h-full w-full overflow-hidden rounded-xl select-none", p()?.class, t.class), o = _(), s = h() ? "" : void 0, c = t.confirmed || void 0, l = v() ? 0 : void 0, u = ln.CONTENT, d = g(), f = h() ? "" : void 0;
1208
+ return r !== e.e && N(n, e.e = r), e.t = B(n, o, e.t), s !== e.a && R(n, "data-toned", e.a = s), c !== e.o && R(n, "data-confirmed", e.o = c), l !== e.i && R(n, "tabindex", e.i = l), u !== e.n && z(i, "z-index", e.n = u), e.s = B(a, d, e.s), f !== e.h && R(a, "data-toned", e.h = f), e;
1254
1209
  }, {
1255
1210
  e: void 0,
1256
1211
  t: void 0,
@@ -1261,10 +1216,10 @@ function Xr(t) {
1261
1216
  s: void 0,
1262
1217
  h: void 0
1263
1218
  }), e;
1264
- })(), N(E, {
1219
+ })(), P(E, {
1265
1220
  when: a,
1266
1221
  get children() {
1267
- return N(Ze, {
1222
+ return P(Ze, {
1268
1223
  get open() {
1269
1224
  return i?.nothingMore() ?? !1;
1270
1225
  },
@@ -1273,10 +1228,10 @@ function Xr(t) {
1273
1228
  },
1274
1229
  anchorRef: c,
1275
1230
  get children() {
1276
- return N(Qe, {
1231
+ return P(Qe, {
1277
1232
  class: "flex w-auto items-center gap-2 p-3 text-sm",
1278
1233
  get children() {
1279
- return [N(U, { icon: "mdi:information-outline" }), "No more controls for this widget"];
1234
+ return [P(U, { icon: "mdi:information-outline" }), "No more controls for this widget"];
1280
1235
  }
1281
1236
  });
1282
1237
  }
@@ -1290,60 +1245,60 @@ function Xr(t) {
1290
1245
  }
1291
1246
  });
1292
1247
  }
1293
- function Zr(e) {
1248
+ function Xr(e) {
1294
1249
  return (() => {
1295
- var t = Gr();
1296
- return F(t, (() => {
1297
- var t = I(() => !!e.icon);
1250
+ var t = Wr();
1251
+ return I(t, (() => {
1252
+ var t = L(() => !!e.icon);
1298
1253
  return () => t() && (() => {
1299
- var t = Kr();
1300
- return F(t, () => e.icon), t;
1254
+ var t = Gr();
1255
+ return I(t, () => e.icon), t;
1301
1256
  })();
1302
- })(), null), F(t, (() => {
1303
- var t = I(() => !!e.title);
1257
+ })(), null), I(t, (() => {
1258
+ var t = L(() => !!e.title);
1304
1259
  return () => t() && (() => {
1305
- var t = qr();
1306
- return F(t, () => e.title), t;
1260
+ var t = Kr();
1261
+ return I(t, () => e.title), t;
1307
1262
  })();
1308
- })(), null), F(t, (() => {
1309
- var t = I(() => !!e.message);
1263
+ })(), null), I(t, (() => {
1264
+ var t = L(() => !!e.message);
1310
1265
  return () => t() && (() => {
1311
- var t = Jr();
1312
- return F(t, () => e.message), t;
1266
+ var t = qr();
1267
+ return I(t, () => e.message), t;
1313
1268
  })();
1314
1269
  })(), null), t;
1315
1270
  })();
1316
1271
  }
1317
- var Y = Xr;
1318
- Y.Content = br, Y.Icon = Ln, Y.Title = Tr, Y.Status = Sr, Y.Value = Vr, Y.SliderFill = _r, Y.Head = Zn, Y.Hero = Qn, Y.Controls = $n, Y.Stepper = er, Y.Choice = tr, Y.Action = nr, Y.Chip = rr, Y.Backdrop = ar, Y.Layer = ir, Y.Glyph = or, ve(["keydown"]);
1272
+ var Y = Yr;
1273
+ Y.Content = Cr, Y.Icon = Bn, Y.Title = Or, Y.Status = Tr, Y.Value = Br, Y.SliderFill = br, Y.Head = er, Y.Hero = tr, Y.Controls = nr, Y.Stepper = rr, Y.Choice = ir, Y.Action = ar, Y.Chip = or, Y.Backdrop = cr, Y.Layer = sr, Y.Glyph = lr, _e(["keydown"]);
1319
1274
  //#endregion
1320
1275
  //#region src/framework/panel/panel.tsx
1321
- var Qr = /*#__PURE__*/ B("<section class=glasshome-panel-section><h3 class=glasshome-panel-label>"), $r = /*#__PURE__*/ B("<div class=glasshome-panel-rows>"), ei = /*#__PURE__*/ B("<span class=\"glasshome-widget-slider-fill glasshome-panel-row-fill\">"), ti = /*#__PURE__*/ B("<span class=\"glasshome-widget-icon glass glasshome-panel-row-icon\">"), ni = /*#__PURE__*/ B("<span class=glasshome-panel-row-state>"), ri = /*#__PURE__*/ B("<span class=glasshome-panel-row-text><span class=glasshome-panel-row-name>"), ii = /*#__PURE__*/ B("<span class=glasshome-panel-row-trailing>"), ai = /*#__PURE__*/ B("<div class=glasshome-panel-row-wrap>"), oi = /*#__PURE__*/ B("<div>"), si = /*#__PURE__*/ B("<div class=\"glasshome-panel-facts glass\">"), ci = /*#__PURE__*/ B("<div class=glasshome-panel-fact><span class=glasshome-panel-row-text><span class=glasshome-panel-fact-label></span><span class=glasshome-panel-fact-value>"), li = 8, ui = (e, t, n) => Math.min(n, Math.max(t, e));
1322
- function di(e) {
1276
+ var Zr = /*#__PURE__*/ V("<section class=glasshome-panel-section><h3 class=glasshome-panel-label>"), Qr = /*#__PURE__*/ V("<div class=glasshome-panel-rows>"), $r = /*#__PURE__*/ V("<span class=\"glasshome-widget-slider-fill glasshome-panel-row-fill\">"), ei = /*#__PURE__*/ V("<span class=\"glasshome-widget-icon glass glasshome-panel-row-icon\">"), ti = /*#__PURE__*/ V("<span class=glasshome-panel-row-state>"), ni = /*#__PURE__*/ V("<span class=glasshome-panel-row-text><span class=glasshome-panel-row-name>"), ri = /*#__PURE__*/ V("<span class=glasshome-panel-row-trailing>"), ii = /*#__PURE__*/ V("<div class=glasshome-panel-row-wrap>"), ai = /*#__PURE__*/ V("<div>"), oi = /*#__PURE__*/ V("<div class=\"glasshome-panel-facts glass\">"), si = /*#__PURE__*/ V("<div class=glasshome-panel-fact><span class=glasshome-panel-row-text><span class=glasshome-panel-fact-label></span><span class=glasshome-panel-fact-value>"), ci = 8, li = (e, t, n) => Math.min(n, Math.max(t, e));
1277
+ function ui(e) {
1323
1278
  let t = j(W), n, r = !1, i = !1, a, o = 0, s = (t, n) => {
1324
1279
  let r = e.slide?.();
1325
1280
  if (!r) return 0;
1326
1281
  let i = t.getBoundingClientRect(), a = e.axis === "x" ? (n.clientX - i.left) / i.width : 1 - (n.clientY - i.top) / i.height, o = r.min ?? 0, s = r.max ?? 100;
1327
- return Math.round(ui(o + a * (s - o), o, s));
1282
+ return Math.round(li(o + a * (s - o), o, s));
1328
1283
  }, c = () => {
1329
1284
  clearTimeout(a), n = void 0;
1330
1285
  };
1331
1286
  return A(() => clearTimeout(a)), {
1332
1287
  onPointerDown: (o) => {
1333
1288
  if (o.button !== 0 || n) return;
1334
- let s = o.target instanceof Element ? o.target.closest(On) : null;
1289
+ let s = o.target instanceof Element ? o.target.closest(jn) : null;
1335
1290
  s && s !== o.currentTarget || (n = {
1336
1291
  x: o.clientX,
1337
1292
  y: o.clientY,
1338
1293
  id: o.pointerId
1339
1294
  }, o.currentTarget.setPointerCapture?.(o.pointerId), r = !1, i = !1, e.onHold && (a = setTimeout(() => {
1340
- i = !0, Kt(), e.onHold?.(), t?.onHeld?.();
1295
+ i = !0, qt(), e.onHold?.(), t?.onHeld?.();
1341
1296
  }, qe)));
1342
1297
  },
1343
1298
  onPointerMove: (t) => {
1344
1299
  if (!n || t.pointerId !== n.id || i) return;
1345
1300
  let c = t.currentTarget, l = e.axis === "x" ? Math.abs(t.clientX - n.x) : Math.abs(t.clientY - n.y);
1346
- !r && e.slide?.() && l > li && (r = !0, clearTimeout(a)), r ? (o = s(c, t), e.slide?.()?.onChange(o)) : Math.hypot(t.clientX - n.x, t.clientY - n.y) > li && clearTimeout(a);
1301
+ !r && e.slide?.() && l > ci && (r = !0, clearTimeout(a)), r ? (o = s(c, t), e.slide?.()?.onChange(o)) : Math.hypot(t.clientX - n.x, t.clientY - n.y) > ci && clearTimeout(a);
1347
1302
  },
1348
1303
  onPointerUp: (t) => {
1349
1304
  n && t.pointerId === n.id && (r ? e.slide?.()?.onCommit?.(o) : i || e.onTap?.(), c());
@@ -1351,20 +1306,20 @@ function di(e) {
1351
1306
  onPointerCancel: c
1352
1307
  };
1353
1308
  }
1354
- function fi(e) {
1309
+ function di(e) {
1355
1310
  return (() => {
1356
- var t = Qr(), n = t.firstChild;
1357
- return F(n, () => e.label), F(t, () => e.children, null), t;
1311
+ var t = Zr(), n = t.firstChild;
1312
+ return I(n, () => e.label), I(t, () => e.children, null), t;
1358
1313
  })();
1359
1314
  }
1360
- function pi(e) {
1315
+ function fi(e) {
1361
1316
  return (() => {
1362
- var t = $r();
1363
- return F(t, () => e.children), t;
1317
+ var t = Qr();
1318
+ return I(t, () => e.children), t;
1364
1319
  })();
1365
1320
  }
1366
- function mi(e) {
1367
- let t = () => !!(e.onTap || e.slide || e.onHold), n = di({
1321
+ function pi(e) {
1322
+ let t = () => !!(e.onTap || e.slide || e.onHold), n = ui({
1368
1323
  axis: "x",
1369
1324
  slide: () => e.slide,
1370
1325
  onTap: () => e.onTap?.(),
@@ -1381,26 +1336,26 @@ function mi(e) {
1381
1336
  let r = t.key === "ArrowRight" || t.key === "ArrowUp" ? 5 : t.key === "ArrowLeft" || t.key === "ArrowDown" ? -5 : 0;
1382
1337
  if (!r) return;
1383
1338
  t.preventDefault();
1384
- let i = ui(n.value + r, n.min ?? 0, n.max ?? 100);
1339
+ let i = li(n.value + r, n.min ?? 0, n.max ?? 100);
1385
1340
  n.onChange(i), n.onCommit?.(i);
1386
1341
  }, a = () => [
1387
- N(E, {
1342
+ P(E, {
1388
1343
  get when() {
1389
1344
  return r() !== void 0;
1390
1345
  },
1391
1346
  get children() {
1392
- var e = ei();
1393
- return P((t) => z(e, { "--widget-fill-value": r() }, t)), e;
1347
+ var e = $r();
1348
+ return F((t) => B(e, { "--widget-fill-value": r() }, t)), e;
1394
1349
  }
1395
1350
  }),
1396
1351
  (() => {
1397
- var t = ti();
1398
- return F(t, N(U, {
1352
+ var t = ei();
1353
+ return I(t, P(U, {
1399
1354
  get icon() {
1400
1355
  return e.icon;
1401
1356
  },
1402
1357
  class: "glasshome-widget-icon-glyph"
1403
- })), P((n) => {
1358
+ })), F((n) => {
1404
1359
  var r = !!e.on, i = !e.on;
1405
1360
  return r !== n.e && t.classList.toggle("glass-tint", n.e = r), i !== n.t && t.classList.toggle("glasshome-panel-row-icon-off", n.t = i), n;
1406
1361
  }, {
@@ -1409,33 +1364,33 @@ function mi(e) {
1409
1364
  }), t;
1410
1365
  })(),
1411
1366
  (() => {
1412
- var t = ri(), n = t.firstChild;
1413
- return F(n, () => e.name), F(t, N(E, {
1367
+ var t = ni(), n = t.firstChild;
1368
+ return I(n, () => e.name), I(t, P(E, {
1414
1369
  get when() {
1415
1370
  return e.state !== void 0;
1416
1371
  },
1417
1372
  get children() {
1418
- var t = ni();
1419
- return F(t, () => e.state), t;
1373
+ var t = ti();
1374
+ return I(t, () => e.state), t;
1420
1375
  }
1421
1376
  }), null), t;
1422
1377
  })()
1423
1378
  ], o = () => ({ "--widget-color": e.tone ?? "var(--tone-neutral)" });
1424
1379
  return (() => {
1425
- var r = ai();
1426
- return F(r, N(E, {
1380
+ var r = ii();
1381
+ return I(r, P(E, {
1427
1382
  get when() {
1428
1383
  return t();
1429
1384
  },
1430
1385
  get fallback() {
1431
1386
  return (() => {
1432
- var e = oi();
1433
- return F(e, a), P((t) => {
1387
+ var e = ai();
1388
+ return I(e, a), F((t) => {
1434
1389
  var n = `${Rt({
1435
1390
  variant: "outline",
1436
1391
  size: "none"
1437
1392
  })} glasshome-panel-row glasshome-panel-row-static`, r = o();
1438
- return n !== t.e && M(e, t.e = n), t.t = z(e, r, t.t), t;
1393
+ return n !== t.e && N(e, t.e = n), t.t = B(e, r, t.t), t;
1439
1394
  }, {
1440
1395
  e: void 0,
1441
1396
  t: void 0
@@ -1443,7 +1398,7 @@ function mi(e) {
1443
1398
  })();
1444
1399
  },
1445
1400
  get children() {
1446
- return N(Ee, {
1401
+ return P(Te, {
1447
1402
  variant: "outline",
1448
1403
  size: "none",
1449
1404
  class: "glasshome-panel-row",
@@ -1477,39 +1432,39 @@ function mi(e) {
1477
1432
  }
1478
1433
  });
1479
1434
  }
1480
- }), null), F(r, N(E, {
1435
+ }), null), I(r, P(E, {
1481
1436
  get when() {
1482
1437
  return e.trailing;
1483
1438
  },
1484
1439
  get children() {
1485
- var t = ii();
1486
- return F(t, () => e.trailing), t;
1440
+ var t = ri();
1441
+ return I(t, () => e.trailing), t;
1487
1442
  }
1488
1443
  }), null), r;
1489
1444
  })();
1490
1445
  }
1491
- function hi(e) {
1446
+ function mi(e) {
1492
1447
  return (() => {
1493
- var t = si();
1494
- return F(t, N(T, {
1448
+ var t = oi();
1449
+ return I(t, P(T, {
1495
1450
  get each() {
1496
1451
  return e.items;
1497
1452
  },
1498
1453
  children: (e) => (() => {
1499
- var t = ci(), n = t.firstChild, r = n.firstChild, i = r.nextSibling;
1500
- return F(t, N(U, {
1454
+ var t = si(), n = t.firstChild, r = n.firstChild, i = r.nextSibling;
1455
+ return I(t, P(U, {
1501
1456
  get icon() {
1502
1457
  return e.icon;
1503
1458
  },
1504
1459
  class: "glasshome-panel-fact-icon"
1505
- }), n), F(r, () => e.label), F(i, () => e.value), t;
1460
+ }), n), I(r, () => e.label), I(i, () => e.value), t;
1506
1461
  })()
1507
1462
  })), t;
1508
1463
  })();
1509
1464
  }
1510
1465
  //#endregion
1511
1466
  //#region src/framework/panel/panel-entity.tsx
1512
- var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.charAt(0).toUpperCase() + e.slice(1).replaceAll("_", " "), X = (e) => ({ entity_id: e.id }), vi = {
1467
+ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.charAt(0).toUpperCase() + e.slice(1).replaceAll("_", " "), X = (e) => ({ entity_id: e.id }), _i = {
1513
1468
  light: {
1514
1469
  icon: "mdi:lightbulb",
1515
1470
  tone: (e) => {
@@ -1549,10 +1504,10 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1549
1504
  on: (e) => e.state === "on",
1550
1505
  state: (e) => {
1551
1506
  if (e.state !== "on") return "Off";
1552
- let t = gi(e.attributes.percentage);
1507
+ let t = hi(e.attributes.percentage);
1553
1508
  return t === void 0 ? "On" : `${t}%`;
1554
1509
  },
1555
- level: (e) => e.state === "on" ? gi(e.attributes.percentage) ?? 100 : 0,
1510
+ level: (e) => e.state === "on" ? hi(e.attributes.percentage) ?? 100 : 0,
1556
1511
  setLevel: (e, t, n) => e("fan", "set_percentage", { percentage: n }, X(t)),
1557
1512
  tap: (e, t) => e("fan", "toggle", {}, X(t))
1558
1513
  },
@@ -1561,10 +1516,10 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1561
1516
  tone: "var(--tone-info)",
1562
1517
  on: (e) => e.state !== "closed",
1563
1518
  state: (e) => {
1564
- let t = gi(e.attributes.current_position), n = _i(e.state);
1519
+ let t = hi(e.attributes.current_position), n = gi(e.state);
1565
1520
  return t !== void 0 && e.state === "open" ? `${n} · ${t}%` : n;
1566
1521
  },
1567
- level: (e) => gi(e.attributes.current_position),
1522
+ level: (e) => hi(e.attributes.current_position),
1568
1523
  setLevel: (e, t, n) => e("cover", "set_cover_position", { position: n }, X(t)),
1569
1524
  tap: (e, t) => e("cover", t.state === "closed" ? "open_cover" : "close_cover", {}, X(t))
1570
1525
  },
@@ -1572,7 +1527,7 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1572
1527
  icon: (e) => e.state === "locked" ? "mdi:lock" : "mdi:lock-open-variant",
1573
1528
  tone: "var(--tone-success)",
1574
1529
  on: (e) => e.state === "locked",
1575
- state: (e) => _i(e.state),
1530
+ state: (e) => gi(e.state),
1576
1531
  tap: (e, t) => e("lock", t.state === "locked" ? "unlock" : "lock", {}, X(t))
1577
1532
  },
1578
1533
  climate: {
@@ -1582,14 +1537,14 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1582
1537
  state: (e) => {
1583
1538
  if (e.state === "off") return "Off";
1584
1539
  let t = e.attributes.temperature;
1585
- return typeof t == "number" ? `${_i(e.state)} · ${t}°` : _i(e.state);
1540
+ return typeof t == "number" ? `${gi(e.state)} · ${t}°` : gi(e.state);
1586
1541
  }
1587
1542
  },
1588
1543
  media_player: {
1589
1544
  icon: "mdi:speaker",
1590
1545
  tone: "var(--tone-accent)",
1591
1546
  on: (e) => e.state === "playing",
1592
- state: (e) => typeof e.attributes.media_title == "string" && e.state !== "off" ? e.attributes.media_title : _i(e.state),
1547
+ state: (e) => typeof e.attributes.media_title == "string" && e.state !== "off" ? e.attributes.media_title : gi(e.state),
1593
1548
  level: (e) => typeof e.attributes.volume_level == "number" ? Math.round(e.attributes.volume_level * 100) : void 0,
1594
1549
  setLevel: (e, t, n) => e("media_player", "volume_set", { volume_level: n / 100 }, X(t)),
1595
1550
  tap: (e, t) => e("media_player", "media_play_pause", {}, X(t))
@@ -1599,7 +1554,7 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1599
1554
  tone: "var(--tone-info)",
1600
1555
  on: (e) => e.state === "on",
1601
1556
  state: (e) => {
1602
- let t = bi[e.deviceClass ?? ""] ?? ["On", "Off"];
1557
+ let t = yi[e.deviceClass ?? ""] ?? ["On", "Off"];
1603
1558
  return e.state === "on" ? t[0] : t[1];
1604
1559
  }
1605
1560
  },
@@ -1607,14 +1562,14 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1607
1562
  icon: "mdi:gesture-tap-button",
1608
1563
  tone: "var(--tone-accent)",
1609
1564
  on: () => !1,
1610
- state: (e) => xi(e.state),
1565
+ state: (e) => bi(e.state),
1611
1566
  tap: (e, t) => e("button", "press", {}, X(t))
1612
1567
  },
1613
1568
  input_button: {
1614
1569
  icon: "mdi:gesture-tap-button",
1615
1570
  tone: "var(--tone-accent)",
1616
1571
  on: () => !1,
1617
- state: (e) => xi(e.state),
1572
+ state: (e) => bi(e.state),
1618
1573
  tap: (e, t) => e("input_button", "press", {}, X(t))
1619
1574
  },
1620
1575
  scene: {
@@ -1631,14 +1586,14 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1631
1586
  state: (e) => e.state === "on" ? "Running" : "Tap to run",
1632
1587
  tap: (e, t) => e("script", "turn_on", {}, X(t))
1633
1588
  }
1634
- }, yi = {
1589
+ }, vi = {
1635
1590
  garage: "mdi:garage",
1636
1591
  gate: "mdi:gate",
1637
1592
  door: "mdi:door",
1638
1593
  curtain: "mdi:curtains",
1639
1594
  shutter: "mdi:window-shutter",
1640
1595
  awning: "mdi:awning"
1641
- }, bi = {
1596
+ }, yi = {
1642
1597
  door: ["Open", "Closed"],
1643
1598
  window: ["Open", "Closed"],
1644
1599
  garage_door: ["Open", "Closed"],
@@ -1652,44 +1607,44 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1652
1607
  battery: ["Low", "Normal"],
1653
1608
  connectivity: ["Connected", "Disconnected"]
1654
1609
  };
1655
- function xi(e) {
1610
+ function bi(e) {
1656
1611
  let t = Date.parse(e);
1657
1612
  return Number.isNaN(t) ? "Never pressed" : new Date(t).toLocaleTimeString([], {
1658
1613
  hour: "2-digit",
1659
1614
  minute: "2-digit"
1660
1615
  });
1661
1616
  }
1662
- var Si = {
1617
+ var xi = {
1663
1618
  icon: "mdi:circle-medium",
1664
1619
  tone: "var(--tone-neutral)",
1665
1620
  on: (e) => e.state === "on",
1666
- state: (e) => _i(e.state)
1621
+ state: (e) => gi(e.state)
1667
1622
  };
1668
- function Ci(e, t) {
1623
+ function Si(e, t) {
1669
1624
  if (!t || e.length <= t.length || !e.toLowerCase().startsWith(t.toLowerCase())) return e;
1670
1625
  let n = e.slice(t.length).trim();
1671
1626
  return n ? n.charAt(0).toUpperCase() + n.slice(1) : e;
1672
1627
  }
1673
- function wi(e) {
1674
- return !!vi[e]?.tap || !!vi[e]?.setLevel;
1628
+ function Ci(e) {
1629
+ return !!_i[e]?.tap || !!_i[e]?.setLevel;
1675
1630
  }
1676
- function Ti(e) {
1677
- let t = C(() => e.entityId), { callService: n } = tn(), [r, i] = k();
1631
+ function wi(e) {
1632
+ let t = C(() => e.entityId), { callService: n } = an(), [r, i] = k();
1678
1633
  return D(() => {
1679
1634
  t(), i(void 0);
1680
- }), N(E, {
1635
+ }), P(E, {
1681
1636
  get when() {
1682
1637
  return t();
1683
1638
  },
1684
1639
  children: (t) => {
1685
- let a = () => vi[t().domain] ?? Si, o = () => r() ?? a().level?.(t()), s = () => a().setLevel;
1686
- return N(mi, {
1640
+ let a = () => _i[t().domain] ?? xi, o = () => r() ?? a().level?.(t()), s = () => a().setLevel;
1641
+ return P(pi, {
1687
1642
  get icon() {
1688
1643
  let n = a().icon;
1689
- return typeof n == "function" ? e.icon ?? n(t()) : e.icon ?? t().icon ?? yi[t().domain === "cover" ? t().deviceClass ?? "" : ""] ?? n;
1644
+ return typeof n == "function" ? e.icon ?? n(t()) : e.icon ?? t().icon ?? vi[t().domain === "cover" ? t().deviceClass ?? "" : ""] ?? n;
1690
1645
  },
1691
1646
  get name() {
1692
- return e.name ?? Ci(t().friendlyName ?? t().id, e.within);
1647
+ return e.name ?? Si(t().friendlyName ?? t().id, e.within);
1693
1648
  },
1694
1649
  get state() {
1695
1650
  return a().state(t());
@@ -1703,7 +1658,7 @@ function Ti(e) {
1703
1658
  return a().on(t());
1704
1659
  },
1705
1660
  get slide() {
1706
- return I(() => !!(s() && o() !== void 0))() ? {
1661
+ return L(() => !!(s() && o() !== void 0))() ? {
1707
1662
  value: o() ?? 0,
1708
1663
  onChange: i,
1709
1664
  onCommit: (e) => s()?.(n, t(), e)
@@ -1721,8 +1676,8 @@ function Ti(e) {
1721
1676
  }
1722
1677
  //#endregion
1723
1678
  //#region src/framework/dialogs/debug-view.tsx
1724
- var Ei = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-64 overflow-auto p-3 font-mono text-xs leading-relaxed\">"), Di = /*#__PURE__*/ B("<span class=\"flex items-center gap-2\">"), Oi = /*#__PURE__*/ B("<section class=\"flex min-w-0 flex-col gap-2\"><header class=\"flex items-center gap-3\"><div class=\"flex min-w-0 flex-1 flex-col\"></div></header><div class=\"flex flex-col gap-2\">"), ki = /*#__PURE__*/ B("<div class=\"flex flex-col\">"), Ai = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-96 overflow-auto p-3 font-mono text-xs leading-relaxed whitespace-pre-wrap\">");
1725
- function ji(e, t, n) {
1679
+ var Ti = /*#__PURE__*/ V("<pre class=\"text-muted-foreground max-h-64 overflow-auto p-3 font-mono text-xs leading-relaxed\">"), Ei = /*#__PURE__*/ V("<span class=\"flex items-center gap-2\">"), Di = /*#__PURE__*/ V("<section class=\"flex min-w-0 flex-col gap-2\"><header class=\"flex items-center gap-3\"><div class=\"flex min-w-0 flex-1 flex-col\"></div></header><div class=\"flex flex-col gap-2\">"), Oi = /*#__PURE__*/ V("<div class=\"flex flex-col\">"), ki = /*#__PURE__*/ V("<pre class=\"text-muted-foreground max-h-96 overflow-auto p-3 font-mono text-xs leading-relaxed whitespace-pre-wrap\">");
1680
+ function Ai(e, t, n) {
1726
1681
  return {
1727
1682
  widgetConfig: e,
1728
1683
  entities: t.map((e) => ({
@@ -1739,18 +1694,18 @@ function ji(e, t, n) {
1739
1694
  ...n
1740
1695
  };
1741
1696
  }
1742
- var Mi = (e) => JSON.stringify(e, null, 2), Ni = {
1697
+ var ji = (e) => JSON.stringify(e, null, 2), Mi = {
1743
1698
  idle: "lucide:copy",
1744
1699
  copied: "lucide:check",
1745
1700
  failed: "lucide:triangle-alert"
1746
- }, Pi = {
1701
+ }, Ni = {
1747
1702
  idle: "text-muted-foreground",
1748
1703
  copied: "text-success",
1749
1704
  failed: "text-destructive"
1750
1705
  };
1751
- function Fi(e) {
1752
- let { state: t, copy: n } = kr();
1753
- return N(Ee, {
1706
+ function Pi(e) {
1707
+ let { state: t, copy: n } = Yt();
1708
+ return P(Te, {
1754
1709
  variant: "ghost",
1755
1710
  size: "icon",
1756
1711
  class: "size-8",
@@ -1759,70 +1714,70 @@ function Fi(e) {
1759
1714
  },
1760
1715
  onClick: () => void n(e.text()),
1761
1716
  get children() {
1762
- return N(U, {
1717
+ return P(U, {
1763
1718
  get icon() {
1764
- return Ni[t()];
1719
+ return Mi[t()];
1765
1720
  },
1766
1721
  width: 16,
1767
1722
  height: 16,
1768
1723
  get class() {
1769
- return Pi[t()];
1724
+ return Ni[t()];
1770
1725
  }
1771
1726
  });
1772
1727
  }
1773
1728
  });
1774
1729
  }
1775
- function Ii(e) {
1730
+ function Fi(e) {
1776
1731
  let t = e.replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ");
1777
1732
  return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
1778
1733
  }
1779
- var Li = (e) => e === null || typeof e != "object" && typeof e != "function";
1780
- function Ri(e) {
1734
+ var Ii = (e) => e === null || typeof e != "object" && typeof e != "function";
1735
+ function Li(e) {
1781
1736
  return e == null ? "None" : String(e);
1782
1737
  }
1783
- function zi(e) {
1738
+ function Ri(e) {
1784
1739
  return Array.isArray(e) ? e.length : typeof e == "object" && e ? Object.keys(e).length : 0;
1785
1740
  }
1786
- function Bi(e) {
1741
+ function zi(e) {
1787
1742
  let t = new Date(e);
1788
1743
  return Number.isNaN(t.getTime()) ? e : t.toLocaleString();
1789
1744
  }
1790
- function Vi(e) {
1791
- return N(mt, {
1745
+ function Bi(e) {
1746
+ return P(mt, {
1792
1747
  class: "overflow-hidden p-0",
1793
1748
  get children() {
1794
- var t = Ei();
1795
- return F(t, () => Mi(e.value)), t;
1749
+ var t = Ti();
1750
+ return I(t, () => ji(e.value)), t;
1796
1751
  }
1797
1752
  });
1798
1753
  }
1799
- function Hi(e) {
1800
- return N(ye, {
1754
+ function Vi(e) {
1755
+ return P(ve, {
1801
1756
  collapsible: !0,
1802
1757
  class: "border-border/50 border-t",
1803
1758
  get children() {
1804
- return N(xe, {
1759
+ return P(be, {
1805
1760
  get value() {
1806
1761
  return e.label;
1807
1762
  },
1808
1763
  get children() {
1809
- return [N(Se, {
1764
+ return [P(xe, {
1810
1765
  class: "text-muted-foreground py-3 text-xs",
1811
1766
  get children() {
1812
- var t = Di();
1813
- return F(t, () => e.label, null), F(t, N(E, {
1767
+ var t = Ei();
1768
+ return I(t, () => e.label, null), I(t, P(E, {
1814
1769
  get when() {
1815
1770
  return e.count !== void 0;
1816
1771
  },
1817
1772
  get children() {
1818
- return N(ze, { get children() {
1773
+ return P(Re, { get children() {
1819
1774
  return e.count;
1820
1775
  } });
1821
1776
  }
1822
1777
  }), null), t;
1823
1778
  }
1824
- }), N(be, { get children() {
1825
- return N(Vi, { get value() {
1779
+ }), P(ye, { get children() {
1780
+ return P(Bi, { get value() {
1826
1781
  return e.value;
1827
1782
  } });
1828
1783
  } })];
@@ -1831,77 +1786,77 @@ function Hi(e) {
1831
1786
  }
1832
1787
  });
1833
1788
  }
1834
- function Ui(e) {
1789
+ function Hi(e) {
1835
1790
  return (() => {
1836
- var t = Oi(), n = t.firstChild, r = n.firstChild, i = n.nextSibling;
1837
- return F(n, N(ft, {
1791
+ var t = Di(), n = t.firstChild, r = n.firstChild, i = n.nextSibling;
1792
+ return I(n, P(ft, {
1838
1793
  get icon() {
1839
1794
  return e.icon;
1840
1795
  },
1841
1796
  size: "sm"
1842
- }), r), F(r, N(Ge, {
1797
+ }), r), I(r, P(Ge, {
1843
1798
  class: "truncate",
1844
1799
  get children() {
1845
1800
  return e.title;
1846
1801
  }
1847
- }), null), F(r, N(E, {
1802
+ }), null), I(r, P(E, {
1848
1803
  get when() {
1849
1804
  return e.subtitle;
1850
1805
  },
1851
- children: (e) => N(pt, {
1806
+ children: (e) => P(pt, {
1852
1807
  class: "truncate font-mono",
1853
1808
  get children() {
1854
1809
  return e();
1855
1810
  }
1856
1811
  })
1857
- }), null), F(n, () => e.badge, null), F(n, N(Fi, {
1812
+ }), null), I(n, () => e.badge, null), I(n, P(Pi, {
1858
1813
  get label() {
1859
1814
  return `Copy ${e.title}`;
1860
1815
  },
1861
- text: () => Mi(e.source)
1862
- }), null), F(i, () => e.children), t;
1816
+ text: () => ji(e.source)
1817
+ }), null), I(i, () => e.children), t;
1863
1818
  })();
1864
1819
  }
1865
- function Wi(e) {
1866
- let t = O(() => Object.entries(e.record)), n = O(() => t().flatMap(([e, t]) => Li(t) ? [[e, t]] : [])), r = O(() => t().filter(([, e]) => !Li(e)));
1867
- return N(E, {
1820
+ function Ui(e) {
1821
+ let t = O(() => Object.entries(e.record)), n = O(() => t().flatMap(([e, t]) => Ii(t) ? [[e, t]] : [])), r = O(() => t().filter(([, e]) => !Ii(e)));
1822
+ return P(E, {
1868
1823
  get when() {
1869
1824
  return t().length > 0;
1870
1825
  },
1871
1826
  get fallback() {
1872
- return N(pt, { children: "Nothing set" });
1827
+ return P(pt, { children: "Nothing set" });
1873
1828
  },
1874
1829
  get children() {
1875
- return [N(E, {
1830
+ return [P(E, {
1876
1831
  get when() {
1877
1832
  return n().length > 0;
1878
1833
  },
1879
1834
  get children() {
1880
- var e = ki();
1881
- return F(e, N(T, {
1835
+ var e = Oi();
1836
+ return I(e, P(T, {
1882
1837
  get each() {
1883
1838
  return n();
1884
1839
  },
1885
- children: ([e, t]) => N(H, {
1840
+ children: ([e, t]) => P(Ue, {
1886
1841
  get label() {
1887
- return Ii(e);
1842
+ return Fi(e);
1888
1843
  },
1889
1844
  get children() {
1890
- return Ri(t);
1845
+ return Li(t);
1891
1846
  }
1892
1847
  })
1893
1848
  })), e;
1894
1849
  }
1895
- }), N(T, {
1850
+ }), P(T, {
1896
1851
  get each() {
1897
1852
  return r();
1898
1853
  },
1899
- children: ([e, t]) => N(Hi, {
1854
+ children: ([e, t]) => P(Vi, {
1900
1855
  get label() {
1901
- return Ii(e);
1856
+ return Fi(e);
1902
1857
  },
1903
1858
  get count() {
1904
- return zi(t);
1859
+ return Ri(t);
1905
1860
  },
1906
1861
  value: t
1907
1862
  })
@@ -1909,9 +1864,9 @@ function Wi(e) {
1909
1864
  }
1910
1865
  });
1911
1866
  }
1912
- function Gi(e) {
1867
+ function Wi(e) {
1913
1868
  let t = () => e.entity.attributes ?? {};
1914
- return N(Ui, {
1869
+ return P(Hi, {
1915
1870
  icon: "lucide:activity",
1916
1871
  get title() {
1917
1872
  return e.entity.friendly_name ?? e.entity.entity_id;
@@ -1920,7 +1875,7 @@ function Gi(e) {
1920
1875
  return e.entity.entity_id;
1921
1876
  },
1922
1877
  get badge() {
1923
- return N(we, { get children() {
1878
+ return P(Ce, { get children() {
1924
1879
  return e.entity.state;
1925
1880
  } });
1926
1881
  },
@@ -1929,52 +1884,52 @@ function Gi(e) {
1929
1884
  },
1930
1885
  get children() {
1931
1886
  return [(() => {
1932
- var t = ki();
1933
- return F(t, N(H, {
1887
+ var t = Oi();
1888
+ return I(t, P(Ue, {
1934
1889
  label: "Domain",
1935
1890
  get children() {
1936
1891
  return e.entity.domain;
1937
1892
  }
1938
- }), null), F(t, N(E, {
1893
+ }), null), I(t, P(E, {
1939
1894
  get when() {
1940
1895
  return e.entity.device_class;
1941
1896
  },
1942
- children: (e) => N(H, {
1897
+ children: (e) => P(Ue, {
1943
1898
  label: "Device class",
1944
1899
  get children() {
1945
1900
  return e();
1946
1901
  }
1947
1902
  })
1948
- }), null), F(t, N(E, {
1903
+ }), null), I(t, P(E, {
1949
1904
  get when() {
1950
1905
  return e.entity.area_id;
1951
1906
  },
1952
- children: (e) => N(H, {
1907
+ children: (e) => P(Ue, {
1953
1908
  label: "Area",
1954
1909
  get children() {
1955
1910
  return e();
1956
1911
  }
1957
1912
  })
1958
- }), null), F(t, N(H, {
1913
+ }), null), I(t, P(Ue, {
1959
1914
  label: "Changed",
1960
1915
  get children() {
1961
- return Bi(e.entity.last_changed);
1916
+ return zi(e.entity.last_changed);
1962
1917
  }
1963
- }), null), F(t, N(H, {
1918
+ }), null), I(t, P(Ue, {
1964
1919
  label: "Updated",
1965
1920
  get children() {
1966
- return Bi(e.entity.last_updated);
1921
+ return zi(e.entity.last_updated);
1967
1922
  }
1968
1923
  }), null), t;
1969
- })(), N(E, {
1924
+ })(), P(E, {
1970
1925
  get when() {
1971
- return zi(t()) > 0;
1926
+ return Ri(t()) > 0;
1972
1927
  },
1973
1928
  get children() {
1974
- return N(Hi, {
1929
+ return P(Vi, {
1975
1930
  label: "Attributes",
1976
1931
  get count() {
1977
- return zi(t());
1932
+ return Ri(t());
1978
1933
  },
1979
1934
  get value() {
1980
1935
  return t();
@@ -1985,42 +1940,42 @@ function Gi(e) {
1985
1940
  }
1986
1941
  });
1987
1942
  }
1988
- function Ki(e) {
1943
+ function Gi(e) {
1989
1944
  let t = O(() => Object.keys(e.data).filter((e) => e !== "widgetConfig" && e !== "entities"));
1990
- return N(We, { get children() {
1945
+ return P(We, { get children() {
1991
1946
  return [
1992
- N(Ui, {
1947
+ P(Hi, {
1993
1948
  icon: "lucide:sliders-horizontal",
1994
1949
  title: "Configuration",
1995
1950
  get source() {
1996
1951
  return e.data.widgetConfig;
1997
1952
  },
1998
1953
  get children() {
1999
- return N(Wi, { get record() {
1954
+ return P(Ui, { get record() {
2000
1955
  return e.data.widgetConfig;
2001
1956
  } });
2002
1957
  }
2003
1958
  }),
2004
- N(T, {
1959
+ P(T, {
2005
1960
  get each() {
2006
1961
  return e.data.entities;
2007
1962
  },
2008
- children: (e) => N(Gi, { entity: e })
1963
+ children: (e) => P(Wi, { entity: e })
2009
1964
  }),
2010
- N(T, {
1965
+ P(T, {
2011
1966
  get each() {
2012
1967
  return t();
2013
1968
  },
2014
- children: (t) => N(Ui, {
1969
+ children: (t) => P(Hi, {
2015
1970
  icon: "lucide:braces",
2016
1971
  get title() {
2017
- return Ii(t);
1972
+ return Fi(t);
2018
1973
  },
2019
1974
  get source() {
2020
1975
  return e.data[t];
2021
1976
  },
2022
1977
  get children() {
2023
- return N(Vi, { get value() {
1978
+ return P(Bi, { get value() {
2024
1979
  return e.data[t];
2025
1980
  } });
2026
1981
  }
@@ -2029,52 +1984,52 @@ function Ki(e) {
2029
1984
  ];
2030
1985
  } });
2031
1986
  }
2032
- function qi(e) {
1987
+ function Ki(e) {
2033
1988
  if (typeof e != "object" || !e) return;
2034
1989
  let t = e;
2035
1990
  return Array.isArray(t.entities) && typeof t.widgetConfig == "object" ? t : void 0;
2036
1991
  }
2037
- function Ji(e) {
2038
- let t = O(() => qi(e.data));
2039
- return N(E, {
1992
+ function qi(e) {
1993
+ let t = O(() => Ki(e.data));
1994
+ return P(E, {
2040
1995
  get when() {
2041
1996
  return e.data !== void 0;
2042
1997
  },
2043
1998
  get fallback() {
2044
- return N(Be, { get children() {
2045
- return N(He, { get children() {
2046
- return [N(Ue, { children: "Nothing to inspect" }), N(Ve, { children: "This widget publishes no debug information." })];
1999
+ return P(ze, { get children() {
2000
+ return P(Ve, { get children() {
2001
+ return [P(He, { children: "Nothing to inspect" }), P(Be, { children: "This widget publishes no debug information." })];
2047
2002
  } });
2048
2003
  } });
2049
2004
  },
2050
2005
  get children() {
2051
- return N(E, {
2006
+ return P(E, {
2052
2007
  get when() {
2053
2008
  return t();
2054
2009
  },
2055
2010
  get fallback() {
2056
- return N(Ui, {
2011
+ return P(Hi, {
2057
2012
  icon: "lucide:braces",
2058
2013
  title: "Debug data",
2059
2014
  get source() {
2060
2015
  return e.data;
2061
2016
  },
2062
2017
  get children() {
2063
- return N(E, {
2018
+ return P(E, {
2064
2019
  get when() {
2065
2020
  return typeof e.data == "string";
2066
2021
  },
2067
2022
  get fallback() {
2068
- return N(Vi, { get value() {
2023
+ return P(Bi, { get value() {
2069
2024
  return e.data;
2070
2025
  } });
2071
2026
  },
2072
2027
  get children() {
2073
- return N(mt, {
2028
+ return P(mt, {
2074
2029
  class: "overflow-hidden p-0",
2075
2030
  get children() {
2076
- var t = Ai();
2077
- return F(t, () => e.data), t;
2031
+ var t = ki();
2032
+ return I(t, () => e.data), t;
2078
2033
  }
2079
2034
  });
2080
2035
  }
@@ -2082,7 +2037,7 @@ function Ji(e) {
2082
2037
  }
2083
2038
  });
2084
2039
  },
2085
- children: (e) => N(Ki, { get data() {
2040
+ children: (e) => P(Gi, { get data() {
2086
2041
  return e();
2087
2042
  } })
2088
2043
  });
@@ -2091,21 +2046,21 @@ function Ji(e) {
2091
2046
  }
2092
2047
  //#endregion
2093
2048
  //#region src/framework/dialogs/validate-config.ts
2094
- function Yi(e) {
2049
+ function Ji(e) {
2095
2050
  let t = "";
2096
2051
  for (let n of e) t += typeof n == "number" ? `[${n}]` : t ? `.${String(n)}` : String(n);
2097
2052
  return t;
2098
2053
  }
2099
- function Xi(e, t) {
2054
+ function Yi(e, t) {
2100
2055
  let n = e.safeParse(t);
2101
2056
  return n.success ? null : n.error.issues.map((e) => {
2102
- let t = Yi(e.path);
2057
+ let t = Ji(e.path);
2103
2058
  return t ? `${t}: ${e.message}` : e.message;
2104
2059
  });
2105
2060
  }
2106
2061
  //#endregion
2107
2062
  //#region src/framework/dialogs/WidgetDialog.tsx
2108
- var Zi = /*#__PURE__*/ B("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\">"), Qi = /*#__PURE__*/ B("<div class=\"bg-muted/30 rounded-lg p-2 text-center md:p-6\"><p class=\"text-muted-foreground text-sm\">No edit options available"), $i = /*#__PURE__*/ B("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><line x1=4 y1=21 x2=4 y2=14></line><line x1=4 y1=10 x2=4 y2=3></line><line x1=12 y1=21 x2=12 y2=12></line><line x1=12 y1=8 x2=12 y2=3></line><line x1=20 y1=21 x2=20 y2=16></line><line x1=20 y1=12 x2=20 y2=3></line><line x1=1 y1=14 x2=7 y2=14></line><line x1=9 y1=8 x2=15 y2=8></line><line x1=17 y1=16 x2=23 y2=16>"), ea = /*#__PURE__*/ B("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><path d=\"m8 2 1.88 1.88\"></path><path d=\"M14.12 3.88 16 2\"></path><path d=\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\"></path><path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\"></path><path d=\"M12 20v-9\"></path><path d=\"M6.53 9C4.6 8.8 3 7.1 3 5\"></path><path d=\"M6 13H2\"></path><path d=\"M3 21c0-2.1 1.7-3.9 3.8-4\"></path><path d=\"M20.97 5c0 2.1-1.6 3.8-3.5 4\"></path><path d=\"M22 13h-4\"></path><path d=\"M17.2 17c2.1.1 3.8 1.9 3.8 4\">"), ta = /*#__PURE__*/ B("<div class=glasshome-sheet>"), na = /*#__PURE__*/ B("<div class=glasshome-sheet-band aria-hidden=true><img alt>"), ra = /*#__PURE__*/ B("<span class=\"glasshome-widget-icon glass glass-tint glasshome-sheet-icon\">"), ia = /*#__PURE__*/ B("<span class=\"inline-flex size-3.5 shrink-0 items-center\">"), aa = (e) => Yt(e), oa = {
2063
+ var Xi = /*#__PURE__*/ V("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\">"), Zi = /*#__PURE__*/ V("<div class=\"bg-muted/30 rounded-lg p-2 text-center md:p-6\"><p class=\"text-muted-foreground text-sm\">No edit options available"), Qi = /*#__PURE__*/ V("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><line x1=4 y1=21 x2=4 y2=14></line><line x1=4 y1=10 x2=4 y2=3></line><line x1=12 y1=21 x2=12 y2=12></line><line x1=12 y1=8 x2=12 y2=3></line><line x1=20 y1=21 x2=20 y2=16></line><line x1=20 y1=12 x2=20 y2=3></line><line x1=1 y1=14 x2=7 y2=14></line><line x1=9 y1=8 x2=15 y2=8></line><line x1=17 y1=16 x2=23 y2=16>"), $i = /*#__PURE__*/ V("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><path d=\"m8 2 1.88 1.88\"></path><path d=\"M14.12 3.88 16 2\"></path><path d=\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\"></path><path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\"></path><path d=\"M12 20v-9\"></path><path d=\"M6.53 9C4.6 8.8 3 7.1 3 5\"></path><path d=\"M6 13H2\"></path><path d=\"M3 21c0-2.1 1.7-3.9 3.8-4\"></path><path d=\"M20.97 5c0 2.1-1.6 3.8-3.5 4\"></path><path d=\"M22 13h-4\"></path><path d=\"M17.2 17c2.1.1 3.8 1.9 3.8 4\">"), ea = /*#__PURE__*/ V("<div class=glasshome-sheet>"), ta = /*#__PURE__*/ V("<div class=glasshome-sheet-band aria-hidden=true><img alt>"), na = /*#__PURE__*/ V("<span class=\"glasshome-widget-icon glass glass-tint glasshome-sheet-icon\">"), ra = /*#__PURE__*/ V("<span class=\"inline-flex size-3.5 shrink-0 items-center\">"), ia = (e) => Qt(e), aa = {
2109
2064
  sm: "sm",
2110
2065
  md: "md",
2111
2066
  lg: "lg",
@@ -2114,24 +2069,24 @@ var Zi = /*#__PURE__*/ B("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 f
2114
2069
  "2xl": "xl",
2115
2070
  "3xl": "xl",
2116
2071
  "4xl": "full"
2117
- }, sa = {
2072
+ }, oa = {
2118
2073
  idle: "Copy all",
2119
2074
  copied: "Copied",
2120
2075
  failed: "Copy failed"
2121
2076
  };
2122
- function ca(e) {
2077
+ function sa(e) {
2123
2078
  let [t] = ge(e, /* @__PURE__ */ "open.onOpenChange.title.description.onSave.hasUnsavedChanges.onDelete.editContent.controlsContent.sheet.tile.debugContent.debugData.tabs.class.maxWidth.defaultTab.activeTab.onActiveTabChange.headerActions.configSchema.config.onConfigSave.ResponsiveDialog.ResponsiveDialogContent.ResponsiveDialogHeader.ResponsiveDialogTitle.ResponsiveDialogDescription.ResponsiveDialogBody.ResponsiveDialogFooter.Button.SchemaForm.Tabs.TabsList.TabsTrigger.TabsContent".split(".")), n = () => !!t.configSchema && !!t.config && !!t.onConfigSave && !!t.SchemaForm, [r, i] = k({}), [a, o] = k(null), [s, c] = k([]);
2124
2079
  D(me(() => t.config, (e) => {
2125
2080
  e && i({ ...e });
2126
2081
  })), D(me(() => t.configSchema, (e) => {
2127
- e && o(aa(e));
2082
+ e && o(ia(e));
2128
2083
  }));
2129
2084
  let l = () => n() && JSON.stringify(r()) !== JSON.stringify(t.config), u = (e) => {
2130
2085
  !e && t.config && (i({ ...t.config }), c([])), t.onOpenChange(e);
2131
2086
  }, d = () => {
2132
2087
  let e = t.configSchema;
2133
2088
  if (e) {
2134
- let t = Xi(e, r());
2089
+ let t = Yi(e, r());
2135
2090
  if (t) {
2136
2091
  c(t);
2137
2092
  return;
@@ -2140,7 +2095,7 @@ function ca(e) {
2140
2095
  c([]), t.onConfigSave?.(r());
2141
2096
  }, [f, p] = k(t.defaultTab ?? "controls"), m = () => t.activeTab ?? f(), h = (e) => {
2142
2097
  t.onActiveTabChange ? t.onActiveTabChange(e) : p(e);
2143
- }, g = () => oa[t.maxWidth ?? "xl"], _ = () => {
2098
+ }, g = () => aa[t.maxWidth ?? "xl"], _ = () => {
2144
2099
  if (t.tabs) return t.tabs.map((e) => ({
2145
2100
  ...e,
2146
2101
  icon: () => e.icon,
@@ -2150,10 +2105,10 @@ function ca(e) {
2150
2105
  return e.push({
2151
2106
  id: "edit",
2152
2107
  label: "Edit",
2153
- icon: () => Zi(),
2108
+ icon: () => Xi(),
2154
2109
  content: () => t.editContent ?? (() => {
2155
2110
  let e = t.SchemaForm, o = n() ? a() : void 0;
2156
- return !o || !e ? Qi() : N(e, {
2111
+ return !o || !e ? Zi() : P(e, {
2157
2112
  schema: o,
2158
2113
  get data() {
2159
2114
  return r();
@@ -2167,86 +2122,86 @@ function ca(e) {
2167
2122
  }), e.push({
2168
2123
  id: "controls",
2169
2124
  label: "Controls",
2170
- icon: () => $i(),
2171
- content: () => t.controlsContent ?? N(Be, { get children() {
2172
- return N(He, { get children() {
2173
- return [N(Ue, { children: "No controls" }), N(Ve, { children: "This widget is shown as is." })];
2125
+ icon: () => Qi(),
2126
+ content: () => t.controlsContent ?? P(ze, { get children() {
2127
+ return P(Ve, { get children() {
2128
+ return [P(He, { children: "No controls" }), P(Be, { children: "This widget is shown as is." })];
2174
2129
  } });
2175
2130
  } })
2176
2131
  }), e.push({
2177
2132
  id: "debug",
2178
2133
  label: "Debug",
2179
- icon: () => ea(),
2180
- content: () => t.debugContent ?? N(Ji, { get data() {
2134
+ icon: () => $i(),
2135
+ content: () => t.debugContent ?? P(qi, { get data() {
2181
2136
  return t.debugData;
2182
2137
  } })
2183
2138
  }), e;
2184
- }, v = j(W), y = dn(v);
2139
+ }, v = j(W), y = mn(v);
2185
2140
  D(() => y?.setHasSheet(t.sheet !== void 0)), A(() => y?.setHasSheet(!1));
2186
2141
  let b = () => ({
2187
2142
  icon: t.tile?.icon ?? y?.icon(),
2188
2143
  tone: t.tile?.tone ?? y?.accent() ?? y?.tone(),
2189
2144
  backdrop: t.tile?.backdrop
2190
- }), x = () => v?.developer?.() ?? !1, S = () => V() === "controls" && t.sheet !== void 0, ee = la(), C = () => v?.anchor?.(), w = () => S() && !ee() && C() !== void 0, te = kr(), ne = () => {
2145
+ }), x = () => v?.developer?.() ?? !1, S = () => H() === "controls" && t.sheet !== void 0, ee = ca(), C = () => v?.anchor?.(), w = () => S() && !ee() && C() !== void 0, te = Yt(), ne = () => {
2191
2146
  if (t.debugData === void 0) return;
2192
2147
  let e = typeof t.debugData == "string" ? t.debugData : JSON.stringify(t.debugData, null, 2);
2193
2148
  te.copy(e);
2194
- }, re = t.ResponsiveDialog, ie = t.ResponsiveDialogContent, ae = t.ResponsiveDialogHeader, oe = t.ResponsiveDialogTitle, se = t.ResponsiveDialogDescription, ce = t.ResponsiveDialogBody ?? nt, le = t.ResponsiveDialogFooter ?? st, ue = t.Tabs ?? Tt, de = t.TabsList ?? kt, fe = t.TabsTrigger ?? jt, pe = t.TabsContent ?? Dt, he = t.Button, _e = O(me([
2149
+ }, re = t.ResponsiveDialog, ie = t.ResponsiveDialogContent, ae = t.ResponsiveDialogHeader, oe = t.ResponsiveDialogTitle, se = t.ResponsiveDialogDescription, ce = t.ResponsiveDialogBody ?? nt, le = t.ResponsiveDialogFooter ?? st, ue = t.Tabs ?? Tt, de = t.TabsList ?? kt, fe = t.TabsTrigger ?? jt, pe = t.TabsContent ?? Dt, he = t.Button, M = O(me([
2195
2150
  () => t.open,
2196
2151
  a,
2197
2152
  () => t.config,
2198
2153
  () => t.tabs
2199
- ], () => _())), M = (e) => n() ? u(e) : t.onOpenChange(e), ve = () => n() ? l() : t.hasUnsavedChanges, R = () => n() ? d : t.onSave, z = () => _e().filter((e) => e.id !== "debug" || x()), B = () => z().filter((e) => e.id !== "controls" || t.sheet === void 0), V = () => {
2200
- let e = z(), n = m() === "controls" && t.sheet === void 0 && !("controlsContent" in t) && !t.tabs ? "edit" : m();
2154
+ ], () => _())), N = (e) => n() ? u(e) : t.onOpenChange(e), _e = () => n() ? l() : t.hasUnsavedChanges, z = () => n() ? d : t.onSave, B = () => M().filter((e) => e.id !== "debug" || x()), V = () => B().filter((e) => e.id !== "controls" || t.sheet === void 0), H = () => {
2155
+ let e = B(), n = m() === "controls" && t.sheet === void 0 && !("controlsContent" in t) && !t.tabs ? "edit" : m();
2201
2156
  return e.some((e) => e.id === n) ? n : e[0]?.id ?? n;
2202
- }, ye = () => V() === "edit" && (R() || t.onDelete) || V() === "debug" && t.debugData !== void 0;
2203
- return N(re, {
2157
+ }, ve = () => H() === "edit" && (z() || t.onDelete) || H() === "debug" && t.debugData !== void 0;
2158
+ return P(re, {
2204
2159
  get open() {
2205
2160
  return t.open;
2206
2161
  },
2207
- onOpenChange: (e) => M(e),
2162
+ onOpenChange: (e) => N(e),
2208
2163
  get children() {
2209
- return N(E, {
2164
+ return P(E, {
2210
2165
  get when() {
2211
2166
  return !S();
2212
2167
  },
2213
2168
  get fallback() {
2214
- return N(ie, {
2169
+ return P(ie, {
2215
2170
  size: "sm",
2216
2171
  get ariaLabel() {
2217
2172
  return t.title;
2218
2173
  },
2219
2174
  get anchor() {
2220
- return I(() => !!w())() ? C() : void 0;
2175
+ return L(() => !!w())() ? C() : void 0;
2221
2176
  },
2222
2177
  class: "glasshome-sheet-surface",
2223
2178
  get style() {
2224
- return I(() => !!b().tone)() ? {
2179
+ return L(() => !!b().tone)() ? {
2225
2180
  "--glass-tone": b().tone,
2226
2181
  "--widget-color": b().tone
2227
2182
  } : void 0;
2228
2183
  },
2229
2184
  get children() {
2230
2185
  return [
2231
- N(E, {
2186
+ P(E, {
2232
2187
  get when() {
2233
2188
  return b().backdrop;
2234
2189
  },
2235
2190
  children: (e) => (() => {
2236
- var t = na(), n = t.firstChild;
2237
- return P(() => L(n, "src", e())), t;
2191
+ var t = ta(), n = t.firstChild;
2192
+ return F(() => R(n, "src", e())), t;
2238
2193
  })()
2239
2194
  }),
2240
- N(ae, {
2195
+ P(ae, {
2241
2196
  class: "items-center",
2242
2197
  get media() {
2243
- return N(E, {
2198
+ return P(E, {
2244
2199
  get when() {
2245
2200
  return b().icon;
2246
2201
  },
2247
2202
  children: (e) => (() => {
2248
- var t = ra();
2249
- return F(t, N(U, {
2203
+ var t = na();
2204
+ return I(t, P(U, {
2250
2205
  get icon() {
2251
2206
  return e();
2252
2207
  },
@@ -2256,7 +2211,7 @@ function ca(e) {
2256
2211
  });
2257
2212
  },
2258
2213
  get children() {
2259
- return N(oe, {
2214
+ return P(oe, {
2260
2215
  class: "truncate",
2261
2216
  get children() {
2262
2217
  return t.title;
@@ -2264,16 +2219,16 @@ function ca(e) {
2264
2219
  });
2265
2220
  }
2266
2221
  }),
2267
- N(ce, { get children() {
2268
- var e = ta();
2269
- return F(e, () => t.sheet?.()), e;
2222
+ P(ce, { get children() {
2223
+ var e = ea();
2224
+ return I(e, () => t.sheet?.()), e;
2270
2225
  } })
2271
2226
  ];
2272
2227
  }
2273
2228
  });
2274
2229
  },
2275
2230
  get children() {
2276
- return N(ie, {
2231
+ return P(ie, {
2277
2232
  get size() {
2278
2233
  return g();
2279
2234
  },
@@ -2281,70 +2236,70 @@ function ca(e) {
2281
2236
  return t.class;
2282
2237
  },
2283
2238
  get children() {
2284
- return N(ue, {
2239
+ return P(ue, {
2285
2240
  get value() {
2286
- return V();
2241
+ return H();
2287
2242
  },
2288
2243
  onChange: h,
2289
2244
  layout: "split",
2290
2245
  get children() {
2291
2246
  return [
2292
- N(ae, {
2247
+ P(ae, {
2293
2248
  class: "flex-wrap",
2294
2249
  get action() {
2295
- return [N(E, {
2250
+ return [P(E, {
2296
2251
  get when() {
2297
2252
  return x() || t.tabs !== void 0;
2298
2253
  },
2299
2254
  get children() {
2300
- return N(de, {
2255
+ return P(de, {
2301
2256
  class: "w-auto",
2302
2257
  get children() {
2303
- return N(T, {
2258
+ return P(T, {
2304
2259
  get each() {
2305
- return B();
2260
+ return V();
2306
2261
  },
2307
- children: (e) => N(fe, {
2262
+ children: (e) => P(fe, {
2308
2263
  get value() {
2309
2264
  return e.id;
2310
2265
  },
2311
2266
  get children() {
2312
2267
  return [(() => {
2313
- var t = ia();
2314
- return F(t, () => e.icon()), t;
2315
- })(), I(() => e.label)];
2268
+ var t = ra();
2269
+ return I(t, () => e.icon()), t;
2270
+ })(), L(() => e.label)];
2316
2271
  }
2317
2272
  })
2318
2273
  });
2319
2274
  }
2320
2275
  });
2321
2276
  }
2322
- }), I(() => t.headerActions)];
2277
+ }), L(() => t.headerActions)];
2323
2278
  },
2324
2279
  get children() {
2325
- return [N(oe, {
2280
+ return [P(oe, {
2326
2281
  class: "truncate",
2327
2282
  get children() {
2328
2283
  return t.title;
2329
2284
  }
2330
- }), N(E, {
2285
+ }), P(E, {
2331
2286
  get when() {
2332
2287
  return t.description;
2333
2288
  },
2334
2289
  get children() {
2335
- return N(se, { get children() {
2290
+ return P(se, { get children() {
2336
2291
  return t.description;
2337
2292
  } });
2338
2293
  }
2339
2294
  })];
2340
2295
  }
2341
2296
  }),
2342
- N(ce, { get children() {
2343
- return N(T, {
2297
+ P(ce, { get children() {
2298
+ return P(T, {
2344
2299
  get each() {
2345
- return z();
2300
+ return B();
2346
2301
  },
2347
- children: (e) => N(pe, {
2302
+ children: (e) => P(pe, {
2348
2303
  get value() {
2349
2304
  return e.id;
2350
2305
  },
@@ -2354,19 +2309,19 @@ function ca(e) {
2354
2309
  })
2355
2310
  });
2356
2311
  } }),
2357
- N(E, {
2312
+ P(E, {
2358
2313
  get when() {
2359
- return ye();
2314
+ return ve();
2360
2315
  },
2361
2316
  get children() {
2362
- return N(le, { get children() {
2317
+ return P(le, { get children() {
2363
2318
  return [
2364
- N(E, {
2319
+ P(E, {
2365
2320
  get when() {
2366
- return I(() => V() === "edit")() && t.onDelete;
2321
+ return L(() => H() === "edit")() && t.onDelete;
2367
2322
  },
2368
2323
  get children() {
2369
- return N(he, {
2324
+ return P(he, {
2370
2325
  size: "sm",
2371
2326
  variant: "destructive",
2372
2327
  onClick: () => t.onDelete?.(),
@@ -2374,32 +2329,32 @@ function ca(e) {
2374
2329
  });
2375
2330
  }
2376
2331
  }),
2377
- N(E, {
2332
+ P(E, {
2378
2333
  get when() {
2379
- return I(() => V() === "edit")() && R();
2334
+ return L(() => H() === "edit")() && z();
2380
2335
  },
2381
2336
  get children() {
2382
- return N(he, {
2337
+ return P(he, {
2383
2338
  size: "sm",
2384
2339
  get disabled() {
2385
- return !ve();
2340
+ return !_e();
2386
2341
  },
2387
- onClick: () => R()?.(),
2342
+ onClick: () => z()?.(),
2388
2343
  children: "Save"
2389
2344
  });
2390
2345
  }
2391
2346
  }),
2392
- N(E, {
2347
+ P(E, {
2393
2348
  get when() {
2394
- return I(() => V() === "debug")() && t.debugData !== void 0;
2349
+ return L(() => H() === "debug")() && t.debugData !== void 0;
2395
2350
  },
2396
2351
  get children() {
2397
- return N(he, {
2352
+ return P(he, {
2398
2353
  size: "sm",
2399
2354
  variant: "outline",
2400
2355
  onClick: ne,
2401
2356
  get children() {
2402
- return sa[te.state()];
2357
+ return oa[te.state()];
2403
2358
  }
2404
2359
  });
2405
2360
  }
@@ -2418,7 +2373,7 @@ function ca(e) {
2418
2373
  }
2419
2374
  });
2420
2375
  }
2421
- function la() {
2376
+ function ca() {
2422
2377
  let e = "(max-width: 639px)", [t, n] = k(typeof window < "u" && window.matchMedia(e).matches);
2423
2378
  return he(() => {
2424
2379
  let t = window.matchMedia(e), r = () => n(t.matches);
@@ -2427,77 +2382,77 @@ function la() {
2427
2382
  }
2428
2383
  //#endregion
2429
2384
  //#region src/framework/hooks/use-widget-dashboard.ts
2430
- var ua = {
2385
+ var la = {
2431
2386
  name: "",
2432
2387
  icon: "",
2433
2388
  areaId: null
2434
2389
  };
2435
- function da() {
2390
+ function ua() {
2436
2391
  let e = j(W);
2437
- return () => e?.dashboard?.() ?? ua;
2392
+ return () => e?.dashboard?.() ?? la;
2438
2393
  }
2439
2394
  //#endregion
2440
2395
  //#region src/framework/hooks/use-widget-viewer.ts
2441
- var fa = { name: null };
2442
- function pa() {
2396
+ var da = { name: null };
2397
+ function fa() {
2443
2398
  let e = j(W);
2444
- return () => e?.viewer?.() ?? fa;
2399
+ return () => e?.viewer?.() ?? da;
2445
2400
  }
2446
2401
  //#endregion
2447
2402
  //#region node_modules/@glasshome/ui/dist/tokens/index.js
2448
- var ma = /^oklch\(\s*([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s*\)$/i;
2449
- function ha(e, t, n) {
2403
+ var pa = /^oklch\(\s*([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s*\)$/i;
2404
+ function ma(e, t, n) {
2450
2405
  return Math.min(Math.max(e, t), n);
2451
2406
  }
2452
- function ga(e) {
2407
+ function ha(e) {
2453
2408
  return String(Number.isInteger(e) ? e : Number(e.toFixed(6)));
2454
2409
  }
2455
- function _a(e) {
2456
- let t = ma.exec(e.trim());
2410
+ function ga(e) {
2411
+ let t = pa.exec(e.trim());
2457
2412
  return t ? {
2458
2413
  l: Number(t[1]),
2459
2414
  c: Number(t[2]),
2460
2415
  h: Number(t[3])
2461
2416
  } : null;
2462
2417
  }
2463
- function va(e, t, n) {
2464
- return `oklch(${ga(e)} ${ga(t)} ${ga(n)})`;
2418
+ function _a(e, t, n) {
2419
+ return `oklch(${ha(e)} ${ha(t)} ${ha(n)})`;
2420
+ }
2421
+ function va(e, t) {
2422
+ let n = ga(e);
2423
+ return n ? _a(ma(n.l + t, 0, 1), n.c, n.h) : e;
2465
2424
  }
2466
2425
  function ya(e, t) {
2467
- let n = _a(e);
2468
- return n ? va(ha(n.l + t, 0, 1), n.c, n.h) : e;
2426
+ let n = ga(e);
2427
+ return n ? _a(ma(t, 0, 1), ma(n.c * .8, 0, .4), n.h) : e;
2469
2428
  }
2470
2429
  function ba(e, t) {
2471
- let n = _a(e);
2472
- return n ? va(ha(t, 0, 1), ha(n.c * .8, 0, .4), n.h) : e;
2473
- }
2474
- function xa(e, t) {
2475
2430
  return {
2476
2431
  ...e,
2477
2432
  popover: e.card,
2478
- muted: t === "light" ? ya(e.background, -.015) : ya(e.background, .1),
2433
+ muted: t === "light" ? va(e.background, -.015) : va(e.background, .1),
2479
2434
  mutedForeground: t === "light" ? "oklch(0.44 0 0)" : "oklch(0.71 0 0)",
2480
- input: t === "light" ? ya(e.border, .01) : ya(e.border, .04),
2435
+ input: t === "light" ? va(e.border, .01) : va(e.border, .04),
2481
2436
  ring: e.accent,
2482
2437
  destructive: t === "light" ? "oklch(0.54 0.19 23.0704)" : "oklch(0.7106 0.1661 22.2162)"
2483
2438
  };
2484
2439
  }
2485
- function Sa(e) {
2486
- return xa({
2487
- primary: ya(e.primary, .15),
2488
- accent: ya(e.accent, .1),
2489
- secondary: ba(e.secondary, .14),
2490
- border: ba(e.border, .26),
2491
- card: ba(e.card, .17),
2492
- background: ba(e.background, .12)
2440
+ function xa(e) {
2441
+ return ba({
2442
+ primary: va(e.primary, .15),
2443
+ accent: va(e.accent, .1),
2444
+ secondary: ya(e.secondary, .14),
2445
+ border: ya(e.border, .26),
2446
+ card: ya(e.card, .17),
2447
+ background: ya(e.background, .12)
2493
2448
  }, "dark");
2494
2449
  }
2495
- var Ca = {
2450
+ var Sa = {
2496
2451
  edgeWidth: 1,
2497
2452
  edgeInk: 0,
2498
2453
  edgeAccent: 0,
2499
2454
  inkLift: 0
2500
- }, wa = {
2455
+ }, Ca = {
2501
2456
  frosted: {
2502
2457
  blur: 24,
2503
2458
  clarity: 60,
@@ -2505,7 +2460,7 @@ var Ca = {
2505
2460
  tint: 1,
2506
2461
  glow: 0,
2507
2462
  ink: 0,
2508
- ...Ca
2463
+ ...Sa
2509
2464
  },
2510
2465
  frost: {
2511
2466
  blur: 24,
@@ -2514,7 +2469,7 @@ var Ca = {
2514
2469
  tint: 1,
2515
2470
  glow: 0,
2516
2471
  ink: 0,
2517
- ...Ca,
2472
+ ...Sa,
2518
2473
  grain: .4
2519
2474
  },
2520
2475
  paper: {
@@ -2524,7 +2479,7 @@ var Ca = {
2524
2479
  tint: .85,
2525
2480
  glow: 0,
2526
2481
  ink: 0,
2527
- ...Ca,
2482
+ ...Sa,
2528
2483
  edgeInk: .3,
2529
2484
  sheen: 0,
2530
2485
  edge: .2,
@@ -2554,13 +2509,13 @@ var Ca = {
2554
2509
  tint: .7,
2555
2510
  glow: 0,
2556
2511
  ink: 1,
2557
- ...Ca,
2512
+ ...Sa,
2558
2513
  inkLift: 1
2559
2514
  }
2560
- }, Ta = {
2515
+ }, wa = {
2561
2516
  v: 1,
2562
2517
  preset: "frosted"
2563
- }, Ea = {
2518
+ }, Ta = {
2564
2519
  blur: [0, 48],
2565
2520
  clarity: [0, 100],
2566
2521
  depth: [0, 2],
@@ -2580,7 +2535,7 @@ var Ca = {
2580
2535
  washAngle: [0, 360],
2581
2536
  relief: [0, 2],
2582
2537
  fill: [0, .6]
2583
- }, Da = {
2538
+ }, Ea = {
2584
2539
  vibrancy: 1,
2585
2540
  inset: 0,
2586
2541
  lightFrom: 315,
@@ -2596,10 +2551,10 @@ var Ca = {
2596
2551
  relief: 1,
2597
2552
  accent: "theme",
2598
2553
  fill: 0
2599
- }, Oa = Object.keys(Ea);
2600
- function ka(e) {
2601
- let { edgeWidth: t, edgeInk: n, edgeAccent: r, inkLift: i, ...a } = wa[e.preset], o = {
2602
- ...Da,
2554
+ }, Da = Object.keys(Ta);
2555
+ function Oa(e) {
2556
+ let { edgeWidth: t, edgeInk: n, edgeAccent: r, inkLift: i, ...a } = Ca[e.preset], o = {
2557
+ ...Ea,
2603
2558
  ...a,
2604
2559
  ...e.dials
2605
2560
  }, s = {
@@ -2608,7 +2563,7 @@ function ka(e) {
2608
2563
  sheen: o.sheen ?? o.depth,
2609
2564
  shadow: o.shadow ?? o.depth
2610
2565
  };
2611
- for (let e of Oa) s[e] = ha(s[e], ...Ea[e]);
2566
+ for (let e of Da) s[e] = ma(s[e], ...Ta[e]);
2612
2567
  return s;
2613
2568
  }
2614
2569
  function Z(e, t) {
@@ -2635,8 +2590,8 @@ function Q(e, t, n, r, i, a, o, s) {
2635
2590
  swatch: r,
2636
2591
  material: s,
2637
2592
  colors: {
2638
- light: xa(i, "light"),
2639
- dark: o ? xa(o, "dark") : Sa(i)
2593
+ light: ba(i, "light"),
2594
+ dark: o ? ba(o, "dark") : xa(i)
2640
2595
  },
2641
2596
  background: a
2642
2597
  };
@@ -2804,17 +2759,17 @@ Z("glass-house", {
2804
2759
  });
2805
2760
  //#endregion
2806
2761
  //#region src/framework/hooks/use-material.ts
2807
- var Aa = {
2808
- id: Ta.preset,
2809
- terms: ka(Ta)
2762
+ var ka = {
2763
+ id: wa.preset,
2764
+ terms: Oa(wa)
2810
2765
  };
2811
- function ja() {
2766
+ function Aa() {
2812
2767
  let e = j(W);
2813
- return () => e?.material?.() ?? Aa;
2768
+ return () => e?.material?.() ?? ka;
2814
2769
  }
2815
2770
  //#endregion
2816
2771
  //#region src/framework/hooks/use-intersection-pause.ts
2817
- function Ma(e) {
2772
+ function ja(e) {
2818
2773
  if (typeof IntersectionObserver > "u") return () => !1;
2819
2774
  let [t, n] = k(!1), r = new IntersectionObserver((e) => {
2820
2775
  let t = e[0];
@@ -2827,40 +2782,40 @@ function Ma(e) {
2827
2782
  }
2828
2783
  //#endregion
2829
2784
  //#region src/framework/hooks/use-daylight.ts
2830
- var Na = -6, Pa = 864e5;
2831
- function Fa(e, t) {
2785
+ var Ma = -6, Na = 864e5;
2786
+ function Pa(e, t) {
2832
2787
  let n = e.next_rising ? Date.parse(e.next_rising) : NaN, r = e.next_setting ? Date.parse(e.next_setting) : NaN;
2833
2788
  if (!Number.isFinite(n) || !Number.isFinite(r)) return;
2834
- let [i, a] = e.state === "above_horizon" ? [n - Pa, r] : [r - Pa, n], o = a - i;
2789
+ let [i, a] = e.state === "above_horizon" ? [n - Na, r] : [r - Na, n], o = a - i;
2835
2790
  if (!(o <= 0)) return Math.min(1, Math.max(0, (t.getTime() - i) / o));
2836
2791
  }
2837
- var Ia = 20, La = 7;
2838
- function Ra(e, t) {
2792
+ var Fa = 20, Ia = 7;
2793
+ function La(e, t) {
2839
2794
  if (e && (e.state === "above_horizon" || e.state === "below_horizon")) {
2840
- let n = e.elevation, r = e.state === "above_horizon" ? "day" : n !== void 0 && n > Na ? e.rising ? "dawn" : "dusk" : "night";
2795
+ let n = e.elevation, r = e.state === "above_horizon" ? "day" : n !== void 0 && n > Ma ? e.rising ? "dawn" : "dusk" : "night";
2841
2796
  return {
2842
2797
  phase: r,
2843
2798
  isNight: r === "night",
2844
2799
  elevation: n,
2845
- progress: Fa(e, t)
2800
+ progress: Pa(e, t)
2846
2801
  };
2847
2802
  }
2848
- let n = t.getHours(), r = n >= Ia || n < La ? "night" : "day";
2803
+ let n = t.getHours(), r = n >= Fa || n < Ia ? "night" : "day";
2849
2804
  return {
2850
2805
  phase: r,
2851
2806
  isNight: r === "night"
2852
2807
  };
2853
2808
  }
2854
- var [za, Ba] = k(/* @__PURE__ */ new Date()), Va = 0, Ha;
2855
- function Ua() {
2856
- return Va++, Ha ||= (Ba(/* @__PURE__ */ new Date()), setInterval(() => Ba(/* @__PURE__ */ new Date()), 6e4)), () => {
2857
- Va--, Va === 0 && Ha && (clearInterval(Ha), Ha = void 0);
2809
+ var [Ra, za] = k(/* @__PURE__ */ new Date()), Ba = 0, Va;
2810
+ function Ha() {
2811
+ return Ba++, Va ||= (za(/* @__PURE__ */ new Date()), setInterval(() => za(/* @__PURE__ */ new Date()), 6e4)), () => {
2812
+ Ba--, Ba === 0 && Va && (clearInterval(Va), Va = void 0);
2858
2813
  };
2859
2814
  }
2860
- function Wa() {
2815
+ function Ua() {
2861
2816
  let e = C("sun.sun");
2862
2817
  return D(() => {
2863
- e() || A(Ua());
2818
+ e() || A(Ha());
2864
2819
  }), O(() => {
2865
2820
  let t = e(), n = t ? {
2866
2821
  state: t.state,
@@ -2869,26 +2824,26 @@ function Wa() {
2869
2824
  next_rising: t.attributes?.next_rising,
2870
2825
  next_setting: t.attributes?.next_setting
2871
2826
  } : void 0;
2872
- return Ra(n, n ? /* @__PURE__ */ new Date() : za());
2827
+ return La(n, n ? /* @__PURE__ */ new Date() : Ra());
2873
2828
  });
2874
2829
  }
2875
2830
  //#endregion
2876
2831
  //#region src/framework/hooks/use-reduced-motion.ts
2877
- function Ga() {
2832
+ function Wa() {
2878
2833
  if (typeof window > "u" || typeof window.matchMedia != "function") return () => !1;
2879
2834
  let e = window.matchMedia("(prefers-reduced-motion: reduce)"), [t, n] = k(e.matches), r = (e) => n(e.matches);
2880
2835
  return e.addEventListener("change", r), A(() => e.removeEventListener("change", r)), t;
2881
2836
  }
2882
2837
  //#endregion
2883
2838
  //#region src/framework/hooks/use-widget-entity-group.ts
2884
- function Ka(e) {
2839
+ function Ga(e) {
2885
2840
  let t = e.minEntities ?? 1, n = O(() => e.entities().length), r = O(() => n() >= t), i = O(() => !r() || !e.calculateGroupData ? null : e.calculateGroupData(e.entities())), a = O(() => {
2886
2841
  if (!r()) return;
2887
2842
  let t = e.aggregationMode?.();
2888
2843
  if (!t || t === "none") return;
2889
2844
  let n = e.entities();
2890
- if (t === "light" || t === "binary-sensor" || t === "switch") return Ar(n, e.allEntitiesMode);
2891
- if (t === "sensor") return jr(n, e.sensorGroupType?.() ?? "mean", !0);
2845
+ if (t === "light" || t === "binary-sensor" || t === "switch") return kr(n, e.allEntitiesMode);
2846
+ if (t === "sensor") return Ar(n, e.sensorGroupType?.() ?? "mean", !0);
2892
2847
  }), o = O(() => r() ? void 0 : e.emptyStateConfig);
2893
2848
  return {
2894
2849
  entities: e.entities,
@@ -2901,7 +2856,7 @@ function Ka(e) {
2901
2856
  }
2902
2857
  //#endregion
2903
2858
  //#region src/framework/theming/svg-colors.ts
2904
- var qa = {
2859
+ var Ka = {
2905
2860
  solar: "oklch(0.74 0.18 60)",
2906
2861
  grid: "oklch(0.62 0.12 245)",
2907
2862
  battery: "oklch(0.70 0.18 145)",
@@ -2910,21 +2865,21 @@ var qa = {
2910
2865
  positive: "oklch(0.70 0.14 160)",
2911
2866
  negative: "oklch(0.64 0.22 27)"
2912
2867
  };
2913
- function Ja(e) {
2868
+ function qa(e) {
2914
2869
  return {
2915
2870
  fill: `color-mix(in oklch, ${e} 20%, transparent)`,
2916
2871
  stroke: e,
2917
2872
  solid: e
2918
2873
  };
2919
2874
  }
2920
- var Ya = Object.fromEntries(Object.entries(qa).map(([e, t]) => [e, Ja(t)])), Xa = o.enum([
2875
+ var Ja = Object.fromEntries(Object.entries(Ka).map(([e, t]) => [e, qa(t)])), Ya = o.enum([
2921
2876
  "success",
2922
2877
  "warning",
2923
2878
  "danger",
2924
2879
  "info",
2925
2880
  "neutral",
2926
2881
  "accent"
2927
- ]), Za = {
2882
+ ]), Xa = {
2928
2883
  title: e(() => o.string().optional().meta({
2929
2884
  title: "Title",
2930
2885
  description: "Optional display name override"
@@ -2944,38 +2899,38 @@ var Ya = Object.fromEntries(Object.entries(qa).map(([e, t]) => [e, Ja(t)])), Xa
2944
2899
  formType: "area-picker",
2945
2900
  title: "Area"
2946
2901
  }), "widgetFields.areaId")
2947
- }, Qa = 24;
2902
+ }, Za = 24;
2948
2903
  function $(e) {
2949
2904
  let t = {};
2950
2905
  for (let [n, r] of Object.entries(e)) r !== void 0 && (t[n] = r);
2951
2906
  return t;
2952
2907
  }
2953
- function $a() {
2908
+ function Qa() {
2954
2909
  return o.string().optional().meta({
2955
2910
  title: "Title",
2956
2911
  description: "Optional display name override"
2957
2912
  });
2958
2913
  }
2959
- function eo(e) {
2914
+ function $a(e) {
2960
2915
  return (e.default === void 0 ? o.string().optional() : o.string().default(e.default)).meta($({
2961
2916
  title: e.title,
2962
2917
  description: e.description
2963
2918
  }));
2964
2919
  }
2965
- function to(e) {
2920
+ function eo(e) {
2966
2921
  let t = o.number();
2967
2922
  return e.min !== void 0 && (t = t.min(e.min)), e.max !== void 0 && (t = t.max(e.max)), (e.default === void 0 ? t.optional() : t.default(e.default)).meta($({
2968
2923
  title: e.title,
2969
2924
  description: e.description
2970
2925
  }));
2971
2926
  }
2972
- function no(e) {
2927
+ function to(e) {
2973
2928
  return o.boolean().default(e.default ?? !1).meta($({
2974
2929
  title: e.title,
2975
2930
  description: e.description
2976
2931
  }));
2977
2932
  }
2978
- function ro(e, t) {
2933
+ function no(e, t) {
2979
2934
  let n = o.enum(e);
2980
2935
  return (t.default === void 0 ? n.optional() : n.default(t.default)).meta($({
2981
2936
  title: t.title,
@@ -2984,14 +2939,14 @@ function ro(e, t) {
2984
2939
  icons: t.icons
2985
2940
  }));
2986
2941
  }
2987
- function io(e, t) {
2942
+ function ro(e, t) {
2988
2943
  return o.array(o.enum(e)).default([...t.default ?? []]).meta($({
2989
2944
  title: t.title,
2990
2945
  description: t.description,
2991
2946
  labels: t.labels
2992
2947
  }));
2993
2948
  }
2994
- function ao(e, t) {
2949
+ function io(e, t) {
2995
2950
  return o.array(o.string()).default([]).meta($({
2996
2951
  domain: e,
2997
2952
  title: t?.title ?? "Entities",
@@ -2999,7 +2954,7 @@ function ao(e, t) {
2999
2954
  deviceClass: t?.deviceClass
3000
2955
  }));
3001
2956
  }
3002
- function oo(e, t) {
2957
+ function ao(e, t) {
3003
2958
  return o.array(o.string()).default([]).meta($({
3004
2959
  domain: e,
3005
2960
  title: t?.title ?? "Entity",
@@ -3008,13 +2963,13 @@ function oo(e, t) {
3008
2963
  singleSelect: !0
3009
2964
  }));
3010
2965
  }
3011
- function so(e) {
2966
+ function oo(e) {
3012
2967
  return o.string().optional().meta({
3013
2968
  formType: "area-picker",
3014
2969
  title: e?.title ?? "Area"
3015
2970
  });
3016
2971
  }
3017
- function co(e) {
2972
+ function so(e) {
3018
2973
  let t = o.string().meta($({
3019
2974
  formType: "icon-picker",
3020
2975
  title: e?.title ?? "Icon",
@@ -3022,7 +2977,7 @@ function co(e) {
3022
2977
  }));
3023
2978
  return e?.default === void 0 ? t.optional() : t.default(e.default);
3024
2979
  }
3025
- function lo(e) {
2980
+ function co(e) {
3026
2981
  let t = e?.presets && Object.fromEntries(Object.entries(e.presets).map(([e, t]) => [e, {
3027
2982
  label: t.label,
3028
2983
  thumb: t.thumb
@@ -3034,36 +2989,36 @@ function lo(e) {
3034
2989
  }));
3035
2990
  return e?.default === void 0 ? n.optional() : n.default(e.default);
3036
2991
  }
3037
- function uo(e) {
2992
+ function lo(e) {
3038
2993
  return o.array(o.string()).default([]).meta($({
3039
2994
  title: e.title,
3040
2995
  description: e.description
3041
2996
  }));
3042
2997
  }
3043
- function fo(e, t) {
2998
+ function uo(e, t) {
3044
2999
  let n = o.object(e);
3045
- return n.default(Xt(n)).meta({ title: t.title });
3000
+ return n.default($t(n)).meta({ title: t.title });
3046
3001
  }
3047
- function po(e) {
3002
+ function fo(e) {
3048
3003
  return e.def;
3049
3004
  }
3050
- function mo(e) {
3005
+ function po(e) {
3051
3006
  if (o.globalRegistry.get(e)?.formType === "list") return !0;
3052
- let t = po(e);
3053
- return t.shape ? Object.values(t.shape).some(mo) : t.options ? t.options.some(mo) : t.element ? mo(t.element) : t.innerType ? mo(t.innerType) : !1;
3007
+ let t = fo(e);
3008
+ return t.shape ? Object.values(t.shape).some(po) : t.options ? t.options.some(po) : t.element ? po(t.element) : t.innerType ? po(t.innerType) : !1;
3054
3009
  }
3055
- function ho(e) {
3056
- let t = e, n = po(t).innerType;
3057
- for (; n;) t = n, n = po(t).innerType;
3010
+ function mo(e) {
3011
+ let t = e, n = fo(t).innerType;
3012
+ for (; n;) t = n, n = fo(t).innerType;
3058
3013
  return t;
3059
3014
  }
3060
- function go(e) {
3061
- let t = po(ho(e));
3015
+ function ho(e) {
3016
+ let t = fo(mo(e));
3062
3017
  if (t.shape) return new Set(Object.keys(t.shape));
3063
3018
  if (t.options) {
3064
3019
  let e = [];
3065
3020
  for (let n of t.options) {
3066
- let t = go(n);
3021
+ let t = ho(n);
3067
3022
  if (!t) return null;
3068
3023
  e.push(t);
3069
3024
  }
@@ -3075,7 +3030,7 @@ function go(e) {
3075
3030
  }
3076
3031
  return null;
3077
3032
  }
3078
- function _o(e, t, n) {
3033
+ function go(e, t, n) {
3079
3034
  let r = { [t]: n };
3080
3035
  try {
3081
3036
  return e.parse(r);
@@ -3083,12 +3038,12 @@ function _o(e, t, n) {
3083
3038
  return r;
3084
3039
  }
3085
3040
  }
3086
- function vo(e, t) {
3041
+ function _o(e, t) {
3087
3042
  if (!Number.isInteger(t.max) || t.max < 1) throw Error(`field.list: max must be a positive integer, got ${t.max}`);
3088
- if (t.max > Qa) throw Error(`field.list: max ${t.max} exceeds the ceiling of ${Qa}`);
3043
+ if (t.max > Za) throw Error(`field.list: max ${t.max} exceeds the ceiling of ${Za}`);
3089
3044
  if (t.min !== void 0 && (!Number.isInteger(t.min) || t.min < 0 || t.min > t.max)) throw Error(`field.list: min must be an integer between 0 and max, got ${t.min}`);
3090
- if (mo(e)) throw Error("field.list: a list item cannot contain another field.list (depth 1 only)");
3091
- if (t.labelField !== void 0 && !go(e)?.has(t.labelField)) throw Error(`field.list: labelField "${t.labelField}" must name a field present in every item`);
3045
+ if (po(e)) throw Error("field.list: a list item cannot contain another field.list (depth 1 only)");
3046
+ if (t.labelField !== void 0 && !ho(e)?.has(t.labelField)) throw Error(`field.list: labelField "${t.labelField}" must name a field present in every item`);
3092
3047
  let n = o.array(e);
3093
3048
  return t.min !== void 0 && (n = n.min(t.min)), n = n.max(t.max), n.default([]).meta($({
3094
3049
  formType: "list",
@@ -3098,7 +3053,7 @@ function vo(e, t) {
3098
3053
  labelField: t.labelField
3099
3054
  }));
3100
3055
  }
3101
- function yo(e, t, n) {
3056
+ function vo(e, t, n) {
3102
3057
  let r = Object.keys(t)[0];
3103
3058
  if (r === void 0) throw Error("field.variants: at least one variant is required");
3104
3059
  if (n.shared && e in n.shared) throw Error(`field.variants: shared fields cannot redefine the discriminator "${e}"`);
@@ -3111,7 +3066,7 @@ function yo(e, t, n) {
3111
3066
  ...r,
3112
3067
  [e]: o.literal(t)
3113
3068
  })), a = o.discriminatedUnion(e, i), s = i[0];
3114
- return a.default(s ? _o(s, e, r) : {}).meta($({
3069
+ return a.default(s ? go(s, e, r) : {}).meta($({
3115
3070
  formType: "variants",
3116
3071
  discriminator: e,
3117
3072
  title: n.title,
@@ -3119,35 +3074,35 @@ function yo(e, t, n) {
3119
3074
  labels: n.labels
3120
3075
  }));
3121
3076
  }
3122
- var bo = {
3123
- title: $a,
3124
- text: eo,
3125
- number: to,
3126
- toggle: no,
3127
- choice: ro,
3128
- choices: io,
3129
- entities: ao,
3130
- entity: oo,
3131
- area: so,
3132
- icon: co,
3133
- image: lo,
3134
- stringList: uo,
3135
- group: fo,
3136
- list: vo,
3137
- variants: yo
3077
+ var yo = {
3078
+ title: Qa,
3079
+ text: $a,
3080
+ number: eo,
3081
+ toggle: to,
3082
+ choice: no,
3083
+ choices: ro,
3084
+ entities: io,
3085
+ entity: ao,
3086
+ area: oo,
3087
+ icon: so,
3088
+ image: co,
3089
+ stringList: lo,
3090
+ group: uo,
3091
+ list: _o,
3092
+ variants: vo
3138
3093
  };
3139
- function xo(e) {
3094
+ function bo(e) {
3140
3095
  return o.object(e);
3141
3096
  }
3142
3097
  //#endregion
3143
3098
  //#region src/framework/image-src.ts
3144
- function So(e, t) {
3145
- let n = Bt(e);
3146
- return n === void 0 ? Ht(e) : t?.[n]?.src;
3099
+ function xo(e, t) {
3100
+ let n = Vt(e);
3101
+ return n === void 0 ? Ut(e) : t?.[n]?.src;
3147
3102
  }
3148
3103
  //#endregion
3149
3104
  //#region src/shared/spline.ts
3150
- function Co(e) {
3105
+ function So(e) {
3151
3106
  if (e.length < 2) return "";
3152
3107
  let t = e[0], n = e[1];
3153
3108
  if (!t || !n) return "";
@@ -3174,14 +3129,14 @@ function Co(e) {
3174
3129
  }
3175
3130
  //#endregion
3176
3131
  //#region src/theme.ts
3177
- function wo() {
3132
+ function Co() {
3178
3133
  return document.documentElement.classList.contains("dark");
3179
3134
  }
3180
3135
  //#endregion
3181
3136
  //#region src/version.ts
3182
- var To = {
3137
+ var wo = {
3183
3138
  name: "@glasshome/widget-sdk",
3184
- version: "1.22.1",
3139
+ version: "1.23.0",
3185
3140
  description: "SDK for building GlassHome dashboard widgets with SolidJS",
3186
3141
  keywords: [
3187
3142
  "dashboard",
@@ -3252,7 +3207,7 @@ var To = {
3252
3207
  lint: "oxlint --type-aware . && oxfmt --check ."
3253
3208
  },
3254
3209
  dependencies: {
3255
- "@glasshome/widget-contract": "0.3.0",
3210
+ "@glasshome/widget-contract": "0.4.0",
3256
3211
  "@tailwindcss/vite": "^4.1.13",
3257
3212
  clsx: "^2.1.1",
3258
3213
  "happy-dom": "^20.0.0",
@@ -3262,7 +3217,7 @@ var To = {
3262
3217
  zod: "^4.1.13"
3263
3218
  },
3264
3219
  devDependencies: {
3265
- "@glasshome/ui": "1.28.0",
3220
+ "@glasshome/ui": "1.33.0",
3266
3221
  "@solidjs/testing-library": "^0.8.10",
3267
3222
  "@types/bun": "^1.4.0",
3268
3223
  "@types/node": "^25.2.2",
@@ -3277,10 +3232,10 @@ var To = {
3277
3232
  },
3278
3233
  peerDependencies: {
3279
3234
  "@glasshome/sync-layer": "0.9.1",
3280
- "@glasshome/ui": "1.28.0",
3235
+ "@glasshome/ui": "1.30.0",
3281
3236
  "solid-js": "^1.9.11"
3282
3237
  },
3283
3238
  engines: { node: ">=18" }
3284
3239
  }.version;
3285
3240
  //#endregion
3286
- export { Ce as Badge, Te as Button, De as ButtonGroup, ke as Carousel, Ae as CarouselContent, je as CarouselDots, Me as CarouselItem, Ne as CarouselNext, Pe as CarouselPrevious, Fe as ColorDisc, Ie as ColorSlider, Le as ColorWheel, Re as CountPill, Je as Icon, Ye as Input, Xe as Label, Ti as PanelEntityRow, hi as PanelFacts, mi as PanelRow, pi as PanelRows, fi as PanelSection, $e as Progress, et as ResponsiveDialog, tt as ResponsiveDialogBody, rt as ResponsiveDialogClose, it as ResponsiveDialogContent, at as ResponsiveDialogDescription, ot as ResponsiveDialogFooter, ct as ResponsiveDialogHeader, lt as ResponsiveDialogTitle, To as SDK_VERSION, ut as SchemaForm, dt as SectionIcon, ht as SectionTitle, gt as Select, _t as SelectContent, vt as SelectItem, yt as SelectTrigger, bt as SelectValue, xt as Slider, St as SwatchPicker, Ct as Switch, wt as Tabs, Et as TabsContent, Ot as TabsList, At as TabsTrigger, Mt as TemperatureBar, Nt as Toggle, Pt as ToggleGroup, It as ToggleGroupItem, Xa as ToneSchema, Y as Widget, nr as WidgetAction, ar as WidgetBackdrop, rr as WidgetChip, tr as WidgetChoice, br as WidgetContent, $n as WidgetControls, W as WidgetCtx, Ji as WidgetDebugTab, Ki as WidgetDebugView, ca as WidgetDialog, or as WidgetGlyph, Zn as WidgetHead, Qn as WidgetHero, Ln as WidgetIcon, ir as WidgetLayer, r as WidgetManifestSchema, An as WidgetSizeCtx, _r as WidgetSliderFill, Sr as WidgetStatus, er as WidgetStepper, Tr as WidgetTitle, Vr as WidgetValue, ji as buildDebugData, g as byDomain, Ar as calculateLightGroup, jr as calculateSensorGroup, Er as copyText, Ir as countActiveEntities, xo as defineConfig, Zt as defineWidget, t as deprecations, bo as field, n as formatDeprecation, i as formatSchemaError, Fr as getEntityAttribute, s as getForecasts, c as getStream, l as getWebRtcClientConfig, u as hassMediaUrl, zt as imagePreset, So as imageSrc, Vt as imageUrl, fr as injectTokens, wo as isDark, Pr as isEntityActive, wi as isPanelControllable, Ut as mediaUrl, Co as monotoneCubicPath, Wt as parseColor, Gt as presetValue, d as sendWebRtcCandidate, f as startWebRtcSession, p as state, Ya as svgColors, m as trackEntityHistory, h as untrackEntityHistory, _ as useArea, v as useCalendarEvents, y as useCamera, Nn as useConfirm, b as useConnection, kr as useCopyText, x as useCurrency, Wa as useDaylight, S as useEntities, ee as useEntity, w as useEntityHistory, te as useEntityStatistics, ne as useForecast, re as useHassConfig, Ma as useIntersectionPause, ie as useLocale, ja as useMaterial, Ga as useReducedMotion, tn as useService, oe as useStore, se as useTemperatureUnit, an as useToggle, rn as useTurnOff, nn as useTurnOn, de as useUnitSystem, Qt as useWidgetContext, da as useWidgetDashboard, sn as useWidgetDialog, jn as useWidgetDimensions, Ka as useWidgetEntityGroup, kn as useWidgetGestures, pa as useWidgetViewer, Za as widgetFields, a as z };
3241
+ export { Se as Badge, we as Button, Ee as ButtonGroup, Oe as Carousel, ke as CarouselContent, Ae as CarouselDots, je as CarouselItem, Me as CarouselNext, Ne as CarouselPrevious, Pe as ColorDisc, Fe as ColorSlider, Ie as ColorWheel, Le as CountPill, Je as Icon, Ye as Input, Xe as Label, wi as PanelEntityRow, mi as PanelFacts, pi as PanelRow, fi as PanelRows, di as PanelSection, $e as Progress, et as ResponsiveDialog, tt as ResponsiveDialogBody, rt as ResponsiveDialogClose, it as ResponsiveDialogContent, at as ResponsiveDialogDescription, ot as ResponsiveDialogFooter, ct as ResponsiveDialogHeader, lt as ResponsiveDialogTitle, wo as SDK_VERSION, ut as SchemaForm, dt as SectionIcon, ht as SectionTitle, gt as Select, _t as SelectContent, vt as SelectItem, yt as SelectTrigger, bt as SelectValue, xt as Slider, St as SwatchPicker, Ct as Switch, wt as Tabs, Et as TabsContent, Ot as TabsList, At as TabsTrigger, Mt as TemperatureBar, Nt as Toggle, Pt as ToggleGroup, It as ToggleGroupItem, Ya as ToneSchema, Y as Widget, ar as WidgetAction, cr as WidgetBackdrop, or as WidgetChip, ir as WidgetChoice, Cr as WidgetContent, nr as WidgetControls, W as WidgetCtx, qi as WidgetDebugTab, Gi as WidgetDebugView, sa as WidgetDialog, lr as WidgetGlyph, er as WidgetHead, tr as WidgetHero, Bn as WidgetIcon, sr as WidgetLayer, r as WidgetManifestSchema, Nn as WidgetSizeCtx, br as WidgetSliderFill, Tr as WidgetStatus, rr as WidgetStepper, Or as WidgetTitle, Br as WidgetValue, Ai as buildDebugData, g as byDomain, kr as calculateLightGroup, Ar as calculateSensorGroup, zt as copyText, Fr as countActiveEntities, bo as defineConfig, en as defineWidget, t as deprecations, yo as field, n as formatDeprecation, i as formatSchemaError, Pr as getEntityAttribute, s as getForecasts, c as getStream, l as getWebRtcClientConfig, u as hassMediaUrl, Bt as imagePreset, xo as imageSrc, Ht as imageUrl, hr as injectTokens, Co as isDark, Nr as isEntityActive, Ci as isPanelControllable, Wt as mediaUrl, So as monotoneCubicPath, Gt as parseColor, Kt as presetValue, d as sendWebRtcCandidate, f as startWebRtcSession, p as state, Ja as svgColors, m as trackEntityHistory, h as untrackEntityHistory, _ as useArea, v as useCalendarEvents, y as useCamera, In as useConfirm, b as useConnection, Jt as useCopyText, x as useCurrency, Ua as useDaylight, S as useEntities, ee as useEntity, w as useEntityHistory, te as useEntityStatistics, ne as useForecast, re as useHassConfig, ja as useIntersectionPause, ie as useLocale, Aa as useMaterial, Wa as useReducedMotion, an as useService, oe as useStore, se as useTemperatureUnit, cn as useToggle, sn as useTurnOff, on as useTurnOn, de as useUnitSystem, tn as useWidgetContext, ua as useWidgetDashboard, un as useWidgetDialog, Pn as useWidgetDimensions, Ga as useWidgetEntityGroup, Mn as useWidgetGestures, fa as useWidgetViewer, Xa as widgetFields, a as z };