@glasshome/widget-sdk 1.27.0 → 1.28.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
@@ -2,14 +2,14 @@ import { deprecate as e, deprecations as t, formatDeprecation as n } from "./dep
2
2
  import { WidgetManifestSchema as r, formatSchemaError as i } from "./schemas.js";
3
3
  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
- 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 te, useEntityHistory as C, useEntityStatistics as w, 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
- 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 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";
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 te, useEntityHistory as ne, useEntityStatistics as C, useForecast as re, useHassConfig as ie, useLocale as ae, useService as oe, useStore as se, useTemperatureUnit as ce, useToggle as le, useTurnOff as ue, useTurnOn as de, useUnitSystem as fe } from "@glasshome/sync-layer/solid";
6
+ import { For as w, Show as T, children as E, createContext as pe, createEffect as D, createMemo as O, createSignal as k, on as me, onCleanup as A, onMount as he, splitProps as ge, untrack as _e, useContext as j } from "solid-js";
7
+ import { addEventListener as ve, className as M, createComponent as N, delegateEvents as ye, effect as P, insert as F, memo as I, setAttribute as L, setStyleProperty as R, style as z, template as B, use as be } from "solid-js/web";
8
+ import { Accordion as xe, AccordionContent as Se, AccordionItem as Ce, AccordionTrigger as we, Badge as Te, Badge as Ee, Button as De, Button as Oe, ButtonGroup as ke, ButtonGroup as Ae, Carousel as je, CarouselContent as Me, CarouselDots as Ne, CarouselItem as Pe, CarouselNext as Fe, CarouselPrevious as Ie, ColorDisc as Le, ColorSlider as Re, ColorWheel as ze, CountPill as Be, CountPill as Ve, Empty as He, EmptyDescription as Ue, EmptyHeader as We, EmptyTitle as Ge, FactRow as V, FieldGroup as Ke, FieldTitle as qe, HOLD_GRACE_MS as Je, HOLD_MS as Ye, Icon as Xe, Icon as H, Input as Ze, Label as Qe, Popover as $e, PopoverContent as et, Progress as tt, ResponsiveDialog as nt, ResponsiveDialogBody as rt, ResponsiveDialogBody as it, ResponsiveDialogClose as at, ResponsiveDialogContent as ot, ResponsiveDialogDescription as st, ResponsiveDialogFooter as ct, ResponsiveDialogFooter as lt, ResponsiveDialogHeader as ut, ResponsiveDialogTitle as dt, SchemaForm as ft, SectionIcon as pt, SectionIcon as mt, SectionMeta as ht, SectionRow as gt, SectionTitle as _t, Select as vt, SelectContent as yt, SelectItem as bt, SelectTrigger as xt, SelectValue as St, Slider as Ct, SwatchPicker as wt, Switch as Tt, Tabs as Et, Tabs as Dt, TabsContent as Ot, TabsContent as kt, TabsList as At, TabsList as jt, TabsTrigger as Mt, TabsTrigger as Nt, TemperatureBar as Pt, Toggle as Ft, ToggleGroup as It, ToggleGroup as Lt, ToggleGroupItem as Rt, ToggleGroupItem as zt, buttonVariants as Bt, copyText as Vt, imagePreset as Ht, imagePreset as Ut, imageUrl as Wt, imageUrl as Gt, mediaUrl as Kt, parseColor as qt, presetValue as Jt, spendLongPress as Yt, useCopyText as Xt, useCopyText as Zt } from "@glasshome/ui/solid";
9
+ import { clsx as Qt } from "clsx";
10
+ import { twMerge as $t } from "tailwind-merge";
11
11
  //#region src/framework/to-form-schema.ts
12
- function Qt(e) {
12
+ function en(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 Qt(e) {
18
18
  } : e.jsonSchema;
19
19
  } });
20
20
  }
21
- function $t(e) {
21
+ function tn(e) {
22
22
  try {
23
23
  return e.parse({});
24
24
  } catch {
@@ -27,62 +27,62 @@ function $t(e) {
27
27
  }
28
28
  //#endregion
29
29
  //#region src/define-widget.ts
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;
30
+ function nn(e) {
31
+ return e.configSchema && (e.manifest.schema || (e.manifest.schema = en(e.configSchema)), e.manifest.defaultConfig || (e.manifest.defaultConfig = tn(e.configSchema))), e;
32
32
  }
33
33
  //#endregion
34
34
  //#region src/framework/hooks/use-widget-context.ts
35
- var W = pe();
36
- function tn() {
37
- let e = j(W);
35
+ var U = pe();
36
+ function rn() {
37
+ let e = j(U);
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 nn(e) {
43
+ function an(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 rn(e, t) {
48
+ function W(e, t) {
49
49
  return async (n, r = {}) => {
50
- await e(nn(n), t, r, { entity_id: n });
50
+ await e(an(n), t, r, { entity_id: n });
51
51
  };
52
52
  }
53
- function an() {
54
- let e = j(W)?.callService;
53
+ function on() {
54
+ let e = j(U)?.callService;
55
55
  return e ? {
56
56
  callService: e,
57
- turnOn: rn(e, "turn_on"),
58
- turnOff: rn(e, "turn_off"),
59
- toggle: rn(e, "toggle")
60
- } : ae();
61
- }
62
- function on() {
63
- let e = j(W)?.callService;
64
- return e ? rn(e, "turn_on") : ue();
57
+ turnOn: W(e, "turn_on"),
58
+ turnOff: W(e, "turn_off"),
59
+ toggle: W(e, "toggle")
60
+ } : oe();
65
61
  }
66
62
  function sn() {
67
- let e = j(W)?.callService;
68
- return e ? rn(e, "turn_off") : le();
63
+ let e = j(U)?.callService;
64
+ return e ? W(e, "turn_on") : de();
69
65
  }
70
66
  function cn() {
71
- let e = j(W)?.callService;
72
- return e ? rn(e, "toggle") : ce();
67
+ let e = j(U)?.callService;
68
+ return e ? W(e, "turn_off") : ue();
69
+ }
70
+ function ln() {
71
+ let e = j(U)?.callService;
72
+ return e ? W(e, "toggle") : le();
73
73
  }
74
74
  //#endregion
75
75
  //#region src/framework/design-system/z-index.ts
76
- var ln = {
76
+ var un = {
77
77
  BACKGROUND: 0,
78
78
  CONTENT: 10,
79
79
  OVERLAY: 20,
80
80
  ACTIONS: 30
81
81
  }, G = /* @__PURE__ */ new WeakMap();
82
- function un(e = "controls") {
82
+ function dn(e = "controls") {
83
83
  let [t, n] = k(!1), [r, i] = k(e), a = (t) => {
84
84
  i(t ?? e), n(!0);
85
- }, o = j(W);
85
+ }, o = j(U);
86
86
  return o?.registerDialogOpener?.(a), o && G.set(o, a), A(() => {
87
87
  o?.registerDialogOpener?.(null), o && G.get(o) === a && G.delete(o);
88
88
  }), {
@@ -106,13 +106,13 @@ function un(e = "controls") {
106
106
  }
107
107
  //#endregion
108
108
  //#region src/framework/hooks/widget-registry.ts
109
- var dn = /* @__PURE__ */ new WeakMap(), fn = Symbol("glasshome.widget.registry");
110
- function pn(e) {
111
- return e[fn] ?? e;
112
- }
109
+ var fn = /* @__PURE__ */ new WeakMap(), pn = Symbol("glasshome.widget.registry");
113
110
  function mn(e) {
111
+ return e[pn] ?? e;
112
+ }
113
+ function hn(e) {
114
114
  if (!e) return;
115
- let t = pn(e), n = dn.get(t);
115
+ let t = mn(e), n = fn.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 mn(e) {
126
126
  setIcon: l,
127
127
  nothingMore: u,
128
128
  setNothingMore: d
129
- }, dn.set(t, n);
129
+ }, fn.set(t, n);
130
130
  }
131
131
  return n;
132
132
  }
133
133
  //#endregion
134
134
  //#region src/framework/gestures/cursors.ts
135
- var hn = 32, K = hn / 2, q = "white", gn = "rgba(0,0,0,0.4)", _n = 2, vn = 3;
136
- function yn(e) {
135
+ var gn = 32, K = gn / 2, q = "white", _n = "rgba(0,0,0,0.4)", vn = 2, yn = 3;
136
+ function bn(e) {
137
137
  return `url("data:image/svg+xml,${encodeURIComponent(e)}")`;
138
138
  }
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>`;
139
+ function xn(e) {
140
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${gn}" height="${gn}" viewBox="0 0 ${gn} ${gn}">${e}</svg>`;
141
141
  }
142
- var xn = bn(`
142
+ var Sn = xn(`
143
143
  <g transform="translate(6, 2)">
144
144
  <!-- shadow -->
145
- <g stroke="${gn}" stroke-width="${vn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
145
+ <g stroke="${_n}" stroke-width="${yn}" 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="${_n}" fill="none" stroke-linecap="round" stroke-linejoin="round">
149
+ <g stroke="${q}" stroke-width="${vn}" 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
- `), Sn = bn(`
153
+ `), Cn = xn(`
154
154
  <g>
155
- <circle cx="${K}" cy="${K}" r="8" stroke="${gn}" stroke-width="${vn}" fill="none"/>
155
+ <circle cx="${K}" cy="${K}" r="8" stroke="${_n}" stroke-width="${yn}" 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
- `), Cn = bn(`
159
+ `), wn = xn(`
160
160
  <g>
161
161
  <!-- shadow -->
162
- <g stroke="${gn}" stroke-width="${vn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
162
+ <g stroke="${_n}" stroke-width="${yn}" 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="${_n}" fill="none" stroke-linecap="round" stroke-linejoin="round">
168
+ <g stroke="${q}" stroke-width="${vn}" 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 xn = bn(`
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
- `), wn = bn(`
178
+ `), Tn = xn(`
179
179
  <g>
180
180
  <!-- shadow -->
181
- <g stroke="${gn}" stroke-width="${vn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
181
+ <g stroke="${_n}" stroke-width="${yn}" 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="${_n}" fill="none" stroke-linecap="round" stroke-linejoin="round">
187
+ <g stroke="${q}" stroke-width="${vn}" 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 xn = bn(`
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
- `), Tn = bn(`
197
+ `), En = xn(`
198
198
  <g>
199
199
  <!-- shadow -->
200
- <g stroke="${gn}" stroke-width="${vn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
200
+ <g stroke="${_n}" stroke-width="${yn}" 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 xn = bn(`
206
206
  <polyline points="13,21 ${K},25 19,21"/>
207
207
  </g>
208
208
  <!-- main -->
209
- <g stroke="${q}" stroke-width="${_n}" fill="none" stroke-linecap="round" stroke-linejoin="round">
209
+ <g stroke="${q}" stroke-width="${vn}" 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,53 +218,53 @@ var xn = bn(`
218
218
  <circle cx="${K}" cy="${K}" r="2" fill="${q}"/>
219
219
  </g>
220
220
  `);
221
- function En(e, t, n) {
221
+ function Dn(e, t, n) {
222
222
  return {
223
- css: `${yn(e)} ${t} ${n}, auto`,
223
+ css: `${bn(e)} ${t} ${n}, auto`,
224
224
  hotspotX: t,
225
225
  hotspotY: n
226
226
  };
227
227
  }
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)
228
+ var On = {
229
+ tap: Dn(Sn, 12, 4),
230
+ hold: Dn(Cn, 16, 16),
231
+ slideHorizontal: Dn(wn, K, K),
232
+ slideVertical: Dn(Tn, K, K),
233
+ slideAuto: Dn(En, K, K)
234
234
  };
235
235
  //#endregion
236
236
  //#region src/framework/gestures/haptics.ts
237
- function On() {
237
+ function kn() {
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 kn(e) {
242
+ function An(e) {
243
243
  if (typeof navigator < "u" && typeof navigator.vibrate == "function") try {
244
244
  navigator.vibrate(e);
245
245
  } catch {}
246
246
  }
247
- var An = {
247
+ var jn = {
248
248
  tick() {
249
- let e = On();
250
- e ? e.impact({ style: "Light" }).catch(() => {}) : kn(8);
249
+ let e = kn();
250
+ e ? e.impact({ style: "Light" }).catch(() => {}) : An(8);
251
251
  },
252
252
  bump() {
253
- let e = On();
254
- e ? e.impact({ style: "Medium" }).catch(() => {}) : kn(20);
253
+ let e = kn();
254
+ e ? e.impact({ style: "Medium" }).catch(() => {}) : An(20);
255
255
  },
256
256
  pulse() {
257
- let e = On();
258
- e ? e.impact({ style: "Heavy" }).catch(() => {}) : kn([
257
+ let e = kn();
258
+ e ? e.impact({ style: "Heavy" }).catch(() => {}) : An([
259
259
  0,
260
260
  15,
261
261
  40,
262
262
  15
263
263
  ]);
264
264
  }
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 = () => {
265
+ }, Mn = "button, a, input, select, textarea, [role=\"slider\"], [role=\"radio\"], [role=\"switch\"]";
266
+ function Nn(e, t) {
267
+ let n = j(U), r = hn(n), i = () => {
268
268
  let t = e();
269
269
  return t.hold || !n ? t : {
270
270
  ...t,
@@ -281,7 +281,8 @@ function Mn(e, t) {
281
281
  holdOnly: !1,
282
282
  holdTimer: null,
283
283
  graceTimer: null,
284
- element: null
284
+ element: null,
285
+ startValue: void 0
285
286
  }, [o, s] = k(null), c = null, l = null, u = null, [d, f] = k(null);
286
287
  function p(e) {
287
288
  e !== l && (u && u.disconnect(), u = new ResizeObserver((e) => {
@@ -312,15 +313,16 @@ function Mn(e, t) {
312
313
  once: !0
313
314
  });
314
315
  }, g = () => {
315
- a.isDown = !1, a.hasMoved = !1, a.sliding = !1, a.holdOnly = !1;
316
+ a.isDown = !1, a.hasMoved = !1, a.sliding = !1, a.holdOnly = !1, a.startValue = void 0;
316
317
  }, _ = (e) => {
317
318
  let n = i().slide;
318
319
  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";
319
320
  }, v = (e) => {
320
- let t = i(), r = e.target instanceof Element ? e.target.closest(`${jn}, .glasshome-widget-controls`) : null, o = r !== null && r !== e.currentTarget;
321
+ if (e.pointerType === "touch" && !e.isPrimary) return;
322
+ let t = i(), r = e.target instanceof Element ? e.target.closest(`${Mn}, .glasshome-widget-controls`) : null, o = r !== null && r !== e.currentTarget;
321
323
  if (!(o ? !t.hold : !t.tap && !t.hold && !t.slide)) {
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) {
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));
324
+ 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, a.startValue = t.slide?.value, t.hold) {
325
+ let r = t.hold.delay ?? Ye, 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));
324
326
  a.graceTimer = setTimeout(() => {
325
327
  a.graceTimer = null, s({
326
328
  x: o,
@@ -328,11 +330,11 @@ function Mn(e, t) {
328
330
  r: l,
329
331
  fired: !1
330
332
  });
331
- }, Math.min(Ke, r)), a.holdTimer = setTimeout(() => {
333
+ }, Math.min(Je, r)), a.holdTimer = setTimeout(() => {
332
334
  a.holdTimer = null, a.isDown && !a.hasMoved && (s((e) => e && {
333
335
  ...e,
334
336
  fired: !0
335
- }), An.bump(), qt(), a.element && h(a.element), t.hold?.action(), n?.onHeld?.(), a.isDown = !1);
337
+ }), jn.bump(), Yt(), a.element && h(a.element), t.hold?.action(), n?.onHeld?.(), a.isDown = !1);
336
338
  }, r);
337
339
  }
338
340
  if (!a.isTouch && t.slide && !o) try {
@@ -353,7 +355,7 @@ function Mn(e, t) {
353
355
  t.slide.onChange(Math.round(m)), a.startX = e.clientX, a.startY = e.clientY, e.preventDefault();
354
356
  }
355
357
  }, b = (e) => {
356
- let t = i(), n = a.isDown, r = Date.now() - a.startTime, o = t.hold?.delay ?? qe;
358
+ let t = i(), n = a.isDown, r = Date.now() - a.startTime, o = t.hold?.delay ?? Ye;
357
359
  m(), n && t.tap && !a.hasMoved && !a.holdOnly && r < o && t.tap();
358
360
  try {
359
361
  e.currentTarget.releasePointerCapture(e.pointerId);
@@ -361,6 +363,8 @@ function Mn(e, t) {
361
363
  g();
362
364
  }, x = (e) => {
363
365
  m();
366
+ let t = i().slide;
367
+ a.sliding && t && a.startValue !== void 0 && t.onChange(a.startValue);
364
368
  try {
365
369
  e.currentTarget.releasePointerCapture(e.pointerId);
366
370
  } catch {}
@@ -369,9 +373,9 @@ function Mn(e, t) {
369
373
  let t = i();
370
374
  if (t.slide) {
371
375
  let n = t.slide.orientation;
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);
376
+ return n === "horizontal" ? On.slideHorizontal.css : n === "vertical" ? On.slideVertical.css : (c || p(e), c && c.height > c.width ? On.slideVertical.css : On.slideHorizontal.css);
373
377
  }
374
- return t.tap ? Dn.tap.css : t.hold ? Dn.hold.css : "";
378
+ return t.tap ? On.tap.css : t.hold ? On.hold.css : "";
375
379
  };
376
380
  return {
377
381
  onKeyDown: (e) => {
@@ -407,16 +411,16 @@ function Mn(e, t) {
407
411
  }
408
412
  //#endregion
409
413
  //#region src/framework/hooks/use-widget-dimensions.ts
410
- var Nn = pe();
411
- function Pn() {
412
- let e = j(Nn);
414
+ var Pn = pe();
415
+ function Fn() {
416
+ let e = j(Pn);
413
417
  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).");
414
418
  return e;
415
419
  }
416
420
  //#endregion
417
421
  //#region src/framework/hooks/use-confirm.ts
418
- var Fn = 1600;
419
- function In() {
422
+ var In = 1600;
423
+ function Ln() {
420
424
  let [e, t] = k(/* @__PURE__ */ new Set()), n;
421
425
  return A(() => clearTimeout(n)), {
422
426
  has: (t) => e().has(t),
@@ -427,39 +431,39 @@ function In() {
427
431
  } catch {
428
432
  return !1;
429
433
  }
430
- return t(new Set(e)), clearTimeout(n), n = setTimeout(() => t(/* @__PURE__ */ new Set()), Fn), !0;
434
+ return t(new Set(e)), clearTimeout(n), n = setTimeout(() => t(/* @__PURE__ */ new Set()), In), !0;
431
435
  }
432
436
  };
433
437
  }
434
438
  //#endregion
435
439
  //#region src/framework/utils/cn.ts
436
440
  function J(...e) {
437
- return Zt(Xt(e));
441
+ return $t(Qt(e));
438
442
  }
439
443
  //#endregion
440
444
  //#region src/framework/components/WidgetIcon.tsx
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) {
445
+ var Rn = /*#__PURE__*/ B("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-2 glass glass-tint\">"), zn = /*#__PURE__*/ B("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-3 glass glass-tint\">"), Bn = /*#__PURE__*/ B("<div><div class=\"glasshome-widget-icon-glyph flex items-center justify-center\">");
446
+ function Vn(e) {
443
447
  let t = () => e.entityCount ?? 1;
444
448
  return (() => {
445
- var n = zn(), r = n.firstChild;
446
- return I(n, P(E, {
449
+ var n = Bn(), r = n.firstChild;
450
+ return F(n, N(T, {
447
451
  get when() {
448
452
  return t() >= 2;
449
453
  },
450
454
  get children() {
451
- return Ln();
455
+ return Rn();
452
456
  }
453
- }), r), I(n, P(E, {
457
+ }), r), F(n, N(T, {
454
458
  get when() {
455
459
  return t() >= 3;
456
460
  },
457
461
  get children() {
458
- return Rn();
462
+ return zn();
459
463
  }
460
- }), r), I(r, () => e.icon), F((t) => {
464
+ }), r), F(r, () => e.icon), P((t) => {
461
465
  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;
462
- return r !== t.e && N(n, t.e = r), t.t = B(n, i, t.t), t;
466
+ return r !== t.e && M(n, t.e = r), t.t = z(n, i, t.t), t;
463
467
  }, {
464
468
  e: void 0,
465
469
  t: void 0
@@ -468,26 +472,26 @@ function Bn(e) {
468
472
  }
469
473
  //#endregion
470
474
  //#region src/framework/components/anatomy.tsx
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));
475
+ var Hn = /*#__PURE__*/ B("<span class=glasshome-widget-eyebrow>"), Un = /*#__PURE__*/ B("<div class=glasshome-widget-head-aside>"), Wn = /*#__PURE__*/ B("<div class=glasshome-widget-head><div class=glasshome-widget-head-text><span class=glasshome-widget-name>"), Gn = /*#__PURE__*/ B("<span class=glasshome-widget-sub>"), Kn = /*#__PURE__*/ B("<span class=glasshome-widget-unit>"), qn = /*#__PURE__*/ B("<div class=glasshome-widget-art>"), Jn = /*#__PURE__*/ B("<div><div class=glasshome-widget-reading><span class=glasshome-widget-reading-value>"), Yn = /*#__PURE__*/ B("<div class=glasshome-widget-controls>"), Xn = /*#__PURE__*/ B("<div>"), Zn = /*#__PURE__*/ B("<div class=glasshome-widget-backdrop>"), Qn = /*#__PURE__*/ B("<div class=glasshome-widget-glyph aria-hidden=true>"), $n = pe(() => !1), er = "mdi:check";
476
+ function tr(e) {
477
+ let t = j($n), n = hn(j(U));
474
478
  D(() => n?.setIcon(e.icon)), A(() => {
475
479
  n?.icon() === e.icon && n?.setIcon(void 0);
476
480
  });
477
- let r = fe(() => e.eyebrow), i = fe(() => e.aside), a = () => {
481
+ let r = E(() => e.eyebrow), i = E(() => e.aside), a = () => {
478
482
  let t = r();
479
483
  return typeof t == "string" && typeof e.name == "string" && t.trim().toLowerCase() === e.name.trim().toLowerCase();
480
484
  };
481
485
  return (() => {
482
- var n = Un(), o = n.firstChild, s = o.firstChild;
483
- return I(n, P(E, {
486
+ var n = Wn(), o = n.firstChild, s = o.firstChild;
487
+ return F(n, N(T, {
484
488
  get when() {
485
489
  return e.icon;
486
490
  },
487
- children: (n) => P(Bn, {
491
+ children: (n) => N(Vn, {
488
492
  get icon() {
489
- return P(U, { get icon() {
490
- return L(() => !!t())() ? $n : n();
493
+ return N(H, { get icon() {
494
+ return I(() => !!t())() ? er : n();
491
495
  } });
492
496
  },
493
497
  get entityCount() {
@@ -498,56 +502,56 @@ function er(e) {
498
502
  },
499
503
  class: "glasshome-widget-head-icon"
500
504
  })
501
- }), o), I(o, P(E, {
505
+ }), o), F(o, N(T, {
502
506
  get when() {
503
- return L(() => !!r())() && !a();
507
+ return I(() => !!r())() && !a();
504
508
  },
505
509
  get children() {
506
- var e = Vn();
507
- return I(e, r), e;
510
+ var e = Hn();
511
+ return F(e, r), e;
508
512
  }
509
- }), s), I(s, () => e.name), I(n, P(E, {
513
+ }), s), F(s, () => e.name), F(n, N(T, {
510
514
  get when() {
511
515
  return i();
512
516
  },
513
517
  get children() {
514
- var e = Hn();
515
- return I(e, i), e;
518
+ var e = Un();
519
+ return F(e, i), e;
516
520
  }
517
521
  }), null), n;
518
522
  })();
519
523
  }
520
- function tr(e) {
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();
524
+ function nr(e) {
525
+ let t = E(() => e.sub), n = E(() => 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();
522
526
  return D(me(r, () => o((e) => e === "a" ? "b" : "a"), { defer: !0 })), (() => {
523
- var r = qn(), o = r.firstChild, s = o.firstChild;
524
- return I(o, P(E, {
527
+ var r = Jn(), o = r.firstChild, s = o.firstChild;
528
+ return F(o, N(T, {
525
529
  get when() {
526
530
  return t();
527
531
  },
528
532
  get children() {
529
- var e = Wn();
530
- return I(e, t), e;
533
+ var e = Gn();
534
+ return F(e, t), e;
531
535
  }
532
- }), s), I(s, () => e.value, null), I(s, P(E, {
536
+ }), s), F(s, () => e.value, null), F(s, N(T, {
533
537
  get when() {
534
538
  return e.unit;
535
539
  },
536
540
  get children() {
537
- var t = Gn();
538
- return I(t, () => e.unit), F(() => R(t, "data-degree", e.unit === "°" || void 0)), t;
541
+ var t = Kn();
542
+ return F(t, () => e.unit), P(() => L(t, "data-degree", e.unit === "°" || void 0)), t;
539
543
  }
540
- }), null), I(r, P(E, {
544
+ }), null), F(r, N(T, {
541
545
  get when() {
542
546
  return n();
543
547
  },
544
548
  get children() {
545
- var e = Kn();
546
- return I(e, n), e;
549
+ var e = qn();
550
+ return F(e, n), e;
547
551
  }
548
- }), null), F((o) => {
552
+ }), null), P((o) => {
549
553
  var c = J("glasshome-widget-hero", e.class), l = n() ? "" : void 0, u = e.value === "" && !t() ? "" : void 0, d = a(), f = i();
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;
554
+ 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;
551
555
  }, {
552
556
  e: void 0,
553
557
  t: void 0,
@@ -557,43 +561,43 @@ function tr(e) {
557
561
  }), r;
558
562
  })();
559
563
  }
560
- function nr(e) {
564
+ function rr(e) {
561
565
  return (() => {
562
- var t = Jn();
563
- return I(t, () => e.children), t;
566
+ var t = Yn();
567
+ return F(t, () => e.children), t;
564
568
  })();
565
569
  }
566
- function rr(e) {
567
- return P(De, {
570
+ function ir(e) {
571
+ return N(Ae, {
568
572
  get "aria-label"() {
569
573
  return e.label;
570
574
  },
571
575
  class: "glasshome-widget-stepper",
572
576
  get children() {
573
- return [P(Te, {
577
+ return [N(Oe, {
574
578
  variant: "outline",
575
579
  size: "icon",
576
580
  "aria-label": "Lower",
577
581
  class: "glasshome-widget-control",
578
582
  onClick: () => e.onStep(-1),
579
583
  get children() {
580
- return P(U, { icon: "mdi:minus" });
584
+ return N(H, { icon: "mdi:minus" });
581
585
  }
582
- }), P(Te, {
586
+ }), N(Oe, {
583
587
  variant: "outline",
584
588
  size: "icon",
585
589
  "aria-label": "Raise",
586
590
  class: "glasshome-widget-control",
587
591
  onClick: () => e.onStep(1),
588
592
  get children() {
589
- return P(U, { icon: "mdi:plus" });
593
+ return N(H, { icon: "mdi:plus" });
590
594
  }
591
595
  })];
592
596
  }
593
597
  });
594
598
  }
595
- function ir(e) {
596
- return P(Ft, {
599
+ function ar(e) {
600
+ return N(Lt, {
597
601
  get "aria-label"() {
598
602
  return e.label;
599
603
  },
@@ -606,11 +610,11 @@ function ir(e) {
606
610
  onChange: (t) => t && e.onChange(t),
607
611
  class: "glasshome-widget-choice",
608
612
  get children() {
609
- return P(T, {
613
+ return N(w, {
610
614
  get each() {
611
615
  return e.options;
612
616
  },
613
- children: (t) => P(Lt, {
617
+ children: (t) => N(zt, {
614
618
  get value() {
615
619
  return t.value;
616
620
  },
@@ -622,7 +626,7 @@ function ir(e) {
622
626
  return t.value === e.value ? void 0 : "";
623
627
  },
624
628
  get children() {
625
- return P(U, { get icon() {
629
+ return N(H, { get icon() {
626
630
  return t.icon;
627
631
  } });
628
632
  }
@@ -631,9 +635,9 @@ function ir(e) {
631
635
  }
632
636
  });
633
637
  }
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, {
638
+ function or(e) {
639
+ let t = Ln(), n = () => e.confirm ?? t, r = () => e.id ?? e["aria-label"] ?? e.icon, i = () => n().has(r());
640
+ return N(Oe, {
637
641
  variant: "outline",
638
642
  get size() {
639
643
  return e.children ? "default" : "icon";
@@ -649,77 +653,77 @@ function ar(e) {
649
653
  },
650
654
  onClick: () => void n().run([r()], e.run),
651
655
  get children() {
652
- return [P(U, { get icon() {
653
- return L(() => !!i())() ? $n : e.icon;
654
- } }), L(() => e.children)];
656
+ return [N(H, { get icon() {
657
+ return I(() => !!i())() ? er : e.icon;
658
+ } }), I(() => e.children)];
655
659
  }
656
660
  });
657
661
  }
658
- function or(e) {
659
- return P(Ce, {
662
+ function sr(e) {
663
+ return N(Ee, {
660
664
  get tone() {
661
665
  return e.tone ?? "var(--muted-foreground)";
662
666
  },
663
667
  class: "gap-1 tabular-nums",
664
668
  get children() {
665
- return [P(E, {
669
+ return [N(T, {
666
670
  get when() {
667
671
  return e.icon;
668
672
  },
669
- children: (e) => P(U, { get icon() {
673
+ children: (e) => N(H, { get icon() {
670
674
  return e();
671
675
  } })
672
- }), L(() => e.children)];
676
+ }), I(() => e.children)];
673
677
  }
674
678
  });
675
679
  }
676
- function sr(e) {
677
- return (() => {
678
- var t = Yn();
679
- return I(t, () => e.children), F(() => N(t, J("glasshome-widget-layer", e.class))), t;
680
- })();
681
- }
682
680
  function cr(e) {
683
681
  return (() => {
684
682
  var t = Xn();
685
- return I(t, () => e.children), t;
683
+ return F(t, () => e.children), P(() => M(t, J("glasshome-widget-layer", e.class))), t;
686
684
  })();
687
685
  }
688
686
  function lr(e) {
689
- let t = j(Qn);
690
687
  return (() => {
691
- var n = Zn();
692
- return I(n, P(U, { get icon() {
693
- return L(() => !!t())() ? $n : e.icon;
688
+ var t = Zn();
689
+ return F(t, () => e.children), t;
690
+ })();
691
+ }
692
+ function ur(e) {
693
+ let t = j($n);
694
+ return (() => {
695
+ var n = Qn();
696
+ return F(n, N(H, { get icon() {
697
+ return I(() => !!t())() ? er : e.icon;
694
698
  } })), n;
695
699
  })();
696
700
  }
697
701
  //#endregion
698
702
  //#region src/framework/theming/tokens.css?raw
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;
703
+ var dr = "/* 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", fr = !1, pr, mr = /* @__PURE__ */ new WeakSet();
704
+ function hr() {
705
+ return pr || (pr = new CSSStyleSheet(), pr.replaceSync(dr.replace(/:root\b/g, ":host").replace(/^\.dark\b/gm, ":host(.dark)"))), pr;
702
706
  }
703
- function hr(e) {
707
+ function gr(e) {
704
708
  if (typeof ShadowRoot < "u" && e instanceof ShadowRoot) {
705
- if (pr.has(e)) return;
706
- let t = mr();
707
- e.adoptedStyleSheets.includes(t) || (e.adoptedStyleSheets = [...e.adoptedStyleSheets, t]), pr.add(e);
709
+ if (mr.has(e)) return;
710
+ let t = hr();
711
+ e.adoptedStyleSheets.includes(t) || (e.adoptedStyleSheets = [...e.adoptedStyleSheets, t]), mr.add(e);
708
712
  return;
709
713
  }
710
- if (dr) return;
714
+ if (fr) return;
711
715
  let t = e ?? (typeof document > "u" ? void 0 : document);
712
716
  if (!t) return;
713
717
  if (t.head.querySelector?.("style[data-glasshome-tokens]")) {
714
- dr = !0;
718
+ fr = !0;
715
719
  return;
716
720
  }
717
721
  let n = t.createElement("style");
718
- n.setAttribute("data-glasshome-tokens", ""), n.textContent = ur, t.head.appendChild(n), dr = !0;
722
+ n.setAttribute("data-glasshome-tokens", ""), n.textContent = dr, t.head.appendChild(n), fr = !0;
719
723
  }
720
724
  //#endregion
721
725
  //#region src/framework/variants/built-in-variants.ts
722
- var gr = {
726
+ var _r = {
723
727
  "classic-glass": { cssVars: {
724
728
  "--widget-padding": "1.5rem",
725
729
  "--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))"
@@ -739,21 +743,21 @@ var gr = {
739
743
  "--widget-backdrop": "blur(16px) saturate(1.8)"
740
744
  } }
741
745
  };
742
- function _r(e) {
743
- return Object.hasOwn(gr, e) ? gr[e] : void 0;
746
+ function vr(e) {
747
+ return Object.hasOwn(_r, e) ? _r[e] : void 0;
744
748
  }
745
749
  //#endregion
746
750
  //#region src/framework/backgrounds/WidgetSliderFill.tsx
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) => {
751
+ var yr = /*#__PURE__*/ B("<div>"), br = e(() => void 0, "sliderFill.color");
752
+ function xr(e) {
753
+ return e.color !== void 0 && br(), (() => {
754
+ var t = yr();
755
+ return P((n) => {
752
756
  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 = {
753
757
  "--widget-fill-value": e.value,
754
- "z-index": ln.BACKGROUND
758
+ "z-index": un.BACKGROUND
755
759
  };
756
- return r !== n.e && N(t, n.e = r), n.t = B(t, i, n.t), n;
760
+ return r !== n.e && M(t, n.e = r), n.t = z(t, i, n.t), n;
757
761
  }, {
758
762
  e: void 0,
759
763
  t: void 0
@@ -762,16 +766,16 @@ function br(e) {
762
766
  }
763
767
  //#endregion
764
768
  //#region src/framework/components/WidgetContent.tsx
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));
769
+ var Sr = /*#__PURE__*/ B("<div>"), Cr = /\bglasshome-widget-(head|hero|controls|backdrop|glyph|layer)\b/;
770
+ function wr(e) {
771
+ let t = hn(j(U));
768
772
  D(() => t?.setAccent(e.accent)), A(() => t?.setAccent(void 0));
769
- let n = fe(() => e.children), r = O(() => n.toArray().some((e) => e instanceof Element && Sr.test(e.className)));
773
+ let n = E(() => e.children), r = O(() => n.toArray().some((e) => e instanceof Element && Cr.test(e.className)));
770
774
  return (() => {
771
- var t = xr();
772
- return I(t, n), F((n) => {
775
+ var t = Sr();
776
+ return F(t, n), P((n) => {
773
777
  var i = J(r() ? "glasshome-widget-grid" : "glasshome-widget-content", e.class), a = e.accent ? { "--widget-color": e.accent } : void 0;
774
- return i !== n.e && N(t, n.e = i), n.t = B(t, a, n.t), n;
778
+ return i !== n.e && M(t, n.e = i), n.t = z(t, a, n.t), n;
775
779
  }, {
776
780
  e: void 0,
777
781
  t: void 0
@@ -780,16 +784,16 @@ function Cr(e) {
780
784
  }
781
785
  //#endregion
782
786
  //#region src/framework/components/WidgetStatus.tsx
783
- var wr = /*#__PURE__*/ V("<p>");
784
- function Tr(e) {
787
+ var Tr = /*#__PURE__*/ B("<p>");
788
+ function Er(e) {
785
789
  return (() => {
786
- var t = wr();
787
- return I(t, (() => {
788
- var t = L(() => !!e.isUnavailable);
790
+ var t = Tr();
791
+ return F(t, (() => {
792
+ var t = I(() => !!e.isUnavailable);
789
793
  return () => t() ? "Unavailable" : e.children;
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;
794
+ })()), P((n) => {
795
+ var r = J("glasshome-widget-status", "relative", e.dimmed && "opacity-40", e.class), i = un.ACTIONS;
796
+ return r !== n.e && M(t, n.e = r), i !== n.t && R(t, "z-index", n.t = i), n;
793
797
  }, {
794
798
  e: void 0,
795
799
  t: void 0
@@ -798,21 +802,21 @@ function Tr(e) {
798
802
  }
799
803
  //#endregion
800
804
  //#region src/framework/components/WidgetTitle.tsx
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) {
805
+ var Dr = /*#__PURE__*/ B("<span class=\"glasshome-widget-badge shrink-0\">"), Or = /*#__PURE__*/ B("<div><h3 class=glasshome-widget-title>");
806
+ function kr(e) {
803
807
  return (() => {
804
- var t = Dr(), n = t.firstChild;
805
- return I(n, () => e.children), I(t, P(E, {
808
+ var t = Or(), n = t.firstChild;
809
+ return F(n, () => e.children), F(t, N(T, {
806
810
  get when() {
807
- return L(() => e.badge !== void 0)() && e.badge > 0;
811
+ return I(() => e.badge !== void 0)() && e.badge > 0;
808
812
  },
809
813
  get children() {
810
- var t = Er();
811
- return I(t, () => e.badge), t;
814
+ var t = Dr();
815
+ return F(t, () => e.badge), t;
812
816
  }
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;
817
+ }), null), P((n) => {
818
+ var r = J("relative flex items-center gap-2", e.class), i = un.ACTIONS;
819
+ return r !== n.e && M(t, n.e = r), i !== n.t && R(t, "z-index", n.t = i), n;
816
820
  }, {
817
821
  e: void 0,
818
822
  t: void 0
@@ -821,7 +825,7 @@ function Or(e) {
821
825
  }
822
826
  //#endregion
823
827
  //#region src/framework/utils/entity-aggregation.ts
824
- function kr(e, t = !1) {
828
+ function Ar(e, t = !1) {
825
829
  let n = e[0];
826
830
  if (!n) return {
827
831
  isGroup: !1,
@@ -845,7 +849,7 @@ function kr(e, t = !1) {
845
849
  isUnavailable: e.state === "unavailable",
846
850
  brightness: r,
847
851
  brightnessPercent: i,
848
- color: Mr(e),
852
+ color: Nr(e),
849
853
  onCount: +!!t,
850
854
  totalCount: 1,
851
855
  description: t ? "On" : "Off"
@@ -857,7 +861,7 @@ function kr(e, t = !1) {
857
861
  if (i++, t.attributes?.brightness !== void 0 && (c += t.attributes.brightness, l++), t.attributes?.rgb_color) u.push(t.attributes.rgb_color);
858
862
  else if (t.attributes?.hs_color) {
859
863
  let [e, n] = t.attributes.hs_color;
860
- u.push(jr(e, n));
864
+ u.push(Mr(e, n));
861
865
  }
862
866
  break;
863
867
  case "off":
@@ -874,7 +878,7 @@ function kr(e, t = !1) {
874
878
  if (u.length > 0) {
875
879
  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;
876
880
  x = `rgb(${Math.round(e * r)}, ${Math.round(t * r)}, ${Math.round(n * r)})`;
877
- } else x = Mr(n);
881
+ } else x = Nr(n);
878
882
  let S;
879
883
  return S = h ? "All on" : g ? "All off" : i > 0 ? `${i} of ${d} on` : "Off", {
880
884
  isGroup: r,
@@ -889,7 +893,7 @@ function kr(e, t = !1) {
889
893
  description: S
890
894
  };
891
895
  }
892
- function Ar(e, t = "mean", n = !0) {
896
+ function jr(e, t = "mean", n = !0) {
893
897
  let r = e[0];
894
898
  if (!r) return {
895
899
  isGroup: !1,
@@ -986,7 +990,7 @@ function Ar(e, t = "mean", n = !0) {
986
990
  memberValues: o
987
991
  };
988
992
  }
989
- function jr(e, t) {
993
+ function Mr(e, t) {
990
994
  let n = t / 100, r = n * (1 - Math.abs(e / 60 % 2 - 1)), i = 1 - n, a = 0, o = 0, s = 0;
991
995
  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], [
992
996
  (a + i) * 255,
@@ -994,7 +998,7 @@ function jr(e, t) {
994
998
  (s + i) * 255
995
999
  ];
996
1000
  }
997
- function Mr(e) {
1001
+ function Nr(e) {
998
1002
  if (e.state !== "on") return "rgb(100, 100, 100)";
999
1003
  let t = (e.attributes?.brightness ?? 255) / 255;
1000
1004
  if (e.attributes?.rgb_color) {
@@ -1002,7 +1006,7 @@ function Mr(e) {
1002
1006
  return `rgb(${Math.round(n * t)}, ${Math.round(r * t)}, ${Math.round(i * t)})`;
1003
1007
  }
1004
1008
  if (e.attributes?.hs_color) {
1005
- let [n, r] = e.attributes.hs_color, [i, a, o] = jr(n, r);
1009
+ let [n, r] = e.attributes.hs_color, [i, a, o] = Mr(n, r);
1006
1010
  return `rgb(${Math.round(i * t)}, ${Math.round(a * t)}, ${Math.round(o * t)})`;
1007
1011
  }
1008
1012
  if (e.attributes?.color_temp) {
@@ -1013,7 +1017,7 @@ function Mr(e) {
1013
1017
  }
1014
1018
  //#endregion
1015
1019
  //#region src/framework/utils/entity-state.ts
1016
- function Nr(e) {
1020
+ function Pr(e) {
1017
1021
  if (!e) return !1;
1018
1022
  if ([
1019
1023
  "on",
@@ -1029,15 +1033,15 @@ function Nr(e) {
1029
1033
  }
1030
1034
  return !1;
1031
1035
  }
1032
- function Pr(e, t, n) {
1036
+ function Fr(e, t, n) {
1033
1037
  return e?.attributes ? e.attributes[t] ?? n : n;
1034
1038
  }
1035
- function Fr(e) {
1036
- return e.filter(Nr).length;
1039
+ function Ir(e) {
1040
+ return e.filter(Pr).length;
1037
1041
  }
1038
1042
  //#endregion
1039
1043
  //#region src/framework/utils/format-value.ts
1040
- function Ir(e, t, n) {
1044
+ function Lr(e, t, n) {
1041
1045
  let { decimals: r, scale: i = !0 } = n || {};
1042
1046
  if (typeof e == "string") return t ? `${e}${t}` : e;
1043
1047
  if (e == null || Number.isNaN(e)) return t ? `--${t}` : "--";
@@ -1048,38 +1052,38 @@ function Ir(e, t, n) {
1048
1052
  }
1049
1053
  //#endregion
1050
1054
  //#region src/framework/utils/interpret-value.ts
1051
- function Lr(e, t) {
1055
+ function Rr(e, t) {
1052
1056
  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;
1053
1057
  }
1054
1058
  //#endregion
1055
1059
  //#region src/framework/components/WidgetValue.tsx
1056
- var Rr = /*#__PURE__*/ V("<div class=glasshome-widget-subtitle>"), zr = /*#__PURE__*/ V("<div><div class=glasshome-widget-value>");
1057
- function Br(e) {
1060
+ var zr = /*#__PURE__*/ B("<div class=glasshome-widget-subtitle>"), Br = /*#__PURE__*/ B("<div><div class=glasshome-widget-value>");
1061
+ function Vr(e) {
1058
1062
  return (() => {
1059
- var t = zr(), n = t.firstChild;
1060
- return I(n, () => Ir(e.value, e.unit)), I(t, P(E, {
1063
+ var t = Br(), n = t.firstChild;
1064
+ return F(n, () => Lr(e.value, e.unit)), F(t, N(T, {
1061
1065
  get when() {
1062
- return L(() => !!e.interpret)() && typeof e.value == "number";
1066
+ return I(() => !!e.interpret)() && typeof e.value == "number";
1063
1067
  },
1064
1068
  get children() {
1065
- var t = Rr();
1066
- return I(t, () => Lr(e.value, e.unit)), t;
1069
+ var t = zr();
1070
+ return F(t, () => Rr(e.value, e.unit)), t;
1067
1071
  }
1068
- }), null), F(() => N(t, J("flex flex-col", e.class))), t;
1072
+ }), null), P(() => M(t, J("flex flex-col", e.class))), t;
1069
1073
  })();
1070
1074
  }
1071
1075
  //#endregion
1072
1076
  //#region src/framework/core/Widget.tsx
1073
- var Vr = /*#__PURE__*/ V("<span class=glasshome-widget-hold-flood aria-hidden=true>"), Hr = /*#__PURE__*/ V("<div class=\"glasshome-widget-halo glass-halo rounded-xl\"aria-hidden=true>"), Ur = /*#__PURE__*/ V("<div class=\"glasshome-widget-frame relative h-full w-full\"><div><div class=\"relative h-full w-full\">"), Wr = /*#__PURE__*/ V("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), Gr = /*#__PURE__*/ V("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), Kr = /*#__PURE__*/ V("<div class=\"text-muted-foreground flex items-center justify-center\">"), qr = /*#__PURE__*/ V("<h3 class=\"text-foreground text-sm font-semibold\">"), Jr = /*#__PURE__*/ V("<p class=\"text-muted-foreground text-xs\">"), Yr = 2e3;
1074
- function Xr(t) {
1075
- let n = j(W), r = Mn(() => ({ hold: { action: () => (G.get(n ?? {}) ?? G.get(f))?.("edit") } }));
1077
+ var Hr = /*#__PURE__*/ B("<span class=glasshome-widget-hold-flood aria-hidden=true>"), Ur = /*#__PURE__*/ B("<div class=\"glasshome-widget-halo glass-halo rounded-xl\"aria-hidden=true>"), Wr = /*#__PURE__*/ B("<div class=\"glasshome-widget-frame relative h-full w-full\"><div><div class=\"relative h-full w-full\">"), Gr = /*#__PURE__*/ B("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), Kr = /*#__PURE__*/ B("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), qr = /*#__PURE__*/ B("<div class=\"text-muted-foreground flex items-center justify-center\">"), Jr = /*#__PURE__*/ B("<h3 class=\"text-foreground text-sm font-semibold\">"), Yr = /*#__PURE__*/ B("<p class=\"text-muted-foreground text-xs\">"), Xr = 2e3;
1078
+ function Zr(t) {
1079
+ let n = j(U), r = Nn(() => ({ hold: { action: () => (G.get(n ?? {}) ?? G.get(f))?.("edit") } }));
1076
1080
  A(r.dispose);
1077
- let i = mn(n), a = !!n && !(fn in n), o = Mn(() => ({ hold: i?.hasSheet() ? { action: () => (G.get(n ?? {}) ?? G.get(f))?.() } : void 0 }));
1081
+ let i = hn(n), a = !!n && !(pn in n), o = Nn(() => ({ hold: i?.hasSheet() ? { action: () => (G.get(n ?? {}) ?? G.get(f))?.() } : void 0 }));
1078
1082
  A(o.dispose);
1079
1083
  let s = () => t.emptyState && n ? r : t.gestures ?? (a ? o : void 0);
1080
1084
  a && (D(() => n?.onHoldable?.(!t.emptyState && !!s()?.holds?.())), A(() => n?.onHoldable?.(!1))), D(() => {
1081
1085
  if (!a || !i?.nothingMore()) return;
1082
- let e = setTimeout(() => i.setNothingMore(!1), Yr);
1086
+ let e = setTimeout(() => i.setNothingMore(!1), Xr);
1083
1087
  A(() => clearTimeout(e));
1084
1088
  }), D(() => i?.setTone(t.color ?? (t.tone ? `var(--tone-${t.tone})` : void 0)));
1085
1089
  let [c, l] = k(), [u, d] = k({
@@ -1103,16 +1107,16 @@ function Xr(t) {
1103
1107
  t.observe(e), A(() => t.disconnect());
1104
1108
  }), he(() => {
1105
1109
  let e = c()?.getRootNode();
1106
- hr(typeof ShadowRoot < "u" && e instanceof ShadowRoot || typeof Document < "u" && e instanceof Document ? e : void 0);
1110
+ gr(typeof ShadowRoot < "u" && e instanceof ShadowRoot || typeof Document < "u" && e instanceof Document ? e : void 0);
1107
1111
  });
1108
1112
  let f = {
1109
1113
  ...n,
1110
1114
  updateConfig: n?.updateConfig ?? (() => {}),
1111
1115
  dimensions: e(() => u(), "ctx.dimensions")
1112
1116
  };
1113
- n && Object.defineProperty(f, fn, { value: n });
1117
+ n && Object.defineProperty(f, pn, { value: n });
1114
1118
  let p = O(() => {
1115
- if (t.variant) return typeof t.variant == "string" ? _r(t.variant) : t.variant.styles;
1119
+ if (t.variant) return typeof t.variant == "string" ? vr(t.variant) : t.variant.styles;
1116
1120
  }), m = e(() => t.gradient, "widget.gradient"), h = () => !!t.tone && t.tone !== "neutral" || !!t.color, g = O(() => ({
1117
1121
  ...p()?.cssVars || {},
1118
1122
  ...t.tone ? { "--widget-color": `var(--tone-${t.tone})` } : {},
@@ -1150,54 +1154,54 @@ function Xr(t) {
1150
1154
  y() && s()?.onPointerUp(e);
1151
1155
  }, te = (e) => {
1152
1156
  y() && s()?.onPointerCancel(e);
1153
- }, C = () => s()?.hold?.() ?? null, w = {
1157
+ }, ne = () => s()?.hold?.() ?? null, C = {
1154
1158
  x: 0,
1155
1159
  y: 0,
1156
1160
  r: 0
1157
- }, ne = (e) => (e && Object.assign(w, {
1161
+ }, re = (e) => (e && Object.assign(C, {
1158
1162
  x: e.x,
1159
1163
  y: e.y,
1160
1164
  r: e.r
1161
1165
  }), {
1162
- left: `${w.x}px`,
1163
- top: `${w.y}px`,
1164
- width: `${w.r * 2}px`,
1165
- height: `${w.r * 2}px`,
1166
- "z-index": ln.BACKGROUND
1166
+ left: `${C.x}px`,
1167
+ top: `${C.y}px`,
1168
+ width: `${C.r * 2}px`,
1169
+ height: `${C.r * 2}px`,
1170
+ "z-index": un.BACKGROUND
1167
1171
  });
1168
- return P(W.Provider, {
1172
+ return N(U.Provider, {
1169
1173
  value: f,
1170
1174
  get children() {
1171
- return P(Qn.Provider, {
1175
+ return N($n.Provider, {
1172
1176
  value: () => t.confirmed === !0,
1173
1177
  get children() {
1174
- return P(Nn.Provider, {
1178
+ return N(Pn.Provider, {
1175
1179
  value: u,
1176
1180
  get children() {
1177
1181
  return [(() => {
1178
- var e = Ur(), n = e.firstChild, i = n.firstChild;
1182
+ var e = Wr(), n = e.firstChild, i = n.firstChild;
1179
1183
  return n.$$keydown = (e) => {
1180
1184
  y() && s()?.onKeyDown?.(e);
1181
- }, M(n, "pointercancel", te), M(n, "pointerup", ee), M(n, "pointermove", S), M(n, "pointerdown", x), M(n, "pointerenter", b), H((e) => {
1185
+ }, ve(n, "pointercancel", te), ve(n, "pointerup", ee), ve(n, "pointermove", S), ve(n, "pointerdown", x), ve(n, "pointerenter", b), be((e) => {
1182
1186
  l(e), t.gestures?.bindElement(e), r.bindElement(e);
1183
- }, n), I(n, P(E, {
1187
+ }, n), F(n, N(T, {
1184
1188
  get when() {
1185
1189
  return s()?.hold;
1186
1190
  },
1187
1191
  get children() {
1188
- var e = Vr();
1189
- return F((t) => {
1190
- var n = C() && !C()?.fired ? "" : void 0, r = C()?.fired ? "" : void 0, i = ne(C());
1191
- 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;
1192
+ var e = Hr();
1193
+ return P((t) => {
1194
+ var n = ne() && !ne()?.fired ? "" : void 0, r = ne()?.fired ? "" : void 0, i = re(ne());
1195
+ 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;
1192
1196
  }, {
1193
1197
  e: void 0,
1194
1198
  t: void 0,
1195
1199
  a: void 0
1196
1200
  }), e;
1197
1201
  }
1198
- }), i), I(i, (() => {
1199
- var e = L(() => !!t.emptyState);
1200
- return () => e() ? P(Zr, {
1202
+ }), i), F(i, (() => {
1203
+ var e = I(() => !!t.emptyState);
1204
+ return () => e() ? N(Qr, {
1201
1205
  get icon() {
1202
1206
  return t.emptyState.icon;
1203
1207
  },
@@ -1208,27 +1212,27 @@ function Xr(t) {
1208
1212
  return t.emptyState.message;
1209
1213
  }
1210
1214
  }) : t.children;
1211
- })()), I(n, (() => {
1212
- var e = L(() => !!t.loading);
1215
+ })()), F(n, (() => {
1216
+ var e = I(() => !!t.loading);
1213
1217
  return () => e() && (() => {
1214
- var e = Wr();
1215
- return F((t) => z(e, "z-index", ln.OVERLAY)), e;
1218
+ var e = Gr();
1219
+ return P((t) => R(e, "z-index", un.OVERLAY)), e;
1216
1220
  })();
1217
- })(), null), I(e, P(E, {
1221
+ })(), null), F(e, N(T, {
1218
1222
  when: !_,
1219
1223
  get children() {
1220
- var e = Hr();
1221
- return F((t) => {
1224
+ var e = Ur();
1225
+ return P((t) => {
1222
1226
  var n = g(), r = h() ? "" : void 0;
1223
- return t.e = B(e, n, t.e), r !== t.t && R(e, "data-toned", t.t = r), t;
1227
+ return t.e = z(e, n, t.e), r !== t.t && L(e, "data-toned", t.t = r), t;
1224
1228
  }, {
1225
1229
  e: void 0,
1226
1230
  t: void 0
1227
1231
  }), e;
1228
1232
  }
1229
- }), null), F((e) => {
1230
- var r = J("glasshome-widget glass", "relative h-full w-full overflow-hidden rounded-xl select-none", p()?.class, t.class), a = v(), o = h() ? "" : void 0, s = t.confirmed || void 0, c = y() ? 0 : void 0, l = ln.CONTENT;
1231
- return r !== e.e && N(n, e.e = r), e.t = B(n, a, e.t), o !== e.a && R(n, "data-toned", e.a = o), s !== e.o && R(n, "data-confirmed", e.o = s), c !== e.i && R(n, "tabindex", e.i = c), l !== e.n && z(i, "z-index", e.n = l), e;
1233
+ }), null), P((e) => {
1234
+ var r = J("glasshome-widget glass", "relative h-full w-full overflow-hidden rounded-xl select-none", p()?.class, t.class), a = v(), o = h() ? "" : void 0, s = t.confirmed || void 0, c = y() ? 0 : void 0, l = un.CONTENT;
1235
+ return r !== e.e && M(n, e.e = r), e.t = z(n, a, e.t), o !== e.a && L(n, "data-toned", e.a = o), s !== e.o && L(n, "data-confirmed", e.o = s), c !== e.i && L(n, "tabindex", e.i = c), l !== e.n && R(i, "z-index", e.n = l), e;
1232
1236
  }, {
1233
1237
  e: void 0,
1234
1238
  t: void 0,
@@ -1237,10 +1241,10 @@ function Xr(t) {
1237
1241
  i: void 0,
1238
1242
  n: void 0
1239
1243
  }), e;
1240
- })(), P(E, {
1244
+ })(), N(T, {
1241
1245
  when: a,
1242
1246
  get children() {
1243
- return P(Ze, {
1247
+ return N($e, {
1244
1248
  get open() {
1245
1249
  return i?.nothingMore() ?? !1;
1246
1250
  },
@@ -1249,10 +1253,10 @@ function Xr(t) {
1249
1253
  },
1250
1254
  anchorRef: c,
1251
1255
  get children() {
1252
- return P(Qe, {
1256
+ return N(et, {
1253
1257
  class: "flex w-auto items-center gap-2 p-3 text-sm",
1254
1258
  get children() {
1255
- return [P(U, { icon: "mdi:information-outline" }), "No more controls for this widget"];
1259
+ return [N(H, { icon: "mdi:information-outline" }), "No more controls for this widget"];
1256
1260
  }
1257
1261
  });
1258
1262
  }
@@ -1266,60 +1270,60 @@ function Xr(t) {
1266
1270
  }
1267
1271
  });
1268
1272
  }
1269
- function Zr(e) {
1273
+ function Qr(e) {
1270
1274
  return (() => {
1271
- var t = Gr();
1272
- return I(t, (() => {
1273
- var t = L(() => !!e.icon);
1274
- return () => t() && (() => {
1275
- var t = Kr();
1276
- return I(t, () => e.icon), t;
1277
- })();
1278
- })(), null), I(t, (() => {
1279
- var t = L(() => !!e.title);
1275
+ var t = Kr();
1276
+ return F(t, (() => {
1277
+ var t = I(() => !!e.icon);
1280
1278
  return () => t() && (() => {
1281
1279
  var t = qr();
1282
- return I(t, () => e.title), t;
1280
+ return F(t, () => e.icon), t;
1283
1281
  })();
1284
- })(), null), I(t, (() => {
1285
- var t = L(() => !!e.message);
1282
+ })(), null), F(t, (() => {
1283
+ var t = I(() => !!e.title);
1286
1284
  return () => t() && (() => {
1287
1285
  var t = Jr();
1288
- return I(t, () => e.message), t;
1286
+ return F(t, () => e.title), t;
1287
+ })();
1288
+ })(), null), F(t, (() => {
1289
+ var t = I(() => !!e.message);
1290
+ return () => t() && (() => {
1291
+ var t = Yr();
1292
+ return F(t, () => e.message), t;
1289
1293
  })();
1290
1294
  })(), null), t;
1291
1295
  })();
1292
1296
  }
1293
- var Y = Xr;
1294
- 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"]);
1297
+ var Y = Zr;
1298
+ Y.Content = wr, Y.Icon = Vn, Y.Title = kr, Y.Status = Er, Y.Value = Vr, Y.SliderFill = xr, Y.Head = tr, Y.Hero = nr, Y.Controls = rr, Y.Stepper = ir, Y.Choice = ar, Y.Action = or, Y.Chip = sr, Y.Backdrop = lr, Y.Layer = cr, Y.Glyph = ur, ye(["keydown"]);
1295
1299
  //#endregion
1296
1300
  //#region src/framework/panel/panel.tsx
1297
- var Qr = /*#__PURE__*/ V("<section class=glasshome-panel-section><h3 class=glasshome-panel-label>"), $r = /*#__PURE__*/ V("<div class=glasshome-panel-rows>"), ei = /*#__PURE__*/ V("<span class=\"glasshome-widget-slider-fill glasshome-panel-row-fill\">"), ti = /*#__PURE__*/ V("<span class=\"glasshome-widget-icon glass glasshome-panel-row-icon\">"), ni = /*#__PURE__*/ V("<span class=glasshome-panel-row-state>"), ri = /*#__PURE__*/ V("<span class=glasshome-panel-row-text><span class=glasshome-panel-row-name>"), ii = /*#__PURE__*/ V("<span class=glasshome-panel-row-trailing>"), ai = /*#__PURE__*/ V("<div class=glasshome-panel-row-wrap>"), oi = /*#__PURE__*/ V("<div>"), si = /*#__PURE__*/ V("<div class=\"glasshome-panel-facts glass\">"), ci = /*#__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>"), li = 8, ui = (e, t, n) => Math.min(n, Math.max(t, e));
1298
- function di(e) {
1299
- let t = j(W), n, r = !1, i = !1, a, o = 0, s = (t, n) => {
1301
+ var $r = /*#__PURE__*/ B("<section class=glasshome-panel-section><h3 class=glasshome-panel-label>"), ei = /*#__PURE__*/ B("<div class=glasshome-panel-rows>"), ti = /*#__PURE__*/ B("<span class=\"glasshome-widget-slider-fill glasshome-panel-row-fill\">"), ni = /*#__PURE__*/ B("<span class=\"glasshome-widget-icon glass glasshome-panel-row-icon\">"), ri = /*#__PURE__*/ B("<span class=glasshome-panel-row-state>"), ii = /*#__PURE__*/ B("<span class=glasshome-panel-row-text><span class=glasshome-panel-row-name>"), ai = /*#__PURE__*/ B("<span class=glasshome-panel-row-trailing>"), oi = /*#__PURE__*/ B("<div class=glasshome-panel-row-wrap>"), si = /*#__PURE__*/ B("<div>"), ci = /*#__PURE__*/ B("<div class=\"glasshome-panel-facts glass\">"), li = /*#__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>"), ui = 8, di = (e, t, n) => Math.min(n, Math.max(t, e));
1302
+ function fi(e) {
1303
+ let t = j(U), n, r = !1, i = !1, a, o = 0, s = (t, n) => {
1300
1304
  let r = e.slide?.();
1301
1305
  if (!r) return 0;
1302
1306
  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;
1303
- return Math.round(ui(o + a * (s - o), o, s));
1307
+ return Math.round(di(o + a * (s - o), o, s));
1304
1308
  }, c = () => {
1305
1309
  clearTimeout(a), n = void 0;
1306
1310
  };
1307
1311
  return A(() => clearTimeout(a)), {
1308
1312
  onPointerDown: (o) => {
1309
1313
  if (o.button !== 0 || n) return;
1310
- let s = o.target instanceof Element ? o.target.closest(jn) : null;
1314
+ let s = o.target instanceof Element ? o.target.closest(Mn) : null;
1311
1315
  s && s !== o.currentTarget || (n = {
1312
1316
  x: o.clientX,
1313
1317
  y: o.clientY,
1314
1318
  id: o.pointerId
1315
1319
  }, o.currentTarget.setPointerCapture?.(o.pointerId), r = !1, i = !1, e.onHold && (a = setTimeout(() => {
1316
- i = !0, qt(), e.onHold?.(), t?.onHeld?.();
1317
- }, qe)));
1320
+ i = !0, Yt(), e.onHold?.(), t?.onHeld?.();
1321
+ }, Ye)));
1318
1322
  },
1319
1323
  onPointerMove: (t) => {
1320
1324
  if (!n || t.pointerId !== n.id || i) return;
1321
1325
  let c = t.currentTarget, l = e.axis === "x" ? Math.abs(t.clientX - n.x) : Math.abs(t.clientY - n.y);
1322
- !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);
1326
+ !r && e.slide?.() && l > ui && (r = !0, clearTimeout(a)), r ? (o = s(c, t), e.slide?.()?.onChange(o)) : Math.hypot(t.clientX - n.x, t.clientY - n.y) > ui && clearTimeout(a);
1323
1327
  },
1324
1328
  onPointerUp: (t) => {
1325
1329
  n && t.pointerId === n.id && (r ? e.slide?.()?.onCommit?.(o) : i || e.onTap?.(), c());
@@ -1327,20 +1331,20 @@ function di(e) {
1327
1331
  onPointerCancel: c
1328
1332
  };
1329
1333
  }
1330
- function fi(e) {
1334
+ function pi(e) {
1331
1335
  return (() => {
1332
- var t = Qr(), n = t.firstChild;
1333
- return I(n, () => e.label), I(t, () => e.children, null), t;
1336
+ var t = $r(), n = t.firstChild;
1337
+ return F(n, () => e.label), F(t, () => e.children, null), t;
1334
1338
  })();
1335
1339
  }
1336
- function pi(e) {
1340
+ function mi(e) {
1337
1341
  return (() => {
1338
- var t = $r();
1339
- return I(t, () => e.children), t;
1342
+ var t = ei();
1343
+ return F(t, () => e.children), t;
1340
1344
  })();
1341
1345
  }
1342
- function mi(e) {
1343
- let t = () => !!(e.onTap || e.slide || e.onHold), n = di({
1346
+ function hi(e) {
1347
+ let t = () => !!(e.onTap || e.slide || e.onHold), n = fi({
1344
1348
  axis: "x",
1345
1349
  slide: () => e.slide,
1346
1350
  onTap: () => e.onTap?.(),
@@ -1357,26 +1361,26 @@ function mi(e) {
1357
1361
  let r = t.key === "ArrowRight" || t.key === "ArrowUp" ? 5 : t.key === "ArrowLeft" || t.key === "ArrowDown" ? -5 : 0;
1358
1362
  if (!r) return;
1359
1363
  t.preventDefault();
1360
- let i = ui(n.value + r, n.min ?? 0, n.max ?? 100);
1364
+ let i = di(n.value + r, n.min ?? 0, n.max ?? 100);
1361
1365
  n.onChange(i), n.onCommit?.(i);
1362
1366
  }, a = () => [
1363
- P(E, {
1367
+ N(T, {
1364
1368
  get when() {
1365
1369
  return r() !== void 0;
1366
1370
  },
1367
1371
  get children() {
1368
- var e = ei();
1369
- return F((t) => B(e, { "--widget-fill-value": r() }, t)), e;
1372
+ var e = ti();
1373
+ return P((t) => z(e, { "--widget-fill-value": r() }, t)), e;
1370
1374
  }
1371
1375
  }),
1372
1376
  (() => {
1373
- var t = ti();
1374
- return I(t, P(U, {
1377
+ var t = ni();
1378
+ return F(t, N(H, {
1375
1379
  get icon() {
1376
1380
  return e.icon;
1377
1381
  },
1378
1382
  class: "glasshome-widget-icon-glyph"
1379
- })), F((n) => {
1383
+ })), P((n) => {
1380
1384
  var r = !!e.on, i = !e.on;
1381
1385
  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;
1382
1386
  }, {
@@ -1385,33 +1389,33 @@ function mi(e) {
1385
1389
  }), t;
1386
1390
  })(),
1387
1391
  (() => {
1388
- var t = ri(), n = t.firstChild;
1389
- return I(n, () => e.name), I(t, P(E, {
1392
+ var t = ii(), n = t.firstChild;
1393
+ return F(n, () => e.name), F(t, N(T, {
1390
1394
  get when() {
1391
1395
  return e.state !== void 0;
1392
1396
  },
1393
1397
  get children() {
1394
- var t = ni();
1395
- return I(t, () => e.state), t;
1398
+ var t = ri();
1399
+ return F(t, () => e.state), t;
1396
1400
  }
1397
1401
  }), null), t;
1398
1402
  })()
1399
1403
  ], o = () => ({ "--widget-color": e.tone ?? "var(--tone-neutral)" });
1400
1404
  return (() => {
1401
- var r = ai();
1402
- return I(r, P(E, {
1405
+ var r = oi();
1406
+ return F(r, N(T, {
1403
1407
  get when() {
1404
1408
  return t();
1405
1409
  },
1406
1410
  get fallback() {
1407
1411
  return (() => {
1408
- var e = oi();
1409
- return I(e, a), F((t) => {
1410
- var n = `${Rt({
1412
+ var e = si();
1413
+ return F(e, a), P((t) => {
1414
+ var n = `${Bt({
1411
1415
  variant: "outline",
1412
1416
  size: "none"
1413
1417
  })} glasshome-panel-row glasshome-panel-row-static`, r = o();
1414
- return n !== t.e && N(e, t.e = n), t.t = B(e, r, t.t), t;
1418
+ return n !== t.e && M(e, t.e = n), t.t = z(e, r, t.t), t;
1415
1419
  }, {
1416
1420
  e: void 0,
1417
1421
  t: void 0
@@ -1419,7 +1423,7 @@ function mi(e) {
1419
1423
  })();
1420
1424
  },
1421
1425
  get children() {
1422
- return P(Te, {
1426
+ return N(Oe, {
1423
1427
  variant: "outline",
1424
1428
  size: "none",
1425
1429
  class: "glasshome-panel-row",
@@ -1453,39 +1457,39 @@ function mi(e) {
1453
1457
  }
1454
1458
  });
1455
1459
  }
1456
- }), null), I(r, P(E, {
1460
+ }), null), F(r, N(T, {
1457
1461
  get when() {
1458
1462
  return e.trailing;
1459
1463
  },
1460
1464
  get children() {
1461
- var t = ii();
1462
- return I(t, () => e.trailing), t;
1465
+ var t = ai();
1466
+ return F(t, () => e.trailing), t;
1463
1467
  }
1464
1468
  }), null), r;
1465
1469
  })();
1466
1470
  }
1467
- function hi(e) {
1471
+ function gi(e) {
1468
1472
  return (() => {
1469
- var t = si();
1470
- return I(t, P(T, {
1473
+ var t = ci();
1474
+ return F(t, N(w, {
1471
1475
  get each() {
1472
1476
  return e.items;
1473
1477
  },
1474
1478
  children: (e) => (() => {
1475
- var t = ci(), n = t.firstChild, r = n.firstChild, i = r.nextSibling;
1476
- return I(t, P(U, {
1479
+ var t = li(), n = t.firstChild, r = n.firstChild, i = r.nextSibling;
1480
+ return F(t, N(H, {
1477
1481
  get icon() {
1478
1482
  return e.icon;
1479
1483
  },
1480
1484
  class: "glasshome-panel-fact-icon"
1481
- }), n), I(r, () => e.label), I(i, () => e.value), t;
1485
+ }), n), F(r, () => e.label), F(i, () => e.value), t;
1482
1486
  })()
1483
1487
  })), t;
1484
1488
  })();
1485
1489
  }
1486
1490
  //#endregion
1487
1491
  //#region src/framework/panel/panel-entity.tsx
1488
- 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 = {
1492
+ var _i = (e) => typeof e == "number" ? Math.round(e) : void 0, vi = (e) => e.charAt(0).toUpperCase() + e.slice(1).replaceAll("_", " "), X = (e) => ({ entity_id: e.id }), yi = {
1489
1493
  light: {
1490
1494
  icon: "mdi:lightbulb",
1491
1495
  tone: (e) => {
@@ -1525,10 +1529,10 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1525
1529
  on: (e) => e.state === "on",
1526
1530
  state: (e) => {
1527
1531
  if (e.state !== "on") return "Off";
1528
- let t = gi(e.attributes.percentage);
1532
+ let t = _i(e.attributes.percentage);
1529
1533
  return t === void 0 ? "On" : `${t}%`;
1530
1534
  },
1531
- level: (e) => e.state === "on" ? gi(e.attributes.percentage) ?? 100 : 0,
1535
+ level: (e) => e.state === "on" ? _i(e.attributes.percentage) ?? 100 : 0,
1532
1536
  setLevel: (e, t, n) => e("fan", "set_percentage", { percentage: n }, X(t)),
1533
1537
  tap: (e, t) => e("fan", "toggle", {}, X(t))
1534
1538
  },
@@ -1537,10 +1541,10 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1537
1541
  tone: "var(--tone-info)",
1538
1542
  on: (e) => e.state !== "closed",
1539
1543
  state: (e) => {
1540
- let t = gi(e.attributes.current_position), n = _i(e.state);
1544
+ let t = _i(e.attributes.current_position), n = vi(e.state);
1541
1545
  return t !== void 0 && e.state === "open" ? `${n} · ${t}%` : n;
1542
1546
  },
1543
- level: (e) => gi(e.attributes.current_position),
1547
+ level: (e) => _i(e.attributes.current_position),
1544
1548
  setLevel: (e, t, n) => e("cover", "set_cover_position", { position: n }, X(t)),
1545
1549
  tap: (e, t) => e("cover", t.state === "closed" ? "open_cover" : "close_cover", {}, X(t))
1546
1550
  },
@@ -1548,7 +1552,7 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1548
1552
  icon: (e) => e.state === "locked" ? "mdi:lock" : "mdi:lock-open-variant",
1549
1553
  tone: "var(--tone-success)",
1550
1554
  on: (e) => e.state === "locked",
1551
- state: (e) => _i(e.state),
1555
+ state: (e) => vi(e.state),
1552
1556
  tap: (e, t) => e("lock", t.state === "locked" ? "unlock" : "lock", {}, X(t))
1553
1557
  },
1554
1558
  climate: {
@@ -1558,14 +1562,14 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1558
1562
  state: (e) => {
1559
1563
  if (e.state === "off") return "Off";
1560
1564
  let t = e.attributes.temperature;
1561
- return typeof t == "number" ? `${_i(e.state)} · ${t}°` : _i(e.state);
1565
+ return typeof t == "number" ? `${vi(e.state)} · ${t}°` : vi(e.state);
1562
1566
  }
1563
1567
  },
1564
1568
  media_player: {
1565
1569
  icon: "mdi:speaker",
1566
1570
  tone: "var(--tone-accent)",
1567
1571
  on: (e) => e.state === "playing",
1568
- state: (e) => typeof e.attributes.media_title == "string" && e.state !== "off" ? e.attributes.media_title : _i(e.state),
1572
+ state: (e) => typeof e.attributes.media_title == "string" && e.state !== "off" ? e.attributes.media_title : vi(e.state),
1569
1573
  level: (e) => typeof e.attributes.volume_level == "number" ? Math.round(e.attributes.volume_level * 100) : void 0,
1570
1574
  setLevel: (e, t, n) => e("media_player", "volume_set", { volume_level: n / 100 }, X(t)),
1571
1575
  tap: (e, t) => e("media_player", "media_play_pause", {}, X(t))
@@ -1575,7 +1579,7 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1575
1579
  tone: "var(--tone-info)",
1576
1580
  on: (e) => e.state === "on",
1577
1581
  state: (e) => {
1578
- let t = bi[e.deviceClass ?? ""] ?? ["On", "Off"];
1582
+ let t = xi[e.deviceClass ?? ""] ?? ["On", "Off"];
1579
1583
  return e.state === "on" ? t[0] : t[1];
1580
1584
  }
1581
1585
  },
@@ -1583,14 +1587,14 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1583
1587
  icon: "mdi:gesture-tap-button",
1584
1588
  tone: "var(--tone-accent)",
1585
1589
  on: () => !1,
1586
- state: (e) => xi(e.state),
1590
+ state: (e) => Si(e.state),
1587
1591
  tap: (e, t) => e("button", "press", {}, X(t))
1588
1592
  },
1589
1593
  input_button: {
1590
1594
  icon: "mdi:gesture-tap-button",
1591
1595
  tone: "var(--tone-accent)",
1592
1596
  on: () => !1,
1593
- state: (e) => xi(e.state),
1597
+ state: (e) => Si(e.state),
1594
1598
  tap: (e, t) => e("input_button", "press", {}, X(t))
1595
1599
  },
1596
1600
  scene: {
@@ -1607,14 +1611,14 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1607
1611
  state: (e) => e.state === "on" ? "Running" : "Tap to run",
1608
1612
  tap: (e, t) => e("script", "turn_on", {}, X(t))
1609
1613
  }
1610
- }, yi = {
1614
+ }, bi = {
1611
1615
  garage: "mdi:garage",
1612
1616
  gate: "mdi:gate",
1613
1617
  door: "mdi:door",
1614
1618
  curtain: "mdi:curtains",
1615
1619
  shutter: "mdi:window-shutter",
1616
1620
  awning: "mdi:awning"
1617
- }, bi = {
1621
+ }, xi = {
1618
1622
  door: ["Open", "Closed"],
1619
1623
  window: ["Open", "Closed"],
1620
1624
  garage_door: ["Open", "Closed"],
@@ -1628,44 +1632,44 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
1628
1632
  battery: ["Low", "Normal"],
1629
1633
  connectivity: ["Connected", "Disconnected"]
1630
1634
  };
1631
- function xi(e) {
1635
+ function Si(e) {
1632
1636
  let t = Date.parse(e);
1633
1637
  return Number.isNaN(t) ? "Never pressed" : new Date(t).toLocaleTimeString([], {
1634
1638
  hour: "2-digit",
1635
1639
  minute: "2-digit"
1636
1640
  });
1637
1641
  }
1638
- var Si = {
1642
+ var Ci = {
1639
1643
  icon: "mdi:circle-medium",
1640
1644
  tone: "var(--tone-neutral)",
1641
1645
  on: (e) => e.state === "on",
1642
- state: (e) => _i(e.state)
1646
+ state: (e) => vi(e.state)
1643
1647
  };
1644
- function Ci(e, t) {
1648
+ function wi(e, t) {
1645
1649
  if (!t || e.length <= t.length || !e.toLowerCase().startsWith(t.toLowerCase())) return e;
1646
1650
  let n = e.slice(t.length).trim();
1647
1651
  return n ? n.charAt(0).toUpperCase() + n.slice(1) : e;
1648
1652
  }
1649
- function wi(e) {
1650
- return !!vi[e]?.tap || !!vi[e]?.setLevel;
1651
- }
1652
1653
  function Ti(e) {
1653
- let t = te(() => e.entityId), { callService: n } = an(), [r, i] = k();
1654
+ return !!yi[e]?.tap || !!yi[e]?.setLevel;
1655
+ }
1656
+ function Ei(e) {
1657
+ let t = te(() => e.entityId), { callService: n } = on(), [r, i] = k();
1654
1658
  return D(() => {
1655
1659
  t(), i(void 0);
1656
- }), P(E, {
1660
+ }), N(T, {
1657
1661
  get when() {
1658
1662
  return t();
1659
1663
  },
1660
1664
  children: (t) => {
1661
- let a = () => vi[t().domain] ?? Si, o = () => r() ?? a().level?.(t()), s = () => a().setLevel;
1662
- return P(mi, {
1665
+ let a = () => yi[t().domain] ?? Ci, o = () => r() ?? a().level?.(t()), s = () => a().setLevel;
1666
+ return N(hi, {
1663
1667
  get icon() {
1664
1668
  let n = a().icon;
1665
- return typeof n == "function" ? e.icon ?? n(t()) : e.icon ?? t().icon ?? yi[t().domain === "cover" ? t().deviceClass ?? "" : ""] ?? n;
1669
+ return typeof n == "function" ? e.icon ?? n(t()) : e.icon ?? t().icon ?? bi[t().domain === "cover" ? t().deviceClass ?? "" : ""] ?? n;
1666
1670
  },
1667
1671
  get name() {
1668
- return e.name ?? Ci(t().friendlyName ?? t().id, e.within);
1672
+ return e.name ?? wi(t().friendlyName ?? t().id, e.within);
1669
1673
  },
1670
1674
  get state() {
1671
1675
  return a().state(t());
@@ -1679,7 +1683,7 @@ function Ti(e) {
1679
1683
  return a().on(t());
1680
1684
  },
1681
1685
  get slide() {
1682
- return L(() => !!(s() && o() !== void 0))() ? {
1686
+ return I(() => !!(s() && o() !== void 0))() ? {
1683
1687
  value: o() ?? 0,
1684
1688
  onChange: i,
1685
1689
  onCommit: (e) => s()?.(n, t(), e)
@@ -1697,8 +1701,8 @@ function Ti(e) {
1697
1701
  }
1698
1702
  //#endregion
1699
1703
  //#region src/framework/dialogs/debug-view.tsx
1700
- var Ei = /*#__PURE__*/ V("<pre class=\"text-muted-foreground max-h-64 overflow-auto p-3 font-mono text-xs leading-relaxed\">"), Di = /*#__PURE__*/ V("<span class=\"flex items-center gap-2\">"), Oi = /*#__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\">"), ki = /*#__PURE__*/ V("<div class=\"flex flex-col\">"), Ai = /*#__PURE__*/ V("<pre class=\"text-muted-foreground max-h-96 overflow-auto p-3 font-mono text-xs leading-relaxed whitespace-pre-wrap\">");
1701
- function ji(e, t, n) {
1704
+ var Di = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-64 overflow-auto p-3 font-mono text-xs leading-relaxed\">"), Oi = /*#__PURE__*/ B("<span class=\"flex items-center gap-2\">"), ki = /*#__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\">"), Ai = /*#__PURE__*/ B("<div class=\"flex flex-col\">"), ji = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-96 overflow-auto p-3 font-mono text-xs leading-relaxed whitespace-pre-wrap\">");
1705
+ function Mi(e, t, n) {
1702
1706
  return {
1703
1707
  widgetConfig: e,
1704
1708
  entities: t.map((e) => ({
@@ -1715,18 +1719,18 @@ function ji(e, t, n) {
1715
1719
  ...n
1716
1720
  };
1717
1721
  }
1718
- var Mi = (e) => JSON.stringify(e, null, 2), Ni = {
1722
+ var Ni = (e) => JSON.stringify(e, null, 2), Pi = {
1719
1723
  idle: "lucide:copy",
1720
1724
  copied: "lucide:check",
1721
1725
  failed: "lucide:triangle-alert"
1722
- }, Pi = {
1726
+ }, Fi = {
1723
1727
  idle: "text-muted-foreground",
1724
1728
  copied: "text-success",
1725
1729
  failed: "text-destructive"
1726
1730
  };
1727
- function Fi(e) {
1728
- let { state: t, copy: n } = Yt();
1729
- return P(Te, {
1731
+ function Ii(e) {
1732
+ let { state: t, copy: n } = Zt();
1733
+ return N(Oe, {
1730
1734
  variant: "ghost",
1731
1735
  size: "icon",
1732
1736
  class: "size-8",
@@ -1735,70 +1739,70 @@ function Fi(e) {
1735
1739
  },
1736
1740
  onClick: () => void n(e.text()),
1737
1741
  get children() {
1738
- return P(U, {
1742
+ return N(H, {
1739
1743
  get icon() {
1740
- return Ni[t()];
1744
+ return Pi[t()];
1741
1745
  },
1742
1746
  width: 16,
1743
1747
  height: 16,
1744
1748
  get class() {
1745
- return Pi[t()];
1749
+ return Fi[t()];
1746
1750
  }
1747
1751
  });
1748
1752
  }
1749
1753
  });
1750
1754
  }
1751
- function Ii(e) {
1755
+ function Li(e) {
1752
1756
  let t = e.replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ");
1753
1757
  return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
1754
1758
  }
1755
- var Li = (e) => e === null || typeof e != "object" && typeof e != "function";
1756
- function Ri(e) {
1759
+ var Ri = (e) => e === null || typeof e != "object" && typeof e != "function";
1760
+ function zi(e) {
1757
1761
  return e == null ? "None" : String(e);
1758
1762
  }
1759
- function zi(e) {
1763
+ function Bi(e) {
1760
1764
  return Array.isArray(e) ? e.length : typeof e == "object" && e ? Object.keys(e).length : 0;
1761
1765
  }
1762
- function Bi(e) {
1766
+ function Vi(e) {
1763
1767
  let t = new Date(e);
1764
1768
  return Number.isNaN(t.getTime()) ? e : t.toLocaleString();
1765
1769
  }
1766
- function Vi(e) {
1767
- return P(mt, {
1770
+ function Hi(e) {
1771
+ return N(gt, {
1768
1772
  class: "overflow-hidden p-0",
1769
1773
  get children() {
1770
- var t = Ei();
1771
- return I(t, () => Mi(e.value)), t;
1774
+ var t = Di();
1775
+ return F(t, () => Ni(e.value)), t;
1772
1776
  }
1773
1777
  });
1774
1778
  }
1775
- function Hi(e) {
1776
- return P(ve, {
1779
+ function Ui(e) {
1780
+ return N(xe, {
1777
1781
  collapsible: !0,
1778
1782
  class: "border-border/50 border-t",
1779
1783
  get children() {
1780
- return P(be, {
1784
+ return N(Ce, {
1781
1785
  get value() {
1782
1786
  return e.label;
1783
1787
  },
1784
1788
  get children() {
1785
- return [P(xe, {
1789
+ return [N(we, {
1786
1790
  class: "text-muted-foreground py-3 text-xs",
1787
1791
  get children() {
1788
- var t = Di();
1789
- return I(t, () => e.label, null), I(t, P(E, {
1792
+ var t = Oi();
1793
+ return F(t, () => e.label, null), F(t, N(T, {
1790
1794
  get when() {
1791
1795
  return e.count !== void 0;
1792
1796
  },
1793
1797
  get children() {
1794
- return P(Re, { get children() {
1798
+ return N(Ve, { get children() {
1795
1799
  return e.count;
1796
1800
  } });
1797
1801
  }
1798
1802
  }), null), t;
1799
1803
  }
1800
- }), P(ye, { get children() {
1801
- return P(Vi, { get value() {
1804
+ }), N(Se, { get children() {
1805
+ return N(Hi, { get value() {
1802
1806
  return e.value;
1803
1807
  } });
1804
1808
  } })];
@@ -1807,77 +1811,77 @@ function Hi(e) {
1807
1811
  }
1808
1812
  });
1809
1813
  }
1810
- function Ui(e) {
1814
+ function Wi(e) {
1811
1815
  return (() => {
1812
- var t = Oi(), n = t.firstChild, r = n.firstChild, i = n.nextSibling;
1813
- return I(n, P(ft, {
1816
+ var t = ki(), n = t.firstChild, r = n.firstChild, i = n.nextSibling;
1817
+ return F(n, N(mt, {
1814
1818
  get icon() {
1815
1819
  return e.icon;
1816
1820
  },
1817
1821
  size: "sm"
1818
- }), r), I(r, P(Ge, {
1822
+ }), r), F(r, N(qe, {
1819
1823
  class: "truncate",
1820
1824
  get children() {
1821
1825
  return e.title;
1822
1826
  }
1823
- }), null), I(r, P(E, {
1827
+ }), null), F(r, N(T, {
1824
1828
  get when() {
1825
1829
  return e.subtitle;
1826
1830
  },
1827
- children: (e) => P(pt, {
1831
+ children: (e) => N(ht, {
1828
1832
  class: "truncate font-mono",
1829
1833
  get children() {
1830
1834
  return e();
1831
1835
  }
1832
1836
  })
1833
- }), null), I(n, () => e.badge, null), I(n, P(Fi, {
1837
+ }), null), F(n, () => e.badge, null), F(n, N(Ii, {
1834
1838
  get label() {
1835
1839
  return `Copy ${e.title}`;
1836
1840
  },
1837
- text: () => Mi(e.source)
1838
- }), null), I(i, () => e.children), t;
1841
+ text: () => Ni(e.source)
1842
+ }), null), F(i, () => e.children), t;
1839
1843
  })();
1840
1844
  }
1841
- function Wi(e) {
1842
- let t = O(() => Object.entries(e.record)), n = O(() => t().flatMap(([e, t]) => Li(t) ? [[e, t]] : [])), r = O(() => t().filter(([, e]) => !Li(e)));
1843
- return P(E, {
1845
+ function Gi(e) {
1846
+ let t = O(() => Object.entries(e.record)), n = O(() => t().flatMap(([e, t]) => Ri(t) ? [[e, t]] : [])), r = O(() => t().filter(([, e]) => !Ri(e)));
1847
+ return N(T, {
1844
1848
  get when() {
1845
1849
  return t().length > 0;
1846
1850
  },
1847
1851
  get fallback() {
1848
- return P(pt, { children: "Nothing set" });
1852
+ return N(ht, { children: "Nothing set" });
1849
1853
  },
1850
1854
  get children() {
1851
- return [P(E, {
1855
+ return [N(T, {
1852
1856
  get when() {
1853
1857
  return n().length > 0;
1854
1858
  },
1855
1859
  get children() {
1856
- var e = ki();
1857
- return I(e, P(T, {
1860
+ var e = Ai();
1861
+ return F(e, N(w, {
1858
1862
  get each() {
1859
1863
  return n();
1860
1864
  },
1861
- children: ([e, t]) => P(Ue, {
1865
+ children: ([e, t]) => N(V, {
1862
1866
  get label() {
1863
- return Ii(e);
1867
+ return Li(e);
1864
1868
  },
1865
1869
  get children() {
1866
- return Ri(t);
1870
+ return zi(t);
1867
1871
  }
1868
1872
  })
1869
1873
  })), e;
1870
1874
  }
1871
- }), P(T, {
1875
+ }), N(w, {
1872
1876
  get each() {
1873
1877
  return r();
1874
1878
  },
1875
- children: ([e, t]) => P(Hi, {
1879
+ children: ([e, t]) => N(Ui, {
1876
1880
  get label() {
1877
- return Ii(e);
1881
+ return Li(e);
1878
1882
  },
1879
1883
  get count() {
1880
- return zi(t);
1884
+ return Bi(t);
1881
1885
  },
1882
1886
  value: t
1883
1887
  })
@@ -1885,9 +1889,9 @@ function Wi(e) {
1885
1889
  }
1886
1890
  });
1887
1891
  }
1888
- function Gi(e) {
1892
+ function Ki(e) {
1889
1893
  let t = () => e.entity.attributes ?? {};
1890
- return P(Ui, {
1894
+ return N(Wi, {
1891
1895
  icon: "lucide:activity",
1892
1896
  get title() {
1893
1897
  return e.entity.friendly_name ?? e.entity.entity_id;
@@ -1896,7 +1900,7 @@ function Gi(e) {
1896
1900
  return e.entity.entity_id;
1897
1901
  },
1898
1902
  get badge() {
1899
- return P(Ce, { get children() {
1903
+ return N(Ee, { get children() {
1900
1904
  return e.entity.state;
1901
1905
  } });
1902
1906
  },
@@ -1905,52 +1909,52 @@ function Gi(e) {
1905
1909
  },
1906
1910
  get children() {
1907
1911
  return [(() => {
1908
- var t = ki();
1909
- return I(t, P(Ue, {
1912
+ var t = Ai();
1913
+ return F(t, N(V, {
1910
1914
  label: "Domain",
1911
1915
  get children() {
1912
1916
  return e.entity.domain;
1913
1917
  }
1914
- }), null), I(t, P(E, {
1918
+ }), null), F(t, N(T, {
1915
1919
  get when() {
1916
1920
  return e.entity.device_class;
1917
1921
  },
1918
- children: (e) => P(Ue, {
1922
+ children: (e) => N(V, {
1919
1923
  label: "Device class",
1920
1924
  get children() {
1921
1925
  return e();
1922
1926
  }
1923
1927
  })
1924
- }), null), I(t, P(E, {
1928
+ }), null), F(t, N(T, {
1925
1929
  get when() {
1926
1930
  return e.entity.area_id;
1927
1931
  },
1928
- children: (e) => P(Ue, {
1932
+ children: (e) => N(V, {
1929
1933
  label: "Area",
1930
1934
  get children() {
1931
1935
  return e();
1932
1936
  }
1933
1937
  })
1934
- }), null), I(t, P(Ue, {
1938
+ }), null), F(t, N(V, {
1935
1939
  label: "Changed",
1936
1940
  get children() {
1937
- return Bi(e.entity.last_changed);
1941
+ return Vi(e.entity.last_changed);
1938
1942
  }
1939
- }), null), I(t, P(Ue, {
1943
+ }), null), F(t, N(V, {
1940
1944
  label: "Updated",
1941
1945
  get children() {
1942
- return Bi(e.entity.last_updated);
1946
+ return Vi(e.entity.last_updated);
1943
1947
  }
1944
1948
  }), null), t;
1945
- })(), P(E, {
1949
+ })(), N(T, {
1946
1950
  get when() {
1947
- return zi(t()) > 0;
1951
+ return Bi(t()) > 0;
1948
1952
  },
1949
1953
  get children() {
1950
- return P(Hi, {
1954
+ return N(Ui, {
1951
1955
  label: "Attributes",
1952
1956
  get count() {
1953
- return zi(t());
1957
+ return Bi(t());
1954
1958
  },
1955
1959
  get value() {
1956
1960
  return t();
@@ -1961,42 +1965,42 @@ function Gi(e) {
1961
1965
  }
1962
1966
  });
1963
1967
  }
1964
- function Ki(e) {
1968
+ function qi(e) {
1965
1969
  let t = O(() => Object.keys(e.data).filter((e) => e !== "widgetConfig" && e !== "entities"));
1966
- return P(We, { get children() {
1970
+ return N(Ke, { get children() {
1967
1971
  return [
1968
- P(Ui, {
1972
+ N(Wi, {
1969
1973
  icon: "lucide:sliders-horizontal",
1970
1974
  title: "Configuration",
1971
1975
  get source() {
1972
1976
  return e.data.widgetConfig;
1973
1977
  },
1974
1978
  get children() {
1975
- return P(Wi, { get record() {
1979
+ return N(Gi, { get record() {
1976
1980
  return e.data.widgetConfig;
1977
1981
  } });
1978
1982
  }
1979
1983
  }),
1980
- P(T, {
1984
+ N(w, {
1981
1985
  get each() {
1982
1986
  return e.data.entities;
1983
1987
  },
1984
- children: (e) => P(Gi, { entity: e })
1988
+ children: (e) => N(Ki, { entity: e })
1985
1989
  }),
1986
- P(T, {
1990
+ N(w, {
1987
1991
  get each() {
1988
1992
  return t();
1989
1993
  },
1990
- children: (t) => P(Ui, {
1994
+ children: (t) => N(Wi, {
1991
1995
  icon: "lucide:braces",
1992
1996
  get title() {
1993
- return Ii(t);
1997
+ return Li(t);
1994
1998
  },
1995
1999
  get source() {
1996
2000
  return e.data[t];
1997
2001
  },
1998
2002
  get children() {
1999
- return P(Vi, { get value() {
2003
+ return N(Hi, { get value() {
2000
2004
  return e.data[t];
2001
2005
  } });
2002
2006
  }
@@ -2005,52 +2009,52 @@ function Ki(e) {
2005
2009
  ];
2006
2010
  } });
2007
2011
  }
2008
- function qi(e) {
2012
+ function Ji(e) {
2009
2013
  if (typeof e != "object" || !e) return;
2010
2014
  let t = e;
2011
2015
  return Array.isArray(t.entities) && typeof t.widgetConfig == "object" ? t : void 0;
2012
2016
  }
2013
- function Ji(e) {
2014
- let t = O(() => qi(e.data));
2015
- return P(E, {
2017
+ function Yi(e) {
2018
+ let t = O(() => Ji(e.data));
2019
+ return N(T, {
2016
2020
  get when() {
2017
2021
  return e.data !== void 0;
2018
2022
  },
2019
2023
  get fallback() {
2020
- return P(ze, { get children() {
2021
- return P(Ve, { get children() {
2022
- return [P(He, { children: "Nothing to inspect" }), P(Be, { children: "This widget publishes no debug information." })];
2024
+ return N(He, { get children() {
2025
+ return N(We, { get children() {
2026
+ return [N(Ge, { children: "Nothing to inspect" }), N(Ue, { children: "This widget publishes no debug information." })];
2023
2027
  } });
2024
2028
  } });
2025
2029
  },
2026
2030
  get children() {
2027
- return P(E, {
2031
+ return N(T, {
2028
2032
  get when() {
2029
2033
  return t();
2030
2034
  },
2031
2035
  get fallback() {
2032
- return P(Ui, {
2036
+ return N(Wi, {
2033
2037
  icon: "lucide:braces",
2034
2038
  title: "Debug data",
2035
2039
  get source() {
2036
2040
  return e.data;
2037
2041
  },
2038
2042
  get children() {
2039
- return P(E, {
2043
+ return N(T, {
2040
2044
  get when() {
2041
2045
  return typeof e.data == "string";
2042
2046
  },
2043
2047
  get fallback() {
2044
- return P(Vi, { get value() {
2048
+ return N(Hi, { get value() {
2045
2049
  return e.data;
2046
2050
  } });
2047
2051
  },
2048
2052
  get children() {
2049
- return P(mt, {
2053
+ return N(gt, {
2050
2054
  class: "overflow-hidden p-0",
2051
2055
  get children() {
2052
- var t = Ai();
2053
- return I(t, () => e.data), t;
2056
+ var t = ji();
2057
+ return F(t, () => e.data), t;
2054
2058
  }
2055
2059
  });
2056
2060
  }
@@ -2058,7 +2062,7 @@ function Ji(e) {
2058
2062
  }
2059
2063
  });
2060
2064
  },
2061
- children: (e) => P(Ki, { get data() {
2065
+ children: (e) => N(qi, { get data() {
2062
2066
  return e();
2063
2067
  } })
2064
2068
  });
@@ -2067,21 +2071,21 @@ function Ji(e) {
2067
2071
  }
2068
2072
  //#endregion
2069
2073
  //#region src/framework/dialogs/validate-config.ts
2070
- function Yi(e) {
2074
+ function Xi(e) {
2071
2075
  let t = "";
2072
2076
  for (let n of e) t += typeof n == "number" ? `[${n}]` : t ? `.${String(n)}` : String(n);
2073
2077
  return t;
2074
2078
  }
2075
- function Xi(e, t) {
2079
+ function Zi(e, t) {
2076
2080
  let n = e.safeParse(t);
2077
2081
  return n.success ? null : n.error.issues.map((e) => {
2078
- let t = Yi(e.path);
2082
+ let t = Xi(e.path);
2079
2083
  return t ? `${t}: ${e.message}` : e.message;
2080
2084
  });
2081
2085
  }
2082
2086
  //#endregion
2083
2087
  //#region src/framework/dialogs/WidgetDialog.tsx
2084
- var Zi = /*#__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\">"), Qi = /*#__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"), $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><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__*/ 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\">"), ta = /*#__PURE__*/ V("<div class=glasshome-sheet>"), na = /*#__PURE__*/ V("<div class=glasshome-sheet-band aria-hidden=true><img alt>"), ra = /*#__PURE__*/ V("<span class=\"glasshome-widget-icon glass glass-tint glasshome-sheet-icon\">"), ia = /*#__PURE__*/ V("<span class=\"inline-flex size-3.5 shrink-0 items-center\">"), aa = (e) => Qt(e), oa = {
2088
+ var Qi = /*#__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\">"), $i = /*#__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"), 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><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>"), ta = /*#__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\">"), na = /*#__PURE__*/ B("<div class=glasshome-sheet>"), ra = /*#__PURE__*/ B("<div class=glasshome-sheet-band aria-hidden=true><img alt>"), ia = /*#__PURE__*/ B("<span class=\"glasshome-widget-icon glass glass-tint glasshome-sheet-icon\">"), aa = /*#__PURE__*/ B("<span class=\"inline-flex size-3.5 shrink-0 items-center\">"), oa = (e) => en(e), sa = {
2085
2089
  sm: "sm",
2086
2090
  md: "md",
2087
2091
  lg: "lg",
@@ -2090,24 +2094,24 @@ var Zi = /*#__PURE__*/ V("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 f
2090
2094
  "2xl": "xl",
2091
2095
  "3xl": "xl",
2092
2096
  "4xl": "full"
2093
- }, sa = {
2097
+ }, ca = {
2094
2098
  idle: "Copy all",
2095
2099
  copied: "Copied",
2096
2100
  failed: "Copy failed"
2097
2101
  };
2098
- function ca(e) {
2102
+ function la(e) {
2099
2103
  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([]);
2100
2104
  D(me(() => t.config, (e) => {
2101
2105
  e && i({ ...e });
2102
2106
  })), D(me(() => t.configSchema, (e) => {
2103
- e && o(aa(e));
2107
+ e && o(oa(e));
2104
2108
  }));
2105
2109
  let l = () => n() && JSON.stringify(r()) !== JSON.stringify(t.config), u = (e) => {
2106
2110
  !e && t.config && (i({ ...t.config }), c([])), t.onOpenChange(e);
2107
2111
  }, d = () => {
2108
2112
  let e = t.configSchema;
2109
2113
  if (e) {
2110
- let t = Xi(e, r());
2114
+ let t = Zi(e, r());
2111
2115
  if (t) {
2112
2116
  c(t);
2113
2117
  return;
@@ -2116,7 +2120,7 @@ function ca(e) {
2116
2120
  c([]), t.onConfigSave?.(r());
2117
2121
  }, [f, p] = k(t.defaultTab ?? "controls"), m = () => t.activeTab ?? f(), h = (e) => {
2118
2122
  t.onActiveTabChange ? t.onActiveTabChange(e) : p(e);
2119
- }, g = () => oa[t.maxWidth ?? "xl"], _ = () => {
2123
+ }, g = () => sa[t.maxWidth ?? "xl"], _ = () => {
2120
2124
  if (t.tabs) return t.tabs.map((e) => ({
2121
2125
  ...e,
2122
2126
  icon: () => e.icon,
@@ -2126,10 +2130,10 @@ function ca(e) {
2126
2130
  return e.push({
2127
2131
  id: "edit",
2128
2132
  label: "Edit",
2129
- icon: () => Zi(),
2133
+ icon: () => Qi(),
2130
2134
  content: () => t.editContent ?? (() => {
2131
2135
  let e = t.SchemaForm, o = n() ? a() : void 0;
2132
- return !o || !e ? Qi() : P(e, {
2136
+ return !o || !e ? $i() : N(e, {
2133
2137
  schema: o,
2134
2138
  get data() {
2135
2139
  return r();
@@ -2143,86 +2147,86 @@ function ca(e) {
2143
2147
  }), e.push({
2144
2148
  id: "controls",
2145
2149
  label: "Controls",
2146
- icon: () => $i(),
2147
- content: () => t.controlsContent ?? P(ze, { get children() {
2148
- return P(Ve, { get children() {
2149
- return [P(He, { children: "No controls" }), P(Be, { children: "This widget is shown as is." })];
2150
+ icon: () => ea(),
2151
+ content: () => t.controlsContent ?? N(He, { get children() {
2152
+ return N(We, { get children() {
2153
+ return [N(Ge, { children: "No controls" }), N(Ue, { children: "This widget is shown as is." })];
2150
2154
  } });
2151
2155
  } })
2152
2156
  }), e.push({
2153
2157
  id: "debug",
2154
2158
  label: "Debug",
2155
- icon: () => ea(),
2156
- content: () => t.debugContent ?? P(Ji, { get data() {
2159
+ icon: () => ta(),
2160
+ content: () => t.debugContent ?? N(Yi, { get data() {
2157
2161
  return t.debugData;
2158
2162
  } })
2159
2163
  }), e;
2160
- }, v = j(W), y = mn(v);
2164
+ }, v = j(U), y = hn(v);
2161
2165
  D(() => y?.setHasSheet(t.sheet !== void 0)), A(() => y?.setHasSheet(!1));
2162
2166
  let b = () => ({
2163
2167
  icon: t.tile?.icon ?? y?.icon(),
2164
2168
  tone: t.tile?.tone ?? y?.accent() ?? y?.tone(),
2165
2169
  backdrop: t.tile?.backdrop
2166
- }), x = () => v?.developer?.() ?? !1, S = () => H() === "controls" && t.sheet !== void 0, ee = la(), te = () => v?.anchor?.(), C = () => S() && !ee() && te() !== void 0, w = Yt(), ne = () => {
2170
+ }), x = () => v?.developer?.() ?? !1, S = () => B() === "controls" && t.sheet !== void 0, ee = ua(), te = () => v?.anchor?.(), ne = () => S() && !ee() && te() !== void 0, C = Zt(), re = () => {
2167
2171
  if (t.debugData === void 0) return;
2168
2172
  let e = typeof t.debugData == "string" ? t.debugData : JSON.stringify(t.debugData, null, 2);
2169
- w.copy(e);
2170
- }, 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([
2173
+ C.copy(e);
2174
+ }, ie = t.ResponsiveDialog, ae = t.ResponsiveDialogContent, oe = t.ResponsiveDialogHeader, se = t.ResponsiveDialogTitle, ce = t.ResponsiveDialogDescription, le = t.ResponsiveDialogBody ?? it, ue = t.ResponsiveDialogFooter ?? lt, de = t.Tabs ?? Dt, fe = t.TabsList ?? jt, E = t.TabsTrigger ?? Nt, pe = t.TabsContent ?? kt, he = t.Button, _e = O(me([
2171
2175
  () => t.open,
2172
2176
  a,
2173
2177
  () => t.config,
2174
2178
  () => t.tabs
2175
- ], () => _())), 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 = () => {
2176
- let e = B(), n = m() === "controls" && t.sheet === void 0 && !("controlsContent" in t) && !t.tabs ? "edit" : m();
2179
+ ], () => _())), ve = (e) => n() ? u(e) : t.onOpenChange(e), M = () => n() ? l() : t.hasUnsavedChanges, ye = () => n() ? d : t.onSave, R = () => _e().filter((e) => e.id !== "debug" || x()), z = () => R().filter((e) => e.id !== "controls" || t.sheet === void 0), B = () => {
2180
+ let e = R(), n = m() === "controls" && t.sheet === void 0 && !("controlsContent" in t) && !t.tabs ? "edit" : m();
2177
2181
  return e.some((e) => e.id === n) ? n : e[0]?.id ?? n;
2178
- }, ve = () => H() === "edit" && (z() || t.onDelete) || H() === "debug" && t.debugData !== void 0;
2179
- return P(re, {
2182
+ }, be = () => B() === "edit" && (ye() || t.onDelete) || B() === "debug" && t.debugData !== void 0;
2183
+ return N(ie, {
2180
2184
  get open() {
2181
2185
  return t.open;
2182
2186
  },
2183
- onOpenChange: (e) => N(e),
2187
+ onOpenChange: (e) => ve(e),
2184
2188
  get children() {
2185
- return P(E, {
2189
+ return N(T, {
2186
2190
  get when() {
2187
2191
  return !S();
2188
2192
  },
2189
2193
  get fallback() {
2190
- return P(ie, {
2194
+ return N(ae, {
2191
2195
  size: "sm",
2192
2196
  get ariaLabel() {
2193
2197
  return t.title;
2194
2198
  },
2195
2199
  get anchor() {
2196
- return L(() => !!C())() ? te() : void 0;
2200
+ return I(() => !!ne())() ? te() : void 0;
2197
2201
  },
2198
2202
  class: "glasshome-sheet-surface",
2199
2203
  get style() {
2200
- return L(() => !!b().tone)() ? {
2204
+ return I(() => !!b().tone)() ? {
2201
2205
  "--glass-tone": b().tone,
2202
2206
  "--widget-color": b().tone
2203
2207
  } : void 0;
2204
2208
  },
2205
2209
  get children() {
2206
2210
  return [
2207
- P(E, {
2211
+ N(T, {
2208
2212
  get when() {
2209
2213
  return b().backdrop;
2210
2214
  },
2211
2215
  children: (e) => (() => {
2212
- var t = na(), n = t.firstChild;
2213
- return F(() => R(n, "src", e())), t;
2216
+ var t = ra(), n = t.firstChild;
2217
+ return P(() => L(n, "src", e())), t;
2214
2218
  })()
2215
2219
  }),
2216
- P(ae, {
2220
+ N(oe, {
2217
2221
  class: "items-center",
2218
2222
  get media() {
2219
- return P(E, {
2223
+ return N(T, {
2220
2224
  get when() {
2221
2225
  return b().icon;
2222
2226
  },
2223
2227
  children: (e) => (() => {
2224
- var t = ra();
2225
- return I(t, P(U, {
2228
+ var t = ia();
2229
+ return F(t, N(H, {
2226
2230
  get icon() {
2227
2231
  return e();
2228
2232
  },
@@ -2232,7 +2236,7 @@ function ca(e) {
2232
2236
  });
2233
2237
  },
2234
2238
  get children() {
2235
- return P(oe, {
2239
+ return N(se, {
2236
2240
  class: "truncate",
2237
2241
  get children() {
2238
2242
  return t.title;
@@ -2240,16 +2244,16 @@ function ca(e) {
2240
2244
  });
2241
2245
  }
2242
2246
  }),
2243
- P(ce, { get children() {
2244
- var e = ta();
2245
- return I(e, () => t.sheet?.()), e;
2247
+ N(le, { get children() {
2248
+ var e = na();
2249
+ return F(e, () => t.sheet?.()), e;
2246
2250
  } })
2247
2251
  ];
2248
2252
  }
2249
2253
  });
2250
2254
  },
2251
2255
  get children() {
2252
- return P(ie, {
2256
+ return N(ae, {
2253
2257
  get size() {
2254
2258
  return g();
2255
2259
  },
@@ -2257,70 +2261,70 @@ function ca(e) {
2257
2261
  return t.class;
2258
2262
  },
2259
2263
  get children() {
2260
- return P(ue, {
2264
+ return N(de, {
2261
2265
  get value() {
2262
- return H();
2266
+ return B();
2263
2267
  },
2264
2268
  onChange: h,
2265
2269
  layout: "split",
2266
2270
  get children() {
2267
2271
  return [
2268
- P(ae, {
2272
+ N(oe, {
2269
2273
  class: "flex-wrap",
2270
2274
  get action() {
2271
- return [P(E, {
2275
+ return [N(T, {
2272
2276
  get when() {
2273
2277
  return x() || t.tabs !== void 0;
2274
2278
  },
2275
2279
  get children() {
2276
- return P(de, {
2280
+ return N(fe, {
2277
2281
  class: "w-auto",
2278
2282
  get children() {
2279
- return P(T, {
2283
+ return N(w, {
2280
2284
  get each() {
2281
- return V();
2285
+ return z();
2282
2286
  },
2283
- children: (e) => P(fe, {
2287
+ children: (e) => N(E, {
2284
2288
  get value() {
2285
2289
  return e.id;
2286
2290
  },
2287
2291
  get children() {
2288
2292
  return [(() => {
2289
- var t = ia();
2290
- return I(t, () => e.icon()), t;
2291
- })(), L(() => e.label)];
2293
+ var t = aa();
2294
+ return F(t, () => e.icon()), t;
2295
+ })(), I(() => e.label)];
2292
2296
  }
2293
2297
  })
2294
2298
  });
2295
2299
  }
2296
2300
  });
2297
2301
  }
2298
- }), L(() => t.headerActions)];
2302
+ }), I(() => t.headerActions)];
2299
2303
  },
2300
2304
  get children() {
2301
- return [P(oe, {
2305
+ return [N(se, {
2302
2306
  class: "truncate",
2303
2307
  get children() {
2304
2308
  return t.title;
2305
2309
  }
2306
- }), P(E, {
2310
+ }), N(T, {
2307
2311
  get when() {
2308
2312
  return t.description;
2309
2313
  },
2310
2314
  get children() {
2311
- return P(se, { get children() {
2315
+ return N(ce, { get children() {
2312
2316
  return t.description;
2313
2317
  } });
2314
2318
  }
2315
2319
  })];
2316
2320
  }
2317
2321
  }),
2318
- P(ce, { get children() {
2319
- return P(T, {
2322
+ N(le, { get children() {
2323
+ return N(w, {
2320
2324
  get each() {
2321
- return B();
2325
+ return R();
2322
2326
  },
2323
- children: (e) => P(pe, {
2327
+ children: (e) => N(pe, {
2324
2328
  get value() {
2325
2329
  return e.id;
2326
2330
  },
@@ -2330,19 +2334,19 @@ function ca(e) {
2330
2334
  })
2331
2335
  });
2332
2336
  } }),
2333
- P(E, {
2337
+ N(T, {
2334
2338
  get when() {
2335
- return ve();
2339
+ return be();
2336
2340
  },
2337
2341
  get children() {
2338
- return P(le, { get children() {
2342
+ return N(ue, { get children() {
2339
2343
  return [
2340
- P(E, {
2344
+ N(T, {
2341
2345
  get when() {
2342
- return L(() => H() === "edit")() && t.onDelete;
2346
+ return I(() => B() === "edit")() && t.onDelete;
2343
2347
  },
2344
2348
  get children() {
2345
- return P(he, {
2349
+ return N(he, {
2346
2350
  size: "sm",
2347
2351
  variant: "destructive",
2348
2352
  onClick: () => t.onDelete?.(),
@@ -2350,32 +2354,32 @@ function ca(e) {
2350
2354
  });
2351
2355
  }
2352
2356
  }),
2353
- P(E, {
2357
+ N(T, {
2354
2358
  get when() {
2355
- return L(() => H() === "edit")() && z();
2359
+ return I(() => B() === "edit")() && ye();
2356
2360
  },
2357
2361
  get children() {
2358
- return P(he, {
2362
+ return N(he, {
2359
2363
  size: "sm",
2360
2364
  get disabled() {
2361
- return !_e();
2365
+ return !M();
2362
2366
  },
2363
- onClick: () => z()?.(),
2367
+ onClick: () => ye()?.(),
2364
2368
  children: "Save"
2365
2369
  });
2366
2370
  }
2367
2371
  }),
2368
- P(E, {
2372
+ N(T, {
2369
2373
  get when() {
2370
- return L(() => H() === "debug")() && t.debugData !== void 0;
2374
+ return I(() => B() === "debug")() && t.debugData !== void 0;
2371
2375
  },
2372
2376
  get children() {
2373
- return P(he, {
2377
+ return N(he, {
2374
2378
  size: "sm",
2375
2379
  variant: "outline",
2376
- onClick: ne,
2380
+ onClick: re,
2377
2381
  get children() {
2378
- return sa[w.state()];
2382
+ return ca[C.state()];
2379
2383
  }
2380
2384
  });
2381
2385
  }
@@ -2394,7 +2398,7 @@ function ca(e) {
2394
2398
  }
2395
2399
  });
2396
2400
  }
2397
- function la() {
2401
+ function ua() {
2398
2402
  let e = "(max-width: 639px)", [t, n] = k(typeof window < "u" && window.matchMedia(e).matches);
2399
2403
  return he(() => {
2400
2404
  let t = window.matchMedia(e), r = () => n(t.matches);
@@ -2402,78 +2406,184 @@ function la() {
2402
2406
  }), t;
2403
2407
  }
2404
2408
  //#endregion
2409
+ //#region node_modules/@glasshome/widget-contract/dist/state.mjs
2410
+ var da = {
2411
+ keyChars: 64,
2412
+ valueBytes: 8192,
2413
+ maxDepth: 8,
2414
+ keys: 32,
2415
+ instanceBytes: 65536,
2416
+ memberBytes: 131072,
2417
+ sendsPerMinute: 30,
2418
+ memberWritesPerMinute: 240,
2419
+ coalesceMs: 500
2420
+ }, fa = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/, pa = new TextEncoder(), ma = (e) => pa.encode(e).length;
2421
+ function ha(e, t) {
2422
+ return typeof e != "object" || !e || t !== 0 && (Array.isArray(e) ? e : Object.values(e)).every((e) => ha(e, t - 1));
2423
+ }
2424
+ function ga(e) {
2425
+ if (ma(e) > da.valueBytes) return !1;
2426
+ let t;
2427
+ try {
2428
+ t = JSON.parse(e);
2429
+ } catch {
2430
+ return !1;
2431
+ }
2432
+ return ha(t, da.maxDepth);
2433
+ }
2434
+ o.string().regex(fa), o.string().refine(ga, "JSON text within the widget state value limits");
2435
+ function _a(e) {
2436
+ let t = 0;
2437
+ for (let [n, r] of Object.entries(e)) t += ma(n) + ma(r);
2438
+ return t;
2439
+ }
2440
+ function va(e, t, n) {
2441
+ return fa.test(t) ? n === null ? "ok" : ga(n) ? !Object.hasOwn(e, t) && Object.keys(e).length >= da.keys ? "keys" : _a({
2442
+ ...e,
2443
+ [t]: n
2444
+ }) > da.instanceBytes ? "instance" : "ok" : "value" : "key";
2445
+ }
2446
+ function ya(e = {}) {
2447
+ let t = { ...e };
2448
+ return {
2449
+ snapshot: () => ({ ...t }),
2450
+ write(e, n) {
2451
+ let r = va(t, e, n);
2452
+ return r === "ok" && (n === null ? delete t[e] : t[e] = n), r;
2453
+ }
2454
+ };
2455
+ }
2456
+ //#endregion
2457
+ //#region src/framework/hooks/use-widget-state.ts
2458
+ function ba(e) {
2459
+ if (e === void 0) return null;
2460
+ try {
2461
+ return JSON.stringify(e);
2462
+ } catch {
2463
+ return;
2464
+ }
2465
+ }
2466
+ function xa(e) {
2467
+ if (e !== void 0) try {
2468
+ return JSON.parse(e);
2469
+ } catch {
2470
+ return;
2471
+ }
2472
+ }
2473
+ function Sa() {
2474
+ let e = ya(), t = /* @__PURE__ */ new Map(), n = (n) => {
2475
+ let r = t.get(n);
2476
+ return r || (r = k(e.snapshot()[n]), t.set(n, r)), r;
2477
+ };
2478
+ return {
2479
+ read: (e) => xa(n(e)[0]()),
2480
+ write(t, r) {
2481
+ let i = ba(r);
2482
+ if (i === void 0) return "value";
2483
+ let a = e.write(t, i);
2484
+ return a === "ok" && n(t)[1](i ?? void 0), a;
2485
+ }
2486
+ };
2487
+ }
2488
+ var Ca = /* @__PURE__ */ new WeakMap(), wa = (e) => e[pn];
2489
+ function Ta(e) {
2490
+ let t = e, n = wa(t);
2491
+ for (; n;) t = n, n = wa(t);
2492
+ return t;
2493
+ }
2494
+ function Ea(e) {
2495
+ if (e.state) return e.state;
2496
+ let t = Ta(e), n = Ca.get(t);
2497
+ return n || (n = Sa(), Ca.set(t, n)), n;
2498
+ }
2499
+ function Da(e, t) {
2500
+ if (t === void 0) return !0;
2501
+ let n = ba(t);
2502
+ return typeof n == "string" && e.safeParse(JSON.parse(n)).success;
2503
+ }
2504
+ function Oa(e, t, n) {
2505
+ let r = Ea(rn()), i = O(() => {
2506
+ let i = t.safeParse(r.read(e));
2507
+ return i.success ? i.data : n;
2508
+ });
2509
+ return [i, (n) => {
2510
+ let a = typeof n == "function" ? n(_e(i)) : n;
2511
+ return Da(t, a) ? r.write(e, a) : "value";
2512
+ }];
2513
+ }
2514
+ //#endregion
2405
2515
  //#region src/framework/hooks/use-widget-dashboard.ts
2406
- var ua = {
2516
+ var ka = {
2407
2517
  name: "",
2408
2518
  icon: "",
2409
2519
  areaId: null
2410
2520
  };
2411
- function da() {
2412
- let e = j(W);
2413
- return () => e?.dashboard?.() ?? ua;
2521
+ function Aa() {
2522
+ let e = j(U);
2523
+ return () => e?.dashboard?.() ?? ka;
2414
2524
  }
2415
2525
  //#endregion
2416
2526
  //#region src/framework/hooks/use-widget-viewer.ts
2417
- var fa = { name: null };
2418
- function pa() {
2419
- let e = j(W);
2420
- return () => e?.viewer?.() ?? fa;
2527
+ var ja = { name: null };
2528
+ function Ma() {
2529
+ let e = j(U);
2530
+ return () => e?.viewer?.() ?? ja;
2421
2531
  }
2422
2532
  //#endregion
2423
2533
  //#region node_modules/@glasshome/ui/dist/tokens/index.js
2424
- var ma = /^oklch\(\s*([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s*\)$/i;
2425
- function ha(e, t, n) {
2534
+ var Na = /^oklch\(\s*([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s*\)$/i;
2535
+ function Pa(e, t, n) {
2426
2536
  return Math.min(Math.max(e, t), n);
2427
2537
  }
2428
- function ga(e) {
2538
+ function Fa(e) {
2429
2539
  return String(Number.isInteger(e) ? e : Number(e.toFixed(6)));
2430
2540
  }
2431
- function _a(e) {
2432
- let t = ma.exec(e.trim());
2541
+ function Ia(e) {
2542
+ let t = Na.exec(e.trim());
2433
2543
  return t ? {
2434
2544
  l: Number(t[1]),
2435
2545
  c: Number(t[2]),
2436
2546
  h: Number(t[3])
2437
2547
  } : null;
2438
2548
  }
2439
- function va(e, t, n) {
2440
- return `oklch(${ga(e)} ${ga(t)} ${ga(n)})`;
2549
+ function La(e, t, n) {
2550
+ return `oklch(${Fa(e)} ${Fa(t)} ${Fa(n)})`;
2441
2551
  }
2442
- function ya(e, t) {
2443
- let n = _a(e);
2444
- return n ? va(ha(n.l + t, 0, 1), n.c, n.h) : e;
2552
+ function Ra(e, t) {
2553
+ let n = Ia(e);
2554
+ return n ? La(Pa(n.l + t, 0, 1), n.c, n.h) : e;
2445
2555
  }
2446
- function ba(e, t) {
2447
- let n = _a(e);
2448
- return n ? va(ha(t, 0, 1), ha(n.c * .8, 0, .4), n.h) : e;
2556
+ function za(e, t) {
2557
+ let n = Ia(e);
2558
+ return n ? La(Pa(t, 0, 1), Pa(n.c * .8, 0, .4), n.h) : e;
2449
2559
  }
2450
- function xa(e, t) {
2560
+ function Ba(e, t) {
2451
2561
  return {
2452
2562
  ...e,
2453
2563
  popover: e.card,
2454
- muted: t === "light" ? ya(e.background, -.015) : ya(e.background, .1),
2564
+ muted: t === "light" ? Ra(e.background, -.015) : Ra(e.background, .1),
2455
2565
  mutedForeground: t === "light" ? "oklch(0.44 0 0)" : "oklch(0.71 0 0)",
2456
- input: t === "light" ? ya(e.border, .01) : ya(e.border, .04),
2566
+ input: t === "light" ? Ra(e.border, .01) : Ra(e.border, .04),
2457
2567
  ring: e.accent,
2458
2568
  destructive: t === "light" ? "oklch(0.54 0.19 23.0704)" : "oklch(0.7106 0.1661 22.2162)"
2459
2569
  };
2460
2570
  }
2461
- function Sa(e) {
2462
- return xa({
2463
- primary: ya(e.primary, .15),
2464
- accent: ya(e.accent, .1),
2465
- secondary: ba(e.secondary, .14),
2466
- border: ba(e.border, .26),
2467
- card: ba(e.card, .17),
2468
- background: ba(e.background, .12)
2571
+ function Va(e) {
2572
+ return Ba({
2573
+ primary: Ra(e.primary, .15),
2574
+ accent: Ra(e.accent, .1),
2575
+ secondary: za(e.secondary, .14),
2576
+ border: za(e.border, .26),
2577
+ card: za(e.card, .17),
2578
+ background: za(e.background, .12)
2469
2579
  }, "dark");
2470
2580
  }
2471
- var Ca = {
2581
+ var Ha = {
2472
2582
  edgeWidth: 1,
2473
2583
  edgeInk: 0,
2474
2584
  edgeAccent: 0,
2475
2585
  inkLift: 0
2476
- }, wa = {
2586
+ }, Ua = {
2477
2587
  frosted: {
2478
2588
  blur: 24,
2479
2589
  clarity: 60,
@@ -2481,7 +2591,7 @@ var Ca = {
2481
2591
  tint: 1,
2482
2592
  glow: 0,
2483
2593
  ink: 0,
2484
- ...Ca
2594
+ ...Ha
2485
2595
  },
2486
2596
  frost: {
2487
2597
  blur: 24,
@@ -2490,7 +2600,7 @@ var Ca = {
2490
2600
  tint: 1,
2491
2601
  glow: 0,
2492
2602
  ink: 0,
2493
- ...Ca,
2603
+ ...Ha,
2494
2604
  grain: .4
2495
2605
  },
2496
2606
  paper: {
@@ -2500,7 +2610,7 @@ var Ca = {
2500
2610
  tint: .85,
2501
2611
  glow: 0,
2502
2612
  ink: 0,
2503
- ...Ca,
2613
+ ...Ha,
2504
2614
  edgeInk: .3,
2505
2615
  sheen: 0,
2506
2616
  edge: .2,
@@ -2530,13 +2640,13 @@ var Ca = {
2530
2640
  tint: .7,
2531
2641
  glow: 0,
2532
2642
  ink: 1,
2533
- ...Ca,
2643
+ ...Ha,
2534
2644
  inkLift: 1
2535
2645
  }
2536
- }, Ta = {
2646
+ }, Wa = {
2537
2647
  v: 1,
2538
2648
  preset: "frosted"
2539
- }, Ea = {
2649
+ }, Ga = {
2540
2650
  blur: [0, 48],
2541
2651
  clarity: [0, 100],
2542
2652
  depth: [0, 2],
@@ -2556,7 +2666,7 @@ var Ca = {
2556
2666
  washAngle: [0, 360],
2557
2667
  relief: [0, 2],
2558
2668
  fill: [0, .6]
2559
- }, Da = {
2669
+ }, Ka = {
2560
2670
  vibrancy: 1,
2561
2671
  inset: 0,
2562
2672
  lightFrom: 315,
@@ -2572,10 +2682,10 @@ var Ca = {
2572
2682
  relief: 1,
2573
2683
  accent: "theme",
2574
2684
  fill: 0
2575
- }, Oa = Object.keys(Ea);
2576
- function ka(e) {
2577
- let { edgeWidth: t, edgeInk: n, edgeAccent: r, inkLift: i, ...a } = wa[e.preset], o = {
2578
- ...Da,
2685
+ }, qa = Object.keys(Ga);
2686
+ function Ja(e) {
2687
+ let { edgeWidth: t, edgeInk: n, edgeAccent: r, inkLift: i, ...a } = Ua[e.preset], o = {
2688
+ ...Ka,
2579
2689
  ...a,
2580
2690
  ...e.dials
2581
2691
  }, s = {
@@ -2584,7 +2694,7 @@ function ka(e) {
2584
2694
  sheen: o.sheen ?? o.depth,
2585
2695
  shadow: o.shadow ?? o.depth
2586
2696
  };
2587
- for (let e of Oa) s[e] = ha(s[e], ...Ea[e]);
2697
+ for (let e of qa) s[e] = Pa(s[e], ...Ga[e]);
2588
2698
  return s;
2589
2699
  }
2590
2700
  function Z(e, t) {
@@ -2611,8 +2721,8 @@ function Q(e, t, n, r, i, a, o, s) {
2611
2721
  swatch: r,
2612
2722
  material: s,
2613
2723
  colors: {
2614
- light: xa(i, "light"),
2615
- dark: o ? xa(o, "dark") : Sa(i)
2724
+ light: Ba(i, "light"),
2725
+ dark: o ? Ba(o, "dark") : Va(i)
2616
2726
  },
2617
2727
  background: a
2618
2728
  };
@@ -2780,17 +2890,17 @@ Z("glass-house", {
2780
2890
  });
2781
2891
  //#endregion
2782
2892
  //#region src/framework/hooks/use-material.ts
2783
- var Aa = {
2784
- id: Ta.preset,
2785
- terms: ka(Ta)
2893
+ var Ya = {
2894
+ id: Wa.preset,
2895
+ terms: Ja(Wa)
2786
2896
  };
2787
- function ja() {
2788
- let e = j(W);
2789
- return () => e?.material?.() ?? Aa;
2897
+ function Xa() {
2898
+ let e = j(U);
2899
+ return () => e?.material?.() ?? Ya;
2790
2900
  }
2791
2901
  //#endregion
2792
2902
  //#region src/framework/hooks/use-intersection-pause.ts
2793
- function Ma(e) {
2903
+ function Za(e) {
2794
2904
  if (typeof IntersectionObserver > "u") return () => !1;
2795
2905
  let [t, n] = k(!1), r = new IntersectionObserver((e) => {
2796
2906
  let t = e[0];
@@ -2803,40 +2913,40 @@ function Ma(e) {
2803
2913
  }
2804
2914
  //#endregion
2805
2915
  //#region src/framework/hooks/use-daylight.ts
2806
- var Na = -6, Pa = 864e5;
2807
- function Fa(e, t) {
2916
+ var Qa = -6, $a = 864e5;
2917
+ function eo(e, t) {
2808
2918
  let n = e.next_rising ? Date.parse(e.next_rising) : NaN, r = e.next_setting ? Date.parse(e.next_setting) : NaN;
2809
2919
  if (!Number.isFinite(n) || !Number.isFinite(r)) return;
2810
- let [i, a] = e.state === "above_horizon" ? [n - Pa, r] : [r - Pa, n], o = a - i;
2920
+ let [i, a] = e.state === "above_horizon" ? [n - $a, r] : [r - $a, n], o = a - i;
2811
2921
  if (!(o <= 0)) return Math.min(1, Math.max(0, (t.getTime() - i) / o));
2812
2922
  }
2813
- var Ia = 20, La = 7;
2814
- function Ra(e, t) {
2923
+ var to = 20, no = 7;
2924
+ function ro(e, t) {
2815
2925
  if (e && (e.state === "above_horizon" || e.state === "below_horizon")) {
2816
- let n = e.elevation, r = e.state === "above_horizon" ? "day" : n !== void 0 && n > Na ? e.rising ? "dawn" : "dusk" : "night";
2926
+ let n = e.elevation, r = e.state === "above_horizon" ? "day" : n !== void 0 && n > Qa ? e.rising ? "dawn" : "dusk" : "night";
2817
2927
  return {
2818
2928
  phase: r,
2819
2929
  isNight: r === "night",
2820
2930
  elevation: n,
2821
- progress: Fa(e, t)
2931
+ progress: eo(e, t)
2822
2932
  };
2823
2933
  }
2824
- let n = t.getHours(), r = n >= Ia || n < La ? "night" : "day";
2934
+ let n = t.getHours(), r = n >= to || n < no ? "night" : "day";
2825
2935
  return {
2826
2936
  phase: r,
2827
2937
  isNight: r === "night"
2828
2938
  };
2829
2939
  }
2830
- var [za, Ba] = k(/* @__PURE__ */ new Date()), Va = 0, Ha;
2831
- function Ua() {
2832
- return Va++, Ha ||= (Ba(/* @__PURE__ */ new Date()), setInterval(() => Ba(/* @__PURE__ */ new Date()), 6e4)), () => {
2833
- Va--, Va === 0 && Ha && (clearInterval(Ha), Ha = void 0);
2940
+ var [io, ao] = k(/* @__PURE__ */ new Date()), oo = 0, so;
2941
+ function co() {
2942
+ return oo++, so ||= (ao(/* @__PURE__ */ new Date()), setInterval(() => ao(/* @__PURE__ */ new Date()), 6e4)), () => {
2943
+ oo--, oo === 0 && so && (clearInterval(so), so = void 0);
2834
2944
  };
2835
2945
  }
2836
- function Wa() {
2946
+ function lo() {
2837
2947
  let e = te("sun.sun");
2838
2948
  return D(() => {
2839
- e() || A(Ua());
2949
+ e() || A(co());
2840
2950
  }), O(() => {
2841
2951
  let t = e(), n = t ? {
2842
2952
  state: t.state,
@@ -2845,46 +2955,46 @@ function Wa() {
2845
2955
  next_rising: t.attributes?.next_rising,
2846
2956
  next_setting: t.attributes?.next_setting
2847
2957
  } : void 0;
2848
- return Ra(n, n ? /* @__PURE__ */ new Date() : za());
2958
+ return ro(n, n ? /* @__PURE__ */ new Date() : io());
2849
2959
  });
2850
2960
  }
2851
2961
  //#endregion
2852
2962
  //#region src/theme.ts
2853
- var Ga = /* @__PURE__ */ new Map(), Ka;
2854
- function qa(e) {
2963
+ var uo = /* @__PURE__ */ new Map(), fo;
2964
+ function po(e) {
2855
2965
  let t = new MutationObserver(() => {
2856
- for (let [t, [, n]] of Ga) n(e.classList.contains(t));
2966
+ for (let [t, [, n]] of uo) n(e.classList.contains(t));
2857
2967
  });
2858
2968
  return t.observe(e, {
2859
2969
  attributes: !0,
2860
2970
  attributeFilter: ["class"]
2861
2971
  }), t;
2862
2972
  }
2863
- function Ja(e) {
2973
+ function mo(e) {
2864
2974
  if (typeof document > "u") return !1;
2865
- let t = document.documentElement, n = Ga.get(e);
2866
- return n || (n = k(t.classList.contains(e)), Ga.set(e, n), Ka ??= qa(t)), n[0](), t.classList.contains(e);
2975
+ let t = document.documentElement, n = uo.get(e);
2976
+ return n || (n = k(t.classList.contains(e)), uo.set(e, n), fo ??= po(t)), n[0](), t.classList.contains(e);
2867
2977
  }
2868
- function Ya() {
2869
- return Ja("dark");
2978
+ function ho() {
2979
+ return mo("dark");
2870
2980
  }
2871
2981
  //#endregion
2872
2982
  //#region src/framework/hooks/use-reduced-motion.ts
2873
- function Xa() {
2983
+ function go() {
2874
2984
  if (typeof window > "u" || typeof window.matchMedia != "function") return () => !1;
2875
2985
  let e = window.matchMedia("(prefers-reduced-motion: reduce)"), [t, n] = k(e.matches), r = (e) => n(e.matches);
2876
- return e.addEventListener("change", r), A(() => e.removeEventListener("change", r)), () => t() || Ja("reduce-motion");
2986
+ return e.addEventListener("change", r), A(() => e.removeEventListener("change", r)), () => t() || mo("reduce-motion");
2877
2987
  }
2878
2988
  //#endregion
2879
2989
  //#region src/framework/hooks/use-widget-entity-group.ts
2880
- function Za(e) {
2990
+ function _o(e) {
2881
2991
  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(() => {
2882
2992
  if (!r()) return;
2883
2993
  let t = e.aggregationMode?.();
2884
2994
  if (!t || t === "none") return;
2885
2995
  let n = e.entities();
2886
- if (t === "light" || t === "binary-sensor" || t === "switch") return kr(n, e.allEntitiesMode);
2887
- if (t === "sensor") return Ar(n, e.sensorGroupType?.() ?? "mean", !0);
2996
+ if (t === "light" || t === "binary-sensor" || t === "switch") return Ar(n, e.allEntitiesMode);
2997
+ if (t === "sensor") return jr(n, e.sensorGroupType?.() ?? "mean", !0);
2888
2998
  }), o = O(() => r() ? void 0 : e.emptyStateConfig);
2889
2999
  return {
2890
3000
  entities: e.entities,
@@ -2897,7 +3007,7 @@ function Za(e) {
2897
3007
  }
2898
3008
  //#endregion
2899
3009
  //#region src/framework/theming/svg-colors.ts
2900
- var Qa = {
3010
+ var vo = {
2901
3011
  solar: "oklch(0.74 0.18 60)",
2902
3012
  grid: "oklch(0.62 0.12 245)",
2903
3013
  battery: "oklch(0.70 0.18 145)",
@@ -2906,21 +3016,21 @@ var Qa = {
2906
3016
  positive: "oklch(0.70 0.14 160)",
2907
3017
  negative: "oklch(0.64 0.22 27)"
2908
3018
  };
2909
- function $a(e) {
3019
+ function yo(e) {
2910
3020
  return {
2911
3021
  fill: `color-mix(in oklch, ${e} 20%, transparent)`,
2912
3022
  stroke: e,
2913
3023
  solid: e
2914
3024
  };
2915
3025
  }
2916
- var eo = Object.fromEntries(Object.entries(Qa).map(([e, t]) => [e, $a(t)])), to = o.enum([
3026
+ var bo = Object.fromEntries(Object.entries(vo).map(([e, t]) => [e, yo(t)])), xo = o.enum([
2917
3027
  "success",
2918
3028
  "warning",
2919
3029
  "danger",
2920
3030
  "info",
2921
3031
  "neutral",
2922
3032
  "accent"
2923
- ]), no = {
3033
+ ]), So = {
2924
3034
  title: e(() => o.string().optional().meta({
2925
3035
  title: "Title",
2926
3036
  description: "Optional display name override"
@@ -2940,38 +3050,38 @@ var eo = Object.fromEntries(Object.entries(Qa).map(([e, t]) => [e, $a(t)])), to
2940
3050
  formType: "area-picker",
2941
3051
  title: "Area"
2942
3052
  }), "widgetFields.areaId")
2943
- }, ro = 24;
3053
+ }, Co = 24;
2944
3054
  function $(e) {
2945
3055
  let t = {};
2946
3056
  for (let [n, r] of Object.entries(e)) r !== void 0 && (t[n] = r);
2947
3057
  return t;
2948
3058
  }
2949
- function io() {
3059
+ function wo() {
2950
3060
  return o.string().optional().meta({
2951
3061
  title: "Title",
2952
3062
  description: "Optional display name override"
2953
3063
  });
2954
3064
  }
2955
- function ao(e) {
3065
+ function To(e) {
2956
3066
  return (e.default === void 0 ? o.string().optional() : o.string().default(e.default)).meta($({
2957
3067
  title: e.title,
2958
3068
  description: e.description
2959
3069
  }));
2960
3070
  }
2961
- function oo(e) {
3071
+ function Eo(e) {
2962
3072
  let t = o.number();
2963
3073
  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($({
2964
3074
  title: e.title,
2965
3075
  description: e.description
2966
3076
  }));
2967
3077
  }
2968
- function so(e) {
3078
+ function Do(e) {
2969
3079
  return o.boolean().default(e.default ?? !1).meta($({
2970
3080
  title: e.title,
2971
3081
  description: e.description
2972
3082
  }));
2973
3083
  }
2974
- function co(e, t) {
3084
+ function Oo(e, t) {
2975
3085
  let n = o.enum(e);
2976
3086
  return (t.default === void 0 ? n.optional() : n.default(t.default)).meta($({
2977
3087
  title: t.title,
@@ -2980,14 +3090,14 @@ function co(e, t) {
2980
3090
  icons: t.icons
2981
3091
  }));
2982
3092
  }
2983
- function lo(e, t) {
3093
+ function ko(e, t) {
2984
3094
  return o.array(o.enum(e)).default([...t.default ?? []]).meta($({
2985
3095
  title: t.title,
2986
3096
  description: t.description,
2987
3097
  labels: t.labels
2988
3098
  }));
2989
3099
  }
2990
- function uo(e, t) {
3100
+ function Ao(e, t) {
2991
3101
  return o.array(o.string()).default([]).meta($({
2992
3102
  domain: e,
2993
3103
  title: t?.title ?? "Entities",
@@ -2995,7 +3105,7 @@ function uo(e, t) {
2995
3105
  deviceClass: t?.deviceClass
2996
3106
  }));
2997
3107
  }
2998
- function fo(e, t) {
3108
+ function jo(e, t) {
2999
3109
  return o.array(o.string()).default([]).meta($({
3000
3110
  domain: e,
3001
3111
  title: t?.title ?? "Entity",
@@ -3004,13 +3114,13 @@ function fo(e, t) {
3004
3114
  singleSelect: !0
3005
3115
  }));
3006
3116
  }
3007
- function po(e) {
3117
+ function Mo(e) {
3008
3118
  return o.string().optional().meta({
3009
3119
  formType: "area-picker",
3010
3120
  title: e?.title ?? "Area"
3011
3121
  });
3012
3122
  }
3013
- function mo(e) {
3123
+ function No(e) {
3014
3124
  let t = o.string().meta($({
3015
3125
  formType: "icon-picker",
3016
3126
  title: e?.title ?? "Icon",
@@ -3018,7 +3128,7 @@ function mo(e) {
3018
3128
  }));
3019
3129
  return e?.default === void 0 ? t.optional() : t.default(e.default);
3020
3130
  }
3021
- function ho(e) {
3131
+ function Po(e) {
3022
3132
  let t = e?.presets && Object.fromEntries(Object.entries(e.presets).map(([e, t]) => [e, {
3023
3133
  label: t.label,
3024
3134
  thumb: t.thumb
@@ -3030,36 +3140,36 @@ function ho(e) {
3030
3140
  }));
3031
3141
  return e?.default === void 0 ? n.optional() : n.default(e.default);
3032
3142
  }
3033
- function go(e) {
3143
+ function Fo(e) {
3034
3144
  return o.array(o.string()).default([]).meta($({
3035
3145
  title: e.title,
3036
3146
  description: e.description
3037
3147
  }));
3038
3148
  }
3039
- function _o(e, t) {
3149
+ function Io(e, t) {
3040
3150
  let n = o.object(e);
3041
- return n.default($t(n)).meta({ title: t.title });
3151
+ return n.default(tn(n)).meta({ title: t.title });
3042
3152
  }
3043
- function vo(e) {
3153
+ function Lo(e) {
3044
3154
  return e.def;
3045
3155
  }
3046
- function yo(e) {
3156
+ function Ro(e) {
3047
3157
  if (o.globalRegistry.get(e)?.formType === "list") return !0;
3048
- let t = vo(e);
3049
- return t.shape ? Object.values(t.shape).some(yo) : t.options ? t.options.some(yo) : t.element ? yo(t.element) : t.innerType ? yo(t.innerType) : !1;
3158
+ let t = Lo(e);
3159
+ return t.shape ? Object.values(t.shape).some(Ro) : t.options ? t.options.some(Ro) : t.element ? Ro(t.element) : t.innerType ? Ro(t.innerType) : !1;
3050
3160
  }
3051
- function bo(e) {
3052
- let t = e, n = vo(t).innerType;
3053
- for (; n;) t = n, n = vo(t).innerType;
3161
+ function zo(e) {
3162
+ let t = e, n = Lo(t).innerType;
3163
+ for (; n;) t = n, n = Lo(t).innerType;
3054
3164
  return t;
3055
3165
  }
3056
- function xo(e) {
3057
- let t = vo(bo(e));
3166
+ function Bo(e) {
3167
+ let t = Lo(zo(e));
3058
3168
  if (t.shape) return new Set(Object.keys(t.shape));
3059
3169
  if (t.options) {
3060
3170
  let e = [];
3061
3171
  for (let n of t.options) {
3062
- let t = xo(n);
3172
+ let t = Bo(n);
3063
3173
  if (!t) return null;
3064
3174
  e.push(t);
3065
3175
  }
@@ -3071,7 +3181,7 @@ function xo(e) {
3071
3181
  }
3072
3182
  return null;
3073
3183
  }
3074
- function So(e, t, n) {
3184
+ function Vo(e, t, n) {
3075
3185
  let r = { [t]: n };
3076
3186
  try {
3077
3187
  return e.parse(r);
@@ -3079,12 +3189,12 @@ function So(e, t, n) {
3079
3189
  return r;
3080
3190
  }
3081
3191
  }
3082
- function Co(e, t) {
3192
+ function Ho(e, t) {
3083
3193
  if (!Number.isInteger(t.max) || t.max < 1) throw Error(`field.list: max must be a positive integer, got ${t.max}`);
3084
- if (t.max > ro) throw Error(`field.list: max ${t.max} exceeds the ceiling of ${ro}`);
3194
+ if (t.max > Co) throw Error(`field.list: max ${t.max} exceeds the ceiling of ${Co}`);
3085
3195
  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}`);
3086
- if (yo(e)) throw Error("field.list: a list item cannot contain another field.list (depth 1 only)");
3087
- if (t.labelField !== void 0 && !xo(e)?.has(t.labelField)) throw Error(`field.list: labelField "${t.labelField}" must name a field present in every item`);
3196
+ if (Ro(e)) throw Error("field.list: a list item cannot contain another field.list (depth 1 only)");
3197
+ if (t.labelField !== void 0 && !Bo(e)?.has(t.labelField)) throw Error(`field.list: labelField "${t.labelField}" must name a field present in every item`);
3088
3198
  let n = o.array(e);
3089
3199
  return t.min !== void 0 && (n = n.min(t.min)), n = n.max(t.max), n.default([]).meta($({
3090
3200
  formType: "list",
@@ -3094,7 +3204,7 @@ function Co(e, t) {
3094
3204
  labelField: t.labelField
3095
3205
  }));
3096
3206
  }
3097
- function wo(e, t, n) {
3207
+ function Uo(e, t, n) {
3098
3208
  let r = Object.keys(t)[0];
3099
3209
  if (r === void 0) throw Error("field.variants: at least one variant is required");
3100
3210
  if (n.shared && e in n.shared) throw Error(`field.variants: shared fields cannot redefine the discriminator "${e}"`);
@@ -3107,7 +3217,7 @@ function wo(e, t, n) {
3107
3217
  ...r,
3108
3218
  [e]: o.literal(t)
3109
3219
  })), a = o.discriminatedUnion(e, i), s = i[0];
3110
- return a.default(s ? So(s, e, r) : {}).meta($({
3220
+ return a.default(s ? Vo(s, e, r) : {}).meta($({
3111
3221
  formType: "variants",
3112
3222
  discriminator: e,
3113
3223
  title: n.title,
@@ -3115,35 +3225,35 @@ function wo(e, t, n) {
3115
3225
  labels: n.labels
3116
3226
  }));
3117
3227
  }
3118
- var To = {
3119
- title: io,
3120
- text: ao,
3121
- number: oo,
3122
- toggle: so,
3123
- choice: co,
3124
- choices: lo,
3125
- entities: uo,
3126
- entity: fo,
3127
- area: po,
3128
- icon: mo,
3129
- image: ho,
3130
- stringList: go,
3131
- group: _o,
3132
- list: Co,
3133
- variants: wo
3228
+ var Wo = {
3229
+ title: wo,
3230
+ text: To,
3231
+ number: Eo,
3232
+ toggle: Do,
3233
+ choice: Oo,
3234
+ choices: ko,
3235
+ entities: Ao,
3236
+ entity: jo,
3237
+ area: Mo,
3238
+ icon: No,
3239
+ image: Po,
3240
+ stringList: Fo,
3241
+ group: Io,
3242
+ list: Ho,
3243
+ variants: Uo
3134
3244
  };
3135
- function Eo(e) {
3245
+ function Go(e) {
3136
3246
  return o.object(e);
3137
3247
  }
3138
3248
  //#endregion
3139
3249
  //#region src/framework/image-src.ts
3140
- function Do(e, t) {
3141
- let n = Vt(e);
3142
- return n === void 0 ? Ut(e) : t?.[n]?.src;
3250
+ function Ko(e, t) {
3251
+ let n = Ut(e);
3252
+ return n === void 0 ? Gt(e) : t?.[n]?.src;
3143
3253
  }
3144
3254
  //#endregion
3145
3255
  //#region src/shared/spline.ts
3146
- function Oo(e) {
3256
+ function qo(e) {
3147
3257
  if (e.length < 2) return "";
3148
3258
  let t = e[0], n = e[1];
3149
3259
  if (!t || !n) return "";
@@ -3170,9 +3280,9 @@ function Oo(e) {
3170
3280
  }
3171
3281
  //#endregion
3172
3282
  //#region src/version.ts
3173
- var ko = {
3283
+ var Jo = {
3174
3284
  name: "@glasshome/widget-sdk",
3175
- version: "1.27.0",
3285
+ version: "1.28.0",
3176
3286
  description: "SDK for building GlassHome dashboard widgets with SolidJS",
3177
3287
  keywords: [
3178
3288
  "dashboard",
@@ -3244,7 +3354,7 @@ var ko = {
3244
3354
  lint: "oxlint --type-aware . && oxfmt --check ."
3245
3355
  },
3246
3356
  dependencies: {
3247
- "@glasshome/widget-contract": "0.6.0",
3357
+ "@glasshome/widget-contract": "0.7.0",
3248
3358
  "@tailwindcss/vite": "^4.1.13",
3249
3359
  clsx: "^2.1.1",
3250
3360
  "happy-dom": "^20.0.0",
@@ -3277,4 +3387,4 @@ var ko = {
3277
3387
  engines: { node: ">=18" }
3278
3388
  }.version;
3279
3389
  //#endregion
3280
- 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, 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, ko 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, to 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, Ji as WidgetDebugTab, Ki as WidgetDebugView, ca 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, ji as buildDebugData, g as byDomain, kr as calculateLightGroup, Ar as calculateSensorGroup, zt as copyText, Fr as countActiveEntities, Eo as defineConfig, en as defineWidget, t as deprecations, To 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, Do as imageSrc, Ht as imageUrl, hr as injectTokens, Ya as isDark, Nr as isEntityActive, wi as isPanelControllable, Wt as mediaUrl, Oo as monotoneCubicPath, Gt as parseColor, Kt as presetValue, d as sendWebRtcCandidate, f as startWebRtcSession, p as state, eo 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, Wa as useDaylight, S as useEntities, ee as useEntity, C as useEntityHistory, w as useEntityStatistics, ne as useForecast, re as useHassConfig, Ma as useIntersectionPause, ie as useLocale, ja as useMaterial, Xa 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, da as useWidgetDashboard, un as useWidgetDialog, Pn as useWidgetDimensions, Za as useWidgetEntityGroup, Mn as useWidgetGestures, pa as useWidgetViewer, no as widgetFields, a as z };
3390
+ export { Te as Badge, De as Button, ke as ButtonGroup, je as Carousel, Me as CarouselContent, Ne as CarouselDots, Pe as CarouselItem, Fe as CarouselNext, Ie as CarouselPrevious, Le as ColorDisc, Re as ColorSlider, ze as ColorWheel, Be as CountPill, Xe as Icon, Ze as Input, Qe as Label, Ei as PanelEntityRow, gi as PanelFacts, hi as PanelRow, mi as PanelRows, pi as PanelSection, tt as Progress, nt as ResponsiveDialog, rt as ResponsiveDialogBody, at as ResponsiveDialogClose, ot as ResponsiveDialogContent, st as ResponsiveDialogDescription, ct as ResponsiveDialogFooter, ut as ResponsiveDialogHeader, dt as ResponsiveDialogTitle, Jo as SDK_VERSION, ft as SchemaForm, pt as SectionIcon, _t as SectionTitle, vt as Select, yt as SelectContent, bt as SelectItem, xt as SelectTrigger, St as SelectValue, Ct as Slider, wt as SwatchPicker, Tt as Switch, Et as Tabs, Ot as TabsContent, At as TabsList, Mt as TabsTrigger, Pt as TemperatureBar, Ft as Toggle, It as ToggleGroup, Rt as ToggleGroupItem, xo as ToneSchema, Y as Widget, or as WidgetAction, lr as WidgetBackdrop, sr as WidgetChip, ar as WidgetChoice, wr as WidgetContent, rr as WidgetControls, U as WidgetCtx, Yi as WidgetDebugTab, qi as WidgetDebugView, la as WidgetDialog, ur as WidgetGlyph, tr as WidgetHead, nr as WidgetHero, Vn as WidgetIcon, cr as WidgetLayer, r as WidgetManifestSchema, Pn as WidgetSizeCtx, xr as WidgetSliderFill, Er as WidgetStatus, ir as WidgetStepper, kr as WidgetTitle, Vr as WidgetValue, Mi as buildDebugData, g as byDomain, Ar as calculateLightGroup, jr as calculateSensorGroup, Vt as copyText, Ir as countActiveEntities, Go as defineConfig, nn as defineWidget, t as deprecations, Wo as field, n as formatDeprecation, i as formatSchemaError, Fr as getEntityAttribute, s as getForecasts, c as getStream, l as getWebRtcClientConfig, u as hassMediaUrl, Ht as imagePreset, Ko as imageSrc, Wt as imageUrl, gr as injectTokens, ho as isDark, Pr as isEntityActive, Ti as isPanelControllable, Kt as mediaUrl, qo as monotoneCubicPath, qt as parseColor, Jt as presetValue, d as sendWebRtcCandidate, f as startWebRtcSession, p as state, bo as svgColors, m as trackEntityHistory, h as untrackEntityHistory, _ as useArea, v as useCalendarEvents, y as useCamera, Ln as useConfirm, b as useConnection, Xt as useCopyText, x as useCurrency, lo as useDaylight, S as useEntities, ee as useEntity, ne as useEntityHistory, C as useEntityStatistics, re as useForecast, ie as useHassConfig, Za as useIntersectionPause, ae as useLocale, Xa as useMaterial, go as useReducedMotion, on as useService, se as useStore, ce as useTemperatureUnit, ln as useToggle, cn as useTurnOff, sn as useTurnOn, fe as useUnitSystem, rn as useWidgetContext, Aa as useWidgetDashboard, dn as useWidgetDialog, Fn as useWidgetDimensions, _o as useWidgetEntityGroup, Nn as useWidgetGestures, Oa as useWidgetState, Ma as useWidgetViewer, So as widgetFields, a as z };