@glasshome/widget-sdk 1.20.0 → 1.21.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 re, useForecast as ie, useHassConfig as ae, useLocale as oe, useService as se, useStore 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 C, Show as w, children as T, createContext as me, createEffect as E, createMemo as D, createSignal as O, on as he, onCleanup as k, onMount as ge, splitProps as _e, useContext as A } from "solid-js";
7
- import { addEventListener as j, className as M, createComponent as N, delegateEvents as ve, effect as P, insert as F, memo as I, setAttribute as L, setStyleProperty as R, style as z, template as B, use as V } from "solid-js/web";
8
- import { Accordion as ye, AccordionContent as be, AccordionItem as xe, AccordionTrigger as Se, Badge as Ce, Badge as we, Button as Te, Button as Ee, ButtonGroup as De, ButtonGroup as Oe, Carousel as ke, CarouselContent as Ae, CarouselDots as je, CarouselItem as Me, CarouselNext as Ne, CarouselPrevious as Pe, ColorDisc as Fe, ColorSlider as Ie, ColorWheel as Le, CountPill as Re, CountPill as ze, Empty as Be, EmptyDescription as Ve, EmptyHeader as He, EmptyTitle as Ue, FactRow as H, FieldGroup as We, FieldTitle as Ge, Icon as Ke, Icon as U, Input as qe, Label as Je, Progress as Ye, ResponsiveDialog as Xe, ResponsiveDialogBody as Ze, ResponsiveDialogBody as Qe, ResponsiveDialogClose as $e, ResponsiveDialogContent as et, ResponsiveDialogDescription as tt, ResponsiveDialogFooter as nt, ResponsiveDialogFooter as rt, ResponsiveDialogHeader as it, ResponsiveDialogTitle as at, SchemaForm as ot, SectionIcon as st, SectionIcon as ct, SectionMeta as lt, SectionRow as ut, SectionTitle as dt, Select as ft, SelectContent as pt, SelectItem as mt, SelectTrigger as ht, SelectValue as gt, Slider as _t, SwatchPicker as vt, Switch as yt, Tabs as bt, Tabs as xt, TabsContent as St, TabsContent as Ct, TabsList as wt, TabsList as Tt, TabsTrigger as Et, TabsTrigger as Dt, TemperatureBar as Ot, Toggle as kt, ToggleGroup as At, ToggleGroup as jt, ToggleGroupItem as Mt, ToggleGroupItem as Nt, buttonVariants as Pt, imagePreset as Ft, imagePreset as It, imageUrl as Lt, imageUrl as Rt, mediaUrl as zt, parseColor as Bt, presetValue as Vt } from "@glasshome/ui/solid";
9
- import { clsx as Ht } from "clsx";
10
- import { twMerge as Ut } from "tailwind-merge";
5
+ import { byDomain as ee, useArea as g, useCalendarEvents as _, useCamera as v, useConnection as y, useCurrency as b, useEntities as x, useEntity as te, useEntity as S, useEntityHistory as ne, useEntityStatistics as re, useForecast as ie, useHassConfig as ae, useLocale as oe, useService as se, useStore 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 C, Show as w, children as me, createContext as he, createEffect as T, createMemo as E, createSignal as D, on as ge, onCleanup as O, onMount as _e, splitProps as ve, useContext as k } from "solid-js";
7
+ import { addEventListener as A, className as j, createComponent as M, delegateEvents as ye, effect as N, insert as P, memo as F, setAttribute as I, setStyleProperty as L, style as R, template as z, use as B } from "solid-js/web";
8
+ import { Accordion as be, AccordionContent as xe, AccordionItem as Se, AccordionTrigger as Ce, Badge as we, Badge as Te, Button as Ee, Button as De, ButtonGroup as Oe, ButtonGroup as ke, Carousel as Ae, CarouselContent as je, CarouselDots as Me, CarouselItem as Ne, CarouselNext as Pe, CarouselPrevious as Fe, ColorDisc as Ie, ColorSlider as Le, ColorWheel as Re, CountPill as ze, CountPill as Be, Empty as Ve, EmptyDescription as He, EmptyHeader as Ue, EmptyTitle as We, FactRow as V, FieldGroup as Ge, FieldTitle as Ke, HOLD_GRACE_MS as qe, HOLD_MS as Je, Icon as Ye, Icon as H, Input as Xe, Label as Ze, Popover as Qe, PopoverContent as $e, Progress as et, ResponsiveDialog as tt, ResponsiveDialogBody as nt, ResponsiveDialogBody as rt, ResponsiveDialogClose as it, ResponsiveDialogContent as at, ResponsiveDialogDescription as ot, ResponsiveDialogFooter as st, ResponsiveDialogFooter as ct, ResponsiveDialogHeader as lt, ResponsiveDialogTitle as ut, SchemaForm as dt, SectionIcon as ft, SectionIcon as pt, SectionMeta as mt, SectionRow as ht, SectionTitle as gt, Select as _t, SelectContent as vt, SelectItem as yt, SelectTrigger as bt, SelectValue as xt, Slider as St, SwatchPicker as Ct, Switch as wt, Tabs as Tt, Tabs as Et, TabsContent as Dt, TabsContent as Ot, TabsList as kt, TabsList as At, TabsTrigger as jt, TabsTrigger as Mt, TemperatureBar as Nt, Toggle as Pt, ToggleGroup as Ft, ToggleGroup as It, ToggleGroupItem as Lt, ToggleGroupItem as Rt, buttonVariants as zt, imagePreset as Bt, imagePreset as Vt, imageUrl as Ht, imageUrl as Ut, mediaUrl as Wt, parseColor as Gt, presetValue as Kt } from "@glasshome/ui/solid";
9
+ import { clsx as qt } from "clsx";
10
+ import { twMerge as Jt } from "tailwind-merge";
11
11
  //#region src/framework/to-form-schema.ts
12
- function Wt(e) {
12
+ function Yt(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 Wt(e) {
18
18
  } : e.jsonSchema;
19
19
  } });
20
20
  }
21
- function Gt(e) {
21
+ function Xt(e) {
22
22
  try {
23
23
  return e.parse({});
24
24
  } catch {
@@ -27,64 +27,64 @@ function Gt(e) {
27
27
  }
28
28
  //#endregion
29
29
  //#region src/define-widget.ts
30
- function Kt(e) {
31
- return e.configSchema && (e.manifest.schema || (e.manifest.schema = Wt(e.configSchema)), e.manifest.defaultConfig || (e.manifest.defaultConfig = Gt(e.configSchema))), e;
30
+ function Zt(e) {
31
+ return e.configSchema && (e.manifest.schema || (e.manifest.schema = Yt(e.configSchema)), e.manifest.defaultConfig || (e.manifest.defaultConfig = Xt(e.configSchema))), e;
32
32
  }
33
33
  //#endregion
34
34
  //#region src/framework/hooks/use-widget-context.ts
35
- var W = me();
36
- function qt() {
37
- let e = A(W);
35
+ var U = he();
36
+ function Qt() {
37
+ let e = k(U);
38
38
  if (!e) throw Error("useWidgetContext must be used within a Widget component");
39
39
  return e;
40
40
  }
41
41
  //#endregion
42
42
  //#region src/framework/hooks/use-service.ts
43
- function Jt(e) {
43
+ function $t(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 G(e, t) {
48
+ function W(e, t) {
49
49
  return async (n, r = {}) => {
50
- await e(Jt(n), t, r, { entity_id: n });
50
+ await e($t(n), t, r, { entity_id: n });
51
51
  };
52
52
  }
53
- function Yt() {
54
- let e = A(W)?.callService;
53
+ function en() {
54
+ let e = k(U)?.callService;
55
55
  return e ? {
56
56
  callService: e,
57
- turnOn: G(e, "turn_on"),
58
- turnOff: G(e, "turn_off"),
59
- toggle: G(e, "toggle")
57
+ turnOn: W(e, "turn_on"),
58
+ turnOff: W(e, "turn_off"),
59
+ toggle: W(e, "toggle")
60
60
  } : se();
61
61
  }
62
- function Xt() {
63
- let e = A(W)?.callService;
64
- return e ? G(e, "turn_on") : fe();
62
+ function tn() {
63
+ let e = k(U)?.callService;
64
+ return e ? W(e, "turn_on") : fe();
65
65
  }
66
- function Zt() {
67
- let e = A(W)?.callService;
68
- return e ? G(e, "turn_off") : de();
66
+ function nn() {
67
+ let e = k(U)?.callService;
68
+ return e ? W(e, "turn_off") : de();
69
69
  }
70
- function Qt() {
71
- let e = A(W)?.callService;
72
- return e ? G(e, "toggle") : ue();
70
+ function rn() {
71
+ let e = k(U)?.callService;
72
+ return e ? W(e, "toggle") : ue();
73
73
  }
74
74
  //#endregion
75
75
  //#region src/framework/design-system/z-index.ts
76
- var K = {
76
+ var an = {
77
77
  BACKGROUND: 0,
78
78
  CONTENT: 10,
79
79
  OVERLAY: 20,
80
80
  ACTIONS: 30
81
- }, q = /* @__PURE__ */ new WeakMap();
82
- function $t(e = "controls") {
83
- let [t, n] = O(!1), [r, i] = O(e), a = (t) => {
81
+ }, G = /* @__PURE__ */ new WeakMap();
82
+ function on(e = "controls") {
83
+ let [t, n] = D(!1), [r, i] = D(e), a = (t) => {
84
84
  i(t ?? e), n(!0);
85
- }, o = A(W);
86
- return o?.registerDialogOpener?.(a), o && q.set(o, a), k(() => {
87
- o?.registerDialogOpener?.(null), o && q.get(o) === a && q.delete(o);
85
+ }, o = k(U);
86
+ return o?.registerDialogOpener?.(a), o && G.set(o, a), O(() => {
87
+ o?.registerDialogOpener?.(null), o && G.get(o) === a && G.delete(o);
88
88
  }), {
89
89
  showDialog: t,
90
90
  setShowDialog: n,
@@ -106,15 +106,15 @@ function $t(e = "controls") {
106
106
  }
107
107
  //#endregion
108
108
  //#region src/framework/hooks/widget-registry.ts
109
- var en = /* @__PURE__ */ new WeakMap(), tn = Symbol("glasshome.widget.registry");
110
- function nn(e) {
111
- return e[tn] ?? e;
109
+ var sn = /* @__PURE__ */ new WeakMap(), cn = Symbol("glasshome.widget.registry");
110
+ function ln(e) {
111
+ return e[cn] ?? e;
112
112
  }
113
- function rn(e) {
113
+ function un(e) {
114
114
  if (!e) return;
115
- let t = nn(e), n = en.get(t);
115
+ let t = ln(e), n = sn.get(t);
116
116
  if (!n) {
117
- let [e, r] = O(!1), [i, a] = O(), [o, s] = O(), [c, l] = O();
117
+ let [e, r] = D(!1), [i, a] = D(), [o, s] = D(), [c, l] = D(), [u, d] = D(!1);
118
118
  n = {
119
119
  hasSheet: e,
120
120
  setHasSheet: r,
@@ -123,164 +123,164 @@ function rn(e) {
123
123
  accent: o,
124
124
  setAccent: s,
125
125
  icon: c,
126
- setIcon: l
127
- }, en.set(t, n);
126
+ setIcon: l,
127
+ nothingMore: u,
128
+ setNothingMore: d
129
+ }, sn.set(t, n);
128
130
  }
129
131
  return n;
130
132
  }
131
133
  //#endregion
132
134
  //#region src/framework/gestures/cursors.ts
133
- var an = 32, J = an / 2, Y = "white", on = "rgba(0,0,0,0.4)", sn = 2, cn = 3;
134
- function ln(e) {
135
+ var dn = 32, K = dn / 2, q = "white", fn = "rgba(0,0,0,0.4)", pn = 2, mn = 3;
136
+ function hn(e) {
135
137
  return `url("data:image/svg+xml,${encodeURIComponent(e)}")`;
136
138
  }
137
- function un(e) {
138
- return `<svg xmlns="http://www.w3.org/2000/svg" width="${an}" height="${an}" viewBox="0 0 ${an} ${an}">${e}</svg>`;
139
+ function gn(e) {
140
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${dn}" height="${dn}" viewBox="0 0 ${dn} ${dn}">${e}</svg>`;
139
141
  }
140
- var dn = un(`
142
+ var _n = gn(`
141
143
  <g transform="translate(6, 2)">
142
144
  <!-- shadow -->
143
- <g stroke="${on}" stroke-width="${cn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
145
+ <g stroke="${fn}" stroke-width="${mn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
144
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"/>
145
147
  </g>
146
148
  <!-- main -->
147
- <g stroke="${Y}" stroke-width="${sn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
149
+ <g stroke="${q}" stroke-width="${pn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
148
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"/>
149
151
  </g>
150
152
  </g>
151
- `), fn = un(`
153
+ `), vn = gn(`
152
154
  <g>
153
- <circle cx="${J}" cy="${J}" r="8" stroke="${on}" stroke-width="${cn}" fill="none"/>
154
- <circle cx="${J}" cy="${J}" r="8" stroke="${Y}" stroke-width="1.5" fill="none"/>
155
- <circle cx="${J}" cy="${J}" r="1.5" fill="${Y}"/>
155
+ <circle cx="${K}" cy="${K}" r="8" stroke="${fn}" stroke-width="${mn}" 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}"/>
156
158
  </g>
157
- `), pn = un(`
159
+ `), yn = gn(`
158
160
  <g>
159
161
  <!-- shadow -->
160
- <g stroke="${on}" stroke-width="${cn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
161
- <line x1="6" y1="${J}" x2="26" y2="${J}"/>
162
- <polyline points="10,12 6,${J} 10,20"/>
163
- <polyline points="22,12 26,${J} 22,20"/>
162
+ <g stroke="${fn}" stroke-width="${mn}" 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"/>
164
166
  </g>
165
167
  <!-- main -->
166
- <g stroke="${Y}" stroke-width="${sn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
167
- <line x1="6" y1="${J}" x2="26" y2="${J}"/>
168
- <polyline points="10,12 6,${J} 10,20"/>
169
- <polyline points="22,12 26,${J} 22,20"/>
168
+ <g stroke="${q}" stroke-width="${pn}" 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"/>
170
172
  </g>
171
173
  <!-- center grip dots -->
172
- <circle cx="${J}" cy="${J}" r="1.5" fill="${Y}"/>
173
- <circle cx="11" cy="${J}" r="1" fill="${Y}" opacity="0.6"/>
174
- <circle cx="21" cy="${J}" r="1" fill="${Y}" opacity="0.6"/>
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"/>
175
177
  </g>
176
- `), mn = un(`
178
+ `), bn = gn(`
177
179
  <g>
178
180
  <!-- shadow -->
179
- <g stroke="${on}" stroke-width="${cn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
180
- <line x1="${J}" y1="6" x2="${J}" y2="26"/>
181
- <polyline points="12,10 ${J},6 20,10"/>
182
- <polyline points="12,22 ${J},26 20,22"/>
181
+ <g stroke="${fn}" stroke-width="${mn}" 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"/>
183
185
  </g>
184
186
  <!-- main -->
185
- <g stroke="${Y}" stroke-width="${sn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
186
- <line x1="${J}" y1="6" x2="${J}" y2="26"/>
187
- <polyline points="12,10 ${J},6 20,10"/>
188
- <polyline points="12,22 ${J},26 20,22"/>
187
+ <g stroke="${q}" stroke-width="${pn}" 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"/>
189
191
  </g>
190
192
  <!-- center grip dots -->
191
- <circle cx="${J}" cy="${J}" r="1.5" fill="${Y}"/>
192
- <circle cx="${J}" cy="11" r="1" fill="${Y}" opacity="0.6"/>
193
- <circle cx="${J}" cy="21" r="1" fill="${Y}" opacity="0.6"/>
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"/>
194
196
  </g>
195
- `), hn = un(`
197
+ `), xn = gn(`
196
198
  <g>
197
199
  <!-- shadow -->
198
- <g stroke="${on}" stroke-width="${cn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
199
- <line x1="7" y1="${J}" x2="25" y2="${J}"/>
200
- <line x1="${J}" y1="7" x2="${J}" y2="25"/>
201
- <polyline points="11,13 7,${J} 11,19"/>
202
- <polyline points="21,13 25,${J} 21,19"/>
203
- <polyline points="13,11 ${J},7 19,11"/>
204
- <polyline points="13,21 ${J},25 19,21"/>
200
+ <g stroke="${fn}" stroke-width="${mn}" 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"/>
205
207
  </g>
206
208
  <!-- main -->
207
- <g stroke="${Y}" stroke-width="${sn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
208
- <line x1="7" y1="${J}" x2="25" y2="${J}"/>
209
- <line x1="${J}" y1="7" x2="${J}" y2="25"/>
210
- <polyline points="11,13 7,${J} 11,19"/>
211
- <polyline points="21,13 25,${J} 21,19"/>
212
- <polyline points="13,11 ${J},7 19,11"/>
213
- <polyline points="13,21 ${J},25 19,21"/>
209
+ <g stroke="${q}" stroke-width="${pn}" 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"/>
214
216
  </g>
215
217
  <!-- center dot -->
216
- <circle cx="${J}" cy="${J}" r="2" fill="${Y}"/>
218
+ <circle cx="${K}" cy="${K}" r="2" fill="${q}"/>
217
219
  </g>
218
220
  `);
219
- function gn(e, t, n) {
221
+ function Sn(e, t, n) {
220
222
  return {
221
- css: `${ln(e)} ${t} ${n}, auto`,
223
+ css: `${hn(e)} ${t} ${n}, auto`,
222
224
  hotspotX: t,
223
225
  hotspotY: n
224
226
  };
225
227
  }
226
- var _n = {
227
- tap: gn(dn, 12, 4),
228
- hold: gn(fn, 16, 16),
229
- slideHorizontal: gn(pn, J, J),
230
- slideVertical: gn(mn, J, J),
231
- slideAuto: gn(hn, J, J)
228
+ var Cn = {
229
+ tap: Sn(_n, 12, 4),
230
+ hold: Sn(vn, 16, 16),
231
+ slideHorizontal: Sn(yn, K, K),
232
+ slideVertical: Sn(bn, K, K),
233
+ slideAuto: Sn(xn, K, K)
232
234
  };
233
235
  //#endregion
234
236
  //#region src/framework/gestures/haptics.ts
235
- function vn() {
237
+ function wn() {
236
238
  if (typeof window > "u") return null;
237
239
  let e = window;
238
240
  return e.Capacitor?.isNativePlatform?.() ? e.Capacitor.Plugins?.Haptics ?? null : null;
239
241
  }
240
- function yn(e) {
242
+ function Tn(e) {
241
243
  if (typeof navigator < "u" && typeof navigator.vibrate == "function") try {
242
244
  navigator.vibrate(e);
243
245
  } catch {}
244
246
  }
245
- var bn = {
247
+ var En = {
246
248
  tick() {
247
- let e = vn();
249
+ let e = wn();
248
250
  if (e) {
249
251
  e.impact({ style: "Light" }).catch(() => {});
250
252
  return;
251
253
  }
252
- yn(8);
254
+ Tn(8);
253
255
  },
254
256
  bump() {
255
- let e = vn();
257
+ let e = wn();
256
258
  if (e) {
257
259
  e.impact({ style: "Medium" }).catch(() => {});
258
260
  return;
259
261
  }
260
- yn(20);
262
+ Tn(20);
261
263
  },
262
264
  pulse() {
263
- let e = vn();
265
+ let e = wn();
264
266
  if (e) {
265
267
  e.impact({ style: "Heavy" }).catch(() => {});
266
268
  return;
267
269
  }
268
- yn([
270
+ Tn([
269
271
  0,
270
272
  15,
271
273
  40,
272
274
  15
273
275
  ]);
274
276
  }
275
- };
276
- //#endregion
277
- //#region src/framework/gestures/use-widget-gestures.ts
278
- function xn(e, t) {
279
- let n = A(W), r = rn(n), i = () => {
277
+ }, Dn = "button, a, input, select, textarea, [role=\"slider\"], [role=\"radio\"], [role=\"switch\"]";
278
+ function On(e, t) {
279
+ let n = k(U), r = un(n), i = () => {
280
280
  let t = e();
281
- return t.hold || !n || !r?.hasSheet() ? t : {
281
+ return t.hold || !n ? t : {
282
282
  ...t,
283
- hold: { action: () => q.get(n)?.() }
283
+ hold: { action: () => r?.hasSheet() ? G.get(n)?.() : r?.setNothingMore(!0) }
284
284
  };
285
285
  }, a = {
286
286
  isDown: !1,
@@ -290,10 +290,11 @@ function xn(e, t) {
290
290
  startTime: 0,
291
291
  hasMoved: !1,
292
292
  sliding: !1,
293
+ holdOnly: !1,
293
294
  holdTimer: null,
294
295
  graceTimer: null,
295
296
  element: null
296
- }, [o, s] = O(null), c = null, l = null, u = null, [d, f] = O(null);
297
+ }, [o, s] = D(null), c = null, l = null, u = null, [d, f] = D(null);
297
298
  function p(e) {
298
299
  e !== l && (u && u.disconnect(), u = new ResizeObserver((e) => {
299
300
  let t = e[0];
@@ -322,16 +323,16 @@ function xn(e, t) {
322
323
  capture: !0,
323
324
  once: !0
324
325
  });
325
- }, g = () => {
326
- a.isDown = !1, a.hasMoved = !1, a.sliding = !1;
327
- }, _ = (e) => {
326
+ }, ee = () => {
327
+ a.isDown = !1, a.hasMoved = !1, a.sliding = !1, a.holdOnly = !1;
328
+ }, g = (e) => {
328
329
  let n = i().slide;
329
330
  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";
330
- }, v = (e) => {
331
- let t = i();
332
- if (t.tap || t.hold || t.slide) {
333
- if (a.isDown = !0, a.isTouch = e.pointerType === "touch", a.element = e.currentTarget, p(a.element), a.startX = e.clientX, a.startY = e.clientY, a.startTime = Date.now(), a.hasMoved = !1, a.sliding = !1, t.hold) {
334
- let r = t.hold.delay ?? 550, 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));
331
+ }, _ = (e) => {
332
+ let t = i(), r = e.target instanceof Element ? e.target.closest(`${Dn}, .glasshome-widget-controls`) : null, o = r !== null && r !== e.currentTarget;
333
+ if (!(o ? !t.hold : !t.tap && !t.hold && !t.slide)) {
334
+ if (a.isDown = !0, a.holdOnly = o, a.isTouch = e.pointerType === "touch", a.element = e.currentTarget, p(a.element), a.startX = e.clientX, a.startY = e.clientY, a.startTime = Date.now(), a.hasMoved = !1, a.sliding = !1, t.hold) {
335
+ let r = t.hold.delay ?? Je, 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));
335
336
  a.graceTimer = setTimeout(() => {
336
337
  a.graceTimer = null, s({
337
338
  x: o,
@@ -339,22 +340,22 @@ function xn(e, t) {
339
340
  r: l,
340
341
  fired: !1
341
342
  });
342
- }, Math.min(150, r)), a.holdTimer = setTimeout(() => {
343
+ }, Math.min(qe, r)), a.holdTimer = setTimeout(() => {
343
344
  a.holdTimer = null, a.isDown && !a.hasMoved && (s((e) => e && {
344
345
  ...e,
345
346
  fired: !0
346
- }), bn.bump(), a.element && h(a.element), t.hold?.action(), n?.onHeld?.(), a.isDown = !1);
347
+ }), En.bump(), a.element && h(a.element), t.hold?.action(), n?.onHeld?.(), a.isDown = !1);
347
348
  }, r);
348
349
  }
349
- if (!a.isTouch && t.slide) try {
350
+ if (!a.isTouch && t.slide && !o) try {
350
351
  e.currentTarget.setPointerCapture(e.pointerId);
351
352
  } catch {}
352
353
  }
353
- }, y = (e) => {
354
+ }, v = (e) => {
354
355
  if (!a.isDown) return;
355
356
  let t = i(), n = e.clientX - a.startX, r = e.clientY - a.startY;
356
- if (Math.sqrt(n * n + r * r) > 10 && (m(), a.hasMoved = !0), t.slide && a.hasMoved) {
357
- let i = e.currentTarget, o = _(i);
357
+ if (Math.sqrt(n * n + r * r) > 10 && (m(), a.hasMoved = !0), t.slide && a.hasMoved && !a.holdOnly) {
358
+ let i = e.currentTarget, o = g(i);
358
359
  if (a.isTouch && !a.sliding && Math.abs(o === "vertical" ? r : n) < Math.abs(o === "vertical" ? n : r)) return;
359
360
  a.sliding = !0;
360
361
  let s = t.slide.min ?? 0, l = t.slide.max ?? 100, u = l - s, d = o === "vertical" ? -r : n, f = c ?? {
@@ -363,26 +364,26 @@ function xn(e, t) {
363
364
  }, p = d / (o === "vertical" ? f.height : f.width) * u, m = Math.max(s, Math.min(l, t.slide.value + p));
364
365
  t.slide.onChange(Math.round(m)), a.startX = e.clientX, a.startY = e.clientY, e.preventDefault();
365
366
  }
366
- }, b = (e) => {
367
- let t = i(), n = a.isDown, r = Date.now() - a.startTime, o = t.hold?.delay ?? 550;
368
- m(), n && t.tap && !a.hasMoved && r < o && t.tap();
367
+ }, y = (e) => {
368
+ let t = i(), n = a.isDown, r = Date.now() - a.startTime, o = t.hold?.delay ?? Je;
369
+ m(), n && t.tap && !a.hasMoved && !a.holdOnly && r < o && t.tap();
369
370
  try {
370
371
  e.currentTarget.releasePointerCapture(e.pointerId);
371
372
  } catch {}
372
- g();
373
- }, x = (e) => {
373
+ ee();
374
+ }, b = (e) => {
374
375
  m();
375
376
  try {
376
377
  e.currentTarget.releasePointerCapture(e.pointerId);
377
378
  } catch {}
378
- g();
379
- }, S = (e) => {
379
+ ee();
380
+ }, x = (e) => {
380
381
  let t = i();
381
382
  if (t.slide) {
382
383
  let n = t.slide.orientation;
383
- return n === "horizontal" ? _n.slideHorizontal.css : n === "vertical" ? _n.slideVertical.css : (c || p(e), c && c.height > c.width ? _n.slideVertical.css : _n.slideHorizontal.css);
384
+ return n === "horizontal" ? Cn.slideHorizontal.css : n === "vertical" ? Cn.slideVertical.css : (c || p(e), c && c.height > c.width ? Cn.slideVertical.css : Cn.slideHorizontal.css);
384
385
  }
385
- return t.tap ? _n.tap.css : t.hold ? _n.hold.css : "";
386
+ return t.tap ? Cn.tap.css : t.hold ? Cn.hold.css : "";
386
387
  };
387
388
  return {
388
389
  onKeyDown: (e) => {
@@ -390,13 +391,13 @@ function xn(e, t) {
390
391
  let t = i();
391
392
  (e.key === "Enter" || e.key === " ") && t.tap ? (e.preventDefault(), t.tap()) : (e.key === "ContextMenu" || e.shiftKey && e.key === "F10") && t.hold && (e.preventDefault(), t.hold.action(), n?.onHeld?.());
392
393
  },
393
- onPointerDown: v,
394
- onPointerMove: y,
395
- onPointerUp: b,
396
- onPointerCancel: x,
394
+ onPointerDown: _,
395
+ onPointerMove: v,
396
+ onPointerUp: y,
397
+ onPointerCancel: b,
397
398
  onPointerEnter: (e) => {
398
399
  let t = e.currentTarget;
399
- a.element = t, t.style.cursor = S(t);
400
+ a.element = t, t.style.cursor = x(t);
400
401
  },
401
402
  bindElement: (e) => {
402
403
  e && (a.element = e, p(e));
@@ -410,7 +411,7 @@ function xn(e, t) {
410
411
  return e.tap || e.hold ? "manipulation" : "auto";
411
412
  },
412
413
  hold: o,
413
- holds: () => !!i().hold,
414
+ holds: () => !!e().hold || !!r?.hasSheet(),
414
415
  dispose: () => {
415
416
  m(), u &&= (u.disconnect(), null), l = null, c = null;
416
417
  }
@@ -418,18 +419,18 @@ function xn(e, t) {
418
419
  }
419
420
  //#endregion
420
421
  //#region src/framework/hooks/use-widget-dimensions.ts
421
- var Sn = me();
422
- function Cn() {
423
- let e = A(Sn);
422
+ var kn = he();
423
+ function An() {
424
+ let e = k(kn);
424
425
  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).");
425
426
  return e;
426
427
  }
427
428
  //#endregion
428
429
  //#region src/framework/hooks/use-confirm.ts
429
- var wn = 1600;
430
- function Tn() {
431
- let [e, t] = O(/* @__PURE__ */ new Set()), n;
432
- return k(() => clearTimeout(n)), {
430
+ var jn = 1600;
431
+ function Mn() {
432
+ let [e, t] = D(/* @__PURE__ */ new Set()), n;
433
+ return O(() => clearTimeout(n)), {
433
434
  has: (t) => e().has(t),
434
435
  any: () => e().size > 0,
435
436
  run: async (e, r) => {
@@ -438,39 +439,39 @@ function Tn() {
438
439
  } catch {
439
440
  return !1;
440
441
  }
441
- return t(new Set(e)), clearTimeout(n), n = setTimeout(() => t(/* @__PURE__ */ new Set()), wn), !0;
442
+ return t(new Set(e)), clearTimeout(n), n = setTimeout(() => t(/* @__PURE__ */ new Set()), jn), !0;
442
443
  }
443
444
  };
444
445
  }
445
446
  //#endregion
446
447
  //#region src/framework/utils/cn.ts
447
- function X(...e) {
448
- return Ut(Ht(e));
448
+ function J(...e) {
449
+ return Jt(qt(e));
449
450
  }
450
451
  //#endregion
451
452
  //#region src/framework/components/WidgetIcon.tsx
452
- var En = /*#__PURE__*/ B("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-2 glass glass-tint\">"), Dn = /*#__PURE__*/ B("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-3 glass glass-tint\">"), On = /*#__PURE__*/ B("<div><div class=\"glasshome-widget-icon-glyph flex items-center justify-center\">");
453
- function kn(e) {
453
+ var Nn = /*#__PURE__*/ z("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-2 glass glass-tint\">"), Pn = /*#__PURE__*/ z("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-3 glass glass-tint\">"), Fn = /*#__PURE__*/ z("<div><div class=\"glasshome-widget-icon-glyph flex items-center justify-center\">");
454
+ function In(e) {
454
455
  let t = () => e.entityCount ?? 1;
455
456
  return (() => {
456
- var n = On(), r = n.firstChild;
457
- return F(n, N(w, {
457
+ var n = Fn(), r = n.firstChild;
458
+ return P(n, M(w, {
458
459
  get when() {
459
460
  return t() >= 2;
460
461
  },
461
462
  get children() {
462
- return En();
463
+ return Nn();
463
464
  }
464
- }), r), F(n, N(w, {
465
+ }), r), P(n, M(w, {
465
466
  get when() {
466
467
  return t() >= 3;
467
468
  },
468
469
  get children() {
469
- return Dn();
470
+ return Pn();
470
471
  }
471
- }), r), F(r, () => e.icon), P((t) => {
472
- var r = X("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;
473
- return r !== t.e && M(n, t.e = r), t.t = z(n, i, t.t), t;
472
+ }), r), P(r, () => e.icon), N((t) => {
473
+ var r = J("glasshome-widget-icon glass glass-tint", "pointer-events-none relative flex shrink-0 items-center justify-center transition-all", e.dimmed && "opacity-50", e.class), i = e.color ? { "--widget-icon-color": e.color } : void 0;
474
+ return r !== t.e && j(n, t.e = r), t.t = R(n, i, t.t), t;
474
475
  }, {
475
476
  e: void 0,
476
477
  t: void 0
@@ -479,26 +480,26 @@ function kn(e) {
479
480
  }
480
481
  //#endregion
481
482
  //#region src/framework/components/anatomy.tsx
482
- var An = /*#__PURE__*/ B("<span class=glasshome-widget-eyebrow>"), jn = /*#__PURE__*/ B("<div class=glasshome-widget-head-aside>"), Mn = /*#__PURE__*/ B("<div class=glasshome-widget-head><div class=glasshome-widget-head-text><span class=glasshome-widget-name>"), Nn = /*#__PURE__*/ B("<span class=glasshome-widget-sub>"), Pn = /*#__PURE__*/ B("<span class=glasshome-widget-unit>"), Fn = /*#__PURE__*/ B("<div class=glasshome-widget-art>"), In = /*#__PURE__*/ B("<div><div class=glasshome-widget-reading><span class=glasshome-widget-reading-value>"), Ln = /*#__PURE__*/ B("<div class=glasshome-widget-controls>"), Rn = /*#__PURE__*/ B("<div>"), zn = /*#__PURE__*/ B("<div class=glasshome-widget-backdrop>"), Bn = /*#__PURE__*/ B("<div class=glasshome-widget-glyph aria-hidden=true>"), Vn = me(() => !1), Hn = "mdi:check";
483
- function Un(e) {
484
- let t = A(Vn), n = rn(A(W));
485
- E(() => n?.setIcon(e.icon)), k(() => {
483
+ var Ln = /*#__PURE__*/ z("<span class=glasshome-widget-eyebrow>"), Rn = /*#__PURE__*/ z("<div class=glasshome-widget-head-aside>"), zn = /*#__PURE__*/ z("<div class=glasshome-widget-head><div class=glasshome-widget-head-text><span class=glasshome-widget-name>"), Bn = /*#__PURE__*/ z("<span class=glasshome-widget-sub>"), Vn = /*#__PURE__*/ z("<span class=glasshome-widget-unit>"), Hn = /*#__PURE__*/ z("<div class=glasshome-widget-art>"), Un = /*#__PURE__*/ z("<div><div class=glasshome-widget-reading><span class=glasshome-widget-reading-value>"), Wn = /*#__PURE__*/ z("<div class=glasshome-widget-controls>"), Gn = /*#__PURE__*/ z("<div>"), Kn = /*#__PURE__*/ z("<div class=glasshome-widget-backdrop>"), qn = /*#__PURE__*/ z("<div class=glasshome-widget-glyph aria-hidden=true>"), Jn = he(() => !1), Yn = "mdi:check";
484
+ function Xn(e) {
485
+ let t = k(Jn), n = un(k(U));
486
+ T(() => n?.setIcon(e.icon)), O(() => {
486
487
  n?.icon() === e.icon && n?.setIcon(void 0);
487
488
  });
488
- let r = T(() => e.eyebrow), i = T(() => e.aside), a = () => {
489
+ let r = me(() => e.eyebrow), i = me(() => e.aside), a = () => {
489
490
  let t = r();
490
491
  return typeof t == "string" && typeof e.name == "string" && t.trim().toLowerCase() === e.name.trim().toLowerCase();
491
492
  };
492
493
  return (() => {
493
- var n = Mn(), o = n.firstChild, s = o.firstChild;
494
- return F(n, N(w, {
494
+ var n = zn(), o = n.firstChild, s = o.firstChild;
495
+ return P(n, M(w, {
495
496
  get when() {
496
497
  return e.icon;
497
498
  },
498
- children: (n) => N(kn, {
499
+ children: (n) => M(In, {
499
500
  get icon() {
500
- return N(U, { get icon() {
501
- return I(() => !!t())() ? Hn : n();
501
+ return M(H, { get icon() {
502
+ return F(() => !!t())() ? Yn : n();
502
503
  } });
503
504
  },
504
505
  get entityCount() {
@@ -509,56 +510,56 @@ function Un(e) {
509
510
  },
510
511
  class: "glasshome-widget-head-icon"
511
512
  })
512
- }), o), F(o, N(w, {
513
+ }), o), P(o, M(w, {
513
514
  get when() {
514
- return I(() => !!r())() && !a();
515
+ return F(() => !!r())() && !a();
515
516
  },
516
517
  get children() {
517
- var e = An();
518
- return F(e, r), e;
518
+ var e = Ln();
519
+ return P(e, r), e;
519
520
  }
520
- }), s), F(s, () => e.name), F(n, N(w, {
521
+ }), s), P(s, () => e.name), P(n, M(w, {
521
522
  get when() {
522
523
  return i();
523
524
  },
524
525
  get children() {
525
- var e = jn();
526
- return F(e, i), e;
526
+ var e = Rn();
527
+ return P(e, i), e;
527
528
  }
528
529
  }), null), n;
529
530
  })();
530
531
  }
531
- function Wn(e) {
532
- let t = T(() => e.sub), n = T(() => 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();
533
- return E(he(r, () => o((e) => e === "a" ? "b" : "a"), { defer: !0 })), (() => {
534
- var r = In(), o = r.firstChild, s = o.firstChild;
535
- return F(o, N(w, {
532
+ function Zn(e) {
533
+ let t = me(() => e.sub), n = me(() => e.art), r = E(() => 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] = D();
534
+ return T(ge(r, () => o((e) => e === "a" ? "b" : "a"), { defer: !0 })), (() => {
535
+ var r = Un(), o = r.firstChild, s = o.firstChild;
536
+ return P(o, M(w, {
536
537
  get when() {
537
538
  return t();
538
539
  },
539
540
  get children() {
540
- var e = Nn();
541
- return F(e, t), e;
541
+ var e = Bn();
542
+ return P(e, t), e;
542
543
  }
543
- }), s), F(s, () => e.value, null), F(s, N(w, {
544
+ }), s), P(s, () => e.value, null), P(s, M(w, {
544
545
  get when() {
545
546
  return e.unit;
546
547
  },
547
548
  get children() {
548
- var t = Pn();
549
- return F(t, () => e.unit), P(() => L(t, "data-degree", e.unit === "°" || void 0)), t;
549
+ var t = Vn();
550
+ return P(t, () => e.unit), N(() => I(t, "data-degree", e.unit === "°" || void 0)), t;
550
551
  }
551
- }), null), F(r, N(w, {
552
+ }), null), P(r, M(w, {
552
553
  get when() {
553
554
  return n();
554
555
  },
555
556
  get children() {
556
- var e = Fn();
557
- return F(e, n), e;
557
+ var e = Hn();
558
+ return P(e, n), e;
558
559
  }
559
- }), null), P((o) => {
560
- var c = X("glasshome-widget-hero", e.class), l = n() ? "" : void 0, u = e.value === "" && !t() ? "" : void 0, d = a(), f = i();
561
- 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;
560
+ }), null), N((o) => {
561
+ var c = J("glasshome-widget-hero", e.class), l = n() ? "" : void 0, u = e.value === "" && !t() ? "" : void 0, d = a(), f = i();
562
+ return c !== o.e && j(r, o.e = c), l !== o.t && I(r, "data-art", o.t = l), u !== o.a && I(r, "data-empty", o.a = u), d !== o.o && I(s, "data-turn", o.o = d), f !== o.i && L(s, "--value-len", o.i = f), o;
562
563
  }, {
563
564
  e: void 0,
564
565
  t: void 0,
@@ -568,43 +569,43 @@ function Wn(e) {
568
569
  }), r;
569
570
  })();
570
571
  }
571
- function Gn(e) {
572
+ function Qn(e) {
572
573
  return (() => {
573
- var t = Ln();
574
- return j(t, "pointerdown", (e) => e.stopPropagation()), F(t, () => e.children), t;
574
+ var t = Wn();
575
+ return P(t, () => e.children), t;
575
576
  })();
576
577
  }
577
- function Kn(e) {
578
- return N(Oe, {
578
+ function $n(e) {
579
+ return M(ke, {
579
580
  get "aria-label"() {
580
581
  return e.label;
581
582
  },
582
583
  class: "glasshome-widget-stepper",
583
584
  get children() {
584
- return [N(Ee, {
585
+ return [M(De, {
585
586
  variant: "outline",
586
587
  size: "icon",
587
588
  "aria-label": "Lower",
588
589
  class: "glasshome-widget-control",
589
590
  onClick: () => e.onStep(-1),
590
591
  get children() {
591
- return N(U, { icon: "mdi:minus" });
592
+ return M(H, { icon: "mdi:minus" });
592
593
  }
593
- }), N(Ee, {
594
+ }), M(De, {
594
595
  variant: "outline",
595
596
  size: "icon",
596
597
  "aria-label": "Raise",
597
598
  class: "glasshome-widget-control",
598
599
  onClick: () => e.onStep(1),
599
600
  get children() {
600
- return N(U, { icon: "mdi:plus" });
601
+ return M(H, { icon: "mdi:plus" });
601
602
  }
602
603
  })];
603
604
  }
604
605
  });
605
606
  }
606
- function qn(e) {
607
- return N(jt, {
607
+ function er(e) {
608
+ return M(It, {
608
609
  get "aria-label"() {
609
610
  return e.label;
610
611
  },
@@ -617,11 +618,11 @@ function qn(e) {
617
618
  onChange: (t) => t && e.onChange(t),
618
619
  class: "glasshome-widget-choice",
619
620
  get children() {
620
- return N(C, {
621
+ return M(C, {
621
622
  get each() {
622
623
  return e.options;
623
624
  },
624
- children: (t) => N(Nt, {
625
+ children: (t) => M(Rt, {
625
626
  get value() {
626
627
  return t.value;
627
628
  },
@@ -633,7 +634,7 @@ function qn(e) {
633
634
  return t.value === e.value ? void 0 : "";
634
635
  },
635
636
  get children() {
636
- return N(U, { get icon() {
637
+ return M(H, { get icon() {
637
638
  return t.icon;
638
639
  } });
639
640
  }
@@ -642,9 +643,9 @@ function qn(e) {
642
643
  }
643
644
  });
644
645
  }
645
- function Jn(e) {
646
- let t = Tn(), n = () => e.confirm ?? t, r = () => e.id ?? e["aria-label"] ?? e.icon, i = () => n().has(r());
647
- return N(Ee, {
646
+ function tr(e) {
647
+ let t = Mn(), n = () => e.confirm ?? t, r = () => e.id ?? e["aria-label"] ?? e.icon, i = () => n().has(r());
648
+ return M(De, {
648
649
  variant: "outline",
649
650
  get size() {
650
651
  return e.children ? "default" : "icon";
@@ -653,87 +654,87 @@ function Jn(e) {
653
654
  return e["aria-label"];
654
655
  },
655
656
  get class() {
656
- return X(e.children ? "glasshome-widget-control-wide" : "glasshome-widget-control", e.class);
657
+ return J(e.children ? "glasshome-widget-control-wide" : "glasshome-widget-control", e.class);
657
658
  },
658
659
  get "data-confirmed"() {
659
660
  return i() || void 0;
660
661
  },
661
662
  onClick: () => void n().run([r()], e.run),
662
663
  get children() {
663
- return [N(U, { get icon() {
664
- return I(() => !!i())() ? Hn : e.icon;
665
- } }), I(() => e.children)];
664
+ return [M(H, { get icon() {
665
+ return F(() => !!i())() ? Yn : e.icon;
666
+ } }), F(() => e.children)];
666
667
  }
667
668
  });
668
669
  }
669
- function Yn(e) {
670
- return N(we, {
670
+ function nr(e) {
671
+ return M(Te, {
671
672
  get tone() {
672
673
  return e.tone ?? "var(--muted-foreground)";
673
674
  },
674
675
  class: "gap-1 tabular-nums",
675
676
  get children() {
676
- return [N(w, {
677
+ return [M(w, {
677
678
  get when() {
678
679
  return e.icon;
679
680
  },
680
- children: (e) => N(U, { get icon() {
681
+ children: (e) => M(H, { get icon() {
681
682
  return e();
682
683
  } })
683
- }), I(() => e.children)];
684
+ }), F(() => e.children)];
684
685
  }
685
686
  });
686
687
  }
687
- function Xn(e) {
688
+ function rr(e) {
688
689
  return (() => {
689
- var t = Rn();
690
- return F(t, () => e.children), P(() => M(t, X("glasshome-widget-layer", e.class))), t;
690
+ var t = Gn();
691
+ return P(t, () => e.children), N(() => j(t, J("glasshome-widget-layer", e.class))), t;
691
692
  })();
692
693
  }
693
- function Zn(e) {
694
+ function ir(e) {
694
695
  return (() => {
695
- var t = zn();
696
- return F(t, () => e.children), t;
696
+ var t = Kn();
697
+ return P(t, () => e.children), t;
697
698
  })();
698
699
  }
699
- function Qn(e) {
700
- let t = A(Vn);
700
+ function ar(e) {
701
+ let t = k(Jn);
701
702
  return (() => {
702
- var n = Bn();
703
- return F(n, N(U, { get icon() {
704
- return I(() => !!t())() ? Hn : e.icon;
703
+ var n = qn();
704
+ return P(n, M(H, { get icon() {
705
+ return F(() => !!t())() ? Yn : e.icon;
705
706
  } })), n;
706
707
  })();
707
708
  }
708
709
  //#endregion
709
710
  //#region src/framework/theming/tokens.css?raw
710
- var $n = "/* 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 --glass-wash-2: var(--widget-wash-2);\n --glass-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 backdrop-filter: var(--widget-backdrop, none);\n -webkit-backdrop-filter: var(--widget-backdrop, none);\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\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-morph, 400ms);\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", er = !1, tr, nr = /* @__PURE__ */ new WeakSet();
711
- function rr() {
712
- return tr || (tr = new CSSStyleSheet(), tr.replaceSync($n.replace(/:root\b/g, ":host").replace(/^\.dark\b/gm, ":host(.dark)"))), tr;
711
+ var or = "/* 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 backdrop-filter: var(--widget-backdrop, none);\n -webkit-backdrop-filter: var(--widget-backdrop, none);\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 --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", sr = !1, cr, lr = /* @__PURE__ */ new WeakSet();
712
+ function ur() {
713
+ return cr || (cr = new CSSStyleSheet(), cr.replaceSync(or.replace(/:root\b/g, ":host").replace(/^\.dark\b/gm, ":host(.dark)"))), cr;
713
714
  }
714
- function ir(e) {
715
+ function dr(e) {
715
716
  if (typeof ShadowRoot < "u" && e instanceof ShadowRoot) {
716
- if (nr.has(e)) return;
717
- let t = rr();
718
- e.adoptedStyleSheets.includes(t) || (e.adoptedStyleSheets = [...e.adoptedStyleSheets, t]), nr.add(e);
717
+ if (lr.has(e)) return;
718
+ let t = ur();
719
+ e.adoptedStyleSheets.includes(t) || (e.adoptedStyleSheets = [...e.adoptedStyleSheets, t]), lr.add(e);
719
720
  return;
720
721
  }
721
- if (er) return;
722
+ if (sr) return;
722
723
  let t = e ?? (typeof document > "u" ? void 0 : document);
723
724
  if (!t) return;
724
725
  if (t.head.querySelector?.("style[data-glasshome-tokens]")) {
725
- er = !0;
726
+ sr = !0;
726
727
  return;
727
728
  }
728
729
  let n = t.createElement("style");
729
- n.setAttribute("data-glasshome-tokens", ""), n.textContent = $n, t.head.appendChild(n), er = !0;
730
+ n.setAttribute("data-glasshome-tokens", ""), n.textContent = or, t.head.appendChild(n), sr = !0;
730
731
  }
731
732
  //#endregion
732
733
  //#region src/framework/variants/built-in-variants.ts
733
- var ar = {
734
+ var fr = {
734
735
  "classic-glass": { cssVars: {
735
736
  "--widget-padding": "1.5rem",
736
- "--widget-backdrop": "blur(var(--glass-blur, var(--material-blur, 24px))) saturate(1.8)"
737
+ "--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))"
737
738
  } },
738
739
  minimal: { cssVars: {
739
740
  "--widget-padding": "1rem",
@@ -750,21 +751,21 @@ var ar = {
750
751
  "--widget-backdrop": "blur(16px) saturate(1.8)"
751
752
  } }
752
753
  };
753
- function or(e) {
754
- return Object.hasOwn(ar, e) ? ar[e] : void 0;
754
+ function pr(e) {
755
+ return Object.hasOwn(fr, e) ? fr[e] : void 0;
755
756
  }
756
757
  //#endregion
757
758
  //#region src/framework/backgrounds/WidgetSliderFill.tsx
758
- var sr = /*#__PURE__*/ B("<div>"), cr = e(() => void 0, "sliderFill.color");
759
- function lr(e) {
760
- return e.color !== void 0 && cr(), (() => {
761
- var t = sr();
762
- return P((n) => {
763
- var r = X("glasshome-widget-slider-fill pointer-events-none absolute inset-0", e.isDragging ? "duration-0" : "transition-all duration-300 ease-out", e.class), i = {
759
+ var mr = /*#__PURE__*/ z("<div>"), hr = e(() => void 0, "sliderFill.color");
760
+ function gr(e) {
761
+ return e.color !== void 0 && hr(), (() => {
762
+ var t = mr();
763
+ return N((n) => {
764
+ 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 = {
764
765
  "--widget-fill-value": e.value,
765
- "z-index": K.BACKGROUND
766
+ "z-index": an.BACKGROUND
766
767
  };
767
- return r !== n.e && M(t, n.e = r), n.t = z(t, i, n.t), n;
768
+ return r !== n.e && j(t, n.e = r), n.t = R(t, i, n.t), n;
768
769
  }, {
769
770
  e: void 0,
770
771
  t: void 0
@@ -773,16 +774,16 @@ function lr(e) {
773
774
  }
774
775
  //#endregion
775
776
  //#region src/framework/components/WidgetContent.tsx
776
- var ur = /*#__PURE__*/ B("<div>"), dr = /\bglasshome-widget-(head|hero|controls|backdrop|glyph|layer)\b/;
777
- function fr(e) {
778
- let t = rn(A(W));
779
- E(() => t?.setAccent(e.accent)), k(() => t?.setAccent(void 0));
780
- let n = T(() => e.children), r = D(() => n.toArray().some((e) => e instanceof Element && dr.test(e.className)));
777
+ var _r = /*#__PURE__*/ z("<div>"), vr = /\bglasshome-widget-(head|hero|controls|backdrop|glyph|layer)\b/;
778
+ function yr(e) {
779
+ let t = un(k(U));
780
+ T(() => t?.setAccent(e.accent)), O(() => t?.setAccent(void 0));
781
+ let n = me(() => e.children), r = E(() => n.toArray().some((e) => e instanceof Element && vr.test(e.className)));
781
782
  return (() => {
782
- var t = ur();
783
- return F(t, n), P((n) => {
784
- var i = X(r() ? "glasshome-widget-grid" : "glasshome-widget-content", e.class), a = e.accent ? { "--widget-color": e.accent } : void 0;
785
- return i !== n.e && M(t, n.e = i), n.t = z(t, a, n.t), n;
783
+ var t = _r();
784
+ return P(t, n), N((n) => {
785
+ var i = J(r() ? "glasshome-widget-grid" : "glasshome-widget-content", e.class), a = e.accent ? { "--widget-color": e.accent } : void 0;
786
+ return i !== n.e && j(t, n.e = i), n.t = R(t, a, n.t), n;
786
787
  }, {
787
788
  e: void 0,
788
789
  t: void 0
@@ -791,16 +792,16 @@ function fr(e) {
791
792
  }
792
793
  //#endregion
793
794
  //#region src/framework/components/WidgetStatus.tsx
794
- var pr = /*#__PURE__*/ B("<p>");
795
- function mr(e) {
795
+ var br = /*#__PURE__*/ z("<p>");
796
+ function xr(e) {
796
797
  return (() => {
797
- var t = pr();
798
- return F(t, (() => {
799
- var t = I(() => !!e.isUnavailable);
798
+ var t = br();
799
+ return P(t, (() => {
800
+ var t = F(() => !!e.isUnavailable);
800
801
  return () => t() ? "Unavailable" : e.children;
801
- })()), P((n) => {
802
- var r = X("glasshome-widget-status", "relative", e.dimmed && "opacity-40", e.class), i = K.ACTIONS;
803
- return r !== n.e && M(t, n.e = r), i !== n.t && R(t, "z-index", n.t = i), n;
802
+ })()), N((n) => {
803
+ var r = J("glasshome-widget-status", "relative", e.dimmed && "opacity-40", e.class), i = an.ACTIONS;
804
+ return r !== n.e && j(t, n.e = r), i !== n.t && L(t, "z-index", n.t = i), n;
804
805
  }, {
805
806
  e: void 0,
806
807
  t: void 0
@@ -809,21 +810,21 @@ function mr(e) {
809
810
  }
810
811
  //#endregion
811
812
  //#region src/framework/components/WidgetTitle.tsx
812
- var hr = /*#__PURE__*/ B("<span class=\"glasshome-widget-badge shrink-0\">"), gr = /*#__PURE__*/ B("<div><h3 class=glasshome-widget-title>");
813
- function _r(e) {
813
+ var Sr = /*#__PURE__*/ z("<span class=\"glasshome-widget-badge shrink-0\">"), Cr = /*#__PURE__*/ z("<div><h3 class=glasshome-widget-title>");
814
+ function wr(e) {
814
815
  return (() => {
815
- var t = gr(), n = t.firstChild;
816
- return F(n, () => e.children), F(t, N(w, {
816
+ var t = Cr(), n = t.firstChild;
817
+ return P(n, () => e.children), P(t, M(w, {
817
818
  get when() {
818
- return I(() => e.badge !== void 0)() && e.badge > 0;
819
+ return F(() => e.badge !== void 0)() && e.badge > 0;
819
820
  },
820
821
  get children() {
821
- var t = hr();
822
- return F(t, () => e.badge), t;
822
+ var t = Sr();
823
+ return P(t, () => e.badge), t;
823
824
  }
824
- }), null), P((n) => {
825
- var r = X("relative flex items-center gap-2", e.class), i = K.ACTIONS;
826
- return r !== n.e && M(t, n.e = r), i !== n.t && R(t, "z-index", n.t = i), n;
825
+ }), null), N((n) => {
826
+ var r = J("relative flex items-center gap-2", e.class), i = an.ACTIONS;
827
+ return r !== n.e && j(t, n.e = r), i !== n.t && L(t, "z-index", n.t = i), n;
827
828
  }, {
828
829
  e: void 0,
829
830
  t: void 0
@@ -832,14 +833,14 @@ function _r(e) {
832
833
  }
833
834
  //#endregion
834
835
  //#region src/framework/utils/clipboard.ts
835
- async function vr(e) {
836
+ async function Tr(e) {
836
837
  if (navigator.clipboard?.writeText) try {
837
838
  return await navigator.clipboard.writeText(e), !0;
838
839
  } catch {}
839
- return yr(e);
840
+ return Er(e);
840
841
  }
841
- function yr(e) {
842
- let t = br(), n = document.createElement("textarea");
842
+ function Er(e) {
843
+ let t = Dr(), n = document.createElement("textarea");
843
844
  n.value = e, n.setAttribute("readonly", ""), n.style.position = "fixed", n.style.top = "0", n.style.left = "0", n.style.opacity = "0", (t?.parentElement ?? document.body).append(n);
844
845
  try {
845
846
  return n.focus(), n.select(), n.setSelectionRange(0, e.length), n.getRootNode().activeElement === n && document.execCommand("copy");
@@ -849,23 +850,23 @@ function yr(e) {
849
850
  n.remove(), t?.focus();
850
851
  }
851
852
  }
852
- function br() {
853
+ function Dr() {
853
854
  let e = document.activeElement;
854
855
  for (; e?.shadowRoot?.activeElement;) e = e.shadowRoot.activeElement;
855
856
  return e instanceof HTMLElement ? e : null;
856
857
  }
857
- function xr(e = 2e3) {
858
- let [t, n] = O("idle"), r;
859
- return k(() => clearTimeout(r)), {
858
+ function Or(e = 2e3) {
859
+ let [t, n] = D("idle"), r;
860
+ return O(() => clearTimeout(r)), {
860
861
  state: t,
861
862
  copy: async (t) => {
862
- n(await vr(t) ? "copied" : "failed"), clearTimeout(r), r = setTimeout(() => n("idle"), e);
863
+ n(await Tr(t) ? "copied" : "failed"), clearTimeout(r), r = setTimeout(() => n("idle"), e);
863
864
  }
864
865
  };
865
866
  }
866
867
  //#endregion
867
868
  //#region src/framework/utils/entity-aggregation.ts
868
- function Sr(e, t = !1) {
869
+ function kr(e, t = !1) {
869
870
  let n = e[0];
870
871
  if (!n) return {
871
872
  isGroup: !1,
@@ -889,7 +890,7 @@ function Sr(e, t = !1) {
889
890
  isUnavailable: e.state === "unavailable",
890
891
  brightness: r,
891
892
  brightnessPercent: i,
892
- color: Tr(e),
893
+ color: Mr(e),
893
894
  onCount: +!!t,
894
895
  totalCount: 1,
895
896
  description: t ? "On" : "Off"
@@ -901,7 +902,7 @@ function Sr(e, t = !1) {
901
902
  if (i++, t.attributes?.brightness !== void 0 && (c += t.attributes.brightness, l++), t.attributes?.rgb_color) u.push(t.attributes.rgb_color);
902
903
  else if (t.attributes?.hs_color) {
903
904
  let [e, n] = t.attributes.hs_color;
904
- u.push(wr(e, n));
905
+ u.push(jr(e, n));
905
906
  }
906
907
  break;
907
908
  case "off":
@@ -912,28 +913,28 @@ function Sr(e, t = !1) {
912
913
  break;
913
914
  case "unavailable": s++;
914
915
  }
915
- let d = e.length, f = s === d, p = o + s === d, m = i > 0, h = i === d, g = a === d, _, v;
916
- t ? f ? (_ = "unavailable", v = !1) : o > 0 || s > 0 ? (_ = "unknown", v = !1) : a > 0 ? (_ = "off", v = !1) : (_ = "on", v = !0) : f ? (_ = "unavailable", v = !1) : p ? (_ = "unknown", v = !1) : m ? (_ = "on", v = !0) : (_ = "off", v = !1);
917
- let y = l > 0 ? Math.round(c / l) : 0, b = Math.round(y / 255 * 100), x;
916
+ let d = e.length, f = s === d, p = o + s === d, m = i > 0, h = i === d, ee = a === d, g, _;
917
+ t ? f ? (g = "unavailable", _ = !1) : o > 0 || s > 0 ? (g = "unknown", _ = !1) : a > 0 ? (g = "off", _ = !1) : (g = "on", _ = !0) : f ? (g = "unavailable", _ = !1) : p ? (g = "unknown", _ = !1) : m ? (g = "on", _ = !0) : (g = "off", _ = !1);
918
+ let v = l > 0 ? Math.round(c / l) : 0, y = Math.round(v / 255 * 100), b;
918
919
  if (u.length > 0) {
919
- 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;
920
- x = `rgb(${Math.round(e * r)}, ${Math.round(t * r)}, ${Math.round(n * r)})`;
921
- } else x = Tr(n);
922
- let S;
923
- return S = h ? "All on" : g ? "All off" : i > 0 ? `${i} of ${d} on` : "Off", {
920
+ 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 = v / 255;
921
+ b = `rgb(${Math.round(e * r)}, ${Math.round(t * r)}, ${Math.round(n * r)})`;
922
+ } else b = Mr(n);
923
+ let x;
924
+ return x = h ? "All on" : ee ? "All off" : i > 0 ? `${i} of ${d} on` : "Off", {
924
925
  isGroup: r,
925
- state: _,
926
- isOn: v,
927
- isUnavailable: _ === "unavailable",
928
- brightness: y,
929
- brightnessPercent: b,
930
- color: x,
926
+ state: g,
927
+ isOn: _,
928
+ isUnavailable: g === "unavailable",
929
+ brightness: v,
930
+ brightnessPercent: y,
931
+ color: b,
931
932
  onCount: i,
932
933
  totalCount: d,
933
- description: S
934
+ description: x
934
935
  };
935
936
  }
936
- function Cr(e, t = "mean", n = !0) {
937
+ function Ar(e, t = "mean", n = !0) {
937
938
  let r = e[0];
938
939
  if (!r) return {
939
940
  isGroup: !1,
@@ -1030,7 +1031,7 @@ function Cr(e, t = "mean", n = !0) {
1030
1031
  memberValues: o
1031
1032
  };
1032
1033
  }
1033
- function wr(e, t) {
1034
+ function jr(e, t) {
1034
1035
  let n = t / 100, r = n * (1 - Math.abs(e / 60 % 2 - 1)), i = 1 - n, a = 0, o = 0, s = 0;
1035
1036
  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], [
1036
1037
  (a + i) * 255,
@@ -1038,7 +1039,7 @@ function wr(e, t) {
1038
1039
  (s + i) * 255
1039
1040
  ];
1040
1041
  }
1041
- function Tr(e) {
1042
+ function Mr(e) {
1042
1043
  if (e.state !== "on") return "rgb(100, 100, 100)";
1043
1044
  let t = (e.attributes?.brightness ?? 255) / 255;
1044
1045
  if (e.attributes?.rgb_color) {
@@ -1046,7 +1047,7 @@ function Tr(e) {
1046
1047
  return `rgb(${Math.round(n * t)}, ${Math.round(r * t)}, ${Math.round(i * t)})`;
1047
1048
  }
1048
1049
  if (e.attributes?.hs_color) {
1049
- let [n, r] = e.attributes.hs_color, [i, a, o] = wr(n, r);
1050
+ let [n, r] = e.attributes.hs_color, [i, a, o] = jr(n, r);
1050
1051
  return `rgb(${Math.round(i * t)}, ${Math.round(a * t)}, ${Math.round(o * t)})`;
1051
1052
  }
1052
1053
  if (e.attributes?.color_temp) {
@@ -1057,7 +1058,7 @@ function Tr(e) {
1057
1058
  }
1058
1059
  //#endregion
1059
1060
  //#region src/framework/utils/entity-state.ts
1060
- function Er(e) {
1061
+ function Nr(e) {
1061
1062
  if (!e) return !1;
1062
1063
  if ([
1063
1064
  "on",
@@ -1073,15 +1074,15 @@ function Er(e) {
1073
1074
  }
1074
1075
  return !1;
1075
1076
  }
1076
- function Dr(e, t, n) {
1077
+ function Pr(e, t, n) {
1077
1078
  return e?.attributes ? e.attributes[t] ?? n : n;
1078
1079
  }
1079
- function Or(e) {
1080
- return e.filter(Er).length;
1080
+ function Fr(e) {
1081
+ return e.filter(Nr).length;
1081
1082
  }
1082
1083
  //#endregion
1083
1084
  //#region src/framework/utils/format-value.ts
1084
- function kr(e, t, n) {
1085
+ function Ir(e, t, n) {
1085
1086
  let { decimals: r, scale: i = !0 } = n || {};
1086
1087
  if (typeof e == "string") return t ? `${e}${t}` : e;
1087
1088
  if (e == null || Number.isNaN(e)) return t ? `--${t}` : "--";
@@ -1092,47 +1093,51 @@ function kr(e, t, n) {
1092
1093
  }
1093
1094
  //#endregion
1094
1095
  //#region src/framework/utils/interpret-value.ts
1095
- function Ar(e, t) {
1096
+ function Lr(e, t) {
1096
1097
  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;
1097
1098
  }
1098
1099
  //#endregion
1099
1100
  //#region src/framework/components/WidgetValue.tsx
1100
- var jr = /*#__PURE__*/ B("<div class=glasshome-widget-subtitle>"), Mr = /*#__PURE__*/ B("<div><div class=glasshome-widget-value>");
1101
- function Nr(e) {
1101
+ var Rr = /*#__PURE__*/ z("<div class=glasshome-widget-subtitle>"), zr = /*#__PURE__*/ z("<div><div class=glasshome-widget-value>");
1102
+ function Br(e) {
1102
1103
  return (() => {
1103
- var t = Mr(), n = t.firstChild;
1104
- return F(n, () => kr(e.value, e.unit)), F(t, N(w, {
1104
+ var t = zr(), n = t.firstChild;
1105
+ return P(n, () => Ir(e.value, e.unit)), P(t, M(w, {
1105
1106
  get when() {
1106
- return I(() => !!e.interpret)() && typeof e.value == "number";
1107
+ return F(() => !!e.interpret)() && typeof e.value == "number";
1107
1108
  },
1108
1109
  get children() {
1109
- var t = jr();
1110
- return F(t, () => Ar(e.value, e.unit)), t;
1110
+ var t = Rr();
1111
+ return P(t, () => Lr(e.value, e.unit)), t;
1111
1112
  }
1112
- }), null), P(() => M(t, X("flex flex-col", e.class))), t;
1113
+ }), null), N(() => j(t, J("flex flex-col", e.class))), t;
1113
1114
  })();
1114
1115
  }
1115
1116
  //#endregion
1116
1117
  //#region src/framework/core/Widget.tsx
1117
- var Pr = /*#__PURE__*/ B("<span class=glasshome-widget-hold-flood aria-hidden=true>"), Fr = /*#__PURE__*/ B("<div><div class=\"relative h-full w-full\">"), Ir = /*#__PURE__*/ B("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), Lr = /*#__PURE__*/ B("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), Rr = /*#__PURE__*/ B("<div class=\"text-muted-foreground flex items-center justify-center\">"), zr = /*#__PURE__*/ B("<h3 class=\"text-foreground text-sm font-semibold\">"), Br = /*#__PURE__*/ B("<p class=\"text-muted-foreground text-xs\">");
1118
- function Vr(t) {
1119
- let n = A(W), r = xn(() => ({ hold: { action: () => (q.get(n ?? {}) ?? q.get(d))?.("edit") } }));
1120
- k(r.dispose);
1121
- let i = rn(n), a = xn(() => ({ hold: i?.hasSheet() ? { action: () => (q.get(n ?? {}) ?? q.get(d))?.() } : void 0 }));
1122
- k(a.dispose);
1123
- let o = () => t.emptyState && n ? r : t.gestures ?? (i?.hasSheet() ? a : void 0);
1124
- n && !(tn in n) && (E(() => n?.onHoldable?.(!t.emptyState && !!o()?.holds?.())), k(() => n?.onHoldable?.(!1))), E(() => i?.setTone(t.color ?? (t.tone ? `var(--tone-${t.tone})` : void 0)));
1125
- let [s, c] = O(), [l, u] = O({
1118
+ var Vr = /*#__PURE__*/ z("<span class=glasshome-widget-hold-flood aria-hidden=true>"), Hr = /*#__PURE__*/ z("<div><div class=\"relative h-full w-full\">"), Ur = /*#__PURE__*/ z("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), Wr = /*#__PURE__*/ z("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), Gr = /*#__PURE__*/ z("<div class=\"text-muted-foreground flex items-center justify-center\">"), Kr = /*#__PURE__*/ z("<h3 class=\"text-foreground text-sm font-semibold\">"), qr = /*#__PURE__*/ z("<p class=\"text-muted-foreground text-xs\">"), Jr = 2e3;
1119
+ function Yr(t) {
1120
+ let n = k(U), r = On(() => ({ hold: { action: () => (G.get(n ?? {}) ?? G.get(f))?.("edit") } }));
1121
+ O(r.dispose);
1122
+ let i = un(n), a = !!n && !(cn in n), o = On(() => ({ hold: i?.hasSheet() ? { action: () => (G.get(n ?? {}) ?? G.get(f))?.() } : void 0 }));
1123
+ O(o.dispose);
1124
+ let s = () => t.emptyState && n ? r : t.gestures ?? (a ? o : void 0);
1125
+ a && (T(() => n?.onHoldable?.(!t.emptyState && !!s()?.holds?.())), O(() => n?.onHoldable?.(!1))), T(() => {
1126
+ if (!a || !i?.nothingMore()) return;
1127
+ let e = setTimeout(() => i.setNothingMore(!1), Jr);
1128
+ O(() => clearTimeout(e));
1129
+ }), T(() => i?.setTone(t.color ?? (t.tone ? `var(--tone-${t.tone})` : void 0)));
1130
+ let [c, l] = D(), [u, d] = D({
1126
1131
  width: 0,
1127
1132
  height: 0
1128
1133
  });
1129
- E(() => {
1130
- let e = s();
1134
+ T(() => {
1135
+ let e = c();
1131
1136
  if (!e) return;
1132
1137
  let t = new ResizeObserver(([e]) => {
1133
1138
  if (!e) return;
1134
1139
  let t = e.borderBoxSize?.[0];
1135
- u(t ? {
1140
+ d(t ? {
1136
1141
  width: t.inlineSize,
1137
1142
  height: t.blockSize
1138
1143
  } : {
@@ -1140,48 +1145,48 @@ function Vr(t) {
1140
1145
  height: e.contentRect.height
1141
1146
  });
1142
1147
  });
1143
- t.observe(e), k(() => t.disconnect());
1144
- }), ge(() => {
1145
- let e = s()?.getRootNode();
1146
- ir(typeof ShadowRoot < "u" && e instanceof ShadowRoot || typeof Document < "u" && e instanceof Document ? e : void 0);
1148
+ t.observe(e), O(() => t.disconnect());
1149
+ }), _e(() => {
1150
+ let e = c()?.getRootNode();
1151
+ dr(typeof ShadowRoot < "u" && e instanceof ShadowRoot || typeof Document < "u" && e instanceof Document ? e : void 0);
1147
1152
  });
1148
- let d = {
1153
+ let f = {
1149
1154
  ...n,
1150
1155
  updateConfig: n?.updateConfig ?? (() => {}),
1151
- dimensions: e(() => l(), "ctx.dimensions")
1156
+ dimensions: e(() => u(), "ctx.dimensions")
1152
1157
  };
1153
- n && Object.defineProperty(d, tn, { value: n });
1154
- let f = D(() => {
1155
- if (t.variant) return typeof t.variant == "string" ? or(t.variant) : t.variant.styles;
1156
- }), p = e(() => t.gradient, "widget.gradient"), m = D(() => ({
1158
+ n && Object.defineProperty(f, cn, { value: n });
1159
+ let p = E(() => {
1160
+ if (t.variant) return typeof t.variant == "string" ? pr(t.variant) : t.variant.styles;
1161
+ }), m = e(() => t.gradient, "widget.gradient"), h = () => !!t.tone && t.tone !== "neutral" || !!t.color, ee = E(() => ({
1157
1162
  "container-type": "size",
1158
1163
  "container-name": "widget",
1159
- "touch-action": o() && !t.isEditMode ? o()?.touchAction() : void 0,
1160
- ...f()?.container,
1161
- ...f()?.cssVars || {},
1164
+ "touch-action": s() && !t.isEditMode ? s()?.touchAction() : void 0,
1165
+ ...p()?.container,
1166
+ ...p()?.cssVars || {},
1162
1167
  ...t.tone ? { "--widget-color": `var(--tone-${t.tone})` } : {},
1163
1168
  ...t.color ? { "--widget-color": t.color } : {},
1164
- ...t.tone && t.tone !== "neutral" || t.color ? { "--glass-tone": "var(--widget-color)" } : {},
1169
+ ...h() ? { "--glass-tone": "var(--widget-color)" } : {},
1165
1170
  ...t.colorTo ? {
1166
1171
  "--widget-color-to": t.colorTo,
1167
1172
  "--glass-tone-2": t.colorTo
1168
1173
  } : {},
1169
- ...t.gradient ? { "background-image": p() } : {}
1170
- })), h = () => !!o() && !t.isEditMode, g = (e) => {
1171
- h() && o()?.onPointerEnter(e);
1172
- }, _ = (e) => {
1173
- h() && o()?.onPointerDown(e);
1174
+ ...t.gradient ? { "background-image": m() } : {}
1175
+ })), g = () => !!s() && !t.isEditMode, _ = (e) => {
1176
+ g() && s()?.onPointerEnter(e);
1174
1177
  }, v = (e) => {
1175
- h() && o()?.onPointerMove(e);
1178
+ g() && s()?.onPointerDown(e);
1176
1179
  }, y = (e) => {
1177
- h() && o()?.onPointerUp(e);
1180
+ g() && s()?.onPointerMove(e);
1178
1181
  }, b = (e) => {
1179
- h() && o()?.onPointerCancel(e);
1180
- }, x = () => o()?.hold?.() ?? null, S = {
1182
+ g() && s()?.onPointerUp(e);
1183
+ }, x = (e) => {
1184
+ g() && s()?.onPointerCancel(e);
1185
+ }, te = () => s()?.hold?.() ?? null, S = {
1181
1186
  x: 0,
1182
1187
  y: 0,
1183
1188
  r: 0
1184
- }, ee = (e) => (e && Object.assign(S, {
1189
+ }, ne = (e) => (e && Object.assign(S, {
1185
1190
  x: e.x,
1186
1191
  y: e.y,
1187
1192
  r: e.r
@@ -1190,66 +1195,90 @@ function Vr(t) {
1190
1195
  top: `${S.y}px`,
1191
1196
  width: `${S.r * 2}px`,
1192
1197
  height: `${S.r * 2}px`,
1193
- "z-index": K.BACKGROUND
1198
+ "z-index": an.BACKGROUND
1194
1199
  });
1195
- return N(W.Provider, {
1196
- value: d,
1200
+ return M(U.Provider, {
1201
+ value: f,
1197
1202
  get children() {
1198
- return N(Vn.Provider, {
1203
+ return M(Jn.Provider, {
1199
1204
  value: () => t.confirmed === !0,
1200
1205
  get children() {
1201
- return N(Sn.Provider, {
1202
- value: l,
1206
+ return M(kn.Provider, {
1207
+ value: u,
1203
1208
  get children() {
1204
- var e = Fr(), n = e.firstChild;
1205
- return e.$$keydown = (e) => {
1206
- h() && o()?.onKeyDown?.(e);
1207
- }, j(e, "pointercancel", b), j(e, "pointerup", y), j(e, "pointermove", v), j(e, "pointerdown", _), j(e, "pointerenter", g), V((e) => {
1208
- c(e), t.gestures?.bindElement(e), r.bindElement(e);
1209
- }, e), F(e, N(w, {
1210
- get when() {
1211
- return o()?.hold;
1212
- },
1213
- get children() {
1214
- var e = Pr();
1215
- return P((t) => {
1216
- var n = x() && !x()?.fired ? "" : void 0, r = x()?.fired ? "" : void 0, i = ee(x());
1217
- 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;
1218
- }, {
1219
- e: void 0,
1220
- t: void 0,
1221
- a: void 0
1222
- }), e;
1223
- }
1224
- }), n), F(n, (() => {
1225
- var e = I(() => !!t.emptyState);
1226
- return () => e() ? N(Hr, {
1227
- get icon() {
1228
- return t.emptyState.icon;
1229
- },
1230
- get title() {
1231
- return t.emptyState.title;
1209
+ return [(() => {
1210
+ var e = Hr(), n = e.firstChild;
1211
+ return e.$$keydown = (e) => {
1212
+ g() && s()?.onKeyDown?.(e);
1213
+ }, A(e, "pointercancel", x), A(e, "pointerup", b), A(e, "pointermove", y), A(e, "pointerdown", v), A(e, "pointerenter", _), B((e) => {
1214
+ l(e), t.gestures?.bindElement(e), r.bindElement(e);
1215
+ }, e), P(e, M(w, {
1216
+ get when() {
1217
+ return s()?.hold;
1232
1218
  },
1233
- get message() {
1234
- return t.emptyState.message;
1219
+ get children() {
1220
+ var e = Vr();
1221
+ return N((t) => {
1222
+ var n = te() && !te()?.fired ? "" : void 0, r = te()?.fired ? "" : void 0, i = ne(te());
1223
+ return n !== t.e && I(e, "data-hold", t.e = n), r !== t.t && I(e, "data-fired", t.t = r), t.a = R(e, i, t.a), t;
1224
+ }, {
1225
+ e: void 0,
1226
+ t: void 0,
1227
+ a: void 0
1228
+ }), e;
1235
1229
  }
1236
- }) : t.children;
1237
- })()), F(e, (() => {
1238
- var e = I(() => !!t.loading);
1239
- return () => e() && (() => {
1240
- var e = Ir();
1241
- return P((t) => R(e, "z-index", K.OVERLAY)), e;
1242
- })();
1243
- })(), null), P((r) => {
1244
- var i = X("glasshome-widget glass", "relative h-full w-full overflow-hidden rounded-xl select-none", f()?.class, t.class), a = m(), o = t.confirmed || void 0, s = h() ? 0 : void 0, c = K.CONTENT;
1245
- return i !== r.e && M(e, r.e = i), r.t = z(e, a, r.t), o !== r.a && L(e, "data-confirmed", r.a = o), s !== r.o && L(e, "tabindex", r.o = s), c !== r.i && R(n, "z-index", r.i = c), r;
1246
- }, {
1247
- e: void 0,
1248
- t: void 0,
1249
- a: void 0,
1250
- o: void 0,
1251
- i: void 0
1252
- }), e;
1230
+ }), n), P(n, (() => {
1231
+ var e = F(() => !!t.emptyState);
1232
+ return () => e() ? M(Xr, {
1233
+ get icon() {
1234
+ return t.emptyState.icon;
1235
+ },
1236
+ get title() {
1237
+ return t.emptyState.title;
1238
+ },
1239
+ get message() {
1240
+ return t.emptyState.message;
1241
+ }
1242
+ }) : t.children;
1243
+ })()), P(e, (() => {
1244
+ var e = F(() => !!t.loading);
1245
+ return () => e() && (() => {
1246
+ var e = Ur();
1247
+ return N((t) => L(e, "z-index", an.OVERLAY)), e;
1248
+ })();
1249
+ })(), null), N((r) => {
1250
+ var i = J("glasshome-widget glass", "relative h-full w-full overflow-hidden rounded-xl select-none", p()?.class, t.class), a = ee(), o = h() ? "" : void 0, s = t.confirmed || void 0, c = g() ? 0 : void 0, l = an.CONTENT;
1251
+ return i !== r.e && j(e, r.e = i), r.t = R(e, a, r.t), o !== r.a && I(e, "data-toned", r.a = o), s !== r.o && I(e, "data-confirmed", r.o = s), c !== r.i && I(e, "tabindex", r.i = c), l !== r.n && L(n, "z-index", r.n = l), r;
1252
+ }, {
1253
+ e: void 0,
1254
+ t: void 0,
1255
+ a: void 0,
1256
+ o: void 0,
1257
+ i: void 0,
1258
+ n: void 0
1259
+ }), e;
1260
+ })(), M(w, {
1261
+ when: a,
1262
+ get children() {
1263
+ return M(Qe, {
1264
+ get open() {
1265
+ return i?.nothingMore() ?? !1;
1266
+ },
1267
+ onOpenChange: (e) => {
1268
+ e || i?.setNothingMore(!1);
1269
+ },
1270
+ anchorRef: c,
1271
+ get children() {
1272
+ return M($e, {
1273
+ class: "flex w-auto items-center gap-2 p-3 text-sm",
1274
+ get children() {
1275
+ return [M(H, { icon: "mdi:information-outline" }), "No more controls for this widget"];
1276
+ }
1277
+ });
1278
+ }
1279
+ });
1280
+ }
1281
+ })];
1253
1282
  }
1254
1283
  });
1255
1284
  }
@@ -1257,60 +1286,60 @@ function Vr(t) {
1257
1286
  }
1258
1287
  });
1259
1288
  }
1260
- function Hr(e) {
1289
+ function Xr(e) {
1261
1290
  return (() => {
1262
- var t = Lr();
1263
- return F(t, (() => {
1264
- var t = I(() => !!e.icon);
1291
+ var t = Wr();
1292
+ return P(t, (() => {
1293
+ var t = F(() => !!e.icon);
1265
1294
  return () => t() && (() => {
1266
- var t = Rr();
1267
- return F(t, () => e.icon), t;
1295
+ var t = Gr();
1296
+ return P(t, () => e.icon), t;
1268
1297
  })();
1269
- })(), null), F(t, (() => {
1270
- var t = I(() => !!e.title);
1298
+ })(), null), P(t, (() => {
1299
+ var t = F(() => !!e.title);
1271
1300
  return () => t() && (() => {
1272
- var t = zr();
1273
- return F(t, () => e.title), t;
1301
+ var t = Kr();
1302
+ return P(t, () => e.title), t;
1274
1303
  })();
1275
- })(), null), F(t, (() => {
1276
- var t = I(() => !!e.message);
1304
+ })(), null), P(t, (() => {
1305
+ var t = F(() => !!e.message);
1277
1306
  return () => t() && (() => {
1278
- var t = Br();
1279
- return F(t, () => e.message), t;
1307
+ var t = qr();
1308
+ return P(t, () => e.message), t;
1280
1309
  })();
1281
1310
  })(), null), t;
1282
1311
  })();
1283
1312
  }
1284
- var Z = Vr;
1285
- Z.Content = fr, Z.Icon = kn, Z.Title = _r, Z.Status = mr, Z.Value = Nr, Z.SliderFill = lr, Z.Head = Un, Z.Hero = Wn, Z.Controls = Gn, Z.Stepper = Kn, Z.Choice = qn, Z.Action = Jn, Z.Chip = Yn, Z.Backdrop = Zn, Z.Layer = Xn, Z.Glyph = Qn, ve(["keydown"]);
1313
+ var Y = Yr;
1314
+ Y.Content = yr, Y.Icon = In, Y.Title = wr, Y.Status = xr, Y.Value = Br, Y.SliderFill = gr, Y.Head = Xn, Y.Hero = Zn, Y.Controls = Qn, Y.Stepper = $n, Y.Choice = er, Y.Action = tr, Y.Chip = nr, Y.Backdrop = ir, Y.Layer = rr, Y.Glyph = ar, ye(["keydown"]);
1286
1315
  //#endregion
1287
1316
  //#region src/framework/panel/panel.tsx
1288
- var Ur = /*#__PURE__*/ B("<section class=glasshome-panel-section><h3 class=glasshome-panel-label>"), Wr = /*#__PURE__*/ B("<div class=glasshome-panel-rows>"), Gr = /*#__PURE__*/ B("<span class=\"glasshome-widget-slider-fill glasshome-panel-row-fill\">"), Kr = /*#__PURE__*/ B("<span class=\"glasshome-widget-icon glass glasshome-panel-row-icon\">"), qr = /*#__PURE__*/ B("<span class=glasshome-panel-row-state>"), Jr = /*#__PURE__*/ B("<span class=glasshome-panel-row-text><span class=glasshome-panel-row-name>"), Yr = /*#__PURE__*/ B("<span class=glasshome-panel-row-trailing>"), Xr = /*#__PURE__*/ B("<div class=glasshome-panel-row-wrap>"), Zr = /*#__PURE__*/ B("<div>"), Qr = /*#__PURE__*/ B("<div class=\"glasshome-panel-facts glass\">"), $r = /*#__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>"), ei = 450, ti = 8, ni = (e, t, n) => Math.min(n, Math.max(t, e)), ri = "button, a, input, select, textarea, [role=\"slider\"], [role=\"radio\"], [role=\"switch\"]";
1289
- function ii(e) {
1290
- let t = A(W), n, r = !1, i = !1, a, o = 0, s = (t, n) => {
1317
+ var Zr = /*#__PURE__*/ z("<section class=glasshome-panel-section><h3 class=glasshome-panel-label>"), Qr = /*#__PURE__*/ z("<div class=glasshome-panel-rows>"), $r = /*#__PURE__*/ z("<span class=\"glasshome-widget-slider-fill glasshome-panel-row-fill\">"), ei = /*#__PURE__*/ z("<span class=\"glasshome-widget-icon glass glasshome-panel-row-icon\">"), ti = /*#__PURE__*/ z("<span class=glasshome-panel-row-state>"), ni = /*#__PURE__*/ z("<span class=glasshome-panel-row-text><span class=glasshome-panel-row-name>"), ri = /*#__PURE__*/ z("<span class=glasshome-panel-row-trailing>"), ii = /*#__PURE__*/ z("<div class=glasshome-panel-row-wrap>"), ai = /*#__PURE__*/ z("<div>"), oi = /*#__PURE__*/ z("<div class=\"glasshome-panel-facts glass\">"), si = /*#__PURE__*/ z("<div class=glasshome-panel-fact><span class=glasshome-panel-row-text><span class=glasshome-panel-fact-label></span><span class=glasshome-panel-fact-value>"), ci = 8, li = (e, t, n) => Math.min(n, Math.max(t, e));
1318
+ function ui(e) {
1319
+ let t = k(U), n, r = !1, i = !1, a, o = 0, s = (t, n) => {
1291
1320
  let r = e.slide?.();
1292
1321
  if (!r) return 0;
1293
1322
  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;
1294
- return Math.round(ni(o + a * (s - o), o, s));
1323
+ return Math.round(li(o + a * (s - o), o, s));
1295
1324
  }, c = () => {
1296
1325
  clearTimeout(a), n = void 0;
1297
1326
  };
1298
- return k(() => clearTimeout(a)), {
1327
+ return O(() => clearTimeout(a)), {
1299
1328
  onPointerDown: (o) => {
1300
1329
  if (o.button !== 0 || n) return;
1301
- let s = o.target instanceof Element ? o.target.closest(ri) : null;
1330
+ let s = o.target instanceof Element ? o.target.closest(Dn) : null;
1302
1331
  s && s !== o.currentTarget || (n = {
1303
1332
  x: o.clientX,
1304
1333
  y: o.clientY,
1305
1334
  id: o.pointerId
1306
1335
  }, o.currentTarget.setPointerCapture?.(o.pointerId), r = !1, i = !1, e.onHold && (a = setTimeout(() => {
1307
1336
  i = !0, e.onHold?.(), t?.onHeld?.();
1308
- }, ei)));
1337
+ }, Je)));
1309
1338
  },
1310
1339
  onPointerMove: (t) => {
1311
1340
  if (!n || t.pointerId !== n.id || i) return;
1312
1341
  let c = t.currentTarget, l = e.axis === "x" ? Math.abs(t.clientX - n.x) : Math.abs(t.clientY - n.y);
1313
- !r && e.slide?.() && l > ti && (r = !0, clearTimeout(a)), r ? (o = s(c, t), e.slide?.()?.onChange(o)) : Math.hypot(t.clientX - n.x, t.clientY - n.y) > ti && clearTimeout(a);
1342
+ !r && e.slide?.() && l > ci && (r = !0, clearTimeout(a)), r ? (o = s(c, t), e.slide?.()?.onChange(o)) : Math.hypot(t.clientX - n.x, t.clientY - n.y) > ci && clearTimeout(a);
1314
1343
  },
1315
1344
  onPointerUp: (t) => {
1316
1345
  n && t.pointerId === n.id && (r ? e.slide?.()?.onCommit?.(o) : i || e.onTap?.(), c());
@@ -1318,20 +1347,20 @@ function ii(e) {
1318
1347
  onPointerCancel: c
1319
1348
  };
1320
1349
  }
1321
- function ai(e) {
1350
+ function di(e) {
1322
1351
  return (() => {
1323
- var t = Ur(), n = t.firstChild;
1324
- return F(n, () => e.label), F(t, () => e.children, null), t;
1352
+ var t = Zr(), n = t.firstChild;
1353
+ return P(n, () => e.label), P(t, () => e.children, null), t;
1325
1354
  })();
1326
1355
  }
1327
- function oi(e) {
1356
+ function fi(e) {
1328
1357
  return (() => {
1329
- var t = Wr();
1330
- return F(t, () => e.children), t;
1358
+ var t = Qr();
1359
+ return P(t, () => e.children), t;
1331
1360
  })();
1332
1361
  }
1333
- function si(e) {
1334
- let t = () => !!(e.onTap || e.slide || e.onHold), n = ii({
1362
+ function pi(e) {
1363
+ let t = () => !!(e.onTap || e.slide || e.onHold), n = ui({
1335
1364
  axis: "x",
1336
1365
  slide: () => e.slide,
1337
1366
  onTap: () => e.onTap?.(),
@@ -1348,26 +1377,26 @@ function si(e) {
1348
1377
  let r = t.key === "ArrowRight" || t.key === "ArrowUp" ? 5 : t.key === "ArrowLeft" || t.key === "ArrowDown" ? -5 : 0;
1349
1378
  if (!r) return;
1350
1379
  t.preventDefault();
1351
- let i = ni(n.value + r, n.min ?? 0, n.max ?? 100);
1380
+ let i = li(n.value + r, n.min ?? 0, n.max ?? 100);
1352
1381
  n.onChange(i), n.onCommit?.(i);
1353
1382
  }, a = () => [
1354
- N(w, {
1383
+ M(w, {
1355
1384
  get when() {
1356
1385
  return r() !== void 0;
1357
1386
  },
1358
1387
  get children() {
1359
- var e = Gr();
1360
- return P((t) => z(e, { "--widget-fill-value": r() }, t)), e;
1388
+ var e = $r();
1389
+ return N((t) => R(e, { "--widget-fill-value": r() }, t)), e;
1361
1390
  }
1362
1391
  }),
1363
1392
  (() => {
1364
- var t = Kr();
1365
- return F(t, N(U, {
1393
+ var t = ei();
1394
+ return P(t, M(H, {
1366
1395
  get icon() {
1367
1396
  return e.icon;
1368
1397
  },
1369
1398
  class: "glasshome-widget-icon-glyph"
1370
- })), P((n) => {
1399
+ })), N((n) => {
1371
1400
  var r = !!e.on, i = !e.on;
1372
1401
  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;
1373
1402
  }, {
@@ -1376,33 +1405,33 @@ function si(e) {
1376
1405
  }), t;
1377
1406
  })(),
1378
1407
  (() => {
1379
- var t = Jr(), n = t.firstChild;
1380
- return F(n, () => e.name), F(t, N(w, {
1408
+ var t = ni(), n = t.firstChild;
1409
+ return P(n, () => e.name), P(t, M(w, {
1381
1410
  get when() {
1382
1411
  return e.state !== void 0;
1383
1412
  },
1384
1413
  get children() {
1385
- var t = qr();
1386
- return F(t, () => e.state), t;
1414
+ var t = ti();
1415
+ return P(t, () => e.state), t;
1387
1416
  }
1388
1417
  }), null), t;
1389
1418
  })()
1390
1419
  ], o = () => ({ "--widget-color": e.tone ?? "var(--tone-neutral)" });
1391
1420
  return (() => {
1392
- var r = Xr();
1393
- return F(r, N(w, {
1421
+ var r = ii();
1422
+ return P(r, M(w, {
1394
1423
  get when() {
1395
1424
  return t();
1396
1425
  },
1397
1426
  get fallback() {
1398
1427
  return (() => {
1399
- var e = Zr();
1400
- return F(e, a), P((t) => {
1401
- var n = `${Pt({
1428
+ var e = ai();
1429
+ return P(e, a), N((t) => {
1430
+ var n = `${zt({
1402
1431
  variant: "outline",
1403
1432
  size: "none"
1404
1433
  })} glasshome-panel-row glasshome-panel-row-static`, r = o();
1405
- return n !== t.e && M(e, t.e = n), t.t = z(e, r, t.t), t;
1434
+ return n !== t.e && j(e, t.e = n), t.t = R(e, r, t.t), t;
1406
1435
  }, {
1407
1436
  e: void 0,
1408
1437
  t: void 0
@@ -1410,7 +1439,7 @@ function si(e) {
1410
1439
  })();
1411
1440
  },
1412
1441
  get children() {
1413
- return N(Ee, {
1442
+ return M(De, {
1414
1443
  variant: "outline",
1415
1444
  size: "none",
1416
1445
  class: "glasshome-panel-row",
@@ -1444,39 +1473,39 @@ function si(e) {
1444
1473
  }
1445
1474
  });
1446
1475
  }
1447
- }), null), F(r, N(w, {
1476
+ }), null), P(r, M(w, {
1448
1477
  get when() {
1449
1478
  return e.trailing;
1450
1479
  },
1451
1480
  get children() {
1452
- var t = Yr();
1453
- return F(t, () => e.trailing), t;
1481
+ var t = ri();
1482
+ return P(t, () => e.trailing), t;
1454
1483
  }
1455
1484
  }), null), r;
1456
1485
  })();
1457
1486
  }
1458
- function ci(e) {
1487
+ function mi(e) {
1459
1488
  return (() => {
1460
- var t = Qr();
1461
- return F(t, N(C, {
1489
+ var t = oi();
1490
+ return P(t, M(C, {
1462
1491
  get each() {
1463
1492
  return e.items;
1464
1493
  },
1465
1494
  children: (e) => (() => {
1466
- var t = $r(), n = t.firstChild, r = n.firstChild, i = r.nextSibling;
1467
- return F(t, N(U, {
1495
+ var t = si(), n = t.firstChild, r = n.firstChild, i = r.nextSibling;
1496
+ return P(t, M(H, {
1468
1497
  get icon() {
1469
1498
  return e.icon;
1470
1499
  },
1471
1500
  class: "glasshome-panel-fact-icon"
1472
- }), n), F(r, () => e.label), F(i, () => e.value), t;
1501
+ }), n), P(r, () => e.label), P(i, () => e.value), t;
1473
1502
  })()
1474
1503
  })), t;
1475
1504
  })();
1476
1505
  }
1477
1506
  //#endregion
1478
1507
  //#region src/framework/panel/panel-entity.tsx
1479
- var li = (e) => typeof e == "number" ? Math.round(e) : void 0, ui = (e) => e.charAt(0).toUpperCase() + e.slice(1).replaceAll("_", " "), Q = (e) => ({ entity_id: e.id }), di = {
1508
+ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.charAt(0).toUpperCase() + e.slice(1).replaceAll("_", " "), X = (e) => ({ entity_id: e.id }), _i = {
1480
1509
  light: {
1481
1510
  icon: "mdi:lightbulb",
1482
1511
  tone: (e) => {
@@ -1493,22 +1522,22 @@ var li = (e) => typeof e == "number" ? Math.round(e) : void 0, ui = (e) => e.cha
1493
1522
  let t = e.attributes.brightness;
1494
1523
  return e.state === "on" ? typeof t == "number" ? Math.round(t / 255 * 100) : 100 : 0;
1495
1524
  },
1496
- setLevel: (e, t, n) => e("light", n > 0 ? "turn_on" : "turn_off", n > 0 ? { brightness_pct: n } : {}, Q(t)),
1497
- tap: (e, t) => e("light", "toggle", {}, Q(t))
1525
+ setLevel: (e, t, n) => e("light", n > 0 ? "turn_on" : "turn_off", n > 0 ? { brightness_pct: n } : {}, X(t)),
1526
+ tap: (e, t) => e("light", "toggle", {}, X(t))
1498
1527
  },
1499
1528
  switch: {
1500
1529
  icon: "mdi:toggle-switch-variant",
1501
1530
  tone: "var(--tone-info)",
1502
1531
  on: (e) => e.state === "on",
1503
1532
  state: (e) => e.state === "on" ? "On" : "Off",
1504
- tap: (e, t) => e("switch", "toggle", {}, Q(t))
1533
+ tap: (e, t) => e("switch", "toggle", {}, X(t))
1505
1534
  },
1506
1535
  input_boolean: {
1507
1536
  icon: "mdi:toggle-switch-variant",
1508
1537
  tone: "var(--tone-info)",
1509
1538
  on: (e) => e.state === "on",
1510
1539
  state: (e) => e.state === "on" ? "On" : "Off",
1511
- tap: (e, t) => e("input_boolean", "toggle", {}, Q(t))
1540
+ tap: (e, t) => e("input_boolean", "toggle", {}, X(t))
1512
1541
  },
1513
1542
  fan: {
1514
1543
  icon: "mdi:fan",
@@ -1516,31 +1545,31 @@ var li = (e) => typeof e == "number" ? Math.round(e) : void 0, ui = (e) => e.cha
1516
1545
  on: (e) => e.state === "on",
1517
1546
  state: (e) => {
1518
1547
  if (e.state !== "on") return "Off";
1519
- let t = li(e.attributes.percentage);
1548
+ let t = hi(e.attributes.percentage);
1520
1549
  return t === void 0 ? "On" : `${t}%`;
1521
1550
  },
1522
- level: (e) => e.state === "on" ? li(e.attributes.percentage) ?? 100 : 0,
1523
- setLevel: (e, t, n) => e("fan", "set_percentage", { percentage: n }, Q(t)),
1524
- tap: (e, t) => e("fan", "toggle", {}, Q(t))
1551
+ level: (e) => e.state === "on" ? hi(e.attributes.percentage) ?? 100 : 0,
1552
+ setLevel: (e, t, n) => e("fan", "set_percentage", { percentage: n }, X(t)),
1553
+ tap: (e, t) => e("fan", "toggle", {}, X(t))
1525
1554
  },
1526
1555
  cover: {
1527
1556
  icon: "mdi:blinds",
1528
1557
  tone: "var(--tone-info)",
1529
1558
  on: (e) => e.state !== "closed",
1530
1559
  state: (e) => {
1531
- let t = li(e.attributes.current_position), n = ui(e.state);
1560
+ let t = hi(e.attributes.current_position), n = gi(e.state);
1532
1561
  return t !== void 0 && e.state === "open" ? `${n} · ${t}%` : n;
1533
1562
  },
1534
- level: (e) => li(e.attributes.current_position),
1535
- setLevel: (e, t, n) => e("cover", "set_cover_position", { position: n }, Q(t)),
1536
- tap: (e, t) => e("cover", t.state === "closed" ? "open_cover" : "close_cover", {}, Q(t))
1563
+ level: (e) => hi(e.attributes.current_position),
1564
+ setLevel: (e, t, n) => e("cover", "set_cover_position", { position: n }, X(t)),
1565
+ tap: (e, t) => e("cover", t.state === "closed" ? "open_cover" : "close_cover", {}, X(t))
1537
1566
  },
1538
1567
  lock: {
1539
1568
  icon: (e) => e.state === "locked" ? "mdi:lock" : "mdi:lock-open-variant",
1540
1569
  tone: "var(--tone-success)",
1541
1570
  on: (e) => e.state === "locked",
1542
- state: (e) => ui(e.state),
1543
- tap: (e, t) => e("lock", t.state === "locked" ? "unlock" : "lock", {}, Q(t))
1571
+ state: (e) => gi(e.state),
1572
+ tap: (e, t) => e("lock", t.state === "locked" ? "unlock" : "lock", {}, X(t))
1544
1573
  },
1545
1574
  climate: {
1546
1575
  icon: "mdi:thermostat",
@@ -1549,24 +1578,24 @@ var li = (e) => typeof e == "number" ? Math.round(e) : void 0, ui = (e) => e.cha
1549
1578
  state: (e) => {
1550
1579
  if (e.state === "off") return "Off";
1551
1580
  let t = e.attributes.temperature;
1552
- return typeof t == "number" ? `${ui(e.state)} · ${t}°` : ui(e.state);
1581
+ return typeof t == "number" ? `${gi(e.state)} · ${t}°` : gi(e.state);
1553
1582
  }
1554
1583
  },
1555
1584
  media_player: {
1556
1585
  icon: "mdi:speaker",
1557
1586
  tone: "var(--tone-accent)",
1558
1587
  on: (e) => e.state === "playing",
1559
- state: (e) => typeof e.attributes.media_title == "string" && e.state !== "off" ? e.attributes.media_title : ui(e.state),
1588
+ state: (e) => typeof e.attributes.media_title == "string" && e.state !== "off" ? e.attributes.media_title : gi(e.state),
1560
1589
  level: (e) => typeof e.attributes.volume_level == "number" ? Math.round(e.attributes.volume_level * 100) : void 0,
1561
- setLevel: (e, t, n) => e("media_player", "volume_set", { volume_level: n / 100 }, Q(t)),
1562
- tap: (e, t) => e("media_player", "media_play_pause", {}, Q(t))
1590
+ setLevel: (e, t, n) => e("media_player", "volume_set", { volume_level: n / 100 }, X(t)),
1591
+ tap: (e, t) => e("media_player", "media_play_pause", {}, X(t))
1563
1592
  },
1564
1593
  binary_sensor: {
1565
1594
  icon: "mdi:eye",
1566
1595
  tone: "var(--tone-info)",
1567
1596
  on: (e) => e.state === "on",
1568
1597
  state: (e) => {
1569
- let t = pi[e.deviceClass ?? ""] ?? ["On", "Off"];
1598
+ let t = yi[e.deviceClass ?? ""] ?? ["On", "Off"];
1570
1599
  return e.state === "on" ? t[0] : t[1];
1571
1600
  }
1572
1601
  },
@@ -1574,38 +1603,38 @@ var li = (e) => typeof e == "number" ? Math.round(e) : void 0, ui = (e) => e.cha
1574
1603
  icon: "mdi:gesture-tap-button",
1575
1604
  tone: "var(--tone-accent)",
1576
1605
  on: () => !1,
1577
- state: (e) => mi(e.state),
1578
- tap: (e, t) => e("button", "press", {}, Q(t))
1606
+ state: (e) => bi(e.state),
1607
+ tap: (e, t) => e("button", "press", {}, X(t))
1579
1608
  },
1580
1609
  input_button: {
1581
1610
  icon: "mdi:gesture-tap-button",
1582
1611
  tone: "var(--tone-accent)",
1583
1612
  on: () => !1,
1584
- state: (e) => mi(e.state),
1585
- tap: (e, t) => e("input_button", "press", {}, Q(t))
1613
+ state: (e) => bi(e.state),
1614
+ tap: (e, t) => e("input_button", "press", {}, X(t))
1586
1615
  },
1587
1616
  scene: {
1588
1617
  icon: "mdi:palette",
1589
1618
  tone: "var(--tone-accent)",
1590
1619
  on: () => !1,
1591
1620
  state: () => "Tap to run",
1592
- tap: (e, t) => e("scene", "turn_on", {}, Q(t))
1621
+ tap: (e, t) => e("scene", "turn_on", {}, X(t))
1593
1622
  },
1594
1623
  script: {
1595
1624
  icon: "mdi:script-text",
1596
1625
  tone: "var(--tone-accent)",
1597
1626
  on: (e) => e.state === "on",
1598
1627
  state: (e) => e.state === "on" ? "Running" : "Tap to run",
1599
- tap: (e, t) => e("script", "turn_on", {}, Q(t))
1628
+ tap: (e, t) => e("script", "turn_on", {}, X(t))
1600
1629
  }
1601
- }, fi = {
1630
+ }, vi = {
1602
1631
  garage: "mdi:garage",
1603
1632
  gate: "mdi:gate",
1604
1633
  door: "mdi:door",
1605
1634
  curtain: "mdi:curtains",
1606
1635
  shutter: "mdi:window-shutter",
1607
1636
  awning: "mdi:awning"
1608
- }, pi = {
1637
+ }, yi = {
1609
1638
  door: ["Open", "Closed"],
1610
1639
  window: ["Open", "Closed"],
1611
1640
  garage_door: ["Open", "Closed"],
@@ -1619,44 +1648,44 @@ var li = (e) => typeof e == "number" ? Math.round(e) : void 0, ui = (e) => e.cha
1619
1648
  battery: ["Low", "Normal"],
1620
1649
  connectivity: ["Connected", "Disconnected"]
1621
1650
  };
1622
- function mi(e) {
1651
+ function bi(e) {
1623
1652
  let t = Date.parse(e);
1624
1653
  return Number.isNaN(t) ? "Never pressed" : new Date(t).toLocaleTimeString([], {
1625
1654
  hour: "2-digit",
1626
1655
  minute: "2-digit"
1627
1656
  });
1628
1657
  }
1629
- var hi = {
1658
+ var xi = {
1630
1659
  icon: "mdi:circle-medium",
1631
1660
  tone: "var(--tone-neutral)",
1632
1661
  on: (e) => e.state === "on",
1633
- state: (e) => ui(e.state)
1662
+ state: (e) => gi(e.state)
1634
1663
  };
1635
- function gi(e, t) {
1664
+ function Si(e, t) {
1636
1665
  if (!t || e.length <= t.length || !e.toLowerCase().startsWith(t.toLowerCase())) return e;
1637
1666
  let n = e.slice(t.length).trim();
1638
1667
  return n ? n.charAt(0).toUpperCase() + n.slice(1) : e;
1639
1668
  }
1640
- function _i(e) {
1641
- return !!di[e]?.tap || !!di[e]?.setLevel;
1669
+ function Ci(e) {
1670
+ return !!_i[e]?.tap || !!_i[e]?.setLevel;
1642
1671
  }
1643
- function vi(e) {
1644
- let t = te(() => e.entityId), { callService: n } = Yt(), [r, i] = O();
1645
- return E(() => {
1672
+ function wi(e) {
1673
+ let t = S(() => e.entityId), { callService: n } = en(), [r, i] = D();
1674
+ return T(() => {
1646
1675
  t(), i(void 0);
1647
- }), N(w, {
1676
+ }), M(w, {
1648
1677
  get when() {
1649
1678
  return t();
1650
1679
  },
1651
1680
  children: (t) => {
1652
- let a = () => di[t().domain] ?? hi, o = () => r() ?? a().level?.(t()), s = () => a().setLevel;
1653
- return N(si, {
1681
+ let a = () => _i[t().domain] ?? xi, o = () => r() ?? a().level?.(t()), s = () => a().setLevel;
1682
+ return M(pi, {
1654
1683
  get icon() {
1655
1684
  let n = a().icon;
1656
- return typeof n == "function" ? e.icon ?? n(t()) : e.icon ?? t().icon ?? fi[t().domain === "cover" ? t().deviceClass ?? "" : ""] ?? n;
1685
+ return typeof n == "function" ? e.icon ?? n(t()) : e.icon ?? t().icon ?? vi[t().domain === "cover" ? t().deviceClass ?? "" : ""] ?? n;
1657
1686
  },
1658
1687
  get name() {
1659
- return e.name ?? gi(t().friendlyName ?? t().id, e.within);
1688
+ return e.name ?? Si(t().friendlyName ?? t().id, e.within);
1660
1689
  },
1661
1690
  get state() {
1662
1691
  return a().state(t());
@@ -1670,7 +1699,7 @@ function vi(e) {
1670
1699
  return a().on(t());
1671
1700
  },
1672
1701
  get slide() {
1673
- return I(() => !!(s() && o() !== void 0))() ? {
1702
+ return F(() => !!(s() && o() !== void 0))() ? {
1674
1703
  value: o() ?? 0,
1675
1704
  onChange: i,
1676
1705
  onCommit: (e) => s()?.(n, t(), e)
@@ -1688,8 +1717,8 @@ function vi(e) {
1688
1717
  }
1689
1718
  //#endregion
1690
1719
  //#region src/framework/dialogs/debug-view.tsx
1691
- var yi = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-64 overflow-auto p-3 font-mono text-xs leading-relaxed\">"), bi = /*#__PURE__*/ B("<span class=\"flex items-center gap-2\">"), xi = /*#__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\">"), Si = /*#__PURE__*/ B("<div class=\"flex flex-col\">"), Ci = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-96 overflow-auto p-3 font-mono text-xs leading-relaxed whitespace-pre-wrap\">");
1692
- function wi(e, t, n) {
1720
+ var Ti = /*#__PURE__*/ z("<pre class=\"text-muted-foreground max-h-64 overflow-auto p-3 font-mono text-xs leading-relaxed\">"), Ei = /*#__PURE__*/ z("<span class=\"flex items-center gap-2\">"), Di = /*#__PURE__*/ z("<section class=\"flex min-w-0 flex-col gap-2\"><header class=\"flex items-center gap-3\"><div class=\"flex min-w-0 flex-1 flex-col\"></div></header><div class=\"flex flex-col gap-2\">"), Oi = /*#__PURE__*/ z("<div class=\"flex flex-col\">"), ki = /*#__PURE__*/ z("<pre class=\"text-muted-foreground max-h-96 overflow-auto p-3 font-mono text-xs leading-relaxed whitespace-pre-wrap\">");
1721
+ function Ai(e, t, n) {
1693
1722
  return {
1694
1723
  widgetConfig: e,
1695
1724
  entities: t.map((e) => ({
@@ -1706,18 +1735,18 @@ function wi(e, t, n) {
1706
1735
  ...n
1707
1736
  };
1708
1737
  }
1709
- var Ti = (e) => JSON.stringify(e, null, 2), Ei = {
1738
+ var ji = (e) => JSON.stringify(e, null, 2), Mi = {
1710
1739
  idle: "lucide:copy",
1711
1740
  copied: "lucide:check",
1712
1741
  failed: "lucide:triangle-alert"
1713
- }, Di = {
1742
+ }, Ni = {
1714
1743
  idle: "text-muted-foreground",
1715
1744
  copied: "text-success",
1716
1745
  failed: "text-destructive"
1717
1746
  };
1718
- function Oi(e) {
1719
- let { state: t, copy: n } = xr();
1720
- return N(Ee, {
1747
+ function Pi(e) {
1748
+ let { state: t, copy: n } = Or();
1749
+ return M(De, {
1721
1750
  variant: "ghost",
1722
1751
  size: "icon",
1723
1752
  class: "size-8",
@@ -1726,70 +1755,70 @@ function Oi(e) {
1726
1755
  },
1727
1756
  onClick: () => void n(e.text()),
1728
1757
  get children() {
1729
- return N(U, {
1758
+ return M(H, {
1730
1759
  get icon() {
1731
- return Ei[t()];
1760
+ return Mi[t()];
1732
1761
  },
1733
1762
  width: 16,
1734
1763
  height: 16,
1735
1764
  get class() {
1736
- return Di[t()];
1765
+ return Ni[t()];
1737
1766
  }
1738
1767
  });
1739
1768
  }
1740
1769
  });
1741
1770
  }
1742
- function ki(e) {
1771
+ function Fi(e) {
1743
1772
  let t = e.replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ");
1744
1773
  return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
1745
1774
  }
1746
- var Ai = (e) => e === null || typeof e != "object" && typeof e != "function";
1747
- function ji(e) {
1775
+ var Ii = (e) => e === null || typeof e != "object" && typeof e != "function";
1776
+ function Li(e) {
1748
1777
  return e == null ? "None" : String(e);
1749
1778
  }
1750
- function Mi(e) {
1779
+ function Ri(e) {
1751
1780
  return Array.isArray(e) ? e.length : typeof e == "object" && e ? Object.keys(e).length : 0;
1752
1781
  }
1753
- function Ni(e) {
1782
+ function zi(e) {
1754
1783
  let t = new Date(e);
1755
1784
  return Number.isNaN(t.getTime()) ? e : t.toLocaleString();
1756
1785
  }
1757
- function Pi(e) {
1758
- return N(ut, {
1786
+ function Bi(e) {
1787
+ return M(ht, {
1759
1788
  class: "overflow-hidden p-0",
1760
1789
  get children() {
1761
- var t = yi();
1762
- return F(t, () => Ti(e.value)), t;
1790
+ var t = Ti();
1791
+ return P(t, () => ji(e.value)), t;
1763
1792
  }
1764
1793
  });
1765
1794
  }
1766
- function Fi(e) {
1767
- return N(ye, {
1795
+ function Vi(e) {
1796
+ return M(be, {
1768
1797
  collapsible: !0,
1769
1798
  class: "border-border/50 border-t",
1770
1799
  get children() {
1771
- return N(xe, {
1800
+ return M(Se, {
1772
1801
  get value() {
1773
1802
  return e.label;
1774
1803
  },
1775
1804
  get children() {
1776
- return [N(Se, {
1805
+ return [M(Ce, {
1777
1806
  class: "text-muted-foreground py-3 text-xs",
1778
1807
  get children() {
1779
- var t = bi();
1780
- return F(t, () => e.label, null), F(t, N(w, {
1808
+ var t = Ei();
1809
+ return P(t, () => e.label, null), P(t, M(w, {
1781
1810
  get when() {
1782
1811
  return e.count !== void 0;
1783
1812
  },
1784
1813
  get children() {
1785
- return N(ze, { get children() {
1814
+ return M(Be, { get children() {
1786
1815
  return e.count;
1787
1816
  } });
1788
1817
  }
1789
1818
  }), null), t;
1790
1819
  }
1791
- }), N(be, { get children() {
1792
- return N(Pi, { get value() {
1820
+ }), M(xe, { get children() {
1821
+ return M(Bi, { get value() {
1793
1822
  return e.value;
1794
1823
  } });
1795
1824
  } })];
@@ -1798,77 +1827,77 @@ function Fi(e) {
1798
1827
  }
1799
1828
  });
1800
1829
  }
1801
- function Ii(e) {
1830
+ function Hi(e) {
1802
1831
  return (() => {
1803
- var t = xi(), n = t.firstChild, r = n.firstChild, i = n.nextSibling;
1804
- return F(n, N(ct, {
1832
+ var t = Di(), n = t.firstChild, r = n.firstChild, i = n.nextSibling;
1833
+ return P(n, M(pt, {
1805
1834
  get icon() {
1806
1835
  return e.icon;
1807
1836
  },
1808
1837
  size: "sm"
1809
- }), r), F(r, N(Ge, {
1838
+ }), r), P(r, M(Ke, {
1810
1839
  class: "truncate",
1811
1840
  get children() {
1812
1841
  return e.title;
1813
1842
  }
1814
- }), null), F(r, N(w, {
1843
+ }), null), P(r, M(w, {
1815
1844
  get when() {
1816
1845
  return e.subtitle;
1817
1846
  },
1818
- children: (e) => N(lt, {
1847
+ children: (e) => M(mt, {
1819
1848
  class: "truncate font-mono",
1820
1849
  get children() {
1821
1850
  return e();
1822
1851
  }
1823
1852
  })
1824
- }), null), F(n, () => e.badge, null), F(n, N(Oi, {
1853
+ }), null), P(n, () => e.badge, null), P(n, M(Pi, {
1825
1854
  get label() {
1826
1855
  return `Copy ${e.title}`;
1827
1856
  },
1828
- text: () => Ti(e.source)
1829
- }), null), F(i, () => e.children), t;
1857
+ text: () => ji(e.source)
1858
+ }), null), P(i, () => e.children), t;
1830
1859
  })();
1831
1860
  }
1832
- function Li(e) {
1833
- let t = D(() => Object.entries(e.record)), n = D(() => t().flatMap(([e, t]) => Ai(t) ? [[e, t]] : [])), r = D(() => t().filter(([, e]) => !Ai(e)));
1834
- return N(w, {
1861
+ function Ui(e) {
1862
+ let t = E(() => Object.entries(e.record)), n = E(() => t().flatMap(([e, t]) => Ii(t) ? [[e, t]] : [])), r = E(() => t().filter(([, e]) => !Ii(e)));
1863
+ return M(w, {
1835
1864
  get when() {
1836
1865
  return t().length > 0;
1837
1866
  },
1838
1867
  get fallback() {
1839
- return N(lt, { children: "Nothing set" });
1868
+ return M(mt, { children: "Nothing set" });
1840
1869
  },
1841
1870
  get children() {
1842
- return [N(w, {
1871
+ return [M(w, {
1843
1872
  get when() {
1844
1873
  return n().length > 0;
1845
1874
  },
1846
1875
  get children() {
1847
- var e = Si();
1848
- return F(e, N(C, {
1876
+ var e = Oi();
1877
+ return P(e, M(C, {
1849
1878
  get each() {
1850
1879
  return n();
1851
1880
  },
1852
- children: ([e, t]) => N(H, {
1881
+ children: ([e, t]) => M(V, {
1853
1882
  get label() {
1854
- return ki(e);
1883
+ return Fi(e);
1855
1884
  },
1856
1885
  get children() {
1857
- return ji(t);
1886
+ return Li(t);
1858
1887
  }
1859
1888
  })
1860
1889
  })), e;
1861
1890
  }
1862
- }), N(C, {
1891
+ }), M(C, {
1863
1892
  get each() {
1864
1893
  return r();
1865
1894
  },
1866
- children: ([e, t]) => N(Fi, {
1895
+ children: ([e, t]) => M(Vi, {
1867
1896
  get label() {
1868
- return ki(e);
1897
+ return Fi(e);
1869
1898
  },
1870
1899
  get count() {
1871
- return Mi(t);
1900
+ return Ri(t);
1872
1901
  },
1873
1902
  value: t
1874
1903
  })
@@ -1876,9 +1905,9 @@ function Li(e) {
1876
1905
  }
1877
1906
  });
1878
1907
  }
1879
- function Ri(e) {
1908
+ function Wi(e) {
1880
1909
  let t = () => e.entity.attributes ?? {};
1881
- return N(Ii, {
1910
+ return M(Hi, {
1882
1911
  icon: "lucide:activity",
1883
1912
  get title() {
1884
1913
  return e.entity.friendly_name ?? e.entity.entity_id;
@@ -1887,7 +1916,7 @@ function Ri(e) {
1887
1916
  return e.entity.entity_id;
1888
1917
  },
1889
1918
  get badge() {
1890
- return N(we, { get children() {
1919
+ return M(Te, { get children() {
1891
1920
  return e.entity.state;
1892
1921
  } });
1893
1922
  },
@@ -1896,52 +1925,52 @@ function Ri(e) {
1896
1925
  },
1897
1926
  get children() {
1898
1927
  return [(() => {
1899
- var t = Si();
1900
- return F(t, N(H, {
1928
+ var t = Oi();
1929
+ return P(t, M(V, {
1901
1930
  label: "Domain",
1902
1931
  get children() {
1903
1932
  return e.entity.domain;
1904
1933
  }
1905
- }), null), F(t, N(w, {
1934
+ }), null), P(t, M(w, {
1906
1935
  get when() {
1907
1936
  return e.entity.device_class;
1908
1937
  },
1909
- children: (e) => N(H, {
1938
+ children: (e) => M(V, {
1910
1939
  label: "Device class",
1911
1940
  get children() {
1912
1941
  return e();
1913
1942
  }
1914
1943
  })
1915
- }), null), F(t, N(w, {
1944
+ }), null), P(t, M(w, {
1916
1945
  get when() {
1917
1946
  return e.entity.area_id;
1918
1947
  },
1919
- children: (e) => N(H, {
1948
+ children: (e) => M(V, {
1920
1949
  label: "Area",
1921
1950
  get children() {
1922
1951
  return e();
1923
1952
  }
1924
1953
  })
1925
- }), null), F(t, N(H, {
1954
+ }), null), P(t, M(V, {
1926
1955
  label: "Changed",
1927
1956
  get children() {
1928
- return Ni(e.entity.last_changed);
1957
+ return zi(e.entity.last_changed);
1929
1958
  }
1930
- }), null), F(t, N(H, {
1959
+ }), null), P(t, M(V, {
1931
1960
  label: "Updated",
1932
1961
  get children() {
1933
- return Ni(e.entity.last_updated);
1962
+ return zi(e.entity.last_updated);
1934
1963
  }
1935
1964
  }), null), t;
1936
- })(), N(w, {
1965
+ })(), M(w, {
1937
1966
  get when() {
1938
- return Mi(t()) > 0;
1967
+ return Ri(t()) > 0;
1939
1968
  },
1940
1969
  get children() {
1941
- return N(Fi, {
1970
+ return M(Vi, {
1942
1971
  label: "Attributes",
1943
1972
  get count() {
1944
- return Mi(t());
1973
+ return Ri(t());
1945
1974
  },
1946
1975
  get value() {
1947
1976
  return t();
@@ -1952,42 +1981,42 @@ function Ri(e) {
1952
1981
  }
1953
1982
  });
1954
1983
  }
1955
- function zi(e) {
1956
- let t = D(() => Object.keys(e.data).filter((e) => e !== "widgetConfig" && e !== "entities"));
1957
- return N(We, { get children() {
1984
+ function Gi(e) {
1985
+ let t = E(() => Object.keys(e.data).filter((e) => e !== "widgetConfig" && e !== "entities"));
1986
+ return M(Ge, { get children() {
1958
1987
  return [
1959
- N(Ii, {
1988
+ M(Hi, {
1960
1989
  icon: "lucide:sliders-horizontal",
1961
1990
  title: "Configuration",
1962
1991
  get source() {
1963
1992
  return e.data.widgetConfig;
1964
1993
  },
1965
1994
  get children() {
1966
- return N(Li, { get record() {
1995
+ return M(Ui, { get record() {
1967
1996
  return e.data.widgetConfig;
1968
1997
  } });
1969
1998
  }
1970
1999
  }),
1971
- N(C, {
2000
+ M(C, {
1972
2001
  get each() {
1973
2002
  return e.data.entities;
1974
2003
  },
1975
- children: (e) => N(Ri, { entity: e })
2004
+ children: (e) => M(Wi, { entity: e })
1976
2005
  }),
1977
- N(C, {
2006
+ M(C, {
1978
2007
  get each() {
1979
2008
  return t();
1980
2009
  },
1981
- children: (t) => N(Ii, {
2010
+ children: (t) => M(Hi, {
1982
2011
  icon: "lucide:braces",
1983
2012
  get title() {
1984
- return ki(t);
2013
+ return Fi(t);
1985
2014
  },
1986
2015
  get source() {
1987
2016
  return e.data[t];
1988
2017
  },
1989
2018
  get children() {
1990
- return N(Pi, { get value() {
2019
+ return M(Bi, { get value() {
1991
2020
  return e.data[t];
1992
2021
  } });
1993
2022
  }
@@ -1996,52 +2025,52 @@ function zi(e) {
1996
2025
  ];
1997
2026
  } });
1998
2027
  }
1999
- function Bi(e) {
2028
+ function Ki(e) {
2000
2029
  if (typeof e != "object" || !e) return;
2001
2030
  let t = e;
2002
2031
  return Array.isArray(t.entities) && typeof t.widgetConfig == "object" ? t : void 0;
2003
2032
  }
2004
- function Vi(e) {
2005
- let t = D(() => Bi(e.data));
2006
- return N(w, {
2033
+ function qi(e) {
2034
+ let t = E(() => Ki(e.data));
2035
+ return M(w, {
2007
2036
  get when() {
2008
2037
  return e.data !== void 0;
2009
2038
  },
2010
2039
  get fallback() {
2011
- return N(Be, { get children() {
2012
- return N(He, { get children() {
2013
- return [N(Ue, { children: "Nothing to inspect" }), N(Ve, { children: "This widget publishes no debug information." })];
2040
+ return M(Ve, { get children() {
2041
+ return M(Ue, { get children() {
2042
+ return [M(We, { children: "Nothing to inspect" }), M(He, { children: "This widget publishes no debug information." })];
2014
2043
  } });
2015
2044
  } });
2016
2045
  },
2017
2046
  get children() {
2018
- return N(w, {
2047
+ return M(w, {
2019
2048
  get when() {
2020
2049
  return t();
2021
2050
  },
2022
2051
  get fallback() {
2023
- return N(Ii, {
2052
+ return M(Hi, {
2024
2053
  icon: "lucide:braces",
2025
2054
  title: "Debug data",
2026
2055
  get source() {
2027
2056
  return e.data;
2028
2057
  },
2029
2058
  get children() {
2030
- return N(w, {
2059
+ return M(w, {
2031
2060
  get when() {
2032
2061
  return typeof e.data == "string";
2033
2062
  },
2034
2063
  get fallback() {
2035
- return N(Pi, { get value() {
2064
+ return M(Bi, { get value() {
2036
2065
  return e.data;
2037
2066
  } });
2038
2067
  },
2039
2068
  get children() {
2040
- return N(ut, {
2069
+ return M(ht, {
2041
2070
  class: "overflow-hidden p-0",
2042
2071
  get children() {
2043
- var t = Ci();
2044
- return F(t, () => e.data), t;
2072
+ var t = ki();
2073
+ return P(t, () => e.data), t;
2045
2074
  }
2046
2075
  });
2047
2076
  }
@@ -2049,7 +2078,7 @@ function Vi(e) {
2049
2078
  }
2050
2079
  });
2051
2080
  },
2052
- children: (e) => N(zi, { get data() {
2081
+ children: (e) => M(Gi, { get data() {
2053
2082
  return e();
2054
2083
  } })
2055
2084
  });
@@ -2058,21 +2087,21 @@ function Vi(e) {
2058
2087
  }
2059
2088
  //#endregion
2060
2089
  //#region src/framework/dialogs/validate-config.ts
2061
- function Hi(e) {
2090
+ function Ji(e) {
2062
2091
  let t = "";
2063
2092
  for (let n of e) t += typeof n == "number" ? `[${n}]` : t ? `.${String(n)}` : String(n);
2064
2093
  return t;
2065
2094
  }
2066
- function Ui(e, t) {
2095
+ function Yi(e, t) {
2067
2096
  let n = e.safeParse(t);
2068
2097
  return n.success ? null : n.error.issues.map((e) => {
2069
- let t = Hi(e.path);
2098
+ let t = Ji(e.path);
2070
2099
  return t ? `${t}: ${e.message}` : e.message;
2071
2100
  });
2072
2101
  }
2073
2102
  //#endregion
2074
2103
  //#region src/framework/dialogs/WidgetDialog.tsx
2075
- var Wi = /*#__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\">"), Gi = /*#__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"), Ki = /*#__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>"), 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=\"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\">"), Ji = /*#__PURE__*/ B("<div class=glasshome-sheet>"), Yi = /*#__PURE__*/ B("<div class=glasshome-sheet-band aria-hidden=true><img alt>"), Xi = /*#__PURE__*/ B("<span class=\"glasshome-widget-icon glass glass-tint glasshome-sheet-icon\">"), Zi = /*#__PURE__*/ B("<span class=\"inline-flex size-3.5 shrink-0 items-center\">"), Qi = (e) => Wt(e), $i = {
2104
+ var Xi = /*#__PURE__*/ z("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\">"), Zi = /*#__PURE__*/ z("<div class=\"bg-muted/30 rounded-lg p-2 text-center md:p-6\"><p class=\"text-muted-foreground text-sm\">No edit options available"), Qi = /*#__PURE__*/ z("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><line x1=4 y1=21 x2=4 y2=14></line><line x1=4 y1=10 x2=4 y2=3></line><line x1=12 y1=21 x2=12 y2=12></line><line x1=12 y1=8 x2=12 y2=3></line><line x1=20 y1=21 x2=20 y2=16></line><line x1=20 y1=12 x2=20 y2=3></line><line x1=1 y1=14 x2=7 y2=14></line><line x1=9 y1=8 x2=15 y2=8></line><line x1=17 y1=16 x2=23 y2=16>"), $i = /*#__PURE__*/ z("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><path d=\"m8 2 1.88 1.88\"></path><path d=\"M14.12 3.88 16 2\"></path><path d=\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\"></path><path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\"></path><path d=\"M12 20v-9\"></path><path d=\"M6.53 9C4.6 8.8 3 7.1 3 5\"></path><path d=\"M6 13H2\"></path><path d=\"M3 21c0-2.1 1.7-3.9 3.8-4\"></path><path d=\"M20.97 5c0 2.1-1.6 3.8-3.5 4\"></path><path d=\"M22 13h-4\"></path><path d=\"M17.2 17c2.1.1 3.8 1.9 3.8 4\">"), ea = /*#__PURE__*/ z("<div class=glasshome-sheet>"), ta = /*#__PURE__*/ z("<div class=glasshome-sheet-band aria-hidden=true><img alt>"), na = /*#__PURE__*/ z("<span class=\"glasshome-widget-icon glass glass-tint glasshome-sheet-icon\">"), ra = /*#__PURE__*/ z("<span class=\"inline-flex size-3.5 shrink-0 items-center\">"), ia = (e) => Yt(e), aa = {
2076
2105
  sm: "sm",
2077
2106
  md: "md",
2078
2107
  lg: "lg",
@@ -2081,33 +2110,33 @@ var Wi = /*#__PURE__*/ B("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 f
2081
2110
  "2xl": "xl",
2082
2111
  "3xl": "xl",
2083
2112
  "4xl": "full"
2084
- }, ea = {
2113
+ }, oa = {
2085
2114
  idle: "Copy all",
2086
2115
  copied: "Copied",
2087
2116
  failed: "Copy failed"
2088
2117
  };
2089
- function ta(e) {
2090
- let [t] = _e(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([]);
2091
- E(he(() => t.config, (e) => {
2118
+ function sa(e) {
2119
+ let [t] = ve(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] = D({}), [a, o] = D(null), [s, c] = D([]);
2120
+ T(ge(() => t.config, (e) => {
2092
2121
  e && i({ ...e });
2093
- })), E(he(() => t.configSchema, (e) => {
2094
- e && o(Qi(e));
2122
+ })), T(ge(() => t.configSchema, (e) => {
2123
+ e && o(ia(e));
2095
2124
  }));
2096
2125
  let l = () => n() && JSON.stringify(r()) !== JSON.stringify(t.config), u = (e) => {
2097
2126
  !e && t.config && (i({ ...t.config }), c([])), t.onOpenChange(e);
2098
2127
  }, d = () => {
2099
2128
  let e = t.configSchema;
2100
2129
  if (e) {
2101
- let t = Ui(e, r());
2130
+ let t = Yi(e, r());
2102
2131
  if (t) {
2103
2132
  c(t);
2104
2133
  return;
2105
2134
  }
2106
2135
  }
2107
2136
  c([]), t.onConfigSave?.(r());
2108
- }, [f, p] = O(t.defaultTab ?? "controls"), m = () => t.activeTab ?? f(), h = (e) => {
2137
+ }, [f, p] = D(t.defaultTab ?? "controls"), m = () => t.activeTab ?? f(), h = (e) => {
2109
2138
  t.onActiveTabChange ? t.onActiveTabChange(e) : p(e);
2110
- }, g = () => $i[t.maxWidth ?? "xl"], _ = () => {
2139
+ }, ee = () => aa[t.maxWidth ?? "xl"], g = () => {
2111
2140
  if (t.tabs) return t.tabs.map((e) => ({
2112
2141
  ...e,
2113
2142
  icon: () => e.icon,
@@ -2117,10 +2146,10 @@ function ta(e) {
2117
2146
  return e.push({
2118
2147
  id: "edit",
2119
2148
  label: "Edit",
2120
- icon: () => Wi(),
2149
+ icon: () => Xi(),
2121
2150
  content: () => t.editContent ?? (() => {
2122
2151
  let e = t.SchemaForm, o = n() ? a() : void 0;
2123
- return !o || !e ? Gi() : N(e, {
2152
+ return !o || !e ? Zi() : M(e, {
2124
2153
  schema: o,
2125
2154
  get data() {
2126
2155
  return r();
@@ -2134,86 +2163,86 @@ function ta(e) {
2134
2163
  }), e.push({
2135
2164
  id: "controls",
2136
2165
  label: "Controls",
2137
- icon: () => Ki(),
2138
- content: () => t.controlsContent ?? N(Be, { get children() {
2139
- return N(He, { get children() {
2140
- return [N(Ue, { children: "No controls" }), N(Ve, { children: "This widget is shown as is." })];
2166
+ icon: () => Qi(),
2167
+ content: () => t.controlsContent ?? M(Ve, { get children() {
2168
+ return M(Ue, { get children() {
2169
+ return [M(We, { children: "No controls" }), M(He, { children: "This widget is shown as is." })];
2141
2170
  } });
2142
2171
  } })
2143
2172
  }), e.push({
2144
2173
  id: "debug",
2145
2174
  label: "Debug",
2146
- icon: () => qi(),
2147
- content: () => t.debugContent ?? N(Vi, { get data() {
2175
+ icon: () => $i(),
2176
+ content: () => t.debugContent ?? M(qi, { get data() {
2148
2177
  return t.debugData;
2149
2178
  } })
2150
2179
  }), e;
2151
- }, v = A(W), y = rn(v);
2152
- E(() => y?.setHasSheet(t.sheet !== void 0)), k(() => y?.setHasSheet(!1));
2153
- let b = () => ({
2154
- icon: t.tile?.icon ?? y?.icon(),
2155
- tone: t.tile?.tone ?? y?.accent() ?? y?.tone(),
2180
+ }, _ = k(U), v = un(_);
2181
+ T(() => v?.setHasSheet(t.sheet !== void 0)), O(() => v?.setHasSheet(!1));
2182
+ let y = () => ({
2183
+ icon: t.tile?.icon ?? v?.icon(),
2184
+ tone: t.tile?.tone ?? v?.accent() ?? v?.tone(),
2156
2185
  backdrop: t.tile?.backdrop
2157
- }), x = () => v?.developer?.() ?? !1, S = () => V() === "controls" && t.sheet !== void 0, ee = na(), te = () => v?.anchor?.(), ne = () => S() && !ee() && te() !== void 0, re = xr(), ie = () => {
2186
+ }), b = () => _?.developer?.() ?? !1, x = () => B() === "controls" && t.sheet !== void 0, te = ca(), S = () => _?.anchor?.(), ne = () => x() && !te() && S() !== void 0, re = Or(), ie = () => {
2158
2187
  if (t.debugData === void 0) return;
2159
2188
  let e = typeof t.debugData == "string" ? t.debugData : JSON.stringify(t.debugData, null, 2);
2160
2189
  re.copy(e);
2161
- }, ae = t.ResponsiveDialog, oe = t.ResponsiveDialogContent, se = t.ResponsiveDialogHeader, ce = t.ResponsiveDialogTitle, le = t.ResponsiveDialogDescription, ue = t.ResponsiveDialogBody ?? Qe, de = t.ResponsiveDialogFooter ?? rt, fe = t.Tabs ?? xt, pe = t.TabsList ?? Tt, T = t.TabsTrigger ?? Dt, me = t.TabsContent ?? Ct, ge = t.Button, j = D(he([
2190
+ }, ae = t.ResponsiveDialog, oe = t.ResponsiveDialogContent, se = t.ResponsiveDialogHeader, ce = t.ResponsiveDialogTitle, le = t.ResponsiveDialogDescription, ue = t.ResponsiveDialogBody ?? rt, de = t.ResponsiveDialogFooter ?? ct, fe = t.Tabs ?? Et, pe = t.TabsList ?? At, me = t.TabsTrigger ?? Mt, he = t.TabsContent ?? Ot, _e = t.Button, A = E(ge([
2162
2191
  () => t.open,
2163
2192
  a,
2164
2193
  () => t.config,
2165
2194
  () => t.tabs
2166
- ], () => _())), M = (e) => n() ? u(e) : t.onOpenChange(e), ve = () => n() ? l() : t.hasUnsavedChanges, R = () => n() ? d : t.onSave, z = () => j().filter((e) => e.id !== "debug" || x()), B = () => z().filter((e) => e.id !== "controls" || t.sheet === void 0), V = () => {
2167
- let e = z(), n = m() === "controls" && t.sheet === void 0 && !("controlsContent" in t) && !t.tabs ? "edit" : m();
2195
+ ], () => g())), j = (e) => n() ? u(e) : t.onOpenChange(e), ye = () => n() ? l() : t.hasUnsavedChanges, L = () => n() ? d : t.onSave, R = () => A().filter((e) => e.id !== "debug" || b()), z = () => R().filter((e) => e.id !== "controls" || t.sheet === void 0), B = () => {
2196
+ let e = R(), n = m() === "controls" && t.sheet === void 0 && !("controlsContent" in t) && !t.tabs ? "edit" : m();
2168
2197
  return e.some((e) => e.id === n) ? n : e[0]?.id ?? n;
2169
- }, ye = () => V() === "edit" && (R() || t.onDelete) || V() === "debug" && t.debugData !== void 0;
2170
- return N(ae, {
2198
+ }, be = () => B() === "edit" && (L() || t.onDelete) || B() === "debug" && t.debugData !== void 0;
2199
+ return M(ae, {
2171
2200
  get open() {
2172
2201
  return t.open;
2173
2202
  },
2174
- onOpenChange: (e) => M(e),
2203
+ onOpenChange: (e) => j(e),
2175
2204
  get children() {
2176
- return N(w, {
2205
+ return M(w, {
2177
2206
  get when() {
2178
- return !S();
2207
+ return !x();
2179
2208
  },
2180
2209
  get fallback() {
2181
- return N(oe, {
2210
+ return M(oe, {
2182
2211
  size: "sm",
2183
2212
  get ariaLabel() {
2184
2213
  return t.title;
2185
2214
  },
2186
2215
  get anchor() {
2187
- return I(() => !!ne())() ? te() : void 0;
2216
+ return F(() => !!ne())() ? S() : void 0;
2188
2217
  },
2189
2218
  class: "glasshome-sheet-surface",
2190
2219
  get style() {
2191
- return I(() => !!b().tone)() ? {
2192
- "--glass-tone": b().tone,
2193
- "--widget-color": b().tone
2220
+ return F(() => !!y().tone)() ? {
2221
+ "--glass-tone": y().tone,
2222
+ "--widget-color": y().tone
2194
2223
  } : void 0;
2195
2224
  },
2196
2225
  get children() {
2197
2226
  return [
2198
- N(w, {
2227
+ M(w, {
2199
2228
  get when() {
2200
- return b().backdrop;
2229
+ return y().backdrop;
2201
2230
  },
2202
2231
  children: (e) => (() => {
2203
- var t = Yi(), n = t.firstChild;
2204
- return P(() => L(n, "src", e())), t;
2232
+ var t = ta(), n = t.firstChild;
2233
+ return N(() => I(n, "src", e())), t;
2205
2234
  })()
2206
2235
  }),
2207
- N(se, {
2236
+ M(se, {
2208
2237
  class: "items-center",
2209
2238
  get media() {
2210
- return N(w, {
2239
+ return M(w, {
2211
2240
  get when() {
2212
- return b().icon;
2241
+ return y().icon;
2213
2242
  },
2214
2243
  children: (e) => (() => {
2215
- var t = Xi();
2216
- return F(t, N(U, {
2244
+ var t = na();
2245
+ return P(t, M(H, {
2217
2246
  get icon() {
2218
2247
  return e();
2219
2248
  },
@@ -2223,7 +2252,7 @@ function ta(e) {
2223
2252
  });
2224
2253
  },
2225
2254
  get children() {
2226
- return N(ce, {
2255
+ return M(ce, {
2227
2256
  class: "truncate",
2228
2257
  get children() {
2229
2258
  return t.title;
@@ -2231,87 +2260,87 @@ function ta(e) {
2231
2260
  });
2232
2261
  }
2233
2262
  }),
2234
- N(ue, { get children() {
2235
- var e = Ji();
2236
- return F(e, () => t.sheet?.()), e;
2263
+ M(ue, { get children() {
2264
+ var e = ea();
2265
+ return P(e, () => t.sheet?.()), e;
2237
2266
  } })
2238
2267
  ];
2239
2268
  }
2240
2269
  });
2241
2270
  },
2242
2271
  get children() {
2243
- return N(oe, {
2272
+ return M(oe, {
2244
2273
  get size() {
2245
- return g();
2274
+ return ee();
2246
2275
  },
2247
2276
  get class() {
2248
2277
  return t.class;
2249
2278
  },
2250
2279
  get children() {
2251
- return N(fe, {
2280
+ return M(fe, {
2252
2281
  get value() {
2253
- return V();
2282
+ return B();
2254
2283
  },
2255
2284
  onChange: h,
2256
2285
  layout: "split",
2257
2286
  get children() {
2258
2287
  return [
2259
- N(se, {
2288
+ M(se, {
2260
2289
  class: "flex-wrap",
2261
2290
  get action() {
2262
- return [N(w, {
2291
+ return [M(w, {
2263
2292
  get when() {
2264
- return x() || t.tabs !== void 0;
2293
+ return b() || t.tabs !== void 0;
2265
2294
  },
2266
2295
  get children() {
2267
- return N(pe, {
2296
+ return M(pe, {
2268
2297
  class: "w-auto",
2269
2298
  get children() {
2270
- return N(C, {
2299
+ return M(C, {
2271
2300
  get each() {
2272
- return B();
2301
+ return z();
2273
2302
  },
2274
- children: (e) => N(T, {
2303
+ children: (e) => M(me, {
2275
2304
  get value() {
2276
2305
  return e.id;
2277
2306
  },
2278
2307
  get children() {
2279
2308
  return [(() => {
2280
- var t = Zi();
2281
- return F(t, () => e.icon()), t;
2282
- })(), I(() => e.label)];
2309
+ var t = ra();
2310
+ return P(t, () => e.icon()), t;
2311
+ })(), F(() => e.label)];
2283
2312
  }
2284
2313
  })
2285
2314
  });
2286
2315
  }
2287
2316
  });
2288
2317
  }
2289
- }), I(() => t.headerActions)];
2318
+ }), F(() => t.headerActions)];
2290
2319
  },
2291
2320
  get children() {
2292
- return [N(ce, {
2321
+ return [M(ce, {
2293
2322
  class: "truncate",
2294
2323
  get children() {
2295
2324
  return t.title;
2296
2325
  }
2297
- }), N(w, {
2326
+ }), M(w, {
2298
2327
  get when() {
2299
2328
  return t.description;
2300
2329
  },
2301
2330
  get children() {
2302
- return N(le, { get children() {
2331
+ return M(le, { get children() {
2303
2332
  return t.description;
2304
2333
  } });
2305
2334
  }
2306
2335
  })];
2307
2336
  }
2308
2337
  }),
2309
- N(ue, { get children() {
2310
- return N(C, {
2338
+ M(ue, { get children() {
2339
+ return M(C, {
2311
2340
  get each() {
2312
- return z();
2341
+ return R();
2313
2342
  },
2314
- children: (e) => N(me, {
2343
+ children: (e) => M(he, {
2315
2344
  get value() {
2316
2345
  return e.id;
2317
2346
  },
@@ -2321,19 +2350,19 @@ function ta(e) {
2321
2350
  })
2322
2351
  });
2323
2352
  } }),
2324
- N(w, {
2353
+ M(w, {
2325
2354
  get when() {
2326
- return ye();
2355
+ return be();
2327
2356
  },
2328
2357
  get children() {
2329
- return N(de, { get children() {
2358
+ return M(de, { get children() {
2330
2359
  return [
2331
- N(w, {
2360
+ M(w, {
2332
2361
  get when() {
2333
- return I(() => V() === "edit")() && t.onDelete;
2362
+ return F(() => B() === "edit")() && t.onDelete;
2334
2363
  },
2335
2364
  get children() {
2336
- return N(ge, {
2365
+ return M(_e, {
2337
2366
  size: "sm",
2338
2367
  variant: "destructive",
2339
2368
  onClick: () => t.onDelete?.(),
@@ -2341,32 +2370,32 @@ function ta(e) {
2341
2370
  });
2342
2371
  }
2343
2372
  }),
2344
- N(w, {
2373
+ M(w, {
2345
2374
  get when() {
2346
- return I(() => V() === "edit")() && R();
2375
+ return F(() => B() === "edit")() && L();
2347
2376
  },
2348
2377
  get children() {
2349
- return N(ge, {
2378
+ return M(_e, {
2350
2379
  size: "sm",
2351
2380
  get disabled() {
2352
- return !ve();
2381
+ return !ye();
2353
2382
  },
2354
- onClick: () => R()?.(),
2383
+ onClick: () => L()?.(),
2355
2384
  children: "Save"
2356
2385
  });
2357
2386
  }
2358
2387
  }),
2359
- N(w, {
2388
+ M(w, {
2360
2389
  get when() {
2361
- return I(() => V() === "debug")() && t.debugData !== void 0;
2390
+ return F(() => B() === "debug")() && t.debugData !== void 0;
2362
2391
  },
2363
2392
  get children() {
2364
- return N(ge, {
2393
+ return M(_e, {
2365
2394
  size: "sm",
2366
2395
  variant: "outline",
2367
2396
  onClick: ie,
2368
2397
  get children() {
2369
- return ea[re.state()];
2398
+ return oa[re.state()];
2370
2399
  }
2371
2400
  });
2372
2401
  }
@@ -2385,81 +2414,450 @@ function ta(e) {
2385
2414
  }
2386
2415
  });
2387
2416
  }
2388
- function na() {
2389
- let e = "(max-width: 639px)", [t, n] = O(typeof window < "u" && window.matchMedia(e).matches);
2390
- return ge(() => {
2417
+ function ca() {
2418
+ let e = "(max-width: 639px)", [t, n] = D(typeof window < "u" && window.matchMedia(e).matches);
2419
+ return _e(() => {
2391
2420
  let t = window.matchMedia(e), r = () => n(t.matches);
2392
- t.addEventListener("change", r), k(() => t.removeEventListener("change", r));
2421
+ t.addEventListener("change", r), O(() => t.removeEventListener("change", r));
2393
2422
  }), t;
2394
2423
  }
2395
2424
  //#endregion
2396
2425
  //#region src/framework/hooks/use-widget-dashboard.ts
2397
- var ra = {
2426
+ var la = {
2398
2427
  name: "",
2399
2428
  icon: "",
2400
2429
  areaId: null
2401
2430
  };
2402
- function ia() {
2403
- let e = A(W);
2404
- return () => e?.dashboard?.() ?? ra;
2431
+ function ua() {
2432
+ let e = k(U);
2433
+ return () => e?.dashboard?.() ?? la;
2405
2434
  }
2406
2435
  //#endregion
2407
2436
  //#region src/framework/hooks/use-widget-viewer.ts
2408
- var aa = { name: null };
2409
- function oa() {
2410
- let e = A(W);
2411
- return () => e?.viewer?.() ?? aa;
2437
+ var da = { name: null };
2438
+ function fa() {
2439
+ let e = k(U);
2440
+ return () => e?.viewer?.() ?? da;
2441
+ }
2442
+ //#endregion
2443
+ //#region node_modules/@glasshome/ui/dist/tokens/index.js
2444
+ var pa = /^oklch\(\s*([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s*\)$/i;
2445
+ function ma(e, t, n) {
2446
+ return Math.min(Math.max(e, t), n);
2447
+ }
2448
+ function ha(e) {
2449
+ return String(Number.isInteger(e) ? e : Number(e.toFixed(6)));
2450
+ }
2451
+ function ga(e) {
2452
+ let t = pa.exec(e.trim());
2453
+ return t ? {
2454
+ l: Number(t[1]),
2455
+ c: Number(t[2]),
2456
+ h: Number(t[3])
2457
+ } : null;
2458
+ }
2459
+ function _a(e, t, n) {
2460
+ return `oklch(${ha(e)} ${ha(t)} ${ha(n)})`;
2461
+ }
2462
+ function va(e, t) {
2463
+ let n = ga(e);
2464
+ return n ? _a(ma(n.l + t, 0, 1), n.c, n.h) : e;
2465
+ }
2466
+ function ya(e, t) {
2467
+ let n = ga(e);
2468
+ return n ? _a(ma(t, 0, 1), ma(n.c * .8, 0, .4), n.h) : e;
2469
+ }
2470
+ function ba(e, t) {
2471
+ return {
2472
+ ...e,
2473
+ popover: e.card,
2474
+ muted: t === "light" ? va(e.background, -.015) : va(e.background, .1),
2475
+ mutedForeground: t === "light" ? "oklch(0.44 0 0)" : "oklch(0.71 0 0)",
2476
+ input: t === "light" ? va(e.border, .01) : va(e.border, .04),
2477
+ ring: e.accent,
2478
+ destructive: t === "light" ? "oklch(0.54 0.19 23.0704)" : "oklch(0.7106 0.1661 22.2162)"
2479
+ };
2480
+ }
2481
+ function xa(e) {
2482
+ return ba({
2483
+ primary: va(e.primary, .15),
2484
+ accent: va(e.accent, .1),
2485
+ secondary: ya(e.secondary, .14),
2486
+ border: ya(e.border, .26),
2487
+ card: ya(e.card, .17),
2488
+ background: ya(e.background, .12)
2489
+ }, "dark");
2490
+ }
2491
+ var Sa = {
2492
+ edgeWidth: 1,
2493
+ edgeInk: 0,
2494
+ edgeAccent: 0,
2495
+ inkLift: 0
2496
+ }, Ca = {
2497
+ frosted: {
2498
+ blur: 24,
2499
+ clarity: 60,
2500
+ depth: 1,
2501
+ tint: 1,
2502
+ glow: 0,
2503
+ ink: 0,
2504
+ ...Sa
2505
+ },
2506
+ frost: {
2507
+ blur: 24,
2508
+ clarity: 60,
2509
+ depth: 1,
2510
+ tint: 1,
2511
+ glow: 0,
2512
+ ink: 0,
2513
+ ...Sa,
2514
+ grain: .4
2515
+ },
2516
+ paper: {
2517
+ blur: 0,
2518
+ clarity: 100,
2519
+ depth: .5,
2520
+ tint: .85,
2521
+ glow: 0,
2522
+ ink: 0,
2523
+ ...Sa,
2524
+ edgeInk: .3,
2525
+ sheen: 0,
2526
+ edge: .2,
2527
+ shadow: .7
2528
+ },
2529
+ neon: {
2530
+ blur: 9,
2531
+ clarity: 57,
2532
+ depth: .4,
2533
+ tint: .6,
2534
+ edgeWidth: 1,
2535
+ edgeInk: 0,
2536
+ edgeAccent: .35,
2537
+ inkLift: 0,
2538
+ glow: 3,
2539
+ ink: 0,
2540
+ vibrancy: 1.3,
2541
+ edge: .25,
2542
+ sheen: .3,
2543
+ shadow: 1,
2544
+ innerGlow: .35
2545
+ },
2546
+ chalk: {
2547
+ blur: 0,
2548
+ clarity: 100,
2549
+ depth: .3,
2550
+ tint: .7,
2551
+ glow: 0,
2552
+ ink: 1,
2553
+ ...Sa,
2554
+ inkLift: 1
2555
+ }
2556
+ }, wa = {
2557
+ v: 1,
2558
+ preset: "frosted"
2559
+ }, Ta = {
2560
+ blur: [0, 48],
2561
+ clarity: [0, 100],
2562
+ depth: [0, 2],
2563
+ tint: [0, 2],
2564
+ glow: [0, 40],
2565
+ ink: [0, 1],
2566
+ vibrancy: [.5, 2],
2567
+ edge: [0, 2],
2568
+ sheen: [0, 2],
2569
+ shadow: [0, 2],
2570
+ inset: [0, 1],
2571
+ lightFrom: [0, 360],
2572
+ darkScale: [0, 1],
2573
+ innerGlow: [0, 1],
2574
+ innerGlowHue: [0, 1],
2575
+ grain: [0, 1],
2576
+ washAngle: [0, 360],
2577
+ relief: [0, 2],
2578
+ fill: [0, .6]
2579
+ }, Ea = {
2580
+ vibrancy: 1,
2581
+ inset: 0,
2582
+ lightFrom: 315,
2583
+ rim: "top",
2584
+ darkScale: 1,
2585
+ glowAt: "outside",
2586
+ innerGlow: 0,
2587
+ innerGlowHue: 1,
2588
+ grain: 0,
2589
+ washStyle: "fade",
2590
+ washAngle: 135,
2591
+ face: "flat",
2592
+ relief: 1,
2593
+ accent: "theme",
2594
+ fill: 0
2595
+ }, Da = Object.keys(Ta);
2596
+ function Oa(e) {
2597
+ let { edgeWidth: t, edgeInk: n, edgeAccent: r, inkLift: i, ...a } = Ca[e.preset], o = {
2598
+ ...Ea,
2599
+ ...a,
2600
+ ...e.dials
2601
+ }, s = {
2602
+ ...o,
2603
+ edge: o.edge ?? o.depth,
2604
+ sheen: o.sheen ?? o.depth,
2605
+ shadow: o.shadow ?? o.depth
2606
+ };
2607
+ for (let e of Da) s[e] = ma(s[e], ...Ta[e]);
2608
+ return s;
2609
+ }
2610
+ function Z(e, t) {
2611
+ let n = e === "default" ? "solid" : "static", r = t?.night ? {
2612
+ type: "static",
2613
+ id: t.night
2614
+ } : void 0, { url: i, overlay: a, blur: o, vignette: s } = t ?? {};
2615
+ return {
2616
+ type: n,
2617
+ id: e,
2618
+ themed: t?.themed ?? !0,
2619
+ url: i,
2620
+ dark: r,
2621
+ overlay: a,
2622
+ blur: o,
2623
+ vignette: s
2624
+ };
2625
+ }
2626
+ function Q(e, t, n, r, i, a, o, s) {
2627
+ return {
2628
+ id: e,
2629
+ name: t,
2630
+ radius: n,
2631
+ swatch: r,
2632
+ material: s,
2633
+ colors: {
2634
+ light: ba(i, "light"),
2635
+ dark: o ? ba(o, "dark") : xa(i)
2636
+ },
2637
+ background: a
2638
+ };
2639
+ }
2640
+ Z("glass-house", {
2641
+ url: "/backgrounds/glass-house.webp",
2642
+ themed: !1,
2643
+ night: "glass-house-night",
2644
+ vignette: .65,
2645
+ blur: 4
2646
+ }), Q("sunrise-studio", "Sunrise Studio", 1.1, ["#e8590c", "#f7e3c6"], {
2647
+ primary: "oklch(0.56 0.13 48)",
2648
+ accent: "oklch(0.54 0.11 35)",
2649
+ secondary: "oklch(0.93 0.02 70)",
2650
+ border: "oklch(0.84 0.025 65)",
2651
+ card: "oklch(0.99 0.008 75)",
2652
+ background: "oklch(0.945 0.02 72)"
2653
+ }, Z("studio-geometric", {
2654
+ url: "/backgrounds/studio-geometric.svg",
2655
+ night: "studio-night"
2656
+ }), {
2657
+ primary: "oklch(0.78 0.11 62)",
2658
+ accent: "oklch(0.72 0.1 42)",
2659
+ secondary: "oklch(0.3 0.025 55)",
2660
+ border: "oklch(0.4 0.03 55)",
2661
+ card: "oklch(0.27 0.025 55)",
2662
+ background: "oklch(0.17 0.022 55)"
2663
+ }, {
2664
+ v: 1,
2665
+ preset: "paper"
2666
+ }), Q("forest-zen", "Forest Zen", 1.6, ["#2b8a3e", "#a9c7b0"], {
2667
+ primary: "oklch(0.5 0.12 150)",
2668
+ accent: "oklch(0.5 0.09 170)",
2669
+ secondary: "oklch(0.92 0.025 150)",
2670
+ border: "oklch(0.83 0.02 155)",
2671
+ card: "oklch(0.99 0.008 150)",
2672
+ background: "oklch(0.945 0.015 160)"
2673
+ }, Z("forest-mist", {
2674
+ url: "/backgrounds/forest-mist.webp",
2675
+ themed: !1,
2676
+ night: "forest-mist-night",
2677
+ vignette: .65
2678
+ }), {
2679
+ primary: "oklch(0.74 0.12 150)",
2680
+ accent: "oklch(0.72 0.08 175)",
2681
+ secondary: "oklch(0.24 0.025 160)",
2682
+ border: "oklch(0.33 0.025 160)",
2683
+ card: "oklch(0.25 0.02 160)",
2684
+ background: "oklch(0.15 0.02 165)"
2685
+ }, {
2686
+ v: 1,
2687
+ preset: "frosted",
2688
+ dials: { clarity: 82 }
2689
+ }), Q("lavender-dreams", "Lavender Dreams", 1.8, ["#845ef7", "#fff4e6"], {
2690
+ primary: "oklch(0.5 0.14 305)",
2691
+ accent: "oklch(0.52 0.12 325)",
2692
+ secondary: "oklch(0.93 0.025 300)",
2693
+ border: "oklch(0.85 0.025 300)",
2694
+ card: "oklch(0.975 0.012 90)",
2695
+ background: "oklch(0.97 0.015 85)"
2696
+ }, Z("lavender-ink"), {
2697
+ primary: "oklch(0.76 0.12 305)",
2698
+ accent: "oklch(0.76 0.1 325)",
2699
+ secondary: "oklch(0.26 0.04 310)",
2700
+ border: "oklch(0.36 0.045 310)",
2701
+ card: "oklch(0.23 0.045 312)",
2702
+ background: "oklch(0.18 0.045 315)"
2703
+ }, {
2704
+ v: 1,
2705
+ preset: "paper",
2706
+ dials: { ink: 1 }
2707
+ }), Q("coral-reef", "Liquid Glass", .9, ["#0e1426", "#5fd4e8"], {
2708
+ primary: "oklch(0.5 0.11 225)",
2709
+ accent: "oklch(0.52 0.16 345)",
2710
+ secondary: "oklch(0.93 0.008 260)",
2711
+ border: "oklch(0.85 0.012 260)",
2712
+ card: "oklch(0.99 0.004 260)",
2713
+ background: "oklch(0.94 0.008 260)"
2714
+ }, Z("liquid-glass-day", {
2715
+ url: "/backgrounds/liquid-glass-day.webp",
2716
+ themed: !1,
2717
+ night: "liquid-glass"
2718
+ }), {
2719
+ primary: "oklch(0.78 0.11 210)",
2720
+ accent: "oklch(0.72 0.16 340)",
2721
+ secondary: "oklch(0.25 0.03 265)",
2722
+ border: "oklch(0.36 0.035 265)",
2723
+ card: "oklch(0.24 0.03 265)",
2724
+ background: "oklch(0.13 0.03 268)"
2725
+ }, {
2726
+ v: 1,
2727
+ preset: "frosted"
2728
+ }), Q("monochrome-pro", "Monochrome Pro", 0, ["#e9ecef", "#343a40"], {
2729
+ primary: "oklch(0.32 0.01 260)",
2730
+ accent: "oklch(0.4 0.01 260)",
2731
+ secondary: "oklch(0.93 0.004 260)",
2732
+ border: "oklch(0.8 0.004 260)",
2733
+ card: "oklch(0.99 0.002 260)",
2734
+ background: "oklch(0.955 0.003 260)"
2735
+ }, Z("monochrome-blocks", {
2736
+ url: "/backgrounds/monochrome-blocks.svg",
2737
+ night: "monochrome-night"
2738
+ }), {
2739
+ primary: "oklch(0.9 0.005 260)",
2740
+ accent: "oklch(0.82 0.005 260)",
2741
+ secondary: "oklch(0.24 0.004 260)",
2742
+ border: "oklch(0.36 0.004 260)",
2743
+ card: "oklch(0.2 0.003 260)",
2744
+ background: "oklch(0.14 0.003 260)"
2745
+ }, {
2746
+ v: 1,
2747
+ preset: "paper"
2748
+ }), Q("ocean-breeze", "Tide", 1.5, ["#2b4a8b", "#efe6d2"], {
2749
+ primary: "oklch(0.42 0.12 262)",
2750
+ accent: "oklch(0.48 0.09 225)",
2751
+ secondary: "oklch(0.93 0.015 85)",
2752
+ border: "oklch(0.84 0.02 80)",
2753
+ card: "oklch(0.975 0.012 85)",
2754
+ background: "oklch(0.955 0.018 85)"
2755
+ }, Z("tide-waves"), {
2756
+ primary: "oklch(0.78 0.09 235)",
2757
+ accent: "oklch(0.76 0.08 205)",
2758
+ secondary: "oklch(0.26 0.04 262)",
2759
+ border: "oklch(0.36 0.045 262)",
2760
+ card: "oklch(0.23 0.045 262)",
2761
+ background: "oklch(0.18 0.05 262)"
2762
+ }, {
2763
+ v: 1,
2764
+ preset: "paper"
2765
+ }), Q("chalkboard", "Chalkboard", 1.2, ["#2f4a40", "#f2e6a0"], {
2766
+ primary: "oklch(0.48 0.13 255)",
2767
+ accent: "oklch(0.5 0.1 165)",
2768
+ secondary: "oklch(0.9 0.012 165)",
2769
+ border: "oklch(0.8 0.015 165)",
2770
+ card: "oklch(0.965 0.006 165)",
2771
+ background: "oklch(0.93 0.012 165)"
2772
+ }, Z("chalkboard"), {
2773
+ primary: "oklch(0.88 0.12 95)",
2774
+ accent: "oklch(0.8 0.09 220)",
2775
+ secondary: "oklch(0.29 0.025 165)",
2776
+ border: "oklch(0.43 0.02 165)",
2777
+ card: "oklch(0.28 0.028 165)",
2778
+ background: "oklch(0.22 0.03 165)"
2779
+ }, {
2780
+ v: 1,
2781
+ preset: "chalk"
2782
+ }), Q("retrowave", "Retrowave", 1.2, ["#ff2bd6", "#35e0ff"], {
2783
+ primary: "oklch(0.58 0.24 345)",
2784
+ accent: "oklch(0.6 0.14 215)",
2785
+ secondary: "oklch(0.93 0.03 320)",
2786
+ border: "oklch(0.84 0.04 320)",
2787
+ card: "oklch(0.96 0.02 320)",
2788
+ background: "oklch(0.98 0.015 320)"
2789
+ }, Z("sunset-grid", { url: "/backgrounds/sunset-grid.svg" }), {
2790
+ primary: "oklch(0.68 0.27 345)",
2791
+ accent: "oklch(0.8 0.14 205)",
2792
+ secondary: "oklch(0.2 0.06 290)",
2793
+ border: "oklch(0.34 0.1 300)",
2794
+ card: "oklch(0.19 0.07 290)",
2795
+ background: "oklch(0.13 0.06 285)"
2796
+ }, {
2797
+ v: 1,
2798
+ preset: "neon",
2799
+ dials: { glow: 14 }
2800
+ });
2801
+ //#endregion
2802
+ //#region src/framework/hooks/use-material.ts
2803
+ var ka = {
2804
+ id: wa.preset,
2805
+ terms: Oa(wa)
2806
+ };
2807
+ function Aa() {
2808
+ let e = k(U);
2809
+ return () => e?.material?.() ?? ka;
2412
2810
  }
2413
2811
  //#endregion
2414
2812
  //#region src/framework/hooks/use-intersection-pause.ts
2415
- function sa(e) {
2813
+ function ja(e) {
2416
2814
  if (typeof IntersectionObserver > "u") return () => !1;
2417
- let [t, n] = O(!1), r = new IntersectionObserver((e) => {
2815
+ let [t, n] = D(!1), r = new IntersectionObserver((e) => {
2418
2816
  let t = e[0];
2419
2817
  t && n(!t.isIntersecting);
2420
2818
  });
2421
- return E(() => {
2819
+ return T(() => {
2422
2820
  let t = e();
2423
2821
  r.disconnect(), t && r.observe(t);
2424
- }), k(() => r.disconnect()), t;
2822
+ }), O(() => r.disconnect()), t;
2425
2823
  }
2426
2824
  //#endregion
2427
2825
  //#region src/framework/hooks/use-daylight.ts
2428
- var ca = -6, la = 864e5;
2429
- function ua(e, t) {
2826
+ var Ma = -6, Na = 864e5;
2827
+ function Pa(e, t) {
2430
2828
  let n = e.next_rising ? Date.parse(e.next_rising) : NaN, r = e.next_setting ? Date.parse(e.next_setting) : NaN;
2431
2829
  if (!Number.isFinite(n) || !Number.isFinite(r)) return;
2432
- let [i, a] = e.state === "above_horizon" ? [n - la, r] : [r - la, n], o = a - i;
2830
+ let [i, a] = e.state === "above_horizon" ? [n - Na, r] : [r - Na, n], o = a - i;
2433
2831
  if (!(o <= 0)) return Math.min(1, Math.max(0, (t.getTime() - i) / o));
2434
2832
  }
2435
- var da = 20, fa = 7;
2436
- function pa(e, t) {
2833
+ var Fa = 20, Ia = 7;
2834
+ function La(e, t) {
2437
2835
  if (e && (e.state === "above_horizon" || e.state === "below_horizon")) {
2438
- let n = e.elevation, r = e.state === "above_horizon" ? "day" : n !== void 0 && n > ca ? e.rising ? "dawn" : "dusk" : "night";
2836
+ let n = e.elevation, r = e.state === "above_horizon" ? "day" : n !== void 0 && n > Ma ? e.rising ? "dawn" : "dusk" : "night";
2439
2837
  return {
2440
2838
  phase: r,
2441
2839
  isNight: r === "night",
2442
2840
  elevation: n,
2443
- progress: ua(e, t)
2841
+ progress: Pa(e, t)
2444
2842
  };
2445
2843
  }
2446
- let n = t.getHours(), r = n >= da || n < fa ? "night" : "day";
2844
+ let n = t.getHours(), r = n >= Fa || n < Ia ? "night" : "day";
2447
2845
  return {
2448
2846
  phase: r,
2449
2847
  isNight: r === "night"
2450
2848
  };
2451
2849
  }
2452
- var [ma, ha] = O(/* @__PURE__ */ new Date()), ga = 0, _a;
2453
- function va() {
2454
- return ga++, _a ||= (ha(/* @__PURE__ */ new Date()), setInterval(() => ha(/* @__PURE__ */ new Date()), 6e4)), () => {
2455
- ga--, ga === 0 && _a && (clearInterval(_a), _a = void 0);
2850
+ var [Ra, za] = D(/* @__PURE__ */ new Date()), Ba = 0, Va;
2851
+ function Ha() {
2852
+ return Ba++, Va ||= (za(/* @__PURE__ */ new Date()), setInterval(() => za(/* @__PURE__ */ new Date()), 6e4)), () => {
2853
+ Ba--, Ba === 0 && Va && (clearInterval(Va), Va = void 0);
2456
2854
  };
2457
2855
  }
2458
- function ya() {
2459
- let e = te("sun.sun");
2460
- return E(() => {
2461
- e() || k(va());
2462
- }), D(() => {
2856
+ function Ua() {
2857
+ let e = S("sun.sun");
2858
+ return T(() => {
2859
+ e() || O(Ha());
2860
+ }), E(() => {
2463
2861
  let t = e(), n = t ? {
2464
2862
  state: t.state,
2465
2863
  elevation: t.attributes?.elevation,
@@ -2467,27 +2865,27 @@ function ya() {
2467
2865
  next_rising: t.attributes?.next_rising,
2468
2866
  next_setting: t.attributes?.next_setting
2469
2867
  } : void 0;
2470
- return pa(n, n ? /* @__PURE__ */ new Date() : ma());
2868
+ return La(n, n ? /* @__PURE__ */ new Date() : Ra());
2471
2869
  });
2472
2870
  }
2473
2871
  //#endregion
2474
2872
  //#region src/framework/hooks/use-reduced-motion.ts
2475
- function ba() {
2873
+ function Wa() {
2476
2874
  if (typeof window > "u" || typeof window.matchMedia != "function") return () => !1;
2477
- let e = window.matchMedia("(prefers-reduced-motion: reduce)"), [t, n] = O(e.matches), r = (e) => n(e.matches);
2478
- return e.addEventListener("change", r), k(() => e.removeEventListener("change", r)), t;
2875
+ let e = window.matchMedia("(prefers-reduced-motion: reduce)"), [t, n] = D(e.matches), r = (e) => n(e.matches);
2876
+ return e.addEventListener("change", r), O(() => e.removeEventListener("change", r)), t;
2479
2877
  }
2480
2878
  //#endregion
2481
2879
  //#region src/framework/hooks/use-widget-entity-group.ts
2482
- function xa(e) {
2483
- 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(() => {
2880
+ function Ga(e) {
2881
+ let t = e.minEntities ?? 1, n = E(() => e.entities().length), r = E(() => n() >= t), i = E(() => !r() || !e.calculateGroupData ? null : e.calculateGroupData(e.entities())), a = E(() => {
2484
2882
  if (!r()) return;
2485
2883
  let t = e.aggregationMode?.();
2486
2884
  if (!t || t === "none") return;
2487
2885
  let n = e.entities();
2488
- if (t === "light" || t === "binary-sensor" || t === "switch") return Sr(n, e.allEntitiesMode);
2489
- if (t === "sensor") return Cr(n, e.sensorGroupType?.() ?? "mean", !0);
2490
- }), o = D(() => r() ? void 0 : e.emptyStateConfig);
2886
+ if (t === "light" || t === "binary-sensor" || t === "switch") return kr(n, e.allEntitiesMode);
2887
+ if (t === "sensor") return Ar(n, e.sensorGroupType?.() ?? "mean", !0);
2888
+ }), o = E(() => r() ? void 0 : e.emptyStateConfig);
2491
2889
  return {
2492
2890
  entities: e.entities,
2493
2891
  groupData: i,
@@ -2499,7 +2897,7 @@ function xa(e) {
2499
2897
  }
2500
2898
  //#endregion
2501
2899
  //#region src/framework/theming/svg-colors.ts
2502
- var Sa = {
2900
+ var Ka = {
2503
2901
  solar: "oklch(0.74 0.18 60)",
2504
2902
  grid: "oklch(0.62 0.12 245)",
2505
2903
  battery: "oklch(0.70 0.18 145)",
@@ -2508,21 +2906,21 @@ var Sa = {
2508
2906
  positive: "oklch(0.70 0.14 160)",
2509
2907
  negative: "oklch(0.64 0.22 27)"
2510
2908
  };
2511
- function Ca(e) {
2909
+ function qa(e) {
2512
2910
  return {
2513
2911
  fill: `color-mix(in oklch, ${e} 20%, transparent)`,
2514
2912
  stroke: e,
2515
2913
  solid: e
2516
2914
  };
2517
2915
  }
2518
- var wa = Object.fromEntries(Object.entries(Sa).map(([e, t]) => [e, Ca(t)])), Ta = o.enum([
2916
+ var Ja = Object.fromEntries(Object.entries(Ka).map(([e, t]) => [e, qa(t)])), Ya = o.enum([
2519
2917
  "success",
2520
2918
  "warning",
2521
2919
  "danger",
2522
2920
  "info",
2523
2921
  "neutral",
2524
2922
  "accent"
2525
- ]), Ea = {
2923
+ ]), Xa = {
2526
2924
  title: e(() => o.string().optional().meta({
2527
2925
  title: "Title",
2528
2926
  description: "Optional display name override"
@@ -2542,38 +2940,38 @@ var wa = Object.fromEntries(Object.entries(Sa).map(([e, t]) => [e, Ca(t)])), Ta
2542
2940
  formType: "area-picker",
2543
2941
  title: "Area"
2544
2942
  }), "widgetFields.areaId")
2545
- }, Da = 24;
2943
+ }, Za = 24;
2546
2944
  function $(e) {
2547
2945
  let t = {};
2548
2946
  for (let [n, r] of Object.entries(e)) r !== void 0 && (t[n] = r);
2549
2947
  return t;
2550
2948
  }
2551
- function Oa() {
2949
+ function Qa() {
2552
2950
  return o.string().optional().meta({
2553
2951
  title: "Title",
2554
2952
  description: "Optional display name override"
2555
2953
  });
2556
2954
  }
2557
- function ka(e) {
2955
+ function $a(e) {
2558
2956
  return (e.default === void 0 ? o.string().optional() : o.string().default(e.default)).meta($({
2559
2957
  title: e.title,
2560
2958
  description: e.description
2561
2959
  }));
2562
2960
  }
2563
- function Aa(e) {
2961
+ function eo(e) {
2564
2962
  let t = o.number();
2565
2963
  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($({
2566
2964
  title: e.title,
2567
2965
  description: e.description
2568
2966
  }));
2569
2967
  }
2570
- function ja(e) {
2968
+ function to(e) {
2571
2969
  return o.boolean().default(e.default ?? !1).meta($({
2572
2970
  title: e.title,
2573
2971
  description: e.description
2574
2972
  }));
2575
2973
  }
2576
- function Ma(e, t) {
2974
+ function no(e, t) {
2577
2975
  let n = o.enum(e);
2578
2976
  return (t.default === void 0 ? n.optional() : n.default(t.default)).meta($({
2579
2977
  title: t.title,
@@ -2582,14 +2980,14 @@ function Ma(e, t) {
2582
2980
  icons: t.icons
2583
2981
  }));
2584
2982
  }
2585
- function Na(e, t) {
2983
+ function ro(e, t) {
2586
2984
  return o.array(o.enum(e)).default([...t.default ?? []]).meta($({
2587
2985
  title: t.title,
2588
2986
  description: t.description,
2589
2987
  labels: t.labels
2590
2988
  }));
2591
2989
  }
2592
- function Pa(e, t) {
2990
+ function io(e, t) {
2593
2991
  return o.array(o.string()).default([]).meta($({
2594
2992
  domain: e,
2595
2993
  title: t?.title ?? "Entities",
@@ -2597,7 +2995,7 @@ function Pa(e, t) {
2597
2995
  deviceClass: t?.deviceClass
2598
2996
  }));
2599
2997
  }
2600
- function Fa(e, t) {
2998
+ function ao(e, t) {
2601
2999
  return o.array(o.string()).default([]).meta($({
2602
3000
  domain: e,
2603
3001
  title: t?.title ?? "Entity",
@@ -2606,13 +3004,13 @@ function Fa(e, t) {
2606
3004
  singleSelect: !0
2607
3005
  }));
2608
3006
  }
2609
- function Ia(e) {
3007
+ function oo(e) {
2610
3008
  return o.string().optional().meta({
2611
3009
  formType: "area-picker",
2612
3010
  title: e?.title ?? "Area"
2613
3011
  });
2614
3012
  }
2615
- function La(e) {
3013
+ function so(e) {
2616
3014
  let t = o.string().meta($({
2617
3015
  formType: "icon-picker",
2618
3016
  title: e?.title ?? "Icon",
@@ -2620,7 +3018,7 @@ function La(e) {
2620
3018
  }));
2621
3019
  return e?.default === void 0 ? t.optional() : t.default(e.default);
2622
3020
  }
2623
- function Ra(e) {
3021
+ function co(e) {
2624
3022
  let t = e?.presets && Object.fromEntries(Object.entries(e.presets).map(([e, t]) => [e, {
2625
3023
  label: t.label,
2626
3024
  thumb: t.thumb
@@ -2632,36 +3030,36 @@ function Ra(e) {
2632
3030
  }));
2633
3031
  return e?.default === void 0 ? n.optional() : n.default(e.default);
2634
3032
  }
2635
- function za(e) {
3033
+ function lo(e) {
2636
3034
  return o.array(o.string()).default([]).meta($({
2637
3035
  title: e.title,
2638
3036
  description: e.description
2639
3037
  }));
2640
3038
  }
2641
- function Ba(e, t) {
3039
+ function uo(e, t) {
2642
3040
  let n = o.object(e);
2643
- return n.default(Gt(n)).meta({ title: t.title });
3041
+ return n.default(Xt(n)).meta({ title: t.title });
2644
3042
  }
2645
- function Va(e) {
3043
+ function fo(e) {
2646
3044
  return e.def;
2647
3045
  }
2648
- function Ha(e) {
3046
+ function po(e) {
2649
3047
  if (o.globalRegistry.get(e)?.formType === "list") return !0;
2650
- let t = Va(e);
2651
- return t.shape ? Object.values(t.shape).some(Ha) : t.options ? t.options.some(Ha) : t.element ? Ha(t.element) : t.innerType ? Ha(t.innerType) : !1;
3048
+ let t = fo(e);
3049
+ return t.shape ? Object.values(t.shape).some(po) : t.options ? t.options.some(po) : t.element ? po(t.element) : t.innerType ? po(t.innerType) : !1;
2652
3050
  }
2653
- function Ua(e) {
2654
- let t = e, n = Va(t).innerType;
2655
- for (; n;) t = n, n = Va(t).innerType;
3051
+ function mo(e) {
3052
+ let t = e, n = fo(t).innerType;
3053
+ for (; n;) t = n, n = fo(t).innerType;
2656
3054
  return t;
2657
3055
  }
2658
- function Wa(e) {
2659
- let t = Va(Ua(e));
3056
+ function ho(e) {
3057
+ let t = fo(mo(e));
2660
3058
  if (t.shape) return new Set(Object.keys(t.shape));
2661
3059
  if (t.options) {
2662
3060
  let e = [];
2663
3061
  for (let n of t.options) {
2664
- let t = Wa(n);
3062
+ let t = ho(n);
2665
3063
  if (!t) return null;
2666
3064
  e.push(t);
2667
3065
  }
@@ -2673,7 +3071,7 @@ function Wa(e) {
2673
3071
  }
2674
3072
  return null;
2675
3073
  }
2676
- function Ga(e, t, n) {
3074
+ function go(e, t, n) {
2677
3075
  let r = { [t]: n };
2678
3076
  try {
2679
3077
  return e.parse(r);
@@ -2681,12 +3079,12 @@ function Ga(e, t, n) {
2681
3079
  return r;
2682
3080
  }
2683
3081
  }
2684
- function Ka(e, t) {
3082
+ function _o(e, t) {
2685
3083
  if (!Number.isInteger(t.max) || t.max < 1) throw Error(`field.list: max must be a positive integer, got ${t.max}`);
2686
- if (t.max > Da) throw Error(`field.list: max ${t.max} exceeds the ceiling of ${Da}`);
3084
+ if (t.max > Za) throw Error(`field.list: max ${t.max} exceeds the ceiling of ${Za}`);
2687
3085
  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}`);
2688
- if (Ha(e)) throw Error("field.list: a list item cannot contain another field.list (depth 1 only)");
2689
- if (t.labelField !== void 0 && !Wa(e)?.has(t.labelField)) throw Error(`field.list: labelField "${t.labelField}" must name a field present in every item`);
3086
+ if (po(e)) throw Error("field.list: a list item cannot contain another field.list (depth 1 only)");
3087
+ if (t.labelField !== void 0 && !ho(e)?.has(t.labelField)) throw Error(`field.list: labelField "${t.labelField}" must name a field present in every item`);
2690
3088
  let n = o.array(e);
2691
3089
  return t.min !== void 0 && (n = n.min(t.min)), n = n.max(t.max), n.default([]).meta($({
2692
3090
  formType: "list",
@@ -2696,7 +3094,7 @@ function Ka(e, t) {
2696
3094
  labelField: t.labelField
2697
3095
  }));
2698
3096
  }
2699
- function qa(e, t, n) {
3097
+ function vo(e, t, n) {
2700
3098
  let r = Object.keys(t)[0];
2701
3099
  if (r === void 0) throw Error("field.variants: at least one variant is required");
2702
3100
  if (n.shared && e in n.shared) throw Error(`field.variants: shared fields cannot redefine the discriminator "${e}"`);
@@ -2709,7 +3107,7 @@ function qa(e, t, n) {
2709
3107
  ...r,
2710
3108
  [e]: o.literal(t)
2711
3109
  })), a = o.discriminatedUnion(e, i), s = i[0];
2712
- return a.default(s ? Ga(s, e, r) : {}).meta($({
3110
+ return a.default(s ? go(s, e, r) : {}).meta($({
2713
3111
  formType: "variants",
2714
3112
  discriminator: e,
2715
3113
  title: n.title,
@@ -2717,35 +3115,35 @@ function qa(e, t, n) {
2717
3115
  labels: n.labels
2718
3116
  }));
2719
3117
  }
2720
- var Ja = {
2721
- title: Oa,
2722
- text: ka,
2723
- number: Aa,
2724
- toggle: ja,
2725
- choice: Ma,
2726
- choices: Na,
2727
- entities: Pa,
2728
- entity: Fa,
2729
- area: Ia,
2730
- icon: La,
2731
- image: Ra,
2732
- stringList: za,
2733
- group: Ba,
2734
- list: Ka,
2735
- variants: qa
3118
+ var yo = {
3119
+ title: Qa,
3120
+ text: $a,
3121
+ number: eo,
3122
+ toggle: to,
3123
+ choice: no,
3124
+ choices: ro,
3125
+ entities: io,
3126
+ entity: ao,
3127
+ area: oo,
3128
+ icon: so,
3129
+ image: co,
3130
+ stringList: lo,
3131
+ group: uo,
3132
+ list: _o,
3133
+ variants: vo
2736
3134
  };
2737
- function Ya(e) {
3135
+ function bo(e) {
2738
3136
  return o.object(e);
2739
3137
  }
2740
3138
  //#endregion
2741
3139
  //#region src/framework/image-src.ts
2742
- function Xa(e, t) {
2743
- let n = It(e);
2744
- return n === void 0 ? Rt(e) : t?.[n]?.src;
3140
+ function xo(e, t) {
3141
+ let n = Vt(e);
3142
+ return n === void 0 ? Ut(e) : t?.[n]?.src;
2745
3143
  }
2746
3144
  //#endregion
2747
3145
  //#region src/shared/spline.ts
2748
- function Za(e) {
3146
+ function So(e) {
2749
3147
  if (e.length < 2) return "";
2750
3148
  let t = e[0], n = e[1];
2751
3149
  if (!t || !n) return "";
@@ -2772,14 +3170,14 @@ function Za(e) {
2772
3170
  }
2773
3171
  //#endregion
2774
3172
  //#region src/theme.ts
2775
- function Qa() {
3173
+ function Co() {
2776
3174
  return document.documentElement.classList.contains("dark");
2777
3175
  }
2778
3176
  //#endregion
2779
3177
  //#region src/version.ts
2780
- var $a = {
3178
+ var wo = {
2781
3179
  name: "@glasshome/widget-sdk",
2782
- version: "1.20.0",
3180
+ version: "1.21.0",
2783
3181
  description: "SDK for building GlassHome dashboard widgets with SolidJS",
2784
3182
  keywords: [
2785
3183
  "dashboard",
@@ -2860,7 +3258,7 @@ var $a = {
2860
3258
  zod: "^4.1.13"
2861
3259
  },
2862
3260
  devDependencies: {
2863
- "@glasshome/ui": "1.21.1",
3261
+ "@glasshome/ui": "1.25.0",
2864
3262
  "@solidjs/testing-library": "^0.8.10",
2865
3263
  "@types/bun": "^1.4.0",
2866
3264
  "@types/node": "^25.2.2",
@@ -2875,10 +3273,10 @@ var $a = {
2875
3273
  },
2876
3274
  peerDependencies: {
2877
3275
  "@glasshome/sync-layer": "0.9.1",
2878
- "@glasshome/ui": "1.21.1",
3276
+ "@glasshome/ui": "1.25.0",
2879
3277
  "solid-js": "^1.9.11"
2880
3278
  },
2881
3279
  engines: { node: ">=18" }
2882
3280
  }.version;
2883
3281
  //#endregion
2884
- export { Ce as Badge, Te as Button, De as ButtonGroup, ke as Carousel, Ae as CarouselContent, je as CarouselDots, Me as CarouselItem, Ne as CarouselNext, Pe as CarouselPrevious, Fe as ColorDisc, Ie as ColorSlider, Le as ColorWheel, Re as CountPill, Ke as Icon, qe as Input, Je as Label, vi as PanelEntityRow, ci as PanelFacts, si as PanelRow, oi as PanelRows, ai as PanelSection, Ye as Progress, Xe as ResponsiveDialog, Ze as ResponsiveDialogBody, $e as ResponsiveDialogClose, et as ResponsiveDialogContent, tt as ResponsiveDialogDescription, nt as ResponsiveDialogFooter, it as ResponsiveDialogHeader, at as ResponsiveDialogTitle, $a as SDK_VERSION, ot as SchemaForm, st as SectionIcon, dt as SectionTitle, ft as Select, pt as SelectContent, mt as SelectItem, ht as SelectTrigger, gt as SelectValue, _t as Slider, vt as SwatchPicker, yt as Switch, bt as Tabs, St as TabsContent, wt as TabsList, Et as TabsTrigger, Ot as TemperatureBar, kt as Toggle, At as ToggleGroup, Mt as ToggleGroupItem, Ta as ToneSchema, Z as Widget, Jn as WidgetAction, Zn as WidgetBackdrop, Yn as WidgetChip, qn as WidgetChoice, fr as WidgetContent, Gn as WidgetControls, W as WidgetCtx, Vi as WidgetDebugTab, zi as WidgetDebugView, ta as WidgetDialog, Qn as WidgetGlyph, Un as WidgetHead, Wn as WidgetHero, kn as WidgetIcon, Xn as WidgetLayer, r as WidgetManifestSchema, Sn as WidgetSizeCtx, lr as WidgetSliderFill, mr as WidgetStatus, Kn as WidgetStepper, _r as WidgetTitle, Nr as WidgetValue, wi as buildDebugData, g as byDomain, Sr as calculateLightGroup, Cr as calculateSensorGroup, vr as copyText, Or as countActiveEntities, Ya as defineConfig, Kt as defineWidget, t as deprecations, Ja as field, n as formatDeprecation, i as formatSchemaError, Dr as getEntityAttribute, s as getForecasts, c as getStream, l as getWebRtcClientConfig, u as hassMediaUrl, Ft as imagePreset, Xa as imageSrc, Lt as imageUrl, ir as injectTokens, Qa as isDark, Er as isEntityActive, _i as isPanelControllable, zt as mediaUrl, Za as monotoneCubicPath, Bt as parseColor, Vt as presetValue, d as sendWebRtcCandidate, f as startWebRtcSession, p as state, wa as svgColors, m as trackEntityHistory, h as untrackEntityHistory, _ as useArea, v as useCalendarEvents, y as useCamera, Tn as useConfirm, b as useConnection, xr as useCopyText, x as useCurrency, ya as useDaylight, S as useEntities, ee as useEntity, ne as useEntityHistory, re as useEntityStatistics, ie as useForecast, ae as useHassConfig, sa as useIntersectionPause, oe as useLocale, ba as useReducedMotion, Yt as useService, ce as useStore, le as useTemperatureUnit, Qt as useToggle, Zt as useTurnOff, Xt as useTurnOn, pe as useUnitSystem, qt as useWidgetContext, ia as useWidgetDashboard, $t as useWidgetDialog, Cn as useWidgetDimensions, xa as useWidgetEntityGroup, xn as useWidgetGestures, oa as useWidgetViewer, Ea as widgetFields, a as z };
3282
+ export { we as Badge, Ee as Button, Oe as ButtonGroup, Ae as Carousel, je as CarouselContent, Me as CarouselDots, Ne as CarouselItem, Pe as CarouselNext, Fe as CarouselPrevious, Ie as ColorDisc, Le as ColorSlider, Re as ColorWheel, ze as CountPill, Ye as Icon, Xe as Input, Ze as Label, wi as PanelEntityRow, mi as PanelFacts, pi as PanelRow, fi as PanelRows, di as PanelSection, et as Progress, tt as ResponsiveDialog, nt as ResponsiveDialogBody, it as ResponsiveDialogClose, at as ResponsiveDialogContent, ot as ResponsiveDialogDescription, st as ResponsiveDialogFooter, lt as ResponsiveDialogHeader, ut as ResponsiveDialogTitle, wo as SDK_VERSION, dt as SchemaForm, ft as SectionIcon, gt as SectionTitle, _t as Select, vt as SelectContent, yt as SelectItem, bt as SelectTrigger, xt as SelectValue, St as Slider, Ct as SwatchPicker, wt as Switch, Tt as Tabs, Dt as TabsContent, kt as TabsList, jt as TabsTrigger, Nt as TemperatureBar, Pt as Toggle, Ft as ToggleGroup, Lt as ToggleGroupItem, Ya as ToneSchema, Y as Widget, tr as WidgetAction, ir as WidgetBackdrop, nr as WidgetChip, er as WidgetChoice, yr as WidgetContent, Qn as WidgetControls, U as WidgetCtx, qi as WidgetDebugTab, Gi as WidgetDebugView, sa as WidgetDialog, ar as WidgetGlyph, Xn as WidgetHead, Zn as WidgetHero, In as WidgetIcon, rr as WidgetLayer, r as WidgetManifestSchema, kn as WidgetSizeCtx, gr as WidgetSliderFill, xr as WidgetStatus, $n as WidgetStepper, wr as WidgetTitle, Br as WidgetValue, Ai as buildDebugData, ee as byDomain, kr as calculateLightGroup, Ar as calculateSensorGroup, Tr as copyText, Fr as countActiveEntities, bo as defineConfig, Zt as defineWidget, t as deprecations, yo as field, n as formatDeprecation, i as formatSchemaError, Pr as getEntityAttribute, s as getForecasts, c as getStream, l as getWebRtcClientConfig, u as hassMediaUrl, Bt as imagePreset, xo as imageSrc, Ht as imageUrl, dr as injectTokens, Co as isDark, Nr as isEntityActive, Ci as isPanelControllable, Wt as mediaUrl, So as monotoneCubicPath, Gt as parseColor, Kt as presetValue, d as sendWebRtcCandidate, f as startWebRtcSession, p as state, Ja as svgColors, m as trackEntityHistory, h as untrackEntityHistory, g as useArea, _ as useCalendarEvents, v as useCamera, Mn as useConfirm, y as useConnection, Or as useCopyText, b as useCurrency, Ua as useDaylight, x as useEntities, te as useEntity, ne as useEntityHistory, re as useEntityStatistics, ie as useForecast, ae as useHassConfig, ja as useIntersectionPause, oe as useLocale, Aa as useMaterial, Wa as useReducedMotion, en as useService, ce as useStore, le as useTemperatureUnit, rn as useToggle, nn as useTurnOff, tn as useTurnOn, pe as useUnitSystem, Qt as useWidgetContext, ua as useWidgetDashboard, on as useWidgetDialog, An as useWidgetDimensions, Ga as useWidgetEntityGroup, On as useWidgetGestures, fa as useWidgetViewer, Xa as widgetFields, a as z };