@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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +140 -122
  3. 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 widgets.
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 y, useCurrency as b, useEntities as x, useEntity as ee, useEntityHistory as S, useEntityStatistics as te, useForecast as ne, useHassConfig as re, useLocale as C, useService as ie, useStore as ae, useTemperatureUnit as oe, useToggle as se, useTurnOff as ce, useTurnOn as le, useUnitSystem as ue } from "@glasshome/sync-layer/solid";
6
- import { Show as w, createContext as de, createEffect as fe, createMemo as T, createSignal as E, on as pe, onCleanup as me, onMount as he, splitProps as ge, useContext as D } from "solid-js";
7
- import { addEventListener as O, className as k, createComponent as A, delegateEvents as _e, effect as j, insert as M, memo as N, setStyleProperty as P, style as F, template as I, use as ve } from "solid-js/web";
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 = de();
34
+ var L = fe();
36
35
  function Te() {
37
- let e = D(L);
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 = D(L)?.callService;
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
- } : ie();
57
+ } : S();
59
58
  }
60
59
  function Oe() {
61
- let e = D(L)?.callService;
62
- return e ? R(e, "turn_on") : le();
60
+ let e = O(L)?.callService;
61
+ return e ? R(e, "turn_on") : ue();
63
62
  }
64
63
  function ke() {
65
- let e = D(L)?.callService;
66
- return e ? R(e, "turn_off") : ce();
64
+ let e = O(L)?.callService;
65
+ return e ? R(e, "turn_off") : le();
67
66
  }
68
67
  function Ae() {
69
- let e = D(L)?.callService;
70
- return e ? R(e, "toggle") : se();
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 j((n) => {
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 && k(t, n.e = r), n.t = F(t, i, n.t), n;
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 M(t, () => e.children), j(() => k(t, V("glasshome-widget-content", e.class))), t;
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 M(n, A(w, {
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), M(n, A(w, {
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), M(r, () => e.icon), j((t) => {
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 && k(n, t.e = r), t.t = F(n, i, t.t), t;
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 M(t, (() => {
259
- var t = N(() => !!e.isUnavailable);
257
+ return N(t, (() => {
258
+ var t = P(() => !!e.isUnavailable);
260
259
  return () => t() ? "Unavailable" : e.children;
261
- })()), j((n) => {
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 && k(t, n.e = r), i !== n.t && P(t, "z-index", n.t = i), n;
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 M(n, () => e.children), M(t, A(w, {
275
+ return N(n, () => e.children), N(t, j(C, {
277
276
  get when() {
278
- return N(() => e.badge !== void 0)() && e.badge > 0;
277
+ return P(() => e.badge !== void 0)() && e.badge > 0;
279
278
  },
280
279
  get children() {
281
280
  var t = Je();
282
- return M(t, () => e.badge), t;
281
+ return N(t, () => e.badge), t;
283
282
  }
284
- }), null), j((n) => {
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 && k(t, n.e = r), i !== n.t && P(t, "z-index", n.t = i), n;
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, y = Math.round(v / 255 * 100), b;
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
- b = `rgb(${Math.round(e * r)}, ${Math.round(t * r)}, ${Math.round(n * r)})`;
345
- } else b = $e(e[0]);
346
- let x;
347
- return x = m ? "All on" : h ? "All off" : r > 0 ? `${r} of ${u} on` : "Off", {
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: y,
354
- color: b,
352
+ brightnessPercent: ee,
353
+ color: y,
355
354
  onCount: r,
356
355
  totalCount: u,
357
- description: x
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 M(n, () => rt(e.value, e.unit)), M(t, A(w, {
514
+ return N(n, () => rt(e.value, e.unit)), N(t, j(C, {
516
515
  get when() {
517
- return N(() => !!e.interpret)() && typeof e.value == "number";
516
+ return P(() => !!e.interpret)() && typeof e.value == "number";
518
517
  },
519
518
  get children() {
520
519
  var t = at();
521
- return M(t, () => it(e.value, e.unit)), t;
520
+ return N(t, () => it(e.value, e.unit)), t;
522
521
  }
523
- }), null), j(() => k(t, V("flex flex-col", e.class))), t;
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 = D(L), [n, r] = E(), i = ye(n);
531
- he(() => {
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 a = {
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
- width: i.width ?? 0,
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
- }), s = T(() => ({
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
- ...o()?.styles?.container,
551
- ...o()?.styles?.cssVars || {},
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
- })), c = () => !!e.gestures && !e.isEditMode, l = (t) => {
557
- c() && e.gestures?.onPointerEnter(t);
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
- c() && e.gestures?.onPointerMove(t);
573
+ l() && e.gestures?.onPointerDown(t);
562
574
  }, f = (t) => {
563
- c() && e.gestures?.onPointerUp(t);
575
+ l() && e.gestures?.onPointerMove(t);
564
576
  }, p = (t) => {
565
- c() && e.gestures?.onPointerCancel(t);
577
+ l() && e.gestures?.onPointerUp(t);
578
+ }, m = (t) => {
579
+ l() && e.gestures?.onPointerCancel(t);
566
580
  };
567
- return A(L.Provider, {
568
- value: a,
581
+ return j(L.Provider, {
582
+ value: o,
569
583
  get children() {
570
584
  var t = ct(), n = t.firstChild;
571
- return O(t, "pointercancel", p), O(t, "pointerup", f), O(t, "pointermove", d), O(t, "pointerdown", u), O(t, "pointerenter", l), ve((t) => {
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), M(n, (() => {
574
- var t = N(() => !!e.emptyState);
575
- return () => t() ? A(ht, {
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
- })()), M(t, (() => {
587
- var t = N(() => !!e.loading);
600
+ })()), N(t, (() => {
601
+ var t = P(() => !!e.loading);
588
602
  return () => t() && (() => {
589
603
  var e = lt();
590
- return j((t) => P(e, "z-index", z.OVERLAY)), e;
604
+ return M((t) => F(e, "z-index", z.OVERLAY)), e;
591
605
  })();
592
- })(), null), j((r) => {
593
- var i = V("glasshome-widget", "relative h-full w-full select-none overflow-hidden rounded-xl border border-border/50", o()?.styles?.class, e.class), a = s(), c = z.CONTENT;
594
- return i !== r.e && k(t, r.e = i), r.t = F(t, a, r.t), c !== r.a && P(n, "z-index", r.a = c), r;
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 M(t, (() => {
607
- var t = N(() => !!e.icon);
620
+ return N(t, (() => {
621
+ var t = P(() => !!e.icon);
608
622
  return () => t() && (() => {
609
623
  var t = dt();
610
- return M(t, () => e.icon), t;
624
+ return N(t, () => e.icon), t;
611
625
  })();
612
- })(), null), M(t, (() => {
613
- var t = N(() => !!e.title);
626
+ })(), null), N(t, (() => {
627
+ var t = P(() => !!e.title);
614
628
  return () => t() && (() => {
615
629
  var t = ft();
616
- return M(t, () => e.title), t;
630
+ return N(t, () => e.title), t;
617
631
  })();
618
- })(), null), M(t, (() => {
619
- var t = N(() => !!e.message);
632
+ })(), null), N(t, (() => {
633
+ var t = P(() => !!e.message);
620
634
  return () => t() && (() => {
621
635
  var t = pt();
622
- return M(t, () => e.message), t;
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(), M(t, A(w, {
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 M(t, () => e.icon), t;
655
+ return N(t, () => e.icon), t;
642
656
  }
643
- }), null), M(t, () => e.label, null), j(() => k(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;
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] = ge(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);
648
- fe(pe(() => t.config, (e) => {
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
- })), fe(pe(() => t.configSchema, (e) => {
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() ? A(te, {
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 = h();
714
+ let e = re();
701
715
  return e.find((e) => e.id === f())?.content ?? e[0]?.content;
702
- }, v = t.ResponsiveDialog, y = t.ResponsiveDialogContent, b = t.ResponsiveDialogHeader, x = t.ResponsiveDialogTitle, ee = t.ResponsiveDialogDescription, S = t.Button, te = t.SchemaForm, ne = (e) => n() ? c(e) : t.onOpenChange(e), re = () => n() ? s() : t.hasUnsavedChanges, C = () => n() ? l : t.onSave;
703
- return A(v, {
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) => ne(e),
726
+ onOpenChange: (e) => ie(e),
708
727
  get children() {
709
- return A(y, {
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
- A(b, {
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 M(e, A(x, {
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), M(e, A(ee, {
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 M(n, () => h().map((e) => A(Ot, {
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
- }))), M(e, A(w, {
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 M(e, _), e;
774
+ return N(e, _), e;
756
775
  })(),
757
- A(w, {
776
+ j(C, {
758
777
  get when() {
759
- return N(() => f() === "edit")() && (C() || t.onDelete) || f() === "debug" && t.debugData !== void 0;
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 M(e, A(w, {
782
+ return N(e, j(C, {
764
783
  get when() {
765
- return N(() => f() === "edit")() && t.onDelete;
784
+ return P(() => f() === "edit")() && t.onDelete;
766
785
  },
767
786
  get children() {
768
- return A(S, {
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), M(e, A(w, {
794
+ }), null), N(e, j(C, {
776
795
  get when() {
777
- return N(() => f() === "edit")() && C();
796
+ return P(() => f() === "edit")() && S();
778
797
  },
779
798
  get children() {
780
- return A(S, {
799
+ return j(x, {
781
800
  size: "sm",
782
801
  get disabled() {
783
- return !re();
802
+ return !ae();
784
803
  },
785
- onClick: () => C()?.(),
804
+ onClick: () => S()?.(),
786
805
  children: "Save"
787
806
  });
788
807
  }
789
- }), null), M(e, A(w, {
808
+ }), null), N(e, j(C, {
790
809
  get when() {
791
- return N(() => f() === "debug")() && t.debugData !== void 0;
810
+ return P(() => f() === "debug")() && t.debugData !== void 0;
792
811
  },
793
812
  get children() {
794
- return A(S, {
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 fe(() => {
838
+ return w(() => {
820
839
  let t = e();
821
840
  r.disconnect(), t && r.observe(t);
822
- }), me(() => r.disconnect()), t;
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), me(() => e.removeEventListener("change", r)), t;
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 = D(L);
837
- return o?.registerDialogOpener?.(a), me(() => o?.registerDialogOpener?.(null)), {
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.0",
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.0",
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, y as useConnection, b as useCurrency, x as useEntities, ee as useEntity, S as useEntityHistory, te as useEntityStatistics, ne as useForecast, re as useHassConfig, At as useIntersectionPause, C as useLocale, jt as useReducedMotion, De as useService, ae as useStore, oe as useTemperatureUnit, Ae as useToggle, ke as useTurnOff, Oe as useTurnOn, ue as useUnitSystem, Te as useWidgetContext, Mt as useWidgetDialog, Nt as useWidgetEntityGroup, Ht as useWidgetGestures, qt as widgetFields, a as z };
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.0",
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.0",
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",