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