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