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