@glasshome/widget-sdk 1.17.1 → 1.18.1
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 +7 -0
- package/dist/framework/components/anatomy.d.ts +1 -1
- package/dist/framework/design-system/z-index.d.ts +0 -1
- package/dist/framework/gestures/use-widget-gestures.d.ts +1 -1
- package/dist/framework/hooks/use-confirm.d.ts +1 -1
- package/dist/framework/index.d.ts +2 -2
- package/dist/framework/types.d.ts +47 -89
- package/dist/framework/utils/empty-state.d.ts +0 -43
- package/dist/framework/utils/index.d.ts +1 -2
- package/dist/framework/variants/built-in-variants.d.ts +2 -39
- package/dist/index.js +156 -202
- package/package.json +35 -30
- package/preview/host.tsx +4 -2
- package/preview/preview.html +8 -3
- package/dist/framework/variants/index.d.ts +0 -7
- package/dist/framework/variants/variant-utils.d.ts +0 -105
package/dist/index.js
CHANGED
|
@@ -468,7 +468,7 @@ function kn(e) {
|
|
|
468
468
|
return Dn();
|
|
469
469
|
}
|
|
470
470
|
}), r), F(r, () => e.icon), P((t) => {
|
|
471
|
-
var r = X("glasshome-widget-icon glass glass-tint", "relative flex shrink-0 items-center justify-center
|
|
471
|
+
var r = X("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;
|
|
472
472
|
return r !== t.e && M(n, t.e = r), t.t = z(n, i, t.t), t;
|
|
473
473
|
}, {
|
|
474
474
|
e: void 0,
|
|
@@ -706,7 +706,7 @@ function Qn(e) {
|
|
|
706
706
|
}
|
|
707
707
|
//#endregion
|
|
708
708
|
//#region src/framework/theming/tokens.css?raw
|
|
709
|
-
var $n = "/* 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.70 0.18 145);\n --tone-warning: oklch(0.80 0.17 75);\n --tone-danger: oklch(0.64 0.22 27);\n --tone-info: oklch(0.66 0.20 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.70 0.20 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(22px, calc(8.5px + 13.4 * var(--widget-unit)), calc(16 * var(--widget-unit)));\n --widget-text-name: max(14px, calc(8.9px + 4.37 * var(--widget-unit)), calc(7.07 * var(--widget-unit)));\n --widget-text-meta: max(11px, calc(8px + 2.44 * var(--widget-unit)), calc(4.88 * var(--widget-unit)));\n --widget-text-sub: max(12px, calc(10.1px + 1.22 * var(--widget-unit)), calc(4.3 * var(--widget-unit)));\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(10px, calc(1.2px + 5.64 * var(--widget-unit)), calc(6 * var(--widget-unit)));\n --widget-grid-gap: max(6px, calc(2.5px + 2.23 * var(--widget-unit)));\n --widget-icon-box: max(44px, calc(31.3px + 8.14 * var(--widget-unit)), calc(17.7 * var(--widget-unit)));\n --widget-icon-glyph: max(24px, calc(16px + 5.12 * var(--widget-unit)), calc(10 * var(--widget-unit)));\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 > * { align-items: center; text-align: center; }\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 { font-size: clamp(11px, 6cqmin, 14px); max-width: 100%; }\n .glasshome-widget-status,\n .glasshome-widget-value { font-size: clamp(13px, 7cqmin, 17px); }\n .glasshome-widget-content [class*=\"ml-auto\"] { margin-left: 0 !important; }\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 { translate: var(--stack-step) var(--stack-step); opacity: 0.45; z-index: -2; }\n.glasshome-widget-icon-stack-3 { translate: calc(2 * var(--stack-step)) calc(2 * var(--stack-step)); opacity: 0.2; z-index: -3; }\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(in srgb, var(--widget-color) calc(var(--widget-wash) * var(--material-tint, 1)), transparent),\n color-mix(\n in srgb,\n var(--widget-color-to, var(--widget-color)) 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 > :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(calc(100% - 2 * var(--widget-grid-pad) - var(--widget-icon-box) - var(--widget-grid-gap)), 48cqi);\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(100%, calc((52cqi - 2 * var(--widget-grid-pad) - var(--widget-grid-gap)) / var(--art-aspect, 1)));\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% -\n 2 *\n var(--widget-grid-pad) -\n var(--widget-icon-box) -\n 2 *\n 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(calc(100% - 2 * var(--widget-grid-pad) - var(--widget-icon-box) - var(--widget-grid-gap)), 48cqi);\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) :is(.glasshome-widget-reading-value, .glasshome-widget-sub, .glasshome-widget-name, .glasshome-widget-eyebrow) {\n text-shadow: 0 1px 8px color-mix(in oklch, var(--card) 75%, transparent);\n}\n.glasshome-widget-grid:has(> .glasshome-widget-backdrop) :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 :is(.glasshome-widget-control, .glasshome-widget-control-wide) :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(:has(> .glasshome-widget-backdrop), :has(> .glasshome-widget-hero[data-art], > .glasshome-widget-art, > .glasshome-widget-layer))\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 [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-morph, 400ms);\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", er = !1, tr, nr = /* @__PURE__ */ new WeakSet();
|
|
709
|
+
var $n = "/* 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-morph, 400ms);\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", er = !1, tr, nr = /* @__PURE__ */ new WeakSet();
|
|
710
710
|
function rr() {
|
|
711
711
|
return tr || (tr = new CSSStyleSheet(), tr.replaceSync($n.replace(/:root\b/g, ":host").replace(/^\.dark\b/gm, ":host(.dark)"))), tr;
|
|
712
712
|
}
|
|
@@ -727,87 +727,30 @@ function ir(e) {
|
|
|
727
727
|
let n = t.createElement("style");
|
|
728
728
|
n.setAttribute("data-glasshome-tokens", ""), n.textContent = $n, t.head.appendChild(n), er = !0;
|
|
729
729
|
}
|
|
730
|
+
//#endregion
|
|
731
|
+
//#region src/framework/variants/built-in-variants.ts
|
|
730
732
|
var ar = {
|
|
731
|
-
"classic-glass": {
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
focus: !0,
|
|
750
|
-
hoverScale: 1.02,
|
|
751
|
-
activeScale: .98
|
|
752
|
-
}
|
|
753
|
-
},
|
|
754
|
-
minimal: {
|
|
755
|
-
id: "minimal",
|
|
756
|
-
name: "Minimal",
|
|
757
|
-
description: "Clean, minimal design with no background effects",
|
|
758
|
-
styles: { cssVars: {
|
|
759
|
-
"--widget-padding": "1rem",
|
|
760
|
-
"--glass-base": "transparent",
|
|
761
|
-
"--glass-wash": "0%",
|
|
762
|
-
"--glass-light": "0",
|
|
763
|
-
"--glass-rim": "0",
|
|
764
|
-
"--glass-lift": "0",
|
|
765
|
-
"--glass-edge": "transparent"
|
|
766
|
-
} },
|
|
767
|
-
layout: {
|
|
768
|
-
type: "flex",
|
|
769
|
-
direction: "column",
|
|
770
|
-
align: "start",
|
|
771
|
-
justify: "start",
|
|
772
|
-
gap: "0.5rem"
|
|
773
|
-
},
|
|
774
|
-
elements: { visible: {
|
|
775
|
-
background: !1,
|
|
776
|
-
decorations: !1
|
|
777
|
-
} },
|
|
778
|
-
interactions: {
|
|
779
|
-
hover: !1,
|
|
780
|
-
active: !1,
|
|
781
|
-
focus: !0
|
|
782
|
-
}
|
|
783
|
-
},
|
|
784
|
-
"compact-horizontal": {
|
|
785
|
-
id: "compact-horizontal",
|
|
786
|
-
name: "Compact Horizontal",
|
|
787
|
-
description: "Horizontal layout for compact widgets",
|
|
788
|
-
styles: { cssVars: {
|
|
789
|
-
"--widget-padding": "1rem",
|
|
790
|
-
"--widget-icon-size": "2.5rem",
|
|
791
|
-
"--widget-backdrop": "blur(16px) saturate(1.8)"
|
|
792
|
-
} },
|
|
793
|
-
layout: {
|
|
794
|
-
type: "flex",
|
|
795
|
-
direction: "row",
|
|
796
|
-
align: "center",
|
|
797
|
-
justify: "start",
|
|
798
|
-
gap: "1rem"
|
|
799
|
-
},
|
|
800
|
-
interactions: {
|
|
801
|
-
hover: !0,
|
|
802
|
-
active: !0,
|
|
803
|
-
focus: !0,
|
|
804
|
-
hoverScale: 1.02,
|
|
805
|
-
activeScale: .98
|
|
806
|
-
}
|
|
807
|
-
}
|
|
733
|
+
"classic-glass": { cssVars: {
|
|
734
|
+
"--widget-padding": "1.5rem",
|
|
735
|
+
"--widget-backdrop": "blur(var(--glass-blur, var(--material-blur, 24px))) saturate(1.8)"
|
|
736
|
+
} },
|
|
737
|
+
minimal: { cssVars: {
|
|
738
|
+
"--widget-padding": "1rem",
|
|
739
|
+
"--glass-base": "transparent",
|
|
740
|
+
"--glass-wash": "0%",
|
|
741
|
+
"--glass-light": "0",
|
|
742
|
+
"--glass-rim": "0",
|
|
743
|
+
"--glass-lift": "0",
|
|
744
|
+
"--glass-edge": "transparent"
|
|
745
|
+
} },
|
|
746
|
+
"compact-horizontal": { cssVars: {
|
|
747
|
+
"--widget-padding": "1rem",
|
|
748
|
+
"--widget-icon-size": "2.5rem",
|
|
749
|
+
"--widget-backdrop": "blur(16px) saturate(1.8)"
|
|
750
|
+
} }
|
|
808
751
|
};
|
|
809
752
|
function or(e) {
|
|
810
|
-
return ar[e];
|
|
753
|
+
return Object.hasOwn(ar, e) ? ar[e] : void 0;
|
|
811
754
|
}
|
|
812
755
|
//#endregion
|
|
813
756
|
//#region src/framework/backgrounds/WidgetSliderFill.tsx
|
|
@@ -922,7 +865,8 @@ function xr(e = 2e3) {
|
|
|
922
865
|
//#endregion
|
|
923
866
|
//#region src/framework/utils/entity-aggregation.ts
|
|
924
867
|
function Sr(e, t = !1) {
|
|
925
|
-
|
|
868
|
+
let n = e[0];
|
|
869
|
+
if (!n) return {
|
|
926
870
|
isGroup: !1,
|
|
927
871
|
state: "unknown",
|
|
928
872
|
isOn: !1,
|
|
@@ -934,84 +878,85 @@ function Sr(e, t = !1) {
|
|
|
934
878
|
totalCount: 0,
|
|
935
879
|
description: "No entities"
|
|
936
880
|
};
|
|
937
|
-
let
|
|
938
|
-
if (!
|
|
939
|
-
let
|
|
881
|
+
let r = e.length > 1;
|
|
882
|
+
if (!r) {
|
|
883
|
+
let e = n, t = e.state === "on", r = e.attributes?.brightness || 0, i = Math.round(r / 255 * 100);
|
|
940
884
|
return {
|
|
941
885
|
isGroup: !1,
|
|
942
|
-
state:
|
|
943
|
-
isOn:
|
|
944
|
-
isUnavailable:
|
|
886
|
+
state: e.state,
|
|
887
|
+
isOn: t,
|
|
888
|
+
isUnavailable: e.state === "unavailable",
|
|
945
889
|
brightness: r,
|
|
946
890
|
brightnessPercent: i,
|
|
947
|
-
color: Tr(
|
|
948
|
-
onCount: +!!
|
|
891
|
+
color: Tr(e),
|
|
892
|
+
onCount: +!!t,
|
|
949
893
|
totalCount: 1,
|
|
950
|
-
description:
|
|
894
|
+
description: t ? "On" : "Off"
|
|
951
895
|
};
|
|
952
896
|
}
|
|
953
|
-
let
|
|
897
|
+
let i = 0, a = 0, o = 0, s = 0, c = 0, l = 0, u = [];
|
|
954
898
|
for (let t of e) switch (t.state) {
|
|
955
899
|
case "on":
|
|
956
|
-
if (
|
|
900
|
+
if (i++, t.attributes?.brightness !== void 0 && (c += t.attributes.brightness, l++), t.attributes?.rgb_color) u.push(t.attributes.rgb_color);
|
|
957
901
|
else if (t.attributes?.hs_color) {
|
|
958
902
|
let [e, n] = t.attributes.hs_color;
|
|
959
|
-
|
|
903
|
+
u.push(wr(e, n));
|
|
960
904
|
}
|
|
961
905
|
break;
|
|
962
906
|
case "off":
|
|
963
|
-
|
|
907
|
+
a++;
|
|
964
908
|
break;
|
|
965
909
|
case "unknown":
|
|
966
|
-
|
|
910
|
+
o++;
|
|
967
911
|
break;
|
|
968
|
-
case "unavailable":
|
|
912
|
+
case "unavailable": s++;
|
|
969
913
|
}
|
|
970
|
-
let
|
|
971
|
-
t ?
|
|
972
|
-
let
|
|
973
|
-
if (
|
|
974
|
-
let e = Math.round(
|
|
975
|
-
|
|
976
|
-
} else
|
|
977
|
-
let
|
|
978
|
-
return
|
|
979
|
-
isGroup:
|
|
980
|
-
state:
|
|
981
|
-
isOn:
|
|
982
|
-
isUnavailable:
|
|
983
|
-
brightness:
|
|
984
|
-
brightnessPercent:
|
|
985
|
-
color:
|
|
986
|
-
onCount:
|
|
987
|
-
totalCount:
|
|
988
|
-
description:
|
|
914
|
+
let d = e.length, f = s === d, p = o + s === d, m = i > 0, h = i === d, g = a === d, _, v;
|
|
915
|
+
t ? f ? (_ = "unavailable", v = !1) : o > 0 || s > 0 ? (_ = "unknown", v = !1) : a > 0 ? (_ = "off", v = !1) : (_ = "on", v = !0) : f ? (_ = "unavailable", v = !1) : p ? (_ = "unknown", v = !1) : m ? (_ = "on", v = !0) : (_ = "off", v = !1);
|
|
916
|
+
let y = l > 0 ? Math.round(c / l) : 0, b = Math.round(y / 255 * 100), x;
|
|
917
|
+
if (u.length > 0) {
|
|
918
|
+
let e = Math.round(u.reduce((e, t) => e + t[0], 0) / u.length), t = Math.round(u.reduce((e, t) => e + t[1], 0) / u.length), n = Math.round(u.reduce((e, t) => e + t[2], 0) / u.length), r = y / 255;
|
|
919
|
+
x = `rgb(${Math.round(e * r)}, ${Math.round(t * r)}, ${Math.round(n * r)})`;
|
|
920
|
+
} else x = Tr(n);
|
|
921
|
+
let S;
|
|
922
|
+
return S = h ? "All on" : g ? "All off" : i > 0 ? `${i} of ${d} on` : "Off", {
|
|
923
|
+
isGroup: r,
|
|
924
|
+
state: _,
|
|
925
|
+
isOn: v,
|
|
926
|
+
isUnavailable: _ === "unavailable",
|
|
927
|
+
brightness: y,
|
|
928
|
+
brightnessPercent: b,
|
|
929
|
+
color: x,
|
|
930
|
+
onCount: i,
|
|
931
|
+
totalCount: d,
|
|
932
|
+
description: S
|
|
989
933
|
};
|
|
990
934
|
}
|
|
991
935
|
function Cr(e, t = "mean", n = !0) {
|
|
992
|
-
|
|
936
|
+
let r = e[0];
|
|
937
|
+
if (!r) return {
|
|
993
938
|
isGroup: !1,
|
|
994
939
|
state: "unknown",
|
|
995
940
|
numericValue: null,
|
|
996
941
|
isUnavailable: !0,
|
|
997
942
|
description: "No entities"
|
|
998
943
|
};
|
|
999
|
-
let
|
|
1000
|
-
if (!
|
|
1001
|
-
let
|
|
1002
|
-
return Number.isNaN(
|
|
944
|
+
let i = e.length > 1;
|
|
945
|
+
if (!i) {
|
|
946
|
+
let e = r, t = Number.parseFloat(e.state), n = e.state;
|
|
947
|
+
return Number.isNaN(t) || (n = Number.isInteger(t) ? t.toString() : t.toFixed(1)), {
|
|
1003
948
|
isGroup: !1,
|
|
1004
|
-
state:
|
|
1005
|
-
numericValue: Number.isNaN(
|
|
1006
|
-
isUnavailable:
|
|
1007
|
-
unit:
|
|
1008
|
-
description:
|
|
949
|
+
state: n,
|
|
950
|
+
numericValue: Number.isNaN(t) ? null : t,
|
|
951
|
+
isUnavailable: e.state === "unavailable",
|
|
952
|
+
unit: e.unitOfMeasurement ?? void 0,
|
|
953
|
+
description: n
|
|
1009
954
|
};
|
|
1010
955
|
}
|
|
1011
|
-
let
|
|
956
|
+
let a = [], o = [], s = 0, c;
|
|
1012
957
|
for (let t of e) {
|
|
1013
|
-
if (!
|
|
1014
|
-
|
|
958
|
+
if (!c && t.unitOfMeasurement && (c = t.unitOfMeasurement), t.state === "unavailable") {
|
|
959
|
+
s++, o.push({
|
|
1015
960
|
entityId: t.id,
|
|
1016
961
|
value: "unavailable",
|
|
1017
962
|
friendly_name: t.friendlyName
|
|
@@ -1019,69 +964,69 @@ function Cr(e, t = "mean", n = !0) {
|
|
|
1019
964
|
continue;
|
|
1020
965
|
}
|
|
1021
966
|
let e = Number.parseFloat(t.state);
|
|
1022
|
-
isNaN(e) ? n ||
|
|
967
|
+
isNaN(e) ? n || o.push({
|
|
1023
968
|
entityId: t.id,
|
|
1024
969
|
value: t.state,
|
|
1025
970
|
friendly_name: t.friendlyName
|
|
1026
|
-
}) : (
|
|
971
|
+
}) : (a.push(e), o.push({
|
|
1027
972
|
entityId: t.id,
|
|
1028
973
|
value: e,
|
|
1029
974
|
friendly_name: t.friendlyName
|
|
1030
975
|
}));
|
|
1031
976
|
}
|
|
1032
|
-
let
|
|
1033
|
-
if (
|
|
1034
|
-
isGroup:
|
|
1035
|
-
state:
|
|
977
|
+
let l = s === e.length, u = a.at(-1);
|
|
978
|
+
if (l || u === void 0) return {
|
|
979
|
+
isGroup: i,
|
|
980
|
+
state: l ? "unavailable" : "unknown",
|
|
1036
981
|
numericValue: null,
|
|
1037
|
-
isUnavailable:
|
|
1038
|
-
unit:
|
|
1039
|
-
description:
|
|
1040
|
-
memberValues:
|
|
982
|
+
isUnavailable: l,
|
|
983
|
+
unit: c,
|
|
984
|
+
description: l ? "Unavailable" : "No numeric values",
|
|
985
|
+
memberValues: o
|
|
1041
986
|
};
|
|
1042
|
-
let
|
|
987
|
+
let d, f;
|
|
1043
988
|
switch (t) {
|
|
1044
989
|
case "min":
|
|
1045
|
-
|
|
990
|
+
d = Math.min(...a), f = "Minimum";
|
|
1046
991
|
break;
|
|
1047
992
|
case "max":
|
|
1048
|
-
|
|
993
|
+
d = Math.max(...a), f = "Maximum";
|
|
1049
994
|
break;
|
|
1050
995
|
case "mean":
|
|
1051
|
-
|
|
996
|
+
d = a.reduce((e, t) => e + t, 0) / a.length, f = "Average";
|
|
1052
997
|
break;
|
|
1053
998
|
case "median": {
|
|
1054
|
-
let e = [...
|
|
1055
|
-
|
|
999
|
+
let e = [...a].sort((e, t) => e - t), t = Math.floor(e.length / 2), n = e[t] ?? u;
|
|
1000
|
+
d = e.length % 2 == 0 ? ((e[t - 1] ?? n) + n) / 2 : n, f = "Median";
|
|
1056
1001
|
break;
|
|
1057
1002
|
}
|
|
1058
1003
|
case "sum":
|
|
1059
|
-
|
|
1004
|
+
d = a.reduce((e, t) => e + t, 0), f = "Sum";
|
|
1060
1005
|
break;
|
|
1061
1006
|
case "last":
|
|
1062
|
-
|
|
1007
|
+
d = u, f = "Latest";
|
|
1063
1008
|
break;
|
|
1064
1009
|
case "range":
|
|
1065
|
-
|
|
1010
|
+
d = Math.max(...a) - Math.min(...a), f = "Range";
|
|
1066
1011
|
break;
|
|
1067
1012
|
case "product":
|
|
1068
|
-
|
|
1013
|
+
d = a.reduce((e, t) => e * t, 1), f = "Product";
|
|
1069
1014
|
break;
|
|
1070
1015
|
case "std_dev": {
|
|
1071
|
-
let e =
|
|
1072
|
-
|
|
1016
|
+
let e = a.reduce((e, t) => e + t, 0) / a.length, t = a.reduce((t, n) => t + (n - e) ** 2, 0) / a.length;
|
|
1017
|
+
d = Math.sqrt(t), f = "Std Dev";
|
|
1073
1018
|
break;
|
|
1074
1019
|
}
|
|
1075
|
-
default:
|
|
1020
|
+
default: d = a.reduce((e, t) => e + t, 0) / a.length, f = "Average";
|
|
1076
1021
|
}
|
|
1077
1022
|
return {
|
|
1078
|
-
isGroup:
|
|
1079
|
-
state: Number.isInteger(
|
|
1080
|
-
numericValue:
|
|
1023
|
+
isGroup: i,
|
|
1024
|
+
state: Number.isInteger(d) ? d.toString() : d.toFixed(1),
|
|
1025
|
+
numericValue: d,
|
|
1081
1026
|
isUnavailable: !1,
|
|
1082
|
-
unit:
|
|
1083
|
-
description: `${
|
|
1084
|
-
memberValues:
|
|
1027
|
+
unit: c,
|
|
1028
|
+
description: `${f} of ${a.length}`,
|
|
1029
|
+
memberValues: o
|
|
1085
1030
|
};
|
|
1086
1031
|
}
|
|
1087
1032
|
function wr(e, t) {
|
|
@@ -1168,7 +1113,7 @@ function Nr(e) {
|
|
|
1168
1113
|
}
|
|
1169
1114
|
//#endregion
|
|
1170
1115
|
//#region src/framework/core/Widget.tsx
|
|
1171
|
-
var Pr = /*#__PURE__*/ B("<span class=glasshome-widget-hold-flood aria-hidden=true>"), Fr = /*#__PURE__*/ B("<div><div class=\"relative h-full w-full\">"), Ir = /*#__PURE__*/ B("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), Lr = /*#__PURE__*/ B("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), Rr = /*#__PURE__*/ B("<div class=\"flex items-center justify-center
|
|
1116
|
+
var Pr = /*#__PURE__*/ B("<span class=glasshome-widget-hold-flood aria-hidden=true>"), Fr = /*#__PURE__*/ B("<div><div class=\"relative h-full w-full\">"), Ir = /*#__PURE__*/ B("<div class=\"glasshome-widget-loading pointer-events-none absolute inset-0 animate-pulse\">"), Lr = /*#__PURE__*/ B("<div class=\"flex h-full w-full flex-col items-center justify-center gap-2 text-center\">"), Rr = /*#__PURE__*/ B("<div class=\"text-muted-foreground flex items-center justify-center\">"), zr = /*#__PURE__*/ B("<h3 class=\"text-foreground text-sm font-semibold\">"), Br = /*#__PURE__*/ B("<p class=\"text-muted-foreground text-xs\">");
|
|
1172
1117
|
function Vr(t) {
|
|
1173
1118
|
let n = A(W), r = xn(() => ({ hold: { action: () => (q.get(n ?? {}) ?? q.get(d))?.("edit") } }));
|
|
1174
1119
|
k(r.dispose);
|
|
@@ -1206,13 +1151,13 @@ function Vr(t) {
|
|
|
1206
1151
|
};
|
|
1207
1152
|
n && Object.defineProperty(d, tn, { value: n });
|
|
1208
1153
|
let f = D(() => {
|
|
1209
|
-
if (t.variant) return typeof t.variant == "string" ? or(t.variant) : t.variant;
|
|
1154
|
+
if (t.variant) return typeof t.variant == "string" ? or(t.variant) : t.variant.styles;
|
|
1210
1155
|
}), p = e(() => t.gradient, "widget.gradient"), m = D(() => ({
|
|
1211
1156
|
"container-type": "size",
|
|
1212
1157
|
"container-name": "widget",
|
|
1213
1158
|
"touch-action": o() && !t.isEditMode ? o()?.touchAction() : void 0,
|
|
1214
|
-
...f()?.
|
|
1215
|
-
...f()?.
|
|
1159
|
+
...f()?.container,
|
|
1160
|
+
...f()?.cssVars || {},
|
|
1216
1161
|
...t.tone ? { "--widget-color": `var(--tone-${t.tone})` } : {},
|
|
1217
1162
|
...t.color ? { "--widget-color": t.color } : {},
|
|
1218
1163
|
...t.tone && t.tone !== "neutral" || t.color ? { "--glass-tone": "var(--widget-color)" } : {},
|
|
@@ -1295,7 +1240,7 @@ function Vr(t) {
|
|
|
1295
1240
|
return P((t) => R(e, "z-index", K.OVERLAY)), e;
|
|
1296
1241
|
})();
|
|
1297
1242
|
})(), null), P((r) => {
|
|
1298
|
-
var i = X("glasshome-widget glass", "relative h-full w-full
|
|
1243
|
+
var i = X("glasshome-widget glass", "relative h-full w-full overflow-hidden rounded-xl select-none", f()?.class, t.class), a = m(), o = t.confirmed || void 0, s = h() ? 0 : void 0, c = K.CONTENT;
|
|
1299
1244
|
return i !== r.e && M(e, r.e = i), r.t = z(e, a, r.t), o !== r.a && L(e, "data-confirmed", r.a = o), s !== r.o && L(e, "tabindex", r.o = s), c !== r.i && R(n, "z-index", r.i = c), r;
|
|
1300
1245
|
}, {
|
|
1301
1246
|
e: void 0,
|
|
@@ -1742,7 +1687,7 @@ function vi(e) {
|
|
|
1742
1687
|
}
|
|
1743
1688
|
//#endregion
|
|
1744
1689
|
//#region src/framework/dialogs/debug-view.tsx
|
|
1745
|
-
var yi = /*#__PURE__*/ B("<pre class=\"max-h-64 overflow-auto p-3 font-mono text-
|
|
1690
|
+
var yi = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-64 overflow-auto p-3 font-mono text-xs leading-relaxed\">"), bi = /*#__PURE__*/ B("<span class=\"flex items-center gap-2\">"), xi = /*#__PURE__*/ B("<section class=\"flex min-w-0 flex-col gap-2\"><header class=\"flex items-center gap-3\"><div class=\"flex min-w-0 flex-1 flex-col\"></div></header><div class=\"flex flex-col gap-2\">"), Si = /*#__PURE__*/ B("<div class=\"flex flex-col\">"), Ci = /*#__PURE__*/ B("<pre class=\"text-muted-foreground max-h-96 overflow-auto p-3 font-mono text-xs leading-relaxed whitespace-pre-wrap\">");
|
|
1746
1691
|
function wi(e, t, n) {
|
|
1747
1692
|
return {
|
|
1748
1693
|
widgetConfig: e,
|
|
@@ -1797,7 +1742,7 @@ function ki(e) {
|
|
|
1797
1742
|
let t = e.replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ");
|
|
1798
1743
|
return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
|
|
1799
1744
|
}
|
|
1800
|
-
var Ai = (e) => typeof e != "object"
|
|
1745
|
+
var Ai = (e) => e === null || typeof e != "object" && typeof e != "function";
|
|
1801
1746
|
function ji(e) {
|
|
1802
1747
|
return e == null ? "None" : String(e);
|
|
1803
1748
|
}
|
|
@@ -1828,7 +1773,7 @@ function Fi(e) {
|
|
|
1828
1773
|
},
|
|
1829
1774
|
get children() {
|
|
1830
1775
|
return [N(Se, {
|
|
1831
|
-
class: "
|
|
1776
|
+
class: "text-muted-foreground py-3 text-xs",
|
|
1832
1777
|
get children() {
|
|
1833
1778
|
var t = bi();
|
|
1834
1779
|
return F(t, () => e.label, null), F(t, N(w, {
|
|
@@ -1884,7 +1829,7 @@ function Ii(e) {
|
|
|
1884
1829
|
})();
|
|
1885
1830
|
}
|
|
1886
1831
|
function Li(e) {
|
|
1887
|
-
let t = D(() => Object.entries(e.record)), n = D(() => t().
|
|
1832
|
+
let t = D(() => Object.entries(e.record)), n = D(() => t().flatMap(([e, t]) => Ai(t) ? [[e, t]] : [])), r = D(() => t().filter(([, e]) => !Ai(e)));
|
|
1888
1833
|
return N(w, {
|
|
1889
1834
|
get when() {
|
|
1890
1835
|
return t().length > 0;
|
|
@@ -2126,7 +2071,7 @@ function Ui(e, t) {
|
|
|
2126
2071
|
}
|
|
2127
2072
|
//#endregion
|
|
2128
2073
|
//#region src/framework/dialogs/WidgetDialog.tsx
|
|
2129
|
-
var Wi = /*#__PURE__*/ B("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\">"), Gi = /*#__PURE__*/ B("<div class=\"
|
|
2074
|
+
var Wi = /*#__PURE__*/ B("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\">"), Gi = /*#__PURE__*/ B("<div class=\"bg-muted/30 rounded-lg p-2 text-center md:p-6\"><p class=\"text-muted-foreground text-sm\">No edit options available"), Ki = /*#__PURE__*/ B("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><line x1=4 y1=21 x2=4 y2=14></line><line x1=4 y1=10 x2=4 y2=3></line><line x1=12 y1=21 x2=12 y2=12></line><line x1=12 y1=8 x2=12 y2=3></line><line x1=20 y1=21 x2=20 y2=16></line><line x1=20 y1=12 x2=20 y2=3></line><line x1=1 y1=14 x2=7 y2=14></line><line x1=9 y1=8 x2=15 y2=8></line><line x1=17 y1=16 x2=23 y2=16>"), qi = /*#__PURE__*/ B("<svg xmlns=http://www.w3.org/2000/svg class=size-3.5 fill=none viewBox=\"0 0 24 24\"stroke=currentColor stroke-width=2><path d=\"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\">"), Ji = /*#__PURE__*/ B("<div class=glasshome-sheet>"), Yi = /*#__PURE__*/ B("<div class=glasshome-sheet-band aria-hidden=true><img alt>"), Xi = /*#__PURE__*/ B("<span class=\"glasshome-widget-icon glass glass-tint glasshome-sheet-icon\">"), Zi = /*#__PURE__*/ B("<span class=\"inline-flex size-3.5 shrink-0 items-center\">"), Qi = (e) => Wt(e), $i = {
|
|
2130
2075
|
sm: "sm",
|
|
2131
2076
|
md: "md",
|
|
2132
2077
|
lg: "lg",
|
|
@@ -2162,13 +2107,17 @@ function ta(e) {
|
|
|
2162
2107
|
}, [f, p] = O(t.defaultTab ?? "controls"), m = () => t.activeTab ?? f(), h = (e) => {
|
|
2163
2108
|
t.onActiveTabChange ? t.onActiveTabChange(e) : p(e);
|
|
2164
2109
|
}, g = () => $i[t.maxWidth ?? "xl"], _ = () => {
|
|
2165
|
-
if (t.tabs) return t.tabs
|
|
2110
|
+
if (t.tabs) return t.tabs.map((e) => ({
|
|
2111
|
+
...e,
|
|
2112
|
+
icon: () => e.icon,
|
|
2113
|
+
content: () => e.content
|
|
2114
|
+
}));
|
|
2166
2115
|
let e = [];
|
|
2167
2116
|
return e.push({
|
|
2168
2117
|
id: "edit",
|
|
2169
2118
|
label: "Edit",
|
|
2170
|
-
icon: Wi(),
|
|
2171
|
-
content: t.editContent ?? (() => {
|
|
2119
|
+
icon: () => Wi(),
|
|
2120
|
+
content: () => t.editContent ?? (() => {
|
|
2172
2121
|
let e = t.SchemaForm, o = n() ? a() : void 0;
|
|
2173
2122
|
return !o || !e ? Gi() : N(e, {
|
|
2174
2123
|
schema: o,
|
|
@@ -2184,8 +2133,8 @@ function ta(e) {
|
|
|
2184
2133
|
}), e.push({
|
|
2185
2134
|
id: "controls",
|
|
2186
2135
|
label: "Controls",
|
|
2187
|
-
icon: Ki(),
|
|
2188
|
-
content: t.controlsContent ?? N(Be, { get children() {
|
|
2136
|
+
icon: () => Ki(),
|
|
2137
|
+
content: () => t.controlsContent ?? N(Be, { get children() {
|
|
2189
2138
|
return N(He, { get children() {
|
|
2190
2139
|
return [N(Ue, { children: "No controls" }), N(Ve, { children: "This widget is shown as is." })];
|
|
2191
2140
|
} });
|
|
@@ -2193,8 +2142,8 @@ function ta(e) {
|
|
|
2193
2142
|
}), e.push({
|
|
2194
2143
|
id: "debug",
|
|
2195
2144
|
label: "Debug",
|
|
2196
|
-
icon: qi(),
|
|
2197
|
-
content: t.debugContent ?? N(Vi, { get data() {
|
|
2145
|
+
icon: () => qi(),
|
|
2146
|
+
content: () => t.debugContent ?? N(Vi, { get data() {
|
|
2198
2147
|
return t.debugData;
|
|
2199
2148
|
} })
|
|
2200
2149
|
}), e;
|
|
@@ -2328,7 +2277,7 @@ function ta(e) {
|
|
|
2328
2277
|
get children() {
|
|
2329
2278
|
return [(() => {
|
|
2330
2279
|
var t = Zi();
|
|
2331
|
-
return F(t, () => e.icon), t;
|
|
2280
|
+
return F(t, () => e.icon()), t;
|
|
2332
2281
|
})(), I(() => e.label)];
|
|
2333
2282
|
}
|
|
2334
2283
|
})
|
|
@@ -2366,7 +2315,7 @@ function ta(e) {
|
|
|
2366
2315
|
return e.id;
|
|
2367
2316
|
},
|
|
2368
2317
|
get children() {
|
|
2369
|
-
return e.content;
|
|
2318
|
+
return e.content();
|
|
2370
2319
|
}
|
|
2371
2320
|
})
|
|
2372
2321
|
});
|
|
@@ -2829,17 +2778,30 @@ function Qa() {
|
|
|
2829
2778
|
//#region src/version.ts
|
|
2830
2779
|
var $a = {
|
|
2831
2780
|
name: "@glasshome/widget-sdk",
|
|
2832
|
-
version: "1.
|
|
2781
|
+
version: "1.18.1",
|
|
2833
2782
|
description: "SDK for building GlassHome dashboard widgets with SolidJS",
|
|
2834
2783
|
keywords: [
|
|
2784
|
+
"dashboard",
|
|
2835
2785
|
"glasshome",
|
|
2836
|
-
"
|
|
2786
|
+
"home-assistant",
|
|
2837
2787
|
"sdk",
|
|
2788
|
+
"smart-home",
|
|
2838
2789
|
"solidjs",
|
|
2839
2790
|
"vite",
|
|
2840
|
-
"
|
|
2841
|
-
|
|
2842
|
-
|
|
2791
|
+
"widget"
|
|
2792
|
+
],
|
|
2793
|
+
homepage: "https://github.com/glasshome/widget-sdk#readme",
|
|
2794
|
+
bugs: { url: "https://github.com/glasshome/widget-sdk/issues" },
|
|
2795
|
+
license: "MIT",
|
|
2796
|
+
author: "GlassHome Labs",
|
|
2797
|
+
repository: {
|
|
2798
|
+
type: "git",
|
|
2799
|
+
url: "https://github.com/glasshome/widget-sdk.git"
|
|
2800
|
+
},
|
|
2801
|
+
files: [
|
|
2802
|
+
"dist",
|
|
2803
|
+
"preview",
|
|
2804
|
+
"tailwind-sources.css"
|
|
2843
2805
|
],
|
|
2844
2806
|
type: "module",
|
|
2845
2807
|
sideEffects: !1,
|
|
@@ -2874,27 +2836,19 @@ var $a = {
|
|
|
2874
2836
|
"./tailwind-sources": "./tailwind-sources.css",
|
|
2875
2837
|
"./package.json": "./package.json"
|
|
2876
2838
|
},
|
|
2877
|
-
|
|
2878
|
-
"dist",
|
|
2879
|
-
"preview",
|
|
2880
|
-
"tailwind-sources.css"
|
|
2881
|
-
],
|
|
2839
|
+
publishConfig: { access: "public" },
|
|
2882
2840
|
scripts: {
|
|
2883
2841
|
build: "vite build && tsc && bun scripts/check-host-singleton.ts",
|
|
2884
2842
|
dev: "vite build --watch",
|
|
2885
2843
|
test: "bun test src && vitest run",
|
|
2886
2844
|
"test:dom": "vitest run",
|
|
2887
2845
|
"test:dom:watch": "vitest",
|
|
2888
|
-
"typecheck:test": "tsc --noEmit -p tsconfig.test.json"
|
|
2889
|
-
|
|
2890
|
-
|
|
2891
|
-
"@glasshome/sync-layer": "0.9.0",
|
|
2892
|
-
"@glasshome/ui": "1.20.0",
|
|
2893
|
-
"solid-js": "^1.9.11"
|
|
2846
|
+
"typecheck:test": "tsc --noEmit -p tsconfig.test.json",
|
|
2847
|
+
"check:dead": "fallow dead-code --fail-on-issues",
|
|
2848
|
+
lint: "oxlint --type-aware . && oxfmt --check ."
|
|
2894
2849
|
},
|
|
2895
2850
|
dependencies: {
|
|
2896
2851
|
"@glasshome/widget-contract": "0.3.0",
|
|
2897
|
-
"@modular-forms/solid": "^0.25.1",
|
|
2898
2852
|
"@tailwindcss/vite": "^4.1.13",
|
|
2899
2853
|
clsx: "^2.1.1",
|
|
2900
2854
|
"happy-dom": "^20.0.0",
|
|
@@ -2904,24 +2858,24 @@ var $a = {
|
|
|
2904
2858
|
zod: "^4.1.13"
|
|
2905
2859
|
},
|
|
2906
2860
|
devDependencies: {
|
|
2907
|
-
"@glasshome/ui": "1.
|
|
2861
|
+
"@glasshome/ui": "1.21.1",
|
|
2908
2862
|
"@solidjs/testing-library": "^0.8.10",
|
|
2909
2863
|
"@types/bun": "^1.4.0",
|
|
2910
2864
|
"@types/node": "^25.2.2",
|
|
2865
|
+
fallow: "3.17.0",
|
|
2866
|
+
oxfmt: "0.65.0",
|
|
2867
|
+
oxlint: "1.81.0",
|
|
2868
|
+
"oxlint-tsgolint": "7.0.2001",
|
|
2911
2869
|
typescript: "^7.0.2",
|
|
2912
2870
|
vite: "^8.1.0",
|
|
2913
2871
|
"vite-plugin-solid": "^2.11.12",
|
|
2914
2872
|
vitest: "^4.1.10"
|
|
2915
2873
|
},
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2874
|
+
peerDependencies: {
|
|
2875
|
+
"@glasshome/sync-layer": "0.9.1",
|
|
2876
|
+
"@glasshome/ui": "1.21.1",
|
|
2877
|
+
"solid-js": "^1.9.11"
|
|
2919
2878
|
},
|
|
2920
|
-
homepage: "https://github.com/glasshome/widget-sdk#readme",
|
|
2921
|
-
bugs: { url: "https://github.com/glasshome/widget-sdk/issues" },
|
|
2922
|
-
author: "GlassHome Labs",
|
|
2923
|
-
license: "MIT",
|
|
2924
|
-
publishConfig: { access: "public" },
|
|
2925
2879
|
engines: { node: ">=18" }
|
|
2926
2880
|
}.version;
|
|
2927
2881
|
//#endregion
|