@glasshome/widget-sdk 1.22.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 +641 -641
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -4,12 +4,12 @@ import { z as a, z as o } from "zod";
|
|
|
4
4
|
import { getForecasts as s, getStream as c, getWebRtcClientConfig as l, hassMediaUrl as u, sendWebRtcCandidate as d, startWebRtcSession as f, state as p, trackEntityHistory as m, untrackEntityHistory as h } from "@glasshome/sync-layer";
|
|
5
5
|
import { byDomain as g, useArea as _, useCalendarEvents as v, useCamera as y, useConnection as b, useCurrency as x, useEntities as S, useEntity as ee, useEntity as C, useEntityHistory as w, useEntityStatistics as te, useForecast as ne, useHassConfig as re, useLocale as ie, useService as ae, useStore as oe, useTemperatureUnit as se, useToggle as ce, useTurnOff as le, useTurnOn as ue, useUnitSystem as de } from "@glasshome/sync-layer/solid";
|
|
6
6
|
import { For as T, Show as E, children as fe, createContext as pe, createEffect as D, createMemo as O, createSignal as k, on as me, onCleanup as A, onMount as he, splitProps as ge, useContext as j } from "solid-js";
|
|
7
|
-
import { addEventListener as
|
|
8
|
-
import { Accordion as
|
|
9
|
-
import { clsx as
|
|
10
|
-
import { twMerge as
|
|
7
|
+
import { addEventListener as _e, className as M, createComponent as N, delegateEvents as ve, effect as P, insert as F, memo as I, setAttribute as L, setStyleProperty as R, style as z, template as B, use as V } from "solid-js/web";
|
|
8
|
+
import { Accordion as ye, AccordionContent as be, AccordionItem as xe, AccordionTrigger as Se, Badge as Ce, Badge as we, Button as Te, Button as Ee, ButtonGroup as De, ButtonGroup as Oe, Carousel as ke, CarouselContent as Ae, CarouselDots as je, CarouselItem as Me, CarouselNext as Ne, CarouselPrevious as Pe, ColorDisc as Fe, ColorSlider as Ie, ColorWheel as Le, CountPill as Re, CountPill as ze, Empty as Be, EmptyDescription as Ve, EmptyHeader as He, EmptyTitle as Ue, FactRow as H, FieldGroup as We, FieldTitle as Ge, HOLD_GRACE_MS as Ke, HOLD_MS as qe, Icon as Je, Icon as U, Input as Ye, Label as Xe, Popover as Ze, PopoverContent as Qe, Progress as $e, ResponsiveDialog as et, ResponsiveDialogBody as tt, ResponsiveDialogBody as nt, ResponsiveDialogClose as rt, ResponsiveDialogContent as it, ResponsiveDialogDescription as at, ResponsiveDialogFooter as ot, ResponsiveDialogFooter as st, ResponsiveDialogHeader as ct, ResponsiveDialogTitle as lt, SchemaForm as ut, SectionIcon as dt, SectionIcon as ft, SectionMeta as pt, SectionRow as mt, SectionTitle as ht, Select as gt, SelectContent as _t, SelectItem as vt, SelectTrigger as yt, SelectValue as bt, Slider as xt, SwatchPicker as St, Switch as Ct, Tabs as wt, Tabs as Tt, TabsContent as Et, TabsContent as Dt, TabsList as Ot, TabsList as kt, TabsTrigger as At, TabsTrigger as jt, TemperatureBar as Mt, Toggle as Nt, ToggleGroup as Pt, ToggleGroup as Ft, ToggleGroupItem as It, ToggleGroupItem as Lt, buttonVariants as Rt, imagePreset as zt, imagePreset as Bt, imageUrl as Vt, imageUrl as Ht, mediaUrl as Ut, parseColor as Wt, presetValue as Gt, spendLongPress as Kt } from "@glasshome/ui/solid";
|
|
9
|
+
import { clsx as qt } from "clsx";
|
|
10
|
+
import { twMerge as Jt } from "tailwind-merge";
|
|
11
11
|
//#region src/framework/to-form-schema.ts
|
|
12
|
-
function
|
|
12
|
+
function Yt(e) {
|
|
13
13
|
return o.toJSONSchema(e, { override: (e) => {
|
|
14
14
|
let t = o.globalRegistry.get(e.zodSchema);
|
|
15
15
|
return t && typeof t == "object" && Object.keys(t).length > 0 ? {
|
|
@@ -18,7 +18,7 @@ function Jt(e) {
|
|
|
18
18
|
} : e.jsonSchema;
|
|
19
19
|
} });
|
|
20
20
|
}
|
|
21
|
-
function
|
|
21
|
+
function Xt(e) {
|
|
22
22
|
try {
|
|
23
23
|
return e.parse({});
|
|
24
24
|
} catch {
|
|
@@ -27,59 +27,59 @@ function Yt(e) {
|
|
|
27
27
|
}
|
|
28
28
|
//#endregion
|
|
29
29
|
//#region src/define-widget.ts
|
|
30
|
-
function
|
|
31
|
-
return e.configSchema && (e.manifest.schema || (e.manifest.schema =
|
|
30
|
+
function Zt(e) {
|
|
31
|
+
return e.configSchema && (e.manifest.schema || (e.manifest.schema = Yt(e.configSchema)), e.manifest.defaultConfig || (e.manifest.defaultConfig = Xt(e.configSchema))), e;
|
|
32
32
|
}
|
|
33
33
|
//#endregion
|
|
34
34
|
//#region src/framework/hooks/use-widget-context.ts
|
|
35
35
|
var W = pe();
|
|
36
|
-
function
|
|
36
|
+
function Qt() {
|
|
37
37
|
let e = j(W);
|
|
38
38
|
if (!e) throw Error("useWidgetContext must be used within a Widget component");
|
|
39
39
|
return e;
|
|
40
40
|
}
|
|
41
41
|
//#endregion
|
|
42
42
|
//#region src/framework/hooks/use-service.ts
|
|
43
|
-
function
|
|
43
|
+
function $t(e) {
|
|
44
44
|
let t = Array.isArray(e) ? e[0] : e, n = t?.split(".")[0];
|
|
45
45
|
if (!n) throw Error(`Invalid entity ID: ${String(t)}`);
|
|
46
46
|
return n;
|
|
47
47
|
}
|
|
48
|
-
function
|
|
48
|
+
function en(e, t) {
|
|
49
49
|
return async (n, r = {}) => {
|
|
50
|
-
await e(
|
|
50
|
+
await e($t(n), t, r, { entity_id: n });
|
|
51
51
|
};
|
|
52
52
|
}
|
|
53
|
-
function
|
|
53
|
+
function tn() {
|
|
54
54
|
let e = j(W)?.callService;
|
|
55
55
|
return e ? {
|
|
56
56
|
callService: e,
|
|
57
|
-
turnOn:
|
|
58
|
-
turnOff:
|
|
59
|
-
toggle:
|
|
57
|
+
turnOn: en(e, "turn_on"),
|
|
58
|
+
turnOff: en(e, "turn_off"),
|
|
59
|
+
toggle: en(e, "toggle")
|
|
60
60
|
} : ae();
|
|
61
61
|
}
|
|
62
|
-
function tn() {
|
|
63
|
-
let e = j(W)?.callService;
|
|
64
|
-
return e ? $t(e, "turn_on") : ue();
|
|
65
|
-
}
|
|
66
62
|
function nn() {
|
|
67
63
|
let e = j(W)?.callService;
|
|
68
|
-
return e ?
|
|
64
|
+
return e ? en(e, "turn_on") : ue();
|
|
69
65
|
}
|
|
70
66
|
function rn() {
|
|
71
67
|
let e = j(W)?.callService;
|
|
72
|
-
return e ?
|
|
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
|
|
82
|
+
function sn(e = "controls") {
|
|
83
83
|
let [t, n] = k(!1), [r, i] = k(e), a = (t) => {
|
|
84
84
|
i(t ?? e), n(!0);
|
|
85
85
|
}, o = j(W);
|
|
@@ -106,13 +106,13 @@ function 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
117
|
let [e, r] = k(!1), [i, a] = k(), [o, s] = k(), [c, l] = k(), [u, d] = k(!1);
|
|
118
118
|
n = {
|
|
@@ -126,46 +126,46 @@ function 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 = j(W), r =
|
|
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,
|
|
@@ -329,7 +329,7 @@ function On(e, t) {
|
|
|
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
331
|
}, v = (e) => {
|
|
332
|
-
let t = i(), r = e.target instanceof Element ? e.target.closest(`${
|
|
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
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));
|
|
@@ -344,7 +344,7 @@ function On(e, t) {
|
|
|
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 {
|
|
@@ -381,9 +381,9 @@ function On(e, t) {
|
|
|
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) => {
|
|
@@ -419,16 +419,16 @@ 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 = j(
|
|
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
|
|
430
|
+
var Mn = 1600;
|
|
431
|
+
function Nn() {
|
|
432
432
|
let [e, t] = k(/* @__PURE__ */ new Set()), n;
|
|
433
433
|
return A(() => clearTimeout(n)), {
|
|
434
434
|
has: (t) => e().has(t),
|
|
@@ -439,39 +439,39 @@ 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
|
}
|
|
446
446
|
//#endregion
|
|
447
447
|
//#region src/framework/utils/cn.ts
|
|
448
448
|
function J(...e) {
|
|
449
|
-
return qt(
|
|
449
|
+
return Jt(qt(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,9 +480,9 @@ function In(e) {
|
|
|
480
480
|
}
|
|
481
481
|
//#endregion
|
|
482
482
|
//#region src/framework/components/anatomy.tsx
|
|
483
|
-
var
|
|
484
|
-
function
|
|
485
|
-
let t = j(
|
|
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
486
|
D(() => n?.setIcon(e.icon)), A(() => {
|
|
487
487
|
n?.icon() === e.icon && n?.setIcon(void 0);
|
|
488
488
|
});
|
|
@@ -491,15 +491,15 @@ function Xn(e) {
|
|
|
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
|
|
532
|
+
function Qn(e) {
|
|
533
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
534
|
return D(me(r, () => o((e) => e === "a" ? "b" : "a"), { defer: !0 })), (() => {
|
|
535
|
-
var r =
|
|
536
|
-
return
|
|
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 I(t, () => e.children), F(() => N(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 = j(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 --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", 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 =
|
|
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
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 &&
|
|
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
|
|
858
|
+
function kr(e = 2e3) {
|
|
859
859
|
let [t, n] = k("idle"), r;
|
|
860
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":
|
|
@@ -919,7 +919,7 @@ function kr(e, t = !1) {
|
|
|
919
919
|
if (u.length > 0) {
|
|
920
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
921
|
x = `rgb(${Math.round(e * r)}, ${Math.round(t * r)}, ${Math.round(n * r)})`;
|
|
922
|
-
} else x =
|
|
922
|
+
} else x = Nr(n);
|
|
923
923
|
let S;
|
|
924
924
|
return S = h ? "All on" : g ? "All off" : i > 0 ? `${i} of ${d} on` : "Off", {
|
|
925
925
|
isGroup: r,
|
|
@@ -934,7 +934,7 @@ function kr(e, t = !1) {
|
|
|
934
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,38 +1093,38 @@ 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 = j(W), r =
|
|
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
1121
|
A(r.dispose);
|
|
1122
|
-
let i =
|
|
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
1123
|
A(o.dispose);
|
|
1124
1124
|
let s = () => t.emptyState && n ? r : t.gestures ?? (a ? o : void 0);
|
|
1125
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),
|
|
1127
|
+
let e = setTimeout(() => i.setNothingMore(!1), Yr);
|
|
1128
1128
|
A(() => clearTimeout(e));
|
|
1129
1129
|
}), D(() => i?.setTone(t.color ?? (t.tone ? `var(--tone-${t.tone})` : void 0)));
|
|
1130
1130
|
let [c, l] = k(), [u, d] = k({
|
|
@@ -1148,16 +1148,16 @@ function Yr(t) {
|
|
|
1148
1148
|
t.observe(e), A(() => t.disconnect());
|
|
1149
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,
|
|
1158
|
+
n && Object.defineProperty(f, ln, { value: n });
|
|
1159
1159
|
let p = O(() => {
|
|
1160
|
-
if (t.variant) return typeof t.variant == "string" ?
|
|
1160
|
+
if (t.variant) return typeof t.variant == "string" ? mr(t.variant) : t.variant.styles;
|
|
1161
1161
|
}), m = e(() => t.gradient, "widget.gradient"), h = () => !!t.tone && t.tone !== "neutral" || !!t.color, g = O(() => ({
|
|
1162
1162
|
...p()?.cssVars || {},
|
|
1163
1163
|
...t.tone ? { "--widget-color": `var(--tone-${t.tone})` } : {},
|
|
@@ -1197,41 +1197,41 @@ function Yr(t) {
|
|
|
1197
1197
|
top: `${w.y}px`,
|
|
1198
1198
|
width: `${w.r * 2}px`,
|
|
1199
1199
|
height: `${w.r * 2}px`,
|
|
1200
|
-
"z-index":
|
|
1200
|
+
"z-index": on.BACKGROUND
|
|
1201
1201
|
});
|
|
1202
|
-
return
|
|
1202
|
+
return N(W.Provider, {
|
|
1203
1203
|
value: f,
|
|
1204
1204
|
get children() {
|
|
1205
|
-
return
|
|
1205
|
+
return N(Yn.Provider, {
|
|
1206
1206
|
value: () => t.confirmed === !0,
|
|
1207
1207
|
get children() {
|
|
1208
|
-
return
|
|
1208
|
+
return N(An.Provider, {
|
|
1209
1209
|
value: u,
|
|
1210
1210
|
get children() {
|
|
1211
1211
|
return [(() => {
|
|
1212
|
-
var e =
|
|
1212
|
+
var e = Ur(), n = e.firstChild, i = n.firstChild, a = n.nextSibling;
|
|
1213
1213
|
return n.$$keydown = (e) => {
|
|
1214
1214
|
v() && s()?.onKeyDown?.(e);
|
|
1215
|
-
},
|
|
1215
|
+
}, _e(n, "pointercancel", ee), _e(n, "pointerup", S), _e(n, "pointermove", x), _e(n, "pointerdown", b), _e(n, "pointerenter", y), V((e) => {
|
|
1216
1216
|
l(e), t.gestures?.bindElement(e), r.bindElement(e);
|
|
1217
|
-
}, n),
|
|
1217
|
+
}, n), F(n, N(E, {
|
|
1218
1218
|
get when() {
|
|
1219
1219
|
return s()?.hold;
|
|
1220
1220
|
},
|
|
1221
1221
|
get children() {
|
|
1222
|
-
var e =
|
|
1223
|
-
return
|
|
1222
|
+
var e = Hr();
|
|
1223
|
+
return P((t) => {
|
|
1224
1224
|
var n = C() && !C()?.fired ? "" : void 0, r = C()?.fired ? "" : void 0, i = te(C());
|
|
1225
|
-
return n !== t.e &&
|
|
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;
|
|
1226
1226
|
}, {
|
|
1227
1227
|
e: void 0,
|
|
1228
1228
|
t: void 0,
|
|
1229
1229
|
a: void 0
|
|
1230
1230
|
}), e;
|
|
1231
1231
|
}
|
|
1232
|
-
}), i),
|
|
1233
|
-
var e =
|
|
1234
|
-
return () => e() ?
|
|
1232
|
+
}), i), F(i, (() => {
|
|
1233
|
+
var e = I(() => !!t.emptyState);
|
|
1234
|
+
return () => e() ? N(Zr, {
|
|
1235
1235
|
get icon() {
|
|
1236
1236
|
return t.emptyState.icon;
|
|
1237
1237
|
},
|
|
@@ -1242,15 +1242,15 @@ function Yr(t) {
|
|
|
1242
1242
|
return t.emptyState.message;
|
|
1243
1243
|
}
|
|
1244
1244
|
}) : t.children;
|
|
1245
|
-
})()),
|
|
1246
|
-
var e =
|
|
1245
|
+
})()), F(n, (() => {
|
|
1246
|
+
var e = I(() => !!t.loading);
|
|
1247
1247
|
return () => e() && (() => {
|
|
1248
|
-
var e =
|
|
1249
|
-
return
|
|
1248
|
+
var e = Wr();
|
|
1249
|
+
return P((t) => R(e, "z-index", on.OVERLAY)), e;
|
|
1250
1250
|
})();
|
|
1251
|
-
})(), null),
|
|
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 =
|
|
1253
|
-
return r !== e.e &&
|
|
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;
|
|
1254
1254
|
}, {
|
|
1255
1255
|
e: void 0,
|
|
1256
1256
|
t: void 0,
|
|
@@ -1261,10 +1261,10 @@ function Yr(t) {
|
|
|
1261
1261
|
s: void 0,
|
|
1262
1262
|
h: void 0
|
|
1263
1263
|
}), e;
|
|
1264
|
-
})(),
|
|
1264
|
+
})(), N(E, {
|
|
1265
1265
|
when: a,
|
|
1266
1266
|
get children() {
|
|
1267
|
-
return
|
|
1267
|
+
return N(Ze, {
|
|
1268
1268
|
get open() {
|
|
1269
1269
|
return i?.nothingMore() ?? !1;
|
|
1270
1270
|
},
|
|
@@ -1273,10 +1273,10 @@ function Yr(t) {
|
|
|
1273
1273
|
},
|
|
1274
1274
|
anchorRef: c,
|
|
1275
1275
|
get children() {
|
|
1276
|
-
return
|
|
1276
|
+
return N(Qe, {
|
|
1277
1277
|
class: "flex w-auto items-center gap-2 p-3 text-sm",
|
|
1278
1278
|
get children() {
|
|
1279
|
-
return [
|
|
1279
|
+
return [N(U, { icon: "mdi:information-outline" }), "No more controls for this widget"];
|
|
1280
1280
|
}
|
|
1281
1281
|
});
|
|
1282
1282
|
}
|
|
@@ -1290,60 +1290,60 @@ function Yr(t) {
|
|
|
1290
1290
|
}
|
|
1291
1291
|
});
|
|
1292
1292
|
}
|
|
1293
|
-
function
|
|
1293
|
+
function Zr(e) {
|
|
1294
1294
|
return (() => {
|
|
1295
|
-
var t =
|
|
1296
|
-
return
|
|
1297
|
-
var t =
|
|
1298
|
-
return () => t() && (() => {
|
|
1299
|
-
var t = Gr();
|
|
1300
|
-
return I(t, () => e.icon), t;
|
|
1301
|
-
})();
|
|
1302
|
-
})(), null), I(t, (() => {
|
|
1303
|
-
var t = L(() => !!e.title);
|
|
1295
|
+
var t = Gr();
|
|
1296
|
+
return F(t, (() => {
|
|
1297
|
+
var t = I(() => !!e.icon);
|
|
1304
1298
|
return () => t() && (() => {
|
|
1305
1299
|
var t = Kr();
|
|
1306
|
-
return
|
|
1300
|
+
return F(t, () => e.icon), t;
|
|
1307
1301
|
})();
|
|
1308
|
-
})(), null),
|
|
1309
|
-
var t =
|
|
1302
|
+
})(), null), F(t, (() => {
|
|
1303
|
+
var t = I(() => !!e.title);
|
|
1310
1304
|
return () => t() && (() => {
|
|
1311
1305
|
var t = qr();
|
|
1312
|
-
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;
|
|
1313
1313
|
})();
|
|
1314
1314
|
})(), null), t;
|
|
1315
1315
|
})();
|
|
1316
1316
|
}
|
|
1317
|
-
var Y =
|
|
1318
|
-
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"]);
|
|
1319
1319
|
//#endregion
|
|
1320
1320
|
//#region src/framework/panel/panel.tsx
|
|
1321
|
-
var
|
|
1322
|
-
function
|
|
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
1323
|
let t = j(W), n, r = !1, i = !1, a, o = 0, s = (t, n) => {
|
|
1324
1324
|
let r = e.slide?.();
|
|
1325
1325
|
if (!r) return 0;
|
|
1326
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;
|
|
1327
|
-
return Math.round(
|
|
1327
|
+
return Math.round(ui(o + a * (s - o), o, s));
|
|
1328
1328
|
}, c = () => {
|
|
1329
1329
|
clearTimeout(a), n = void 0;
|
|
1330
1330
|
};
|
|
1331
1331
|
return A(() => clearTimeout(a)), {
|
|
1332
1332
|
onPointerDown: (o) => {
|
|
1333
1333
|
if (o.button !== 0 || n) return;
|
|
1334
|
-
let s = o.target instanceof Element ? o.target.closest(
|
|
1334
|
+
let s = o.target instanceof Element ? o.target.closest(On) : null;
|
|
1335
1335
|
s && s !== o.currentTarget || (n = {
|
|
1336
1336
|
x: o.clientX,
|
|
1337
1337
|
y: o.clientY,
|
|
1338
1338
|
id: o.pointerId
|
|
1339
1339
|
}, o.currentTarget.setPointerCapture?.(o.pointerId), r = !1, i = !1, e.onHold && (a = setTimeout(() => {
|
|
1340
|
-
i = !0, e.onHold?.(), t?.onHeld?.();
|
|
1340
|
+
i = !0, Kt(), e.onHold?.(), t?.onHeld?.();
|
|
1341
1341
|
}, qe)));
|
|
1342
1342
|
},
|
|
1343
1343
|
onPointerMove: (t) => {
|
|
1344
1344
|
if (!n || t.pointerId !== n.id || i) return;
|
|
1345
1345
|
let c = t.currentTarget, l = e.axis === "x" ? Math.abs(t.clientX - n.x) : Math.abs(t.clientY - n.y);
|
|
1346
|
-
!r && e.slide?.() && l >
|
|
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);
|
|
1347
1347
|
},
|
|
1348
1348
|
onPointerUp: (t) => {
|
|
1349
1349
|
n && t.pointerId === n.id && (r ? e.slide?.()?.onCommit?.(o) : i || e.onTap?.(), c());
|
|
@@ -1351,20 +1351,20 @@ function ui(e) {
|
|
|
1351
1351
|
onPointerCancel: c
|
|
1352
1352
|
};
|
|
1353
1353
|
}
|
|
1354
|
-
function
|
|
1354
|
+
function fi(e) {
|
|
1355
1355
|
return (() => {
|
|
1356
|
-
var t =
|
|
1357
|
-
return
|
|
1356
|
+
var t = Qr(), n = t.firstChild;
|
|
1357
|
+
return F(n, () => e.label), F(t, () => e.children, null), t;
|
|
1358
1358
|
})();
|
|
1359
1359
|
}
|
|
1360
|
-
function
|
|
1360
|
+
function pi(e) {
|
|
1361
1361
|
return (() => {
|
|
1362
|
-
var t =
|
|
1363
|
-
return
|
|
1362
|
+
var t = $r();
|
|
1363
|
+
return F(t, () => e.children), t;
|
|
1364
1364
|
})();
|
|
1365
1365
|
}
|
|
1366
|
-
function
|
|
1367
|
-
let t = () => !!(e.onTap || e.slide || e.onHold), n =
|
|
1366
|
+
function mi(e) {
|
|
1367
|
+
let t = () => !!(e.onTap || e.slide || e.onHold), n = di({
|
|
1368
1368
|
axis: "x",
|
|
1369
1369
|
slide: () => e.slide,
|
|
1370
1370
|
onTap: () => e.onTap?.(),
|
|
@@ -1381,26 +1381,26 @@ function pi(e) {
|
|
|
1381
1381
|
let r = t.key === "ArrowRight" || t.key === "ArrowUp" ? 5 : t.key === "ArrowLeft" || t.key === "ArrowDown" ? -5 : 0;
|
|
1382
1382
|
if (!r) return;
|
|
1383
1383
|
t.preventDefault();
|
|
1384
|
-
let i =
|
|
1384
|
+
let i = ui(n.value + r, n.min ?? 0, n.max ?? 100);
|
|
1385
1385
|
n.onChange(i), n.onCommit?.(i);
|
|
1386
1386
|
}, a = () => [
|
|
1387
|
-
|
|
1387
|
+
N(E, {
|
|
1388
1388
|
get when() {
|
|
1389
1389
|
return r() !== void 0;
|
|
1390
1390
|
},
|
|
1391
1391
|
get children() {
|
|
1392
|
-
var e =
|
|
1393
|
-
return
|
|
1392
|
+
var e = ei();
|
|
1393
|
+
return P((t) => z(e, { "--widget-fill-value": r() }, t)), e;
|
|
1394
1394
|
}
|
|
1395
1395
|
}),
|
|
1396
1396
|
(() => {
|
|
1397
|
-
var t =
|
|
1398
|
-
return
|
|
1397
|
+
var t = ti();
|
|
1398
|
+
return F(t, N(U, {
|
|
1399
1399
|
get icon() {
|
|
1400
1400
|
return e.icon;
|
|
1401
1401
|
},
|
|
1402
1402
|
class: "glasshome-widget-icon-glyph"
|
|
1403
|
-
})),
|
|
1403
|
+
})), P((n) => {
|
|
1404
1404
|
var r = !!e.on, i = !e.on;
|
|
1405
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;
|
|
1406
1406
|
}, {
|
|
@@ -1409,33 +1409,33 @@ function pi(e) {
|
|
|
1409
1409
|
}), t;
|
|
1410
1410
|
})(),
|
|
1411
1411
|
(() => {
|
|
1412
|
-
var t =
|
|
1413
|
-
return
|
|
1412
|
+
var t = ri(), n = t.firstChild;
|
|
1413
|
+
return F(n, () => e.name), F(t, N(E, {
|
|
1414
1414
|
get when() {
|
|
1415
1415
|
return e.state !== void 0;
|
|
1416
1416
|
},
|
|
1417
1417
|
get children() {
|
|
1418
|
-
var t =
|
|
1419
|
-
return
|
|
1418
|
+
var t = ni();
|
|
1419
|
+
return F(t, () => e.state), t;
|
|
1420
1420
|
}
|
|
1421
1421
|
}), null), t;
|
|
1422
1422
|
})()
|
|
1423
1423
|
], o = () => ({ "--widget-color": e.tone ?? "var(--tone-neutral)" });
|
|
1424
1424
|
return (() => {
|
|
1425
|
-
var r =
|
|
1426
|
-
return
|
|
1425
|
+
var r = ai();
|
|
1426
|
+
return F(r, N(E, {
|
|
1427
1427
|
get when() {
|
|
1428
1428
|
return t();
|
|
1429
1429
|
},
|
|
1430
1430
|
get fallback() {
|
|
1431
1431
|
return (() => {
|
|
1432
|
-
var e =
|
|
1433
|
-
return
|
|
1432
|
+
var e = oi();
|
|
1433
|
+
return F(e, a), P((t) => {
|
|
1434
1434
|
var n = `${Rt({
|
|
1435
1435
|
variant: "outline",
|
|
1436
1436
|
size: "none"
|
|
1437
1437
|
})} glasshome-panel-row glasshome-panel-row-static`, r = o();
|
|
1438
|
-
return n !== t.e &&
|
|
1438
|
+
return n !== t.e && M(e, t.e = n), t.t = z(e, r, t.t), t;
|
|
1439
1439
|
}, {
|
|
1440
1440
|
e: void 0,
|
|
1441
1441
|
t: void 0
|
|
@@ -1443,7 +1443,7 @@ function pi(e) {
|
|
|
1443
1443
|
})();
|
|
1444
1444
|
},
|
|
1445
1445
|
get children() {
|
|
1446
|
-
return
|
|
1446
|
+
return N(Ee, {
|
|
1447
1447
|
variant: "outline",
|
|
1448
1448
|
size: "none",
|
|
1449
1449
|
class: "glasshome-panel-row",
|
|
@@ -1477,39 +1477,39 @@ function pi(e) {
|
|
|
1477
1477
|
}
|
|
1478
1478
|
});
|
|
1479
1479
|
}
|
|
1480
|
-
}), null),
|
|
1480
|
+
}), null), F(r, N(E, {
|
|
1481
1481
|
get when() {
|
|
1482
1482
|
return e.trailing;
|
|
1483
1483
|
},
|
|
1484
1484
|
get children() {
|
|
1485
|
-
var t =
|
|
1486
|
-
return
|
|
1485
|
+
var t = ii();
|
|
1486
|
+
return F(t, () => e.trailing), t;
|
|
1487
1487
|
}
|
|
1488
1488
|
}), null), r;
|
|
1489
1489
|
})();
|
|
1490
1490
|
}
|
|
1491
|
-
function
|
|
1491
|
+
function hi(e) {
|
|
1492
1492
|
return (() => {
|
|
1493
|
-
var t =
|
|
1494
|
-
return
|
|
1493
|
+
var t = si();
|
|
1494
|
+
return F(t, N(T, {
|
|
1495
1495
|
get each() {
|
|
1496
1496
|
return e.items;
|
|
1497
1497
|
},
|
|
1498
1498
|
children: (e) => (() => {
|
|
1499
|
-
var t =
|
|
1500
|
-
return
|
|
1499
|
+
var t = ci(), n = t.firstChild, r = n.firstChild, i = r.nextSibling;
|
|
1500
|
+
return F(t, N(U, {
|
|
1501
1501
|
get icon() {
|
|
1502
1502
|
return e.icon;
|
|
1503
1503
|
},
|
|
1504
1504
|
class: "glasshome-panel-fact-icon"
|
|
1505
|
-
}), n),
|
|
1505
|
+
}), n), F(r, () => e.label), F(i, () => e.value), t;
|
|
1506
1506
|
})()
|
|
1507
1507
|
})), t;
|
|
1508
1508
|
})();
|
|
1509
1509
|
}
|
|
1510
1510
|
//#endregion
|
|
1511
1511
|
//#region src/framework/panel/panel-entity.tsx
|
|
1512
|
-
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 = {
|
|
1513
1513
|
light: {
|
|
1514
1514
|
icon: "mdi:lightbulb",
|
|
1515
1515
|
tone: (e) => {
|
|
@@ -1549,10 +1549,10 @@ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.cha
|
|
|
1549
1549
|
on: (e) => e.state === "on",
|
|
1550
1550
|
state: (e) => {
|
|
1551
1551
|
if (e.state !== "on") return "Off";
|
|
1552
|
-
let t =
|
|
1552
|
+
let t = gi(e.attributes.percentage);
|
|
1553
1553
|
return t === void 0 ? "On" : `${t}%`;
|
|
1554
1554
|
},
|
|
1555
|
-
level: (e) => e.state === "on" ?
|
|
1555
|
+
level: (e) => e.state === "on" ? gi(e.attributes.percentage) ?? 100 : 0,
|
|
1556
1556
|
setLevel: (e, t, n) => e("fan", "set_percentage", { percentage: n }, X(t)),
|
|
1557
1557
|
tap: (e, t) => e("fan", "toggle", {}, X(t))
|
|
1558
1558
|
},
|
|
@@ -1561,10 +1561,10 @@ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.cha
|
|
|
1561
1561
|
tone: "var(--tone-info)",
|
|
1562
1562
|
on: (e) => e.state !== "closed",
|
|
1563
1563
|
state: (e) => {
|
|
1564
|
-
let t =
|
|
1564
|
+
let t = gi(e.attributes.current_position), n = _i(e.state);
|
|
1565
1565
|
return t !== void 0 && e.state === "open" ? `${n} · ${t}%` : n;
|
|
1566
1566
|
},
|
|
1567
|
-
level: (e) =>
|
|
1567
|
+
level: (e) => gi(e.attributes.current_position),
|
|
1568
1568
|
setLevel: (e, t, n) => e("cover", "set_cover_position", { position: n }, X(t)),
|
|
1569
1569
|
tap: (e, t) => e("cover", t.state === "closed" ? "open_cover" : "close_cover", {}, X(t))
|
|
1570
1570
|
},
|
|
@@ -1572,7 +1572,7 @@ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.cha
|
|
|
1572
1572
|
icon: (e) => e.state === "locked" ? "mdi:lock" : "mdi:lock-open-variant",
|
|
1573
1573
|
tone: "var(--tone-success)",
|
|
1574
1574
|
on: (e) => e.state === "locked",
|
|
1575
|
-
state: (e) =>
|
|
1575
|
+
state: (e) => _i(e.state),
|
|
1576
1576
|
tap: (e, t) => e("lock", t.state === "locked" ? "unlock" : "lock", {}, X(t))
|
|
1577
1577
|
},
|
|
1578
1578
|
climate: {
|
|
@@ -1582,14 +1582,14 @@ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.cha
|
|
|
1582
1582
|
state: (e) => {
|
|
1583
1583
|
if (e.state === "off") return "Off";
|
|
1584
1584
|
let t = e.attributes.temperature;
|
|
1585
|
-
return typeof t == "number" ? `${
|
|
1585
|
+
return typeof t == "number" ? `${_i(e.state)} · ${t}°` : _i(e.state);
|
|
1586
1586
|
}
|
|
1587
1587
|
},
|
|
1588
1588
|
media_player: {
|
|
1589
1589
|
icon: "mdi:speaker",
|
|
1590
1590
|
tone: "var(--tone-accent)",
|
|
1591
1591
|
on: (e) => e.state === "playing",
|
|
1592
|
-
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),
|
|
1593
1593
|
level: (e) => typeof e.attributes.volume_level == "number" ? Math.round(e.attributes.volume_level * 100) : void 0,
|
|
1594
1594
|
setLevel: (e, t, n) => e("media_player", "volume_set", { volume_level: n / 100 }, X(t)),
|
|
1595
1595
|
tap: (e, t) => e("media_player", "media_play_pause", {}, X(t))
|
|
@@ -1599,7 +1599,7 @@ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.cha
|
|
|
1599
1599
|
tone: "var(--tone-info)",
|
|
1600
1600
|
on: (e) => e.state === "on",
|
|
1601
1601
|
state: (e) => {
|
|
1602
|
-
let t =
|
|
1602
|
+
let t = bi[e.deviceClass ?? ""] ?? ["On", "Off"];
|
|
1603
1603
|
return e.state === "on" ? t[0] : t[1];
|
|
1604
1604
|
}
|
|
1605
1605
|
},
|
|
@@ -1607,14 +1607,14 @@ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.cha
|
|
|
1607
1607
|
icon: "mdi:gesture-tap-button",
|
|
1608
1608
|
tone: "var(--tone-accent)",
|
|
1609
1609
|
on: () => !1,
|
|
1610
|
-
state: (e) =>
|
|
1610
|
+
state: (e) => xi(e.state),
|
|
1611
1611
|
tap: (e, t) => e("button", "press", {}, X(t))
|
|
1612
1612
|
},
|
|
1613
1613
|
input_button: {
|
|
1614
1614
|
icon: "mdi:gesture-tap-button",
|
|
1615
1615
|
tone: "var(--tone-accent)",
|
|
1616
1616
|
on: () => !1,
|
|
1617
|
-
state: (e) =>
|
|
1617
|
+
state: (e) => xi(e.state),
|
|
1618
1618
|
tap: (e, t) => e("input_button", "press", {}, X(t))
|
|
1619
1619
|
},
|
|
1620
1620
|
scene: {
|
|
@@ -1631,14 +1631,14 @@ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.cha
|
|
|
1631
1631
|
state: (e) => e.state === "on" ? "Running" : "Tap to run",
|
|
1632
1632
|
tap: (e, t) => e("script", "turn_on", {}, X(t))
|
|
1633
1633
|
}
|
|
1634
|
-
},
|
|
1634
|
+
}, yi = {
|
|
1635
1635
|
garage: "mdi:garage",
|
|
1636
1636
|
gate: "mdi:gate",
|
|
1637
1637
|
door: "mdi:door",
|
|
1638
1638
|
curtain: "mdi:curtains",
|
|
1639
1639
|
shutter: "mdi:window-shutter",
|
|
1640
1640
|
awning: "mdi:awning"
|
|
1641
|
-
},
|
|
1641
|
+
}, bi = {
|
|
1642
1642
|
door: ["Open", "Closed"],
|
|
1643
1643
|
window: ["Open", "Closed"],
|
|
1644
1644
|
garage_door: ["Open", "Closed"],
|
|
@@ -1652,44 +1652,44 @@ var hi = (e) => typeof e == "number" ? Math.round(e) : void 0, gi = (e) => e.cha
|
|
|
1652
1652
|
battery: ["Low", "Normal"],
|
|
1653
1653
|
connectivity: ["Connected", "Disconnected"]
|
|
1654
1654
|
};
|
|
1655
|
-
function
|
|
1655
|
+
function xi(e) {
|
|
1656
1656
|
let t = Date.parse(e);
|
|
1657
1657
|
return Number.isNaN(t) ? "Never pressed" : new Date(t).toLocaleTimeString([], {
|
|
1658
1658
|
hour: "2-digit",
|
|
1659
1659
|
minute: "2-digit"
|
|
1660
1660
|
});
|
|
1661
1661
|
}
|
|
1662
|
-
var
|
|
1662
|
+
var Si = {
|
|
1663
1663
|
icon: "mdi:circle-medium",
|
|
1664
1664
|
tone: "var(--tone-neutral)",
|
|
1665
1665
|
on: (e) => e.state === "on",
|
|
1666
|
-
state: (e) =>
|
|
1666
|
+
state: (e) => _i(e.state)
|
|
1667
1667
|
};
|
|
1668
|
-
function
|
|
1668
|
+
function Ci(e, t) {
|
|
1669
1669
|
if (!t || e.length <= t.length || !e.toLowerCase().startsWith(t.toLowerCase())) return e;
|
|
1670
1670
|
let n = e.slice(t.length).trim();
|
|
1671
1671
|
return n ? n.charAt(0).toUpperCase() + n.slice(1) : e;
|
|
1672
1672
|
}
|
|
1673
|
-
function Ci(e) {
|
|
1674
|
-
return !!_i[e]?.tap || !!_i[e]?.setLevel;
|
|
1675
|
-
}
|
|
1676
1673
|
function wi(e) {
|
|
1677
|
-
|
|
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
1678
|
return D(() => {
|
|
1679
1679
|
t(), i(void 0);
|
|
1680
|
-
}),
|
|
1680
|
+
}), N(E, {
|
|
1681
1681
|
get when() {
|
|
1682
1682
|
return t();
|
|
1683
1683
|
},
|
|
1684
1684
|
children: (t) => {
|
|
1685
|
-
let a = () =>
|
|
1686
|
-
return
|
|
1685
|
+
let a = () => vi[t().domain] ?? Si, o = () => r() ?? a().level?.(t()), s = () => a().setLevel;
|
|
1686
|
+
return N(mi, {
|
|
1687
1687
|
get icon() {
|
|
1688
1688
|
let n = a().icon;
|
|
1689
|
-
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;
|
|
1690
1690
|
},
|
|
1691
1691
|
get name() {
|
|
1692
|
-
return e.name ??
|
|
1692
|
+
return e.name ?? Ci(t().friendlyName ?? t().id, e.within);
|
|
1693
1693
|
},
|
|
1694
1694
|
get state() {
|
|
1695
1695
|
return a().state(t());
|
|
@@ -1703,7 +1703,7 @@ function wi(e) {
|
|
|
1703
1703
|
return a().on(t());
|
|
1704
1704
|
},
|
|
1705
1705
|
get slide() {
|
|
1706
|
-
return
|
|
1706
|
+
return I(() => !!(s() && o() !== void 0))() ? {
|
|
1707
1707
|
value: o() ?? 0,
|
|
1708
1708
|
onChange: i,
|
|
1709
1709
|
onCommit: (e) => s()?.(n, t(), e)
|
|
@@ -1721,8 +1721,8 @@ function wi(e) {
|
|
|
1721
1721
|
}
|
|
1722
1722
|
//#endregion
|
|
1723
1723
|
//#region src/framework/dialogs/debug-view.tsx
|
|
1724
|
-
var
|
|
1725
|
-
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) {
|
|
1726
1726
|
return {
|
|
1727
1727
|
widgetConfig: e,
|
|
1728
1728
|
entities: t.map((e) => ({
|
|
@@ -1739,18 +1739,18 @@ function Ai(e, t, n) {
|
|
|
1739
1739
|
...n
|
|
1740
1740
|
};
|
|
1741
1741
|
}
|
|
1742
|
-
var
|
|
1742
|
+
var Mi = (e) => JSON.stringify(e, null, 2), Ni = {
|
|
1743
1743
|
idle: "lucide:copy",
|
|
1744
1744
|
copied: "lucide:check",
|
|
1745
1745
|
failed: "lucide:triangle-alert"
|
|
1746
|
-
},
|
|
1746
|
+
}, Pi = {
|
|
1747
1747
|
idle: "text-muted-foreground",
|
|
1748
1748
|
copied: "text-success",
|
|
1749
1749
|
failed: "text-destructive"
|
|
1750
1750
|
};
|
|
1751
|
-
function
|
|
1752
|
-
let { state: t, copy: n } =
|
|
1753
|
-
return
|
|
1751
|
+
function Fi(e) {
|
|
1752
|
+
let { state: t, copy: n } = kr();
|
|
1753
|
+
return N(Ee, {
|
|
1754
1754
|
variant: "ghost",
|
|
1755
1755
|
size: "icon",
|
|
1756
1756
|
class: "size-8",
|
|
@@ -1759,70 +1759,70 @@ function Pi(e) {
|
|
|
1759
1759
|
},
|
|
1760
1760
|
onClick: () => void n(e.text()),
|
|
1761
1761
|
get children() {
|
|
1762
|
-
return
|
|
1762
|
+
return N(U, {
|
|
1763
1763
|
get icon() {
|
|
1764
|
-
return
|
|
1764
|
+
return Ni[t()];
|
|
1765
1765
|
},
|
|
1766
1766
|
width: 16,
|
|
1767
1767
|
height: 16,
|
|
1768
1768
|
get class() {
|
|
1769
|
-
return
|
|
1769
|
+
return Pi[t()];
|
|
1770
1770
|
}
|
|
1771
1771
|
});
|
|
1772
1772
|
}
|
|
1773
1773
|
});
|
|
1774
1774
|
}
|
|
1775
|
-
function
|
|
1775
|
+
function Ii(e) {
|
|
1776
1776
|
let t = e.replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ");
|
|
1777
1777
|
return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
|
|
1778
1778
|
}
|
|
1779
|
-
var
|
|
1780
|
-
function
|
|
1779
|
+
var Li = (e) => e === null || typeof e != "object" && typeof e != "function";
|
|
1780
|
+
function Ri(e) {
|
|
1781
1781
|
return e == null ? "None" : String(e);
|
|
1782
1782
|
}
|
|
1783
|
-
function
|
|
1783
|
+
function zi(e) {
|
|
1784
1784
|
return Array.isArray(e) ? e.length : typeof e == "object" && e ? Object.keys(e).length : 0;
|
|
1785
1785
|
}
|
|
1786
|
-
function
|
|
1786
|
+
function Bi(e) {
|
|
1787
1787
|
let t = new Date(e);
|
|
1788
1788
|
return Number.isNaN(t.getTime()) ? e : t.toLocaleString();
|
|
1789
1789
|
}
|
|
1790
|
-
function
|
|
1791
|
-
return
|
|
1790
|
+
function Vi(e) {
|
|
1791
|
+
return N(mt, {
|
|
1792
1792
|
class: "overflow-hidden p-0",
|
|
1793
1793
|
get children() {
|
|
1794
|
-
var t =
|
|
1795
|
-
return
|
|
1794
|
+
var t = Ei();
|
|
1795
|
+
return F(t, () => Mi(e.value)), t;
|
|
1796
1796
|
}
|
|
1797
1797
|
});
|
|
1798
1798
|
}
|
|
1799
|
-
function
|
|
1800
|
-
return
|
|
1799
|
+
function Hi(e) {
|
|
1800
|
+
return N(ye, {
|
|
1801
1801
|
collapsible: !0,
|
|
1802
1802
|
class: "border-border/50 border-t",
|
|
1803
1803
|
get children() {
|
|
1804
|
-
return
|
|
1804
|
+
return N(xe, {
|
|
1805
1805
|
get value() {
|
|
1806
1806
|
return e.label;
|
|
1807
1807
|
},
|
|
1808
1808
|
get children() {
|
|
1809
|
-
return [
|
|
1809
|
+
return [N(Se, {
|
|
1810
1810
|
class: "text-muted-foreground py-3 text-xs",
|
|
1811
1811
|
get children() {
|
|
1812
|
-
var t =
|
|
1813
|
-
return
|
|
1812
|
+
var t = Di();
|
|
1813
|
+
return F(t, () => e.label, null), F(t, N(E, {
|
|
1814
1814
|
get when() {
|
|
1815
1815
|
return e.count !== void 0;
|
|
1816
1816
|
},
|
|
1817
1817
|
get children() {
|
|
1818
|
-
return
|
|
1818
|
+
return N(ze, { get children() {
|
|
1819
1819
|
return e.count;
|
|
1820
1820
|
} });
|
|
1821
1821
|
}
|
|
1822
1822
|
}), null), t;
|
|
1823
1823
|
}
|
|
1824
|
-
}),
|
|
1825
|
-
return
|
|
1824
|
+
}), N(be, { get children() {
|
|
1825
|
+
return N(Vi, { get value() {
|
|
1826
1826
|
return e.value;
|
|
1827
1827
|
} });
|
|
1828
1828
|
} })];
|
|
@@ -1831,77 +1831,77 @@ function Vi(e) {
|
|
|
1831
1831
|
}
|
|
1832
1832
|
});
|
|
1833
1833
|
}
|
|
1834
|
-
function
|
|
1834
|
+
function Ui(e) {
|
|
1835
1835
|
return (() => {
|
|
1836
|
-
var t =
|
|
1837
|
-
return
|
|
1836
|
+
var t = Oi(), n = t.firstChild, r = n.firstChild, i = n.nextSibling;
|
|
1837
|
+
return F(n, N(ft, {
|
|
1838
1838
|
get icon() {
|
|
1839
1839
|
return e.icon;
|
|
1840
1840
|
},
|
|
1841
1841
|
size: "sm"
|
|
1842
|
-
}), r),
|
|
1842
|
+
}), r), F(r, N(Ge, {
|
|
1843
1843
|
class: "truncate",
|
|
1844
1844
|
get children() {
|
|
1845
1845
|
return e.title;
|
|
1846
1846
|
}
|
|
1847
|
-
}), null),
|
|
1847
|
+
}), null), F(r, N(E, {
|
|
1848
1848
|
get when() {
|
|
1849
1849
|
return e.subtitle;
|
|
1850
1850
|
},
|
|
1851
|
-
children: (e) =>
|
|
1851
|
+
children: (e) => N(pt, {
|
|
1852
1852
|
class: "truncate font-mono",
|
|
1853
1853
|
get children() {
|
|
1854
1854
|
return e();
|
|
1855
1855
|
}
|
|
1856
1856
|
})
|
|
1857
|
-
}), null),
|
|
1857
|
+
}), null), F(n, () => e.badge, null), F(n, N(Fi, {
|
|
1858
1858
|
get label() {
|
|
1859
1859
|
return `Copy ${e.title}`;
|
|
1860
1860
|
},
|
|
1861
|
-
text: () =>
|
|
1862
|
-
}), null),
|
|
1861
|
+
text: () => Mi(e.source)
|
|
1862
|
+
}), null), F(i, () => e.children), t;
|
|
1863
1863
|
})();
|
|
1864
1864
|
}
|
|
1865
|
-
function
|
|
1866
|
-
let t = O(() => Object.entries(e.record)), n = O(() => t().flatMap(([e, t]) =>
|
|
1867
|
-
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, {
|
|
1868
1868
|
get when() {
|
|
1869
1869
|
return t().length > 0;
|
|
1870
1870
|
},
|
|
1871
1871
|
get fallback() {
|
|
1872
|
-
return
|
|
1872
|
+
return N(pt, { children: "Nothing set" });
|
|
1873
1873
|
},
|
|
1874
1874
|
get children() {
|
|
1875
|
-
return [
|
|
1875
|
+
return [N(E, {
|
|
1876
1876
|
get when() {
|
|
1877
1877
|
return n().length > 0;
|
|
1878
1878
|
},
|
|
1879
1879
|
get children() {
|
|
1880
|
-
var e =
|
|
1881
|
-
return
|
|
1880
|
+
var e = ki();
|
|
1881
|
+
return F(e, N(T, {
|
|
1882
1882
|
get each() {
|
|
1883
1883
|
return n();
|
|
1884
1884
|
},
|
|
1885
|
-
children: ([e, t]) =>
|
|
1885
|
+
children: ([e, t]) => N(H, {
|
|
1886
1886
|
get label() {
|
|
1887
|
-
return
|
|
1887
|
+
return Ii(e);
|
|
1888
1888
|
},
|
|
1889
1889
|
get children() {
|
|
1890
|
-
return
|
|
1890
|
+
return Ri(t);
|
|
1891
1891
|
}
|
|
1892
1892
|
})
|
|
1893
1893
|
})), e;
|
|
1894
1894
|
}
|
|
1895
|
-
}),
|
|
1895
|
+
}), N(T, {
|
|
1896
1896
|
get each() {
|
|
1897
1897
|
return r();
|
|
1898
1898
|
},
|
|
1899
|
-
children: ([e, t]) =>
|
|
1899
|
+
children: ([e, t]) => N(Hi, {
|
|
1900
1900
|
get label() {
|
|
1901
|
-
return
|
|
1901
|
+
return Ii(e);
|
|
1902
1902
|
},
|
|
1903
1903
|
get count() {
|
|
1904
|
-
return
|
|
1904
|
+
return zi(t);
|
|
1905
1905
|
},
|
|
1906
1906
|
value: t
|
|
1907
1907
|
})
|
|
@@ -1909,9 +1909,9 @@ function Ui(e) {
|
|
|
1909
1909
|
}
|
|
1910
1910
|
});
|
|
1911
1911
|
}
|
|
1912
|
-
function
|
|
1912
|
+
function Gi(e) {
|
|
1913
1913
|
let t = () => e.entity.attributes ?? {};
|
|
1914
|
-
return
|
|
1914
|
+
return N(Ui, {
|
|
1915
1915
|
icon: "lucide:activity",
|
|
1916
1916
|
get title() {
|
|
1917
1917
|
return e.entity.friendly_name ?? e.entity.entity_id;
|
|
@@ -1920,7 +1920,7 @@ function Wi(e) {
|
|
|
1920
1920
|
return e.entity.entity_id;
|
|
1921
1921
|
},
|
|
1922
1922
|
get badge() {
|
|
1923
|
-
return
|
|
1923
|
+
return N(we, { get children() {
|
|
1924
1924
|
return e.entity.state;
|
|
1925
1925
|
} });
|
|
1926
1926
|
},
|
|
@@ -1929,52 +1929,52 @@ function Wi(e) {
|
|
|
1929
1929
|
},
|
|
1930
1930
|
get children() {
|
|
1931
1931
|
return [(() => {
|
|
1932
|
-
var t =
|
|
1933
|
-
return
|
|
1932
|
+
var t = ki();
|
|
1933
|
+
return F(t, N(H, {
|
|
1934
1934
|
label: "Domain",
|
|
1935
1935
|
get children() {
|
|
1936
1936
|
return e.entity.domain;
|
|
1937
1937
|
}
|
|
1938
|
-
}), null),
|
|
1938
|
+
}), null), F(t, N(E, {
|
|
1939
1939
|
get when() {
|
|
1940
1940
|
return e.entity.device_class;
|
|
1941
1941
|
},
|
|
1942
|
-
children: (e) =>
|
|
1942
|
+
children: (e) => N(H, {
|
|
1943
1943
|
label: "Device class",
|
|
1944
1944
|
get children() {
|
|
1945
1945
|
return e();
|
|
1946
1946
|
}
|
|
1947
1947
|
})
|
|
1948
|
-
}), null),
|
|
1948
|
+
}), null), F(t, N(E, {
|
|
1949
1949
|
get when() {
|
|
1950
1950
|
return e.entity.area_id;
|
|
1951
1951
|
},
|
|
1952
|
-
children: (e) =>
|
|
1952
|
+
children: (e) => N(H, {
|
|
1953
1953
|
label: "Area",
|
|
1954
1954
|
get children() {
|
|
1955
1955
|
return e();
|
|
1956
1956
|
}
|
|
1957
1957
|
})
|
|
1958
|
-
}), null),
|
|
1958
|
+
}), null), F(t, N(H, {
|
|
1959
1959
|
label: "Changed",
|
|
1960
1960
|
get children() {
|
|
1961
|
-
return
|
|
1961
|
+
return Bi(e.entity.last_changed);
|
|
1962
1962
|
}
|
|
1963
|
-
}), null),
|
|
1963
|
+
}), null), F(t, N(H, {
|
|
1964
1964
|
label: "Updated",
|
|
1965
1965
|
get children() {
|
|
1966
|
-
return
|
|
1966
|
+
return Bi(e.entity.last_updated);
|
|
1967
1967
|
}
|
|
1968
1968
|
}), null), t;
|
|
1969
|
-
})(),
|
|
1969
|
+
})(), N(E, {
|
|
1970
1970
|
get when() {
|
|
1971
|
-
return
|
|
1971
|
+
return zi(t()) > 0;
|
|
1972
1972
|
},
|
|
1973
1973
|
get children() {
|
|
1974
|
-
return
|
|
1974
|
+
return N(Hi, {
|
|
1975
1975
|
label: "Attributes",
|
|
1976
1976
|
get count() {
|
|
1977
|
-
return
|
|
1977
|
+
return zi(t());
|
|
1978
1978
|
},
|
|
1979
1979
|
get value() {
|
|
1980
1980
|
return t();
|
|
@@ -1985,42 +1985,42 @@ function Wi(e) {
|
|
|
1985
1985
|
}
|
|
1986
1986
|
});
|
|
1987
1987
|
}
|
|
1988
|
-
function
|
|
1988
|
+
function Ki(e) {
|
|
1989
1989
|
let t = O(() => Object.keys(e.data).filter((e) => e !== "widgetConfig" && e !== "entities"));
|
|
1990
|
-
return
|
|
1990
|
+
return N(We, { get children() {
|
|
1991
1991
|
return [
|
|
1992
|
-
|
|
1992
|
+
N(Ui, {
|
|
1993
1993
|
icon: "lucide:sliders-horizontal",
|
|
1994
1994
|
title: "Configuration",
|
|
1995
1995
|
get source() {
|
|
1996
1996
|
return e.data.widgetConfig;
|
|
1997
1997
|
},
|
|
1998
1998
|
get children() {
|
|
1999
|
-
return
|
|
1999
|
+
return N(Wi, { get record() {
|
|
2000
2000
|
return e.data.widgetConfig;
|
|
2001
2001
|
} });
|
|
2002
2002
|
}
|
|
2003
2003
|
}),
|
|
2004
|
-
|
|
2004
|
+
N(T, {
|
|
2005
2005
|
get each() {
|
|
2006
2006
|
return e.data.entities;
|
|
2007
2007
|
},
|
|
2008
|
-
children: (e) =>
|
|
2008
|
+
children: (e) => N(Gi, { entity: e })
|
|
2009
2009
|
}),
|
|
2010
|
-
|
|
2010
|
+
N(T, {
|
|
2011
2011
|
get each() {
|
|
2012
2012
|
return t();
|
|
2013
2013
|
},
|
|
2014
|
-
children: (t) =>
|
|
2014
|
+
children: (t) => N(Ui, {
|
|
2015
2015
|
icon: "lucide:braces",
|
|
2016
2016
|
get title() {
|
|
2017
|
-
return
|
|
2017
|
+
return Ii(t);
|
|
2018
2018
|
},
|
|
2019
2019
|
get source() {
|
|
2020
2020
|
return e.data[t];
|
|
2021
2021
|
},
|
|
2022
2022
|
get children() {
|
|
2023
|
-
return
|
|
2023
|
+
return N(Vi, { get value() {
|
|
2024
2024
|
return e.data[t];
|
|
2025
2025
|
} });
|
|
2026
2026
|
}
|
|
@@ -2029,52 +2029,52 @@ function Gi(e) {
|
|
|
2029
2029
|
];
|
|
2030
2030
|
} });
|
|
2031
2031
|
}
|
|
2032
|
-
function
|
|
2032
|
+
function qi(e) {
|
|
2033
2033
|
if (typeof e != "object" || !e) return;
|
|
2034
2034
|
let t = e;
|
|
2035
2035
|
return Array.isArray(t.entities) && typeof t.widgetConfig == "object" ? t : void 0;
|
|
2036
2036
|
}
|
|
2037
|
-
function
|
|
2038
|
-
let t = O(() =>
|
|
2039
|
-
return
|
|
2037
|
+
function Ji(e) {
|
|
2038
|
+
let t = O(() => qi(e.data));
|
|
2039
|
+
return N(E, {
|
|
2040
2040
|
get when() {
|
|
2041
2041
|
return e.data !== void 0;
|
|
2042
2042
|
},
|
|
2043
2043
|
get fallback() {
|
|
2044
|
-
return
|
|
2045
|
-
return
|
|
2046
|
-
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." })];
|
|
2047
2047
|
} });
|
|
2048
2048
|
} });
|
|
2049
2049
|
},
|
|
2050
2050
|
get children() {
|
|
2051
|
-
return
|
|
2051
|
+
return N(E, {
|
|
2052
2052
|
get when() {
|
|
2053
2053
|
return t();
|
|
2054
2054
|
},
|
|
2055
2055
|
get fallback() {
|
|
2056
|
-
return
|
|
2056
|
+
return N(Ui, {
|
|
2057
2057
|
icon: "lucide:braces",
|
|
2058
2058
|
title: "Debug data",
|
|
2059
2059
|
get source() {
|
|
2060
2060
|
return e.data;
|
|
2061
2061
|
},
|
|
2062
2062
|
get children() {
|
|
2063
|
-
return
|
|
2063
|
+
return N(E, {
|
|
2064
2064
|
get when() {
|
|
2065
2065
|
return typeof e.data == "string";
|
|
2066
2066
|
},
|
|
2067
2067
|
get fallback() {
|
|
2068
|
-
return
|
|
2068
|
+
return N(Vi, { get value() {
|
|
2069
2069
|
return e.data;
|
|
2070
2070
|
} });
|
|
2071
2071
|
},
|
|
2072
2072
|
get children() {
|
|
2073
|
-
return
|
|
2073
|
+
return N(mt, {
|
|
2074
2074
|
class: "overflow-hidden p-0",
|
|
2075
2075
|
get children() {
|
|
2076
|
-
var t =
|
|
2077
|
-
return
|
|
2076
|
+
var t = Ai();
|
|
2077
|
+
return F(t, () => e.data), t;
|
|
2078
2078
|
}
|
|
2079
2079
|
});
|
|
2080
2080
|
}
|
|
@@ -2082,7 +2082,7 @@ function qi(e) {
|
|
|
2082
2082
|
}
|
|
2083
2083
|
});
|
|
2084
2084
|
},
|
|
2085
|
-
children: (e) =>
|
|
2085
|
+
children: (e) => N(Ki, { get data() {
|
|
2086
2086
|
return e();
|
|
2087
2087
|
} })
|
|
2088
2088
|
});
|
|
@@ -2091,21 +2091,21 @@ function qi(e) {
|
|
|
2091
2091
|
}
|
|
2092
2092
|
//#endregion
|
|
2093
2093
|
//#region src/framework/dialogs/validate-config.ts
|
|
2094
|
-
function
|
|
2094
|
+
function Yi(e) {
|
|
2095
2095
|
let t = "";
|
|
2096
2096
|
for (let n of e) t += typeof n == "number" ? `[${n}]` : t ? `.${String(n)}` : String(n);
|
|
2097
2097
|
return t;
|
|
2098
2098
|
}
|
|
2099
|
-
function
|
|
2099
|
+
function Xi(e, t) {
|
|
2100
2100
|
let n = e.safeParse(t);
|
|
2101
2101
|
return n.success ? null : n.error.issues.map((e) => {
|
|
2102
|
-
let t =
|
|
2102
|
+
let t = Yi(e.path);
|
|
2103
2103
|
return t ? `${t}: ${e.message}` : e.message;
|
|
2104
2104
|
});
|
|
2105
2105
|
}
|
|
2106
2106
|
//#endregion
|
|
2107
2107
|
//#region src/framework/dialogs/WidgetDialog.tsx
|
|
2108
|
-
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 = {
|
|
2109
2109
|
sm: "sm",
|
|
2110
2110
|
md: "md",
|
|
2111
2111
|
lg: "lg",
|
|
@@ -2114,24 +2114,24 @@ var Xi = /*#__PURE__*/ V("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 f
|
|
|
2114
2114
|
"2xl": "xl",
|
|
2115
2115
|
"3xl": "xl",
|
|
2116
2116
|
"4xl": "full"
|
|
2117
|
-
},
|
|
2117
|
+
}, sa = {
|
|
2118
2118
|
idle: "Copy all",
|
|
2119
2119
|
copied: "Copied",
|
|
2120
2120
|
failed: "Copy failed"
|
|
2121
2121
|
};
|
|
2122
|
-
function
|
|
2122
|
+
function ca(e) {
|
|
2123
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
2124
|
D(me(() => t.config, (e) => {
|
|
2125
2125
|
e && i({ ...e });
|
|
2126
2126
|
})), D(me(() => t.configSchema, (e) => {
|
|
2127
|
-
e && o(
|
|
2127
|
+
e && o(aa(e));
|
|
2128
2128
|
}));
|
|
2129
2129
|
let l = () => n() && JSON.stringify(r()) !== JSON.stringify(t.config), u = (e) => {
|
|
2130
2130
|
!e && t.config && (i({ ...t.config }), c([])), t.onOpenChange(e);
|
|
2131
2131
|
}, d = () => {
|
|
2132
2132
|
let e = t.configSchema;
|
|
2133
2133
|
if (e) {
|
|
2134
|
-
let t =
|
|
2134
|
+
let t = Xi(e, r());
|
|
2135
2135
|
if (t) {
|
|
2136
2136
|
c(t);
|
|
2137
2137
|
return;
|
|
@@ -2140,7 +2140,7 @@ function sa(e) {
|
|
|
2140
2140
|
c([]), t.onConfigSave?.(r());
|
|
2141
2141
|
}, [f, p] = k(t.defaultTab ?? "controls"), m = () => t.activeTab ?? f(), h = (e) => {
|
|
2142
2142
|
t.onActiveTabChange ? t.onActiveTabChange(e) : p(e);
|
|
2143
|
-
}, g = () =>
|
|
2143
|
+
}, g = () => oa[t.maxWidth ?? "xl"], _ = () => {
|
|
2144
2144
|
if (t.tabs) return t.tabs.map((e) => ({
|
|
2145
2145
|
...e,
|
|
2146
2146
|
icon: () => e.icon,
|
|
@@ -2150,10 +2150,10 @@ function sa(e) {
|
|
|
2150
2150
|
return e.push({
|
|
2151
2151
|
id: "edit",
|
|
2152
2152
|
label: "Edit",
|
|
2153
|
-
icon: () =>
|
|
2153
|
+
icon: () => Zi(),
|
|
2154
2154
|
content: () => t.editContent ?? (() => {
|
|
2155
2155
|
let e = t.SchemaForm, o = n() ? a() : void 0;
|
|
2156
|
-
return !o || !e ?
|
|
2156
|
+
return !o || !e ? Qi() : N(e, {
|
|
2157
2157
|
schema: o,
|
|
2158
2158
|
get data() {
|
|
2159
2159
|
return r();
|
|
@@ -2167,86 +2167,86 @@ function sa(e) {
|
|
|
2167
2167
|
}), e.push({
|
|
2168
2168
|
id: "controls",
|
|
2169
2169
|
label: "Controls",
|
|
2170
|
-
icon: () =>
|
|
2171
|
-
content: () => t.controlsContent ??
|
|
2172
|
-
return
|
|
2173
|
-
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." })];
|
|
2174
2174
|
} });
|
|
2175
2175
|
} })
|
|
2176
2176
|
}), e.push({
|
|
2177
2177
|
id: "debug",
|
|
2178
2178
|
label: "Debug",
|
|
2179
|
-
icon: () =>
|
|
2180
|
-
content: () => t.debugContent ??
|
|
2179
|
+
icon: () => ea(),
|
|
2180
|
+
content: () => t.debugContent ?? N(Ji, { get data() {
|
|
2181
2181
|
return t.debugData;
|
|
2182
2182
|
} })
|
|
2183
2183
|
}), e;
|
|
2184
|
-
}, v = j(W), y =
|
|
2184
|
+
}, v = j(W), y = dn(v);
|
|
2185
2185
|
D(() => y?.setHasSheet(t.sheet !== void 0)), A(() => y?.setHasSheet(!1));
|
|
2186
2186
|
let b = () => ({
|
|
2187
2187
|
icon: t.tile?.icon ?? y?.icon(),
|
|
2188
2188
|
tone: t.tile?.tone ?? y?.accent() ?? y?.tone(),
|
|
2189
2189
|
backdrop: t.tile?.backdrop
|
|
2190
|
-
}), x = () => v?.developer?.() ?? !1, S = () =>
|
|
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 = () => {
|
|
2191
2191
|
if (t.debugData === void 0) return;
|
|
2192
2192
|
let e = typeof t.debugData == "string" ? t.debugData : JSON.stringify(t.debugData, null, 2);
|
|
2193
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,
|
|
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([
|
|
2195
2195
|
() => t.open,
|
|
2196
2196
|
a,
|
|
2197
2197
|
() => t.config,
|
|
2198
2198
|
() => t.tabs
|
|
2199
|
-
], () => _())),
|
|
2200
|
-
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();
|
|
2201
2201
|
return e.some((e) => e.id === n) ? n : e[0]?.id ?? n;
|
|
2202
|
-
},
|
|
2203
|
-
return
|
|
2202
|
+
}, ye = () => V() === "edit" && (R() || t.onDelete) || V() === "debug" && t.debugData !== void 0;
|
|
2203
|
+
return N(re, {
|
|
2204
2204
|
get open() {
|
|
2205
2205
|
return t.open;
|
|
2206
2206
|
},
|
|
2207
|
-
onOpenChange: (e) =>
|
|
2207
|
+
onOpenChange: (e) => M(e),
|
|
2208
2208
|
get children() {
|
|
2209
|
-
return
|
|
2209
|
+
return N(E, {
|
|
2210
2210
|
get when() {
|
|
2211
2211
|
return !S();
|
|
2212
2212
|
},
|
|
2213
2213
|
get fallback() {
|
|
2214
|
-
return
|
|
2214
|
+
return N(ie, {
|
|
2215
2215
|
size: "sm",
|
|
2216
2216
|
get ariaLabel() {
|
|
2217
2217
|
return t.title;
|
|
2218
2218
|
},
|
|
2219
2219
|
get anchor() {
|
|
2220
|
-
return
|
|
2220
|
+
return I(() => !!w())() ? C() : void 0;
|
|
2221
2221
|
},
|
|
2222
2222
|
class: "glasshome-sheet-surface",
|
|
2223
2223
|
get style() {
|
|
2224
|
-
return
|
|
2224
|
+
return I(() => !!b().tone)() ? {
|
|
2225
2225
|
"--glass-tone": b().tone,
|
|
2226
2226
|
"--widget-color": b().tone
|
|
2227
2227
|
} : void 0;
|
|
2228
2228
|
},
|
|
2229
2229
|
get children() {
|
|
2230
2230
|
return [
|
|
2231
|
-
|
|
2231
|
+
N(E, {
|
|
2232
2232
|
get when() {
|
|
2233
2233
|
return b().backdrop;
|
|
2234
2234
|
},
|
|
2235
2235
|
children: (e) => (() => {
|
|
2236
|
-
var t =
|
|
2237
|
-
return
|
|
2236
|
+
var t = na(), n = t.firstChild;
|
|
2237
|
+
return P(() => L(n, "src", e())), t;
|
|
2238
2238
|
})()
|
|
2239
2239
|
}),
|
|
2240
|
-
|
|
2240
|
+
N(ae, {
|
|
2241
2241
|
class: "items-center",
|
|
2242
2242
|
get media() {
|
|
2243
|
-
return
|
|
2243
|
+
return N(E, {
|
|
2244
2244
|
get when() {
|
|
2245
2245
|
return b().icon;
|
|
2246
2246
|
},
|
|
2247
2247
|
children: (e) => (() => {
|
|
2248
|
-
var t =
|
|
2249
|
-
return
|
|
2248
|
+
var t = ra();
|
|
2249
|
+
return F(t, N(U, {
|
|
2250
2250
|
get icon() {
|
|
2251
2251
|
return e();
|
|
2252
2252
|
},
|
|
@@ -2256,7 +2256,7 @@ function sa(e) {
|
|
|
2256
2256
|
});
|
|
2257
2257
|
},
|
|
2258
2258
|
get children() {
|
|
2259
|
-
return
|
|
2259
|
+
return N(oe, {
|
|
2260
2260
|
class: "truncate",
|
|
2261
2261
|
get children() {
|
|
2262
2262
|
return t.title;
|
|
@@ -2264,16 +2264,16 @@ function sa(e) {
|
|
|
2264
2264
|
});
|
|
2265
2265
|
}
|
|
2266
2266
|
}),
|
|
2267
|
-
|
|
2268
|
-
var e =
|
|
2269
|
-
return
|
|
2267
|
+
N(ce, { get children() {
|
|
2268
|
+
var e = ta();
|
|
2269
|
+
return F(e, () => t.sheet?.()), e;
|
|
2270
2270
|
} })
|
|
2271
2271
|
];
|
|
2272
2272
|
}
|
|
2273
2273
|
});
|
|
2274
2274
|
},
|
|
2275
2275
|
get children() {
|
|
2276
|
-
return
|
|
2276
|
+
return N(ie, {
|
|
2277
2277
|
get size() {
|
|
2278
2278
|
return g();
|
|
2279
2279
|
},
|
|
@@ -2281,70 +2281,70 @@ function sa(e) {
|
|
|
2281
2281
|
return t.class;
|
|
2282
2282
|
},
|
|
2283
2283
|
get children() {
|
|
2284
|
-
return
|
|
2284
|
+
return N(ue, {
|
|
2285
2285
|
get value() {
|
|
2286
|
-
return
|
|
2286
|
+
return V();
|
|
2287
2287
|
},
|
|
2288
2288
|
onChange: h,
|
|
2289
2289
|
layout: "split",
|
|
2290
2290
|
get children() {
|
|
2291
2291
|
return [
|
|
2292
|
-
|
|
2292
|
+
N(ae, {
|
|
2293
2293
|
class: "flex-wrap",
|
|
2294
2294
|
get action() {
|
|
2295
|
-
return [
|
|
2295
|
+
return [N(E, {
|
|
2296
2296
|
get when() {
|
|
2297
2297
|
return x() || t.tabs !== void 0;
|
|
2298
2298
|
},
|
|
2299
2299
|
get children() {
|
|
2300
|
-
return
|
|
2300
|
+
return N(de, {
|
|
2301
2301
|
class: "w-auto",
|
|
2302
2302
|
get children() {
|
|
2303
|
-
return
|
|
2303
|
+
return N(T, {
|
|
2304
2304
|
get each() {
|
|
2305
|
-
return
|
|
2305
|
+
return B();
|
|
2306
2306
|
},
|
|
2307
|
-
children: (e) =>
|
|
2307
|
+
children: (e) => N(fe, {
|
|
2308
2308
|
get value() {
|
|
2309
2309
|
return e.id;
|
|
2310
2310
|
},
|
|
2311
2311
|
get children() {
|
|
2312
2312
|
return [(() => {
|
|
2313
|
-
var t =
|
|
2314
|
-
return
|
|
2315
|
-
})(),
|
|
2313
|
+
var t = ia();
|
|
2314
|
+
return F(t, () => e.icon()), t;
|
|
2315
|
+
})(), I(() => e.label)];
|
|
2316
2316
|
}
|
|
2317
2317
|
})
|
|
2318
2318
|
});
|
|
2319
2319
|
}
|
|
2320
2320
|
});
|
|
2321
2321
|
}
|
|
2322
|
-
}),
|
|
2322
|
+
}), I(() => t.headerActions)];
|
|
2323
2323
|
},
|
|
2324
2324
|
get children() {
|
|
2325
|
-
return [
|
|
2325
|
+
return [N(oe, {
|
|
2326
2326
|
class: "truncate",
|
|
2327
2327
|
get children() {
|
|
2328
2328
|
return t.title;
|
|
2329
2329
|
}
|
|
2330
|
-
}),
|
|
2330
|
+
}), N(E, {
|
|
2331
2331
|
get when() {
|
|
2332
2332
|
return t.description;
|
|
2333
2333
|
},
|
|
2334
2334
|
get children() {
|
|
2335
|
-
return
|
|
2335
|
+
return N(se, { get children() {
|
|
2336
2336
|
return t.description;
|
|
2337
2337
|
} });
|
|
2338
2338
|
}
|
|
2339
2339
|
})];
|
|
2340
2340
|
}
|
|
2341
2341
|
}),
|
|
2342
|
-
|
|
2343
|
-
return
|
|
2342
|
+
N(ce, { get children() {
|
|
2343
|
+
return N(T, {
|
|
2344
2344
|
get each() {
|
|
2345
|
-
return
|
|
2345
|
+
return z();
|
|
2346
2346
|
},
|
|
2347
|
-
children: (e) =>
|
|
2347
|
+
children: (e) => N(pe, {
|
|
2348
2348
|
get value() {
|
|
2349
2349
|
return e.id;
|
|
2350
2350
|
},
|
|
@@ -2354,19 +2354,19 @@ function sa(e) {
|
|
|
2354
2354
|
})
|
|
2355
2355
|
});
|
|
2356
2356
|
} }),
|
|
2357
|
-
|
|
2357
|
+
N(E, {
|
|
2358
2358
|
get when() {
|
|
2359
|
-
return
|
|
2359
|
+
return ye();
|
|
2360
2360
|
},
|
|
2361
2361
|
get children() {
|
|
2362
|
-
return
|
|
2362
|
+
return N(le, { get children() {
|
|
2363
2363
|
return [
|
|
2364
|
-
|
|
2364
|
+
N(E, {
|
|
2365
2365
|
get when() {
|
|
2366
|
-
return
|
|
2366
|
+
return I(() => V() === "edit")() && t.onDelete;
|
|
2367
2367
|
},
|
|
2368
2368
|
get children() {
|
|
2369
|
-
return
|
|
2369
|
+
return N(he, {
|
|
2370
2370
|
size: "sm",
|
|
2371
2371
|
variant: "destructive",
|
|
2372
2372
|
onClick: () => t.onDelete?.(),
|
|
@@ -2374,32 +2374,32 @@ function sa(e) {
|
|
|
2374
2374
|
});
|
|
2375
2375
|
}
|
|
2376
2376
|
}),
|
|
2377
|
-
|
|
2377
|
+
N(E, {
|
|
2378
2378
|
get when() {
|
|
2379
|
-
return
|
|
2379
|
+
return I(() => V() === "edit")() && R();
|
|
2380
2380
|
},
|
|
2381
2381
|
get children() {
|
|
2382
|
-
return
|
|
2382
|
+
return N(he, {
|
|
2383
2383
|
size: "sm",
|
|
2384
2384
|
get disabled() {
|
|
2385
|
-
return !
|
|
2385
|
+
return !ve();
|
|
2386
2386
|
},
|
|
2387
|
-
onClick: () =>
|
|
2387
|
+
onClick: () => R()?.(),
|
|
2388
2388
|
children: "Save"
|
|
2389
2389
|
});
|
|
2390
2390
|
}
|
|
2391
2391
|
}),
|
|
2392
|
-
|
|
2392
|
+
N(E, {
|
|
2393
2393
|
get when() {
|
|
2394
|
-
return
|
|
2394
|
+
return I(() => V() === "debug")() && t.debugData !== void 0;
|
|
2395
2395
|
},
|
|
2396
2396
|
get children() {
|
|
2397
|
-
return
|
|
2397
|
+
return N(he, {
|
|
2398
2398
|
size: "sm",
|
|
2399
2399
|
variant: "outline",
|
|
2400
2400
|
onClick: ne,
|
|
2401
2401
|
get children() {
|
|
2402
|
-
return
|
|
2402
|
+
return sa[te.state()];
|
|
2403
2403
|
}
|
|
2404
2404
|
});
|
|
2405
2405
|
}
|
|
@@ -2418,7 +2418,7 @@ function sa(e) {
|
|
|
2418
2418
|
}
|
|
2419
2419
|
});
|
|
2420
2420
|
}
|
|
2421
|
-
function
|
|
2421
|
+
function la() {
|
|
2422
2422
|
let e = "(max-width: 639px)", [t, n] = k(typeof window < "u" && window.matchMedia(e).matches);
|
|
2423
2423
|
return he(() => {
|
|
2424
2424
|
let t = window.matchMedia(e), r = () => n(t.matches);
|
|
@@ -2427,77 +2427,77 @@ function ca() {
|
|
|
2427
2427
|
}
|
|
2428
2428
|
//#endregion
|
|
2429
2429
|
//#region src/framework/hooks/use-widget-dashboard.ts
|
|
2430
|
-
var
|
|
2430
|
+
var ua = {
|
|
2431
2431
|
name: "",
|
|
2432
2432
|
icon: "",
|
|
2433
2433
|
areaId: null
|
|
2434
2434
|
};
|
|
2435
|
-
function
|
|
2435
|
+
function da() {
|
|
2436
2436
|
let e = j(W);
|
|
2437
|
-
return () => e?.dashboard?.() ??
|
|
2437
|
+
return () => e?.dashboard?.() ?? ua;
|
|
2438
2438
|
}
|
|
2439
2439
|
//#endregion
|
|
2440
2440
|
//#region src/framework/hooks/use-widget-viewer.ts
|
|
2441
|
-
var
|
|
2442
|
-
function
|
|
2441
|
+
var fa = { name: null };
|
|
2442
|
+
function pa() {
|
|
2443
2443
|
let e = j(W);
|
|
2444
|
-
return () => e?.viewer?.() ??
|
|
2444
|
+
return () => e?.viewer?.() ?? fa;
|
|
2445
2445
|
}
|
|
2446
2446
|
//#endregion
|
|
2447
2447
|
//#region node_modules/@glasshome/ui/dist/tokens/index.js
|
|
2448
|
-
var
|
|
2449
|
-
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) {
|
|
2450
2450
|
return Math.min(Math.max(e, t), n);
|
|
2451
2451
|
}
|
|
2452
|
-
function
|
|
2452
|
+
function ga(e) {
|
|
2453
2453
|
return String(Number.isInteger(e) ? e : Number(e.toFixed(6)));
|
|
2454
2454
|
}
|
|
2455
|
-
function
|
|
2456
|
-
let t =
|
|
2455
|
+
function _a(e) {
|
|
2456
|
+
let t = ma.exec(e.trim());
|
|
2457
2457
|
return t ? {
|
|
2458
2458
|
l: Number(t[1]),
|
|
2459
2459
|
c: Number(t[2]),
|
|
2460
2460
|
h: Number(t[3])
|
|
2461
2461
|
} : null;
|
|
2462
2462
|
}
|
|
2463
|
-
function
|
|
2464
|
-
return `oklch(${
|
|
2465
|
-
}
|
|
2466
|
-
function va(e, t) {
|
|
2467
|
-
let n = ga(e);
|
|
2468
|
-
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)})`;
|
|
2469
2465
|
}
|
|
2470
2466
|
function ya(e, t) {
|
|
2471
|
-
let n =
|
|
2472
|
-
return n ?
|
|
2467
|
+
let n = _a(e);
|
|
2468
|
+
return n ? va(ha(n.l + t, 0, 1), n.c, n.h) : e;
|
|
2473
2469
|
}
|
|
2474
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) {
|
|
2475
2475
|
return {
|
|
2476
2476
|
...e,
|
|
2477
2477
|
popover: e.card,
|
|
2478
|
-
muted: t === "light" ?
|
|
2478
|
+
muted: t === "light" ? ya(e.background, -.015) : ya(e.background, .1),
|
|
2479
2479
|
mutedForeground: t === "light" ? "oklch(0.44 0 0)" : "oklch(0.71 0 0)",
|
|
2480
|
-
input: t === "light" ?
|
|
2480
|
+
input: t === "light" ? ya(e.border, .01) : ya(e.border, .04),
|
|
2481
2481
|
ring: e.accent,
|
|
2482
2482
|
destructive: t === "light" ? "oklch(0.54 0.19 23.0704)" : "oklch(0.7106 0.1661 22.2162)"
|
|
2483
2483
|
};
|
|
2484
2484
|
}
|
|
2485
|
-
function
|
|
2486
|
-
return
|
|
2487
|
-
primary:
|
|
2488
|
-
accent:
|
|
2489
|
-
secondary:
|
|
2490
|
-
border:
|
|
2491
|
-
card:
|
|
2492
|
-
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)
|
|
2493
2493
|
}, "dark");
|
|
2494
2494
|
}
|
|
2495
|
-
var
|
|
2495
|
+
var Ca = {
|
|
2496
2496
|
edgeWidth: 1,
|
|
2497
2497
|
edgeInk: 0,
|
|
2498
2498
|
edgeAccent: 0,
|
|
2499
2499
|
inkLift: 0
|
|
2500
|
-
},
|
|
2500
|
+
}, wa = {
|
|
2501
2501
|
frosted: {
|
|
2502
2502
|
blur: 24,
|
|
2503
2503
|
clarity: 60,
|
|
@@ -2505,7 +2505,7 @@ var Sa = {
|
|
|
2505
2505
|
tint: 1,
|
|
2506
2506
|
glow: 0,
|
|
2507
2507
|
ink: 0,
|
|
2508
|
-
...
|
|
2508
|
+
...Ca
|
|
2509
2509
|
},
|
|
2510
2510
|
frost: {
|
|
2511
2511
|
blur: 24,
|
|
@@ -2514,7 +2514,7 @@ var Sa = {
|
|
|
2514
2514
|
tint: 1,
|
|
2515
2515
|
glow: 0,
|
|
2516
2516
|
ink: 0,
|
|
2517
|
-
...
|
|
2517
|
+
...Ca,
|
|
2518
2518
|
grain: .4
|
|
2519
2519
|
},
|
|
2520
2520
|
paper: {
|
|
@@ -2524,7 +2524,7 @@ var Sa = {
|
|
|
2524
2524
|
tint: .85,
|
|
2525
2525
|
glow: 0,
|
|
2526
2526
|
ink: 0,
|
|
2527
|
-
...
|
|
2527
|
+
...Ca,
|
|
2528
2528
|
edgeInk: .3,
|
|
2529
2529
|
sheen: 0,
|
|
2530
2530
|
edge: .2,
|
|
@@ -2554,13 +2554,13 @@ var Sa = {
|
|
|
2554
2554
|
tint: .7,
|
|
2555
2555
|
glow: 0,
|
|
2556
2556
|
ink: 1,
|
|
2557
|
-
...
|
|
2557
|
+
...Ca,
|
|
2558
2558
|
inkLift: 1
|
|
2559
2559
|
}
|
|
2560
|
-
},
|
|
2560
|
+
}, Ta = {
|
|
2561
2561
|
v: 1,
|
|
2562
2562
|
preset: "frosted"
|
|
2563
|
-
},
|
|
2563
|
+
}, Ea = {
|
|
2564
2564
|
blur: [0, 48],
|
|
2565
2565
|
clarity: [0, 100],
|
|
2566
2566
|
depth: [0, 2],
|
|
@@ -2580,7 +2580,7 @@ var Sa = {
|
|
|
2580
2580
|
washAngle: [0, 360],
|
|
2581
2581
|
relief: [0, 2],
|
|
2582
2582
|
fill: [0, .6]
|
|
2583
|
-
},
|
|
2583
|
+
}, Da = {
|
|
2584
2584
|
vibrancy: 1,
|
|
2585
2585
|
inset: 0,
|
|
2586
2586
|
lightFrom: 315,
|
|
@@ -2596,10 +2596,10 @@ var Sa = {
|
|
|
2596
2596
|
relief: 1,
|
|
2597
2597
|
accent: "theme",
|
|
2598
2598
|
fill: 0
|
|
2599
|
-
},
|
|
2600
|
-
function
|
|
2601
|
-
let { edgeWidth: t, edgeInk: n, edgeAccent: r, inkLift: i, ...a } =
|
|
2602
|
-
...
|
|
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,
|
|
2603
2603
|
...a,
|
|
2604
2604
|
...e.dials
|
|
2605
2605
|
}, s = {
|
|
@@ -2608,7 +2608,7 @@ function Oa(e) {
|
|
|
2608
2608
|
sheen: o.sheen ?? o.depth,
|
|
2609
2609
|
shadow: o.shadow ?? o.depth
|
|
2610
2610
|
};
|
|
2611
|
-
for (let e of
|
|
2611
|
+
for (let e of Oa) s[e] = ha(s[e], ...Ea[e]);
|
|
2612
2612
|
return s;
|
|
2613
2613
|
}
|
|
2614
2614
|
function Z(e, t) {
|
|
@@ -2635,8 +2635,8 @@ function Q(e, t, n, r, i, a, o, s) {
|
|
|
2635
2635
|
swatch: r,
|
|
2636
2636
|
material: s,
|
|
2637
2637
|
colors: {
|
|
2638
|
-
light:
|
|
2639
|
-
dark: o ?
|
|
2638
|
+
light: xa(i, "light"),
|
|
2639
|
+
dark: o ? xa(o, "dark") : Sa(i)
|
|
2640
2640
|
},
|
|
2641
2641
|
background: a
|
|
2642
2642
|
};
|
|
@@ -2804,17 +2804,17 @@ Z("glass-house", {
|
|
|
2804
2804
|
});
|
|
2805
2805
|
//#endregion
|
|
2806
2806
|
//#region src/framework/hooks/use-material.ts
|
|
2807
|
-
var
|
|
2808
|
-
id:
|
|
2809
|
-
terms:
|
|
2807
|
+
var Aa = {
|
|
2808
|
+
id: Ta.preset,
|
|
2809
|
+
terms: ka(Ta)
|
|
2810
2810
|
};
|
|
2811
|
-
function
|
|
2811
|
+
function ja() {
|
|
2812
2812
|
let e = j(W);
|
|
2813
|
-
return () => e?.material?.() ??
|
|
2813
|
+
return () => e?.material?.() ?? Aa;
|
|
2814
2814
|
}
|
|
2815
2815
|
//#endregion
|
|
2816
2816
|
//#region src/framework/hooks/use-intersection-pause.ts
|
|
2817
|
-
function
|
|
2817
|
+
function Ma(e) {
|
|
2818
2818
|
if (typeof IntersectionObserver > "u") return () => !1;
|
|
2819
2819
|
let [t, n] = k(!1), r = new IntersectionObserver((e) => {
|
|
2820
2820
|
let t = e[0];
|
|
@@ -2827,40 +2827,40 @@ function ja(e) {
|
|
|
2827
2827
|
}
|
|
2828
2828
|
//#endregion
|
|
2829
2829
|
//#region src/framework/hooks/use-daylight.ts
|
|
2830
|
-
var
|
|
2831
|
-
function
|
|
2830
|
+
var Na = -6, Pa = 864e5;
|
|
2831
|
+
function Fa(e, t) {
|
|
2832
2832
|
let n = e.next_rising ? Date.parse(e.next_rising) : NaN, r = e.next_setting ? Date.parse(e.next_setting) : NaN;
|
|
2833
2833
|
if (!Number.isFinite(n) || !Number.isFinite(r)) return;
|
|
2834
|
-
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;
|
|
2835
2835
|
if (!(o <= 0)) return Math.min(1, Math.max(0, (t.getTime() - i) / o));
|
|
2836
2836
|
}
|
|
2837
|
-
var
|
|
2838
|
-
function
|
|
2837
|
+
var Ia = 20, La = 7;
|
|
2838
|
+
function Ra(e, t) {
|
|
2839
2839
|
if (e && (e.state === "above_horizon" || e.state === "below_horizon")) {
|
|
2840
|
-
let n = e.elevation, r = e.state === "above_horizon" ? "day" : n !== void 0 && n >
|
|
2840
|
+
let n = e.elevation, r = e.state === "above_horizon" ? "day" : n !== void 0 && n > Na ? e.rising ? "dawn" : "dusk" : "night";
|
|
2841
2841
|
return {
|
|
2842
2842
|
phase: r,
|
|
2843
2843
|
isNight: r === "night",
|
|
2844
2844
|
elevation: n,
|
|
2845
|
-
progress:
|
|
2845
|
+
progress: Fa(e, t)
|
|
2846
2846
|
};
|
|
2847
2847
|
}
|
|
2848
|
-
let n = t.getHours(), r = n >=
|
|
2848
|
+
let n = t.getHours(), r = n >= Ia || n < La ? "night" : "day";
|
|
2849
2849
|
return {
|
|
2850
2850
|
phase: r,
|
|
2851
2851
|
isNight: r === "night"
|
|
2852
2852
|
};
|
|
2853
2853
|
}
|
|
2854
|
-
var [
|
|
2855
|
-
function
|
|
2856
|
-
return
|
|
2857
|
-
|
|
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);
|
|
2858
2858
|
};
|
|
2859
2859
|
}
|
|
2860
|
-
function
|
|
2860
|
+
function Wa() {
|
|
2861
2861
|
let e = C("sun.sun");
|
|
2862
2862
|
return D(() => {
|
|
2863
|
-
e() || A(
|
|
2863
|
+
e() || A(Ua());
|
|
2864
2864
|
}), O(() => {
|
|
2865
2865
|
let t = e(), n = t ? {
|
|
2866
2866
|
state: t.state,
|
|
@@ -2869,26 +2869,26 @@ function Ua() {
|
|
|
2869
2869
|
next_rising: t.attributes?.next_rising,
|
|
2870
2870
|
next_setting: t.attributes?.next_setting
|
|
2871
2871
|
} : void 0;
|
|
2872
|
-
return
|
|
2872
|
+
return Ra(n, n ? /* @__PURE__ */ new Date() : za());
|
|
2873
2873
|
});
|
|
2874
2874
|
}
|
|
2875
2875
|
//#endregion
|
|
2876
2876
|
//#region src/framework/hooks/use-reduced-motion.ts
|
|
2877
|
-
function
|
|
2877
|
+
function Ga() {
|
|
2878
2878
|
if (typeof window > "u" || typeof window.matchMedia != "function") return () => !1;
|
|
2879
2879
|
let e = window.matchMedia("(prefers-reduced-motion: reduce)"), [t, n] = k(e.matches), r = (e) => n(e.matches);
|
|
2880
2880
|
return e.addEventListener("change", r), A(() => e.removeEventListener("change", r)), t;
|
|
2881
2881
|
}
|
|
2882
2882
|
//#endregion
|
|
2883
2883
|
//#region src/framework/hooks/use-widget-entity-group.ts
|
|
2884
|
-
function
|
|
2884
|
+
function Ka(e) {
|
|
2885
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(() => {
|
|
2886
2886
|
if (!r()) return;
|
|
2887
2887
|
let t = e.aggregationMode?.();
|
|
2888
2888
|
if (!t || t === "none") return;
|
|
2889
2889
|
let n = e.entities();
|
|
2890
|
-
if (t === "light" || t === "binary-sensor" || t === "switch") return
|
|
2891
|
-
if (t === "sensor") return
|
|
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
2892
|
}), o = O(() => r() ? void 0 : e.emptyStateConfig);
|
|
2893
2893
|
return {
|
|
2894
2894
|
entities: e.entities,
|
|
@@ -2901,7 +2901,7 @@ function Ga(e) {
|
|
|
2901
2901
|
}
|
|
2902
2902
|
//#endregion
|
|
2903
2903
|
//#region src/framework/theming/svg-colors.ts
|
|
2904
|
-
var
|
|
2904
|
+
var qa = {
|
|
2905
2905
|
solar: "oklch(0.74 0.18 60)",
|
|
2906
2906
|
grid: "oklch(0.62 0.12 245)",
|
|
2907
2907
|
battery: "oklch(0.70 0.18 145)",
|
|
@@ -2910,21 +2910,21 @@ var Ka = {
|
|
|
2910
2910
|
positive: "oklch(0.70 0.14 160)",
|
|
2911
2911
|
negative: "oklch(0.64 0.22 27)"
|
|
2912
2912
|
};
|
|
2913
|
-
function
|
|
2913
|
+
function Ja(e) {
|
|
2914
2914
|
return {
|
|
2915
2915
|
fill: `color-mix(in oklch, ${e} 20%, transparent)`,
|
|
2916
2916
|
stroke: e,
|
|
2917
2917
|
solid: e
|
|
2918
2918
|
};
|
|
2919
2919
|
}
|
|
2920
|
-
var
|
|
2920
|
+
var Ya = Object.fromEntries(Object.entries(qa).map(([e, t]) => [e, Ja(t)])), Xa = o.enum([
|
|
2921
2921
|
"success",
|
|
2922
2922
|
"warning",
|
|
2923
2923
|
"danger",
|
|
2924
2924
|
"info",
|
|
2925
2925
|
"neutral",
|
|
2926
2926
|
"accent"
|
|
2927
|
-
]),
|
|
2927
|
+
]), Za = {
|
|
2928
2928
|
title: e(() => o.string().optional().meta({
|
|
2929
2929
|
title: "Title",
|
|
2930
2930
|
description: "Optional display name override"
|
|
@@ -2944,38 +2944,38 @@ var Ja = Object.fromEntries(Object.entries(Ka).map(([e, t]) => [e, qa(t)])), Ya
|
|
|
2944
2944
|
formType: "area-picker",
|
|
2945
2945
|
title: "Area"
|
|
2946
2946
|
}), "widgetFields.areaId")
|
|
2947
|
-
},
|
|
2947
|
+
}, Qa = 24;
|
|
2948
2948
|
function $(e) {
|
|
2949
2949
|
let t = {};
|
|
2950
2950
|
for (let [n, r] of Object.entries(e)) r !== void 0 && (t[n] = r);
|
|
2951
2951
|
return t;
|
|
2952
2952
|
}
|
|
2953
|
-
function
|
|
2953
|
+
function $a() {
|
|
2954
2954
|
return o.string().optional().meta({
|
|
2955
2955
|
title: "Title",
|
|
2956
2956
|
description: "Optional display name override"
|
|
2957
2957
|
});
|
|
2958
2958
|
}
|
|
2959
|
-
function
|
|
2959
|
+
function eo(e) {
|
|
2960
2960
|
return (e.default === void 0 ? o.string().optional() : o.string().default(e.default)).meta($({
|
|
2961
2961
|
title: e.title,
|
|
2962
2962
|
description: e.description
|
|
2963
2963
|
}));
|
|
2964
2964
|
}
|
|
2965
|
-
function
|
|
2965
|
+
function to(e) {
|
|
2966
2966
|
let t = o.number();
|
|
2967
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($({
|
|
2968
2968
|
title: e.title,
|
|
2969
2969
|
description: e.description
|
|
2970
2970
|
}));
|
|
2971
2971
|
}
|
|
2972
|
-
function
|
|
2972
|
+
function no(e) {
|
|
2973
2973
|
return o.boolean().default(e.default ?? !1).meta($({
|
|
2974
2974
|
title: e.title,
|
|
2975
2975
|
description: e.description
|
|
2976
2976
|
}));
|
|
2977
2977
|
}
|
|
2978
|
-
function
|
|
2978
|
+
function ro(e, t) {
|
|
2979
2979
|
let n = o.enum(e);
|
|
2980
2980
|
return (t.default === void 0 ? n.optional() : n.default(t.default)).meta($({
|
|
2981
2981
|
title: t.title,
|
|
@@ -2984,14 +2984,14 @@ function no(e, t) {
|
|
|
2984
2984
|
icons: t.icons
|
|
2985
2985
|
}));
|
|
2986
2986
|
}
|
|
2987
|
-
function
|
|
2987
|
+
function io(e, t) {
|
|
2988
2988
|
return o.array(o.enum(e)).default([...t.default ?? []]).meta($({
|
|
2989
2989
|
title: t.title,
|
|
2990
2990
|
description: t.description,
|
|
2991
2991
|
labels: t.labels
|
|
2992
2992
|
}));
|
|
2993
2993
|
}
|
|
2994
|
-
function
|
|
2994
|
+
function ao(e, t) {
|
|
2995
2995
|
return o.array(o.string()).default([]).meta($({
|
|
2996
2996
|
domain: e,
|
|
2997
2997
|
title: t?.title ?? "Entities",
|
|
@@ -2999,7 +2999,7 @@ function io(e, t) {
|
|
|
2999
2999
|
deviceClass: t?.deviceClass
|
|
3000
3000
|
}));
|
|
3001
3001
|
}
|
|
3002
|
-
function
|
|
3002
|
+
function oo(e, t) {
|
|
3003
3003
|
return o.array(o.string()).default([]).meta($({
|
|
3004
3004
|
domain: e,
|
|
3005
3005
|
title: t?.title ?? "Entity",
|
|
@@ -3008,13 +3008,13 @@ function ao(e, t) {
|
|
|
3008
3008
|
singleSelect: !0
|
|
3009
3009
|
}));
|
|
3010
3010
|
}
|
|
3011
|
-
function
|
|
3011
|
+
function so(e) {
|
|
3012
3012
|
return o.string().optional().meta({
|
|
3013
3013
|
formType: "area-picker",
|
|
3014
3014
|
title: e?.title ?? "Area"
|
|
3015
3015
|
});
|
|
3016
3016
|
}
|
|
3017
|
-
function
|
|
3017
|
+
function co(e) {
|
|
3018
3018
|
let t = o.string().meta($({
|
|
3019
3019
|
formType: "icon-picker",
|
|
3020
3020
|
title: e?.title ?? "Icon",
|
|
@@ -3022,7 +3022,7 @@ function so(e) {
|
|
|
3022
3022
|
}));
|
|
3023
3023
|
return e?.default === void 0 ? t.optional() : t.default(e.default);
|
|
3024
3024
|
}
|
|
3025
|
-
function
|
|
3025
|
+
function lo(e) {
|
|
3026
3026
|
let t = e?.presets && Object.fromEntries(Object.entries(e.presets).map(([e, t]) => [e, {
|
|
3027
3027
|
label: t.label,
|
|
3028
3028
|
thumb: t.thumb
|
|
@@ -3034,36 +3034,36 @@ function co(e) {
|
|
|
3034
3034
|
}));
|
|
3035
3035
|
return e?.default === void 0 ? n.optional() : n.default(e.default);
|
|
3036
3036
|
}
|
|
3037
|
-
function
|
|
3037
|
+
function uo(e) {
|
|
3038
3038
|
return o.array(o.string()).default([]).meta($({
|
|
3039
3039
|
title: e.title,
|
|
3040
3040
|
description: e.description
|
|
3041
3041
|
}));
|
|
3042
3042
|
}
|
|
3043
|
-
function
|
|
3043
|
+
function fo(e, t) {
|
|
3044
3044
|
let n = o.object(e);
|
|
3045
|
-
return n.default(
|
|
3045
|
+
return n.default(Xt(n)).meta({ title: t.title });
|
|
3046
3046
|
}
|
|
3047
|
-
function
|
|
3047
|
+
function po(e) {
|
|
3048
3048
|
return e.def;
|
|
3049
3049
|
}
|
|
3050
|
-
function
|
|
3050
|
+
function mo(e) {
|
|
3051
3051
|
if (o.globalRegistry.get(e)?.formType === "list") return !0;
|
|
3052
|
-
let t =
|
|
3053
|
-
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;
|
|
3054
3054
|
}
|
|
3055
|
-
function
|
|
3056
|
-
let t = e, n =
|
|
3057
|
-
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;
|
|
3058
3058
|
return t;
|
|
3059
3059
|
}
|
|
3060
|
-
function
|
|
3061
|
-
let t =
|
|
3060
|
+
function go(e) {
|
|
3061
|
+
let t = po(ho(e));
|
|
3062
3062
|
if (t.shape) return new Set(Object.keys(t.shape));
|
|
3063
3063
|
if (t.options) {
|
|
3064
3064
|
let e = [];
|
|
3065
3065
|
for (let n of t.options) {
|
|
3066
|
-
let t =
|
|
3066
|
+
let t = go(n);
|
|
3067
3067
|
if (!t) return null;
|
|
3068
3068
|
e.push(t);
|
|
3069
3069
|
}
|
|
@@ -3075,7 +3075,7 @@ function ho(e) {
|
|
|
3075
3075
|
}
|
|
3076
3076
|
return null;
|
|
3077
3077
|
}
|
|
3078
|
-
function
|
|
3078
|
+
function _o(e, t, n) {
|
|
3079
3079
|
let r = { [t]: n };
|
|
3080
3080
|
try {
|
|
3081
3081
|
return e.parse(r);
|
|
@@ -3083,12 +3083,12 @@ function go(e, t, n) {
|
|
|
3083
3083
|
return r;
|
|
3084
3084
|
}
|
|
3085
3085
|
}
|
|
3086
|
-
function
|
|
3086
|
+
function vo(e, t) {
|
|
3087
3087
|
if (!Number.isInteger(t.max) || t.max < 1) throw Error(`field.list: max must be a positive integer, got ${t.max}`);
|
|
3088
|
-
if (t.max >
|
|
3088
|
+
if (t.max > Qa) throw Error(`field.list: max ${t.max} exceeds the ceiling of ${Qa}`);
|
|
3089
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}`);
|
|
3090
|
-
if (
|
|
3091
|
-
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`);
|
|
3092
3092
|
let n = o.array(e);
|
|
3093
3093
|
return t.min !== void 0 && (n = n.min(t.min)), n = n.max(t.max), n.default([]).meta($({
|
|
3094
3094
|
formType: "list",
|
|
@@ -3098,7 +3098,7 @@ function _o(e, t) {
|
|
|
3098
3098
|
labelField: t.labelField
|
|
3099
3099
|
}));
|
|
3100
3100
|
}
|
|
3101
|
-
function
|
|
3101
|
+
function yo(e, t, n) {
|
|
3102
3102
|
let r = Object.keys(t)[0];
|
|
3103
3103
|
if (r === void 0) throw Error("field.variants: at least one variant is required");
|
|
3104
3104
|
if (n.shared && e in n.shared) throw Error(`field.variants: shared fields cannot redefine the discriminator "${e}"`);
|
|
@@ -3111,7 +3111,7 @@ function vo(e, t, n) {
|
|
|
3111
3111
|
...r,
|
|
3112
3112
|
[e]: o.literal(t)
|
|
3113
3113
|
})), a = o.discriminatedUnion(e, i), s = i[0];
|
|
3114
|
-
return a.default(s ?
|
|
3114
|
+
return a.default(s ? _o(s, e, r) : {}).meta($({
|
|
3115
3115
|
formType: "variants",
|
|
3116
3116
|
discriminator: e,
|
|
3117
3117
|
title: n.title,
|
|
@@ -3119,35 +3119,35 @@ function vo(e, t, n) {
|
|
|
3119
3119
|
labels: n.labels
|
|
3120
3120
|
}));
|
|
3121
3121
|
}
|
|
3122
|
-
var
|
|
3123
|
-
title:
|
|
3124
|
-
text:
|
|
3125
|
-
number:
|
|
3126
|
-
toggle:
|
|
3127
|
-
choice:
|
|
3128
|
-
choices:
|
|
3129
|
-
entities:
|
|
3130
|
-
entity:
|
|
3131
|
-
area:
|
|
3132
|
-
icon:
|
|
3133
|
-
image:
|
|
3134
|
-
stringList:
|
|
3135
|
-
group:
|
|
3136
|
-
list:
|
|
3137
|
-
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
|
|
3138
3138
|
};
|
|
3139
|
-
function
|
|
3139
|
+
function xo(e) {
|
|
3140
3140
|
return o.object(e);
|
|
3141
3141
|
}
|
|
3142
3142
|
//#endregion
|
|
3143
3143
|
//#region src/framework/image-src.ts
|
|
3144
|
-
function
|
|
3144
|
+
function So(e, t) {
|
|
3145
3145
|
let n = Bt(e);
|
|
3146
3146
|
return n === void 0 ? Ht(e) : t?.[n]?.src;
|
|
3147
3147
|
}
|
|
3148
3148
|
//#endregion
|
|
3149
3149
|
//#region src/shared/spline.ts
|
|
3150
|
-
function
|
|
3150
|
+
function Co(e) {
|
|
3151
3151
|
if (e.length < 2) return "";
|
|
3152
3152
|
let t = e[0], n = e[1];
|
|
3153
3153
|
if (!t || !n) return "";
|
|
@@ -3174,14 +3174,14 @@ function So(e) {
|
|
|
3174
3174
|
}
|
|
3175
3175
|
//#endregion
|
|
3176
3176
|
//#region src/theme.ts
|
|
3177
|
-
function
|
|
3177
|
+
function wo() {
|
|
3178
3178
|
return document.documentElement.classList.contains("dark");
|
|
3179
3179
|
}
|
|
3180
3180
|
//#endregion
|
|
3181
3181
|
//#region src/version.ts
|
|
3182
|
-
var
|
|
3182
|
+
var To = {
|
|
3183
3183
|
name: "@glasshome/widget-sdk",
|
|
3184
|
-
version: "1.22.
|
|
3184
|
+
version: "1.22.1",
|
|
3185
3185
|
description: "SDK for building GlassHome dashboard widgets with SolidJS",
|
|
3186
3186
|
keywords: [
|
|
3187
3187
|
"dashboard",
|
|
@@ -3262,7 +3262,7 @@ var wo = {
|
|
|
3262
3262
|
zod: "^4.1.13"
|
|
3263
3263
|
},
|
|
3264
3264
|
devDependencies: {
|
|
3265
|
-
"@glasshome/ui": "1.
|
|
3265
|
+
"@glasshome/ui": "1.28.0",
|
|
3266
3266
|
"@solidjs/testing-library": "^0.8.10",
|
|
3267
3267
|
"@types/bun": "^1.4.0",
|
|
3268
3268
|
"@types/node": "^25.2.2",
|
|
@@ -3277,10 +3277,10 @@ var wo = {
|
|
|
3277
3277
|
},
|
|
3278
3278
|
peerDependencies: {
|
|
3279
3279
|
"@glasshome/sync-layer": "0.9.1",
|
|
3280
|
-
"@glasshome/ui": "1.
|
|
3280
|
+
"@glasshome/ui": "1.28.0",
|
|
3281
3281
|
"solid-js": "^1.9.11"
|
|
3282
3282
|
},
|
|
3283
3283
|
engines: { node: ">=18" }
|
|
3284
3284
|
}.version;
|
|
3285
3285
|
//#endregion
|
|
3286
|
-
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 };
|