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