@glasshome/widget-sdk 1.27.1 → 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 +145 -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 +783 -677
- 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,
|
|
@@ -319,10 +319,10 @@ function Mn(e, t) {
|
|
|
319
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";
|
|
320
320
|
}, v = (e) => {
|
|
321
321
|
if (e.pointerType === "touch" && !e.isPrimary) return;
|
|
322
|
-
let t = i(), r = e.target instanceof Element ? e.target.closest(`${
|
|
322
|
+
let t = i(), r = e.target instanceof Element ? e.target.closest(`${Mn}, .glasshome-widget-controls`) : null, o = r !== null && r !== e.currentTarget;
|
|
323
323
|
if (!(o ? !t.hold : !t.tap && !t.hold && !t.slide)) {
|
|
324
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 ??
|
|
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));
|
|
326
326
|
a.graceTimer = setTimeout(() => {
|
|
327
327
|
a.graceTimer = null, s({
|
|
328
328
|
x: o,
|
|
@@ -330,11 +330,11 @@ function Mn(e, t) {
|
|
|
330
330
|
r: l,
|
|
331
331
|
fired: !1
|
|
332
332
|
});
|
|
333
|
-
}, Math.min(
|
|
333
|
+
}, Math.min(Je, r)), a.holdTimer = setTimeout(() => {
|
|
334
334
|
a.holdTimer = null, a.isDown && !a.hasMoved && (s((e) => e && {
|
|
335
335
|
...e,
|
|
336
336
|
fired: !0
|
|
337
|
-
}),
|
|
337
|
+
}), jn.bump(), Yt(), a.element && h(a.element), t.hold?.action(), n?.onHeld?.(), a.isDown = !1);
|
|
338
338
|
}, r);
|
|
339
339
|
}
|
|
340
340
|
if (!a.isTouch && t.slide && !o) try {
|
|
@@ -355,7 +355,7 @@ function Mn(e, t) {
|
|
|
355
355
|
t.slide.onChange(Math.round(m)), a.startX = e.clientX, a.startY = e.clientY, e.preventDefault();
|
|
356
356
|
}
|
|
357
357
|
}, b = (e) => {
|
|
358
|
-
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;
|
|
359
359
|
m(), n && t.tap && !a.hasMoved && !a.holdOnly && r < o && t.tap();
|
|
360
360
|
try {
|
|
361
361
|
e.currentTarget.releasePointerCapture(e.pointerId);
|
|
@@ -373,9 +373,9 @@ function Mn(e, t) {
|
|
|
373
373
|
let t = i();
|
|
374
374
|
if (t.slide) {
|
|
375
375
|
let n = t.slide.orientation;
|
|
376
|
-
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);
|
|
377
377
|
}
|
|
378
|
-
return t.tap ?
|
|
378
|
+
return t.tap ? On.tap.css : t.hold ? On.hold.css : "";
|
|
379
379
|
};
|
|
380
380
|
return {
|
|
381
381
|
onKeyDown: (e) => {
|
|
@@ -411,16 +411,16 @@ function Mn(e, t) {
|
|
|
411
411
|
}
|
|
412
412
|
//#endregion
|
|
413
413
|
//#region src/framework/hooks/use-widget-dimensions.ts
|
|
414
|
-
var
|
|
415
|
-
function
|
|
416
|
-
let e = j(
|
|
414
|
+
var Pn = pe();
|
|
415
|
+
function Fn() {
|
|
416
|
+
let e = j(Pn);
|
|
417
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).");
|
|
418
418
|
return e;
|
|
419
419
|
}
|
|
420
420
|
//#endregion
|
|
421
421
|
//#region src/framework/hooks/use-confirm.ts
|
|
422
|
-
var
|
|
423
|
-
function
|
|
422
|
+
var In = 1600;
|
|
423
|
+
function Ln() {
|
|
424
424
|
let [e, t] = k(/* @__PURE__ */ new Set()), n;
|
|
425
425
|
return A(() => clearTimeout(n)), {
|
|
426
426
|
has: (t) => e().has(t),
|
|
@@ -431,39 +431,39 @@ function In() {
|
|
|
431
431
|
} catch {
|
|
432
432
|
return !1;
|
|
433
433
|
}
|
|
434
|
-
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;
|
|
435
435
|
}
|
|
436
436
|
};
|
|
437
437
|
}
|
|
438
438
|
//#endregion
|
|
439
439
|
//#region src/framework/utils/cn.ts
|
|
440
440
|
function J(...e) {
|
|
441
|
-
return
|
|
441
|
+
return $t(Qt(e));
|
|
442
442
|
}
|
|
443
443
|
//#endregion
|
|
444
444
|
//#region src/framework/components/WidgetIcon.tsx
|
|
445
|
-
var
|
|
446
|
-
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) {
|
|
447
447
|
let t = () => e.entityCount ?? 1;
|
|
448
448
|
return (() => {
|
|
449
|
-
var n =
|
|
450
|
-
return
|
|
449
|
+
var n = Bn(), r = n.firstChild;
|
|
450
|
+
return F(n, N(T, {
|
|
451
451
|
get when() {
|
|
452
452
|
return t() >= 2;
|
|
453
453
|
},
|
|
454
454
|
get children() {
|
|
455
|
-
return
|
|
455
|
+
return Rn();
|
|
456
456
|
}
|
|
457
|
-
}), r),
|
|
457
|
+
}), r), F(n, N(T, {
|
|
458
458
|
get when() {
|
|
459
459
|
return t() >= 3;
|
|
460
460
|
},
|
|
461
461
|
get children() {
|
|
462
|
-
return
|
|
462
|
+
return zn();
|
|
463
463
|
}
|
|
464
|
-
}), r),
|
|
464
|
+
}), r), F(r, () => e.icon), P((t) => {
|
|
465
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;
|
|
466
|
-
return r !== t.e &&
|
|
466
|
+
return r !== t.e && M(n, t.e = r), t.t = z(n, i, t.t), t;
|
|
467
467
|
}, {
|
|
468
468
|
e: void 0,
|
|
469
469
|
t: void 0
|
|
@@ -472,26 +472,26 @@ function Bn(e) {
|
|
|
472
472
|
}
|
|
473
473
|
//#endregion
|
|
474
474
|
//#region src/framework/components/anatomy.tsx
|
|
475
|
-
var
|
|
476
|
-
function
|
|
477
|
-
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));
|
|
478
478
|
D(() => n?.setIcon(e.icon)), A(() => {
|
|
479
479
|
n?.icon() === e.icon && n?.setIcon(void 0);
|
|
480
480
|
});
|
|
481
|
-
let r =
|
|
481
|
+
let r = E(() => e.eyebrow), i = E(() => e.aside), a = () => {
|
|
482
482
|
let t = r();
|
|
483
483
|
return typeof t == "string" && typeof e.name == "string" && t.trim().toLowerCase() === e.name.trim().toLowerCase();
|
|
484
484
|
};
|
|
485
485
|
return (() => {
|
|
486
|
-
var n =
|
|
487
|
-
return
|
|
486
|
+
var n = Wn(), o = n.firstChild, s = o.firstChild;
|
|
487
|
+
return F(n, N(T, {
|
|
488
488
|
get when() {
|
|
489
489
|
return e.icon;
|
|
490
490
|
},
|
|
491
|
-
children: (n) =>
|
|
491
|
+
children: (n) => N(Vn, {
|
|
492
492
|
get icon() {
|
|
493
|
-
return
|
|
494
|
-
return
|
|
493
|
+
return N(H, { get icon() {
|
|
494
|
+
return I(() => !!t())() ? er : n();
|
|
495
495
|
} });
|
|
496
496
|
},
|
|
497
497
|
get entityCount() {
|
|
@@ -502,56 +502,56 @@ function er(e) {
|
|
|
502
502
|
},
|
|
503
503
|
class: "glasshome-widget-head-icon"
|
|
504
504
|
})
|
|
505
|
-
}), o),
|
|
505
|
+
}), o), F(o, N(T, {
|
|
506
506
|
get when() {
|
|
507
|
-
return
|
|
507
|
+
return I(() => !!r())() && !a();
|
|
508
508
|
},
|
|
509
509
|
get children() {
|
|
510
|
-
var e =
|
|
511
|
-
return
|
|
510
|
+
var e = Hn();
|
|
511
|
+
return F(e, r), e;
|
|
512
512
|
}
|
|
513
|
-
}), s),
|
|
513
|
+
}), s), F(s, () => e.name), F(n, N(T, {
|
|
514
514
|
get when() {
|
|
515
515
|
return i();
|
|
516
516
|
},
|
|
517
517
|
get children() {
|
|
518
|
-
var e =
|
|
519
|
-
return
|
|
518
|
+
var e = Un();
|
|
519
|
+
return F(e, i), e;
|
|
520
520
|
}
|
|
521
521
|
}), null), n;
|
|
522
522
|
})();
|
|
523
523
|
}
|
|
524
|
-
function
|
|
525
|
-
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();
|
|
526
526
|
return D(me(r, () => o((e) => e === "a" ? "b" : "a"), { defer: !0 })), (() => {
|
|
527
|
-
var r =
|
|
528
|
-
return
|
|
527
|
+
var r = Jn(), o = r.firstChild, s = o.firstChild;
|
|
528
|
+
return F(o, N(T, {
|
|
529
529
|
get when() {
|
|
530
530
|
return t();
|
|
531
531
|
},
|
|
532
532
|
get children() {
|
|
533
|
-
var e =
|
|
534
|
-
return
|
|
533
|
+
var e = Gn();
|
|
534
|
+
return F(e, t), e;
|
|
535
535
|
}
|
|
536
|
-
}), s),
|
|
536
|
+
}), s), F(s, () => e.value, null), F(s, N(T, {
|
|
537
537
|
get when() {
|
|
538
538
|
return e.unit;
|
|
539
539
|
},
|
|
540
540
|
get children() {
|
|
541
|
-
var t =
|
|
542
|
-
return
|
|
541
|
+
var t = Kn();
|
|
542
|
+
return F(t, () => e.unit), P(() => L(t, "data-degree", e.unit === "°" || void 0)), t;
|
|
543
543
|
}
|
|
544
|
-
}), null),
|
|
544
|
+
}), null), F(r, N(T, {
|
|
545
545
|
get when() {
|
|
546
546
|
return n();
|
|
547
547
|
},
|
|
548
548
|
get children() {
|
|
549
|
-
var e =
|
|
550
|
-
return
|
|
549
|
+
var e = qn();
|
|
550
|
+
return F(e, n), e;
|
|
551
551
|
}
|
|
552
|
-
}), null),
|
|
552
|
+
}), null), P((o) => {
|
|
553
553
|
var c = J("glasshome-widget-hero", e.class), l = n() ? "" : void 0, u = e.value === "" && !t() ? "" : void 0, d = a(), f = i();
|
|
554
|
-
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;
|
|
555
555
|
}, {
|
|
556
556
|
e: void 0,
|
|
557
557
|
t: void 0,
|
|
@@ -561,43 +561,43 @@ function tr(e) {
|
|
|
561
561
|
}), r;
|
|
562
562
|
})();
|
|
563
563
|
}
|
|
564
|
-
function
|
|
564
|
+
function rr(e) {
|
|
565
565
|
return (() => {
|
|
566
|
-
var t =
|
|
567
|
-
return
|
|
566
|
+
var t = Yn();
|
|
567
|
+
return F(t, () => e.children), t;
|
|
568
568
|
})();
|
|
569
569
|
}
|
|
570
|
-
function
|
|
571
|
-
return
|
|
570
|
+
function ir(e) {
|
|
571
|
+
return N(Ae, {
|
|
572
572
|
get "aria-label"() {
|
|
573
573
|
return e.label;
|
|
574
574
|
},
|
|
575
575
|
class: "glasshome-widget-stepper",
|
|
576
576
|
get children() {
|
|
577
|
-
return [
|
|
577
|
+
return [N(Oe, {
|
|
578
578
|
variant: "outline",
|
|
579
579
|
size: "icon",
|
|
580
580
|
"aria-label": "Lower",
|
|
581
581
|
class: "glasshome-widget-control",
|
|
582
582
|
onClick: () => e.onStep(-1),
|
|
583
583
|
get children() {
|
|
584
|
-
return
|
|
584
|
+
return N(H, { icon: "mdi:minus" });
|
|
585
585
|
}
|
|
586
|
-
}),
|
|
586
|
+
}), N(Oe, {
|
|
587
587
|
variant: "outline",
|
|
588
588
|
size: "icon",
|
|
589
589
|
"aria-label": "Raise",
|
|
590
590
|
class: "glasshome-widget-control",
|
|
591
591
|
onClick: () => e.onStep(1),
|
|
592
592
|
get children() {
|
|
593
|
-
return
|
|
593
|
+
return N(H, { icon: "mdi:plus" });
|
|
594
594
|
}
|
|
595
595
|
})];
|
|
596
596
|
}
|
|
597
597
|
});
|
|
598
598
|
}
|
|
599
|
-
function
|
|
600
|
-
return
|
|
599
|
+
function ar(e) {
|
|
600
|
+
return N(Lt, {
|
|
601
601
|
get "aria-label"() {
|
|
602
602
|
return e.label;
|
|
603
603
|
},
|
|
@@ -610,11 +610,11 @@ function ir(e) {
|
|
|
610
610
|
onChange: (t) => t && e.onChange(t),
|
|
611
611
|
class: "glasshome-widget-choice",
|
|
612
612
|
get children() {
|
|
613
|
-
return
|
|
613
|
+
return N(w, {
|
|
614
614
|
get each() {
|
|
615
615
|
return e.options;
|
|
616
616
|
},
|
|
617
|
-
children: (t) =>
|
|
617
|
+
children: (t) => N(zt, {
|
|
618
618
|
get value() {
|
|
619
619
|
return t.value;
|
|
620
620
|
},
|
|
@@ -626,7 +626,7 @@ function ir(e) {
|
|
|
626
626
|
return t.value === e.value ? void 0 : "";
|
|
627
627
|
},
|
|
628
628
|
get children() {
|
|
629
|
-
return
|
|
629
|
+
return N(H, { get icon() {
|
|
630
630
|
return t.icon;
|
|
631
631
|
} });
|
|
632
632
|
}
|
|
@@ -635,9 +635,9 @@ function ir(e) {
|
|
|
635
635
|
}
|
|
636
636
|
});
|
|
637
637
|
}
|
|
638
|
-
function
|
|
639
|
-
let t =
|
|
640
|
-
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, {
|
|
641
641
|
variant: "outline",
|
|
642
642
|
get size() {
|
|
643
643
|
return e.children ? "default" : "icon";
|
|
@@ -653,77 +653,77 @@ function ar(e) {
|
|
|
653
653
|
},
|
|
654
654
|
onClick: () => void n().run([r()], e.run),
|
|
655
655
|
get children() {
|
|
656
|
-
return [
|
|
657
|
-
return
|
|
658
|
-
} }),
|
|
656
|
+
return [N(H, { get icon() {
|
|
657
|
+
return I(() => !!i())() ? er : e.icon;
|
|
658
|
+
} }), I(() => e.children)];
|
|
659
659
|
}
|
|
660
660
|
});
|
|
661
661
|
}
|
|
662
|
-
function
|
|
663
|
-
return
|
|
662
|
+
function sr(e) {
|
|
663
|
+
return N(Ee, {
|
|
664
664
|
get tone() {
|
|
665
665
|
return e.tone ?? "var(--muted-foreground)";
|
|
666
666
|
},
|
|
667
667
|
class: "gap-1 tabular-nums",
|
|
668
668
|
get children() {
|
|
669
|
-
return [
|
|
669
|
+
return [N(T, {
|
|
670
670
|
get when() {
|
|
671
671
|
return e.icon;
|
|
672
672
|
},
|
|
673
|
-
children: (e) =>
|
|
673
|
+
children: (e) => N(H, { get icon() {
|
|
674
674
|
return e();
|
|
675
675
|
} })
|
|
676
|
-
}),
|
|
676
|
+
}), I(() => e.children)];
|
|
677
677
|
}
|
|
678
678
|
});
|
|
679
679
|
}
|
|
680
|
-
function sr(e) {
|
|
681
|
-
return (() => {
|
|
682
|
-
var t = Yn();
|
|
683
|
-
return I(t, () => e.children), F(() => N(t, J("glasshome-widget-layer", e.class))), t;
|
|
684
|
-
})();
|
|
685
|
-
}
|
|
686
680
|
function cr(e) {
|
|
687
681
|
return (() => {
|
|
688
682
|
var t = Xn();
|
|
689
|
-
return
|
|
683
|
+
return F(t, () => e.children), P(() => M(t, J("glasshome-widget-layer", e.class))), t;
|
|
690
684
|
})();
|
|
691
685
|
}
|
|
692
686
|
function lr(e) {
|
|
693
|
-
let t = j(Qn);
|
|
694
687
|
return (() => {
|
|
695
|
-
var
|
|
696
|
-
return
|
|
697
|
-
|
|
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;
|
|
698
698
|
} })), n;
|
|
699
699
|
})();
|
|
700
700
|
}
|
|
701
701
|
//#endregion
|
|
702
702
|
//#region src/framework/theming/tokens.css?raw
|
|
703
|
-
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();
|
|
704
|
-
function
|
|
705
|
-
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;
|
|
706
706
|
}
|
|
707
|
-
function
|
|
707
|
+
function gr(e) {
|
|
708
708
|
if (typeof ShadowRoot < "u" && e instanceof ShadowRoot) {
|
|
709
|
-
if (
|
|
710
|
-
let t =
|
|
711
|
-
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);
|
|
712
712
|
return;
|
|
713
713
|
}
|
|
714
|
-
if (
|
|
714
|
+
if (fr) return;
|
|
715
715
|
let t = e ?? (typeof document > "u" ? void 0 : document);
|
|
716
716
|
if (!t) return;
|
|
717
717
|
if (t.head.querySelector?.("style[data-glasshome-tokens]")) {
|
|
718
|
-
|
|
718
|
+
fr = !0;
|
|
719
719
|
return;
|
|
720
720
|
}
|
|
721
721
|
let n = t.createElement("style");
|
|
722
|
-
n.setAttribute("data-glasshome-tokens", ""), n.textContent =
|
|
722
|
+
n.setAttribute("data-glasshome-tokens", ""), n.textContent = dr, t.head.appendChild(n), fr = !0;
|
|
723
723
|
}
|
|
724
724
|
//#endregion
|
|
725
725
|
//#region src/framework/variants/built-in-variants.ts
|
|
726
|
-
var
|
|
726
|
+
var _r = {
|
|
727
727
|
"classic-glass": { cssVars: {
|
|
728
728
|
"--widget-padding": "1.5rem",
|
|
729
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))"
|
|
@@ -743,21 +743,21 @@ var gr = {
|
|
|
743
743
|
"--widget-backdrop": "blur(16px) saturate(1.8)"
|
|
744
744
|
} }
|
|
745
745
|
};
|
|
746
|
-
function
|
|
747
|
-
return Object.hasOwn(
|
|
746
|
+
function vr(e) {
|
|
747
|
+
return Object.hasOwn(_r, e) ? _r[e] : void 0;
|
|
748
748
|
}
|
|
749
749
|
//#endregion
|
|
750
750
|
//#region src/framework/backgrounds/WidgetSliderFill.tsx
|
|
751
|
-
var
|
|
752
|
-
function
|
|
753
|
-
return e.color !== void 0 &&
|
|
754
|
-
var t =
|
|
755
|
-
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) => {
|
|
756
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 = {
|
|
757
757
|
"--widget-fill-value": e.value,
|
|
758
|
-
"z-index":
|
|
758
|
+
"z-index": un.BACKGROUND
|
|
759
759
|
};
|
|
760
|
-
return r !== n.e &&
|
|
760
|
+
return r !== n.e && M(t, n.e = r), n.t = z(t, i, n.t), n;
|
|
761
761
|
}, {
|
|
762
762
|
e: void 0,
|
|
763
763
|
t: void 0
|
|
@@ -766,16 +766,16 @@ function br(e) {
|
|
|
766
766
|
}
|
|
767
767
|
//#endregion
|
|
768
768
|
//#region src/framework/components/WidgetContent.tsx
|
|
769
|
-
var
|
|
770
|
-
function
|
|
771
|
-
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));
|
|
772
772
|
D(() => t?.setAccent(e.accent)), A(() => t?.setAccent(void 0));
|
|
773
|
-
let n =
|
|
773
|
+
let n = E(() => e.children), r = O(() => n.toArray().some((e) => e instanceof Element && Cr.test(e.className)));
|
|
774
774
|
return (() => {
|
|
775
|
-
var t =
|
|
776
|
-
return
|
|
775
|
+
var t = Sr();
|
|
776
|
+
return F(t, n), P((n) => {
|
|
777
777
|
var i = J(r() ? "glasshome-widget-grid" : "glasshome-widget-content", e.class), a = e.accent ? { "--widget-color": e.accent } : void 0;
|
|
778
|
-
return i !== n.e &&
|
|
778
|
+
return i !== n.e && M(t, n.e = i), n.t = z(t, a, n.t), n;
|
|
779
779
|
}, {
|
|
780
780
|
e: void 0,
|
|
781
781
|
t: void 0
|
|
@@ -784,16 +784,16 @@ function Cr(e) {
|
|
|
784
784
|
}
|
|
785
785
|
//#endregion
|
|
786
786
|
//#region src/framework/components/WidgetStatus.tsx
|
|
787
|
-
var
|
|
788
|
-
function
|
|
787
|
+
var Tr = /*#__PURE__*/ B("<p>");
|
|
788
|
+
function Er(e) {
|
|
789
789
|
return (() => {
|
|
790
|
-
var t =
|
|
791
|
-
return
|
|
792
|
-
var t =
|
|
790
|
+
var t = Tr();
|
|
791
|
+
return F(t, (() => {
|
|
792
|
+
var t = I(() => !!e.isUnavailable);
|
|
793
793
|
return () => t() ? "Unavailable" : e.children;
|
|
794
|
-
})()),
|
|
795
|
-
var r = J("glasshome-widget-status", "relative", e.dimmed && "opacity-40", e.class), i =
|
|
796
|
-
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;
|
|
797
797
|
}, {
|
|
798
798
|
e: void 0,
|
|
799
799
|
t: void 0
|
|
@@ -802,21 +802,21 @@ function Tr(e) {
|
|
|
802
802
|
}
|
|
803
803
|
//#endregion
|
|
804
804
|
//#region src/framework/components/WidgetTitle.tsx
|
|
805
|
-
var
|
|
806
|
-
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) {
|
|
807
807
|
return (() => {
|
|
808
|
-
var t =
|
|
809
|
-
return
|
|
808
|
+
var t = Or(), n = t.firstChild;
|
|
809
|
+
return F(n, () => e.children), F(t, N(T, {
|
|
810
810
|
get when() {
|
|
811
|
-
return
|
|
811
|
+
return I(() => e.badge !== void 0)() && e.badge > 0;
|
|
812
812
|
},
|
|
813
813
|
get children() {
|
|
814
|
-
var t =
|
|
815
|
-
return
|
|
814
|
+
var t = Dr();
|
|
815
|
+
return F(t, () => e.badge), t;
|
|
816
816
|
}
|
|
817
|
-
}), null),
|
|
818
|
-
var r = J("relative flex items-center gap-2", e.class), i =
|
|
819
|
-
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;
|
|
820
820
|
}, {
|
|
821
821
|
e: void 0,
|
|
822
822
|
t: void 0
|
|
@@ -825,7 +825,7 @@ function Or(e) {
|
|
|
825
825
|
}
|
|
826
826
|
//#endregion
|
|
827
827
|
//#region src/framework/utils/entity-aggregation.ts
|
|
828
|
-
function
|
|
828
|
+
function Ar(e, t = !1) {
|
|
829
829
|
let n = e[0];
|
|
830
830
|
if (!n) return {
|
|
831
831
|
isGroup: !1,
|
|
@@ -849,7 +849,7 @@ function kr(e, t = !1) {
|
|
|
849
849
|
isUnavailable: e.state === "unavailable",
|
|
850
850
|
brightness: r,
|
|
851
851
|
brightnessPercent: i,
|
|
852
|
-
color:
|
|
852
|
+
color: Nr(e),
|
|
853
853
|
onCount: +!!t,
|
|
854
854
|
totalCount: 1,
|
|
855
855
|
description: t ? "On" : "Off"
|
|
@@ -861,7 +861,7 @@ function kr(e, t = !1) {
|
|
|
861
861
|
if (i++, t.attributes?.brightness !== void 0 && (c += t.attributes.brightness, l++), t.attributes?.rgb_color) u.push(t.attributes.rgb_color);
|
|
862
862
|
else if (t.attributes?.hs_color) {
|
|
863
863
|
let [e, n] = t.attributes.hs_color;
|
|
864
|
-
u.push(
|
|
864
|
+
u.push(Mr(e, n));
|
|
865
865
|
}
|
|
866
866
|
break;
|
|
867
867
|
case "off":
|
|
@@ -878,7 +878,7 @@ function kr(e, t = !1) {
|
|
|
878
878
|
if (u.length > 0) {
|
|
879
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;
|
|
880
880
|
x = `rgb(${Math.round(e * r)}, ${Math.round(t * r)}, ${Math.round(n * r)})`;
|
|
881
|
-
} else x =
|
|
881
|
+
} else x = Nr(n);
|
|
882
882
|
let S;
|
|
883
883
|
return S = h ? "All on" : g ? "All off" : i > 0 ? `${i} of ${d} on` : "Off", {
|
|
884
884
|
isGroup: r,
|
|
@@ -893,7 +893,7 @@ function kr(e, t = !1) {
|
|
|
893
893
|
description: S
|
|
894
894
|
};
|
|
895
895
|
}
|
|
896
|
-
function
|
|
896
|
+
function jr(e, t = "mean", n = !0) {
|
|
897
897
|
let r = e[0];
|
|
898
898
|
if (!r) return {
|
|
899
899
|
isGroup: !1,
|
|
@@ -990,7 +990,7 @@ function Ar(e, t = "mean", n = !0) {
|
|
|
990
990
|
memberValues: o
|
|
991
991
|
};
|
|
992
992
|
}
|
|
993
|
-
function
|
|
993
|
+
function Mr(e, t) {
|
|
994
994
|
let n = t / 100, r = n * (1 - Math.abs(e / 60 % 2 - 1)), i = 1 - n, a = 0, o = 0, s = 0;
|
|
995
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], [
|
|
996
996
|
(a + i) * 255,
|
|
@@ -998,7 +998,7 @@ function jr(e, t) {
|
|
|
998
998
|
(s + i) * 255
|
|
999
999
|
];
|
|
1000
1000
|
}
|
|
1001
|
-
function
|
|
1001
|
+
function Nr(e) {
|
|
1002
1002
|
if (e.state !== "on") return "rgb(100, 100, 100)";
|
|
1003
1003
|
let t = (e.attributes?.brightness ?? 255) / 255;
|
|
1004
1004
|
if (e.attributes?.rgb_color) {
|
|
@@ -1006,7 +1006,7 @@ function Mr(e) {
|
|
|
1006
1006
|
return `rgb(${Math.round(n * t)}, ${Math.round(r * t)}, ${Math.round(i * t)})`;
|
|
1007
1007
|
}
|
|
1008
1008
|
if (e.attributes?.hs_color) {
|
|
1009
|
-
let [n, r] = e.attributes.hs_color, [i, a, o] =
|
|
1009
|
+
let [n, r] = e.attributes.hs_color, [i, a, o] = Mr(n, r);
|
|
1010
1010
|
return `rgb(${Math.round(i * t)}, ${Math.round(a * t)}, ${Math.round(o * t)})`;
|
|
1011
1011
|
}
|
|
1012
1012
|
if (e.attributes?.color_temp) {
|
|
@@ -1017,7 +1017,7 @@ function Mr(e) {
|
|
|
1017
1017
|
}
|
|
1018
1018
|
//#endregion
|
|
1019
1019
|
//#region src/framework/utils/entity-state.ts
|
|
1020
|
-
function
|
|
1020
|
+
function Pr(e) {
|
|
1021
1021
|
if (!e) return !1;
|
|
1022
1022
|
if ([
|
|
1023
1023
|
"on",
|
|
@@ -1033,15 +1033,15 @@ function Nr(e) {
|
|
|
1033
1033
|
}
|
|
1034
1034
|
return !1;
|
|
1035
1035
|
}
|
|
1036
|
-
function
|
|
1036
|
+
function Fr(e, t, n) {
|
|
1037
1037
|
return e?.attributes ? e.attributes[t] ?? n : n;
|
|
1038
1038
|
}
|
|
1039
|
-
function
|
|
1040
|
-
return e.filter(
|
|
1039
|
+
function Ir(e) {
|
|
1040
|
+
return e.filter(Pr).length;
|
|
1041
1041
|
}
|
|
1042
1042
|
//#endregion
|
|
1043
1043
|
//#region src/framework/utils/format-value.ts
|
|
1044
|
-
function
|
|
1044
|
+
function Lr(e, t, n) {
|
|
1045
1045
|
let { decimals: r, scale: i = !0 } = n || {};
|
|
1046
1046
|
if (typeof e == "string") return t ? `${e}${t}` : e;
|
|
1047
1047
|
if (e == null || Number.isNaN(e)) return t ? `--${t}` : "--";
|
|
@@ -1052,38 +1052,38 @@ function Ir(e, t, n) {
|
|
|
1052
1052
|
}
|
|
1053
1053
|
//#endregion
|
|
1054
1054
|
//#region src/framework/utils/interpret-value.ts
|
|
1055
|
-
function
|
|
1055
|
+
function Rr(e, t) {
|
|
1056
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;
|
|
1057
1057
|
}
|
|
1058
1058
|
//#endregion
|
|
1059
1059
|
//#region src/framework/components/WidgetValue.tsx
|
|
1060
|
-
var
|
|
1061
|
-
function
|
|
1060
|
+
var zr = /*#__PURE__*/ B("<div class=glasshome-widget-subtitle>"), Br = /*#__PURE__*/ B("<div><div class=glasshome-widget-value>");
|
|
1061
|
+
function Vr(e) {
|
|
1062
1062
|
return (() => {
|
|
1063
|
-
var t =
|
|
1064
|
-
return
|
|
1063
|
+
var t = Br(), n = t.firstChild;
|
|
1064
|
+
return F(n, () => Lr(e.value, e.unit)), F(t, N(T, {
|
|
1065
1065
|
get when() {
|
|
1066
|
-
return
|
|
1066
|
+
return I(() => !!e.interpret)() && typeof e.value == "number";
|
|
1067
1067
|
},
|
|
1068
1068
|
get children() {
|
|
1069
|
-
var t =
|
|
1070
|
-
return
|
|
1069
|
+
var t = zr();
|
|
1070
|
+
return F(t, () => Rr(e.value, e.unit)), t;
|
|
1071
1071
|
}
|
|
1072
|
-
}), null),
|
|
1072
|
+
}), null), P(() => M(t, J("flex flex-col", e.class))), t;
|
|
1073
1073
|
})();
|
|
1074
1074
|
}
|
|
1075
1075
|
//#endregion
|
|
1076
1076
|
//#region src/framework/core/Widget.tsx
|
|
1077
|
-
var
|
|
1078
|
-
function
|
|
1079
|
-
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") } }));
|
|
1080
1080
|
A(r.dispose);
|
|
1081
|
-
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 }));
|
|
1082
1082
|
A(o.dispose);
|
|
1083
1083
|
let s = () => t.emptyState && n ? r : t.gestures ?? (a ? o : void 0);
|
|
1084
1084
|
a && (D(() => n?.onHoldable?.(!t.emptyState && !!s()?.holds?.())), A(() => n?.onHoldable?.(!1))), D(() => {
|
|
1085
1085
|
if (!a || !i?.nothingMore()) return;
|
|
1086
|
-
let e = setTimeout(() => i.setNothingMore(!1),
|
|
1086
|
+
let e = setTimeout(() => i.setNothingMore(!1), Xr);
|
|
1087
1087
|
A(() => clearTimeout(e));
|
|
1088
1088
|
}), D(() => i?.setTone(t.color ?? (t.tone ? `var(--tone-${t.tone})` : void 0)));
|
|
1089
1089
|
let [c, l] = k(), [u, d] = k({
|
|
@@ -1107,16 +1107,16 @@ function Xr(t) {
|
|
|
1107
1107
|
t.observe(e), A(() => t.disconnect());
|
|
1108
1108
|
}), he(() => {
|
|
1109
1109
|
let e = c()?.getRootNode();
|
|
1110
|
-
|
|
1110
|
+
gr(typeof ShadowRoot < "u" && e instanceof ShadowRoot || typeof Document < "u" && e instanceof Document ? e : void 0);
|
|
1111
1111
|
});
|
|
1112
1112
|
let f = {
|
|
1113
1113
|
...n,
|
|
1114
1114
|
updateConfig: n?.updateConfig ?? (() => {}),
|
|
1115
1115
|
dimensions: e(() => u(), "ctx.dimensions")
|
|
1116
1116
|
};
|
|
1117
|
-
n && Object.defineProperty(f,
|
|
1117
|
+
n && Object.defineProperty(f, pn, { value: n });
|
|
1118
1118
|
let p = O(() => {
|
|
1119
|
-
if (t.variant) return typeof t.variant == "string" ?
|
|
1119
|
+
if (t.variant) return typeof t.variant == "string" ? vr(t.variant) : t.variant.styles;
|
|
1120
1120
|
}), m = e(() => t.gradient, "widget.gradient"), h = () => !!t.tone && t.tone !== "neutral" || !!t.color, g = O(() => ({
|
|
1121
1121
|
...p()?.cssVars || {},
|
|
1122
1122
|
...t.tone ? { "--widget-color": `var(--tone-${t.tone})` } : {},
|
|
@@ -1154,54 +1154,54 @@ function Xr(t) {
|
|
|
1154
1154
|
y() && s()?.onPointerUp(e);
|
|
1155
1155
|
}, te = (e) => {
|
|
1156
1156
|
y() && s()?.onPointerCancel(e);
|
|
1157
|
-
},
|
|
1157
|
+
}, ne = () => s()?.hold?.() ?? null, C = {
|
|
1158
1158
|
x: 0,
|
|
1159
1159
|
y: 0,
|
|
1160
1160
|
r: 0
|
|
1161
|
-
},
|
|
1161
|
+
}, re = (e) => (e && Object.assign(C, {
|
|
1162
1162
|
x: e.x,
|
|
1163
1163
|
y: e.y,
|
|
1164
1164
|
r: e.r
|
|
1165
1165
|
}), {
|
|
1166
|
-
left: `${
|
|
1167
|
-
top: `${
|
|
1168
|
-
width: `${
|
|
1169
|
-
height: `${
|
|
1170
|
-
"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
|
|
1171
1171
|
});
|
|
1172
|
-
return
|
|
1172
|
+
return N(U.Provider, {
|
|
1173
1173
|
value: f,
|
|
1174
1174
|
get children() {
|
|
1175
|
-
return
|
|
1175
|
+
return N($n.Provider, {
|
|
1176
1176
|
value: () => t.confirmed === !0,
|
|
1177
1177
|
get children() {
|
|
1178
|
-
return
|
|
1178
|
+
return N(Pn.Provider, {
|
|
1179
1179
|
value: u,
|
|
1180
1180
|
get children() {
|
|
1181
1181
|
return [(() => {
|
|
1182
|
-
var e =
|
|
1182
|
+
var e = Wr(), n = e.firstChild, i = n.firstChild;
|
|
1183
1183
|
return n.$$keydown = (e) => {
|
|
1184
1184
|
y() && s()?.onKeyDown?.(e);
|
|
1185
|
-
},
|
|
1185
|
+
}, ve(n, "pointercancel", te), ve(n, "pointerup", ee), ve(n, "pointermove", S), ve(n, "pointerdown", x), ve(n, "pointerenter", b), be((e) => {
|
|
1186
1186
|
l(e), t.gestures?.bindElement(e), r.bindElement(e);
|
|
1187
|
-
}, n),
|
|
1187
|
+
}, n), F(n, N(T, {
|
|
1188
1188
|
get when() {
|
|
1189
1189
|
return s()?.hold;
|
|
1190
1190
|
},
|
|
1191
1191
|
get children() {
|
|
1192
|
-
var e =
|
|
1193
|
-
return
|
|
1194
|
-
var n =
|
|
1195
|
-
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;
|
|
1196
1196
|
}, {
|
|
1197
1197
|
e: void 0,
|
|
1198
1198
|
t: void 0,
|
|
1199
1199
|
a: void 0
|
|
1200
1200
|
}), e;
|
|
1201
1201
|
}
|
|
1202
|
-
}), i),
|
|
1203
|
-
var e =
|
|
1204
|
-
return () => e() ?
|
|
1202
|
+
}), i), F(i, (() => {
|
|
1203
|
+
var e = I(() => !!t.emptyState);
|
|
1204
|
+
return () => e() ? N(Qr, {
|
|
1205
1205
|
get icon() {
|
|
1206
1206
|
return t.emptyState.icon;
|
|
1207
1207
|
},
|
|
@@ -1212,27 +1212,27 @@ function Xr(t) {
|
|
|
1212
1212
|
return t.emptyState.message;
|
|
1213
1213
|
}
|
|
1214
1214
|
}) : t.children;
|
|
1215
|
-
})()),
|
|
1216
|
-
var e =
|
|
1215
|
+
})()), F(n, (() => {
|
|
1216
|
+
var e = I(() => !!t.loading);
|
|
1217
1217
|
return () => e() && (() => {
|
|
1218
|
-
var e =
|
|
1219
|
-
return
|
|
1218
|
+
var e = Gr();
|
|
1219
|
+
return P((t) => R(e, "z-index", un.OVERLAY)), e;
|
|
1220
1220
|
})();
|
|
1221
|
-
})(), null),
|
|
1221
|
+
})(), null), F(e, N(T, {
|
|
1222
1222
|
when: !_,
|
|
1223
1223
|
get children() {
|
|
1224
|
-
var e =
|
|
1225
|
-
return
|
|
1224
|
+
var e = Ur();
|
|
1225
|
+
return P((t) => {
|
|
1226
1226
|
var n = g(), r = h() ? "" : void 0;
|
|
1227
|
-
return t.e =
|
|
1227
|
+
return t.e = z(e, n, t.e), r !== t.t && L(e, "data-toned", t.t = r), t;
|
|
1228
1228
|
}, {
|
|
1229
1229
|
e: void 0,
|
|
1230
1230
|
t: void 0
|
|
1231
1231
|
}), e;
|
|
1232
1232
|
}
|
|
1233
|
-
}), null),
|
|
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 =
|
|
1235
|
-
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;
|
|
1236
1236
|
}, {
|
|
1237
1237
|
e: void 0,
|
|
1238
1238
|
t: void 0,
|
|
@@ -1241,10 +1241,10 @@ function Xr(t) {
|
|
|
1241
1241
|
i: void 0,
|
|
1242
1242
|
n: void 0
|
|
1243
1243
|
}), e;
|
|
1244
|
-
})(),
|
|
1244
|
+
})(), N(T, {
|
|
1245
1245
|
when: a,
|
|
1246
1246
|
get children() {
|
|
1247
|
-
return
|
|
1247
|
+
return N($e, {
|
|
1248
1248
|
get open() {
|
|
1249
1249
|
return i?.nothingMore() ?? !1;
|
|
1250
1250
|
},
|
|
@@ -1253,10 +1253,10 @@ function Xr(t) {
|
|
|
1253
1253
|
},
|
|
1254
1254
|
anchorRef: c,
|
|
1255
1255
|
get children() {
|
|
1256
|
-
return
|
|
1256
|
+
return N(et, {
|
|
1257
1257
|
class: "flex w-auto items-center gap-2 p-3 text-sm",
|
|
1258
1258
|
get children() {
|
|
1259
|
-
return [
|
|
1259
|
+
return [N(H, { icon: "mdi:information-outline" }), "No more controls for this widget"];
|
|
1260
1260
|
}
|
|
1261
1261
|
});
|
|
1262
1262
|
}
|
|
@@ -1270,60 +1270,60 @@ function Xr(t) {
|
|
|
1270
1270
|
}
|
|
1271
1271
|
});
|
|
1272
1272
|
}
|
|
1273
|
-
function
|
|
1273
|
+
function Qr(e) {
|
|
1274
1274
|
return (() => {
|
|
1275
|
-
var t =
|
|
1276
|
-
return
|
|
1277
|
-
var t =
|
|
1278
|
-
return () => t() && (() => {
|
|
1279
|
-
var t = Kr();
|
|
1280
|
-
return I(t, () => e.icon), t;
|
|
1281
|
-
})();
|
|
1282
|
-
})(), null), I(t, (() => {
|
|
1283
|
-
var t = L(() => !!e.title);
|
|
1275
|
+
var t = Kr();
|
|
1276
|
+
return F(t, (() => {
|
|
1277
|
+
var t = I(() => !!e.icon);
|
|
1284
1278
|
return () => t() && (() => {
|
|
1285
1279
|
var t = qr();
|
|
1286
|
-
return
|
|
1280
|
+
return F(t, () => e.icon), t;
|
|
1287
1281
|
})();
|
|
1288
|
-
})(), null),
|
|
1289
|
-
var t =
|
|
1282
|
+
})(), null), F(t, (() => {
|
|
1283
|
+
var t = I(() => !!e.title);
|
|
1290
1284
|
return () => t() && (() => {
|
|
1291
1285
|
var t = Jr();
|
|
1292
|
-
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;
|
|
1293
1293
|
})();
|
|
1294
1294
|
})(), null), t;
|
|
1295
1295
|
})();
|
|
1296
1296
|
}
|
|
1297
|
-
var Y =
|
|
1298
|
-
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"]);
|
|
1299
1299
|
//#endregion
|
|
1300
1300
|
//#region src/framework/panel/panel.tsx
|
|
1301
|
-
var
|
|
1302
|
-
function
|
|
1303
|
-
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) => {
|
|
1304
1304
|
let r = e.slide?.();
|
|
1305
1305
|
if (!r) return 0;
|
|
1306
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;
|
|
1307
|
-
return Math.round(
|
|
1307
|
+
return Math.round(di(o + a * (s - o), o, s));
|
|
1308
1308
|
}, c = () => {
|
|
1309
1309
|
clearTimeout(a), n = void 0;
|
|
1310
1310
|
};
|
|
1311
1311
|
return A(() => clearTimeout(a)), {
|
|
1312
1312
|
onPointerDown: (o) => {
|
|
1313
1313
|
if (o.button !== 0 || n) return;
|
|
1314
|
-
let s = o.target instanceof Element ? o.target.closest(
|
|
1314
|
+
let s = o.target instanceof Element ? o.target.closest(Mn) : null;
|
|
1315
1315
|
s && s !== o.currentTarget || (n = {
|
|
1316
1316
|
x: o.clientX,
|
|
1317
1317
|
y: o.clientY,
|
|
1318
1318
|
id: o.pointerId
|
|
1319
1319
|
}, o.currentTarget.setPointerCapture?.(o.pointerId), r = !1, i = !1, e.onHold && (a = setTimeout(() => {
|
|
1320
|
-
i = !0,
|
|
1321
|
-
},
|
|
1320
|
+
i = !0, Yt(), e.onHold?.(), t?.onHeld?.();
|
|
1321
|
+
}, Ye)));
|
|
1322
1322
|
},
|
|
1323
1323
|
onPointerMove: (t) => {
|
|
1324
1324
|
if (!n || t.pointerId !== n.id || i) return;
|
|
1325
1325
|
let c = t.currentTarget, l = e.axis === "x" ? Math.abs(t.clientX - n.x) : Math.abs(t.clientY - n.y);
|
|
1326
|
-
!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);
|
|
1327
1327
|
},
|
|
1328
1328
|
onPointerUp: (t) => {
|
|
1329
1329
|
n && t.pointerId === n.id && (r ? e.slide?.()?.onCommit?.(o) : i || e.onTap?.(), c());
|
|
@@ -1331,20 +1331,20 @@ function di(e) {
|
|
|
1331
1331
|
onPointerCancel: c
|
|
1332
1332
|
};
|
|
1333
1333
|
}
|
|
1334
|
-
function
|
|
1334
|
+
function pi(e) {
|
|
1335
1335
|
return (() => {
|
|
1336
|
-
var t =
|
|
1337
|
-
return
|
|
1336
|
+
var t = $r(), n = t.firstChild;
|
|
1337
|
+
return F(n, () => e.label), F(t, () => e.children, null), t;
|
|
1338
1338
|
})();
|
|
1339
1339
|
}
|
|
1340
|
-
function
|
|
1340
|
+
function mi(e) {
|
|
1341
1341
|
return (() => {
|
|
1342
|
-
var t =
|
|
1343
|
-
return
|
|
1342
|
+
var t = ei();
|
|
1343
|
+
return F(t, () => e.children), t;
|
|
1344
1344
|
})();
|
|
1345
1345
|
}
|
|
1346
|
-
function
|
|
1347
|
-
let t = () => !!(e.onTap || e.slide || e.onHold), n =
|
|
1346
|
+
function hi(e) {
|
|
1347
|
+
let t = () => !!(e.onTap || e.slide || e.onHold), n = fi({
|
|
1348
1348
|
axis: "x",
|
|
1349
1349
|
slide: () => e.slide,
|
|
1350
1350
|
onTap: () => e.onTap?.(),
|
|
@@ -1361,26 +1361,26 @@ function mi(e) {
|
|
|
1361
1361
|
let r = t.key === "ArrowRight" || t.key === "ArrowUp" ? 5 : t.key === "ArrowLeft" || t.key === "ArrowDown" ? -5 : 0;
|
|
1362
1362
|
if (!r) return;
|
|
1363
1363
|
t.preventDefault();
|
|
1364
|
-
let i =
|
|
1364
|
+
let i = di(n.value + r, n.min ?? 0, n.max ?? 100);
|
|
1365
1365
|
n.onChange(i), n.onCommit?.(i);
|
|
1366
1366
|
}, a = () => [
|
|
1367
|
-
|
|
1367
|
+
N(T, {
|
|
1368
1368
|
get when() {
|
|
1369
1369
|
return r() !== void 0;
|
|
1370
1370
|
},
|
|
1371
1371
|
get children() {
|
|
1372
|
-
var e =
|
|
1373
|
-
return
|
|
1372
|
+
var e = ti();
|
|
1373
|
+
return P((t) => z(e, { "--widget-fill-value": r() }, t)), e;
|
|
1374
1374
|
}
|
|
1375
1375
|
}),
|
|
1376
1376
|
(() => {
|
|
1377
|
-
var t =
|
|
1378
|
-
return
|
|
1377
|
+
var t = ni();
|
|
1378
|
+
return F(t, N(H, {
|
|
1379
1379
|
get icon() {
|
|
1380
1380
|
return e.icon;
|
|
1381
1381
|
},
|
|
1382
1382
|
class: "glasshome-widget-icon-glyph"
|
|
1383
|
-
})),
|
|
1383
|
+
})), P((n) => {
|
|
1384
1384
|
var r = !!e.on, i = !e.on;
|
|
1385
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;
|
|
1386
1386
|
}, {
|
|
@@ -1389,33 +1389,33 @@ function mi(e) {
|
|
|
1389
1389
|
}), t;
|
|
1390
1390
|
})(),
|
|
1391
1391
|
(() => {
|
|
1392
|
-
var t =
|
|
1393
|
-
return
|
|
1392
|
+
var t = ii(), n = t.firstChild;
|
|
1393
|
+
return F(n, () => e.name), F(t, N(T, {
|
|
1394
1394
|
get when() {
|
|
1395
1395
|
return e.state !== void 0;
|
|
1396
1396
|
},
|
|
1397
1397
|
get children() {
|
|
1398
|
-
var t =
|
|
1399
|
-
return
|
|
1398
|
+
var t = ri();
|
|
1399
|
+
return F(t, () => e.state), t;
|
|
1400
1400
|
}
|
|
1401
1401
|
}), null), t;
|
|
1402
1402
|
})()
|
|
1403
1403
|
], o = () => ({ "--widget-color": e.tone ?? "var(--tone-neutral)" });
|
|
1404
1404
|
return (() => {
|
|
1405
|
-
var r =
|
|
1406
|
-
return
|
|
1405
|
+
var r = oi();
|
|
1406
|
+
return F(r, N(T, {
|
|
1407
1407
|
get when() {
|
|
1408
1408
|
return t();
|
|
1409
1409
|
},
|
|
1410
1410
|
get fallback() {
|
|
1411
1411
|
return (() => {
|
|
1412
|
-
var e =
|
|
1413
|
-
return
|
|
1414
|
-
var n = `${
|
|
1412
|
+
var e = si();
|
|
1413
|
+
return F(e, a), P((t) => {
|
|
1414
|
+
var n = `${Bt({
|
|
1415
1415
|
variant: "outline",
|
|
1416
1416
|
size: "none"
|
|
1417
1417
|
})} glasshome-panel-row glasshome-panel-row-static`, r = o();
|
|
1418
|
-
return n !== t.e &&
|
|
1418
|
+
return n !== t.e && M(e, t.e = n), t.t = z(e, r, t.t), t;
|
|
1419
1419
|
}, {
|
|
1420
1420
|
e: void 0,
|
|
1421
1421
|
t: void 0
|
|
@@ -1423,7 +1423,7 @@ function mi(e) {
|
|
|
1423
1423
|
})();
|
|
1424
1424
|
},
|
|
1425
1425
|
get children() {
|
|
1426
|
-
return
|
|
1426
|
+
return N(Oe, {
|
|
1427
1427
|
variant: "outline",
|
|
1428
1428
|
size: "none",
|
|
1429
1429
|
class: "glasshome-panel-row",
|
|
@@ -1457,39 +1457,39 @@ function mi(e) {
|
|
|
1457
1457
|
}
|
|
1458
1458
|
});
|
|
1459
1459
|
}
|
|
1460
|
-
}), null),
|
|
1460
|
+
}), null), F(r, N(T, {
|
|
1461
1461
|
get when() {
|
|
1462
1462
|
return e.trailing;
|
|
1463
1463
|
},
|
|
1464
1464
|
get children() {
|
|
1465
|
-
var t =
|
|
1466
|
-
return
|
|
1465
|
+
var t = ai();
|
|
1466
|
+
return F(t, () => e.trailing), t;
|
|
1467
1467
|
}
|
|
1468
1468
|
}), null), r;
|
|
1469
1469
|
})();
|
|
1470
1470
|
}
|
|
1471
|
-
function
|
|
1471
|
+
function gi(e) {
|
|
1472
1472
|
return (() => {
|
|
1473
|
-
var t =
|
|
1474
|
-
return
|
|
1473
|
+
var t = ci();
|
|
1474
|
+
return F(t, N(w, {
|
|
1475
1475
|
get each() {
|
|
1476
1476
|
return e.items;
|
|
1477
1477
|
},
|
|
1478
1478
|
children: (e) => (() => {
|
|
1479
|
-
var t =
|
|
1480
|
-
return
|
|
1479
|
+
var t = li(), n = t.firstChild, r = n.firstChild, i = r.nextSibling;
|
|
1480
|
+
return F(t, N(H, {
|
|
1481
1481
|
get icon() {
|
|
1482
1482
|
return e.icon;
|
|
1483
1483
|
},
|
|
1484
1484
|
class: "glasshome-panel-fact-icon"
|
|
1485
|
-
}), n),
|
|
1485
|
+
}), n), F(r, () => e.label), F(i, () => e.value), t;
|
|
1486
1486
|
})()
|
|
1487
1487
|
})), t;
|
|
1488
1488
|
})();
|
|
1489
1489
|
}
|
|
1490
1490
|
//#endregion
|
|
1491
1491
|
//#region src/framework/panel/panel-entity.tsx
|
|
1492
|
-
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 = {
|
|
1493
1493
|
light: {
|
|
1494
1494
|
icon: "mdi:lightbulb",
|
|
1495
1495
|
tone: (e) => {
|
|
@@ -1529,10 +1529,10 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1529
1529
|
on: (e) => e.state === "on",
|
|
1530
1530
|
state: (e) => {
|
|
1531
1531
|
if (e.state !== "on") return "Off";
|
|
1532
|
-
let t =
|
|
1532
|
+
let t = _i(e.attributes.percentage);
|
|
1533
1533
|
return t === void 0 ? "On" : `${t}%`;
|
|
1534
1534
|
},
|
|
1535
|
-
level: (e) => e.state === "on" ?
|
|
1535
|
+
level: (e) => e.state === "on" ? _i(e.attributes.percentage) ?? 100 : 0,
|
|
1536
1536
|
setLevel: (e, t, n) => e("fan", "set_percentage", { percentage: n }, X(t)),
|
|
1537
1537
|
tap: (e, t) => e("fan", "toggle", {}, X(t))
|
|
1538
1538
|
},
|
|
@@ -1541,10 +1541,10 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1541
1541
|
tone: "var(--tone-info)",
|
|
1542
1542
|
on: (e) => e.state !== "closed",
|
|
1543
1543
|
state: (e) => {
|
|
1544
|
-
let t =
|
|
1544
|
+
let t = _i(e.attributes.current_position), n = vi(e.state);
|
|
1545
1545
|
return t !== void 0 && e.state === "open" ? `${n} · ${t}%` : n;
|
|
1546
1546
|
},
|
|
1547
|
-
level: (e) =>
|
|
1547
|
+
level: (e) => _i(e.attributes.current_position),
|
|
1548
1548
|
setLevel: (e, t, n) => e("cover", "set_cover_position", { position: n }, X(t)),
|
|
1549
1549
|
tap: (e, t) => e("cover", t.state === "closed" ? "open_cover" : "close_cover", {}, X(t))
|
|
1550
1550
|
},
|
|
@@ -1552,7 +1552,7 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1552
1552
|
icon: (e) => e.state === "locked" ? "mdi:lock" : "mdi:lock-open-variant",
|
|
1553
1553
|
tone: "var(--tone-success)",
|
|
1554
1554
|
on: (e) => e.state === "locked",
|
|
1555
|
-
state: (e) =>
|
|
1555
|
+
state: (e) => vi(e.state),
|
|
1556
1556
|
tap: (e, t) => e("lock", t.state === "locked" ? "unlock" : "lock", {}, X(t))
|
|
1557
1557
|
},
|
|
1558
1558
|
climate: {
|
|
@@ -1562,14 +1562,14 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1562
1562
|
state: (e) => {
|
|
1563
1563
|
if (e.state === "off") return "Off";
|
|
1564
1564
|
let t = e.attributes.temperature;
|
|
1565
|
-
return typeof t == "number" ? `${
|
|
1565
|
+
return typeof t == "number" ? `${vi(e.state)} · ${t}°` : vi(e.state);
|
|
1566
1566
|
}
|
|
1567
1567
|
},
|
|
1568
1568
|
media_player: {
|
|
1569
1569
|
icon: "mdi:speaker",
|
|
1570
1570
|
tone: "var(--tone-accent)",
|
|
1571
1571
|
on: (e) => e.state === "playing",
|
|
1572
|
-
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),
|
|
1573
1573
|
level: (e) => typeof e.attributes.volume_level == "number" ? Math.round(e.attributes.volume_level * 100) : void 0,
|
|
1574
1574
|
setLevel: (e, t, n) => e("media_player", "volume_set", { volume_level: n / 100 }, X(t)),
|
|
1575
1575
|
tap: (e, t) => e("media_player", "media_play_pause", {}, X(t))
|
|
@@ -1579,7 +1579,7 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1579
1579
|
tone: "var(--tone-info)",
|
|
1580
1580
|
on: (e) => e.state === "on",
|
|
1581
1581
|
state: (e) => {
|
|
1582
|
-
let t =
|
|
1582
|
+
let t = xi[e.deviceClass ?? ""] ?? ["On", "Off"];
|
|
1583
1583
|
return e.state === "on" ? t[0] : t[1];
|
|
1584
1584
|
}
|
|
1585
1585
|
},
|
|
@@ -1587,14 +1587,14 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1587
1587
|
icon: "mdi:gesture-tap-button",
|
|
1588
1588
|
tone: "var(--tone-accent)",
|
|
1589
1589
|
on: () => !1,
|
|
1590
|
-
state: (e) =>
|
|
1590
|
+
state: (e) => Si(e.state),
|
|
1591
1591
|
tap: (e, t) => e("button", "press", {}, X(t))
|
|
1592
1592
|
},
|
|
1593
1593
|
input_button: {
|
|
1594
1594
|
icon: "mdi:gesture-tap-button",
|
|
1595
1595
|
tone: "var(--tone-accent)",
|
|
1596
1596
|
on: () => !1,
|
|
1597
|
-
state: (e) =>
|
|
1597
|
+
state: (e) => Si(e.state),
|
|
1598
1598
|
tap: (e, t) => e("input_button", "press", {}, X(t))
|
|
1599
1599
|
},
|
|
1600
1600
|
scene: {
|
|
@@ -1611,14 +1611,14 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1611
1611
|
state: (e) => e.state === "on" ? "Running" : "Tap to run",
|
|
1612
1612
|
tap: (e, t) => e("script", "turn_on", {}, X(t))
|
|
1613
1613
|
}
|
|
1614
|
-
},
|
|
1614
|
+
}, bi = {
|
|
1615
1615
|
garage: "mdi:garage",
|
|
1616
1616
|
gate: "mdi:gate",
|
|
1617
1617
|
door: "mdi:door",
|
|
1618
1618
|
curtain: "mdi:curtains",
|
|
1619
1619
|
shutter: "mdi:window-shutter",
|
|
1620
1620
|
awning: "mdi:awning"
|
|
1621
|
-
},
|
|
1621
|
+
}, xi = {
|
|
1622
1622
|
door: ["Open", "Closed"],
|
|
1623
1623
|
window: ["Open", "Closed"],
|
|
1624
1624
|
garage_door: ["Open", "Closed"],
|
|
@@ -1632,44 +1632,44 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1632
1632
|
battery: ["Low", "Normal"],
|
|
1633
1633
|
connectivity: ["Connected", "Disconnected"]
|
|
1634
1634
|
};
|
|
1635
|
-
function
|
|
1635
|
+
function Si(e) {
|
|
1636
1636
|
let t = Date.parse(e);
|
|
1637
1637
|
return Number.isNaN(t) ? "Never pressed" : new Date(t).toLocaleTimeString([], {
|
|
1638
1638
|
hour: "2-digit",
|
|
1639
1639
|
minute: "2-digit"
|
|
1640
1640
|
});
|
|
1641
1641
|
}
|
|
1642
|
-
var
|
|
1642
|
+
var Ci = {
|
|
1643
1643
|
icon: "mdi:circle-medium",
|
|
1644
1644
|
tone: "var(--tone-neutral)",
|
|
1645
1645
|
on: (e) => e.state === "on",
|
|
1646
|
-
state: (e) =>
|
|
1646
|
+
state: (e) => vi(e.state)
|
|
1647
1647
|
};
|
|
1648
|
-
function
|
|
1648
|
+
function wi(e, t) {
|
|
1649
1649
|
if (!t || e.length <= t.length || !e.toLowerCase().startsWith(t.toLowerCase())) return e;
|
|
1650
1650
|
let n = e.slice(t.length).trim();
|
|
1651
1651
|
return n ? n.charAt(0).toUpperCase() + n.slice(1) : e;
|
|
1652
1652
|
}
|
|
1653
|
-
function wi(e) {
|
|
1654
|
-
return !!vi[e]?.tap || !!vi[e]?.setLevel;
|
|
1655
|
-
}
|
|
1656
1653
|
function Ti(e) {
|
|
1657
|
-
|
|
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();
|
|
1658
1658
|
return D(() => {
|
|
1659
1659
|
t(), i(void 0);
|
|
1660
|
-
}),
|
|
1660
|
+
}), N(T, {
|
|
1661
1661
|
get when() {
|
|
1662
1662
|
return t();
|
|
1663
1663
|
},
|
|
1664
1664
|
children: (t) => {
|
|
1665
|
-
let a = () =>
|
|
1666
|
-
return
|
|
1665
|
+
let a = () => yi[t().domain] ?? Ci, o = () => r() ?? a().level?.(t()), s = () => a().setLevel;
|
|
1666
|
+
return N(hi, {
|
|
1667
1667
|
get icon() {
|
|
1668
1668
|
let n = a().icon;
|
|
1669
|
-
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;
|
|
1670
1670
|
},
|
|
1671
1671
|
get name() {
|
|
1672
|
-
return e.name ??
|
|
1672
|
+
return e.name ?? wi(t().friendlyName ?? t().id, e.within);
|
|
1673
1673
|
},
|
|
1674
1674
|
get state() {
|
|
1675
1675
|
return a().state(t());
|
|
@@ -1683,7 +1683,7 @@ function Ti(e) {
|
|
|
1683
1683
|
return a().on(t());
|
|
1684
1684
|
},
|
|
1685
1685
|
get slide() {
|
|
1686
|
-
return
|
|
1686
|
+
return I(() => !!(s() && o() !== void 0))() ? {
|
|
1687
1687
|
value: o() ?? 0,
|
|
1688
1688
|
onChange: i,
|
|
1689
1689
|
onCommit: (e) => s()?.(n, t(), e)
|
|
@@ -1701,8 +1701,8 @@ function Ti(e) {
|
|
|
1701
1701
|
}
|
|
1702
1702
|
//#endregion
|
|
1703
1703
|
//#region src/framework/dialogs/debug-view.tsx
|
|
1704
|
-
var
|
|
1705
|
-
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) {
|
|
1706
1706
|
return {
|
|
1707
1707
|
widgetConfig: e,
|
|
1708
1708
|
entities: t.map((e) => ({
|
|
@@ -1719,18 +1719,18 @@ function ji(e, t, n) {
|
|
|
1719
1719
|
...n
|
|
1720
1720
|
};
|
|
1721
1721
|
}
|
|
1722
|
-
var
|
|
1722
|
+
var Ni = (e) => JSON.stringify(e, null, 2), Pi = {
|
|
1723
1723
|
idle: "lucide:copy",
|
|
1724
1724
|
copied: "lucide:check",
|
|
1725
1725
|
failed: "lucide:triangle-alert"
|
|
1726
|
-
},
|
|
1726
|
+
}, Fi = {
|
|
1727
1727
|
idle: "text-muted-foreground",
|
|
1728
1728
|
copied: "text-success",
|
|
1729
1729
|
failed: "text-destructive"
|
|
1730
1730
|
};
|
|
1731
|
-
function
|
|
1732
|
-
let { state: t, copy: n } =
|
|
1733
|
-
return
|
|
1731
|
+
function Ii(e) {
|
|
1732
|
+
let { state: t, copy: n } = Zt();
|
|
1733
|
+
return N(Oe, {
|
|
1734
1734
|
variant: "ghost",
|
|
1735
1735
|
size: "icon",
|
|
1736
1736
|
class: "size-8",
|
|
@@ -1739,70 +1739,70 @@ function Fi(e) {
|
|
|
1739
1739
|
},
|
|
1740
1740
|
onClick: () => void n(e.text()),
|
|
1741
1741
|
get children() {
|
|
1742
|
-
return
|
|
1742
|
+
return N(H, {
|
|
1743
1743
|
get icon() {
|
|
1744
|
-
return
|
|
1744
|
+
return Pi[t()];
|
|
1745
1745
|
},
|
|
1746
1746
|
width: 16,
|
|
1747
1747
|
height: 16,
|
|
1748
1748
|
get class() {
|
|
1749
|
-
return
|
|
1749
|
+
return Fi[t()];
|
|
1750
1750
|
}
|
|
1751
1751
|
});
|
|
1752
1752
|
}
|
|
1753
1753
|
});
|
|
1754
1754
|
}
|
|
1755
|
-
function
|
|
1755
|
+
function Li(e) {
|
|
1756
1756
|
let t = e.replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ");
|
|
1757
1757
|
return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
|
|
1758
1758
|
}
|
|
1759
|
-
var
|
|
1760
|
-
function
|
|
1759
|
+
var Ri = (e) => e === null || typeof e != "object" && typeof e != "function";
|
|
1760
|
+
function zi(e) {
|
|
1761
1761
|
return e == null ? "None" : String(e);
|
|
1762
1762
|
}
|
|
1763
|
-
function
|
|
1763
|
+
function Bi(e) {
|
|
1764
1764
|
return Array.isArray(e) ? e.length : typeof e == "object" && e ? Object.keys(e).length : 0;
|
|
1765
1765
|
}
|
|
1766
|
-
function
|
|
1766
|
+
function Vi(e) {
|
|
1767
1767
|
let t = new Date(e);
|
|
1768
1768
|
return Number.isNaN(t.getTime()) ? e : t.toLocaleString();
|
|
1769
1769
|
}
|
|
1770
|
-
function
|
|
1771
|
-
return
|
|
1770
|
+
function Hi(e) {
|
|
1771
|
+
return N(gt, {
|
|
1772
1772
|
class: "overflow-hidden p-0",
|
|
1773
1773
|
get children() {
|
|
1774
|
-
var t =
|
|
1775
|
-
return
|
|
1774
|
+
var t = Di();
|
|
1775
|
+
return F(t, () => Ni(e.value)), t;
|
|
1776
1776
|
}
|
|
1777
1777
|
});
|
|
1778
1778
|
}
|
|
1779
|
-
function
|
|
1780
|
-
return
|
|
1779
|
+
function Ui(e) {
|
|
1780
|
+
return N(xe, {
|
|
1781
1781
|
collapsible: !0,
|
|
1782
1782
|
class: "border-border/50 border-t",
|
|
1783
1783
|
get children() {
|
|
1784
|
-
return
|
|
1784
|
+
return N(Ce, {
|
|
1785
1785
|
get value() {
|
|
1786
1786
|
return e.label;
|
|
1787
1787
|
},
|
|
1788
1788
|
get children() {
|
|
1789
|
-
return [
|
|
1789
|
+
return [N(we, {
|
|
1790
1790
|
class: "text-muted-foreground py-3 text-xs",
|
|
1791
1791
|
get children() {
|
|
1792
|
-
var t =
|
|
1793
|
-
return
|
|
1792
|
+
var t = Oi();
|
|
1793
|
+
return F(t, () => e.label, null), F(t, N(T, {
|
|
1794
1794
|
get when() {
|
|
1795
1795
|
return e.count !== void 0;
|
|
1796
1796
|
},
|
|
1797
1797
|
get children() {
|
|
1798
|
-
return
|
|
1798
|
+
return N(Ve, { get children() {
|
|
1799
1799
|
return e.count;
|
|
1800
1800
|
} });
|
|
1801
1801
|
}
|
|
1802
1802
|
}), null), t;
|
|
1803
1803
|
}
|
|
1804
|
-
}),
|
|
1805
|
-
return
|
|
1804
|
+
}), N(Se, { get children() {
|
|
1805
|
+
return N(Hi, { get value() {
|
|
1806
1806
|
return e.value;
|
|
1807
1807
|
} });
|
|
1808
1808
|
} })];
|
|
@@ -1811,77 +1811,77 @@ function Hi(e) {
|
|
|
1811
1811
|
}
|
|
1812
1812
|
});
|
|
1813
1813
|
}
|
|
1814
|
-
function
|
|
1814
|
+
function Wi(e) {
|
|
1815
1815
|
return (() => {
|
|
1816
|
-
var t =
|
|
1817
|
-
return
|
|
1816
|
+
var t = ki(), n = t.firstChild, r = n.firstChild, i = n.nextSibling;
|
|
1817
|
+
return F(n, N(mt, {
|
|
1818
1818
|
get icon() {
|
|
1819
1819
|
return e.icon;
|
|
1820
1820
|
},
|
|
1821
1821
|
size: "sm"
|
|
1822
|
-
}), r),
|
|
1822
|
+
}), r), F(r, N(qe, {
|
|
1823
1823
|
class: "truncate",
|
|
1824
1824
|
get children() {
|
|
1825
1825
|
return e.title;
|
|
1826
1826
|
}
|
|
1827
|
-
}), null),
|
|
1827
|
+
}), null), F(r, N(T, {
|
|
1828
1828
|
get when() {
|
|
1829
1829
|
return e.subtitle;
|
|
1830
1830
|
},
|
|
1831
|
-
children: (e) =>
|
|
1831
|
+
children: (e) => N(ht, {
|
|
1832
1832
|
class: "truncate font-mono",
|
|
1833
1833
|
get children() {
|
|
1834
1834
|
return e();
|
|
1835
1835
|
}
|
|
1836
1836
|
})
|
|
1837
|
-
}), null),
|
|
1837
|
+
}), null), F(n, () => e.badge, null), F(n, N(Ii, {
|
|
1838
1838
|
get label() {
|
|
1839
1839
|
return `Copy ${e.title}`;
|
|
1840
1840
|
},
|
|
1841
|
-
text: () =>
|
|
1842
|
-
}), null),
|
|
1841
|
+
text: () => Ni(e.source)
|
|
1842
|
+
}), null), F(i, () => e.children), t;
|
|
1843
1843
|
})();
|
|
1844
1844
|
}
|
|
1845
|
-
function
|
|
1846
|
-
let t = O(() => Object.entries(e.record)), n = O(() => t().flatMap(([e, t]) =>
|
|
1847
|
-
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, {
|
|
1848
1848
|
get when() {
|
|
1849
1849
|
return t().length > 0;
|
|
1850
1850
|
},
|
|
1851
1851
|
get fallback() {
|
|
1852
|
-
return
|
|
1852
|
+
return N(ht, { children: "Nothing set" });
|
|
1853
1853
|
},
|
|
1854
1854
|
get children() {
|
|
1855
|
-
return [
|
|
1855
|
+
return [N(T, {
|
|
1856
1856
|
get when() {
|
|
1857
1857
|
return n().length > 0;
|
|
1858
1858
|
},
|
|
1859
1859
|
get children() {
|
|
1860
|
-
var e =
|
|
1861
|
-
return
|
|
1860
|
+
var e = Ai();
|
|
1861
|
+
return F(e, N(w, {
|
|
1862
1862
|
get each() {
|
|
1863
1863
|
return n();
|
|
1864
1864
|
},
|
|
1865
|
-
children: ([e, t]) =>
|
|
1865
|
+
children: ([e, t]) => N(V, {
|
|
1866
1866
|
get label() {
|
|
1867
|
-
return
|
|
1867
|
+
return Li(e);
|
|
1868
1868
|
},
|
|
1869
1869
|
get children() {
|
|
1870
|
-
return
|
|
1870
|
+
return zi(t);
|
|
1871
1871
|
}
|
|
1872
1872
|
})
|
|
1873
1873
|
})), e;
|
|
1874
1874
|
}
|
|
1875
|
-
}),
|
|
1875
|
+
}), N(w, {
|
|
1876
1876
|
get each() {
|
|
1877
1877
|
return r();
|
|
1878
1878
|
},
|
|
1879
|
-
children: ([e, t]) =>
|
|
1879
|
+
children: ([e, t]) => N(Ui, {
|
|
1880
1880
|
get label() {
|
|
1881
|
-
return
|
|
1881
|
+
return Li(e);
|
|
1882
1882
|
},
|
|
1883
1883
|
get count() {
|
|
1884
|
-
return
|
|
1884
|
+
return Bi(t);
|
|
1885
1885
|
},
|
|
1886
1886
|
value: t
|
|
1887
1887
|
})
|
|
@@ -1889,9 +1889,9 @@ function Wi(e) {
|
|
|
1889
1889
|
}
|
|
1890
1890
|
});
|
|
1891
1891
|
}
|
|
1892
|
-
function
|
|
1892
|
+
function Ki(e) {
|
|
1893
1893
|
let t = () => e.entity.attributes ?? {};
|
|
1894
|
-
return
|
|
1894
|
+
return N(Wi, {
|
|
1895
1895
|
icon: "lucide:activity",
|
|
1896
1896
|
get title() {
|
|
1897
1897
|
return e.entity.friendly_name ?? e.entity.entity_id;
|
|
@@ -1900,7 +1900,7 @@ function Gi(e) {
|
|
|
1900
1900
|
return e.entity.entity_id;
|
|
1901
1901
|
},
|
|
1902
1902
|
get badge() {
|
|
1903
|
-
return
|
|
1903
|
+
return N(Ee, { get children() {
|
|
1904
1904
|
return e.entity.state;
|
|
1905
1905
|
} });
|
|
1906
1906
|
},
|
|
@@ -1909,52 +1909,52 @@ function Gi(e) {
|
|
|
1909
1909
|
},
|
|
1910
1910
|
get children() {
|
|
1911
1911
|
return [(() => {
|
|
1912
|
-
var t =
|
|
1913
|
-
return
|
|
1912
|
+
var t = Ai();
|
|
1913
|
+
return F(t, N(V, {
|
|
1914
1914
|
label: "Domain",
|
|
1915
1915
|
get children() {
|
|
1916
1916
|
return e.entity.domain;
|
|
1917
1917
|
}
|
|
1918
|
-
}), null),
|
|
1918
|
+
}), null), F(t, N(T, {
|
|
1919
1919
|
get when() {
|
|
1920
1920
|
return e.entity.device_class;
|
|
1921
1921
|
},
|
|
1922
|
-
children: (e) =>
|
|
1922
|
+
children: (e) => N(V, {
|
|
1923
1923
|
label: "Device class",
|
|
1924
1924
|
get children() {
|
|
1925
1925
|
return e();
|
|
1926
1926
|
}
|
|
1927
1927
|
})
|
|
1928
|
-
}), null),
|
|
1928
|
+
}), null), F(t, N(T, {
|
|
1929
1929
|
get when() {
|
|
1930
1930
|
return e.entity.area_id;
|
|
1931
1931
|
},
|
|
1932
|
-
children: (e) =>
|
|
1932
|
+
children: (e) => N(V, {
|
|
1933
1933
|
label: "Area",
|
|
1934
1934
|
get children() {
|
|
1935
1935
|
return e();
|
|
1936
1936
|
}
|
|
1937
1937
|
})
|
|
1938
|
-
}), null),
|
|
1938
|
+
}), null), F(t, N(V, {
|
|
1939
1939
|
label: "Changed",
|
|
1940
1940
|
get children() {
|
|
1941
|
-
return
|
|
1941
|
+
return Vi(e.entity.last_changed);
|
|
1942
1942
|
}
|
|
1943
|
-
}), null),
|
|
1943
|
+
}), null), F(t, N(V, {
|
|
1944
1944
|
label: "Updated",
|
|
1945
1945
|
get children() {
|
|
1946
|
-
return
|
|
1946
|
+
return Vi(e.entity.last_updated);
|
|
1947
1947
|
}
|
|
1948
1948
|
}), null), t;
|
|
1949
|
-
})(),
|
|
1949
|
+
})(), N(T, {
|
|
1950
1950
|
get when() {
|
|
1951
|
-
return
|
|
1951
|
+
return Bi(t()) > 0;
|
|
1952
1952
|
},
|
|
1953
1953
|
get children() {
|
|
1954
|
-
return
|
|
1954
|
+
return N(Ui, {
|
|
1955
1955
|
label: "Attributes",
|
|
1956
1956
|
get count() {
|
|
1957
|
-
return
|
|
1957
|
+
return Bi(t());
|
|
1958
1958
|
},
|
|
1959
1959
|
get value() {
|
|
1960
1960
|
return t();
|
|
@@ -1965,42 +1965,42 @@ function Gi(e) {
|
|
|
1965
1965
|
}
|
|
1966
1966
|
});
|
|
1967
1967
|
}
|
|
1968
|
-
function
|
|
1968
|
+
function qi(e) {
|
|
1969
1969
|
let t = O(() => Object.keys(e.data).filter((e) => e !== "widgetConfig" && e !== "entities"));
|
|
1970
|
-
return
|
|
1970
|
+
return N(Ke, { get children() {
|
|
1971
1971
|
return [
|
|
1972
|
-
|
|
1972
|
+
N(Wi, {
|
|
1973
1973
|
icon: "lucide:sliders-horizontal",
|
|
1974
1974
|
title: "Configuration",
|
|
1975
1975
|
get source() {
|
|
1976
1976
|
return e.data.widgetConfig;
|
|
1977
1977
|
},
|
|
1978
1978
|
get children() {
|
|
1979
|
-
return
|
|
1979
|
+
return N(Gi, { get record() {
|
|
1980
1980
|
return e.data.widgetConfig;
|
|
1981
1981
|
} });
|
|
1982
1982
|
}
|
|
1983
1983
|
}),
|
|
1984
|
-
|
|
1984
|
+
N(w, {
|
|
1985
1985
|
get each() {
|
|
1986
1986
|
return e.data.entities;
|
|
1987
1987
|
},
|
|
1988
|
-
children: (e) =>
|
|
1988
|
+
children: (e) => N(Ki, { entity: e })
|
|
1989
1989
|
}),
|
|
1990
|
-
|
|
1990
|
+
N(w, {
|
|
1991
1991
|
get each() {
|
|
1992
1992
|
return t();
|
|
1993
1993
|
},
|
|
1994
|
-
children: (t) =>
|
|
1994
|
+
children: (t) => N(Wi, {
|
|
1995
1995
|
icon: "lucide:braces",
|
|
1996
1996
|
get title() {
|
|
1997
|
-
return
|
|
1997
|
+
return Li(t);
|
|
1998
1998
|
},
|
|
1999
1999
|
get source() {
|
|
2000
2000
|
return e.data[t];
|
|
2001
2001
|
},
|
|
2002
2002
|
get children() {
|
|
2003
|
-
return
|
|
2003
|
+
return N(Hi, { get value() {
|
|
2004
2004
|
return e.data[t];
|
|
2005
2005
|
} });
|
|
2006
2006
|
}
|
|
@@ -2009,52 +2009,52 @@ function Ki(e) {
|
|
|
2009
2009
|
];
|
|
2010
2010
|
} });
|
|
2011
2011
|
}
|
|
2012
|
-
function
|
|
2012
|
+
function Ji(e) {
|
|
2013
2013
|
if (typeof e != "object" || !e) return;
|
|
2014
2014
|
let t = e;
|
|
2015
2015
|
return Array.isArray(t.entities) && typeof t.widgetConfig == "object" ? t : void 0;
|
|
2016
2016
|
}
|
|
2017
|
-
function
|
|
2018
|
-
let t = O(() =>
|
|
2019
|
-
return
|
|
2017
|
+
function Yi(e) {
|
|
2018
|
+
let t = O(() => Ji(e.data));
|
|
2019
|
+
return N(T, {
|
|
2020
2020
|
get when() {
|
|
2021
2021
|
return e.data !== void 0;
|
|
2022
2022
|
},
|
|
2023
2023
|
get fallback() {
|
|
2024
|
-
return
|
|
2025
|
-
return
|
|
2026
|
-
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." })];
|
|
2027
2027
|
} });
|
|
2028
2028
|
} });
|
|
2029
2029
|
},
|
|
2030
2030
|
get children() {
|
|
2031
|
-
return
|
|
2031
|
+
return N(T, {
|
|
2032
2032
|
get when() {
|
|
2033
2033
|
return t();
|
|
2034
2034
|
},
|
|
2035
2035
|
get fallback() {
|
|
2036
|
-
return
|
|
2036
|
+
return N(Wi, {
|
|
2037
2037
|
icon: "lucide:braces",
|
|
2038
2038
|
title: "Debug data",
|
|
2039
2039
|
get source() {
|
|
2040
2040
|
return e.data;
|
|
2041
2041
|
},
|
|
2042
2042
|
get children() {
|
|
2043
|
-
return
|
|
2043
|
+
return N(T, {
|
|
2044
2044
|
get when() {
|
|
2045
2045
|
return typeof e.data == "string";
|
|
2046
2046
|
},
|
|
2047
2047
|
get fallback() {
|
|
2048
|
-
return
|
|
2048
|
+
return N(Hi, { get value() {
|
|
2049
2049
|
return e.data;
|
|
2050
2050
|
} });
|
|
2051
2051
|
},
|
|
2052
2052
|
get children() {
|
|
2053
|
-
return
|
|
2053
|
+
return N(gt, {
|
|
2054
2054
|
class: "overflow-hidden p-0",
|
|
2055
2055
|
get children() {
|
|
2056
|
-
var t =
|
|
2057
|
-
return
|
|
2056
|
+
var t = ji();
|
|
2057
|
+
return F(t, () => e.data), t;
|
|
2058
2058
|
}
|
|
2059
2059
|
});
|
|
2060
2060
|
}
|
|
@@ -2062,7 +2062,7 @@ function Ji(e) {
|
|
|
2062
2062
|
}
|
|
2063
2063
|
});
|
|
2064
2064
|
},
|
|
2065
|
-
children: (e) =>
|
|
2065
|
+
children: (e) => N(qi, { get data() {
|
|
2066
2066
|
return e();
|
|
2067
2067
|
} })
|
|
2068
2068
|
});
|
|
@@ -2071,21 +2071,21 @@ function Ji(e) {
|
|
|
2071
2071
|
}
|
|
2072
2072
|
//#endregion
|
|
2073
2073
|
//#region src/framework/dialogs/validate-config.ts
|
|
2074
|
-
function
|
|
2074
|
+
function Xi(e) {
|
|
2075
2075
|
let t = "";
|
|
2076
2076
|
for (let n of e) t += typeof n == "number" ? `[${n}]` : t ? `.${String(n)}` : String(n);
|
|
2077
2077
|
return t;
|
|
2078
2078
|
}
|
|
2079
|
-
function
|
|
2079
|
+
function Zi(e, t) {
|
|
2080
2080
|
let n = e.safeParse(t);
|
|
2081
2081
|
return n.success ? null : n.error.issues.map((e) => {
|
|
2082
|
-
let t =
|
|
2082
|
+
let t = Xi(e.path);
|
|
2083
2083
|
return t ? `${t}: ${e.message}` : e.message;
|
|
2084
2084
|
});
|
|
2085
2085
|
}
|
|
2086
2086
|
//#endregion
|
|
2087
2087
|
//#region src/framework/dialogs/WidgetDialog.tsx
|
|
2088
|
-
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 = {
|
|
2089
2089
|
sm: "sm",
|
|
2090
2090
|
md: "md",
|
|
2091
2091
|
lg: "lg",
|
|
@@ -2094,24 +2094,24 @@ var Zi = /*#__PURE__*/ V("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 f
|
|
|
2094
2094
|
"2xl": "xl",
|
|
2095
2095
|
"3xl": "xl",
|
|
2096
2096
|
"4xl": "full"
|
|
2097
|
-
},
|
|
2097
|
+
}, ca = {
|
|
2098
2098
|
idle: "Copy all",
|
|
2099
2099
|
copied: "Copied",
|
|
2100
2100
|
failed: "Copy failed"
|
|
2101
2101
|
};
|
|
2102
|
-
function
|
|
2102
|
+
function la(e) {
|
|
2103
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([]);
|
|
2104
2104
|
D(me(() => t.config, (e) => {
|
|
2105
2105
|
e && i({ ...e });
|
|
2106
2106
|
})), D(me(() => t.configSchema, (e) => {
|
|
2107
|
-
e && o(
|
|
2107
|
+
e && o(oa(e));
|
|
2108
2108
|
}));
|
|
2109
2109
|
let l = () => n() && JSON.stringify(r()) !== JSON.stringify(t.config), u = (e) => {
|
|
2110
2110
|
!e && t.config && (i({ ...t.config }), c([])), t.onOpenChange(e);
|
|
2111
2111
|
}, d = () => {
|
|
2112
2112
|
let e = t.configSchema;
|
|
2113
2113
|
if (e) {
|
|
2114
|
-
let t =
|
|
2114
|
+
let t = Zi(e, r());
|
|
2115
2115
|
if (t) {
|
|
2116
2116
|
c(t);
|
|
2117
2117
|
return;
|
|
@@ -2120,7 +2120,7 @@ function ca(e) {
|
|
|
2120
2120
|
c([]), t.onConfigSave?.(r());
|
|
2121
2121
|
}, [f, p] = k(t.defaultTab ?? "controls"), m = () => t.activeTab ?? f(), h = (e) => {
|
|
2122
2122
|
t.onActiveTabChange ? t.onActiveTabChange(e) : p(e);
|
|
2123
|
-
}, g = () =>
|
|
2123
|
+
}, g = () => sa[t.maxWidth ?? "xl"], _ = () => {
|
|
2124
2124
|
if (t.tabs) return t.tabs.map((e) => ({
|
|
2125
2125
|
...e,
|
|
2126
2126
|
icon: () => e.icon,
|
|
@@ -2130,10 +2130,10 @@ function ca(e) {
|
|
|
2130
2130
|
return e.push({
|
|
2131
2131
|
id: "edit",
|
|
2132
2132
|
label: "Edit",
|
|
2133
|
-
icon: () =>
|
|
2133
|
+
icon: () => Qi(),
|
|
2134
2134
|
content: () => t.editContent ?? (() => {
|
|
2135
2135
|
let e = t.SchemaForm, o = n() ? a() : void 0;
|
|
2136
|
-
return !o || !e ?
|
|
2136
|
+
return !o || !e ? $i() : N(e, {
|
|
2137
2137
|
schema: o,
|
|
2138
2138
|
get data() {
|
|
2139
2139
|
return r();
|
|
@@ -2147,86 +2147,86 @@ function ca(e) {
|
|
|
2147
2147
|
}), e.push({
|
|
2148
2148
|
id: "controls",
|
|
2149
2149
|
label: "Controls",
|
|
2150
|
-
icon: () =>
|
|
2151
|
-
content: () => t.controlsContent ??
|
|
2152
|
-
return
|
|
2153
|
-
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." })];
|
|
2154
2154
|
} });
|
|
2155
2155
|
} })
|
|
2156
2156
|
}), e.push({
|
|
2157
2157
|
id: "debug",
|
|
2158
2158
|
label: "Debug",
|
|
2159
|
-
icon: () =>
|
|
2160
|
-
content: () => t.debugContent ??
|
|
2159
|
+
icon: () => ta(),
|
|
2160
|
+
content: () => t.debugContent ?? N(Yi, { get data() {
|
|
2161
2161
|
return t.debugData;
|
|
2162
2162
|
} })
|
|
2163
2163
|
}), e;
|
|
2164
|
-
}, v = j(
|
|
2164
|
+
}, v = j(U), y = hn(v);
|
|
2165
2165
|
D(() => y?.setHasSheet(t.sheet !== void 0)), A(() => y?.setHasSheet(!1));
|
|
2166
2166
|
let b = () => ({
|
|
2167
2167
|
icon: t.tile?.icon ?? y?.icon(),
|
|
2168
2168
|
tone: t.tile?.tone ?? y?.accent() ?? y?.tone(),
|
|
2169
2169
|
backdrop: t.tile?.backdrop
|
|
2170
|
-
}), 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 = () => {
|
|
2171
2171
|
if (t.debugData === void 0) return;
|
|
2172
2172
|
let e = typeof t.debugData == "string" ? t.debugData : JSON.stringify(t.debugData, null, 2);
|
|
2173
|
-
|
|
2174
|
-
},
|
|
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([
|
|
2175
2175
|
() => t.open,
|
|
2176
2176
|
a,
|
|
2177
2177
|
() => t.config,
|
|
2178
2178
|
() => t.tabs
|
|
2179
|
-
], () => _())),
|
|
2180
|
-
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();
|
|
2181
2181
|
return e.some((e) => e.id === n) ? n : e[0]?.id ?? n;
|
|
2182
|
-
},
|
|
2183
|
-
return
|
|
2182
|
+
}, be = () => B() === "edit" && (ye() || t.onDelete) || B() === "debug" && t.debugData !== void 0;
|
|
2183
|
+
return N(ie, {
|
|
2184
2184
|
get open() {
|
|
2185
2185
|
return t.open;
|
|
2186
2186
|
},
|
|
2187
|
-
onOpenChange: (e) =>
|
|
2187
|
+
onOpenChange: (e) => ve(e),
|
|
2188
2188
|
get children() {
|
|
2189
|
-
return
|
|
2189
|
+
return N(T, {
|
|
2190
2190
|
get when() {
|
|
2191
2191
|
return !S();
|
|
2192
2192
|
},
|
|
2193
2193
|
get fallback() {
|
|
2194
|
-
return
|
|
2194
|
+
return N(ae, {
|
|
2195
2195
|
size: "sm",
|
|
2196
2196
|
get ariaLabel() {
|
|
2197
2197
|
return t.title;
|
|
2198
2198
|
},
|
|
2199
2199
|
get anchor() {
|
|
2200
|
-
return
|
|
2200
|
+
return I(() => !!ne())() ? te() : void 0;
|
|
2201
2201
|
},
|
|
2202
2202
|
class: "glasshome-sheet-surface",
|
|
2203
2203
|
get style() {
|
|
2204
|
-
return
|
|
2204
|
+
return I(() => !!b().tone)() ? {
|
|
2205
2205
|
"--glass-tone": b().tone,
|
|
2206
2206
|
"--widget-color": b().tone
|
|
2207
2207
|
} : void 0;
|
|
2208
2208
|
},
|
|
2209
2209
|
get children() {
|
|
2210
2210
|
return [
|
|
2211
|
-
|
|
2211
|
+
N(T, {
|
|
2212
2212
|
get when() {
|
|
2213
2213
|
return b().backdrop;
|
|
2214
2214
|
},
|
|
2215
2215
|
children: (e) => (() => {
|
|
2216
|
-
var t =
|
|
2217
|
-
return
|
|
2216
|
+
var t = ra(), n = t.firstChild;
|
|
2217
|
+
return P(() => L(n, "src", e())), t;
|
|
2218
2218
|
})()
|
|
2219
2219
|
}),
|
|
2220
|
-
|
|
2220
|
+
N(oe, {
|
|
2221
2221
|
class: "items-center",
|
|
2222
2222
|
get media() {
|
|
2223
|
-
return
|
|
2223
|
+
return N(T, {
|
|
2224
2224
|
get when() {
|
|
2225
2225
|
return b().icon;
|
|
2226
2226
|
},
|
|
2227
2227
|
children: (e) => (() => {
|
|
2228
|
-
var t =
|
|
2229
|
-
return
|
|
2228
|
+
var t = ia();
|
|
2229
|
+
return F(t, N(H, {
|
|
2230
2230
|
get icon() {
|
|
2231
2231
|
return e();
|
|
2232
2232
|
},
|
|
@@ -2236,7 +2236,7 @@ function ca(e) {
|
|
|
2236
2236
|
});
|
|
2237
2237
|
},
|
|
2238
2238
|
get children() {
|
|
2239
|
-
return
|
|
2239
|
+
return N(se, {
|
|
2240
2240
|
class: "truncate",
|
|
2241
2241
|
get children() {
|
|
2242
2242
|
return t.title;
|
|
@@ -2244,16 +2244,16 @@ function ca(e) {
|
|
|
2244
2244
|
});
|
|
2245
2245
|
}
|
|
2246
2246
|
}),
|
|
2247
|
-
|
|
2248
|
-
var e =
|
|
2249
|
-
return
|
|
2247
|
+
N(le, { get children() {
|
|
2248
|
+
var e = na();
|
|
2249
|
+
return F(e, () => t.sheet?.()), e;
|
|
2250
2250
|
} })
|
|
2251
2251
|
];
|
|
2252
2252
|
}
|
|
2253
2253
|
});
|
|
2254
2254
|
},
|
|
2255
2255
|
get children() {
|
|
2256
|
-
return
|
|
2256
|
+
return N(ae, {
|
|
2257
2257
|
get size() {
|
|
2258
2258
|
return g();
|
|
2259
2259
|
},
|
|
@@ -2261,70 +2261,70 @@ function ca(e) {
|
|
|
2261
2261
|
return t.class;
|
|
2262
2262
|
},
|
|
2263
2263
|
get children() {
|
|
2264
|
-
return
|
|
2264
|
+
return N(de, {
|
|
2265
2265
|
get value() {
|
|
2266
|
-
return
|
|
2266
|
+
return B();
|
|
2267
2267
|
},
|
|
2268
2268
|
onChange: h,
|
|
2269
2269
|
layout: "split",
|
|
2270
2270
|
get children() {
|
|
2271
2271
|
return [
|
|
2272
|
-
|
|
2272
|
+
N(oe, {
|
|
2273
2273
|
class: "flex-wrap",
|
|
2274
2274
|
get action() {
|
|
2275
|
-
return [
|
|
2275
|
+
return [N(T, {
|
|
2276
2276
|
get when() {
|
|
2277
2277
|
return x() || t.tabs !== void 0;
|
|
2278
2278
|
},
|
|
2279
2279
|
get children() {
|
|
2280
|
-
return
|
|
2280
|
+
return N(fe, {
|
|
2281
2281
|
class: "w-auto",
|
|
2282
2282
|
get children() {
|
|
2283
|
-
return
|
|
2283
|
+
return N(w, {
|
|
2284
2284
|
get each() {
|
|
2285
|
-
return
|
|
2285
|
+
return z();
|
|
2286
2286
|
},
|
|
2287
|
-
children: (e) =>
|
|
2287
|
+
children: (e) => N(E, {
|
|
2288
2288
|
get value() {
|
|
2289
2289
|
return e.id;
|
|
2290
2290
|
},
|
|
2291
2291
|
get children() {
|
|
2292
2292
|
return [(() => {
|
|
2293
|
-
var t =
|
|
2294
|
-
return
|
|
2295
|
-
})(),
|
|
2293
|
+
var t = aa();
|
|
2294
|
+
return F(t, () => e.icon()), t;
|
|
2295
|
+
})(), I(() => e.label)];
|
|
2296
2296
|
}
|
|
2297
2297
|
})
|
|
2298
2298
|
});
|
|
2299
2299
|
}
|
|
2300
2300
|
});
|
|
2301
2301
|
}
|
|
2302
|
-
}),
|
|
2302
|
+
}), I(() => t.headerActions)];
|
|
2303
2303
|
},
|
|
2304
2304
|
get children() {
|
|
2305
|
-
return [
|
|
2305
|
+
return [N(se, {
|
|
2306
2306
|
class: "truncate",
|
|
2307
2307
|
get children() {
|
|
2308
2308
|
return t.title;
|
|
2309
2309
|
}
|
|
2310
|
-
}),
|
|
2310
|
+
}), N(T, {
|
|
2311
2311
|
get when() {
|
|
2312
2312
|
return t.description;
|
|
2313
2313
|
},
|
|
2314
2314
|
get children() {
|
|
2315
|
-
return
|
|
2315
|
+
return N(ce, { get children() {
|
|
2316
2316
|
return t.description;
|
|
2317
2317
|
} });
|
|
2318
2318
|
}
|
|
2319
2319
|
})];
|
|
2320
2320
|
}
|
|
2321
2321
|
}),
|
|
2322
|
-
|
|
2323
|
-
return
|
|
2322
|
+
N(le, { get children() {
|
|
2323
|
+
return N(w, {
|
|
2324
2324
|
get each() {
|
|
2325
|
-
return
|
|
2325
|
+
return R();
|
|
2326
2326
|
},
|
|
2327
|
-
children: (e) =>
|
|
2327
|
+
children: (e) => N(pe, {
|
|
2328
2328
|
get value() {
|
|
2329
2329
|
return e.id;
|
|
2330
2330
|
},
|
|
@@ -2334,19 +2334,19 @@ function ca(e) {
|
|
|
2334
2334
|
})
|
|
2335
2335
|
});
|
|
2336
2336
|
} }),
|
|
2337
|
-
|
|
2337
|
+
N(T, {
|
|
2338
2338
|
get when() {
|
|
2339
|
-
return
|
|
2339
|
+
return be();
|
|
2340
2340
|
},
|
|
2341
2341
|
get children() {
|
|
2342
|
-
return
|
|
2342
|
+
return N(ue, { get children() {
|
|
2343
2343
|
return [
|
|
2344
|
-
|
|
2344
|
+
N(T, {
|
|
2345
2345
|
get when() {
|
|
2346
|
-
return
|
|
2346
|
+
return I(() => B() === "edit")() && t.onDelete;
|
|
2347
2347
|
},
|
|
2348
2348
|
get children() {
|
|
2349
|
-
return
|
|
2349
|
+
return N(he, {
|
|
2350
2350
|
size: "sm",
|
|
2351
2351
|
variant: "destructive",
|
|
2352
2352
|
onClick: () => t.onDelete?.(),
|
|
@@ -2354,32 +2354,32 @@ function ca(e) {
|
|
|
2354
2354
|
});
|
|
2355
2355
|
}
|
|
2356
2356
|
}),
|
|
2357
|
-
|
|
2357
|
+
N(T, {
|
|
2358
2358
|
get when() {
|
|
2359
|
-
return
|
|
2359
|
+
return I(() => B() === "edit")() && ye();
|
|
2360
2360
|
},
|
|
2361
2361
|
get children() {
|
|
2362
|
-
return
|
|
2362
|
+
return N(he, {
|
|
2363
2363
|
size: "sm",
|
|
2364
2364
|
get disabled() {
|
|
2365
|
-
return !
|
|
2365
|
+
return !M();
|
|
2366
2366
|
},
|
|
2367
|
-
onClick: () =>
|
|
2367
|
+
onClick: () => ye()?.(),
|
|
2368
2368
|
children: "Save"
|
|
2369
2369
|
});
|
|
2370
2370
|
}
|
|
2371
2371
|
}),
|
|
2372
|
-
|
|
2372
|
+
N(T, {
|
|
2373
2373
|
get when() {
|
|
2374
|
-
return
|
|
2374
|
+
return I(() => B() === "debug")() && t.debugData !== void 0;
|
|
2375
2375
|
},
|
|
2376
2376
|
get children() {
|
|
2377
|
-
return
|
|
2377
|
+
return N(he, {
|
|
2378
2378
|
size: "sm",
|
|
2379
2379
|
variant: "outline",
|
|
2380
|
-
onClick:
|
|
2380
|
+
onClick: re,
|
|
2381
2381
|
get children() {
|
|
2382
|
-
return
|
|
2382
|
+
return ca[C.state()];
|
|
2383
2383
|
}
|
|
2384
2384
|
});
|
|
2385
2385
|
}
|
|
@@ -2398,7 +2398,7 @@ function ca(e) {
|
|
|
2398
2398
|
}
|
|
2399
2399
|
});
|
|
2400
2400
|
}
|
|
2401
|
-
function
|
|
2401
|
+
function ua() {
|
|
2402
2402
|
let e = "(max-width: 639px)", [t, n] = k(typeof window < "u" && window.matchMedia(e).matches);
|
|
2403
2403
|
return he(() => {
|
|
2404
2404
|
let t = window.matchMedia(e), r = () => n(t.matches);
|
|
@@ -2406,78 +2406,184 @@ function la() {
|
|
|
2406
2406
|
}), t;
|
|
2407
2407
|
}
|
|
2408
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
|
|
2409
2515
|
//#region src/framework/hooks/use-widget-dashboard.ts
|
|
2410
|
-
var
|
|
2516
|
+
var ka = {
|
|
2411
2517
|
name: "",
|
|
2412
2518
|
icon: "",
|
|
2413
2519
|
areaId: null
|
|
2414
2520
|
};
|
|
2415
|
-
function
|
|
2416
|
-
let e = j(
|
|
2417
|
-
return () => e?.dashboard?.() ??
|
|
2521
|
+
function Aa() {
|
|
2522
|
+
let e = j(U);
|
|
2523
|
+
return () => e?.dashboard?.() ?? ka;
|
|
2418
2524
|
}
|
|
2419
2525
|
//#endregion
|
|
2420
2526
|
//#region src/framework/hooks/use-widget-viewer.ts
|
|
2421
|
-
var
|
|
2422
|
-
function
|
|
2423
|
-
let e = j(
|
|
2424
|
-
return () => e?.viewer?.() ??
|
|
2527
|
+
var ja = { name: null };
|
|
2528
|
+
function Ma() {
|
|
2529
|
+
let e = j(U);
|
|
2530
|
+
return () => e?.viewer?.() ?? ja;
|
|
2425
2531
|
}
|
|
2426
2532
|
//#endregion
|
|
2427
2533
|
//#region node_modules/@glasshome/ui/dist/tokens/index.js
|
|
2428
|
-
var
|
|
2429
|
-
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) {
|
|
2430
2536
|
return Math.min(Math.max(e, t), n);
|
|
2431
2537
|
}
|
|
2432
|
-
function
|
|
2538
|
+
function Fa(e) {
|
|
2433
2539
|
return String(Number.isInteger(e) ? e : Number(e.toFixed(6)));
|
|
2434
2540
|
}
|
|
2435
|
-
function
|
|
2436
|
-
let t =
|
|
2541
|
+
function Ia(e) {
|
|
2542
|
+
let t = Na.exec(e.trim());
|
|
2437
2543
|
return t ? {
|
|
2438
2544
|
l: Number(t[1]),
|
|
2439
2545
|
c: Number(t[2]),
|
|
2440
2546
|
h: Number(t[3])
|
|
2441
2547
|
} : null;
|
|
2442
2548
|
}
|
|
2443
|
-
function
|
|
2444
|
-
return `oklch(${
|
|
2549
|
+
function La(e, t, n) {
|
|
2550
|
+
return `oklch(${Fa(e)} ${Fa(t)} ${Fa(n)})`;
|
|
2445
2551
|
}
|
|
2446
|
-
function
|
|
2447
|
-
let n =
|
|
2448
|
-
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;
|
|
2449
2555
|
}
|
|
2450
|
-
function
|
|
2451
|
-
let n =
|
|
2452
|
-
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;
|
|
2453
2559
|
}
|
|
2454
|
-
function
|
|
2560
|
+
function Ba(e, t) {
|
|
2455
2561
|
return {
|
|
2456
2562
|
...e,
|
|
2457
2563
|
popover: e.card,
|
|
2458
|
-
muted: t === "light" ?
|
|
2564
|
+
muted: t === "light" ? Ra(e.background, -.015) : Ra(e.background, .1),
|
|
2459
2565
|
mutedForeground: t === "light" ? "oklch(0.44 0 0)" : "oklch(0.71 0 0)",
|
|
2460
|
-
input: t === "light" ?
|
|
2566
|
+
input: t === "light" ? Ra(e.border, .01) : Ra(e.border, .04),
|
|
2461
2567
|
ring: e.accent,
|
|
2462
2568
|
destructive: t === "light" ? "oklch(0.54 0.19 23.0704)" : "oklch(0.7106 0.1661 22.2162)"
|
|
2463
2569
|
};
|
|
2464
2570
|
}
|
|
2465
|
-
function
|
|
2466
|
-
return
|
|
2467
|
-
primary:
|
|
2468
|
-
accent:
|
|
2469
|
-
secondary:
|
|
2470
|
-
border:
|
|
2471
|
-
card:
|
|
2472
|
-
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)
|
|
2473
2579
|
}, "dark");
|
|
2474
2580
|
}
|
|
2475
|
-
var
|
|
2581
|
+
var Ha = {
|
|
2476
2582
|
edgeWidth: 1,
|
|
2477
2583
|
edgeInk: 0,
|
|
2478
2584
|
edgeAccent: 0,
|
|
2479
2585
|
inkLift: 0
|
|
2480
|
-
},
|
|
2586
|
+
}, Ua = {
|
|
2481
2587
|
frosted: {
|
|
2482
2588
|
blur: 24,
|
|
2483
2589
|
clarity: 60,
|
|
@@ -2485,7 +2591,7 @@ var Ca = {
|
|
|
2485
2591
|
tint: 1,
|
|
2486
2592
|
glow: 0,
|
|
2487
2593
|
ink: 0,
|
|
2488
|
-
...
|
|
2594
|
+
...Ha
|
|
2489
2595
|
},
|
|
2490
2596
|
frost: {
|
|
2491
2597
|
blur: 24,
|
|
@@ -2494,7 +2600,7 @@ var Ca = {
|
|
|
2494
2600
|
tint: 1,
|
|
2495
2601
|
glow: 0,
|
|
2496
2602
|
ink: 0,
|
|
2497
|
-
...
|
|
2603
|
+
...Ha,
|
|
2498
2604
|
grain: .4
|
|
2499
2605
|
},
|
|
2500
2606
|
paper: {
|
|
@@ -2504,7 +2610,7 @@ var Ca = {
|
|
|
2504
2610
|
tint: .85,
|
|
2505
2611
|
glow: 0,
|
|
2506
2612
|
ink: 0,
|
|
2507
|
-
...
|
|
2613
|
+
...Ha,
|
|
2508
2614
|
edgeInk: .3,
|
|
2509
2615
|
sheen: 0,
|
|
2510
2616
|
edge: .2,
|
|
@@ -2534,13 +2640,13 @@ var Ca = {
|
|
|
2534
2640
|
tint: .7,
|
|
2535
2641
|
glow: 0,
|
|
2536
2642
|
ink: 1,
|
|
2537
|
-
...
|
|
2643
|
+
...Ha,
|
|
2538
2644
|
inkLift: 1
|
|
2539
2645
|
}
|
|
2540
|
-
},
|
|
2646
|
+
}, Wa = {
|
|
2541
2647
|
v: 1,
|
|
2542
2648
|
preset: "frosted"
|
|
2543
|
-
},
|
|
2649
|
+
}, Ga = {
|
|
2544
2650
|
blur: [0, 48],
|
|
2545
2651
|
clarity: [0, 100],
|
|
2546
2652
|
depth: [0, 2],
|
|
@@ -2560,7 +2666,7 @@ var Ca = {
|
|
|
2560
2666
|
washAngle: [0, 360],
|
|
2561
2667
|
relief: [0, 2],
|
|
2562
2668
|
fill: [0, .6]
|
|
2563
|
-
},
|
|
2669
|
+
}, Ka = {
|
|
2564
2670
|
vibrancy: 1,
|
|
2565
2671
|
inset: 0,
|
|
2566
2672
|
lightFrom: 315,
|
|
@@ -2576,10 +2682,10 @@ var Ca = {
|
|
|
2576
2682
|
relief: 1,
|
|
2577
2683
|
accent: "theme",
|
|
2578
2684
|
fill: 0
|
|
2579
|
-
},
|
|
2580
|
-
function
|
|
2581
|
-
let { edgeWidth: t, edgeInk: n, edgeAccent: r, inkLift: i, ...a } =
|
|
2582
|
-
...
|
|
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,
|
|
2583
2689
|
...a,
|
|
2584
2690
|
...e.dials
|
|
2585
2691
|
}, s = {
|
|
@@ -2588,7 +2694,7 @@ function ka(e) {
|
|
|
2588
2694
|
sheen: o.sheen ?? o.depth,
|
|
2589
2695
|
shadow: o.shadow ?? o.depth
|
|
2590
2696
|
};
|
|
2591
|
-
for (let e of
|
|
2697
|
+
for (let e of qa) s[e] = Pa(s[e], ...Ga[e]);
|
|
2592
2698
|
return s;
|
|
2593
2699
|
}
|
|
2594
2700
|
function Z(e, t) {
|
|
@@ -2615,8 +2721,8 @@ function Q(e, t, n, r, i, a, o, s) {
|
|
|
2615
2721
|
swatch: r,
|
|
2616
2722
|
material: s,
|
|
2617
2723
|
colors: {
|
|
2618
|
-
light:
|
|
2619
|
-
dark: o ?
|
|
2724
|
+
light: Ba(i, "light"),
|
|
2725
|
+
dark: o ? Ba(o, "dark") : Va(i)
|
|
2620
2726
|
},
|
|
2621
2727
|
background: a
|
|
2622
2728
|
};
|
|
@@ -2784,17 +2890,17 @@ Z("glass-house", {
|
|
|
2784
2890
|
});
|
|
2785
2891
|
//#endregion
|
|
2786
2892
|
//#region src/framework/hooks/use-material.ts
|
|
2787
|
-
var
|
|
2788
|
-
id:
|
|
2789
|
-
terms:
|
|
2893
|
+
var Ya = {
|
|
2894
|
+
id: Wa.preset,
|
|
2895
|
+
terms: Ja(Wa)
|
|
2790
2896
|
};
|
|
2791
|
-
function
|
|
2792
|
-
let e = j(
|
|
2793
|
-
return () => e?.material?.() ??
|
|
2897
|
+
function Xa() {
|
|
2898
|
+
let e = j(U);
|
|
2899
|
+
return () => e?.material?.() ?? Ya;
|
|
2794
2900
|
}
|
|
2795
2901
|
//#endregion
|
|
2796
2902
|
//#region src/framework/hooks/use-intersection-pause.ts
|
|
2797
|
-
function
|
|
2903
|
+
function Za(e) {
|
|
2798
2904
|
if (typeof IntersectionObserver > "u") return () => !1;
|
|
2799
2905
|
let [t, n] = k(!1), r = new IntersectionObserver((e) => {
|
|
2800
2906
|
let t = e[0];
|
|
@@ -2807,40 +2913,40 @@ function Ma(e) {
|
|
|
2807
2913
|
}
|
|
2808
2914
|
//#endregion
|
|
2809
2915
|
//#region src/framework/hooks/use-daylight.ts
|
|
2810
|
-
var
|
|
2811
|
-
function
|
|
2916
|
+
var Qa = -6, $a = 864e5;
|
|
2917
|
+
function eo(e, t) {
|
|
2812
2918
|
let n = e.next_rising ? Date.parse(e.next_rising) : NaN, r = e.next_setting ? Date.parse(e.next_setting) : NaN;
|
|
2813
2919
|
if (!Number.isFinite(n) || !Number.isFinite(r)) return;
|
|
2814
|
-
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;
|
|
2815
2921
|
if (!(o <= 0)) return Math.min(1, Math.max(0, (t.getTime() - i) / o));
|
|
2816
2922
|
}
|
|
2817
|
-
var
|
|
2818
|
-
function
|
|
2923
|
+
var to = 20, no = 7;
|
|
2924
|
+
function ro(e, t) {
|
|
2819
2925
|
if (e && (e.state === "above_horizon" || e.state === "below_horizon")) {
|
|
2820
|
-
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";
|
|
2821
2927
|
return {
|
|
2822
2928
|
phase: r,
|
|
2823
2929
|
isNight: r === "night",
|
|
2824
2930
|
elevation: n,
|
|
2825
|
-
progress:
|
|
2931
|
+
progress: eo(e, t)
|
|
2826
2932
|
};
|
|
2827
2933
|
}
|
|
2828
|
-
let n = t.getHours(), r = n >=
|
|
2934
|
+
let n = t.getHours(), r = n >= to || n < no ? "night" : "day";
|
|
2829
2935
|
return {
|
|
2830
2936
|
phase: r,
|
|
2831
2937
|
isNight: r === "night"
|
|
2832
2938
|
};
|
|
2833
2939
|
}
|
|
2834
|
-
var [
|
|
2835
|
-
function
|
|
2836
|
-
return
|
|
2837
|
-
|
|
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);
|
|
2838
2944
|
};
|
|
2839
2945
|
}
|
|
2840
|
-
function
|
|
2946
|
+
function lo() {
|
|
2841
2947
|
let e = te("sun.sun");
|
|
2842
2948
|
return D(() => {
|
|
2843
|
-
e() || A(
|
|
2949
|
+
e() || A(co());
|
|
2844
2950
|
}), O(() => {
|
|
2845
2951
|
let t = e(), n = t ? {
|
|
2846
2952
|
state: t.state,
|
|
@@ -2849,46 +2955,46 @@ function Wa() {
|
|
|
2849
2955
|
next_rising: t.attributes?.next_rising,
|
|
2850
2956
|
next_setting: t.attributes?.next_setting
|
|
2851
2957
|
} : void 0;
|
|
2852
|
-
return
|
|
2958
|
+
return ro(n, n ? /* @__PURE__ */ new Date() : io());
|
|
2853
2959
|
});
|
|
2854
2960
|
}
|
|
2855
2961
|
//#endregion
|
|
2856
2962
|
//#region src/theme.ts
|
|
2857
|
-
var
|
|
2858
|
-
function
|
|
2963
|
+
var uo = /* @__PURE__ */ new Map(), fo;
|
|
2964
|
+
function po(e) {
|
|
2859
2965
|
let t = new MutationObserver(() => {
|
|
2860
|
-
for (let [t, [, n]] of
|
|
2966
|
+
for (let [t, [, n]] of uo) n(e.classList.contains(t));
|
|
2861
2967
|
});
|
|
2862
2968
|
return t.observe(e, {
|
|
2863
2969
|
attributes: !0,
|
|
2864
2970
|
attributeFilter: ["class"]
|
|
2865
2971
|
}), t;
|
|
2866
2972
|
}
|
|
2867
|
-
function
|
|
2973
|
+
function mo(e) {
|
|
2868
2974
|
if (typeof document > "u") return !1;
|
|
2869
|
-
let t = document.documentElement, n =
|
|
2870
|
-
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);
|
|
2871
2977
|
}
|
|
2872
|
-
function
|
|
2873
|
-
return
|
|
2978
|
+
function ho() {
|
|
2979
|
+
return mo("dark");
|
|
2874
2980
|
}
|
|
2875
2981
|
//#endregion
|
|
2876
2982
|
//#region src/framework/hooks/use-reduced-motion.ts
|
|
2877
|
-
function
|
|
2983
|
+
function go() {
|
|
2878
2984
|
if (typeof window > "u" || typeof window.matchMedia != "function") return () => !1;
|
|
2879
2985
|
let e = window.matchMedia("(prefers-reduced-motion: reduce)"), [t, n] = k(e.matches), r = (e) => n(e.matches);
|
|
2880
|
-
return e.addEventListener("change", r), A(() => e.removeEventListener("change", r)), () => t() ||
|
|
2986
|
+
return e.addEventListener("change", r), A(() => e.removeEventListener("change", r)), () => t() || mo("reduce-motion");
|
|
2881
2987
|
}
|
|
2882
2988
|
//#endregion
|
|
2883
2989
|
//#region src/framework/hooks/use-widget-entity-group.ts
|
|
2884
|
-
function
|
|
2990
|
+
function _o(e) {
|
|
2885
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(() => {
|
|
2886
2992
|
if (!r()) return;
|
|
2887
2993
|
let t = e.aggregationMode?.();
|
|
2888
2994
|
if (!t || t === "none") return;
|
|
2889
2995
|
let n = e.entities();
|
|
2890
|
-
if (t === "light" || t === "binary-sensor" || t === "switch") return
|
|
2891
|
-
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);
|
|
2892
2998
|
}), o = O(() => r() ? void 0 : e.emptyStateConfig);
|
|
2893
2999
|
return {
|
|
2894
3000
|
entities: e.entities,
|
|
@@ -2901,7 +3007,7 @@ function Za(e) {
|
|
|
2901
3007
|
}
|
|
2902
3008
|
//#endregion
|
|
2903
3009
|
//#region src/framework/theming/svg-colors.ts
|
|
2904
|
-
var
|
|
3010
|
+
var vo = {
|
|
2905
3011
|
solar: "oklch(0.74 0.18 60)",
|
|
2906
3012
|
grid: "oklch(0.62 0.12 245)",
|
|
2907
3013
|
battery: "oklch(0.70 0.18 145)",
|
|
@@ -2910,21 +3016,21 @@ var Qa = {
|
|
|
2910
3016
|
positive: "oklch(0.70 0.14 160)",
|
|
2911
3017
|
negative: "oklch(0.64 0.22 27)"
|
|
2912
3018
|
};
|
|
2913
|
-
function
|
|
3019
|
+
function yo(e) {
|
|
2914
3020
|
return {
|
|
2915
3021
|
fill: `color-mix(in oklch, ${e} 20%, transparent)`,
|
|
2916
3022
|
stroke: e,
|
|
2917
3023
|
solid: e
|
|
2918
3024
|
};
|
|
2919
3025
|
}
|
|
2920
|
-
var
|
|
3026
|
+
var bo = Object.fromEntries(Object.entries(vo).map(([e, t]) => [e, yo(t)])), xo = o.enum([
|
|
2921
3027
|
"success",
|
|
2922
3028
|
"warning",
|
|
2923
3029
|
"danger",
|
|
2924
3030
|
"info",
|
|
2925
3031
|
"neutral",
|
|
2926
3032
|
"accent"
|
|
2927
|
-
]),
|
|
3033
|
+
]), So = {
|
|
2928
3034
|
title: e(() => o.string().optional().meta({
|
|
2929
3035
|
title: "Title",
|
|
2930
3036
|
description: "Optional display name override"
|
|
@@ -2944,38 +3050,38 @@ var eo = Object.fromEntries(Object.entries(Qa).map(([e, t]) => [e, $a(t)])), to
|
|
|
2944
3050
|
formType: "area-picker",
|
|
2945
3051
|
title: "Area"
|
|
2946
3052
|
}), "widgetFields.areaId")
|
|
2947
|
-
},
|
|
3053
|
+
}, Co = 24;
|
|
2948
3054
|
function $(e) {
|
|
2949
3055
|
let t = {};
|
|
2950
3056
|
for (let [n, r] of Object.entries(e)) r !== void 0 && (t[n] = r);
|
|
2951
3057
|
return t;
|
|
2952
3058
|
}
|
|
2953
|
-
function
|
|
3059
|
+
function wo() {
|
|
2954
3060
|
return o.string().optional().meta({
|
|
2955
3061
|
title: "Title",
|
|
2956
3062
|
description: "Optional display name override"
|
|
2957
3063
|
});
|
|
2958
3064
|
}
|
|
2959
|
-
function
|
|
3065
|
+
function To(e) {
|
|
2960
3066
|
return (e.default === void 0 ? o.string().optional() : o.string().default(e.default)).meta($({
|
|
2961
3067
|
title: e.title,
|
|
2962
3068
|
description: e.description
|
|
2963
3069
|
}));
|
|
2964
3070
|
}
|
|
2965
|
-
function
|
|
3071
|
+
function Eo(e) {
|
|
2966
3072
|
let t = o.number();
|
|
2967
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($({
|
|
2968
3074
|
title: e.title,
|
|
2969
3075
|
description: e.description
|
|
2970
3076
|
}));
|
|
2971
3077
|
}
|
|
2972
|
-
function
|
|
3078
|
+
function Do(e) {
|
|
2973
3079
|
return o.boolean().default(e.default ?? !1).meta($({
|
|
2974
3080
|
title: e.title,
|
|
2975
3081
|
description: e.description
|
|
2976
3082
|
}));
|
|
2977
3083
|
}
|
|
2978
|
-
function
|
|
3084
|
+
function Oo(e, t) {
|
|
2979
3085
|
let n = o.enum(e);
|
|
2980
3086
|
return (t.default === void 0 ? n.optional() : n.default(t.default)).meta($({
|
|
2981
3087
|
title: t.title,
|
|
@@ -2984,14 +3090,14 @@ function co(e, t) {
|
|
|
2984
3090
|
icons: t.icons
|
|
2985
3091
|
}));
|
|
2986
3092
|
}
|
|
2987
|
-
function
|
|
3093
|
+
function ko(e, t) {
|
|
2988
3094
|
return o.array(o.enum(e)).default([...t.default ?? []]).meta($({
|
|
2989
3095
|
title: t.title,
|
|
2990
3096
|
description: t.description,
|
|
2991
3097
|
labels: t.labels
|
|
2992
3098
|
}));
|
|
2993
3099
|
}
|
|
2994
|
-
function
|
|
3100
|
+
function Ao(e, t) {
|
|
2995
3101
|
return o.array(o.string()).default([]).meta($({
|
|
2996
3102
|
domain: e,
|
|
2997
3103
|
title: t?.title ?? "Entities",
|
|
@@ -2999,7 +3105,7 @@ function uo(e, t) {
|
|
|
2999
3105
|
deviceClass: t?.deviceClass
|
|
3000
3106
|
}));
|
|
3001
3107
|
}
|
|
3002
|
-
function
|
|
3108
|
+
function jo(e, t) {
|
|
3003
3109
|
return o.array(o.string()).default([]).meta($({
|
|
3004
3110
|
domain: e,
|
|
3005
3111
|
title: t?.title ?? "Entity",
|
|
@@ -3008,13 +3114,13 @@ function fo(e, t) {
|
|
|
3008
3114
|
singleSelect: !0
|
|
3009
3115
|
}));
|
|
3010
3116
|
}
|
|
3011
|
-
function
|
|
3117
|
+
function Mo(e) {
|
|
3012
3118
|
return o.string().optional().meta({
|
|
3013
3119
|
formType: "area-picker",
|
|
3014
3120
|
title: e?.title ?? "Area"
|
|
3015
3121
|
});
|
|
3016
3122
|
}
|
|
3017
|
-
function
|
|
3123
|
+
function No(e) {
|
|
3018
3124
|
let t = o.string().meta($({
|
|
3019
3125
|
formType: "icon-picker",
|
|
3020
3126
|
title: e?.title ?? "Icon",
|
|
@@ -3022,7 +3128,7 @@ function mo(e) {
|
|
|
3022
3128
|
}));
|
|
3023
3129
|
return e?.default === void 0 ? t.optional() : t.default(e.default);
|
|
3024
3130
|
}
|
|
3025
|
-
function
|
|
3131
|
+
function Po(e) {
|
|
3026
3132
|
let t = e?.presets && Object.fromEntries(Object.entries(e.presets).map(([e, t]) => [e, {
|
|
3027
3133
|
label: t.label,
|
|
3028
3134
|
thumb: t.thumb
|
|
@@ -3034,36 +3140,36 @@ function ho(e) {
|
|
|
3034
3140
|
}));
|
|
3035
3141
|
return e?.default === void 0 ? n.optional() : n.default(e.default);
|
|
3036
3142
|
}
|
|
3037
|
-
function
|
|
3143
|
+
function Fo(e) {
|
|
3038
3144
|
return o.array(o.string()).default([]).meta($({
|
|
3039
3145
|
title: e.title,
|
|
3040
3146
|
description: e.description
|
|
3041
3147
|
}));
|
|
3042
3148
|
}
|
|
3043
|
-
function
|
|
3149
|
+
function Io(e, t) {
|
|
3044
3150
|
let n = o.object(e);
|
|
3045
|
-
return n.default(
|
|
3151
|
+
return n.default(tn(n)).meta({ title: t.title });
|
|
3046
3152
|
}
|
|
3047
|
-
function
|
|
3153
|
+
function Lo(e) {
|
|
3048
3154
|
return e.def;
|
|
3049
3155
|
}
|
|
3050
|
-
function
|
|
3156
|
+
function Ro(e) {
|
|
3051
3157
|
if (o.globalRegistry.get(e)?.formType === "list") return !0;
|
|
3052
|
-
let t =
|
|
3053
|
-
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;
|
|
3054
3160
|
}
|
|
3055
|
-
function
|
|
3056
|
-
let t = e, n =
|
|
3057
|
-
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;
|
|
3058
3164
|
return t;
|
|
3059
3165
|
}
|
|
3060
|
-
function
|
|
3061
|
-
let t =
|
|
3166
|
+
function Bo(e) {
|
|
3167
|
+
let t = Lo(zo(e));
|
|
3062
3168
|
if (t.shape) return new Set(Object.keys(t.shape));
|
|
3063
3169
|
if (t.options) {
|
|
3064
3170
|
let e = [];
|
|
3065
3171
|
for (let n of t.options) {
|
|
3066
|
-
let t =
|
|
3172
|
+
let t = Bo(n);
|
|
3067
3173
|
if (!t) return null;
|
|
3068
3174
|
e.push(t);
|
|
3069
3175
|
}
|
|
@@ -3075,7 +3181,7 @@ function xo(e) {
|
|
|
3075
3181
|
}
|
|
3076
3182
|
return null;
|
|
3077
3183
|
}
|
|
3078
|
-
function
|
|
3184
|
+
function Vo(e, t, n) {
|
|
3079
3185
|
let r = { [t]: n };
|
|
3080
3186
|
try {
|
|
3081
3187
|
return e.parse(r);
|
|
@@ -3083,12 +3189,12 @@ function So(e, t, n) {
|
|
|
3083
3189
|
return r;
|
|
3084
3190
|
}
|
|
3085
3191
|
}
|
|
3086
|
-
function
|
|
3192
|
+
function Ho(e, t) {
|
|
3087
3193
|
if (!Number.isInteger(t.max) || t.max < 1) throw Error(`field.list: max must be a positive integer, got ${t.max}`);
|
|
3088
|
-
if (t.max >
|
|
3194
|
+
if (t.max > Co) throw Error(`field.list: max ${t.max} exceeds the ceiling of ${Co}`);
|
|
3089
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}`);
|
|
3090
|
-
if (
|
|
3091
|
-
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`);
|
|
3092
3198
|
let n = o.array(e);
|
|
3093
3199
|
return t.min !== void 0 && (n = n.min(t.min)), n = n.max(t.max), n.default([]).meta($({
|
|
3094
3200
|
formType: "list",
|
|
@@ -3098,7 +3204,7 @@ function Co(e, t) {
|
|
|
3098
3204
|
labelField: t.labelField
|
|
3099
3205
|
}));
|
|
3100
3206
|
}
|
|
3101
|
-
function
|
|
3207
|
+
function Uo(e, t, n) {
|
|
3102
3208
|
let r = Object.keys(t)[0];
|
|
3103
3209
|
if (r === void 0) throw Error("field.variants: at least one variant is required");
|
|
3104
3210
|
if (n.shared && e in n.shared) throw Error(`field.variants: shared fields cannot redefine the discriminator "${e}"`);
|
|
@@ -3111,7 +3217,7 @@ function wo(e, t, n) {
|
|
|
3111
3217
|
...r,
|
|
3112
3218
|
[e]: o.literal(t)
|
|
3113
3219
|
})), a = o.discriminatedUnion(e, i), s = i[0];
|
|
3114
|
-
return a.default(s ?
|
|
3220
|
+
return a.default(s ? Vo(s, e, r) : {}).meta($({
|
|
3115
3221
|
formType: "variants",
|
|
3116
3222
|
discriminator: e,
|
|
3117
3223
|
title: n.title,
|
|
@@ -3119,35 +3225,35 @@ function wo(e, t, n) {
|
|
|
3119
3225
|
labels: n.labels
|
|
3120
3226
|
}));
|
|
3121
3227
|
}
|
|
3122
|
-
var
|
|
3123
|
-
title:
|
|
3124
|
-
text:
|
|
3125
|
-
number:
|
|
3126
|
-
toggle:
|
|
3127
|
-
choice:
|
|
3128
|
-
choices:
|
|
3129
|
-
entities:
|
|
3130
|
-
entity:
|
|
3131
|
-
area:
|
|
3132
|
-
icon:
|
|
3133
|
-
image:
|
|
3134
|
-
stringList:
|
|
3135
|
-
group:
|
|
3136
|
-
list:
|
|
3137
|
-
variants:
|
|
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
|
|
3138
3244
|
};
|
|
3139
|
-
function
|
|
3245
|
+
function Go(e) {
|
|
3140
3246
|
return o.object(e);
|
|
3141
3247
|
}
|
|
3142
3248
|
//#endregion
|
|
3143
3249
|
//#region src/framework/image-src.ts
|
|
3144
|
-
function
|
|
3145
|
-
let n =
|
|
3146
|
-
return n === void 0 ?
|
|
3250
|
+
function Ko(e, t) {
|
|
3251
|
+
let n = Ut(e);
|
|
3252
|
+
return n === void 0 ? Gt(e) : t?.[n]?.src;
|
|
3147
3253
|
}
|
|
3148
3254
|
//#endregion
|
|
3149
3255
|
//#region src/shared/spline.ts
|
|
3150
|
-
function
|
|
3256
|
+
function qo(e) {
|
|
3151
3257
|
if (e.length < 2) return "";
|
|
3152
3258
|
let t = e[0], n = e[1];
|
|
3153
3259
|
if (!t || !n) return "";
|
|
@@ -3174,9 +3280,9 @@ function Oo(e) {
|
|
|
3174
3280
|
}
|
|
3175
3281
|
//#endregion
|
|
3176
3282
|
//#region src/version.ts
|
|
3177
|
-
var
|
|
3283
|
+
var Jo = {
|
|
3178
3284
|
name: "@glasshome/widget-sdk",
|
|
3179
|
-
version: "1.
|
|
3285
|
+
version: "1.28.0",
|
|
3180
3286
|
description: "SDK for building GlassHome dashboard widgets with SolidJS",
|
|
3181
3287
|
keywords: [
|
|
3182
3288
|
"dashboard",
|
|
@@ -3248,7 +3354,7 @@ var ko = {
|
|
|
3248
3354
|
lint: "oxlint --type-aware . && oxfmt --check ."
|
|
3249
3355
|
},
|
|
3250
3356
|
dependencies: {
|
|
3251
|
-
"@glasshome/widget-contract": "0.
|
|
3357
|
+
"@glasshome/widget-contract": "0.7.0",
|
|
3252
3358
|
"@tailwindcss/vite": "^4.1.13",
|
|
3253
3359
|
clsx: "^2.1.1",
|
|
3254
3360
|
"happy-dom": "^20.0.0",
|
|
@@ -3281,4 +3387,4 @@ var ko = {
|
|
|
3281
3387
|
engines: { node: ">=18" }
|
|
3282
3388
|
}.version;
|
|
3283
3389
|
//#endregion
|
|
3284
|
-
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 };
|