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