@glasshome/widget-sdk 1.4.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +140 -122
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
SDK for building GlassHome dashboard widgets with SolidJS.
|
|
4
4
|
|
|
5
|
-
Provides `defineWidget`, reactive entity bindings, framework components/hooks, a Vite plugin for widget development, and Tailwind v4 source paths — everything you need to build, preview, and ship dashboard
|
|
5
|
+
Provides `defineWidget`, reactive entity bindings, framework components/hooks, a Vite plugin for widget development, and Tailwind v4 source paths — everything you need to build, preview, and ship widgets for [GlassHome](https://glasshome.app), the local-first dashboard for Home Assistant. Start with the [widget development guide](https://glasshome.app/docs/widget-development).
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,9 @@ import { deprecate as e, deprecations as t, formatDeprecation as n } from "./dep
|
|
|
2
2
|
import { WidgetManifestSchema as r, formatSchemaError as i } from "./schemas.js";
|
|
3
3
|
import { z as a, z as o } from "zod";
|
|
4
4
|
import { getForecasts as s, getStream as c, getWebRtcClientConfig as l, hassMediaUrl as u, sendWebRtcCandidate as d, startWebRtcSession as f, state as p, trackEntityHistory as m, untrackEntityHistory as h } from "@glasshome/sync-layer";
|
|
5
|
-
import { byDomain as g, useArea as _, useCamera as v, useConnection as
|
|
6
|
-
import { Show as
|
|
7
|
-
import { addEventListener as
|
|
8
|
-
import { createElementSize as ye } from "@solid-primitives/resize-observer";
|
|
5
|
+
import { byDomain as g, useArea as _, useCamera as v, useConnection as ee, useCurrency as y, useEntities as b, useEntity as te, useEntityHistory as x, useEntityStatistics as ne, useForecast as re, useHassConfig as ie, useLocale as ae, useService as S, useStore as oe, useTemperatureUnit as se, useToggle as ce, useTurnOff as le, useTurnOn as ue, useUnitSystem as de } from "@glasshome/sync-layer/solid";
|
|
6
|
+
import { Show as C, createContext as fe, createEffect as w, createMemo as T, createSignal as E, on as pe, onCleanup as D, onMount as me, splitProps as he, untrack as ge, useContext as O } from "solid-js";
|
|
7
|
+
import { addEventListener as k, className as A, createComponent as j, delegateEvents as _e, effect as M, insert as N, memo as P, setStyleProperty as F, style as ve, template as I, use as ye } from "solid-js/web";
|
|
9
8
|
import { clsx as be } from "clsx";
|
|
10
9
|
import { twMerge as xe } from "tailwind-merge";
|
|
11
10
|
//#region src/framework/to-form-schema.ts
|
|
@@ -32,9 +31,9 @@ function we(e) {
|
|
|
32
31
|
}
|
|
33
32
|
//#endregion
|
|
34
33
|
//#region src/framework/hooks/use-widget-context.ts
|
|
35
|
-
var L =
|
|
34
|
+
var L = fe();
|
|
36
35
|
function Te() {
|
|
37
|
-
let e =
|
|
36
|
+
let e = O(L);
|
|
38
37
|
if (!e) throw Error("useWidgetContext must be used within a Widget component");
|
|
39
38
|
return e;
|
|
40
39
|
}
|
|
@@ -49,25 +48,25 @@ function R(e, t) {
|
|
|
49
48
|
return (n, r = {}) => e(Ee(n), t, r, { entity_id: n });
|
|
50
49
|
}
|
|
51
50
|
function De() {
|
|
52
|
-
let e =
|
|
51
|
+
let e = O(L)?.callService;
|
|
53
52
|
return e ? {
|
|
54
53
|
callService: e,
|
|
55
54
|
turnOn: R(e, "turn_on"),
|
|
56
55
|
turnOff: R(e, "turn_off"),
|
|
57
56
|
toggle: R(e, "toggle")
|
|
58
|
-
} :
|
|
57
|
+
} : S();
|
|
59
58
|
}
|
|
60
59
|
function Oe() {
|
|
61
|
-
let e =
|
|
62
|
-
return e ? R(e, "turn_on") :
|
|
60
|
+
let e = O(L)?.callService;
|
|
61
|
+
return e ? R(e, "turn_on") : ue();
|
|
63
62
|
}
|
|
64
63
|
function ke() {
|
|
65
|
-
let e =
|
|
66
|
-
return e ? R(e, "turn_off") :
|
|
64
|
+
let e = O(L)?.callService;
|
|
65
|
+
return e ? R(e, "turn_off") : le();
|
|
67
66
|
}
|
|
68
67
|
function Ae() {
|
|
69
|
-
let e =
|
|
70
|
-
return e ? R(e, "toggle") :
|
|
68
|
+
let e = O(L)?.callService;
|
|
69
|
+
return e ? R(e, "toggle") : ce();
|
|
71
70
|
}
|
|
72
71
|
//#endregion
|
|
73
72
|
//#region src/framework/design-system/z-index.ts
|
|
@@ -197,13 +196,13 @@ var Re = /*#__PURE__*/ I("<div>");
|
|
|
197
196
|
function ze(e) {
|
|
198
197
|
return (() => {
|
|
199
198
|
var t = Re();
|
|
200
|
-
return
|
|
199
|
+
return M((n) => {
|
|
201
200
|
var r = V("glasshome-widget-slider-fill pointer-events-none absolute inset-0", e.isDragging ? "duration-0" : "transition-all duration-300 ease-out", e.class), i = {
|
|
202
201
|
"--widget-fill-value": e.value,
|
|
203
202
|
"z-index": z.BACKGROUND,
|
|
204
203
|
...e.color ? { "--widget-icon-color": e.color } : {}
|
|
205
204
|
};
|
|
206
|
-
return r !== n.e &&
|
|
205
|
+
return r !== n.e && A(t, n.e = r), n.t = ve(t, i, n.t), n;
|
|
207
206
|
}, {
|
|
208
207
|
e: void 0,
|
|
209
208
|
t: void 0
|
|
@@ -216,7 +215,7 @@ var Be = /*#__PURE__*/ I("<div>");
|
|
|
216
215
|
function Ve(e) {
|
|
217
216
|
return (() => {
|
|
218
217
|
var t = Be();
|
|
219
|
-
return
|
|
218
|
+
return N(t, () => e.children), M(() => A(t, V("glasshome-widget-content", e.class))), t;
|
|
220
219
|
})();
|
|
221
220
|
}
|
|
222
221
|
//#endregion
|
|
@@ -226,23 +225,23 @@ function Ge(e) {
|
|
|
226
225
|
let t = () => e.entityCount ?? 1;
|
|
227
226
|
return (() => {
|
|
228
227
|
var n = We(), r = n.firstChild;
|
|
229
|
-
return
|
|
228
|
+
return N(n, j(C, {
|
|
230
229
|
get when() {
|
|
231
230
|
return t() >= 2;
|
|
232
231
|
},
|
|
233
232
|
get children() {
|
|
234
233
|
return He();
|
|
235
234
|
}
|
|
236
|
-
}), r),
|
|
235
|
+
}), r), N(n, j(C, {
|
|
237
236
|
get when() {
|
|
238
237
|
return t() >= 3;
|
|
239
238
|
},
|
|
240
239
|
get children() {
|
|
241
240
|
return Ue();
|
|
242
241
|
}
|
|
243
|
-
}), r),
|
|
242
|
+
}), r), N(r, () => e.icon), M((t) => {
|
|
244
243
|
var r = V("glasshome-widget-icon", "relative flex shrink-0 items-center justify-center pointer-events-none transition-all", e.dimmed && "opacity-50", e.class), i = e.color ? { "--widget-icon-color": e.color } : void 0;
|
|
245
|
-
return r !== t.e &&
|
|
244
|
+
return r !== t.e && A(n, t.e = r), t.t = ve(n, i, t.t), t;
|
|
246
245
|
}, {
|
|
247
246
|
e: void 0,
|
|
248
247
|
t: void 0
|
|
@@ -255,12 +254,12 @@ var Ke = /*#__PURE__*/ I("<p>");
|
|
|
255
254
|
function qe(e) {
|
|
256
255
|
return (() => {
|
|
257
256
|
var t = Ke();
|
|
258
|
-
return
|
|
259
|
-
var t =
|
|
257
|
+
return N(t, (() => {
|
|
258
|
+
var t = P(() => !!e.isUnavailable);
|
|
260
259
|
return () => t() ? "Unavailable" : e.children;
|
|
261
|
-
})()),
|
|
260
|
+
})()), M((n) => {
|
|
262
261
|
var r = V("glasshome-widget-status", "relative", e.dimmed && "opacity-40", e.class), i = z.ACTIONS;
|
|
263
|
-
return r !== n.e &&
|
|
262
|
+
return r !== n.e && A(t, n.e = r), i !== n.t && F(t, "z-index", n.t = i), n;
|
|
264
263
|
}, {
|
|
265
264
|
e: void 0,
|
|
266
265
|
t: void 0
|
|
@@ -273,17 +272,17 @@ var Je = /*#__PURE__*/ I("<span class=\"glasshome-widget-badge shrink-0\">"), Ye
|
|
|
273
272
|
function Xe(e) {
|
|
274
273
|
return (() => {
|
|
275
274
|
var t = Ye(), n = t.firstChild;
|
|
276
|
-
return
|
|
275
|
+
return N(n, () => e.children), N(t, j(C, {
|
|
277
276
|
get when() {
|
|
278
|
-
return
|
|
277
|
+
return P(() => e.badge !== void 0)() && e.badge > 0;
|
|
279
278
|
},
|
|
280
279
|
get children() {
|
|
281
280
|
var t = Je();
|
|
282
|
-
return
|
|
281
|
+
return N(t, () => e.badge), t;
|
|
283
282
|
}
|
|
284
|
-
}), null),
|
|
283
|
+
}), null), M((n) => {
|
|
285
284
|
var r = V("relative flex items-center gap-2", e.class), i = z.ACTIONS;
|
|
286
|
-
return r !== n.e &&
|
|
285
|
+
return r !== n.e && A(t, n.e = r), i !== n.t && F(t, "z-index", n.t = i), n;
|
|
287
286
|
}, {
|
|
288
287
|
e: void 0,
|
|
289
288
|
t: void 0
|
|
@@ -338,23 +337,23 @@ function Ze(e, t = !1) {
|
|
|
338
337
|
}
|
|
339
338
|
let u = e.length, d = o === u, f = a + o === u, p = r > 0, m = r === u, h = i === u, g, _;
|
|
340
339
|
t ? d ? (g = "unavailable", _ = !1) : a > 0 || o > 0 ? (g = "unknown", _ = !1) : i > 0 ? (g = "off", _ = !1) : (g = "on", _ = !0) : d ? (g = "unavailable", _ = !1) : f ? (g = "unknown", _ = !1) : p ? (g = "on", _ = !0) : (g = "off", _ = !1);
|
|
341
|
-
let v = c > 0 ? Math.round(s / c) : 0,
|
|
340
|
+
let v = c > 0 ? Math.round(s / c) : 0, ee = Math.round(v / 255 * 100), y;
|
|
342
341
|
if (l.length > 0) {
|
|
343
342
|
let e = Math.round(l.reduce((e, t) => e + t[0], 0) / l.length), t = Math.round(l.reduce((e, t) => e + t[1], 0) / l.length), n = Math.round(l.reduce((e, t) => e + t[2], 0) / l.length), r = v / 255;
|
|
344
|
-
|
|
345
|
-
} else
|
|
346
|
-
let
|
|
347
|
-
return
|
|
343
|
+
y = `rgb(${Math.round(e * r)}, ${Math.round(t * r)}, ${Math.round(n * r)})`;
|
|
344
|
+
} else y = $e(e[0]);
|
|
345
|
+
let b;
|
|
346
|
+
return b = m ? "All on" : h ? "All off" : r > 0 ? `${r} of ${u} on` : "Off", {
|
|
348
347
|
isGroup: n,
|
|
349
348
|
state: g,
|
|
350
349
|
isOn: _,
|
|
351
350
|
isUnavailable: g === "unavailable",
|
|
352
351
|
brightness: v,
|
|
353
|
-
brightnessPercent:
|
|
354
|
-
color:
|
|
352
|
+
brightnessPercent: ee,
|
|
353
|
+
color: y,
|
|
355
354
|
onCount: r,
|
|
356
355
|
totalCount: u,
|
|
357
|
-
description:
|
|
356
|
+
description: b
|
|
358
357
|
};
|
|
359
358
|
}
|
|
360
359
|
function Qe(e, t = "mean", n = !0) {
|
|
@@ -512,67 +511,82 @@ var at = /*#__PURE__*/ I("<div class=glasshome-widget-subtitle>"), ot = /*#__PUR
|
|
|
512
511
|
function st(e) {
|
|
513
512
|
return (() => {
|
|
514
513
|
var t = ot(), n = t.firstChild;
|
|
515
|
-
return
|
|
514
|
+
return N(n, () => rt(e.value, e.unit)), N(t, j(C, {
|
|
516
515
|
get when() {
|
|
517
|
-
return
|
|
516
|
+
return P(() => !!e.interpret)() && typeof e.value == "number";
|
|
518
517
|
},
|
|
519
518
|
get children() {
|
|
520
519
|
var t = at();
|
|
521
|
-
return
|
|
520
|
+
return N(t, () => it(e.value, e.unit)), t;
|
|
522
521
|
}
|
|
523
|
-
}), null),
|
|
522
|
+
}), null), M(() => A(t, V("flex flex-col", e.class))), t;
|
|
524
523
|
})();
|
|
525
524
|
}
|
|
526
525
|
//#endregion
|
|
527
526
|
//#region src/framework/core/Widget.tsx
|
|
528
527
|
var ct = /*#__PURE__*/ I("<div><div class=\"relative h-full w-full\">"), lt = /*#__PURE__*/ I("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), ut = /*#__PURE__*/ I("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), dt = /*#__PURE__*/ I("<div class=\"flex items-center justify-center text-white/30\">"), ft = /*#__PURE__*/ I("<h3 class=\"font-semibold text-sm text-white/60\">"), pt = /*#__PURE__*/ I("<p class=\"text-white/50 text-xs\">");
|
|
529
528
|
function mt(e) {
|
|
530
|
-
let t =
|
|
531
|
-
|
|
529
|
+
let t = O(L), [n, r] = E(), [i, a] = E({
|
|
530
|
+
width: 0,
|
|
531
|
+
height: 0
|
|
532
|
+
});
|
|
533
|
+
w(() => {
|
|
534
|
+
let e = n();
|
|
535
|
+
if (!e) return;
|
|
536
|
+
let t = new ResizeObserver(([e]) => {
|
|
537
|
+
if (!e) return;
|
|
538
|
+
let t = e.borderBoxSize?.[0];
|
|
539
|
+
a(t ? {
|
|
540
|
+
width: t.inlineSize,
|
|
541
|
+
height: t.blockSize
|
|
542
|
+
} : {
|
|
543
|
+
width: e.contentRect.width,
|
|
544
|
+
height: e.contentRect.height
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
t.observe(e), D(() => t.disconnect());
|
|
548
|
+
}), me(() => {
|
|
532
549
|
let e = n()?.getRootNode();
|
|
533
550
|
Fe(typeof ShadowRoot < "u" && e instanceof ShadowRoot || typeof Document < "u" && e instanceof Document ? e : void 0);
|
|
534
551
|
});
|
|
535
|
-
let
|
|
552
|
+
let o = {
|
|
536
553
|
isEditMode: () => e.isEditMode ?? !1,
|
|
537
554
|
updateConfig: t?.updateConfig ?? (() => {}),
|
|
538
555
|
registerDialogOpener: t?.registerDialogOpener,
|
|
539
556
|
callService: t?.callService,
|
|
540
|
-
dimensions: () => (
|
|
541
|
-
|
|
542
|
-
height: i.height ?? 0
|
|
543
|
-
})
|
|
544
|
-
}, o = T(() => {
|
|
557
|
+
dimensions: () => i()
|
|
558
|
+
}, s = T(() => {
|
|
545
559
|
if (e.variant) return typeof e.variant == "string" ? Le(e.variant) : e.variant;
|
|
546
|
-
}),
|
|
560
|
+
}), c = T(() => ({
|
|
547
561
|
"container-type": "size",
|
|
548
562
|
"container-name": "widget",
|
|
549
563
|
"touch-action": e.gestures && !e.isEditMode ? e.gestures.touchAction() : void 0,
|
|
550
|
-
...
|
|
551
|
-
...
|
|
564
|
+
...s()?.styles?.container,
|
|
565
|
+
...s()?.styles?.cssVars || {},
|
|
552
566
|
...e.tone ? { "--widget-color": `var(--tone-${e.tone})` } : {},
|
|
553
567
|
...e.color ? { "--widget-color": e.color } : {},
|
|
554
568
|
...e.colorTo ? { "--widget-color-to": e.colorTo } : {},
|
|
555
569
|
...e.gradient ? { "--widget-gradient": e.gradient } : {}
|
|
556
|
-
})),
|
|
557
|
-
|
|
558
|
-
}, u = (t) => {
|
|
559
|
-
c() && e.gestures?.onPointerDown(t);
|
|
570
|
+
})), l = () => !!e.gestures && !e.isEditMode, u = (t) => {
|
|
571
|
+
l() && e.gestures?.onPointerEnter(t);
|
|
560
572
|
}, d = (t) => {
|
|
561
|
-
|
|
573
|
+
l() && e.gestures?.onPointerDown(t);
|
|
562
574
|
}, f = (t) => {
|
|
563
|
-
|
|
575
|
+
l() && e.gestures?.onPointerMove(t);
|
|
564
576
|
}, p = (t) => {
|
|
565
|
-
|
|
577
|
+
l() && e.gestures?.onPointerUp(t);
|
|
578
|
+
}, m = (t) => {
|
|
579
|
+
l() && e.gestures?.onPointerCancel(t);
|
|
566
580
|
};
|
|
567
|
-
return
|
|
568
|
-
value:
|
|
581
|
+
return j(L.Provider, {
|
|
582
|
+
value: o,
|
|
569
583
|
get children() {
|
|
570
584
|
var t = ct(), n = t.firstChild;
|
|
571
|
-
return
|
|
585
|
+
return k(t, "pointercancel", m), k(t, "pointerup", p), k(t, "pointermove", f), k(t, "pointerdown", d), k(t, "pointerenter", u), ye((t) => {
|
|
572
586
|
r(t), e.gestures?.bindElement(t);
|
|
573
|
-
}, t),
|
|
574
|
-
var t =
|
|
575
|
-
return () => t() ?
|
|
587
|
+
}, t), N(n, (() => {
|
|
588
|
+
var t = P(() => !!e.emptyState);
|
|
589
|
+
return () => t() ? j(ht, {
|
|
576
590
|
get icon() {
|
|
577
591
|
return e.emptyState.icon;
|
|
578
592
|
},
|
|
@@ -583,15 +597,15 @@ function mt(e) {
|
|
|
583
597
|
return e.emptyState.message;
|
|
584
598
|
}
|
|
585
599
|
}) : e.children;
|
|
586
|
-
})()),
|
|
587
|
-
var t =
|
|
600
|
+
})()), N(t, (() => {
|
|
601
|
+
var t = P(() => !!e.loading);
|
|
588
602
|
return () => t() && (() => {
|
|
589
603
|
var e = lt();
|
|
590
|
-
return
|
|
604
|
+
return M((t) => F(e, "z-index", z.OVERLAY)), e;
|
|
591
605
|
})();
|
|
592
|
-
})(), null),
|
|
593
|
-
var i = V("glasshome-widget", "relative h-full w-full select-none overflow-hidden rounded-xl border border-border/50",
|
|
594
|
-
return i !== r.e &&
|
|
606
|
+
})(), null), M((r) => {
|
|
607
|
+
var i = V("glasshome-widget", "relative h-full w-full select-none overflow-hidden rounded-xl border border-border/50", s()?.styles?.class, e.class), a = c(), o = z.CONTENT;
|
|
608
|
+
return i !== r.e && A(t, r.e = i), r.t = ve(t, a, r.t), o !== r.a && F(n, "z-index", r.a = o), r;
|
|
595
609
|
}, {
|
|
596
610
|
e: void 0,
|
|
597
611
|
t: void 0,
|
|
@@ -603,23 +617,23 @@ function mt(e) {
|
|
|
603
617
|
function ht(e) {
|
|
604
618
|
return (() => {
|
|
605
619
|
var t = ut();
|
|
606
|
-
return
|
|
607
|
-
var t =
|
|
620
|
+
return N(t, (() => {
|
|
621
|
+
var t = P(() => !!e.icon);
|
|
608
622
|
return () => t() && (() => {
|
|
609
623
|
var t = dt();
|
|
610
|
-
return
|
|
624
|
+
return N(t, () => e.icon), t;
|
|
611
625
|
})();
|
|
612
|
-
})(), null),
|
|
613
|
-
var t =
|
|
626
|
+
})(), null), N(t, (() => {
|
|
627
|
+
var t = P(() => !!e.title);
|
|
614
628
|
return () => t() && (() => {
|
|
615
629
|
var t = ft();
|
|
616
|
-
return
|
|
630
|
+
return N(t, () => e.title), t;
|
|
617
631
|
})();
|
|
618
|
-
})(), null),
|
|
619
|
-
var t =
|
|
632
|
+
})(), null), N(t, (() => {
|
|
633
|
+
var t = P(() => !!e.message);
|
|
620
634
|
return () => t() && (() => {
|
|
621
635
|
var t = pt();
|
|
622
|
-
return
|
|
636
|
+
return N(t, () => e.message), t;
|
|
623
637
|
})();
|
|
624
638
|
})(), null), t;
|
|
625
639
|
})();
|
|
@@ -632,22 +646,22 @@ var gt = /*#__PURE__*/ I("<span class=\"inline-flex size-3.5 shrink-0 items-cent
|
|
|
632
646
|
function Ot(e) {
|
|
633
647
|
return (() => {
|
|
634
648
|
var t = _t();
|
|
635
|
-
return t.$$click = () => e.onClick(),
|
|
649
|
+
return t.$$click = () => e.onClick(), N(t, j(C, {
|
|
636
650
|
get when() {
|
|
637
651
|
return e.isActive;
|
|
638
652
|
},
|
|
639
653
|
get children() {
|
|
640
654
|
var t = gt();
|
|
641
|
-
return
|
|
655
|
+
return N(t, () => e.icon), t;
|
|
642
656
|
}
|
|
643
|
-
}), null),
|
|
657
|
+
}), null), N(t, () => e.label, null), M(() => A(t, V("flex cursor-pointer items-center justify-center rounded-md px-3 py-1.5 text-xs transition-all duration-300 ease-in-out", e.isActive ? "gap-1.5 bg-foreground/10 font-semibold text-foreground shadow-sm" : "gap-0 text-muted-foreground hover:bg-foreground/5 hover:text-foreground"))), t;
|
|
644
658
|
})();
|
|
645
659
|
}
|
|
646
660
|
function kt(e) {
|
|
647
|
-
let [t] =
|
|
648
|
-
|
|
661
|
+
let [t] = he(e, /* @__PURE__ */ "open.onOpenChange.title.onSave.hasUnsavedChanges.onDelete.editContent.controlsContent.debugContent.debugData.tabs.class.maxWidth.defaultTab.activeTab.onActiveTabChange.headerActions.configSchema.config.onConfigSave.ResponsiveDialog.ResponsiveDialogContent.ResponsiveDialogHeader.ResponsiveDialogTitle.ResponsiveDialogDescription.Button.SchemaForm".split(".")), n = () => !!t.configSchema && !!t.config && !!t.onConfigSave && !!t.SchemaForm, [r, i] = E({}), [a, o] = E(null);
|
|
662
|
+
w(pe(() => t.config, (e) => {
|
|
649
663
|
e && i({ ...e });
|
|
650
|
-
})),
|
|
664
|
+
})), w(pe(() => t.configSchema, (e) => {
|
|
651
665
|
e && o(Se(e));
|
|
652
666
|
}));
|
|
653
667
|
let s = () => n() && JSON.stringify(r()) !== JSON.stringify(t.config), c = (e) => {
|
|
@@ -671,12 +685,12 @@ function kt(e) {
|
|
|
671
685
|
id: "edit",
|
|
672
686
|
label: "Edit",
|
|
673
687
|
icon: vt(),
|
|
674
|
-
content: t.editContent ?? (n() && a() ?
|
|
688
|
+
content: t.editContent ?? (n() && a() ? j(ne, {
|
|
675
689
|
get schema() {
|
|
676
690
|
return a();
|
|
677
691
|
},
|
|
678
692
|
get data() {
|
|
679
|
-
return r
|
|
693
|
+
return ge(r);
|
|
680
694
|
},
|
|
681
695
|
onChange: i
|
|
682
696
|
}) : yt())
|
|
@@ -697,38 +711,43 @@ function kt(e) {
|
|
|
697
711
|
await navigator.clipboard.writeText(e);
|
|
698
712
|
} catch {}
|
|
699
713
|
}, _ = () => {
|
|
700
|
-
let e =
|
|
714
|
+
let e = re();
|
|
701
715
|
return e.find((e) => e.id === f())?.content ?? e[0]?.content;
|
|
702
|
-
}, v = t.ResponsiveDialog,
|
|
703
|
-
|
|
716
|
+
}, v = t.ResponsiveDialog, ee = t.ResponsiveDialogContent, y = t.ResponsiveDialogHeader, b = t.ResponsiveDialogTitle, te = t.ResponsiveDialogDescription, x = t.Button, ne = t.SchemaForm, re = T(pe([
|
|
717
|
+
() => t.open,
|
|
718
|
+
a,
|
|
719
|
+
() => t.config,
|
|
720
|
+
() => t.tabs
|
|
721
|
+
], () => h())), ie = (e) => n() ? c(e) : t.onOpenChange(e), ae = () => n() ? s() : t.hasUnsavedChanges, S = () => n() ? l : t.onSave;
|
|
722
|
+
return j(v, {
|
|
704
723
|
get open() {
|
|
705
724
|
return t.open;
|
|
706
725
|
},
|
|
707
|
-
onOpenChange: (e) =>
|
|
726
|
+
onOpenChange: (e) => ie(e),
|
|
708
727
|
get children() {
|
|
709
|
-
return
|
|
728
|
+
return j(ee, {
|
|
710
729
|
get class() {
|
|
711
730
|
return V(m(), t.class);
|
|
712
731
|
},
|
|
713
732
|
get children() {
|
|
714
733
|
return [
|
|
715
|
-
|
|
734
|
+
j(y, {
|
|
716
735
|
class: "flex flex-row items-center justify-between gap-3",
|
|
717
736
|
get children() {
|
|
718
737
|
return [(() => {
|
|
719
738
|
var e = wt();
|
|
720
|
-
return
|
|
739
|
+
return N(e, j(b, {
|
|
721
740
|
class: "truncate leading-tight",
|
|
722
741
|
get children() {
|
|
723
742
|
return t.title;
|
|
724
743
|
}
|
|
725
|
-
}), null),
|
|
744
|
+
}), null), N(e, j(te, {
|
|
726
745
|
class: "sr-only",
|
|
727
746
|
children: "Widget configuration dialog"
|
|
728
747
|
}), null), e;
|
|
729
748
|
})(), (() => {
|
|
730
749
|
var e = Tt(), n = e.firstChild;
|
|
731
|
-
return
|
|
750
|
+
return N(n, () => re().map((e) => j(Ot, {
|
|
732
751
|
get icon() {
|
|
733
752
|
return e.icon;
|
|
734
753
|
},
|
|
@@ -739,7 +758,7 @@ function kt(e) {
|
|
|
739
758
|
return f() === e.id;
|
|
740
759
|
},
|
|
741
760
|
onClick: () => p(e.id)
|
|
742
|
-
}))),
|
|
761
|
+
}))), N(e, j(C, {
|
|
743
762
|
get when() {
|
|
744
763
|
return t.headerActions;
|
|
745
764
|
},
|
|
@@ -752,46 +771,46 @@ function kt(e) {
|
|
|
752
771
|
}),
|
|
753
772
|
(() => {
|
|
754
773
|
var e = Et();
|
|
755
|
-
return
|
|
774
|
+
return N(e, _), e;
|
|
756
775
|
})(),
|
|
757
|
-
|
|
776
|
+
j(C, {
|
|
758
777
|
get when() {
|
|
759
|
-
return
|
|
778
|
+
return P(() => f() === "edit")() && (S() || t.onDelete) || f() === "debug" && t.debugData !== void 0;
|
|
760
779
|
},
|
|
761
780
|
get children() {
|
|
762
781
|
var e = Dt();
|
|
763
|
-
return
|
|
782
|
+
return N(e, j(C, {
|
|
764
783
|
get when() {
|
|
765
|
-
return
|
|
784
|
+
return P(() => f() === "edit")() && t.onDelete;
|
|
766
785
|
},
|
|
767
786
|
get children() {
|
|
768
|
-
return
|
|
787
|
+
return j(x, {
|
|
769
788
|
size: "sm",
|
|
770
789
|
variant: "destructive",
|
|
771
790
|
onClick: () => t.onDelete?.(),
|
|
772
791
|
children: "Delete"
|
|
773
792
|
});
|
|
774
793
|
}
|
|
775
|
-
}), null),
|
|
794
|
+
}), null), N(e, j(C, {
|
|
776
795
|
get when() {
|
|
777
|
-
return
|
|
796
|
+
return P(() => f() === "edit")() && S();
|
|
778
797
|
},
|
|
779
798
|
get children() {
|
|
780
|
-
return
|
|
799
|
+
return j(x, {
|
|
781
800
|
size: "sm",
|
|
782
801
|
get disabled() {
|
|
783
|
-
return !
|
|
802
|
+
return !ae();
|
|
784
803
|
},
|
|
785
|
-
onClick: () =>
|
|
804
|
+
onClick: () => S()?.(),
|
|
786
805
|
children: "Save"
|
|
787
806
|
});
|
|
788
807
|
}
|
|
789
|
-
}), null),
|
|
808
|
+
}), null), N(e, j(C, {
|
|
790
809
|
get when() {
|
|
791
|
-
return
|
|
810
|
+
return P(() => f() === "debug")() && t.debugData !== void 0;
|
|
792
811
|
},
|
|
793
812
|
get children() {
|
|
794
|
-
return
|
|
813
|
+
return j(x, {
|
|
795
814
|
size: "sm",
|
|
796
815
|
variant: "outline",
|
|
797
816
|
onClick: g,
|
|
@@ -816,25 +835,25 @@ function At(e) {
|
|
|
816
835
|
let t = e[0];
|
|
817
836
|
t && n(!t.isIntersecting);
|
|
818
837
|
});
|
|
819
|
-
return
|
|
838
|
+
return w(() => {
|
|
820
839
|
let t = e();
|
|
821
840
|
r.disconnect(), t && r.observe(t);
|
|
822
|
-
}),
|
|
841
|
+
}), D(() => r.disconnect()), t;
|
|
823
842
|
}
|
|
824
843
|
//#endregion
|
|
825
844
|
//#region src/framework/hooks/use-reduced-motion.ts
|
|
826
845
|
function jt() {
|
|
827
846
|
if (typeof window > "u" || typeof window.matchMedia != "function") return () => !1;
|
|
828
847
|
let e = window.matchMedia("(prefers-reduced-motion: reduce)"), [t, n] = E(e.matches), r = (e) => n(e.matches);
|
|
829
|
-
return e.addEventListener("change", r),
|
|
848
|
+
return e.addEventListener("change", r), D(() => e.removeEventListener("change", r)), t;
|
|
830
849
|
}
|
|
831
850
|
//#endregion
|
|
832
851
|
//#region src/framework/hooks/use-widget-dialog.ts
|
|
833
852
|
function Mt(e = "controls") {
|
|
834
853
|
let [t, n] = E(!1), [r, i] = E(e), a = (t) => {
|
|
835
854
|
i(t ?? e), n(!0);
|
|
836
|
-
}, o =
|
|
837
|
-
return o?.registerDialogOpener?.(a),
|
|
855
|
+
}, o = O(L);
|
|
856
|
+
return o?.registerDialogOpener?.(a), D(() => o?.registerDialogOpener?.(null)), {
|
|
838
857
|
showDialog: t,
|
|
839
858
|
setShowDialog: n,
|
|
840
859
|
openDialog: a,
|
|
@@ -1298,7 +1317,7 @@ function cn() {
|
|
|
1298
1317
|
//#region src/version.ts
|
|
1299
1318
|
var ln = {
|
|
1300
1319
|
name: "@glasshome/widget-sdk",
|
|
1301
|
-
version: "1.4.
|
|
1320
|
+
version: "1.4.2",
|
|
1302
1321
|
description: "SDK for building GlassHome dashboard widgets with SolidJS",
|
|
1303
1322
|
keywords: [
|
|
1304
1323
|
"glasshome",
|
|
@@ -1350,13 +1369,12 @@ var ln = {
|
|
|
1350
1369
|
"typecheck:test": "tsc --noEmit -p tsconfig.test.json"
|
|
1351
1370
|
},
|
|
1352
1371
|
peerDependencies: {
|
|
1353
|
-
"@glasshome/sync-layer": "0.3.
|
|
1372
|
+
"@glasshome/sync-layer": "0.3.1",
|
|
1354
1373
|
"solid-js": "^1.9.11"
|
|
1355
1374
|
},
|
|
1356
1375
|
dependencies: {
|
|
1357
1376
|
"@glasshome/widget-contract": "0.1.0",
|
|
1358
1377
|
"@modular-forms/solid": "^0.25.1",
|
|
1359
|
-
"@solid-primitives/resize-observer": "^2.1.5",
|
|
1360
1378
|
clsx: "^2.1.1",
|
|
1361
1379
|
"tailwind-merge": "^3.5.0",
|
|
1362
1380
|
zod: "^4.1.13",
|
|
@@ -1382,4 +1400,4 @@ var ln = {
|
|
|
1382
1400
|
engines: { node: ">=18" }
|
|
1383
1401
|
}.version;
|
|
1384
1402
|
//#endregion
|
|
1385
|
-
export { ln as SDK_VERSION, Kt as ToneSchema, H as Widget, Ve as WidgetContent, L as WidgetCtx, kt as WidgetDialog, Ge as WidgetIcon, r as WidgetManifestSchema, ze as WidgetSliderFill, qe as WidgetStatus, Xe as WidgetTitle, st as WidgetValue, g as byDomain, Ze as calculateLightGroup, Qe as calculateSensorGroup, nt as countActiveEntities, on as defineConfig, we as defineWidget, t as deprecations, an as field, n as formatDeprecation, i as formatSchemaError, tt as getEntityAttribute, s as getForecasts, c as getStream, l as getWebRtcClientConfig, u as hassMediaUrl, Fe as injectTokens, cn as isDark, et as isEntityActive, sn as monotoneCubicPath, d as sendWebRtcCandidate, f as startWebRtcSession, p as state, Gt as svgColors, m as trackEntityHistory, h as untrackEntityHistory, _ as useArea, v as useCamera,
|
|
1403
|
+
export { ln as SDK_VERSION, Kt as ToneSchema, H as Widget, Ve as WidgetContent, L as WidgetCtx, kt as WidgetDialog, Ge as WidgetIcon, r as WidgetManifestSchema, ze as WidgetSliderFill, qe as WidgetStatus, Xe as WidgetTitle, st as WidgetValue, g as byDomain, Ze as calculateLightGroup, Qe as calculateSensorGroup, nt as countActiveEntities, on as defineConfig, we as defineWidget, t as deprecations, an as field, n as formatDeprecation, i as formatSchemaError, tt as getEntityAttribute, s as getForecasts, c as getStream, l as getWebRtcClientConfig, u as hassMediaUrl, Fe as injectTokens, cn as isDark, et as isEntityActive, sn as monotoneCubicPath, d as sendWebRtcCandidate, f as startWebRtcSession, p as state, Gt as svgColors, m as trackEntityHistory, h as untrackEntityHistory, _ as useArea, v as useCamera, ee as useConnection, y as useCurrency, b as useEntities, te as useEntity, x as useEntityHistory, ne as useEntityStatistics, re as useForecast, ie as useHassConfig, At as useIntersectionPause, ae as useLocale, jt as useReducedMotion, De as useService, oe as useStore, se as useTemperatureUnit, Ae as useToggle, ke as useTurnOff, Oe as useTurnOn, de as useUnitSystem, Te as useWidgetContext, Mt as useWidgetDialog, Nt as useWidgetEntityGroup, Ht as useWidgetGestures, qt as widgetFields, a as z };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@glasshome/widget-sdk",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.2",
|
|
4
4
|
"description": "SDK for building GlassHome dashboard widgets with SolidJS",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"glasshome",
|
|
@@ -52,13 +52,12 @@
|
|
|
52
52
|
"typecheck:test": "tsc --noEmit -p tsconfig.test.json"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
|
-
"@glasshome/sync-layer": "0.3.
|
|
55
|
+
"@glasshome/sync-layer": "0.3.1",
|
|
56
56
|
"solid-js": "^1.9.11"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@glasshome/widget-contract": "0.1.0",
|
|
60
60
|
"@modular-forms/solid": "^0.25.1",
|
|
61
|
-
"@solid-primitives/resize-observer": "^2.1.5",
|
|
62
61
|
"clsx": "^2.1.1",
|
|
63
62
|
"tailwind-merge": "^3.5.0",
|
|
64
63
|
"zod": "^4.1.13",
|