diff --git a/app/globals.css b/app/globals.css index c482064..4f141da 100644 --- a/app/globals.css +++ b/app/globals.css @@ -144,6 +144,7 @@ body { .pn-bento { display: grid; grid-template-columns: repeat(12, 1fr); + grid-auto-flow: dense; } @media (max-width: 860px) { diff --git a/components/widgets/system/Widget.tsx b/components/widgets/system/Widget.tsx index 2446096..00a904b 100644 --- a/components/widgets/system/Widget.tsx +++ b/components/widgets/system/Widget.tsx @@ -19,7 +19,7 @@ export function SystemWidget({ widget, widgetId }: { widget: SystemWidget; widge const errorMessage = result?.type === "error" ? result.message : null; return ( - +
System
{widget.name} {errorMessage && {errorMessage}} diff --git a/components/widgets/traefik/Widget.tsx b/components/widgets/traefik/Widget.tsx index 410d57e..af68f4c 100644 --- a/components/widgets/traefik/Widget.tsx +++ b/components/widgets/traefik/Widget.tsx @@ -4,6 +4,8 @@ import type { Widget } from "@/lib/config/schema"; import { useWidgetSubscription } from "@/lib/ws/client"; import { SkeletonLines } from "@/components/widgets/Skeleton"; import { WidgetCard } from "@/components/widgets/WidgetCard"; +import { StatusDot } from "@/components/widgets/StatusDot"; +import { BrandIcon } from "@/components/widgets/BrandIcon"; type TraefikWidget = Extract; @@ -15,13 +17,30 @@ export function TraefikWidget({ widget, widgetId }: { widget: TraefikWidget; wid return ( -
- {widget.name} - {data && ( - - {data.entrypoints.length} entrypoints - - )} +
+
+ + {widget.href ? ( + + {widget.name} + + ) : ( + {widget.name} + )} +
+
+ {data && ( + + {data.entrypoints.length} entrypoints + + )} + +
{errorMessage && {errorMessage}} {!result && !errorMessage && } diff --git a/lib/config/schema.ts b/lib/config/schema.ts index abb5f47..7223cf1 100644 --- a/lib/config/schema.ts +++ b/lib/config/schema.ts @@ -62,6 +62,8 @@ export const traefikWidgetSchema = z.object({ type: z.literal("traefik"), name: z.string().default("Traefik"), apiUrl: z.string().url(), + href: z.string().url().optional(), + icon: z.string().optional(), interval: durationSchema.default("15s"), });