@glasshome/widget-sdk 1.27.1 → 1.29.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 +290 -0
- package/dist/framework/hooks/index.d.ts +3 -1
- package/dist/framework/hooks/use-widget-context.d.ts +11 -0
- package/dist/framework/hooks/use-widget-state.d.ts +10 -0
- package/dist/framework/index.d.ts +1 -1
- package/dist/framework/panel/panel-entity.d.ts +1 -0
- package/dist/framework/panel/panel.d.ts +1 -1
- package/dist/index.js +1018 -788
- 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, useTemperatureUnit as le, useToggle as ue, useTurnOff as de, useTurnOn as fe, useUnitSystem as pe } from "@glasshome/sync-layer/solid";
|
|
6
|
+
import { For as w, Match as me, Show as T, Switch as he, children as ge, createContext as _e, createEffect as E, createMemo as D, createSignal as O, on as ve, onCleanup as k, onMount as ye, splitProps as be, untrack as xe, useContext as A } from "solid-js";
|
|
7
|
+
import { addEventListener as j, className as M, createComponent as N, delegateEvents as P, effect as F, insert as I, memo as L, mergeProps as Se, setAttribute as R, setStyleProperty as Ce, spread as we, style as z, template as B, use as Te } from "solid-js/web";
|
|
8
|
+
import { Accordion as Ee, AccordionContent as De, AccordionItem as Oe, AccordionTrigger as ke, Badge as Ae, Badge as je, Button as Me, Button as Ne, ButtonGroup as Pe, ButtonGroup as Fe, Carousel as Ie, CarouselContent as Le, CarouselDots as Re, CarouselItem as ze, CarouselNext as Be, CarouselPrevious as Ve, ColorDisc as He, ColorSlider as Ue, ColorWheel as We, CountPill as Ge, CountPill as Ke, Empty as qe, EmptyDescription as Je, EmptyHeader as Ye, EmptyTitle as Xe, FactRow as Ze, FieldGroup as Qe, FieldTitle as $e, HOLD_GRACE_MS as et, HOLD_MS as tt, Icon as nt, Icon as V, Input as rt, Label as it, Popover as at, PopoverContent as ot, Progress as st, ResponsiveDialog as ct, ResponsiveDialogBody as lt, ResponsiveDialogBody as ut, ResponsiveDialogClose as dt, ResponsiveDialogContent as ft, ResponsiveDialogDescription as pt, ResponsiveDialogFooter as mt, ResponsiveDialogFooter as ht, ResponsiveDialogHeader as gt, ResponsiveDialogTitle as _t, SchemaForm as vt, SectionIcon as yt, SectionIcon as bt, SectionMeta as xt, SectionRow as St, SectionTitle as Ct, Select as wt, SelectContent as Tt, SelectItem as Et, SelectTrigger as Dt, SelectValue as Ot, Slider as kt, SwatchPicker as At, Switch as jt, Tabs as Mt, Tabs as Nt, TabsContent as Pt, TabsContent as Ft, TabsList as It, TabsList as Lt, TabsTrigger as Rt, TabsTrigger as zt, TemperatureBar as Bt, Toggle as Vt, ToggleGroup as Ht, ToggleGroup as Ut, ToggleGroupItem as Wt, ToggleGroupItem as Gt, buttonVariants as Kt, copyText as qt, imagePreset as Jt, imagePreset as Yt, imageUrl as Xt, imageUrl as Zt, mediaUrl as Qt, parseColor as $t, presetValue as en, spendLongPress as tn, useCopyText as nn, useCopyText as rn } from "@glasshome/ui/solid";
|
|
9
|
+
import { clsx as an } from "clsx";
|
|
10
|
+
import { twMerge as on } from "tailwind-merge";
|
|
11
11
|
//#region src/framework/to-form-schema.ts
|
|
12
|
-
function
|
|
12
|
+
function sn(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 cn(e) {
|
|
22
22
|
try {
|
|
23
23
|
return e.parse({});
|
|
24
24
|
} catch {
|
|
@@ -27,64 +27,64 @@ 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 ln(e) {
|
|
31
|
+
return e.configSchema && (e.manifest.schema || (e.manifest.schema = sn(e.configSchema)), e.manifest.defaultConfig || (e.manifest.defaultConfig = cn(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 =
|
|
35
|
+
var H = _e();
|
|
36
|
+
function un() {
|
|
37
|
+
let e = A(H);
|
|
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 dn(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 fn(e, t) {
|
|
49
49
|
return async (n, r = {}) => {
|
|
50
|
-
await e(
|
|
50
|
+
await e(dn(n), t, r, { entity_id: n });
|
|
51
51
|
};
|
|
52
52
|
}
|
|
53
|
-
function
|
|
54
|
-
let e =
|
|
53
|
+
function pn() {
|
|
54
|
+
let e = A(H)?.callService;
|
|
55
55
|
return e ? {
|
|
56
56
|
callService: e,
|
|
57
|
-
turnOn:
|
|
58
|
-
turnOff:
|
|
59
|
-
toggle:
|
|
60
|
-
} :
|
|
57
|
+
turnOn: fn(e, "turn_on"),
|
|
58
|
+
turnOff: fn(e, "turn_off"),
|
|
59
|
+
toggle: fn(e, "toggle")
|
|
60
|
+
} : oe();
|
|
61
61
|
}
|
|
62
|
-
function
|
|
63
|
-
let e =
|
|
64
|
-
return e ?
|
|
62
|
+
function mn() {
|
|
63
|
+
let e = A(H)?.callService;
|
|
64
|
+
return e ? fn(e, "turn_on") : fe();
|
|
65
65
|
}
|
|
66
|
-
function
|
|
67
|
-
let e =
|
|
68
|
-
return e ?
|
|
66
|
+
function hn() {
|
|
67
|
+
let e = A(H)?.callService;
|
|
68
|
+
return e ? fn(e, "turn_off") : de();
|
|
69
69
|
}
|
|
70
|
-
function
|
|
71
|
-
let e =
|
|
72
|
-
return e ?
|
|
70
|
+
function gn() {
|
|
71
|
+
let e = A(H)?.callService;
|
|
72
|
+
return e ? fn(e, "toggle") : ue();
|
|
73
73
|
}
|
|
74
74
|
//#endregion
|
|
75
75
|
//#region src/framework/design-system/z-index.ts
|
|
76
|
-
var
|
|
76
|
+
var _n = {
|
|
77
77
|
BACKGROUND: 0,
|
|
78
78
|
CONTENT: 10,
|
|
79
79
|
OVERLAY: 20,
|
|
80
80
|
ACTIONS: 30
|
|
81
|
-
},
|
|
82
|
-
function
|
|
83
|
-
let [t, n] =
|
|
81
|
+
}, U = /* @__PURE__ */ new WeakMap();
|
|
82
|
+
function vn(e = "controls") {
|
|
83
|
+
let [t, n] = O(!1), [r, i] = O(e), a = (t) => {
|
|
84
84
|
i(t ?? e), n(!0);
|
|
85
|
-
}, o =
|
|
86
|
-
return o?.registerDialogOpener?.(a), o &&
|
|
87
|
-
o?.registerDialogOpener?.(null), o &&
|
|
85
|
+
}, o = A(H);
|
|
86
|
+
return o?.registerDialogOpener?.(a), o && U.set(o, a), k(() => {
|
|
87
|
+
o?.registerDialogOpener?.(null), o && U.get(o) === a && U.delete(o);
|
|
88
88
|
}), {
|
|
89
89
|
showDialog: t,
|
|
90
90
|
setShowDialog: n,
|
|
@@ -106,15 +106,15 @@ function un(e = "controls") {
|
|
|
106
106
|
}
|
|
107
107
|
//#endregion
|
|
108
108
|
//#region src/framework/hooks/widget-registry.ts
|
|
109
|
-
var
|
|
110
|
-
function
|
|
111
|
-
return e[
|
|
109
|
+
var yn = /* @__PURE__ */ new WeakMap(), bn = Symbol("glasshome.widget.registry");
|
|
110
|
+
function xn(e) {
|
|
111
|
+
return e[bn] ?? e;
|
|
112
112
|
}
|
|
113
|
-
function
|
|
113
|
+
function Sn(e) {
|
|
114
114
|
if (!e) return;
|
|
115
|
-
let t =
|
|
115
|
+
let t = xn(e), n = yn.get(t);
|
|
116
116
|
if (!n) {
|
|
117
|
-
let [e, r] =
|
|
117
|
+
let [e, r] = O(!1), [i, a] = O(), [o, s] = O(), [c, l] = O(), [u, d] = O(!1);
|
|
118
118
|
n = {
|
|
119
119
|
hasSheet: e,
|
|
120
120
|
setHasSheet: r,
|
|
@@ -126,149 +126,149 @@ function mn(e) {
|
|
|
126
126
|
setIcon: l,
|
|
127
127
|
nothingMore: u,
|
|
128
128
|
setNothingMore: d
|
|
129
|
-
},
|
|
129
|
+
}, yn.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 Cn = 32, W = Cn / 2, G = "white", wn = "rgba(0,0,0,0.4)", Tn = 2, En = 3;
|
|
136
|
+
function Dn(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 On(e) {
|
|
140
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="${Cn}" height="${Cn}" viewBox="0 0 ${Cn} ${Cn}">${e}</svg>`;
|
|
141
141
|
}
|
|
142
|
-
var
|
|
142
|
+
var kn = On(`
|
|
143
143
|
<g transform="translate(6, 2)">
|
|
144
144
|
<!-- shadow -->
|
|
145
|
-
<g stroke="${
|
|
145
|
+
<g stroke="${wn}" stroke-width="${En}" 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="${
|
|
149
|
+
<g stroke="${G}" stroke-width="${Tn}" 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
|
+
`), An = On(`
|
|
154
154
|
<g>
|
|
155
|
-
<circle cx="${
|
|
156
|
-
<circle cx="${
|
|
157
|
-
<circle cx="${
|
|
155
|
+
<circle cx="${W}" cy="${W}" r="8" stroke="${wn}" stroke-width="${En}" fill="none"/>
|
|
156
|
+
<circle cx="${W}" cy="${W}" r="8" stroke="${G}" stroke-width="1.5" fill="none"/>
|
|
157
|
+
<circle cx="${W}" cy="${W}" r="1.5" fill="${G}"/>
|
|
158
158
|
</g>
|
|
159
|
-
`),
|
|
159
|
+
`), jn = On(`
|
|
160
160
|
<g>
|
|
161
161
|
<!-- shadow -->
|
|
162
|
-
<g stroke="${
|
|
163
|
-
<line x1="6" y1="${
|
|
164
|
-
<polyline points="10,12 6,${
|
|
165
|
-
<polyline points="22,12 26,${
|
|
162
|
+
<g stroke="${wn}" stroke-width="${En}" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
163
|
+
<line x1="6" y1="${W}" x2="26" y2="${W}"/>
|
|
164
|
+
<polyline points="10,12 6,${W} 10,20"/>
|
|
165
|
+
<polyline points="22,12 26,${W} 22,20"/>
|
|
166
166
|
</g>
|
|
167
167
|
<!-- main -->
|
|
168
|
-
<g stroke="${
|
|
169
|
-
<line x1="6" y1="${
|
|
170
|
-
<polyline points="10,12 6,${
|
|
171
|
-
<polyline points="22,12 26,${
|
|
168
|
+
<g stroke="${G}" stroke-width="${Tn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
169
|
+
<line x1="6" y1="${W}" x2="26" y2="${W}"/>
|
|
170
|
+
<polyline points="10,12 6,${W} 10,20"/>
|
|
171
|
+
<polyline points="22,12 26,${W} 22,20"/>
|
|
172
172
|
</g>
|
|
173
173
|
<!-- center grip dots -->
|
|
174
|
-
<circle cx="${
|
|
175
|
-
<circle cx="11" cy="${
|
|
176
|
-
<circle cx="21" cy="${
|
|
174
|
+
<circle cx="${W}" cy="${W}" r="1.5" fill="${G}"/>
|
|
175
|
+
<circle cx="11" cy="${W}" r="1" fill="${G}" opacity="0.6"/>
|
|
176
|
+
<circle cx="21" cy="${W}" r="1" fill="${G}" opacity="0.6"/>
|
|
177
177
|
</g>
|
|
178
|
-
`),
|
|
178
|
+
`), Mn = On(`
|
|
179
179
|
<g>
|
|
180
180
|
<!-- shadow -->
|
|
181
|
-
<g stroke="${
|
|
182
|
-
<line x1="${
|
|
183
|
-
<polyline points="12,10 ${
|
|
184
|
-
<polyline points="12,22 ${
|
|
181
|
+
<g stroke="${wn}" stroke-width="${En}" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
182
|
+
<line x1="${W}" y1="6" x2="${W}" y2="26"/>
|
|
183
|
+
<polyline points="12,10 ${W},6 20,10"/>
|
|
184
|
+
<polyline points="12,22 ${W},26 20,22"/>
|
|
185
185
|
</g>
|
|
186
186
|
<!-- main -->
|
|
187
|
-
<g stroke="${
|
|
188
|
-
<line x1="${
|
|
189
|
-
<polyline points="12,10 ${
|
|
190
|
-
<polyline points="12,22 ${
|
|
187
|
+
<g stroke="${G}" stroke-width="${Tn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
188
|
+
<line x1="${W}" y1="6" x2="${W}" y2="26"/>
|
|
189
|
+
<polyline points="12,10 ${W},6 20,10"/>
|
|
190
|
+
<polyline points="12,22 ${W},26 20,22"/>
|
|
191
191
|
</g>
|
|
192
192
|
<!-- center grip dots -->
|
|
193
|
-
<circle cx="${
|
|
194
|
-
<circle cx="${
|
|
195
|
-
<circle cx="${
|
|
193
|
+
<circle cx="${W}" cy="${W}" r="1.5" fill="${G}"/>
|
|
194
|
+
<circle cx="${W}" cy="11" r="1" fill="${G}" opacity="0.6"/>
|
|
195
|
+
<circle cx="${W}" cy="21" r="1" fill="${G}" opacity="0.6"/>
|
|
196
196
|
</g>
|
|
197
|
-
`),
|
|
197
|
+
`), Nn = On(`
|
|
198
198
|
<g>
|
|
199
199
|
<!-- shadow -->
|
|
200
|
-
<g stroke="${
|
|
201
|
-
<line x1="7" y1="${
|
|
202
|
-
<line x1="${
|
|
203
|
-
<polyline points="11,13 7,${
|
|
204
|
-
<polyline points="21,13 25,${
|
|
205
|
-
<polyline points="13,11 ${
|
|
206
|
-
<polyline points="13,21 ${
|
|
200
|
+
<g stroke="${wn}" stroke-width="${En}" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
201
|
+
<line x1="7" y1="${W}" x2="25" y2="${W}"/>
|
|
202
|
+
<line x1="${W}" y1="7" x2="${W}" y2="25"/>
|
|
203
|
+
<polyline points="11,13 7,${W} 11,19"/>
|
|
204
|
+
<polyline points="21,13 25,${W} 21,19"/>
|
|
205
|
+
<polyline points="13,11 ${W},7 19,11"/>
|
|
206
|
+
<polyline points="13,21 ${W},25 19,21"/>
|
|
207
207
|
</g>
|
|
208
208
|
<!-- main -->
|
|
209
|
-
<g stroke="${
|
|
210
|
-
<line x1="7" y1="${
|
|
211
|
-
<line x1="${
|
|
212
|
-
<polyline points="11,13 7,${
|
|
213
|
-
<polyline points="21,13 25,${
|
|
214
|
-
<polyline points="13,11 ${
|
|
215
|
-
<polyline points="13,21 ${
|
|
209
|
+
<g stroke="${G}" stroke-width="${Tn}" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
|
210
|
+
<line x1="7" y1="${W}" x2="25" y2="${W}"/>
|
|
211
|
+
<line x1="${W}" y1="7" x2="${W}" y2="25"/>
|
|
212
|
+
<polyline points="11,13 7,${W} 11,19"/>
|
|
213
|
+
<polyline points="21,13 25,${W} 21,19"/>
|
|
214
|
+
<polyline points="13,11 ${W},7 19,11"/>
|
|
215
|
+
<polyline points="13,21 ${W},25 19,21"/>
|
|
216
216
|
</g>
|
|
217
217
|
<!-- center dot -->
|
|
218
|
-
<circle cx="${
|
|
218
|
+
<circle cx="${W}" cy="${W}" r="2" fill="${G}"/>
|
|
219
219
|
</g>
|
|
220
220
|
`);
|
|
221
|
-
function
|
|
221
|
+
function Pn(e, t, n) {
|
|
222
222
|
return {
|
|
223
|
-
css: `${
|
|
223
|
+
css: `${Dn(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:
|
|
228
|
+
var Fn = {
|
|
229
|
+
tap: Pn(kn, 12, 4),
|
|
230
|
+
hold: Pn(An, 16, 16),
|
|
231
|
+
slideHorizontal: Pn(jn, W, W),
|
|
232
|
+
slideVertical: Pn(Mn, W, W),
|
|
233
|
+
slideAuto: Pn(Nn, W, W)
|
|
234
234
|
};
|
|
235
235
|
//#endregion
|
|
236
236
|
//#region src/framework/gestures/haptics.ts
|
|
237
|
-
function
|
|
237
|
+
function In() {
|
|
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 Ln(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 Rn = {
|
|
248
248
|
tick() {
|
|
249
|
-
let e =
|
|
250
|
-
e ? e.impact({ style: "Light" }).catch(() => {}) :
|
|
249
|
+
let e = In();
|
|
250
|
+
e ? e.impact({ style: "Light" }).catch(() => {}) : Ln(8);
|
|
251
251
|
},
|
|
252
252
|
bump() {
|
|
253
|
-
let e =
|
|
254
|
-
e ? e.impact({ style: "Medium" }).catch(() => {}) :
|
|
253
|
+
let e = In();
|
|
254
|
+
e ? e.impact({ style: "Medium" }).catch(() => {}) : Ln(20);
|
|
255
255
|
},
|
|
256
256
|
pulse() {
|
|
257
|
-
let e =
|
|
258
|
-
e ? e.impact({ style: "Heavy" }).catch(() => {}) :
|
|
257
|
+
let e = In();
|
|
258
|
+
e ? e.impact({ style: "Heavy" }).catch(() => {}) : Ln([
|
|
259
259
|
0,
|
|
260
260
|
15,
|
|
261
261
|
40,
|
|
262
262
|
15
|
|
263
263
|
]);
|
|
264
264
|
}
|
|
265
|
-
},
|
|
266
|
-
function
|
|
267
|
-
let n =
|
|
265
|
+
}, zn = "button, a, input, select, textarea, [role=\"slider\"], [role=\"radio\"], [role=\"switch\"]";
|
|
266
|
+
function Bn(e, t) {
|
|
267
|
+
let n = A(H), r = Sn(n), i = () => {
|
|
268
268
|
let t = e();
|
|
269
269
|
return t.hold || !n ? t : {
|
|
270
270
|
...t,
|
|
271
|
-
hold: { action: () => r?.hasSheet() ?
|
|
271
|
+
hold: { action: () => r?.hasSheet() ? U.get(n)?.() : r?.setNothingMore(!0) }
|
|
272
272
|
};
|
|
273
273
|
}, a = {
|
|
274
274
|
isDown: !1,
|
|
@@ -283,7 +283,7 @@ function Mn(e, t) {
|
|
|
283
283
|
graceTimer: null,
|
|
284
284
|
element: null,
|
|
285
285
|
startValue: void 0
|
|
286
|
-
}, [o, s] =
|
|
286
|
+
}, [o, s] = O(null), c = null, l = null, u = null, [d, f] = O(null);
|
|
287
287
|
function p(e) {
|
|
288
288
|
e !== l && (u && u.disconnect(), u = new ResizeObserver((e) => {
|
|
289
289
|
let t = e[0];
|
|
@@ -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(`${zn}, .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 ?? tt, 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(et, 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
|
+
}), Rn.bump(), tn(), 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 ?? tt;
|
|
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" ? Fn.slideHorizontal.css : n === "vertical" ? Fn.slideVertical.css : (c || p(e), c && c.height > c.width ? Fn.slideVertical.css : Fn.slideHorizontal.css);
|
|
377
377
|
}
|
|
378
|
-
return t.tap ?
|
|
378
|
+
return t.tap ? Fn.tap.css : t.hold ? Fn.hold.css : "";
|
|
379
379
|
};
|
|
380
380
|
return {
|
|
381
381
|
onKeyDown: (e) => {
|
|
@@ -411,18 +411,18 @@ 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 =
|
|
414
|
+
var Vn = _e();
|
|
415
|
+
function Hn() {
|
|
416
|
+
let e = A(Vn);
|
|
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
|
|
424
|
-
let [e, t] =
|
|
425
|
-
return
|
|
422
|
+
var Un = 1600;
|
|
423
|
+
function Wn() {
|
|
424
|
+
let [e, t] = O(/* @__PURE__ */ new Set()), n;
|
|
425
|
+
return k(() => clearTimeout(n)), {
|
|
426
426
|
has: (t) => e().has(t),
|
|
427
427
|
any: () => e().size > 0,
|
|
428
428
|
run: async (e, r) => {
|
|
@@ -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()), Un), !0;
|
|
435
435
|
}
|
|
436
436
|
};
|
|
437
437
|
}
|
|
438
438
|
//#endregion
|
|
439
439
|
//#region src/framework/utils/cn.ts
|
|
440
|
-
function
|
|
441
|
-
return
|
|
440
|
+
function K(...e) {
|
|
441
|
+
return on(an(e));
|
|
442
442
|
}
|
|
443
443
|
//#endregion
|
|
444
444
|
//#region src/framework/components/WidgetIcon.tsx
|
|
445
|
-
var
|
|
446
|
-
function
|
|
445
|
+
var Gn = /*#__PURE__*/ B("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-2 glass glass-tint\">"), Kn = /*#__PURE__*/ B("<div class=\"glasshome-widget-icon glasshome-widget-icon-stack glasshome-widget-icon-stack-3 glass glass-tint\">"), qn = /*#__PURE__*/ B("<div><div class=\"glasshome-widget-icon-glyph flex items-center justify-center\">");
|
|
446
|
+
function Jn(e) {
|
|
447
447
|
let t = () => e.entityCount ?? 1;
|
|
448
448
|
return (() => {
|
|
449
|
-
var n =
|
|
450
|
-
return I(n,
|
|
449
|
+
var n = qn(), r = n.firstChild;
|
|
450
|
+
return I(n, N(T, {
|
|
451
451
|
get when() {
|
|
452
452
|
return t() >= 2;
|
|
453
453
|
},
|
|
454
454
|
get children() {
|
|
455
|
-
return
|
|
455
|
+
return Gn();
|
|
456
456
|
}
|
|
457
|
-
}), r), I(n,
|
|
457
|
+
}), r), I(n, N(T, {
|
|
458
458
|
get when() {
|
|
459
459
|
return t() >= 3;
|
|
460
460
|
},
|
|
461
461
|
get children() {
|
|
462
|
-
return
|
|
462
|
+
return Kn();
|
|
463
463
|
}
|
|
464
464
|
}), r), I(r, () => e.icon), F((t) => {
|
|
465
|
-
var r =
|
|
466
|
-
return r !== t.e &&
|
|
465
|
+
var r = K("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 && 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 =
|
|
478
|
-
|
|
475
|
+
var Yn = /*#__PURE__*/ B("<span class=glasshome-widget-eyebrow>"), Xn = /*#__PURE__*/ B("<div class=glasshome-widget-head-aside>"), Zn = /*#__PURE__*/ B("<div class=glasshome-widget-head><div class=glasshome-widget-head-text><span class=glasshome-widget-name>"), Qn = /*#__PURE__*/ B("<span class=glasshome-widget-sub>"), $n = /*#__PURE__*/ B("<span class=glasshome-widget-unit>"), er = /*#__PURE__*/ B("<div class=glasshome-widget-art>"), tr = /*#__PURE__*/ B("<div><div class=glasshome-widget-reading><span class=glasshome-widget-reading-value>"), nr = /*#__PURE__*/ B("<div class=glasshome-widget-controls>"), rr = /*#__PURE__*/ B("<div>"), ir = /*#__PURE__*/ B("<div class=glasshome-widget-backdrop>"), ar = /*#__PURE__*/ B("<div class=glasshome-widget-glyph aria-hidden=true>"), or = _e(() => !1), sr = "mdi:check";
|
|
476
|
+
function cr(e) {
|
|
477
|
+
let t = A(or), n = Sn(A(H));
|
|
478
|
+
E(() => n?.setIcon(e.icon)), k(() => {
|
|
479
479
|
n?.icon() === e.icon && n?.setIcon(void 0);
|
|
480
480
|
});
|
|
481
|
-
let r =
|
|
481
|
+
let r = ge(() => e.eyebrow), i = ge(() => 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 I(n,
|
|
486
|
+
var n = Zn(), o = n.firstChild, s = o.firstChild;
|
|
487
|
+
return I(n, N(T, {
|
|
488
488
|
get when() {
|
|
489
489
|
return e.icon;
|
|
490
490
|
},
|
|
491
|
-
children: (n) =>
|
|
491
|
+
children: (n) => N(Jn, {
|
|
492
492
|
get icon() {
|
|
493
|
-
return
|
|
494
|
-
return L(() => !!t())() ?
|
|
493
|
+
return N(V, { get icon() {
|
|
494
|
+
return L(() => !!t())() ? sr : 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), I(o,
|
|
505
|
+
}), o), I(o, N(T, {
|
|
506
506
|
get when() {
|
|
507
507
|
return L(() => !!r())() && !a();
|
|
508
508
|
},
|
|
509
509
|
get children() {
|
|
510
|
-
var e =
|
|
510
|
+
var e = Yn();
|
|
511
511
|
return I(e, r), e;
|
|
512
512
|
}
|
|
513
|
-
}), s), I(s, () => e.name), I(n,
|
|
513
|
+
}), s), I(s, () => e.name), I(n, N(T, {
|
|
514
514
|
get when() {
|
|
515
515
|
return i();
|
|
516
516
|
},
|
|
517
517
|
get children() {
|
|
518
|
-
var e =
|
|
518
|
+
var e = Xn();
|
|
519
519
|
return I(e, i), e;
|
|
520
520
|
}
|
|
521
521
|
}), null), n;
|
|
522
522
|
})();
|
|
523
523
|
}
|
|
524
|
-
function
|
|
525
|
-
let t =
|
|
526
|
-
return
|
|
527
|
-
var r =
|
|
528
|
-
return I(o,
|
|
524
|
+
function lr(e) {
|
|
525
|
+
let t = ge(() => e.sub), n = ge(() => e.art), r = D(() => 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] = O();
|
|
526
|
+
return E(ve(r, () => o((e) => e === "a" ? "b" : "a"), { defer: !0 })), (() => {
|
|
527
|
+
var r = tr(), o = r.firstChild, s = o.firstChild;
|
|
528
|
+
return I(o, N(T, {
|
|
529
529
|
get when() {
|
|
530
530
|
return t();
|
|
531
531
|
},
|
|
532
532
|
get children() {
|
|
533
|
-
var e =
|
|
533
|
+
var e = Qn();
|
|
534
534
|
return I(e, t), e;
|
|
535
535
|
}
|
|
536
|
-
}), s), I(s, () => e.value, null), I(s,
|
|
536
|
+
}), s), I(s, () => e.value, null), I(s, N(T, {
|
|
537
537
|
get when() {
|
|
538
538
|
return e.unit;
|
|
539
539
|
},
|
|
540
540
|
get children() {
|
|
541
|
-
var t =
|
|
541
|
+
var t = $n();
|
|
542
542
|
return I(t, () => e.unit), F(() => R(t, "data-degree", e.unit === "°" || void 0)), t;
|
|
543
543
|
}
|
|
544
|
-
}), null), I(r,
|
|
544
|
+
}), null), I(r, N(T, {
|
|
545
545
|
get when() {
|
|
546
546
|
return n();
|
|
547
547
|
},
|
|
548
548
|
get children() {
|
|
549
|
-
var e =
|
|
549
|
+
var e = er();
|
|
550
550
|
return I(e, n), e;
|
|
551
551
|
}
|
|
552
552
|
}), null), F((o) => {
|
|
553
|
-
var c =
|
|
554
|
-
return c !== o.e &&
|
|
553
|
+
var c = K("glasshome-widget-hero", e.class), l = n() ? "" : void 0, u = e.value === "" && !t() ? "" : void 0, d = a(), f = i();
|
|
554
|
+
return c !== o.e && M(r, o.e = c), l !== o.t && R(r, "data-art", o.t = l), u !== o.a && R(r, "data-empty", o.a = u), d !== o.o && R(s, "data-turn", o.o = d), f !== o.i && Ce(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 ur(e) {
|
|
565
565
|
return (() => {
|
|
566
|
-
var t =
|
|
566
|
+
var t = nr();
|
|
567
567
|
return I(t, () => e.children), t;
|
|
568
568
|
})();
|
|
569
569
|
}
|
|
570
|
-
function
|
|
571
|
-
return
|
|
570
|
+
function dr(e) {
|
|
571
|
+
return N(Fe, {
|
|
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(Ne, {
|
|
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(V, { icon: "mdi:minus" });
|
|
585
585
|
}
|
|
586
|
-
}),
|
|
586
|
+
}), N(Ne, {
|
|
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(V, { icon: "mdi:plus" });
|
|
594
594
|
}
|
|
595
595
|
})];
|
|
596
596
|
}
|
|
597
597
|
});
|
|
598
598
|
}
|
|
599
|
-
function
|
|
600
|
-
return
|
|
599
|
+
function fr(e) {
|
|
600
|
+
return N(Ut, {
|
|
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(Gt, {
|
|
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(V, { 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 pr(e) {
|
|
639
|
+
let t = Wn(), n = () => e.confirm ?? t, r = () => e.id ?? e["aria-label"] ?? e.icon, i = () => n().has(r());
|
|
640
|
+
return N(Ne, {
|
|
641
641
|
variant: "outline",
|
|
642
642
|
get size() {
|
|
643
643
|
return e.children ? "default" : "icon";
|
|
@@ -646,84 +646,84 @@ function ar(e) {
|
|
|
646
646
|
return e["aria-label"];
|
|
647
647
|
},
|
|
648
648
|
get class() {
|
|
649
|
-
return
|
|
649
|
+
return K(e.children ? "glasshome-widget-control-wide" : "glasshome-widget-control", e.class);
|
|
650
650
|
},
|
|
651
651
|
get "data-confirmed"() {
|
|
652
652
|
return i() || void 0;
|
|
653
653
|
},
|
|
654
654
|
onClick: () => void n().run([r()], e.run),
|
|
655
655
|
get children() {
|
|
656
|
-
return [
|
|
657
|
-
return L(() => !!i())() ?
|
|
656
|
+
return [N(V, { get icon() {
|
|
657
|
+
return L(() => !!i())() ? sr : e.icon;
|
|
658
658
|
} }), L(() => e.children)];
|
|
659
659
|
}
|
|
660
660
|
});
|
|
661
661
|
}
|
|
662
|
-
function
|
|
663
|
-
return
|
|
662
|
+
function mr(e) {
|
|
663
|
+
return N(je, {
|
|
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(V, { get icon() {
|
|
674
674
|
return e();
|
|
675
675
|
} })
|
|
676
676
|
}), L(() => e.children)];
|
|
677
677
|
}
|
|
678
678
|
});
|
|
679
679
|
}
|
|
680
|
-
function
|
|
680
|
+
function hr(e) {
|
|
681
681
|
return (() => {
|
|
682
|
-
var t =
|
|
683
|
-
return I(t, () => e.children), F(() =>
|
|
682
|
+
var t = rr();
|
|
683
|
+
return I(t, () => e.children), F(() => M(t, K("glasshome-widget-layer", e.class))), t;
|
|
684
684
|
})();
|
|
685
685
|
}
|
|
686
|
-
function
|
|
686
|
+
function gr(e) {
|
|
687
687
|
return (() => {
|
|
688
|
-
var t =
|
|
688
|
+
var t = ir();
|
|
689
689
|
return I(t, () => e.children), t;
|
|
690
690
|
})();
|
|
691
691
|
}
|
|
692
|
-
function
|
|
693
|
-
let t =
|
|
692
|
+
function _r(e) {
|
|
693
|
+
let t = A(or);
|
|
694
694
|
return (() => {
|
|
695
|
-
var n =
|
|
696
|
-
return I(n,
|
|
697
|
-
return L(() => !!t())() ?
|
|
695
|
+
var n = ar();
|
|
696
|
+
return I(n, N(V, { get icon() {
|
|
697
|
+
return L(() => !!t())() ? sr : 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 vr = "/* 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", yr = !1, br, xr = /* @__PURE__ */ new WeakSet();
|
|
704
|
+
function Sr() {
|
|
705
|
+
return br || (br = new CSSStyleSheet(), br.replaceSync(vr.replace(/:root\b/g, ":host").replace(/^\.dark\b/gm, ":host(.dark)"))), br;
|
|
706
706
|
}
|
|
707
|
-
function
|
|
707
|
+
function Cr(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 (xr.has(e)) return;
|
|
710
|
+
let t = Sr();
|
|
711
|
+
e.adoptedStyleSheets.includes(t) || (e.adoptedStyleSheets = [...e.adoptedStyleSheets, t]), xr.add(e);
|
|
712
712
|
return;
|
|
713
713
|
}
|
|
714
|
-
if (
|
|
714
|
+
if (yr) 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
|
+
yr = !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 = vr, t.head.appendChild(n), yr = !0;
|
|
723
723
|
}
|
|
724
724
|
//#endregion
|
|
725
725
|
//#region src/framework/variants/built-in-variants.ts
|
|
726
|
-
var
|
|
726
|
+
var wr = {
|
|
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 Tr(e) {
|
|
747
|
+
return Object.hasOwn(wr, e) ? wr[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 =
|
|
751
|
+
var Er = /*#__PURE__*/ B("<div>"), Dr = e(() => void 0, "sliderFill.color");
|
|
752
|
+
function Or(e) {
|
|
753
|
+
return e.color !== void 0 && Dr(), (() => {
|
|
754
|
+
var t = Er();
|
|
755
755
|
return F((n) => {
|
|
756
|
-
var r =
|
|
756
|
+
var r = K("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": _n.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 =
|
|
772
|
-
|
|
773
|
-
let n =
|
|
769
|
+
var kr = /*#__PURE__*/ B("<div>"), Ar = /\bglasshome-widget-(head|hero|controls|backdrop|glyph|layer)\b/;
|
|
770
|
+
function jr(e) {
|
|
771
|
+
let t = Sn(A(H));
|
|
772
|
+
E(() => t?.setAccent(e.accent)), k(() => t?.setAccent(void 0));
|
|
773
|
+
let n = ge(() => e.children), r = D(() => n.toArray().some((e) => e instanceof Element && Ar.test(e.className)));
|
|
774
774
|
return (() => {
|
|
775
|
-
var t =
|
|
775
|
+
var t = kr();
|
|
776
776
|
return I(t, n), F((n) => {
|
|
777
|
-
var i =
|
|
778
|
-
return i !== n.e &&
|
|
777
|
+
var i = K(r() ? "glasshome-widget-grid" : "glasshome-widget-content", e.class), a = e.accent ? { "--widget-color": e.accent } : void 0;
|
|
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 Mr = /*#__PURE__*/ B("<p>");
|
|
788
|
+
function Nr(e) {
|
|
789
789
|
return (() => {
|
|
790
|
-
var t =
|
|
790
|
+
var t = Mr();
|
|
791
791
|
return I(t, (() => {
|
|
792
792
|
var t = L(() => !!e.isUnavailable);
|
|
793
793
|
return () => t() ? "Unavailable" : e.children;
|
|
794
794
|
})()), F((n) => {
|
|
795
|
-
var r =
|
|
796
|
-
return r !== n.e &&
|
|
795
|
+
var r = K("glasshome-widget-status", "relative", e.dimmed && "opacity-40", e.class), i = _n.ACTIONS;
|
|
796
|
+
return r !== n.e && M(t, n.e = r), i !== n.t && Ce(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 Pr = /*#__PURE__*/ B("<span class=\"glasshome-widget-badge shrink-0\">"), Fr = /*#__PURE__*/ B("<div><h3 class=glasshome-widget-title>");
|
|
806
|
+
function Ir(e) {
|
|
807
807
|
return (() => {
|
|
808
|
-
var t =
|
|
809
|
-
return I(n, () => e.children), I(t,
|
|
808
|
+
var t = Fr(), n = t.firstChild;
|
|
809
|
+
return I(n, () => e.children), I(t, N(T, {
|
|
810
810
|
get when() {
|
|
811
811
|
return L(() => e.badge !== void 0)() && e.badge > 0;
|
|
812
812
|
},
|
|
813
813
|
get children() {
|
|
814
|
-
var t =
|
|
814
|
+
var t = Pr();
|
|
815
815
|
return I(t, () => e.badge), t;
|
|
816
816
|
}
|
|
817
817
|
}), null), F((n) => {
|
|
818
|
-
var r =
|
|
819
|
-
return r !== n.e &&
|
|
818
|
+
var r = K("relative flex items-center gap-2", e.class), i = _n.ACTIONS;
|
|
819
|
+
return r !== n.e && M(t, n.e = r), i !== n.t && Ce(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 Lr(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: Br(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(zr(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 = Br(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 Rr(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 zr(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 Br(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] = zr(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 Vr(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 Hr(e, t, n) {
|
|
1037
1037
|
return e?.attributes ? e.attributes[t] ?? n : n;
|
|
1038
1038
|
}
|
|
1039
|
-
function
|
|
1040
|
-
return e.filter(
|
|
1039
|
+
function Ur(e) {
|
|
1040
|
+
return e.filter(Vr).length;
|
|
1041
1041
|
}
|
|
1042
1042
|
//#endregion
|
|
1043
1043
|
//#region src/framework/utils/format-value.ts
|
|
1044
|
-
function
|
|
1044
|
+
function Wr(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,45 +1052,45 @@ function Ir(e, t, n) {
|
|
|
1052
1052
|
}
|
|
1053
1053
|
//#endregion
|
|
1054
1054
|
//#region src/framework/utils/interpret-value.ts
|
|
1055
|
-
function
|
|
1055
|
+
function Gr(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 Kr = /*#__PURE__*/ B("<div class=glasshome-widget-subtitle>"), qr = /*#__PURE__*/ B("<div><div class=glasshome-widget-value>");
|
|
1061
|
+
function Jr(e) {
|
|
1062
1062
|
return (() => {
|
|
1063
|
-
var t =
|
|
1064
|
-
return I(n, () =>
|
|
1063
|
+
var t = qr(), n = t.firstChild;
|
|
1064
|
+
return I(n, () => Wr(e.value, e.unit)), I(t, N(T, {
|
|
1065
1065
|
get when() {
|
|
1066
1066
|
return L(() => !!e.interpret)() && typeof e.value == "number";
|
|
1067
1067
|
},
|
|
1068
1068
|
get children() {
|
|
1069
|
-
var t =
|
|
1070
|
-
return I(t, () =>
|
|
1069
|
+
var t = Kr();
|
|
1070
|
+
return I(t, () => Gr(e.value, e.unit)), t;
|
|
1071
1071
|
}
|
|
1072
|
-
}), null), F(() =>
|
|
1072
|
+
}), null), F(() => M(t, K("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 =
|
|
1080
|
-
|
|
1081
|
-
let i =
|
|
1082
|
-
|
|
1077
|
+
var Yr = /*#__PURE__*/ B("<span class=glasshome-widget-hold-flood aria-hidden=true>"), Xr = /*#__PURE__*/ B("<div class=\"glasshome-widget-halo glass-halo rounded-xl\"aria-hidden=true>"), Zr = /*#__PURE__*/ B("<div class=\"glasshome-widget-frame relative h-full w-full\"><div><div class=\"relative h-full w-full\">"), Qr = /*#__PURE__*/ B("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), $r = /*#__PURE__*/ B("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), ei = /*#__PURE__*/ B("<div class=\"text-muted-foreground flex items-center justify-center\">"), ti = /*#__PURE__*/ B("<h3 class=\"text-foreground text-sm font-semibold\">"), ni = /*#__PURE__*/ B("<p class=\"text-muted-foreground text-xs\">"), ri = 2e3;
|
|
1078
|
+
function ii(t) {
|
|
1079
|
+
let n = A(H), r = Bn(() => ({ hold: { action: () => (U.get(n ?? {}) ?? U.get(f))?.("edit") } }));
|
|
1080
|
+
k(r.dispose);
|
|
1081
|
+
let i = Sn(n), a = !!n && !(bn in n), o = Bn(() => ({ hold: i?.hasSheet() ? { action: () => (U.get(n ?? {}) ?? U.get(f))?.() } : void 0 }));
|
|
1082
|
+
k(o.dispose);
|
|
1083
1083
|
let s = () => t.emptyState && n ? r : t.gestures ?? (a ? o : void 0);
|
|
1084
|
-
a && (
|
|
1084
|
+
a && (E(() => n?.onHoldable?.(!t.emptyState && !!s()?.holds?.())), k(() => n?.onHoldable?.(!1))), E(() => {
|
|
1085
1085
|
if (!a || !i?.nothingMore()) return;
|
|
1086
|
-
let e = setTimeout(() => i.setNothingMore(!1),
|
|
1087
|
-
|
|
1088
|
-
}),
|
|
1089
|
-
let [c, l] =
|
|
1086
|
+
let e = setTimeout(() => i.setNothingMore(!1), ri);
|
|
1087
|
+
k(() => clearTimeout(e));
|
|
1088
|
+
}), E(() => i?.setTone(t.color ?? (t.tone ? `var(--tone-${t.tone})` : void 0)));
|
|
1089
|
+
let [c, l] = O(), [u, d] = O({
|
|
1090
1090
|
width: 0,
|
|
1091
1091
|
height: 0
|
|
1092
1092
|
});
|
|
1093
|
-
|
|
1093
|
+
E(() => {
|
|
1094
1094
|
let e = c();
|
|
1095
1095
|
if (!e) return;
|
|
1096
1096
|
let t = new ResizeObserver(([e]) => {
|
|
@@ -1104,36 +1104,36 @@ function Xr(t) {
|
|
|
1104
1104
|
height: e.contentRect.height
|
|
1105
1105
|
});
|
|
1106
1106
|
});
|
|
1107
|
-
t.observe(e),
|
|
1108
|
-
}),
|
|
1107
|
+
t.observe(e), k(() => t.disconnect());
|
|
1108
|
+
}), ye(() => {
|
|
1109
1109
|
let e = c()?.getRootNode();
|
|
1110
|
-
|
|
1110
|
+
Cr(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,
|
|
1118
|
-
let p =
|
|
1119
|
-
if (t.variant) return typeof t.variant == "string" ?
|
|
1120
|
-
}), m = e(() => t.gradient, "widget.gradient"), h = () => !!t.tone && t.tone !== "neutral" || !!t.color, g =
|
|
1117
|
+
n && Object.defineProperty(f, bn, { value: n });
|
|
1118
|
+
let p = D(() => {
|
|
1119
|
+
if (t.variant) return typeof t.variant == "string" ? Tr(t.variant) : t.variant.styles;
|
|
1120
|
+
}), m = e(() => t.gradient, "widget.gradient"), h = () => !!t.tone && t.tone !== "neutral" || !!t.color, g = D(() => ({
|
|
1121
1121
|
...p()?.cssVars || {},
|
|
1122
1122
|
...t.tone ? { "--widget-color": `var(--tone-${t.tone})` } : {},
|
|
1123
1123
|
...t.color ? { "--widget-color": t.color } : {},
|
|
1124
1124
|
...h() ? { "--glass-tone": "var(--widget-color)" } : {}
|
|
1125
1125
|
})), _ = a && !!n?.onShell;
|
|
1126
1126
|
if (a) {
|
|
1127
|
-
let e =
|
|
1127
|
+
let e = D(() => {
|
|
1128
1128
|
let e = p()?.cssVars, n = e?.["--glass-tone"], r = e?.["--glass-lift"], i = typeof r == "string" && r.trim() !== "" ? Number(r) : r;
|
|
1129
1129
|
return {
|
|
1130
1130
|
tone: h() ? t.color ?? `var(--tone-${t.tone})` : typeof n == "string" ? n : null,
|
|
1131
1131
|
lift: typeof i == "number" && Number.isFinite(i) ? i : null
|
|
1132
1132
|
};
|
|
1133
1133
|
}, void 0, { equals: (e, t) => e.tone === t.tone && e.lift === t.lift });
|
|
1134
|
-
|
|
1134
|
+
E(() => n?.onShell?.(e())), k(() => n?.onShell?.(null));
|
|
1135
1135
|
}
|
|
1136
|
-
let v =
|
|
1136
|
+
let v = D(() => ({
|
|
1137
1137
|
"container-type": "size",
|
|
1138
1138
|
"container-name": "widget",
|
|
1139
1139
|
"touch-action": s() && !t.isEditMode ? s()?.touchAction() : void 0,
|
|
@@ -1154,45 +1154,45 @@ 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": _n.BACKGROUND
|
|
1171
1171
|
});
|
|
1172
|
-
return
|
|
1172
|
+
return N(H.Provider, {
|
|
1173
1173
|
value: f,
|
|
1174
1174
|
get children() {
|
|
1175
|
-
return
|
|
1175
|
+
return N(or.Provider, {
|
|
1176
1176
|
value: () => t.confirmed === !0,
|
|
1177
1177
|
get children() {
|
|
1178
|
-
return
|
|
1178
|
+
return N(Vn.Provider, {
|
|
1179
1179
|
value: u,
|
|
1180
1180
|
get children() {
|
|
1181
1181
|
return [(() => {
|
|
1182
|
-
var e =
|
|
1182
|
+
var e = Zr(), n = e.firstChild, i = n.firstChild;
|
|
1183
1183
|
return n.$$keydown = (e) => {
|
|
1184
1184
|
y() && s()?.onKeyDown?.(e);
|
|
1185
|
-
},
|
|
1185
|
+
}, j(n, "pointercancel", te), j(n, "pointerup", ee), j(n, "pointermove", S), j(n, "pointerdown", x), j(n, "pointerenter", b), Te((e) => {
|
|
1186
1186
|
l(e), t.gestures?.bindElement(e), r.bindElement(e);
|
|
1187
|
-
}, n), I(n,
|
|
1187
|
+
}, n), I(n, N(T, {
|
|
1188
1188
|
get when() {
|
|
1189
1189
|
return s()?.hold;
|
|
1190
1190
|
},
|
|
1191
1191
|
get children() {
|
|
1192
|
-
var e =
|
|
1192
|
+
var e = Yr();
|
|
1193
1193
|
return F((t) => {
|
|
1194
|
-
var n =
|
|
1195
|
-
return n !== t.e && R(e, "data-hold", t.e = n), r !== t.t && R(e, "data-fired", t.t = r), t.a =
|
|
1194
|
+
var n = ne() && !ne()?.fired ? "" : void 0, r = ne()?.fired ? "" : void 0, i = re(ne());
|
|
1195
|
+
return n !== t.e && R(e, "data-hold", t.e = n), r !== t.t && R(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,
|
|
@@ -1201,7 +1201,7 @@ function Xr(t) {
|
|
|
1201
1201
|
}
|
|
1202
1202
|
}), i), I(i, (() => {
|
|
1203
1203
|
var e = L(() => !!t.emptyState);
|
|
1204
|
-
return () => e() ?
|
|
1204
|
+
return () => e() ? N(ai, {
|
|
1205
1205
|
get icon() {
|
|
1206
1206
|
return t.emptyState.icon;
|
|
1207
1207
|
},
|
|
@@ -1215,24 +1215,24 @@ function Xr(t) {
|
|
|
1215
1215
|
})()), I(n, (() => {
|
|
1216
1216
|
var e = L(() => !!t.loading);
|
|
1217
1217
|
return () => e() && (() => {
|
|
1218
|
-
var e =
|
|
1219
|
-
return F((t) =>
|
|
1218
|
+
var e = Qr();
|
|
1219
|
+
return F((t) => Ce(e, "z-index", _n.OVERLAY)), e;
|
|
1220
1220
|
})();
|
|
1221
|
-
})(), null), I(e,
|
|
1221
|
+
})(), null), I(e, N(T, {
|
|
1222
1222
|
when: !_,
|
|
1223
1223
|
get children() {
|
|
1224
|
-
var e =
|
|
1224
|
+
var e = Xr();
|
|
1225
1225
|
return F((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 && R(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
1233
|
}), null), F((e) => {
|
|
1234
|
-
var r =
|
|
1235
|
-
return r !== e.e &&
|
|
1234
|
+
var r = K("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 = _n.CONTENT;
|
|
1235
|
+
return r !== e.e && M(n, e.e = r), e.t = z(n, a, e.t), o !== e.a && R(n, "data-toned", e.a = o), s !== e.o && R(n, "data-confirmed", e.o = s), c !== e.i && R(n, "tabindex", e.i = c), l !== e.n && Ce(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(at, {
|
|
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(ot, {
|
|
1257
1257
|
class: "flex w-auto items-center gap-2 p-3 text-sm",
|
|
1258
1258
|
get children() {
|
|
1259
|
-
return [
|
|
1259
|
+
return [N(V, { icon: "mdi:information-outline" }), "No more controls for this widget"];
|
|
1260
1260
|
}
|
|
1261
1261
|
});
|
|
1262
1262
|
}
|
|
@@ -1270,81 +1270,87 @@ function Xr(t) {
|
|
|
1270
1270
|
}
|
|
1271
1271
|
});
|
|
1272
1272
|
}
|
|
1273
|
-
function
|
|
1273
|
+
function ai(e) {
|
|
1274
1274
|
return (() => {
|
|
1275
|
-
var t =
|
|
1275
|
+
var t = $r();
|
|
1276
1276
|
return I(t, (() => {
|
|
1277
1277
|
var t = L(() => !!e.icon);
|
|
1278
1278
|
return () => t() && (() => {
|
|
1279
|
-
var t =
|
|
1279
|
+
var t = ei();
|
|
1280
1280
|
return I(t, () => e.icon), t;
|
|
1281
1281
|
})();
|
|
1282
1282
|
})(), null), I(t, (() => {
|
|
1283
1283
|
var t = L(() => !!e.title);
|
|
1284
1284
|
return () => t() && (() => {
|
|
1285
|
-
var t =
|
|
1285
|
+
var t = ti();
|
|
1286
1286
|
return I(t, () => e.title), t;
|
|
1287
1287
|
})();
|
|
1288
1288
|
})(), null), I(t, (() => {
|
|
1289
1289
|
var t = L(() => !!e.message);
|
|
1290
1290
|
return () => t() && (() => {
|
|
1291
|
-
var t =
|
|
1291
|
+
var t = ni();
|
|
1292
1292
|
return I(t, () => e.message), t;
|
|
1293
1293
|
})();
|
|
1294
1294
|
})(), null), t;
|
|
1295
1295
|
})();
|
|
1296
1296
|
}
|
|
1297
|
-
var
|
|
1298
|
-
|
|
1297
|
+
var q = ii;
|
|
1298
|
+
q.Content = jr, q.Icon = Jn, q.Title = Ir, q.Status = Nr, q.Value = Jr, q.SliderFill = Or, q.Head = cr, q.Hero = lr, q.Controls = ur, q.Stepper = dr, q.Choice = fr, q.Action = pr, q.Chip = mr, q.Backdrop = gr, q.Layer = hr, q.Glyph = _r, P(["keydown"]);
|
|
1299
1299
|
//#endregion
|
|
1300
1300
|
//#region src/framework/panel/panel.tsx
|
|
1301
|
-
var
|
|
1302
|
-
function
|
|
1303
|
-
let
|
|
1301
|
+
var oi = /*#__PURE__*/ B("<section class=glasshome-panel-section><h3 class=glasshome-panel-label>"), si = /*#__PURE__*/ B("<div class=glasshome-panel-rows>"), ci = /*#__PURE__*/ B("<span class=\"glasshome-widget-slider-fill glasshome-panel-row-fill\">"), li = /*#__PURE__*/ B("<span class=\"glasshome-widget-icon glass glasshome-panel-row-icon\">"), ui = /*#__PURE__*/ B("<span class=glasshome-panel-row-state>"), di = /*#__PURE__*/ B("<span class=glasshome-panel-row-text><span class=glasshome-panel-row-name>"), fi = /*#__PURE__*/ B("<span class=glasshome-panel-row-trailing>"), pi = /*#__PURE__*/ B("<div class=glasshome-panel-row-wrap>"), mi = /*#__PURE__*/ B("<div>"), hi = /*#__PURE__*/ B("<div role=slider tabindex=0>"), gi = /*#__PURE__*/ B("<div class=\"glasshome-panel-facts glass\">"), _i = /*#__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>"), vi = 8, yi = 5, bi = (e, t, n) => Math.min(n, Math.max(t, e));
|
|
1302
|
+
function xi(e, t, n) {
|
|
1303
|
+
let r = (String(n).split(".")[1] ?? "").length;
|
|
1304
|
+
return Number((t + Math.round((e - t) / n) * n).toFixed(r));
|
|
1305
|
+
}
|
|
1306
|
+
function Si(e) {
|
|
1307
|
+
let t = A(H), n, r = !1, i = !1, a, o = 0, s = 0, c = (t, n) => {
|
|
1304
1308
|
let r = e.slide?.();
|
|
1305
1309
|
if (!r) return 0;
|
|
1306
1310
|
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
|
|
1308
|
-
},
|
|
1311
|
+
return bi(xi(o + a * (s - o), o, r.step ?? 1), o, s);
|
|
1312
|
+
}, l = () => {
|
|
1309
1313
|
clearTimeout(a), n = void 0;
|
|
1310
1314
|
};
|
|
1311
|
-
return
|
|
1315
|
+
return k(() => clearTimeout(a)), {
|
|
1312
1316
|
onPointerDown: (o) => {
|
|
1313
1317
|
if (o.button !== 0 || n) return;
|
|
1314
|
-
let s = o.target instanceof Element ? o.target.closest(
|
|
1318
|
+
let s = o.target instanceof Element ? o.target.closest(zn) : null;
|
|
1315
1319
|
s && s !== o.currentTarget || (n = {
|
|
1316
1320
|
x: o.clientX,
|
|
1317
1321
|
y: o.clientY,
|
|
1318
1322
|
id: o.pointerId
|
|
1319
1323
|
}, o.currentTarget.setPointerCapture?.(o.pointerId), r = !1, i = !1, e.onHold && (a = setTimeout(() => {
|
|
1320
|
-
i = !0,
|
|
1321
|
-
},
|
|
1324
|
+
i = !0, tn(), e.onHold?.(), t?.onHeld?.();
|
|
1325
|
+
}, tt)));
|
|
1322
1326
|
},
|
|
1323
1327
|
onPointerMove: (t) => {
|
|
1324
1328
|
if (!n || t.pointerId !== n.id || i) return;
|
|
1325
|
-
let
|
|
1326
|
-
!r &&
|
|
1329
|
+
let l = t.currentTarget, u = e.axis === "x" ? Math.abs(t.clientX - n.x) : Math.abs(t.clientY - n.y), d = e.slide?.();
|
|
1330
|
+
!r && d && u > vi && (r = !0, s = d.value, clearTimeout(a)), r ? (o = c(l, t), e.slide?.()?.onChange(o)) : Math.hypot(t.clientX - n.x, t.clientY - n.y) > vi && clearTimeout(a);
|
|
1327
1331
|
},
|
|
1328
1332
|
onPointerUp: (t) => {
|
|
1329
|
-
n && t.pointerId === n.id && (r ? e.slide?.()?.onCommit?.(o) : i || e.onTap?.(),
|
|
1333
|
+
n && t.pointerId === n.id && (r ? e.slide?.()?.onCommit?.(o) : i || e.onTap?.(), l());
|
|
1330
1334
|
},
|
|
1331
|
-
onPointerCancel:
|
|
1335
|
+
onPointerCancel: (t) => {
|
|
1336
|
+
n && t.pointerId === n.id && (r && e.slide?.()?.onChange(s), l());
|
|
1337
|
+
}
|
|
1332
1338
|
};
|
|
1333
1339
|
}
|
|
1334
|
-
function
|
|
1340
|
+
function Ci(e) {
|
|
1335
1341
|
return (() => {
|
|
1336
|
-
var t =
|
|
1342
|
+
var t = oi(), n = t.firstChild;
|
|
1337
1343
|
return I(n, () => e.label), I(t, () => e.children, null), t;
|
|
1338
1344
|
})();
|
|
1339
1345
|
}
|
|
1340
|
-
function
|
|
1346
|
+
function wi(e) {
|
|
1341
1347
|
return (() => {
|
|
1342
|
-
var t =
|
|
1348
|
+
var t = si();
|
|
1343
1349
|
return I(t, () => e.children), t;
|
|
1344
1350
|
})();
|
|
1345
1351
|
}
|
|
1346
|
-
function
|
|
1347
|
-
let t = () => !!(e.onTap || e.slide || e.onHold), n =
|
|
1352
|
+
function Ti(e) {
|
|
1353
|
+
let t = () => !!(e.onTap || e.slide || e.onHold), n = Si({
|
|
1348
1354
|
axis: "x",
|
|
1349
1355
|
slide: () => e.slide,
|
|
1350
1356
|
onTap: () => e.onTap?.(),
|
|
@@ -1355,27 +1361,33 @@ function mi(e) {
|
|
|
1355
1361
|
if (!t || !e.on) return;
|
|
1356
1362
|
let n = t.min ?? 0, r = t.max ?? 100;
|
|
1357
1363
|
return (t.value - n) / (r - n || 1) * 100;
|
|
1358
|
-
}, i =
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
t
|
|
1364
|
-
|
|
1365
|
-
|
|
1364
|
+
}, i = {
|
|
1365
|
+
onPointerDown: n.onPointerDown,
|
|
1366
|
+
onPointerMove: n.onPointerMove,
|
|
1367
|
+
onPointerUp: n.onPointerUp,
|
|
1368
|
+
onPointerCancel: n.onPointerCancel,
|
|
1369
|
+
onKeyDown: (t) => {
|
|
1370
|
+
let n = e.slide;
|
|
1371
|
+
if (!n) return;
|
|
1372
|
+
let r = n.step ?? yi, i = t.key === "ArrowRight" || t.key === "ArrowUp" ? r : t.key === "ArrowLeft" || t.key === "ArrowDown" ? -r : 0;
|
|
1373
|
+
if (!i) return;
|
|
1374
|
+
t.preventDefault();
|
|
1375
|
+
let a = n.min ?? 0, o = bi(xi(n.value + i, a, n.step ?? 1), a, n.max ?? 100);
|
|
1376
|
+
n.onChange(o), n.onCommit?.(o);
|
|
1377
|
+
}
|
|
1366
1378
|
}, a = () => [
|
|
1367
|
-
|
|
1379
|
+
N(T, {
|
|
1368
1380
|
get when() {
|
|
1369
1381
|
return r() !== void 0;
|
|
1370
1382
|
},
|
|
1371
1383
|
get children() {
|
|
1372
|
-
var e =
|
|
1373
|
-
return F((t) =>
|
|
1384
|
+
var e = ci();
|
|
1385
|
+
return F((t) => z(e, { "--widget-fill-value": r() }, t)), e;
|
|
1374
1386
|
}
|
|
1375
1387
|
}),
|
|
1376
1388
|
(() => {
|
|
1377
|
-
var t =
|
|
1378
|
-
return I(t,
|
|
1389
|
+
var t = li();
|
|
1390
|
+
return I(t, N(V, {
|
|
1379
1391
|
get icon() {
|
|
1380
1392
|
return e.icon;
|
|
1381
1393
|
},
|
|
@@ -1389,95 +1401,108 @@ function mi(e) {
|
|
|
1389
1401
|
}), t;
|
|
1390
1402
|
})(),
|
|
1391
1403
|
(() => {
|
|
1392
|
-
var t =
|
|
1393
|
-
return I(n, () => e.name), I(t,
|
|
1404
|
+
var t = di(), n = t.firstChild;
|
|
1405
|
+
return I(n, () => e.name), I(t, N(T, {
|
|
1394
1406
|
get when() {
|
|
1395
1407
|
return e.state !== void 0;
|
|
1396
1408
|
},
|
|
1397
1409
|
get children() {
|
|
1398
|
-
var t =
|
|
1410
|
+
var t = ui();
|
|
1399
1411
|
return I(t, () => e.state), t;
|
|
1400
1412
|
}
|
|
1401
1413
|
}), null), t;
|
|
1402
1414
|
})()
|
|
1403
|
-
], o = () => ({ "--widget-color": e.tone ?? "var(--tone-neutral)" })
|
|
1415
|
+
], o = () => ({ "--widget-color": e.tone ?? "var(--tone-neutral)" }), s = Kt({
|
|
1416
|
+
variant: "outline",
|
|
1417
|
+
size: "none"
|
|
1418
|
+
});
|
|
1404
1419
|
return (() => {
|
|
1405
|
-
var
|
|
1406
|
-
return I(
|
|
1407
|
-
get when() {
|
|
1408
|
-
return t();
|
|
1409
|
-
},
|
|
1420
|
+
var n = pi();
|
|
1421
|
+
return I(n, N(he, {
|
|
1410
1422
|
get fallback() {
|
|
1411
1423
|
return (() => {
|
|
1412
|
-
var e =
|
|
1413
|
-
return I(e, a), F((t) =>
|
|
1414
|
-
var n = `${Rt({
|
|
1415
|
-
variant: "outline",
|
|
1416
|
-
size: "none"
|
|
1417
|
-
})} glasshome-panel-row glasshome-panel-row-static`, r = o();
|
|
1418
|
-
return n !== t.e && N(e, t.e = n), t.t = B(e, r, t.t), t;
|
|
1419
|
-
}, {
|
|
1420
|
-
e: void 0,
|
|
1421
|
-
t: void 0
|
|
1422
|
-
}), e;
|
|
1424
|
+
var e = mi();
|
|
1425
|
+
return M(e, `${s} glasshome-panel-row glasshome-panel-row-static`), I(e, a), F((t) => z(e, o(), t)), e;
|
|
1423
1426
|
})();
|
|
1424
1427
|
},
|
|
1425
1428
|
get children() {
|
|
1426
|
-
return
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
class: "glasshome-panel-row",
|
|
1430
|
-
get style() {
|
|
1431
|
-
return o();
|
|
1432
|
-
},
|
|
1433
|
-
get "aria-label"() {
|
|
1434
|
-
return e["aria-label"];
|
|
1435
|
-
},
|
|
1436
|
-
get "aria-pressed"() {
|
|
1437
|
-
return e.on;
|
|
1438
|
-
},
|
|
1439
|
-
get onPointerDown() {
|
|
1440
|
-
return n.onPointerDown;
|
|
1441
|
-
},
|
|
1442
|
-
get onPointerMove() {
|
|
1443
|
-
return n.onPointerMove;
|
|
1444
|
-
},
|
|
1445
|
-
get onPointerUp() {
|
|
1446
|
-
return n.onPointerUp;
|
|
1447
|
-
},
|
|
1448
|
-
get onPointerCancel() {
|
|
1449
|
-
return n.onPointerCancel;
|
|
1429
|
+
return [N(me, {
|
|
1430
|
+
get when() {
|
|
1431
|
+
return L(() => !(e.onTap || e.onHold))() && e.slide;
|
|
1450
1432
|
},
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1433
|
+
children: (t) => (() => {
|
|
1434
|
+
var n = hi();
|
|
1435
|
+
return M(n, `${s} glasshome-panel-row`), we(n, Se({
|
|
1436
|
+
get style() {
|
|
1437
|
+
return o();
|
|
1438
|
+
},
|
|
1439
|
+
get "aria-label"() {
|
|
1440
|
+
return e["aria-label"] ?? (t().label ? `${e.name}, ${t().label}` : e.name);
|
|
1441
|
+
},
|
|
1442
|
+
get "aria-valuemin"() {
|
|
1443
|
+
return t().min ?? 0;
|
|
1444
|
+
},
|
|
1445
|
+
get "aria-valuemax"() {
|
|
1446
|
+
return t().max ?? 100;
|
|
1447
|
+
},
|
|
1448
|
+
get "aria-valuenow"() {
|
|
1449
|
+
return t().value;
|
|
1450
|
+
},
|
|
1451
|
+
get "aria-valuetext"() {
|
|
1452
|
+
return L(() => typeof e.state == "string")() ? e.state : void 0;
|
|
1453
|
+
}
|
|
1454
|
+
}, i), !1, !0), I(n, a), n;
|
|
1455
|
+
})()
|
|
1456
|
+
}), N(me, {
|
|
1457
|
+
get when() {
|
|
1458
|
+
return t();
|
|
1454
1459
|
},
|
|
1455
1460
|
get children() {
|
|
1456
|
-
return
|
|
1461
|
+
return N(Ne, Se({
|
|
1462
|
+
variant: "outline",
|
|
1463
|
+
size: "none",
|
|
1464
|
+
class: "glasshome-panel-row",
|
|
1465
|
+
get style() {
|
|
1466
|
+
return o();
|
|
1467
|
+
},
|
|
1468
|
+
get "aria-label"() {
|
|
1469
|
+
return e["aria-label"];
|
|
1470
|
+
},
|
|
1471
|
+
get "aria-pressed"() {
|
|
1472
|
+
return e.on;
|
|
1473
|
+
}
|
|
1474
|
+
}, i, {
|
|
1475
|
+
onClick: (t) => {
|
|
1476
|
+
t.detail === 0 && e.onTap?.();
|
|
1477
|
+
},
|
|
1478
|
+
get children() {
|
|
1479
|
+
return a();
|
|
1480
|
+
}
|
|
1481
|
+
}));
|
|
1457
1482
|
}
|
|
1458
|
-
});
|
|
1483
|
+
})];
|
|
1459
1484
|
}
|
|
1460
|
-
}), null), I(
|
|
1485
|
+
}), null), I(n, N(T, {
|
|
1461
1486
|
get when() {
|
|
1462
1487
|
return e.trailing;
|
|
1463
1488
|
},
|
|
1464
1489
|
get children() {
|
|
1465
|
-
var t =
|
|
1490
|
+
var t = fi();
|
|
1466
1491
|
return I(t, () => e.trailing), t;
|
|
1467
1492
|
}
|
|
1468
|
-
}), null),
|
|
1493
|
+
}), null), n;
|
|
1469
1494
|
})();
|
|
1470
1495
|
}
|
|
1471
|
-
function
|
|
1496
|
+
function Ei(e) {
|
|
1472
1497
|
return (() => {
|
|
1473
|
-
var t =
|
|
1474
|
-
return I(t,
|
|
1498
|
+
var t = gi();
|
|
1499
|
+
return I(t, N(w, {
|
|
1475
1500
|
get each() {
|
|
1476
1501
|
return e.items;
|
|
1477
1502
|
},
|
|
1478
1503
|
children: (e) => (() => {
|
|
1479
|
-
var t =
|
|
1480
|
-
return I(t,
|
|
1504
|
+
var t = _i(), n = t.firstChild, r = n.firstChild, i = r.nextSibling;
|
|
1505
|
+
return I(t, N(V, {
|
|
1481
1506
|
get icon() {
|
|
1482
1507
|
return e.icon;
|
|
1483
1508
|
},
|
|
@@ -1489,7 +1514,11 @@ function hi(e) {
|
|
|
1489
1514
|
}
|
|
1490
1515
|
//#endregion
|
|
1491
1516
|
//#region src/framework/panel/panel-entity.tsx
|
|
1492
|
-
var
|
|
1517
|
+
var Di = 5e3, Oi = 1, ki = 4, J = (e) => typeof e == "number" ? e : void 0, Y = (e) => typeof e == "number" ? Math.round(e) : void 0, X = (e) => e.charAt(0).toUpperCase() + e.slice(1).replaceAll("_", " "), Ai = (e, t) => ((J(e.attributes.supported_features) ?? 0) & t) > 0, ji = (e, t) => String(e.attributes.temperature_unit ?? t).includes("F"), Mi = (e) => Ai(e, Oi) ? J(e.attributes.temperature) : void 0, Ni = (e) => (t, n) => ({
|
|
1518
|
+
min: J(t.attributes.min_temp) ?? 0,
|
|
1519
|
+
max: J(t.attributes.max_temp) ?? 100,
|
|
1520
|
+
step: J(t.attributes.target_temp_step) ?? e(t, n)
|
|
1521
|
+
}), Pi = {
|
|
1493
1522
|
light: {
|
|
1494
1523
|
icon: "mdi:lightbulb",
|
|
1495
1524
|
tone: (e) => {
|
|
@@ -1506,22 +1535,25 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1506
1535
|
let t = e.attributes.brightness;
|
|
1507
1536
|
return e.state === "on" ? typeof t == "number" ? Math.round(t / 255 * 100) : 100 : 0;
|
|
1508
1537
|
},
|
|
1509
|
-
setLevel: (e, t
|
|
1510
|
-
|
|
1538
|
+
setLevel: (e, t) => t > 0 ? {
|
|
1539
|
+
service: "turn_on",
|
|
1540
|
+
data: { brightness_pct: t }
|
|
1541
|
+
} : { service: "turn_off" },
|
|
1542
|
+
tap: () => ({ service: "toggle" })
|
|
1511
1543
|
},
|
|
1512
1544
|
switch: {
|
|
1513
1545
|
icon: "mdi:toggle-switch-variant",
|
|
1514
1546
|
tone: "var(--tone-info)",
|
|
1515
1547
|
on: (e) => e.state === "on",
|
|
1516
1548
|
state: (e) => e.state === "on" ? "On" : "Off",
|
|
1517
|
-
tap: (
|
|
1549
|
+
tap: () => ({ service: "toggle" })
|
|
1518
1550
|
},
|
|
1519
1551
|
input_boolean: {
|
|
1520
1552
|
icon: "mdi:toggle-switch-variant",
|
|
1521
1553
|
tone: "var(--tone-info)",
|
|
1522
1554
|
on: (e) => e.state === "on",
|
|
1523
1555
|
state: (e) => e.state === "on" ? "On" : "Off",
|
|
1524
|
-
tap: (
|
|
1556
|
+
tap: () => ({ service: "toggle" })
|
|
1525
1557
|
},
|
|
1526
1558
|
fan: {
|
|
1527
1559
|
icon: "mdi:fan",
|
|
@@ -1529,31 +1561,52 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1529
1561
|
on: (e) => e.state === "on",
|
|
1530
1562
|
state: (e) => {
|
|
1531
1563
|
if (e.state !== "on") return "Off";
|
|
1532
|
-
let t =
|
|
1564
|
+
let t = Y(e.attributes.percentage);
|
|
1533
1565
|
return t === void 0 ? "On" : `${t}%`;
|
|
1534
1566
|
},
|
|
1535
|
-
level: (e) => e.state === "on" ?
|
|
1536
|
-
setLevel: (e, t
|
|
1537
|
-
|
|
1567
|
+
level: (e) => e.state === "on" ? Y(e.attributes.percentage) ?? 100 : 0,
|
|
1568
|
+
setLevel: (e, t) => ({
|
|
1569
|
+
service: "set_percentage",
|
|
1570
|
+
data: { percentage: t }
|
|
1571
|
+
}),
|
|
1572
|
+
tap: () => ({ service: "toggle" })
|
|
1538
1573
|
},
|
|
1539
1574
|
cover: {
|
|
1540
1575
|
icon: "mdi:blinds",
|
|
1541
1576
|
tone: "var(--tone-info)",
|
|
1542
1577
|
on: (e) => e.state !== "closed",
|
|
1543
1578
|
state: (e) => {
|
|
1544
|
-
let t =
|
|
1579
|
+
let t = Y(e.attributes.current_position), n = X(e.state);
|
|
1580
|
+
return t !== void 0 && e.state === "open" ? `${n} · ${t}%` : n;
|
|
1581
|
+
},
|
|
1582
|
+
level: (e) => Y(e.attributes.current_position),
|
|
1583
|
+
setLevel: (e, t) => ({
|
|
1584
|
+
service: "set_cover_position",
|
|
1585
|
+
data: { position: t }
|
|
1586
|
+
}),
|
|
1587
|
+
tap: (e) => ({ service: e.state === "closed" ? "open_cover" : "close_cover" })
|
|
1588
|
+
},
|
|
1589
|
+
valve: {
|
|
1590
|
+
icon: "mdi:valve",
|
|
1591
|
+
tone: "var(--tone-info)",
|
|
1592
|
+
on: (e) => e.state !== "closed",
|
|
1593
|
+
state: (e) => {
|
|
1594
|
+
let t = Y(e.attributes.current_position), n = X(e.state);
|
|
1545
1595
|
return t !== void 0 && e.state === "open" ? `${n} · ${t}%` : n;
|
|
1546
1596
|
},
|
|
1547
|
-
level: (e) =>
|
|
1548
|
-
setLevel: (e, t
|
|
1549
|
-
|
|
1597
|
+
level: (e) => Ai(e, ki) ? Y(e.attributes.current_position) : void 0,
|
|
1598
|
+
setLevel: (e, t) => ({
|
|
1599
|
+
service: "set_valve_position",
|
|
1600
|
+
data: { position: t }
|
|
1601
|
+
}),
|
|
1602
|
+
tap: (e) => ({ service: e.state === "closed" ? "open_valve" : "close_valve" })
|
|
1550
1603
|
},
|
|
1551
1604
|
lock: {
|
|
1552
1605
|
icon: (e) => e.state === "locked" ? "mdi:lock" : "mdi:lock-open-variant",
|
|
1553
1606
|
tone: "var(--tone-success)",
|
|
1554
1607
|
on: (e) => e.state === "locked",
|
|
1555
|
-
state: (e) =>
|
|
1556
|
-
tap: (e
|
|
1608
|
+
state: (e) => X(e.state),
|
|
1609
|
+
tap: (e) => ({ service: e.state === "locked" ? "unlock" : "lock" })
|
|
1557
1610
|
},
|
|
1558
1611
|
climate: {
|
|
1559
1612
|
icon: "mdi:thermostat",
|
|
@@ -1562,24 +1615,69 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1562
1615
|
state: (e) => {
|
|
1563
1616
|
if (e.state === "off") return "Off";
|
|
1564
1617
|
let t = e.attributes.temperature;
|
|
1565
|
-
return typeof t == "number" ? `${
|
|
1566
|
-
}
|
|
1618
|
+
return typeof t == "number" ? `${X(e.state)} · ${t}°` : X(e.state);
|
|
1619
|
+
},
|
|
1620
|
+
level: Mi,
|
|
1621
|
+
bounds: Ni((e, t) => ji(e, t) ? 1 : .5),
|
|
1622
|
+
setLevel: (e, t) => ({
|
|
1623
|
+
service: "set_temperature",
|
|
1624
|
+
data: { temperature: t }
|
|
1625
|
+
})
|
|
1626
|
+
},
|
|
1627
|
+
water_heater: {
|
|
1628
|
+
icon: "mdi:water-boiler",
|
|
1629
|
+
tone: "var(--tone-danger)",
|
|
1630
|
+
on: (e) => e.state !== "off",
|
|
1631
|
+
state: (e) => {
|
|
1632
|
+
if (e.state === "off") return "Off";
|
|
1633
|
+
let t = e.attributes.temperature;
|
|
1634
|
+
return typeof t == "number" ? `${X(e.state)} · ${t}°` : X(e.state);
|
|
1635
|
+
},
|
|
1636
|
+
level: Mi,
|
|
1637
|
+
bounds: Ni(() => 1),
|
|
1638
|
+
setLevel: (e, t) => ({
|
|
1639
|
+
service: "set_temperature",
|
|
1640
|
+
data: { temperature: t }
|
|
1641
|
+
})
|
|
1642
|
+
},
|
|
1643
|
+
humidifier: {
|
|
1644
|
+
icon: "mdi:air-humidifier",
|
|
1645
|
+
tone: "var(--tone-info)",
|
|
1646
|
+
on: (e) => e.state === "on",
|
|
1647
|
+
state: (e) => {
|
|
1648
|
+
if (e.state !== "on") return "Off";
|
|
1649
|
+
let t = Y(e.attributes.humidity);
|
|
1650
|
+
return t === void 0 ? "On" : `${t}%`;
|
|
1651
|
+
},
|
|
1652
|
+
level: (e) => Y(e.attributes.humidity),
|
|
1653
|
+
bounds: (e) => ({
|
|
1654
|
+
min: J(e.attributes.min_humidity) ?? 0,
|
|
1655
|
+
max: J(e.attributes.max_humidity) ?? 100
|
|
1656
|
+
}),
|
|
1657
|
+
setLevel: (e, t) => ({
|
|
1658
|
+
service: "set_humidity",
|
|
1659
|
+
data: { humidity: t }
|
|
1660
|
+
}),
|
|
1661
|
+
tap: () => ({ service: "toggle" })
|
|
1567
1662
|
},
|
|
1568
1663
|
media_player: {
|
|
1569
1664
|
icon: "mdi:speaker",
|
|
1570
1665
|
tone: "var(--tone-accent)",
|
|
1571
1666
|
on: (e) => e.state === "playing",
|
|
1572
|
-
state: (e) => typeof e.attributes.media_title == "string" && e.state !== "off" ? e.attributes.media_title :
|
|
1667
|
+
state: (e) => typeof e.attributes.media_title == "string" && e.state !== "off" ? e.attributes.media_title : X(e.state),
|
|
1573
1668
|
level: (e) => typeof e.attributes.volume_level == "number" ? Math.round(e.attributes.volume_level * 100) : void 0,
|
|
1574
|
-
setLevel: (e, t
|
|
1575
|
-
|
|
1669
|
+
setLevel: (e, t) => ({
|
|
1670
|
+
service: "volume_set",
|
|
1671
|
+
data: { volume_level: t / 100 }
|
|
1672
|
+
}),
|
|
1673
|
+
tap: () => ({ service: "media_play_pause" })
|
|
1576
1674
|
},
|
|
1577
1675
|
binary_sensor: {
|
|
1578
1676
|
icon: "mdi:eye",
|
|
1579
1677
|
tone: "var(--tone-info)",
|
|
1580
1678
|
on: (e) => e.state === "on",
|
|
1581
1679
|
state: (e) => {
|
|
1582
|
-
let t =
|
|
1680
|
+
let t = Ii[e.deviceClass ?? ""] ?? ["On", "Off"];
|
|
1583
1681
|
return e.state === "on" ? t[0] : t[1];
|
|
1584
1682
|
}
|
|
1585
1683
|
},
|
|
@@ -1587,38 +1685,38 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1587
1685
|
icon: "mdi:gesture-tap-button",
|
|
1588
1686
|
tone: "var(--tone-accent)",
|
|
1589
1687
|
on: () => !1,
|
|
1590
|
-
state: (e) =>
|
|
1591
|
-
tap: (
|
|
1688
|
+
state: (e) => Li(e.state),
|
|
1689
|
+
tap: () => ({ service: "press" })
|
|
1592
1690
|
},
|
|
1593
1691
|
input_button: {
|
|
1594
1692
|
icon: "mdi:gesture-tap-button",
|
|
1595
1693
|
tone: "var(--tone-accent)",
|
|
1596
1694
|
on: () => !1,
|
|
1597
|
-
state: (e) =>
|
|
1598
|
-
tap: (
|
|
1695
|
+
state: (e) => Li(e.state),
|
|
1696
|
+
tap: () => ({ service: "press" })
|
|
1599
1697
|
},
|
|
1600
1698
|
scene: {
|
|
1601
1699
|
icon: "mdi:palette",
|
|
1602
1700
|
tone: "var(--tone-accent)",
|
|
1603
1701
|
on: () => !1,
|
|
1604
1702
|
state: () => "Tap to run",
|
|
1605
|
-
tap: (
|
|
1703
|
+
tap: () => ({ service: "turn_on" })
|
|
1606
1704
|
},
|
|
1607
1705
|
script: {
|
|
1608
1706
|
icon: "mdi:script-text",
|
|
1609
1707
|
tone: "var(--tone-accent)",
|
|
1610
1708
|
on: (e) => e.state === "on",
|
|
1611
1709
|
state: (e) => e.state === "on" ? "Running" : "Tap to run",
|
|
1612
|
-
tap: (
|
|
1710
|
+
tap: () => ({ service: "turn_on" })
|
|
1613
1711
|
}
|
|
1614
|
-
},
|
|
1712
|
+
}, Fi = {
|
|
1615
1713
|
garage: "mdi:garage",
|
|
1616
1714
|
gate: "mdi:gate",
|
|
1617
1715
|
door: "mdi:door",
|
|
1618
1716
|
curtain: "mdi:curtains",
|
|
1619
1717
|
shutter: "mdi:window-shutter",
|
|
1620
1718
|
awning: "mdi:awning"
|
|
1621
|
-
},
|
|
1719
|
+
}, Ii = {
|
|
1622
1720
|
door: ["Open", "Closed"],
|
|
1623
1721
|
window: ["Open", "Closed"],
|
|
1624
1722
|
garage_door: ["Open", "Closed"],
|
|
@@ -1632,65 +1730,91 @@ var gi = (e) => typeof e == "number" ? Math.round(e) : void 0, _i = (e) => e.cha
|
|
|
1632
1730
|
battery: ["Low", "Normal"],
|
|
1633
1731
|
connectivity: ["Connected", "Disconnected"]
|
|
1634
1732
|
};
|
|
1635
|
-
function
|
|
1733
|
+
function Li(e) {
|
|
1636
1734
|
let t = Date.parse(e);
|
|
1637
1735
|
return Number.isNaN(t) ? "Never pressed" : new Date(t).toLocaleTimeString([], {
|
|
1638
1736
|
hour: "2-digit",
|
|
1639
1737
|
minute: "2-digit"
|
|
1640
1738
|
});
|
|
1641
1739
|
}
|
|
1642
|
-
var
|
|
1740
|
+
var Ri = {
|
|
1643
1741
|
icon: "mdi:circle-medium",
|
|
1644
1742
|
tone: "var(--tone-neutral)",
|
|
1645
1743
|
on: (e) => e.state === "on",
|
|
1646
|
-
state: (e) =>
|
|
1744
|
+
state: (e) => X(e.state)
|
|
1745
|
+
}, zi = {
|
|
1746
|
+
min: 0,
|
|
1747
|
+
max: 100
|
|
1647
1748
|
};
|
|
1648
|
-
function
|
|
1749
|
+
function Bi(e, t) {
|
|
1649
1750
|
if (!t || e.length <= t.length || !e.toLowerCase().startsWith(t.toLowerCase())) return e;
|
|
1650
1751
|
let n = e.slice(t.length).trim();
|
|
1651
1752
|
return n ? n.charAt(0).toUpperCase() + n.slice(1) : e;
|
|
1652
1753
|
}
|
|
1653
|
-
function
|
|
1654
|
-
return !!
|
|
1754
|
+
function Vi(e) {
|
|
1755
|
+
return !!Pi[e]?.tap || !!Pi[e]?.setLevel;
|
|
1655
1756
|
}
|
|
1656
|
-
function
|
|
1657
|
-
let t = te(() => e.entityId), { callService:
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
}),
|
|
1757
|
+
function Hi(e) {
|
|
1758
|
+
let t = te(() => e.entityId), n = le(), { callService: r } = pn(), i = A(H)?.canCall, [a, o] = O(), s, c = (e) => {
|
|
1759
|
+
clearTimeout(s), o(e), e !== void 0 && (s = setTimeout(() => o(void 0), Di));
|
|
1760
|
+
};
|
|
1761
|
+
return E(ve(() => e.entityId, () => c(void 0), { defer: !0 })), k(() => clearTimeout(s)), N(T, {
|
|
1661
1762
|
get when() {
|
|
1662
1763
|
return t();
|
|
1663
1764
|
},
|
|
1664
1765
|
children: (t) => {
|
|
1665
|
-
let
|
|
1666
|
-
|
|
1766
|
+
let o = () => Pi[t().domain] ?? Ri, s = () => o().level?.(t());
|
|
1767
|
+
E(() => {
|
|
1768
|
+
a() !== void 0 && s() === a() && c(void 0);
|
|
1769
|
+
});
|
|
1770
|
+
let l = () => a() ?? s(), u = D(() => o().bounds?.(t(), n()) ?? zi), d = (e) => i?.(t().domain, e.service, [t().id]) ?? !0, f = (e) => void r(t().domain, e.service, e.data ?? {}, { entity_id: t().id }), p = D(() => {
|
|
1771
|
+
let e = o().tap?.(t());
|
|
1772
|
+
return e && d(e) ? e : void 0;
|
|
1773
|
+
}), m = D(() => {
|
|
1774
|
+
let e = o().setLevel, n = u();
|
|
1775
|
+
return e && d(e(t(), n.min)) && d(e(t(), n.max)) ? e : void 0;
|
|
1776
|
+
}), h = () => o().on(t()), g = D(() => {
|
|
1777
|
+
let e = m(), n = l();
|
|
1778
|
+
if (e && n !== void 0) return {
|
|
1779
|
+
value: n,
|
|
1780
|
+
...u(),
|
|
1781
|
+
onChange: c,
|
|
1782
|
+
onCommit: (n) => {
|
|
1783
|
+
c(n), f(e(t(), n));
|
|
1784
|
+
}
|
|
1785
|
+
};
|
|
1786
|
+
});
|
|
1787
|
+
return N(Ti, {
|
|
1667
1788
|
get icon() {
|
|
1668
|
-
let n =
|
|
1669
|
-
return typeof n == "function" ? e.icon ?? n(t()) : e.icon ?? t().icon ??
|
|
1789
|
+
let n = o().icon;
|
|
1790
|
+
return typeof n == "function" ? e.icon ?? n(t()) : e.icon ?? t().icon ?? Fi[t().domain === "cover" ? t().deviceClass ?? "" : ""] ?? n;
|
|
1670
1791
|
},
|
|
1671
1792
|
get name() {
|
|
1672
|
-
return e.name ??
|
|
1793
|
+
return e.name ?? Bi(t().friendlyName ?? t().id, e.within);
|
|
1673
1794
|
},
|
|
1674
1795
|
get state() {
|
|
1675
|
-
return
|
|
1796
|
+
return o().state(t());
|
|
1676
1797
|
},
|
|
1677
1798
|
get tone() {
|
|
1678
1799
|
if (e.tone) return e.tone;
|
|
1679
|
-
let n =
|
|
1800
|
+
let n = o().tone;
|
|
1680
1801
|
return typeof n == "function" ? n(t()) : n;
|
|
1681
1802
|
},
|
|
1682
1803
|
get on() {
|
|
1683
|
-
return
|
|
1804
|
+
return h();
|
|
1684
1805
|
},
|
|
1685
1806
|
get slide() {
|
|
1686
|
-
return
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1807
|
+
return g();
|
|
1808
|
+
},
|
|
1809
|
+
get fill() {
|
|
1810
|
+
let e = l();
|
|
1811
|
+
if (m() || !o().setLevel || e === void 0 || !h()) return;
|
|
1812
|
+
let t = u();
|
|
1813
|
+
return (e - t.min) / (t.max - t.min || 1) * 100;
|
|
1691
1814
|
},
|
|
1692
1815
|
get onTap() {
|
|
1693
|
-
|
|
1816
|
+
let e = p();
|
|
1817
|
+
return e ? () => f(e) : void 0;
|
|
1694
1818
|
},
|
|
1695
1819
|
get onHold() {
|
|
1696
1820
|
return e.onHold;
|
|
@@ -1701,8 +1825,8 @@ function Ti(e) {
|
|
|
1701
1825
|
}
|
|
1702
1826
|
//#endregion
|
|
1703
1827
|
//#region src/framework/dialogs/debug-view.tsx
|
|
1704
|
-
var
|
|
1705
|
-
function
|
|
1828
|
+
var Ui = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-64 overflow-auto p-3 font-mono text-xs leading-relaxed\">"), Wi = /*#__PURE__*/ B("<span class=\"flex items-center gap-2\">"), Gi = /*#__PURE__*/ B("<section class=\"flex min-w-0 flex-col gap-2\"><header class=\"flex items-center gap-3\"><div class=\"flex min-w-0 flex-1 flex-col\"></div></header><div class=\"flex flex-col gap-2\">"), Ki = /*#__PURE__*/ B("<div class=\"flex flex-col\">"), qi = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-96 overflow-auto p-3 font-mono text-xs leading-relaxed whitespace-pre-wrap\">");
|
|
1829
|
+
function Ji(e, t, n) {
|
|
1706
1830
|
return {
|
|
1707
1831
|
widgetConfig: e,
|
|
1708
1832
|
entities: t.map((e) => ({
|
|
@@ -1719,18 +1843,18 @@ function ji(e, t, n) {
|
|
|
1719
1843
|
...n
|
|
1720
1844
|
};
|
|
1721
1845
|
}
|
|
1722
|
-
var
|
|
1846
|
+
var Yi = (e) => JSON.stringify(e, null, 2), Xi = {
|
|
1723
1847
|
idle: "lucide:copy",
|
|
1724
1848
|
copied: "lucide:check",
|
|
1725
1849
|
failed: "lucide:triangle-alert"
|
|
1726
|
-
},
|
|
1850
|
+
}, Zi = {
|
|
1727
1851
|
idle: "text-muted-foreground",
|
|
1728
1852
|
copied: "text-success",
|
|
1729
1853
|
failed: "text-destructive"
|
|
1730
1854
|
};
|
|
1731
|
-
function
|
|
1732
|
-
let { state: t, copy: n } =
|
|
1733
|
-
return
|
|
1855
|
+
function Qi(e) {
|
|
1856
|
+
let { state: t, copy: n } = rn();
|
|
1857
|
+
return N(Ne, {
|
|
1734
1858
|
variant: "ghost",
|
|
1735
1859
|
size: "icon",
|
|
1736
1860
|
class: "size-8",
|
|
@@ -1739,70 +1863,70 @@ function Fi(e) {
|
|
|
1739
1863
|
},
|
|
1740
1864
|
onClick: () => void n(e.text()),
|
|
1741
1865
|
get children() {
|
|
1742
|
-
return
|
|
1866
|
+
return N(V, {
|
|
1743
1867
|
get icon() {
|
|
1744
|
-
return
|
|
1868
|
+
return Xi[t()];
|
|
1745
1869
|
},
|
|
1746
1870
|
width: 16,
|
|
1747
1871
|
height: 16,
|
|
1748
1872
|
get class() {
|
|
1749
|
-
return
|
|
1873
|
+
return Zi[t()];
|
|
1750
1874
|
}
|
|
1751
1875
|
});
|
|
1752
1876
|
}
|
|
1753
1877
|
});
|
|
1754
1878
|
}
|
|
1755
|
-
function
|
|
1879
|
+
function $i(e) {
|
|
1756
1880
|
let t = e.replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ");
|
|
1757
1881
|
return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
|
|
1758
1882
|
}
|
|
1759
|
-
var
|
|
1760
|
-
function
|
|
1883
|
+
var ea = (e) => e === null || typeof e != "object" && typeof e != "function";
|
|
1884
|
+
function ta(e) {
|
|
1761
1885
|
return e == null ? "None" : String(e);
|
|
1762
1886
|
}
|
|
1763
|
-
function
|
|
1887
|
+
function na(e) {
|
|
1764
1888
|
return Array.isArray(e) ? e.length : typeof e == "object" && e ? Object.keys(e).length : 0;
|
|
1765
1889
|
}
|
|
1766
|
-
function
|
|
1890
|
+
function ra(e) {
|
|
1767
1891
|
let t = new Date(e);
|
|
1768
1892
|
return Number.isNaN(t.getTime()) ? e : t.toLocaleString();
|
|
1769
1893
|
}
|
|
1770
|
-
function
|
|
1771
|
-
return
|
|
1894
|
+
function ia(e) {
|
|
1895
|
+
return N(St, {
|
|
1772
1896
|
class: "overflow-hidden p-0",
|
|
1773
1897
|
get children() {
|
|
1774
|
-
var t =
|
|
1775
|
-
return I(t, () =>
|
|
1898
|
+
var t = Ui();
|
|
1899
|
+
return I(t, () => Yi(e.value)), t;
|
|
1776
1900
|
}
|
|
1777
1901
|
});
|
|
1778
1902
|
}
|
|
1779
|
-
function
|
|
1780
|
-
return
|
|
1903
|
+
function aa(e) {
|
|
1904
|
+
return N(Ee, {
|
|
1781
1905
|
collapsible: !0,
|
|
1782
1906
|
class: "border-border/50 border-t",
|
|
1783
1907
|
get children() {
|
|
1784
|
-
return
|
|
1908
|
+
return N(Oe, {
|
|
1785
1909
|
get value() {
|
|
1786
1910
|
return e.label;
|
|
1787
1911
|
},
|
|
1788
1912
|
get children() {
|
|
1789
|
-
return [
|
|
1913
|
+
return [N(ke, {
|
|
1790
1914
|
class: "text-muted-foreground py-3 text-xs",
|
|
1791
1915
|
get children() {
|
|
1792
|
-
var t =
|
|
1793
|
-
return I(t, () => e.label, null), I(t,
|
|
1916
|
+
var t = Wi();
|
|
1917
|
+
return I(t, () => e.label, null), I(t, N(T, {
|
|
1794
1918
|
get when() {
|
|
1795
1919
|
return e.count !== void 0;
|
|
1796
1920
|
},
|
|
1797
1921
|
get children() {
|
|
1798
|
-
return
|
|
1922
|
+
return N(Ke, { get children() {
|
|
1799
1923
|
return e.count;
|
|
1800
1924
|
} });
|
|
1801
1925
|
}
|
|
1802
1926
|
}), null), t;
|
|
1803
1927
|
}
|
|
1804
|
-
}),
|
|
1805
|
-
return
|
|
1928
|
+
}), N(De, { get children() {
|
|
1929
|
+
return N(ia, { get value() {
|
|
1806
1930
|
return e.value;
|
|
1807
1931
|
} });
|
|
1808
1932
|
} })];
|
|
@@ -1811,77 +1935,77 @@ function Hi(e) {
|
|
|
1811
1935
|
}
|
|
1812
1936
|
});
|
|
1813
1937
|
}
|
|
1814
|
-
function
|
|
1938
|
+
function oa(e) {
|
|
1815
1939
|
return (() => {
|
|
1816
|
-
var t =
|
|
1817
|
-
return I(n,
|
|
1940
|
+
var t = Gi(), n = t.firstChild, r = n.firstChild, i = n.nextSibling;
|
|
1941
|
+
return I(n, N(bt, {
|
|
1818
1942
|
get icon() {
|
|
1819
1943
|
return e.icon;
|
|
1820
1944
|
},
|
|
1821
1945
|
size: "sm"
|
|
1822
|
-
}), r), I(r,
|
|
1946
|
+
}), r), I(r, N($e, {
|
|
1823
1947
|
class: "truncate",
|
|
1824
1948
|
get children() {
|
|
1825
1949
|
return e.title;
|
|
1826
1950
|
}
|
|
1827
|
-
}), null), I(r,
|
|
1951
|
+
}), null), I(r, N(T, {
|
|
1828
1952
|
get when() {
|
|
1829
1953
|
return e.subtitle;
|
|
1830
1954
|
},
|
|
1831
|
-
children: (e) =>
|
|
1955
|
+
children: (e) => N(xt, {
|
|
1832
1956
|
class: "truncate font-mono",
|
|
1833
1957
|
get children() {
|
|
1834
1958
|
return e();
|
|
1835
1959
|
}
|
|
1836
1960
|
})
|
|
1837
|
-
}), null), I(n, () => e.badge, null), I(n,
|
|
1961
|
+
}), null), I(n, () => e.badge, null), I(n, N(Qi, {
|
|
1838
1962
|
get label() {
|
|
1839
1963
|
return `Copy ${e.title}`;
|
|
1840
1964
|
},
|
|
1841
|
-
text: () =>
|
|
1965
|
+
text: () => Yi(e.source)
|
|
1842
1966
|
}), null), I(i, () => e.children), t;
|
|
1843
1967
|
})();
|
|
1844
1968
|
}
|
|
1845
|
-
function
|
|
1846
|
-
let t =
|
|
1847
|
-
return
|
|
1969
|
+
function sa(e) {
|
|
1970
|
+
let t = D(() => Object.entries(e.record)), n = D(() => t().flatMap(([e, t]) => ea(t) ? [[e, t]] : [])), r = D(() => t().filter(([, e]) => !ea(e)));
|
|
1971
|
+
return N(T, {
|
|
1848
1972
|
get when() {
|
|
1849
1973
|
return t().length > 0;
|
|
1850
1974
|
},
|
|
1851
1975
|
get fallback() {
|
|
1852
|
-
return
|
|
1976
|
+
return N(xt, { children: "Nothing set" });
|
|
1853
1977
|
},
|
|
1854
1978
|
get children() {
|
|
1855
|
-
return [
|
|
1979
|
+
return [N(T, {
|
|
1856
1980
|
get when() {
|
|
1857
1981
|
return n().length > 0;
|
|
1858
1982
|
},
|
|
1859
1983
|
get children() {
|
|
1860
|
-
var e =
|
|
1861
|
-
return I(e,
|
|
1984
|
+
var e = Ki();
|
|
1985
|
+
return I(e, N(w, {
|
|
1862
1986
|
get each() {
|
|
1863
1987
|
return n();
|
|
1864
1988
|
},
|
|
1865
|
-
children: ([e, t]) =>
|
|
1989
|
+
children: ([e, t]) => N(Ze, {
|
|
1866
1990
|
get label() {
|
|
1867
|
-
return
|
|
1991
|
+
return $i(e);
|
|
1868
1992
|
},
|
|
1869
1993
|
get children() {
|
|
1870
|
-
return
|
|
1994
|
+
return ta(t);
|
|
1871
1995
|
}
|
|
1872
1996
|
})
|
|
1873
1997
|
})), e;
|
|
1874
1998
|
}
|
|
1875
|
-
}),
|
|
1999
|
+
}), N(w, {
|
|
1876
2000
|
get each() {
|
|
1877
2001
|
return r();
|
|
1878
2002
|
},
|
|
1879
|
-
children: ([e, t]) =>
|
|
2003
|
+
children: ([e, t]) => N(aa, {
|
|
1880
2004
|
get label() {
|
|
1881
|
-
return
|
|
2005
|
+
return $i(e);
|
|
1882
2006
|
},
|
|
1883
2007
|
get count() {
|
|
1884
|
-
return
|
|
2008
|
+
return na(t);
|
|
1885
2009
|
},
|
|
1886
2010
|
value: t
|
|
1887
2011
|
})
|
|
@@ -1889,9 +2013,9 @@ function Wi(e) {
|
|
|
1889
2013
|
}
|
|
1890
2014
|
});
|
|
1891
2015
|
}
|
|
1892
|
-
function
|
|
2016
|
+
function ca(e) {
|
|
1893
2017
|
let t = () => e.entity.attributes ?? {};
|
|
1894
|
-
return
|
|
2018
|
+
return N(oa, {
|
|
1895
2019
|
icon: "lucide:activity",
|
|
1896
2020
|
get title() {
|
|
1897
2021
|
return e.entity.friendly_name ?? e.entity.entity_id;
|
|
@@ -1900,7 +2024,7 @@ function Gi(e) {
|
|
|
1900
2024
|
return e.entity.entity_id;
|
|
1901
2025
|
},
|
|
1902
2026
|
get badge() {
|
|
1903
|
-
return
|
|
2027
|
+
return N(je, { get children() {
|
|
1904
2028
|
return e.entity.state;
|
|
1905
2029
|
} });
|
|
1906
2030
|
},
|
|
@@ -1909,52 +2033,52 @@ function Gi(e) {
|
|
|
1909
2033
|
},
|
|
1910
2034
|
get children() {
|
|
1911
2035
|
return [(() => {
|
|
1912
|
-
var t =
|
|
1913
|
-
return I(t,
|
|
2036
|
+
var t = Ki();
|
|
2037
|
+
return I(t, N(Ze, {
|
|
1914
2038
|
label: "Domain",
|
|
1915
2039
|
get children() {
|
|
1916
2040
|
return e.entity.domain;
|
|
1917
2041
|
}
|
|
1918
|
-
}), null), I(t,
|
|
2042
|
+
}), null), I(t, N(T, {
|
|
1919
2043
|
get when() {
|
|
1920
2044
|
return e.entity.device_class;
|
|
1921
2045
|
},
|
|
1922
|
-
children: (e) =>
|
|
2046
|
+
children: (e) => N(Ze, {
|
|
1923
2047
|
label: "Device class",
|
|
1924
2048
|
get children() {
|
|
1925
2049
|
return e();
|
|
1926
2050
|
}
|
|
1927
2051
|
})
|
|
1928
|
-
}), null), I(t,
|
|
2052
|
+
}), null), I(t, N(T, {
|
|
1929
2053
|
get when() {
|
|
1930
2054
|
return e.entity.area_id;
|
|
1931
2055
|
},
|
|
1932
|
-
children: (e) =>
|
|
2056
|
+
children: (e) => N(Ze, {
|
|
1933
2057
|
label: "Area",
|
|
1934
2058
|
get children() {
|
|
1935
2059
|
return e();
|
|
1936
2060
|
}
|
|
1937
2061
|
})
|
|
1938
|
-
}), null), I(t,
|
|
2062
|
+
}), null), I(t, N(Ze, {
|
|
1939
2063
|
label: "Changed",
|
|
1940
2064
|
get children() {
|
|
1941
|
-
return
|
|
2065
|
+
return ra(e.entity.last_changed);
|
|
1942
2066
|
}
|
|
1943
|
-
}), null), I(t,
|
|
2067
|
+
}), null), I(t, N(Ze, {
|
|
1944
2068
|
label: "Updated",
|
|
1945
2069
|
get children() {
|
|
1946
|
-
return
|
|
2070
|
+
return ra(e.entity.last_updated);
|
|
1947
2071
|
}
|
|
1948
2072
|
}), null), t;
|
|
1949
|
-
})(),
|
|
2073
|
+
})(), N(T, {
|
|
1950
2074
|
get when() {
|
|
1951
|
-
return
|
|
2075
|
+
return na(t()) > 0;
|
|
1952
2076
|
},
|
|
1953
2077
|
get children() {
|
|
1954
|
-
return
|
|
2078
|
+
return N(aa, {
|
|
1955
2079
|
label: "Attributes",
|
|
1956
2080
|
get count() {
|
|
1957
|
-
return
|
|
2081
|
+
return na(t());
|
|
1958
2082
|
},
|
|
1959
2083
|
get value() {
|
|
1960
2084
|
return t();
|
|
@@ -1965,42 +2089,42 @@ function Gi(e) {
|
|
|
1965
2089
|
}
|
|
1966
2090
|
});
|
|
1967
2091
|
}
|
|
1968
|
-
function
|
|
1969
|
-
let t =
|
|
1970
|
-
return
|
|
2092
|
+
function la(e) {
|
|
2093
|
+
let t = D(() => Object.keys(e.data).filter((e) => e !== "widgetConfig" && e !== "entities"));
|
|
2094
|
+
return N(Qe, { get children() {
|
|
1971
2095
|
return [
|
|
1972
|
-
|
|
2096
|
+
N(oa, {
|
|
1973
2097
|
icon: "lucide:sliders-horizontal",
|
|
1974
2098
|
title: "Configuration",
|
|
1975
2099
|
get source() {
|
|
1976
2100
|
return e.data.widgetConfig;
|
|
1977
2101
|
},
|
|
1978
2102
|
get children() {
|
|
1979
|
-
return
|
|
2103
|
+
return N(sa, { get record() {
|
|
1980
2104
|
return e.data.widgetConfig;
|
|
1981
2105
|
} });
|
|
1982
2106
|
}
|
|
1983
2107
|
}),
|
|
1984
|
-
|
|
2108
|
+
N(w, {
|
|
1985
2109
|
get each() {
|
|
1986
2110
|
return e.data.entities;
|
|
1987
2111
|
},
|
|
1988
|
-
children: (e) =>
|
|
2112
|
+
children: (e) => N(ca, { entity: e })
|
|
1989
2113
|
}),
|
|
1990
|
-
|
|
2114
|
+
N(w, {
|
|
1991
2115
|
get each() {
|
|
1992
2116
|
return t();
|
|
1993
2117
|
},
|
|
1994
|
-
children: (t) =>
|
|
2118
|
+
children: (t) => N(oa, {
|
|
1995
2119
|
icon: "lucide:braces",
|
|
1996
2120
|
get title() {
|
|
1997
|
-
return
|
|
2121
|
+
return $i(t);
|
|
1998
2122
|
},
|
|
1999
2123
|
get source() {
|
|
2000
2124
|
return e.data[t];
|
|
2001
2125
|
},
|
|
2002
2126
|
get children() {
|
|
2003
|
-
return
|
|
2127
|
+
return N(ia, { get value() {
|
|
2004
2128
|
return e.data[t];
|
|
2005
2129
|
} });
|
|
2006
2130
|
}
|
|
@@ -2009,51 +2133,51 @@ function Ki(e) {
|
|
|
2009
2133
|
];
|
|
2010
2134
|
} });
|
|
2011
2135
|
}
|
|
2012
|
-
function
|
|
2136
|
+
function ua(e) {
|
|
2013
2137
|
if (typeof e != "object" || !e) return;
|
|
2014
2138
|
let t = e;
|
|
2015
2139
|
return Array.isArray(t.entities) && typeof t.widgetConfig == "object" ? t : void 0;
|
|
2016
2140
|
}
|
|
2017
|
-
function
|
|
2018
|
-
let t =
|
|
2019
|
-
return
|
|
2141
|
+
function da(e) {
|
|
2142
|
+
let t = D(() => ua(e.data));
|
|
2143
|
+
return N(T, {
|
|
2020
2144
|
get when() {
|
|
2021
2145
|
return e.data !== void 0;
|
|
2022
2146
|
},
|
|
2023
2147
|
get fallback() {
|
|
2024
|
-
return
|
|
2025
|
-
return
|
|
2026
|
-
return [
|
|
2148
|
+
return N(qe, { get children() {
|
|
2149
|
+
return N(Ye, { get children() {
|
|
2150
|
+
return [N(Xe, { children: "Nothing to inspect" }), N(Je, { children: "This widget publishes no debug information." })];
|
|
2027
2151
|
} });
|
|
2028
2152
|
} });
|
|
2029
2153
|
},
|
|
2030
2154
|
get children() {
|
|
2031
|
-
return
|
|
2155
|
+
return N(T, {
|
|
2032
2156
|
get when() {
|
|
2033
2157
|
return t();
|
|
2034
2158
|
},
|
|
2035
2159
|
get fallback() {
|
|
2036
|
-
return
|
|
2160
|
+
return N(oa, {
|
|
2037
2161
|
icon: "lucide:braces",
|
|
2038
2162
|
title: "Debug data",
|
|
2039
2163
|
get source() {
|
|
2040
2164
|
return e.data;
|
|
2041
2165
|
},
|
|
2042
2166
|
get children() {
|
|
2043
|
-
return
|
|
2167
|
+
return N(T, {
|
|
2044
2168
|
get when() {
|
|
2045
2169
|
return typeof e.data == "string";
|
|
2046
2170
|
},
|
|
2047
2171
|
get fallback() {
|
|
2048
|
-
return
|
|
2172
|
+
return N(ia, { get value() {
|
|
2049
2173
|
return e.data;
|
|
2050
2174
|
} });
|
|
2051
2175
|
},
|
|
2052
2176
|
get children() {
|
|
2053
|
-
return
|
|
2177
|
+
return N(St, {
|
|
2054
2178
|
class: "overflow-hidden p-0",
|
|
2055
2179
|
get children() {
|
|
2056
|
-
var t =
|
|
2180
|
+
var t = qi();
|
|
2057
2181
|
return I(t, () => e.data), t;
|
|
2058
2182
|
}
|
|
2059
2183
|
});
|
|
@@ -2062,7 +2186,7 @@ function Ji(e) {
|
|
|
2062
2186
|
}
|
|
2063
2187
|
});
|
|
2064
2188
|
},
|
|
2065
|
-
children: (e) =>
|
|
2189
|
+
children: (e) => N(la, { get data() {
|
|
2066
2190
|
return e();
|
|
2067
2191
|
} })
|
|
2068
2192
|
});
|
|
@@ -2071,21 +2195,21 @@ function Ji(e) {
|
|
|
2071
2195
|
}
|
|
2072
2196
|
//#endregion
|
|
2073
2197
|
//#region src/framework/dialogs/validate-config.ts
|
|
2074
|
-
function
|
|
2198
|
+
function fa(e) {
|
|
2075
2199
|
let t = "";
|
|
2076
2200
|
for (let n of e) t += typeof n == "number" ? `[${n}]` : t ? `.${String(n)}` : String(n);
|
|
2077
2201
|
return t;
|
|
2078
2202
|
}
|
|
2079
|
-
function
|
|
2203
|
+
function pa(e, t) {
|
|
2080
2204
|
let n = e.safeParse(t);
|
|
2081
2205
|
return n.success ? null : n.error.issues.map((e) => {
|
|
2082
|
-
let t =
|
|
2206
|
+
let t = fa(e.path);
|
|
2083
2207
|
return t ? `${t}: ${e.message}` : e.message;
|
|
2084
2208
|
});
|
|
2085
2209
|
}
|
|
2086
2210
|
//#endregion
|
|
2087
2211
|
//#region src/framework/dialogs/WidgetDialog.tsx
|
|
2088
|
-
var
|
|
2212
|
+
var ma = /*#__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\">"), ha = /*#__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"), ga = /*#__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>"), _a = /*#__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\">"), va = /*#__PURE__*/ B("<div class=glasshome-sheet>"), ya = /*#__PURE__*/ B("<div class=glasshome-sheet-band aria-hidden=true><img alt>"), ba = /*#__PURE__*/ B("<span class=\"glasshome-widget-icon glass glass-tint glasshome-sheet-icon\">"), xa = /*#__PURE__*/ B("<span class=\"inline-flex size-3.5 shrink-0 items-center\">"), Sa = (e) => sn(e), Ca = {
|
|
2089
2213
|
sm: "sm",
|
|
2090
2214
|
md: "md",
|
|
2091
2215
|
lg: "lg",
|
|
@@ -2094,33 +2218,33 @@ var Zi = /*#__PURE__*/ V("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 f
|
|
|
2094
2218
|
"2xl": "xl",
|
|
2095
2219
|
"3xl": "xl",
|
|
2096
2220
|
"4xl": "full"
|
|
2097
|
-
},
|
|
2221
|
+
}, wa = {
|
|
2098
2222
|
idle: "Copy all",
|
|
2099
2223
|
copied: "Copied",
|
|
2100
2224
|
failed: "Copy failed"
|
|
2101
2225
|
};
|
|
2102
|
-
function
|
|
2103
|
-
let [t] =
|
|
2104
|
-
|
|
2226
|
+
function Ta(e) {
|
|
2227
|
+
let [t] = be(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] = O({}), [a, o] = O(null), [s, c] = O([]);
|
|
2228
|
+
E(ve(() => t.config, (e) => {
|
|
2105
2229
|
e && i({ ...e });
|
|
2106
|
-
})),
|
|
2107
|
-
e && o(
|
|
2230
|
+
})), E(ve(() => t.configSchema, (e) => {
|
|
2231
|
+
e && o(Sa(e));
|
|
2108
2232
|
}));
|
|
2109
2233
|
let l = () => n() && JSON.stringify(r()) !== JSON.stringify(t.config), u = (e) => {
|
|
2110
2234
|
!e && t.config && (i({ ...t.config }), c([])), t.onOpenChange(e);
|
|
2111
2235
|
}, d = () => {
|
|
2112
2236
|
let e = t.configSchema;
|
|
2113
2237
|
if (e) {
|
|
2114
|
-
let t =
|
|
2238
|
+
let t = pa(e, r());
|
|
2115
2239
|
if (t) {
|
|
2116
2240
|
c(t);
|
|
2117
2241
|
return;
|
|
2118
2242
|
}
|
|
2119
2243
|
}
|
|
2120
2244
|
c([]), t.onConfigSave?.(r());
|
|
2121
|
-
}, [f, p] =
|
|
2245
|
+
}, [f, p] = O(t.defaultTab ?? "controls"), m = () => t.activeTab ?? f(), h = (e) => {
|
|
2122
2246
|
t.onActiveTabChange ? t.onActiveTabChange(e) : p(e);
|
|
2123
|
-
}, g = () =>
|
|
2247
|
+
}, g = () => Ca[t.maxWidth ?? "xl"], _ = () => {
|
|
2124
2248
|
if (t.tabs) return t.tabs.map((e) => ({
|
|
2125
2249
|
...e,
|
|
2126
2250
|
icon: () => e.icon,
|
|
@@ -2130,10 +2254,10 @@ function ca(e) {
|
|
|
2130
2254
|
return e.push({
|
|
2131
2255
|
id: "edit",
|
|
2132
2256
|
label: "Edit",
|
|
2133
|
-
icon: () =>
|
|
2257
|
+
icon: () => ma(),
|
|
2134
2258
|
content: () => t.editContent ?? (() => {
|
|
2135
2259
|
let e = t.SchemaForm, o = n() ? a() : void 0;
|
|
2136
|
-
return !o || !e ?
|
|
2260
|
+
return !o || !e ? ha() : N(e, {
|
|
2137
2261
|
schema: o,
|
|
2138
2262
|
get data() {
|
|
2139
2263
|
return r();
|
|
@@ -2147,57 +2271,57 @@ function ca(e) {
|
|
|
2147
2271
|
}), e.push({
|
|
2148
2272
|
id: "controls",
|
|
2149
2273
|
label: "Controls",
|
|
2150
|
-
icon: () =>
|
|
2151
|
-
content: () => t.controlsContent ??
|
|
2152
|
-
return
|
|
2153
|
-
return [
|
|
2274
|
+
icon: () => ga(),
|
|
2275
|
+
content: () => t.controlsContent ?? N(qe, { get children() {
|
|
2276
|
+
return N(Ye, { get children() {
|
|
2277
|
+
return [N(Xe, { children: "No controls" }), N(Je, { children: "This widget is shown as is." })];
|
|
2154
2278
|
} });
|
|
2155
2279
|
} })
|
|
2156
2280
|
}), e.push({
|
|
2157
2281
|
id: "debug",
|
|
2158
2282
|
label: "Debug",
|
|
2159
|
-
icon: () =>
|
|
2160
|
-
content: () => t.debugContent ??
|
|
2283
|
+
icon: () => _a(),
|
|
2284
|
+
content: () => t.debugContent ?? N(da, { get data() {
|
|
2161
2285
|
return t.debugData;
|
|
2162
2286
|
} })
|
|
2163
2287
|
}), e;
|
|
2164
|
-
}, v =
|
|
2165
|
-
|
|
2288
|
+
}, v = A(H), y = Sn(v);
|
|
2289
|
+
E(() => y?.setHasSheet(t.sheet !== void 0)), k(() => y?.setHasSheet(!1));
|
|
2166
2290
|
let b = () => ({
|
|
2167
2291
|
icon: t.tile?.icon ?? y?.icon(),
|
|
2168
2292
|
tone: t.tile?.tone ?? y?.accent() ?? y?.tone(),
|
|
2169
2293
|
backdrop: t.tile?.backdrop
|
|
2170
|
-
}), x = () => v?.developer?.() ?? !1, S = () =>
|
|
2294
|
+
}), x = () => v?.developer?.() ?? !1, S = () => P() === "controls" && t.sheet !== void 0, ee = Ea(), te = () => v?.anchor?.(), ne = () => S() && !ee() && te() !== void 0, C = rn(), re = () => {
|
|
2171
2295
|
if (t.debugData === void 0) return;
|
|
2172
2296
|
let e = typeof t.debugData == "string" ? t.debugData : JSON.stringify(t.debugData, null, 2);
|
|
2173
|
-
|
|
2174
|
-
},
|
|
2297
|
+
C.copy(e);
|
|
2298
|
+
}, ie = t.ResponsiveDialog, ae = t.ResponsiveDialogContent, oe = t.ResponsiveDialogHeader, se = t.ResponsiveDialogTitle, ce = t.ResponsiveDialogDescription, le = t.ResponsiveDialogBody ?? ut, ue = t.ResponsiveDialogFooter ?? ht, de = t.Tabs ?? Nt, fe = t.TabsList ?? Lt, pe = t.TabsTrigger ?? zt, me = t.TabsContent ?? Ft, he = t.Button, ge = D(ve([
|
|
2175
2299
|
() => t.open,
|
|
2176
2300
|
a,
|
|
2177
2301
|
() => t.config,
|
|
2178
2302
|
() => t.tabs
|
|
2179
|
-
], () => _())),
|
|
2180
|
-
let e =
|
|
2303
|
+
], () => _())), _e = (e) => n() ? u(e) : t.onOpenChange(e), ye = () => n() ? l() : t.hasUnsavedChanges, xe = () => n() ? d : t.onSave, j = () => ge().filter((e) => e.id !== "debug" || x()), M = () => j().filter((e) => e.id !== "controls" || t.sheet === void 0), P = () => {
|
|
2304
|
+
let e = j(), n = m() === "controls" && t.sheet === void 0 && !("controlsContent" in t) && !t.tabs ? "edit" : m();
|
|
2181
2305
|
return e.some((e) => e.id === n) ? n : e[0]?.id ?? n;
|
|
2182
|
-
},
|
|
2183
|
-
return
|
|
2306
|
+
}, Se = () => P() === "edit" && (xe() || t.onDelete) || P() === "debug" && t.debugData !== void 0;
|
|
2307
|
+
return N(ie, {
|
|
2184
2308
|
get open() {
|
|
2185
2309
|
return t.open;
|
|
2186
2310
|
},
|
|
2187
|
-
onOpenChange: (e) =>
|
|
2311
|
+
onOpenChange: (e) => _e(e),
|
|
2188
2312
|
get children() {
|
|
2189
|
-
return
|
|
2313
|
+
return N(T, {
|
|
2190
2314
|
get when() {
|
|
2191
2315
|
return !S();
|
|
2192
2316
|
},
|
|
2193
2317
|
get fallback() {
|
|
2194
|
-
return
|
|
2318
|
+
return N(ae, {
|
|
2195
2319
|
size: "sm",
|
|
2196
2320
|
get ariaLabel() {
|
|
2197
2321
|
return t.title;
|
|
2198
2322
|
},
|
|
2199
2323
|
get anchor() {
|
|
2200
|
-
return L(() => !!
|
|
2324
|
+
return L(() => !!ne())() ? te() : void 0;
|
|
2201
2325
|
},
|
|
2202
2326
|
class: "glasshome-sheet-surface",
|
|
2203
2327
|
get style() {
|
|
@@ -2208,25 +2332,25 @@ function ca(e) {
|
|
|
2208
2332
|
},
|
|
2209
2333
|
get children() {
|
|
2210
2334
|
return [
|
|
2211
|
-
|
|
2335
|
+
N(T, {
|
|
2212
2336
|
get when() {
|
|
2213
2337
|
return b().backdrop;
|
|
2214
2338
|
},
|
|
2215
2339
|
children: (e) => (() => {
|
|
2216
|
-
var t =
|
|
2340
|
+
var t = ya(), n = t.firstChild;
|
|
2217
2341
|
return F(() => R(n, "src", e())), t;
|
|
2218
2342
|
})()
|
|
2219
2343
|
}),
|
|
2220
|
-
|
|
2344
|
+
N(oe, {
|
|
2221
2345
|
class: "items-center",
|
|
2222
2346
|
get media() {
|
|
2223
|
-
return
|
|
2347
|
+
return N(T, {
|
|
2224
2348
|
get when() {
|
|
2225
2349
|
return b().icon;
|
|
2226
2350
|
},
|
|
2227
2351
|
children: (e) => (() => {
|
|
2228
|
-
var t =
|
|
2229
|
-
return I(t,
|
|
2352
|
+
var t = ba();
|
|
2353
|
+
return I(t, N(V, {
|
|
2230
2354
|
get icon() {
|
|
2231
2355
|
return e();
|
|
2232
2356
|
},
|
|
@@ -2236,7 +2360,7 @@ function ca(e) {
|
|
|
2236
2360
|
});
|
|
2237
2361
|
},
|
|
2238
2362
|
get children() {
|
|
2239
|
-
return
|
|
2363
|
+
return N(se, {
|
|
2240
2364
|
class: "truncate",
|
|
2241
2365
|
get children() {
|
|
2242
2366
|
return t.title;
|
|
@@ -2244,8 +2368,8 @@ function ca(e) {
|
|
|
2244
2368
|
});
|
|
2245
2369
|
}
|
|
2246
2370
|
}),
|
|
2247
|
-
|
|
2248
|
-
var e =
|
|
2371
|
+
N(le, { get children() {
|
|
2372
|
+
var e = va();
|
|
2249
2373
|
return I(e, () => t.sheet?.()), e;
|
|
2250
2374
|
} })
|
|
2251
2375
|
];
|
|
@@ -2253,7 +2377,7 @@ function ca(e) {
|
|
|
2253
2377
|
});
|
|
2254
2378
|
},
|
|
2255
2379
|
get children() {
|
|
2256
|
-
return
|
|
2380
|
+
return N(ae, {
|
|
2257
2381
|
get size() {
|
|
2258
2382
|
return g();
|
|
2259
2383
|
},
|
|
@@ -2261,36 +2385,36 @@ function ca(e) {
|
|
|
2261
2385
|
return t.class;
|
|
2262
2386
|
},
|
|
2263
2387
|
get children() {
|
|
2264
|
-
return
|
|
2388
|
+
return N(de, {
|
|
2265
2389
|
get value() {
|
|
2266
|
-
return
|
|
2390
|
+
return P();
|
|
2267
2391
|
},
|
|
2268
2392
|
onChange: h,
|
|
2269
2393
|
layout: "split",
|
|
2270
2394
|
get children() {
|
|
2271
2395
|
return [
|
|
2272
|
-
|
|
2396
|
+
N(oe, {
|
|
2273
2397
|
class: "flex-wrap",
|
|
2274
2398
|
get action() {
|
|
2275
|
-
return [
|
|
2399
|
+
return [N(T, {
|
|
2276
2400
|
get when() {
|
|
2277
2401
|
return x() || t.tabs !== void 0;
|
|
2278
2402
|
},
|
|
2279
2403
|
get children() {
|
|
2280
|
-
return
|
|
2404
|
+
return N(fe, {
|
|
2281
2405
|
class: "w-auto",
|
|
2282
2406
|
get children() {
|
|
2283
|
-
return
|
|
2407
|
+
return N(w, {
|
|
2284
2408
|
get each() {
|
|
2285
|
-
return
|
|
2409
|
+
return M();
|
|
2286
2410
|
},
|
|
2287
|
-
children: (e) =>
|
|
2411
|
+
children: (e) => N(pe, {
|
|
2288
2412
|
get value() {
|
|
2289
2413
|
return e.id;
|
|
2290
2414
|
},
|
|
2291
2415
|
get children() {
|
|
2292
2416
|
return [(() => {
|
|
2293
|
-
var t =
|
|
2417
|
+
var t = xa();
|
|
2294
2418
|
return I(t, () => e.icon()), t;
|
|
2295
2419
|
})(), L(() => e.label)];
|
|
2296
2420
|
}
|
|
@@ -2302,29 +2426,29 @@ function ca(e) {
|
|
|
2302
2426
|
}), L(() => t.headerActions)];
|
|
2303
2427
|
},
|
|
2304
2428
|
get children() {
|
|
2305
|
-
return [
|
|
2429
|
+
return [N(se, {
|
|
2306
2430
|
class: "truncate",
|
|
2307
2431
|
get children() {
|
|
2308
2432
|
return t.title;
|
|
2309
2433
|
}
|
|
2310
|
-
}),
|
|
2434
|
+
}), N(T, {
|
|
2311
2435
|
get when() {
|
|
2312
2436
|
return t.description;
|
|
2313
2437
|
},
|
|
2314
2438
|
get children() {
|
|
2315
|
-
return
|
|
2439
|
+
return N(ce, { get children() {
|
|
2316
2440
|
return t.description;
|
|
2317
2441
|
} });
|
|
2318
2442
|
}
|
|
2319
2443
|
})];
|
|
2320
2444
|
}
|
|
2321
2445
|
}),
|
|
2322
|
-
|
|
2323
|
-
return
|
|
2446
|
+
N(le, { get children() {
|
|
2447
|
+
return N(w, {
|
|
2324
2448
|
get each() {
|
|
2325
|
-
return
|
|
2449
|
+
return j();
|
|
2326
2450
|
},
|
|
2327
|
-
children: (e) =>
|
|
2451
|
+
children: (e) => N(me, {
|
|
2328
2452
|
get value() {
|
|
2329
2453
|
return e.id;
|
|
2330
2454
|
},
|
|
@@ -2334,19 +2458,19 @@ function ca(e) {
|
|
|
2334
2458
|
})
|
|
2335
2459
|
});
|
|
2336
2460
|
} }),
|
|
2337
|
-
|
|
2461
|
+
N(T, {
|
|
2338
2462
|
get when() {
|
|
2339
|
-
return
|
|
2463
|
+
return Se();
|
|
2340
2464
|
},
|
|
2341
2465
|
get children() {
|
|
2342
|
-
return
|
|
2466
|
+
return N(ue, { get children() {
|
|
2343
2467
|
return [
|
|
2344
|
-
|
|
2468
|
+
N(T, {
|
|
2345
2469
|
get when() {
|
|
2346
|
-
return L(() =>
|
|
2470
|
+
return L(() => P() === "edit")() && t.onDelete;
|
|
2347
2471
|
},
|
|
2348
2472
|
get children() {
|
|
2349
|
-
return
|
|
2473
|
+
return N(he, {
|
|
2350
2474
|
size: "sm",
|
|
2351
2475
|
variant: "destructive",
|
|
2352
2476
|
onClick: () => t.onDelete?.(),
|
|
@@ -2354,32 +2478,32 @@ function ca(e) {
|
|
|
2354
2478
|
});
|
|
2355
2479
|
}
|
|
2356
2480
|
}),
|
|
2357
|
-
|
|
2481
|
+
N(T, {
|
|
2358
2482
|
get when() {
|
|
2359
|
-
return L(() =>
|
|
2483
|
+
return L(() => P() === "edit")() && xe();
|
|
2360
2484
|
},
|
|
2361
2485
|
get children() {
|
|
2362
|
-
return
|
|
2486
|
+
return N(he, {
|
|
2363
2487
|
size: "sm",
|
|
2364
2488
|
get disabled() {
|
|
2365
|
-
return !
|
|
2489
|
+
return !ye();
|
|
2366
2490
|
},
|
|
2367
|
-
onClick: () =>
|
|
2491
|
+
onClick: () => xe()?.(),
|
|
2368
2492
|
children: "Save"
|
|
2369
2493
|
});
|
|
2370
2494
|
}
|
|
2371
2495
|
}),
|
|
2372
|
-
|
|
2496
|
+
N(T, {
|
|
2373
2497
|
get when() {
|
|
2374
|
-
return L(() =>
|
|
2498
|
+
return L(() => P() === "debug")() && t.debugData !== void 0;
|
|
2375
2499
|
},
|
|
2376
2500
|
get children() {
|
|
2377
|
-
return
|
|
2501
|
+
return N(he, {
|
|
2378
2502
|
size: "sm",
|
|
2379
2503
|
variant: "outline",
|
|
2380
|
-
onClick:
|
|
2504
|
+
onClick: re,
|
|
2381
2505
|
get children() {
|
|
2382
|
-
return
|
|
2506
|
+
return wa[C.state()];
|
|
2383
2507
|
}
|
|
2384
2508
|
});
|
|
2385
2509
|
}
|
|
@@ -2398,86 +2522,192 @@ function ca(e) {
|
|
|
2398
2522
|
}
|
|
2399
2523
|
});
|
|
2400
2524
|
}
|
|
2401
|
-
function
|
|
2402
|
-
let e = "(max-width: 639px)", [t, n] =
|
|
2403
|
-
return
|
|
2525
|
+
function Ea() {
|
|
2526
|
+
let e = "(max-width: 639px)", [t, n] = O(typeof window < "u" && window.matchMedia(e).matches);
|
|
2527
|
+
return ye(() => {
|
|
2404
2528
|
let t = window.matchMedia(e), r = () => n(t.matches);
|
|
2405
|
-
t.addEventListener("change", r),
|
|
2529
|
+
t.addEventListener("change", r), k(() => t.removeEventListener("change", r));
|
|
2406
2530
|
}), t;
|
|
2407
2531
|
}
|
|
2408
2532
|
//#endregion
|
|
2533
|
+
//#region node_modules/@glasshome/widget-contract/dist/state.mjs
|
|
2534
|
+
var Da = {
|
|
2535
|
+
keyChars: 64,
|
|
2536
|
+
valueBytes: 8192,
|
|
2537
|
+
maxDepth: 8,
|
|
2538
|
+
keys: 32,
|
|
2539
|
+
instanceBytes: 65536,
|
|
2540
|
+
memberBytes: 131072,
|
|
2541
|
+
sendsPerMinute: 30,
|
|
2542
|
+
memberWritesPerMinute: 240,
|
|
2543
|
+
coalesceMs: 500
|
|
2544
|
+
}, Oa = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/, ka = new TextEncoder(), Aa = (e) => ka.encode(e).length;
|
|
2545
|
+
function ja(e, t) {
|
|
2546
|
+
return typeof e != "object" || !e || t !== 0 && (Array.isArray(e) ? e : Object.values(e)).every((e) => ja(e, t - 1));
|
|
2547
|
+
}
|
|
2548
|
+
function Ma(e) {
|
|
2549
|
+
if (Aa(e) > Da.valueBytes) return !1;
|
|
2550
|
+
let t;
|
|
2551
|
+
try {
|
|
2552
|
+
t = JSON.parse(e);
|
|
2553
|
+
} catch {
|
|
2554
|
+
return !1;
|
|
2555
|
+
}
|
|
2556
|
+
return ja(t, Da.maxDepth);
|
|
2557
|
+
}
|
|
2558
|
+
o.string().regex(Oa), o.string().refine(Ma, "JSON text within the widget state value limits");
|
|
2559
|
+
function Na(e) {
|
|
2560
|
+
let t = 0;
|
|
2561
|
+
for (let [n, r] of Object.entries(e)) t += Aa(n) + Aa(r);
|
|
2562
|
+
return t;
|
|
2563
|
+
}
|
|
2564
|
+
function Pa(e, t, n) {
|
|
2565
|
+
return Oa.test(t) ? n === null ? "ok" : Ma(n) ? !Object.hasOwn(e, t) && Object.keys(e).length >= Da.keys ? "keys" : Na({
|
|
2566
|
+
...e,
|
|
2567
|
+
[t]: n
|
|
2568
|
+
}) > Da.instanceBytes ? "instance" : "ok" : "value" : "key";
|
|
2569
|
+
}
|
|
2570
|
+
function Fa(e = {}) {
|
|
2571
|
+
let t = { ...e };
|
|
2572
|
+
return {
|
|
2573
|
+
snapshot: () => ({ ...t }),
|
|
2574
|
+
write(e, n) {
|
|
2575
|
+
let r = Pa(t, e, n);
|
|
2576
|
+
return r === "ok" && (n === null ? delete t[e] : t[e] = n), r;
|
|
2577
|
+
}
|
|
2578
|
+
};
|
|
2579
|
+
}
|
|
2580
|
+
//#endregion
|
|
2581
|
+
//#region src/framework/hooks/use-widget-state.ts
|
|
2582
|
+
function Ia(e) {
|
|
2583
|
+
if (e === void 0) return null;
|
|
2584
|
+
try {
|
|
2585
|
+
return JSON.stringify(e);
|
|
2586
|
+
} catch {
|
|
2587
|
+
return;
|
|
2588
|
+
}
|
|
2589
|
+
}
|
|
2590
|
+
function La(e) {
|
|
2591
|
+
if (e !== void 0) try {
|
|
2592
|
+
return JSON.parse(e);
|
|
2593
|
+
} catch {
|
|
2594
|
+
return;
|
|
2595
|
+
}
|
|
2596
|
+
}
|
|
2597
|
+
function Ra() {
|
|
2598
|
+
let e = Fa(), t = /* @__PURE__ */ new Map(), n = (n) => {
|
|
2599
|
+
let r = t.get(n);
|
|
2600
|
+
return r || (r = O(e.snapshot()[n]), t.set(n, r)), r;
|
|
2601
|
+
};
|
|
2602
|
+
return {
|
|
2603
|
+
read: (e) => La(n(e)[0]()),
|
|
2604
|
+
write(t, r) {
|
|
2605
|
+
let i = Ia(r);
|
|
2606
|
+
if (i === void 0) return "value";
|
|
2607
|
+
let a = e.write(t, i);
|
|
2608
|
+
return a === "ok" && n(t)[1](i ?? void 0), a;
|
|
2609
|
+
}
|
|
2610
|
+
};
|
|
2611
|
+
}
|
|
2612
|
+
var za = /* @__PURE__ */ new WeakMap(), Ba = (e) => e[bn];
|
|
2613
|
+
function Va(e) {
|
|
2614
|
+
let t = e, n = Ba(t);
|
|
2615
|
+
for (; n;) t = n, n = Ba(t);
|
|
2616
|
+
return t;
|
|
2617
|
+
}
|
|
2618
|
+
function Ha(e) {
|
|
2619
|
+
if (e.state) return e.state;
|
|
2620
|
+
let t = Va(e), n = za.get(t);
|
|
2621
|
+
return n || (n = Ra(), za.set(t, n)), n;
|
|
2622
|
+
}
|
|
2623
|
+
function Ua(e, t) {
|
|
2624
|
+
if (t === void 0) return !0;
|
|
2625
|
+
let n = Ia(t);
|
|
2626
|
+
return typeof n == "string" && e.safeParse(JSON.parse(n)).success;
|
|
2627
|
+
}
|
|
2628
|
+
function Wa(e, t, n) {
|
|
2629
|
+
let r = Ha(un()), i = D(() => {
|
|
2630
|
+
let i = t.safeParse(r.read(e));
|
|
2631
|
+
return i.success ? i.data : n;
|
|
2632
|
+
});
|
|
2633
|
+
return [i, (n) => {
|
|
2634
|
+
let a = typeof n == "function" ? n(xe(i)) : n;
|
|
2635
|
+
return Ua(t, a) ? r.write(e, a) : "value";
|
|
2636
|
+
}];
|
|
2637
|
+
}
|
|
2638
|
+
//#endregion
|
|
2409
2639
|
//#region src/framework/hooks/use-widget-dashboard.ts
|
|
2410
|
-
var
|
|
2640
|
+
var Ga = {
|
|
2411
2641
|
name: "",
|
|
2412
2642
|
icon: "",
|
|
2413
2643
|
areaId: null
|
|
2414
2644
|
};
|
|
2415
|
-
function
|
|
2416
|
-
let e =
|
|
2417
|
-
return () => e?.dashboard?.() ??
|
|
2645
|
+
function Ka() {
|
|
2646
|
+
let e = A(H);
|
|
2647
|
+
return () => e?.dashboard?.() ?? Ga;
|
|
2418
2648
|
}
|
|
2419
2649
|
//#endregion
|
|
2420
2650
|
//#region src/framework/hooks/use-widget-viewer.ts
|
|
2421
|
-
var
|
|
2422
|
-
function
|
|
2423
|
-
let e =
|
|
2424
|
-
return () => e?.viewer?.() ??
|
|
2651
|
+
var qa = { name: null };
|
|
2652
|
+
function Ja() {
|
|
2653
|
+
let e = A(H);
|
|
2654
|
+
return () => e?.viewer?.() ?? qa;
|
|
2425
2655
|
}
|
|
2426
2656
|
//#endregion
|
|
2427
2657
|
//#region node_modules/@glasshome/ui/dist/tokens/index.js
|
|
2428
|
-
var
|
|
2429
|
-
function
|
|
2658
|
+
var Ya = /^oklch\(\s*([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s+([+-]?(?:\d+\.?\d*|\.\d+))\s*\)$/i;
|
|
2659
|
+
function Xa(e, t, n) {
|
|
2430
2660
|
return Math.min(Math.max(e, t), n);
|
|
2431
2661
|
}
|
|
2432
|
-
function
|
|
2662
|
+
function Za(e) {
|
|
2433
2663
|
return String(Number.isInteger(e) ? e : Number(e.toFixed(6)));
|
|
2434
2664
|
}
|
|
2435
|
-
function
|
|
2436
|
-
let t =
|
|
2665
|
+
function Qa(e) {
|
|
2666
|
+
let t = Ya.exec(e.trim());
|
|
2437
2667
|
return t ? {
|
|
2438
2668
|
l: Number(t[1]),
|
|
2439
2669
|
c: Number(t[2]),
|
|
2440
2670
|
h: Number(t[3])
|
|
2441
2671
|
} : null;
|
|
2442
2672
|
}
|
|
2443
|
-
function
|
|
2444
|
-
return `oklch(${
|
|
2673
|
+
function $a(e, t, n) {
|
|
2674
|
+
return `oklch(${Za(e)} ${Za(t)} ${Za(n)})`;
|
|
2445
2675
|
}
|
|
2446
|
-
function
|
|
2447
|
-
let n =
|
|
2448
|
-
return n ?
|
|
2676
|
+
function eo(e, t) {
|
|
2677
|
+
let n = Qa(e);
|
|
2678
|
+
return n ? $a(Xa(n.l + t, 0, 1), n.c, n.h) : e;
|
|
2449
2679
|
}
|
|
2450
|
-
function
|
|
2451
|
-
let n =
|
|
2452
|
-
return n ?
|
|
2680
|
+
function to(e, t) {
|
|
2681
|
+
let n = Qa(e);
|
|
2682
|
+
return n ? $a(Xa(t, 0, 1), Xa(n.c * .8, 0, .4), n.h) : e;
|
|
2453
2683
|
}
|
|
2454
|
-
function
|
|
2684
|
+
function no(e, t) {
|
|
2455
2685
|
return {
|
|
2456
2686
|
...e,
|
|
2457
2687
|
popover: e.card,
|
|
2458
|
-
muted: t === "light" ?
|
|
2688
|
+
muted: t === "light" ? eo(e.background, -.015) : eo(e.background, .1),
|
|
2459
2689
|
mutedForeground: t === "light" ? "oklch(0.44 0 0)" : "oklch(0.71 0 0)",
|
|
2460
|
-
input: t === "light" ?
|
|
2690
|
+
input: t === "light" ? eo(e.border, .01) : eo(e.border, .04),
|
|
2461
2691
|
ring: e.accent,
|
|
2462
2692
|
destructive: t === "light" ? "oklch(0.54 0.19 23.0704)" : "oklch(0.7106 0.1661 22.2162)"
|
|
2463
2693
|
};
|
|
2464
2694
|
}
|
|
2465
|
-
function
|
|
2466
|
-
return
|
|
2467
|
-
primary:
|
|
2468
|
-
accent:
|
|
2469
|
-
secondary:
|
|
2470
|
-
border:
|
|
2471
|
-
card:
|
|
2472
|
-
background:
|
|
2695
|
+
function ro(e) {
|
|
2696
|
+
return no({
|
|
2697
|
+
primary: eo(e.primary, .15),
|
|
2698
|
+
accent: eo(e.accent, .1),
|
|
2699
|
+
secondary: to(e.secondary, .14),
|
|
2700
|
+
border: to(e.border, .26),
|
|
2701
|
+
card: to(e.card, .17),
|
|
2702
|
+
background: to(e.background, .12)
|
|
2473
2703
|
}, "dark");
|
|
2474
2704
|
}
|
|
2475
|
-
var
|
|
2705
|
+
var io = {
|
|
2476
2706
|
edgeWidth: 1,
|
|
2477
2707
|
edgeInk: 0,
|
|
2478
2708
|
edgeAccent: 0,
|
|
2479
2709
|
inkLift: 0
|
|
2480
|
-
},
|
|
2710
|
+
}, ao = {
|
|
2481
2711
|
frosted: {
|
|
2482
2712
|
blur: 24,
|
|
2483
2713
|
clarity: 60,
|
|
@@ -2485,7 +2715,7 @@ var Ca = {
|
|
|
2485
2715
|
tint: 1,
|
|
2486
2716
|
glow: 0,
|
|
2487
2717
|
ink: 0,
|
|
2488
|
-
...
|
|
2718
|
+
...io
|
|
2489
2719
|
},
|
|
2490
2720
|
frost: {
|
|
2491
2721
|
blur: 24,
|
|
@@ -2494,7 +2724,7 @@ var Ca = {
|
|
|
2494
2724
|
tint: 1,
|
|
2495
2725
|
glow: 0,
|
|
2496
2726
|
ink: 0,
|
|
2497
|
-
...
|
|
2727
|
+
...io,
|
|
2498
2728
|
grain: .4
|
|
2499
2729
|
},
|
|
2500
2730
|
paper: {
|
|
@@ -2504,7 +2734,7 @@ var Ca = {
|
|
|
2504
2734
|
tint: .85,
|
|
2505
2735
|
glow: 0,
|
|
2506
2736
|
ink: 0,
|
|
2507
|
-
...
|
|
2737
|
+
...io,
|
|
2508
2738
|
edgeInk: .3,
|
|
2509
2739
|
sheen: 0,
|
|
2510
2740
|
edge: .2,
|
|
@@ -2534,13 +2764,13 @@ var Ca = {
|
|
|
2534
2764
|
tint: .7,
|
|
2535
2765
|
glow: 0,
|
|
2536
2766
|
ink: 1,
|
|
2537
|
-
...
|
|
2767
|
+
...io,
|
|
2538
2768
|
inkLift: 1
|
|
2539
2769
|
}
|
|
2540
|
-
},
|
|
2770
|
+
}, oo = {
|
|
2541
2771
|
v: 1,
|
|
2542
2772
|
preset: "frosted"
|
|
2543
|
-
},
|
|
2773
|
+
}, so = {
|
|
2544
2774
|
blur: [0, 48],
|
|
2545
2775
|
clarity: [0, 100],
|
|
2546
2776
|
depth: [0, 2],
|
|
@@ -2560,7 +2790,7 @@ var Ca = {
|
|
|
2560
2790
|
washAngle: [0, 360],
|
|
2561
2791
|
relief: [0, 2],
|
|
2562
2792
|
fill: [0, .6]
|
|
2563
|
-
},
|
|
2793
|
+
}, co = {
|
|
2564
2794
|
vibrancy: 1,
|
|
2565
2795
|
inset: 0,
|
|
2566
2796
|
lightFrom: 315,
|
|
@@ -2576,10 +2806,10 @@ var Ca = {
|
|
|
2576
2806
|
relief: 1,
|
|
2577
2807
|
accent: "theme",
|
|
2578
2808
|
fill: 0
|
|
2579
|
-
},
|
|
2580
|
-
function
|
|
2581
|
-
let { edgeWidth: t, edgeInk: n, edgeAccent: r, inkLift: i, ...a } =
|
|
2582
|
-
...
|
|
2809
|
+
}, lo = Object.keys(so);
|
|
2810
|
+
function uo(e) {
|
|
2811
|
+
let { edgeWidth: t, edgeInk: n, edgeAccent: r, inkLift: i, ...a } = ao[e.preset], o = {
|
|
2812
|
+
...co,
|
|
2583
2813
|
...a,
|
|
2584
2814
|
...e.dials
|
|
2585
2815
|
}, s = {
|
|
@@ -2588,7 +2818,7 @@ function ka(e) {
|
|
|
2588
2818
|
sheen: o.sheen ?? o.depth,
|
|
2589
2819
|
shadow: o.shadow ?? o.depth
|
|
2590
2820
|
};
|
|
2591
|
-
for (let e of
|
|
2821
|
+
for (let e of lo) s[e] = Xa(s[e], ...so[e]);
|
|
2592
2822
|
return s;
|
|
2593
2823
|
}
|
|
2594
2824
|
function Z(e, t) {
|
|
@@ -2615,8 +2845,8 @@ function Q(e, t, n, r, i, a, o, s) {
|
|
|
2615
2845
|
swatch: r,
|
|
2616
2846
|
material: s,
|
|
2617
2847
|
colors: {
|
|
2618
|
-
light:
|
|
2619
|
-
dark: o ?
|
|
2848
|
+
light: no(i, "light"),
|
|
2849
|
+
dark: o ? no(o, "dark") : ro(i)
|
|
2620
2850
|
},
|
|
2621
2851
|
background: a
|
|
2622
2852
|
};
|
|
@@ -2784,64 +3014,64 @@ Z("glass-house", {
|
|
|
2784
3014
|
});
|
|
2785
3015
|
//#endregion
|
|
2786
3016
|
//#region src/framework/hooks/use-material.ts
|
|
2787
|
-
var
|
|
2788
|
-
id:
|
|
2789
|
-
terms:
|
|
3017
|
+
var fo = {
|
|
3018
|
+
id: oo.preset,
|
|
3019
|
+
terms: uo(oo)
|
|
2790
3020
|
};
|
|
2791
|
-
function
|
|
2792
|
-
let e =
|
|
2793
|
-
return () => e?.material?.() ??
|
|
3021
|
+
function po() {
|
|
3022
|
+
let e = A(H);
|
|
3023
|
+
return () => e?.material?.() ?? fo;
|
|
2794
3024
|
}
|
|
2795
3025
|
//#endregion
|
|
2796
3026
|
//#region src/framework/hooks/use-intersection-pause.ts
|
|
2797
|
-
function
|
|
3027
|
+
function mo(e) {
|
|
2798
3028
|
if (typeof IntersectionObserver > "u") return () => !1;
|
|
2799
|
-
let [t, n] =
|
|
3029
|
+
let [t, n] = O(!1), r = new IntersectionObserver((e) => {
|
|
2800
3030
|
let t = e[0];
|
|
2801
3031
|
t && n(!t.isIntersecting);
|
|
2802
3032
|
});
|
|
2803
|
-
return
|
|
3033
|
+
return E(() => {
|
|
2804
3034
|
let t = e();
|
|
2805
3035
|
r.disconnect(), t && r.observe(t);
|
|
2806
|
-
}),
|
|
3036
|
+
}), k(() => r.disconnect()), t;
|
|
2807
3037
|
}
|
|
2808
3038
|
//#endregion
|
|
2809
3039
|
//#region src/framework/hooks/use-daylight.ts
|
|
2810
|
-
var
|
|
2811
|
-
function
|
|
3040
|
+
var ho = -6, go = 864e5;
|
|
3041
|
+
function _o(e, t) {
|
|
2812
3042
|
let n = e.next_rising ? Date.parse(e.next_rising) : NaN, r = e.next_setting ? Date.parse(e.next_setting) : NaN;
|
|
2813
3043
|
if (!Number.isFinite(n) || !Number.isFinite(r)) return;
|
|
2814
|
-
let [i, a] = e.state === "above_horizon" ? [n -
|
|
3044
|
+
let [i, a] = e.state === "above_horizon" ? [n - go, r] : [r - go, n], o = a - i;
|
|
2815
3045
|
if (!(o <= 0)) return Math.min(1, Math.max(0, (t.getTime() - i) / o));
|
|
2816
3046
|
}
|
|
2817
|
-
var
|
|
2818
|
-
function
|
|
3047
|
+
var vo = 20, yo = 7;
|
|
3048
|
+
function bo(e, t) {
|
|
2819
3049
|
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 >
|
|
3050
|
+
let n = e.elevation, r = e.state === "above_horizon" ? "day" : n !== void 0 && n > ho ? e.rising ? "dawn" : "dusk" : "night";
|
|
2821
3051
|
return {
|
|
2822
3052
|
phase: r,
|
|
2823
3053
|
isNight: r === "night",
|
|
2824
3054
|
elevation: n,
|
|
2825
|
-
progress:
|
|
3055
|
+
progress: _o(e, t)
|
|
2826
3056
|
};
|
|
2827
3057
|
}
|
|
2828
|
-
let n = t.getHours(), r = n >=
|
|
3058
|
+
let n = t.getHours(), r = n >= vo || n < yo ? "night" : "day";
|
|
2829
3059
|
return {
|
|
2830
3060
|
phase: r,
|
|
2831
3061
|
isNight: r === "night"
|
|
2832
3062
|
};
|
|
2833
3063
|
}
|
|
2834
|
-
var [
|
|
2835
|
-
function
|
|
2836
|
-
return
|
|
2837
|
-
|
|
3064
|
+
var [xo, So] = O(/* @__PURE__ */ new Date()), Co = 0, wo;
|
|
3065
|
+
function To() {
|
|
3066
|
+
return Co++, wo ||= (So(/* @__PURE__ */ new Date()), setInterval(() => So(/* @__PURE__ */ new Date()), 6e4)), () => {
|
|
3067
|
+
Co--, Co === 0 && wo && (clearInterval(wo), wo = void 0);
|
|
2838
3068
|
};
|
|
2839
3069
|
}
|
|
2840
|
-
function
|
|
3070
|
+
function Eo() {
|
|
2841
3071
|
let e = te("sun.sun");
|
|
2842
|
-
return
|
|
2843
|
-
e() ||
|
|
2844
|
-
}),
|
|
3072
|
+
return E(() => {
|
|
3073
|
+
e() || k(To());
|
|
3074
|
+
}), D(() => {
|
|
2845
3075
|
let t = e(), n = t ? {
|
|
2846
3076
|
state: t.state,
|
|
2847
3077
|
elevation: t.attributes?.elevation,
|
|
@@ -2849,47 +3079,47 @@ function Wa() {
|
|
|
2849
3079
|
next_rising: t.attributes?.next_rising,
|
|
2850
3080
|
next_setting: t.attributes?.next_setting
|
|
2851
3081
|
} : void 0;
|
|
2852
|
-
return
|
|
3082
|
+
return bo(n, n ? /* @__PURE__ */ new Date() : xo());
|
|
2853
3083
|
});
|
|
2854
3084
|
}
|
|
2855
3085
|
//#endregion
|
|
2856
3086
|
//#region src/theme.ts
|
|
2857
|
-
var
|
|
2858
|
-
function
|
|
3087
|
+
var Do = /* @__PURE__ */ new Map(), Oo;
|
|
3088
|
+
function ko(e) {
|
|
2859
3089
|
let t = new MutationObserver(() => {
|
|
2860
|
-
for (let [t, [, n]] of
|
|
3090
|
+
for (let [t, [, n]] of Do) n(e.classList.contains(t));
|
|
2861
3091
|
});
|
|
2862
3092
|
return t.observe(e, {
|
|
2863
3093
|
attributes: !0,
|
|
2864
3094
|
attributeFilter: ["class"]
|
|
2865
3095
|
}), t;
|
|
2866
3096
|
}
|
|
2867
|
-
function
|
|
3097
|
+
function Ao(e) {
|
|
2868
3098
|
if (typeof document > "u") return !1;
|
|
2869
|
-
let t = document.documentElement, n =
|
|
2870
|
-
return n || (n =
|
|
3099
|
+
let t = document.documentElement, n = Do.get(e);
|
|
3100
|
+
return n || (n = O(t.classList.contains(e)), Do.set(e, n), Oo ??= ko(t)), n[0](), t.classList.contains(e);
|
|
2871
3101
|
}
|
|
2872
|
-
function
|
|
2873
|
-
return
|
|
3102
|
+
function jo() {
|
|
3103
|
+
return Ao("dark");
|
|
2874
3104
|
}
|
|
2875
3105
|
//#endregion
|
|
2876
3106
|
//#region src/framework/hooks/use-reduced-motion.ts
|
|
2877
|
-
function
|
|
3107
|
+
function Mo() {
|
|
2878
3108
|
if (typeof window > "u" || typeof window.matchMedia != "function") return () => !1;
|
|
2879
|
-
let e = window.matchMedia("(prefers-reduced-motion: reduce)"), [t, n] =
|
|
2880
|
-
return e.addEventListener("change", r),
|
|
3109
|
+
let e = window.matchMedia("(prefers-reduced-motion: reduce)"), [t, n] = O(e.matches), r = (e) => n(e.matches);
|
|
3110
|
+
return e.addEventListener("change", r), k(() => e.removeEventListener("change", r)), () => t() || Ao("reduce-motion");
|
|
2881
3111
|
}
|
|
2882
3112
|
//#endregion
|
|
2883
3113
|
//#region src/framework/hooks/use-widget-entity-group.ts
|
|
2884
|
-
function
|
|
2885
|
-
let t = e.minEntities ?? 1, n =
|
|
3114
|
+
function No(e) {
|
|
3115
|
+
let t = e.minEntities ?? 1, n = D(() => e.entities().length), r = D(() => n() >= t), i = D(() => !r() || !e.calculateGroupData ? null : e.calculateGroupData(e.entities())), a = D(() => {
|
|
2886
3116
|
if (!r()) return;
|
|
2887
3117
|
let t = e.aggregationMode?.();
|
|
2888
3118
|
if (!t || t === "none") return;
|
|
2889
3119
|
let n = e.entities();
|
|
2890
|
-
if (t === "light" || t === "binary-sensor" || t === "switch") return
|
|
2891
|
-
if (t === "sensor") return
|
|
2892
|
-
}), o =
|
|
3120
|
+
if (t === "light" || t === "binary-sensor" || t === "switch") return Lr(n, e.allEntitiesMode);
|
|
3121
|
+
if (t === "sensor") return Rr(n, e.sensorGroupType?.() ?? "mean", !0);
|
|
3122
|
+
}), o = D(() => r() ? void 0 : e.emptyStateConfig);
|
|
2893
3123
|
return {
|
|
2894
3124
|
entities: e.entities,
|
|
2895
3125
|
groupData: i,
|
|
@@ -2901,7 +3131,7 @@ function Za(e) {
|
|
|
2901
3131
|
}
|
|
2902
3132
|
//#endregion
|
|
2903
3133
|
//#region src/framework/theming/svg-colors.ts
|
|
2904
|
-
var
|
|
3134
|
+
var Po = {
|
|
2905
3135
|
solar: "oklch(0.74 0.18 60)",
|
|
2906
3136
|
grid: "oklch(0.62 0.12 245)",
|
|
2907
3137
|
battery: "oklch(0.70 0.18 145)",
|
|
@@ -2910,21 +3140,21 @@ var Qa = {
|
|
|
2910
3140
|
positive: "oklch(0.70 0.14 160)",
|
|
2911
3141
|
negative: "oklch(0.64 0.22 27)"
|
|
2912
3142
|
};
|
|
2913
|
-
function
|
|
3143
|
+
function Fo(e) {
|
|
2914
3144
|
return {
|
|
2915
3145
|
fill: `color-mix(in oklch, ${e} 20%, transparent)`,
|
|
2916
3146
|
stroke: e,
|
|
2917
3147
|
solid: e
|
|
2918
3148
|
};
|
|
2919
3149
|
}
|
|
2920
|
-
var
|
|
3150
|
+
var Io = Object.fromEntries(Object.entries(Po).map(([e, t]) => [e, Fo(t)])), Lo = o.enum([
|
|
2921
3151
|
"success",
|
|
2922
3152
|
"warning",
|
|
2923
3153
|
"danger",
|
|
2924
3154
|
"info",
|
|
2925
3155
|
"neutral",
|
|
2926
3156
|
"accent"
|
|
2927
|
-
]),
|
|
3157
|
+
]), Ro = {
|
|
2928
3158
|
title: e(() => o.string().optional().meta({
|
|
2929
3159
|
title: "Title",
|
|
2930
3160
|
description: "Optional display name override"
|
|
@@ -2944,38 +3174,38 @@ var eo = Object.fromEntries(Object.entries(Qa).map(([e, t]) => [e, $a(t)])), to
|
|
|
2944
3174
|
formType: "area-picker",
|
|
2945
3175
|
title: "Area"
|
|
2946
3176
|
}), "widgetFields.areaId")
|
|
2947
|
-
},
|
|
3177
|
+
}, zo = 24;
|
|
2948
3178
|
function $(e) {
|
|
2949
3179
|
let t = {};
|
|
2950
3180
|
for (let [n, r] of Object.entries(e)) r !== void 0 && (t[n] = r);
|
|
2951
3181
|
return t;
|
|
2952
3182
|
}
|
|
2953
|
-
function
|
|
3183
|
+
function Bo() {
|
|
2954
3184
|
return o.string().optional().meta({
|
|
2955
3185
|
title: "Title",
|
|
2956
3186
|
description: "Optional display name override"
|
|
2957
3187
|
});
|
|
2958
3188
|
}
|
|
2959
|
-
function
|
|
3189
|
+
function Vo(e) {
|
|
2960
3190
|
return (e.default === void 0 ? o.string().optional() : o.string().default(e.default)).meta($({
|
|
2961
3191
|
title: e.title,
|
|
2962
3192
|
description: e.description
|
|
2963
3193
|
}));
|
|
2964
3194
|
}
|
|
2965
|
-
function
|
|
3195
|
+
function Ho(e) {
|
|
2966
3196
|
let t = o.number();
|
|
2967
3197
|
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
3198
|
title: e.title,
|
|
2969
3199
|
description: e.description
|
|
2970
3200
|
}));
|
|
2971
3201
|
}
|
|
2972
|
-
function
|
|
3202
|
+
function Uo(e) {
|
|
2973
3203
|
return o.boolean().default(e.default ?? !1).meta($({
|
|
2974
3204
|
title: e.title,
|
|
2975
3205
|
description: e.description
|
|
2976
3206
|
}));
|
|
2977
3207
|
}
|
|
2978
|
-
function
|
|
3208
|
+
function Wo(e, t) {
|
|
2979
3209
|
let n = o.enum(e);
|
|
2980
3210
|
return (t.default === void 0 ? n.optional() : n.default(t.default)).meta($({
|
|
2981
3211
|
title: t.title,
|
|
@@ -2984,14 +3214,14 @@ function co(e, t) {
|
|
|
2984
3214
|
icons: t.icons
|
|
2985
3215
|
}));
|
|
2986
3216
|
}
|
|
2987
|
-
function
|
|
3217
|
+
function Go(e, t) {
|
|
2988
3218
|
return o.array(o.enum(e)).default([...t.default ?? []]).meta($({
|
|
2989
3219
|
title: t.title,
|
|
2990
3220
|
description: t.description,
|
|
2991
3221
|
labels: t.labels
|
|
2992
3222
|
}));
|
|
2993
3223
|
}
|
|
2994
|
-
function
|
|
3224
|
+
function Ko(e, t) {
|
|
2995
3225
|
return o.array(o.string()).default([]).meta($({
|
|
2996
3226
|
domain: e,
|
|
2997
3227
|
title: t?.title ?? "Entities",
|
|
@@ -2999,7 +3229,7 @@ function uo(e, t) {
|
|
|
2999
3229
|
deviceClass: t?.deviceClass
|
|
3000
3230
|
}));
|
|
3001
3231
|
}
|
|
3002
|
-
function
|
|
3232
|
+
function qo(e, t) {
|
|
3003
3233
|
return o.array(o.string()).default([]).meta($({
|
|
3004
3234
|
domain: e,
|
|
3005
3235
|
title: t?.title ?? "Entity",
|
|
@@ -3008,13 +3238,13 @@ function fo(e, t) {
|
|
|
3008
3238
|
singleSelect: !0
|
|
3009
3239
|
}));
|
|
3010
3240
|
}
|
|
3011
|
-
function
|
|
3241
|
+
function Jo(e) {
|
|
3012
3242
|
return o.string().optional().meta({
|
|
3013
3243
|
formType: "area-picker",
|
|
3014
3244
|
title: e?.title ?? "Area"
|
|
3015
3245
|
});
|
|
3016
3246
|
}
|
|
3017
|
-
function
|
|
3247
|
+
function Yo(e) {
|
|
3018
3248
|
let t = o.string().meta($({
|
|
3019
3249
|
formType: "icon-picker",
|
|
3020
3250
|
title: e?.title ?? "Icon",
|
|
@@ -3022,7 +3252,7 @@ function mo(e) {
|
|
|
3022
3252
|
}));
|
|
3023
3253
|
return e?.default === void 0 ? t.optional() : t.default(e.default);
|
|
3024
3254
|
}
|
|
3025
|
-
function
|
|
3255
|
+
function Xo(e) {
|
|
3026
3256
|
let t = e?.presets && Object.fromEntries(Object.entries(e.presets).map(([e, t]) => [e, {
|
|
3027
3257
|
label: t.label,
|
|
3028
3258
|
thumb: t.thumb
|
|
@@ -3034,36 +3264,36 @@ function ho(e) {
|
|
|
3034
3264
|
}));
|
|
3035
3265
|
return e?.default === void 0 ? n.optional() : n.default(e.default);
|
|
3036
3266
|
}
|
|
3037
|
-
function
|
|
3267
|
+
function Zo(e) {
|
|
3038
3268
|
return o.array(o.string()).default([]).meta($({
|
|
3039
3269
|
title: e.title,
|
|
3040
3270
|
description: e.description
|
|
3041
3271
|
}));
|
|
3042
3272
|
}
|
|
3043
|
-
function
|
|
3273
|
+
function Qo(e, t) {
|
|
3044
3274
|
let n = o.object(e);
|
|
3045
|
-
return n.default(
|
|
3275
|
+
return n.default(cn(n)).meta({ title: t.title });
|
|
3046
3276
|
}
|
|
3047
|
-
function
|
|
3277
|
+
function $o(e) {
|
|
3048
3278
|
return e.def;
|
|
3049
3279
|
}
|
|
3050
|
-
function
|
|
3280
|
+
function es(e) {
|
|
3051
3281
|
if (o.globalRegistry.get(e)?.formType === "list") return !0;
|
|
3052
|
-
let t =
|
|
3053
|
-
return t.shape ? Object.values(t.shape).some(
|
|
3282
|
+
let t = $o(e);
|
|
3283
|
+
return t.shape ? Object.values(t.shape).some(es) : t.options ? t.options.some(es) : t.element ? es(t.element) : t.innerType ? es(t.innerType) : !1;
|
|
3054
3284
|
}
|
|
3055
|
-
function
|
|
3056
|
-
let t = e, n =
|
|
3057
|
-
for (; n;) t = n, n =
|
|
3285
|
+
function ts(e) {
|
|
3286
|
+
let t = e, n = $o(t).innerType;
|
|
3287
|
+
for (; n;) t = n, n = $o(t).innerType;
|
|
3058
3288
|
return t;
|
|
3059
3289
|
}
|
|
3060
|
-
function
|
|
3061
|
-
let t =
|
|
3290
|
+
function ns(e) {
|
|
3291
|
+
let t = $o(ts(e));
|
|
3062
3292
|
if (t.shape) return new Set(Object.keys(t.shape));
|
|
3063
3293
|
if (t.options) {
|
|
3064
3294
|
let e = [];
|
|
3065
3295
|
for (let n of t.options) {
|
|
3066
|
-
let t =
|
|
3296
|
+
let t = ns(n);
|
|
3067
3297
|
if (!t) return null;
|
|
3068
3298
|
e.push(t);
|
|
3069
3299
|
}
|
|
@@ -3075,7 +3305,7 @@ function xo(e) {
|
|
|
3075
3305
|
}
|
|
3076
3306
|
return null;
|
|
3077
3307
|
}
|
|
3078
|
-
function
|
|
3308
|
+
function rs(e, t, n) {
|
|
3079
3309
|
let r = { [t]: n };
|
|
3080
3310
|
try {
|
|
3081
3311
|
return e.parse(r);
|
|
@@ -3083,12 +3313,12 @@ function So(e, t, n) {
|
|
|
3083
3313
|
return r;
|
|
3084
3314
|
}
|
|
3085
3315
|
}
|
|
3086
|
-
function
|
|
3316
|
+
function is(e, t) {
|
|
3087
3317
|
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 >
|
|
3318
|
+
if (t.max > zo) throw Error(`field.list: max ${t.max} exceeds the ceiling of ${zo}`);
|
|
3089
3319
|
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 && !
|
|
3320
|
+
if (es(e)) throw Error("field.list: a list item cannot contain another field.list (depth 1 only)");
|
|
3321
|
+
if (t.labelField !== void 0 && !ns(e)?.has(t.labelField)) throw Error(`field.list: labelField "${t.labelField}" must name a field present in every item`);
|
|
3092
3322
|
let n = o.array(e);
|
|
3093
3323
|
return t.min !== void 0 && (n = n.min(t.min)), n = n.max(t.max), n.default([]).meta($({
|
|
3094
3324
|
formType: "list",
|
|
@@ -3098,7 +3328,7 @@ function Co(e, t) {
|
|
|
3098
3328
|
labelField: t.labelField
|
|
3099
3329
|
}));
|
|
3100
3330
|
}
|
|
3101
|
-
function
|
|
3331
|
+
function as(e, t, n) {
|
|
3102
3332
|
let r = Object.keys(t)[0];
|
|
3103
3333
|
if (r === void 0) throw Error("field.variants: at least one variant is required");
|
|
3104
3334
|
if (n.shared && e in n.shared) throw Error(`field.variants: shared fields cannot redefine the discriminator "${e}"`);
|
|
@@ -3111,7 +3341,7 @@ function wo(e, t, n) {
|
|
|
3111
3341
|
...r,
|
|
3112
3342
|
[e]: o.literal(t)
|
|
3113
3343
|
})), a = o.discriminatedUnion(e, i), s = i[0];
|
|
3114
|
-
return a.default(s ?
|
|
3344
|
+
return a.default(s ? rs(s, e, r) : {}).meta($({
|
|
3115
3345
|
formType: "variants",
|
|
3116
3346
|
discriminator: e,
|
|
3117
3347
|
title: n.title,
|
|
@@ -3119,35 +3349,35 @@ function wo(e, t, n) {
|
|
|
3119
3349
|
labels: n.labels
|
|
3120
3350
|
}));
|
|
3121
3351
|
}
|
|
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:
|
|
3352
|
+
var os = {
|
|
3353
|
+
title: Bo,
|
|
3354
|
+
text: Vo,
|
|
3355
|
+
number: Ho,
|
|
3356
|
+
toggle: Uo,
|
|
3357
|
+
choice: Wo,
|
|
3358
|
+
choices: Go,
|
|
3359
|
+
entities: Ko,
|
|
3360
|
+
entity: qo,
|
|
3361
|
+
area: Jo,
|
|
3362
|
+
icon: Yo,
|
|
3363
|
+
image: Xo,
|
|
3364
|
+
stringList: Zo,
|
|
3365
|
+
group: Qo,
|
|
3366
|
+
list: is,
|
|
3367
|
+
variants: as
|
|
3138
3368
|
};
|
|
3139
|
-
function
|
|
3369
|
+
function ss(e) {
|
|
3140
3370
|
return o.object(e);
|
|
3141
3371
|
}
|
|
3142
3372
|
//#endregion
|
|
3143
3373
|
//#region src/framework/image-src.ts
|
|
3144
|
-
function
|
|
3145
|
-
let n =
|
|
3146
|
-
return n === void 0 ?
|
|
3374
|
+
function cs(e, t) {
|
|
3375
|
+
let n = Yt(e);
|
|
3376
|
+
return n === void 0 ? Zt(e) : t?.[n]?.src;
|
|
3147
3377
|
}
|
|
3148
3378
|
//#endregion
|
|
3149
3379
|
//#region src/shared/spline.ts
|
|
3150
|
-
function
|
|
3380
|
+
function ls(e) {
|
|
3151
3381
|
if (e.length < 2) return "";
|
|
3152
3382
|
let t = e[0], n = e[1];
|
|
3153
3383
|
if (!t || !n) return "";
|
|
@@ -3174,9 +3404,9 @@ function Oo(e) {
|
|
|
3174
3404
|
}
|
|
3175
3405
|
//#endregion
|
|
3176
3406
|
//#region src/version.ts
|
|
3177
|
-
var
|
|
3407
|
+
var us = {
|
|
3178
3408
|
name: "@glasshome/widget-sdk",
|
|
3179
|
-
version: "1.
|
|
3409
|
+
version: "1.29.0",
|
|
3180
3410
|
description: "SDK for building GlassHome dashboard widgets with SolidJS",
|
|
3181
3411
|
keywords: [
|
|
3182
3412
|
"dashboard",
|
|
@@ -3248,7 +3478,7 @@ var ko = {
|
|
|
3248
3478
|
lint: "oxlint --type-aware . && oxfmt --check ."
|
|
3249
3479
|
},
|
|
3250
3480
|
dependencies: {
|
|
3251
|
-
"@glasshome/widget-contract": "0.
|
|
3481
|
+
"@glasshome/widget-contract": "0.7.0",
|
|
3252
3482
|
"@tailwindcss/vite": "^4.1.13",
|
|
3253
3483
|
clsx: "^2.1.1",
|
|
3254
3484
|
"happy-dom": "^20.0.0",
|
|
@@ -3281,4 +3511,4 @@ var ko = {
|
|
|
3281
3511
|
engines: { node: ">=18" }
|
|
3282
3512
|
}.version;
|
|
3283
3513
|
//#endregion
|
|
3284
|
-
export {
|
|
3514
|
+
export { Ae as Badge, Me as Button, Pe as ButtonGroup, Ie as Carousel, Le as CarouselContent, Re as CarouselDots, ze as CarouselItem, Be as CarouselNext, Ve as CarouselPrevious, He as ColorDisc, Ue as ColorSlider, We as ColorWheel, Ge as CountPill, nt as Icon, rt as Input, it as Label, Hi as PanelEntityRow, Ei as PanelFacts, Ti as PanelRow, wi as PanelRows, Ci as PanelSection, st as Progress, ct as ResponsiveDialog, lt as ResponsiveDialogBody, dt as ResponsiveDialogClose, ft as ResponsiveDialogContent, pt as ResponsiveDialogDescription, mt as ResponsiveDialogFooter, gt as ResponsiveDialogHeader, _t as ResponsiveDialogTitle, us as SDK_VERSION, vt as SchemaForm, yt as SectionIcon, Ct as SectionTitle, wt as Select, Tt as SelectContent, Et as SelectItem, Dt as SelectTrigger, Ot as SelectValue, kt as Slider, At as SwatchPicker, jt as Switch, Mt as Tabs, Pt as TabsContent, It as TabsList, Rt as TabsTrigger, Bt as TemperatureBar, Vt as Toggle, Ht as ToggleGroup, Wt as ToggleGroupItem, Lo as ToneSchema, q as Widget, pr as WidgetAction, gr as WidgetBackdrop, mr as WidgetChip, fr as WidgetChoice, jr as WidgetContent, ur as WidgetControls, H as WidgetCtx, da as WidgetDebugTab, la as WidgetDebugView, Ta as WidgetDialog, _r as WidgetGlyph, cr as WidgetHead, lr as WidgetHero, Jn as WidgetIcon, hr as WidgetLayer, r as WidgetManifestSchema, Vn as WidgetSizeCtx, Or as WidgetSliderFill, Nr as WidgetStatus, dr as WidgetStepper, Ir as WidgetTitle, Jr as WidgetValue, Ji as buildDebugData, g as byDomain, Lr as calculateLightGroup, Rr as calculateSensorGroup, qt as copyText, Ur as countActiveEntities, ss as defineConfig, ln as defineWidget, t as deprecations, os as field, n as formatDeprecation, i as formatSchemaError, Hr as getEntityAttribute, s as getForecasts, c as getStream, l as getWebRtcClientConfig, u as hassMediaUrl, Jt as imagePreset, cs as imageSrc, Xt as imageUrl, Cr as injectTokens, jo as isDark, Vr as isEntityActive, Vi as isPanelControllable, Qt as mediaUrl, ls as monotoneCubicPath, $t as parseColor, en as presetValue, d as sendWebRtcCandidate, f as startWebRtcSession, p as state, Io as svgColors, m as trackEntityHistory, h as untrackEntityHistory, _ as useArea, v as useCalendarEvents, y as useCamera, Wn as useConfirm, b as useConnection, nn as useCopyText, x as useCurrency, Eo as useDaylight, S as useEntities, ee as useEntity, ne as useEntityHistory, C as useEntityStatistics, re as useForecast, ie as useHassConfig, mo as useIntersectionPause, ae as useLocale, po as useMaterial, Mo as useReducedMotion, pn as useService, se as useStore, ce as useTemperatureUnit, gn as useToggle, hn as useTurnOff, mn as useTurnOn, pe as useUnitSystem, un as useWidgetContext, Ka as useWidgetDashboard, vn as useWidgetDialog, Hn as useWidgetDimensions, No as useWidgetEntityGroup, Bn as useWidgetGestures, Wa as useWidgetState, Ja as useWidgetViewer, Ro as widgetFields, a as z };
|