@tollerud/ui 3.0.0 → 3.1.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.
Files changed (98) hide show
  1. package/AGENTS.md +5 -3
  2. package/CHANGELOG.md +67 -0
  3. package/COMPONENTS.md +13 -1
  4. package/README.md +1 -0
  5. package/SKILL.md +8 -5
  6. package/components.json +1 -1
  7. package/dist/avatar.d.ts +3 -2
  8. package/dist/avatar.js +1 -1
  9. package/dist/bento-dashboard.js +6 -1
  10. package/dist/button.d.ts +3 -3
  11. package/dist/button.js +1 -1
  12. package/dist/checkbox.js +1 -1
  13. package/dist/{chunk-7TOT5ME3.js → chunk-3LTW224O.js} +6 -6
  14. package/dist/chunk-3LTW224O.js.map +1 -0
  15. package/dist/chunk-AQT3FZRQ.js +23 -0
  16. package/dist/chunk-AQT3FZRQ.js.map +1 -0
  17. package/dist/{chunk-RWJELAS6.js → chunk-BQWF5MP7.js} +14 -6
  18. package/dist/chunk-BQWF5MP7.js.map +1 -0
  19. package/dist/{chunk-VTRUUT5K.js → chunk-FPFLOYIJ.js} +6 -6
  20. package/dist/chunk-FPFLOYIJ.js.map +1 -0
  21. package/dist/{chunk-6SKTH45H.js → chunk-J2Z4ZFVX.js} +29 -18
  22. package/dist/chunk-J2Z4ZFVX.js.map +1 -0
  23. package/dist/{chunk-ISHZ6ZPJ.js → chunk-JFOW2DI5.js} +17 -5
  24. package/dist/chunk-JFOW2DI5.js.map +1 -0
  25. package/dist/{chunk-3TGMGBKM.js → chunk-K4ALNUZI.js} +6 -6
  26. package/dist/{chunk-3TGMGBKM.js.map → chunk-K4ALNUZI.js.map} +1 -1
  27. package/dist/chunk-LGVXEWNB.js +54 -0
  28. package/dist/chunk-LGVXEWNB.js.map +1 -0
  29. package/dist/{chunk-OONIUDST.js → chunk-OLHMMFQ7.js} +3 -8
  30. package/dist/chunk-OLHMMFQ7.js.map +1 -0
  31. package/dist/{chunk-V3P5QLLX.js → chunk-Q54CVE3W.js} +3 -3
  32. package/dist/{chunk-V3P5QLLX.js.map → chunk-Q54CVE3W.js.map} +1 -1
  33. package/dist/chunk-QEIEWGHA.js +62 -0
  34. package/dist/chunk-QEIEWGHA.js.map +1 -0
  35. package/dist/{chunk-CBQ63EBL.js → chunk-QQHBEACI.js} +9 -6
  36. package/dist/chunk-QQHBEACI.js.map +1 -0
  37. package/dist/{chunk-XR5QBVEV.js → chunk-SNNMZ444.js} +3 -3
  38. package/dist/{chunk-XR5QBVEV.js.map → chunk-SNNMZ444.js.map} +1 -1
  39. package/dist/chunk-T3UQ7G4T.js +58 -0
  40. package/dist/chunk-T3UQ7G4T.js.map +1 -0
  41. package/dist/{chunk-T3TQPOVM.js → chunk-TLEKK53J.js} +5 -8
  42. package/dist/chunk-TLEKK53J.js.map +1 -0
  43. package/dist/{chunk-DGCRHVWW.js → chunk-VFS3V3VY.js} +12 -5
  44. package/dist/chunk-VFS3V3VY.js.map +1 -0
  45. package/dist/chunk-VOARBYVQ.js +44 -0
  46. package/dist/chunk-VOARBYVQ.js.map +1 -0
  47. package/dist/{chunk-O57QMLNI.js → chunk-YTU7BRDW.js} +16 -12
  48. package/dist/chunk-YTU7BRDW.js.map +1 -0
  49. package/dist/{chunk-DFM7UUKB.js → chunk-ZTFOR3AN.js} +4 -4
  50. package/dist/{chunk-DFM7UUKB.js.map → chunk-ZTFOR3AN.js.map} +1 -1
  51. package/dist/cta-band.js +1 -1
  52. package/dist/data-table.js +4 -4
  53. package/dist/date-picker.js +1 -1
  54. package/dist/footer.js +2 -1
  55. package/dist/form-row.d.ts +4 -0
  56. package/dist/form-row.js +1 -1
  57. package/dist/hero-block.js +3 -3
  58. package/dist/index.d.ts +1 -0
  59. package/dist/index.js +24 -23
  60. package/dist/monogram.d.ts +20 -0
  61. package/dist/monogram.js +5 -0
  62. package/dist/monogram.js.map +1 -0
  63. package/dist/noir-glow-background.d.ts +7 -1
  64. package/dist/noir-glow-background.js +1 -1
  65. package/dist/pill.d.ts +5 -2
  66. package/dist/pill.js +1 -1
  67. package/dist/pricing-card.js +2 -2
  68. package/dist/radio-group.d.ts +6 -0
  69. package/dist/radio-group.js +1 -1
  70. package/dist/skeleton.d.ts +10 -2
  71. package/dist/skeleton.js +1 -1
  72. package/dist/slider.js +1 -1
  73. package/dist/switch.js +1 -1
  74. package/dist/timeline.js +1 -1
  75. package/globals-layers.css +111 -1
  76. package/package.json +5 -3
  77. package/registry.json +30 -9
  78. package/tokens.css +49 -5
  79. package/tollerud-avatar-full.png +0 -0
  80. package/dist/chunk-6SKTH45H.js.map +0 -1
  81. package/dist/chunk-7TOT5ME3.js.map +0 -1
  82. package/dist/chunk-CBQ63EBL.js.map +0 -1
  83. package/dist/chunk-DGCRHVWW.js.map +0 -1
  84. package/dist/chunk-FGXOV2QH.js +0 -23
  85. package/dist/chunk-FGXOV2QH.js.map +0 -1
  86. package/dist/chunk-HYQGOC2E.js +0 -79
  87. package/dist/chunk-HYQGOC2E.js.map +0 -1
  88. package/dist/chunk-ISHZ6ZPJ.js.map +0 -1
  89. package/dist/chunk-O57QMLNI.js.map +0 -1
  90. package/dist/chunk-OONIUDST.js.map +0 -1
  91. package/dist/chunk-PLF3BBQI.js +0 -139
  92. package/dist/chunk-PLF3BBQI.js.map +0 -1
  93. package/dist/chunk-Q74VRQEX.js +0 -26
  94. package/dist/chunk-Q74VRQEX.js.map +0 -1
  95. package/dist/chunk-RWJELAS6.js.map +0 -1
  96. package/dist/chunk-T3TQPOVM.js.map +0 -1
  97. package/dist/chunk-VTRUUT5K.js.map +0 -1
  98. /package/{tia-full-figure.svg → tollerud-avatar-full.svg} +0 -0
@@ -1,139 +0,0 @@
1
- 'use client';
2
- import { cn } from './chunk-WSQNPRGN.js';
3
- import { jsxs, jsx } from 'react/jsx-runtime';
4
-
5
- function BentoDashboard({
6
- title,
7
- hosts = [],
8
- metrics = [],
9
- services = [],
10
- incidents = [],
11
- className
12
- }) {
13
- return /* @__PURE__ */ jsxs("div", { className: cn("space-y-4", className), children: [
14
- /* @__PURE__ */ jsx("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ jsxs("div", { children: [
15
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold text-tollerud-text-primary", children: title }),
16
- /* @__PURE__ */ jsxs("p", { className: "text-xs text-tollerud-text-muted", children: [
17
- hosts.length,
18
- " hosts \xB7 ",
19
- services.length,
20
- " services",
21
- incidents.length > 0 && ` \xB7 ${incidents.length} active incident${incidents.length > 1 ? "s" : ""}`
22
- ] })
23
- ] }) }),
24
- hosts.length > 0 && /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-3", children: [
25
- /* @__PURE__ */ jsx("div", { className: "md:col-span-2 lg:col-span-1", children: /* @__PURE__ */ jsx(HostCardComponent, { host: hosts[0] }) }),
26
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-3 md:col-span-2 lg:col-span-1", children: hosts.slice(1).map((h, i) => /* @__PURE__ */ jsx(HostCardComponent, { host: h }, h.hostname ?? i)) })
27
- ] }),
28
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-3", children: [
29
- metrics.length > 0 && /* @__PURE__ */ jsxs("div", { className: "lg:col-span-2", children: [
30
- /* @__PURE__ */ jsx(SectionLabel, { children: "Metrics" }),
31
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-2", children: metrics.map((m, i) => /* @__PURE__ */ jsx(StatCardComponent, { stat: m }, m.label ?? i)) })
32
- ] }),
33
- services.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
34
- /* @__PURE__ */ jsx(SectionLabel, { children: "Services" }),
35
- /* @__PURE__ */ jsx("div", { className: "space-y-2", children: services.slice(0, 4).map((s, i) => /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-tollerud-border/20 bg-tollerud-surface p-3", children: [
36
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
37
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-tollerud-text-primary", children: s.service }),
38
- /* @__PURE__ */ jsx("span", { className: cn(
39
- "text-xs px-1.5 py-0.5 rounded-full font-medium",
40
- s.status === "online" && "text-tollerud-accent bg-tollerud-accent/10",
41
- s.status === "warning" && "text-tollerud-warning bg-tollerud-warning/10",
42
- s.status === "offline" && "text-tollerud-error bg-tollerud-error/10",
43
- s.status === "idle" && "text-tollerud-text-muted bg-tollerud-noir-800"
44
- ), children: s.status })
45
- ] }),
46
- s.responseTime && /* @__PURE__ */ jsxs("p", { className: "text-xs text-tollerud-text-muted mt-1", children: [
47
- s.responseTime,
48
- " response"
49
- ] })
50
- ] }, s.service ?? i)) })
51
- ] })
52
- ] }),
53
- incidents.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
54
- /* @__PURE__ */ jsx(SectionLabel, { children: "Recent Incidents" }),
55
- /* @__PURE__ */ jsx("div", { className: "space-y-1.5", children: incidents.slice(0, 4).map((inc, i) => /* @__PURE__ */ jsx(IncidentCardItem, { incident: inc }, inc.title + i)) })
56
- ] })
57
- ] });
58
- }
59
- function SectionLabel({ children }) {
60
- return /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold text-tollerud-text-muted uppercase tracking-wider mb-2", children });
61
- }
62
- function HostCardComponent({ host }) {
63
- return /* @__PURE__ */ jsxs("div", { className: cn(
64
- "rounded-xl border p-4",
65
- host.status === "online" ? "border-tollerud-border/30 bg-tollerud-surface" : host.status === "warning" ? "border-tollerud-warning/30 bg-tollerud-warning/5" : "border-tollerud-border/20 bg-tollerud-surface opacity-70"
66
- ), children: [
67
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-3", children: [
68
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
69
- /* @__PURE__ */ jsx(StatusDotComp, { status: host.status }),
70
- /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-tollerud-text-primary", children: host.hostname })
71
- ] }),
72
- /* @__PURE__ */ jsx("span", { className: "text-xs text-tollerud-text-muted font-mono", children: host.ip })
73
- ] }),
74
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2 text-xs", children: [
75
- host.cpu && /* @__PURE__ */ jsx(MetricBadge, { label: "CPU", value: host.cpu }),
76
- host.memory && /* @__PURE__ */ jsx(MetricBadge, { label: "Mem", value: host.memory }),
77
- host.disk && /* @__PURE__ */ jsx(MetricBadge, { label: "Disk", value: host.disk }),
78
- host.uptime && /* @__PURE__ */ jsx(MetricBadge, { label: "Up", value: host.uptime })
79
- ] })
80
- ] });
81
- }
82
- function StatCardComponent({ stat }) {
83
- return /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-tollerud-border/20 bg-tollerud-surface p-3", children: [
84
- /* @__PURE__ */ jsx("p", { className: "text-xs text-tollerud-text-muted", children: stat.label }),
85
- /* @__PURE__ */ jsx("p", { className: "text-lg font-semibold text-tollerud-text-primary mt-0.5", children: stat.value }),
86
- stat.change && /* @__PURE__ */ jsx("span", { className: cn(
87
- "text-xs font-medium",
88
- stat.change.direction === "up" ? "text-tollerud-accent" : "text-tollerud-error"
89
- ), children: stat.change.value })
90
- ] });
91
- }
92
- function IncidentCardItem({ incident }) {
93
- return /* @__PURE__ */ jsxs("div", { className: cn(
94
- "flex items-start gap-3 rounded-lg border p-3",
95
- incident.acknowledged ? "border-tollerud-border/10 bg-tollerud-noir-900/50 opacity-60" : "border-tollerud-border/20 bg-tollerud-surface"
96
- ), children: [
97
- /* @__PURE__ */ jsx(SeverityDot, { severity: incident.severity }),
98
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
99
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
100
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-tollerud-text-primary truncate", children: incident.title }),
101
- incident.acknowledged && /* @__PURE__ */ jsx("span", { className: "text-xs text-tollerud-text-muted", children: "(acknowledged)" })
102
- ] }),
103
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-tollerud-text-muted mt-0.5", children: [
104
- /* @__PURE__ */ jsx("span", { children: incident.service }),
105
- /* @__PURE__ */ jsx("span", { children: "\xB7" }),
106
- /* @__PURE__ */ jsx("span", { children: incident.timestamp })
107
- ] }),
108
- incident.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-tollerud-text-secondary mt-1", children: incident.description })
109
- ] })
110
- ] });
111
- }
112
- function StatusDotComp({ status }) {
113
- return /* @__PURE__ */ jsx("span", { className: cn(
114
- "inline-block w-2 h-2 rounded-full",
115
- status === "online" && "bg-tollerud-accent shadow-[0_0_4px_var(--tollerud-accent)]",
116
- status === "warning" && "bg-tollerud-warning",
117
- status === "offline" && "bg-tollerud-error"
118
- ) });
119
- }
120
- function SeverityDot({ severity }) {
121
- return /* @__PURE__ */ jsx("span", { className: cn(
122
- "inline-block w-2 h-2 rounded-full mt-1 shrink-0",
123
- severity === "critical" && "bg-tollerud-error shadow-[0_0_4px_var(--tollerud-error)]",
124
- severity === "high" && "bg-tollerud-warning",
125
- severity === "medium" && "bg-tollerud-accent",
126
- severity === "low" && "bg-tollerud-text-muted",
127
- severity === "info" && "bg-tollerud-info"
128
- ) });
129
- }
130
- function MetricBadge({ label, value }) {
131
- return /* @__PURE__ */ jsxs("div", { className: "rounded bg-tollerud-noir-800 px-2 py-1.5", children: [
132
- /* @__PURE__ */ jsx("span", { className: "text-tollerud-text-muted", children: label }),
133
- /* @__PURE__ */ jsx("span", { className: "float-right text-tollerud-text-primary font-mono", children: value })
134
- ] });
135
- }
136
-
137
- export { BentoDashboard };
138
- //# sourceMappingURL=chunk-PLF3BBQI.js.map
139
- //# sourceMappingURL=chunk-PLF3BBQI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/BentoDashboard.tsx"],"names":[],"mappings":"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","file":"chunk-PLF3BBQI.js","sourcesContent":["'use client'\n\nimport { type ReactNode } from 'react'\nimport { cn } from '@/lib/utils'\nimport type { HostCardProps } from './HostCard'\nimport type { StatCardProps } from './StatCard'\nimport type { ServiceHealthCardProps } from './ServiceHealthCard'\nimport type { IncidentSeverity } from './IncidentCard'\nimport type { BackupJob } from './BackupStatusPanel'\n\n/* ──────────────────── Bento Grid Dashboard Template ──────────────────── */\n\nexport interface BentoDashboardProps {\n title: string\n hosts?: HostCardProps[]\n metrics?: StatCardProps[]\n services?: ServiceHealthCardProps[]\n incidents?: { title: string; severity: IncidentSeverity; timestamp: string; service: string; description?: string; acknowledged?: boolean }[]\n backupJobs?: BackupJob[]\n className?: string\n /** Render the incident list footer */\n renderIncidentFooter?: () => ReactNode\n}\n\nexport function BentoDashboard({\n title,\n hosts = [],\n metrics = [],\n services = [],\n incidents = [],\n className,\n}: BentoDashboardProps) {\n return (\n <div className={cn('space-y-4', className)}>\n {/* Title bar */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-tollerud-text-primary\">{title}</h2>\n <p className=\"text-xs text-tollerud-text-muted\">\n {hosts.length} hosts · {services.length} services\n {incidents.length > 0 && ` · ${incidents.length} active incident${incidents.length > 1 ? 's' : ''}`}\n </p>\n </div>\n </div>\n\n {/* Row 1: Host cards — bento asymmetric */}\n {hosts.length > 0 && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {/* First host spans wider */}\n <div className=\"md:col-span-2 lg:col-span-1\">\n <HostCardComponent host={hosts[0]} />\n </div>\n {/* Remaining hosts in the second column area */}\n <div className=\"grid grid-cols-1 gap-3 md:col-span-2 lg:col-span-1\">\n {hosts.slice(1).map((h, i) => (\n <HostCardComponent key={h.hostname ?? i} host={h} />\n ))}\n </div>\n </div>\n )}\n\n {/* Row 2: Metrics + Services — side by side */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-3\">\n {/* Metrics grid — 2 columns within */}\n {metrics.length > 0 && (\n <div className=\"lg:col-span-2\">\n <SectionLabel>Metrics</SectionLabel>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-2\">\n {metrics.map((m, i) => (\n <StatCardComponent key={m.label ?? i} stat={m} />\n ))}\n </div>\n </div>\n )}\n\n {/* Services list */}\n {services.length > 0 && (\n <div>\n <SectionLabel>Services</SectionLabel>\n <div className=\"space-y-2\">\n {services.slice(0, 4).map((s, i) => (\n <div key={s.service ?? i} className=\"rounded-lg border border-tollerud-border/20 bg-tollerud-surface p-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-tollerud-text-primary\">{s.service}</span>\n <span className={cn(\n 'text-xs px-1.5 py-0.5 rounded-full font-medium',\n s.status === 'online' && 'text-tollerud-accent bg-tollerud-accent/10',\n s.status === 'warning' && 'text-tollerud-warning bg-tollerud-warning/10',\n s.status === 'offline' && 'text-tollerud-error bg-tollerud-error/10',\n s.status === 'idle' && 'text-tollerud-text-muted bg-tollerud-noir-800',\n )}>\n {s.status}\n </span>\n </div>\n {s.responseTime && (\n <p className=\"text-xs text-tollerud-text-muted mt-1\">{s.responseTime} response</p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Row 3: Incidents — full width */}\n {incidents.length > 0 && (\n <div>\n <SectionLabel>Recent Incidents</SectionLabel>\n <div className=\"space-y-1.5\">\n {incidents.slice(0, 4).map((inc, i) => (\n <IncidentCardItem key={inc.title + i} incident={inc} />\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\n/* ────────── Internal sub-components for rendering ────────── */\n\nfunction SectionLabel({ children }: { children: ReactNode }) {\n return (\n <p className=\"text-xs font-semibold text-tollerud-text-muted uppercase tracking-wider mb-2\">{children}</p>\n )\n}\n\nfunction HostCardComponent({ host }: { host: HostCardProps }) {\n return (\n <div className={cn(\n 'rounded-xl border p-4',\n host.status === 'online' ? 'border-tollerud-border/30 bg-tollerud-surface' :\n host.status === 'warning' ? 'border-tollerud-warning/30 bg-tollerud-warning/5' :\n 'border-tollerud-border/20 bg-tollerud-surface opacity-70'\n )}>\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <StatusDotComp status={host.status as 'online' | 'offline' | 'warning'} />\n <span className=\"text-sm font-semibold text-tollerud-text-primary\">{host.hostname}</span>\n </div>\n <span className=\"text-xs text-tollerud-text-muted font-mono\">{host.ip}</span>\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-xs\">\n {host.cpu && <MetricBadge label=\"CPU\" value={host.cpu} />}\n {host.memory && <MetricBadge label=\"Mem\" value={host.memory} />}\n {host.disk && <MetricBadge label=\"Disk\" value={host.disk} />}\n {host.uptime && <MetricBadge label=\"Up\" value={host.uptime} />}\n </div>\n </div>\n )\n}\n\nfunction StatCardComponent({ stat }: { stat: StatCardProps }) {\n return (\n <div className=\"rounded-lg border border-tollerud-border/20 bg-tollerud-surface p-3\">\n <p className=\"text-xs text-tollerud-text-muted\">{stat.label}</p>\n <p className=\"text-lg font-semibold text-tollerud-text-primary mt-0.5\">{stat.value}</p>\n {stat.change && (\n <span className={cn(\n 'text-xs font-medium',\n stat.change.direction === 'up' ? 'text-tollerud-accent' : 'text-tollerud-error'\n )}>\n {stat.change.value}\n </span>\n )}\n </div>\n )\n}\n\nfunction IncidentCardItem({ incident }: { incident: { title: string; severity: IncidentSeverity; timestamp: string; service: string; description?: string; acknowledged?: boolean } }) {\n return (\n <div className={cn(\n 'flex items-start gap-3 rounded-lg border p-3',\n incident.acknowledged ? 'border-tollerud-border/10 bg-tollerud-noir-900/50 opacity-60' : 'border-tollerud-border/20 bg-tollerud-surface'\n )}>\n <SeverityDot severity={incident.severity} />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-tollerud-text-primary truncate\">{incident.title}</span>\n {incident.acknowledged && (\n <span className=\"text-xs text-tollerud-text-muted\">(acknowledged)</span>\n )}\n </div>\n <div className=\"flex items-center gap-2 text-xs text-tollerud-text-muted mt-0.5\">\n <span>{incident.service}</span>\n <span>·</span>\n <span>{incident.timestamp}</span>\n </div>\n {incident.description && (\n <p className=\"text-xs text-tollerud-text-secondary mt-1\">{incident.description}</p>\n )}\n </div>\n </div>\n )\n}\n\nfunction StatusDotComp({ status }: { status: 'online' | 'offline' | 'warning' }) {\n return (\n <span className={cn(\n 'inline-block w-2 h-2 rounded-full',\n status === 'online' && 'bg-tollerud-accent shadow-[0_0_4px_var(--tollerud-accent)]',\n status === 'warning' && 'bg-tollerud-warning',\n status === 'offline' && 'bg-tollerud-error',\n )} />\n )\n}\n\nfunction SeverityDot({ severity }: { severity: IncidentSeverity }) {\n return (\n <span className={cn(\n 'inline-block w-2 h-2 rounded-full mt-1 shrink-0',\n severity === 'critical' && 'bg-tollerud-error shadow-[0_0_4px_var(--tollerud-error)]',\n severity === 'high' && 'bg-tollerud-warning',\n severity === 'medium' && 'bg-tollerud-accent',\n severity === 'low' && 'bg-tollerud-text-muted',\n severity === 'info' && 'bg-tollerud-info',\n )} />\n )\n}\n\nfunction MetricBadge({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"rounded bg-tollerud-noir-800 px-2 py-1.5\">\n <span className=\"text-tollerud-text-muted\">{label}</span>\n <span className=\"float-right text-tollerud-text-primary font-mono\">{value}</span>\n </div>\n )\n}\n\nexport default BentoDashboard"]}
@@ -1,26 +0,0 @@
1
- 'use client';
2
- import { cn } from './chunk-WSQNPRGN.js';
3
- import { forwardRef, useId } from 'react';
4
- import { jsxs, jsx } from 'react/jsx-runtime';
5
-
6
- var FormRow = forwardRef(
7
- ({ className, label, description, error, required, htmlFor, children, ...props }, ref) => {
8
- const autoId = useId();
9
- const descriptionId = description ? `${autoId}-description` : void 0;
10
- const errorId = error ? `${autoId}-error` : void 0;
11
- return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex flex-col gap-1.5", className), ...props, children: [
12
- label && /* @__PURE__ */ jsxs("label", { htmlFor, className: "text-sm font-medium text-tollerud-text-primary", children: [
13
- label,
14
- required && /* @__PURE__ */ jsx("span", { className: "ml-0.5 text-tollerud-error", children: "*" })
15
- ] }),
16
- description && /* @__PURE__ */ jsx("p", { id: descriptionId, className: "text-xs text-tollerud-text-muted", children: description }),
17
- /* @__PURE__ */ jsx("div", { "aria-describedby": [descriptionId, errorId].filter(Boolean).join(" ") || void 0, children }),
18
- error && /* @__PURE__ */ jsx("p", { id: errorId, className: "text-xs text-tollerud-error", children: error })
19
- ] });
20
- }
21
- );
22
- FormRow.displayName = "FormRow";
23
-
24
- export { FormRow };
25
- //# sourceMappingURL=chunk-Q74VRQEX.js.map
26
- //# sourceMappingURL=chunk-Q74VRQEX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/FormRow.tsx"],"names":[],"mappings":";;;;AAeA,IAAM,OAAA,GAAU,UAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACxF,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,aAAA,GAAgB,WAAA,GAAc,CAAA,EAAG,MAAM,CAAA,YAAA,CAAA,GAAiB,MAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,MAAA,CAAA,GAAW,MAAA;AAE5C,IAAA,uBACE,IAAA,CAAC,SAAI,GAAA,EAAU,SAAA,EAAW,GAAG,uBAAA,EAAyB,SAAS,CAAA,EAAI,GAAG,KAAA,EACnE,QAAA,EAAA;AAAA,MAAA,KAAA,oBACC,IAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAkB,SAAA,EAAU,gDAAA,EAChC,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,QACA,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA6B,QAAA,EAAA,GAAA,EAAC;AAAA,OAAA,EAC7D,CAAA;AAAA,MAED,+BACC,GAAA,CAAC,GAAA,EAAA,EAAE,IAAI,aAAA,EAAe,SAAA,EAAU,oCAC7B,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,sBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,kBAAA,EAAkB,CAAC,eAAe,OAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,QAAY,QAAA,EAAS,CAAA;AAAA,MACjG,yBACC,GAAA,CAAC,GAAA,EAAA,EAAE,IAAI,OAAA,EAAS,SAAA,EAAU,+BACvB,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AACA,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"chunk-Q74VRQEX.js","sourcesContent":["'use client'\n\nimport { type HTMLAttributes, forwardRef, useId } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface FormRowProps extends HTMLAttributes<HTMLDivElement> {\n label?: React.ReactNode\n /** Hint text rendered below the label */\n description?: React.ReactNode\n error?: React.ReactNode\n required?: boolean\n /** Forwarded to the label's `htmlFor` — should match the control's `id` */\n htmlFor?: string\n}\n\nconst FormRow = forwardRef<HTMLDivElement, FormRowProps>(\n ({ className, label, description, error, required, htmlFor, children, ...props }, ref) => {\n const autoId = useId()\n const descriptionId = description ? `${autoId}-description` : undefined\n const errorId = error ? `${autoId}-error` : undefined\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-1.5', className)} {...props}>\n {label && (\n <label htmlFor={htmlFor} className=\"text-sm font-medium text-tollerud-text-primary\">\n {label}\n {required && <span className=\"ml-0.5 text-tollerud-error\">*</span>}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-xs text-tollerud-text-muted\">\n {description}\n </p>\n )}\n <div aria-describedby={[descriptionId, errorId].filter(Boolean).join(' ') || undefined}>{children}</div>\n {error && (\n <p id={errorId} className=\"text-xs text-tollerud-error\">\n {error}\n </p>\n )}\n </div>\n )\n }\n)\nFormRow.displayName = 'FormRow'\n\nexport { FormRow }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/Button.tsx"],"names":[],"mappings":";;;;;AAIA,IAAM,QAAA,GAAW;AAAA,EACf,OAAA,EAAS,mHAAA;AAAA,EACT,SAAA,EAAW,uIAAA;AAAA,EACX,KAAA,EAAO,iIAAA;AAAA,EACP,WAAA,EAAa,gGAAA;AAAA,EACb,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,KAAA,GAAQ;AAAA,EACZ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAOO,SAAS,cAAA,CAAe,EAAE,OAAA,GAAU,WAAA,EAAa,OAAO,IAAA,EAAM,SAAA,EAAU,GAAiD,EAAC,EAAG;AAClI,EAAA,OAAO,EAAA;AAAA,IACL,kMAAA;AAAA,IACA,uBAAA;AAAA,IACA,kDAAA;AAAA,IACA,SAAS,OAAO,CAAA;AAAA,IAChB,MAAM,IAAI,CAAA;AAAA,IACV;AAAA,GACF;AACF;AAOA,IAAM,MAAA,GAAS,UAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,OAAA,GAAU,WAAA,EAAa,IAAA,GAAO,IAAA,EAAM,OAAA,GAAU,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACrF,IAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAC9B,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAW,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,CAAA;AAAA,QACrD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-RWJELAS6.js","sourcesContent":["import { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cn } from '@/lib/utils'\n\nconst variants = {\n primary: 'bg-tollerud-yellow text-tollerud-black border-tollerud-yellow hover:bg-tollerud-yellow hover:shadow-tollerud-glow',\n secondary: 'bg-transparent text-tollerud-text-primary border-tollerud-border hover:border-tollerud-text-secondary hover:bg-tollerud-surface-hover',\n ghost: 'bg-transparent text-tollerud-text-secondary border-transparent hover:text-tollerud-text-primary hover:bg-tollerud-surface-hover',\n destructive: 'bg-tollerud-error text-white border-tollerud-error hover:shadow-[0_0_12px_rgba(239,68,68,0.3)]',\n terminal: 'font-mono text-tollerud-yellow border-[rgba(255,255,0,0.25)] bg-transparent before:content-[\"❯_\"] before:opacity-70 hover:border-tollerud-yellow hover:shadow-tollerud-glow hover:bg-[rgba(255,255,0,0.05)]',\n} as const\n\nconst sizes = {\n sm: 'px-3 py-1 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n} as const\n\nexport interface ButtonVariantProps {\n variant?: keyof typeof variants\n size?: keyof typeof sizes\n}\n\nexport function buttonVariants({ variant = 'secondary', size = 'md', className }: ButtonVariantProps & { className?: string } = {}) {\n return cn(\n 'inline-flex items-center justify-center gap-2 font-semibold rounded transition-all duration-[150ms] focus-visible:outline-2 focus-visible:outline-tollerud-yellow focus-visible:outline-offset-2',\n 'border cursor-pointer',\n 'disabled:opacity-50 disabled:pointer-events-none',\n variants[variant],\n sizes[size],\n className\n )\n}\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, ButtonVariantProps {\n /** Render as the single child element (e.g. a `<Link>`) instead of a `<button>`, merging props and styles onto it. */\n asChild?: boolean\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'secondary', size = 'md', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n ref={ref}\n className={buttonVariants({ variant, size, className })}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/Checkbox.tsx"],"names":[],"mappings":";;;;AASA,IAAM,QAAA,GAAW,UAAA;AAAA,EACf,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,EAAA,EAAI,QAAQ,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC5D,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,KAAK,MAAA,IAAU,MAAA;AAErB,IAAA,uBACE,IAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,EAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,UACT,iEAAA;AAAA,UACA,oCAAA;AAAA,UACA,MAAM,QAAA,IAAY,gCAAA;AAAA,UAClB;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2CAAA,EACd,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,GAAA;AAAA,gBACA,EAAA;AAAA,gBACA,IAAA,EAAK,UAAA;AAAA,gBACL,OAAA;AAAA,gBACA,SAAA,EAAU,cAAA;AAAA,gBACT,GAAG;AAAA;AAAA,aACN;AAAA,4BAEA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,wDAAA;AAAA,kBACA,kCAAA;AAAA,kBACA,mDAAA;AAAA,kBACA,yEAAA;AAAA,kBACA,qEAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAGA,QAAA,kBAAA,GAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA,sBACT,sEAAA;AAAA,sBACA,UAAU,aAAA,GAAgB;AAAA,qBAC5B;AAAA,oBACA,OAAA,EAAQ,WAAA;AAAA,oBACR,IAAA,EAAK,MAAA;AAAA,oBACL,aAAA,EAAY,MAAA;AAAA,oBAEZ,QAAA,kBAAA,GAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,CAAA,EAAE,sBAAA;AAAA,wBACF,MAAA,EAAO,cAAA;AAAA,wBACP,WAAA,EAAa,CAAA;AAAA,wBACb,aAAA,EAAc,OAAA;AAAA,wBACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AACF;AAAA;AACF,WAAA,EACF,CAAA;AAAA,UACC,KAAA,oBAAS,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KACzB;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-T3TQPOVM.js","sourcesContent":["'use client'\n\nimport { type InputHTMLAttributes, forwardRef, useId } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string\n}\n\nconst Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, label, id: idProp, checked, ...props }, ref) => {\n const autoId = useId()\n const id = idProp ?? autoId\n\n return (\n <label\n htmlFor={id}\n className={cn(\n 'inline-flex items-center gap-2 cursor-pointer select-none group',\n 'text-sm text-tollerud-text-primary',\n props.disabled && 'opacity-50 pointer-events-none',\n className\n )}\n >\n <span className=\"relative flex items-center justify-center\">\n <input\n ref={ref}\n id={id}\n type=\"checkbox\"\n checked={checked}\n className=\"peer sr-only\"\n {...props}\n />\n {/* Custom box */}\n <span\n className={cn(\n 'h-4 w-4 rounded border transition-all duration-[150ms]',\n 'flex items-center justify-center',\n 'bg-tollerud-surface-raised border-tollerud-border',\n 'peer-focus-visible:outline-2 peer-focus-visible:outline-tollerud-yellow',\n 'peer-checked:bg-tollerud-yellow peer-checked:border-tollerud-yellow',\n 'group-hover:border-tollerud-text-secondary'\n )}\n >\n {/* Checkmark SVG — visible when checked */}\n <svg\n className={cn(\n 'h-3 w-3 text-tollerud-noir-black transition-opacity duration-[150ms]',\n checked ? 'opacity-100' : 'opacity-0'\n )}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2.5 6l2.5 2.5 4.5-5\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </span>\n {label && <span>{label}</span>}\n </label>\n )\n }\n)\nCheckbox.displayName = 'Checkbox'\n\nexport { Checkbox }"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/CTABand.tsx"],"names":[],"mappings":";;;;AAUA,IAAM,OAAA,GAAU,UAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,SAAA,GAAY,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC/E,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,qFAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yDAAA,EAA2D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC9E,WAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uEACV,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,UAED,OAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAA8D,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,UAEtF,SAAA,oBACC,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yDAAA,EAA0D;AAAA;AAAA;AAAA,KAE5E;AAAA,EAEJ;AACF;AACA,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"chunk-VTRUUT5K.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface CTABandProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: React.ReactNode\n description?: React.ReactNode\n actions?: React.ReactNode\n accentBar?: boolean\n}\n\nconst CTABand = forwardRef<HTMLDivElement, CTABandProps>(\n ({ className, title, description, actions, accentBar = true, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-xl border border-tollerud-border bg-tollerud-surface px-8 py-11 text-center',\n className\n )}\n {...props}\n >\n <h2 className=\"tollerud-display text-[30px] text-tollerud-text-primary\">{title}</h2>\n {description && (\n <p className=\"mx-auto mt-3 max-w-[440px] text-[15px] text-tollerud-text-secondary\">\n {description}\n </p>\n )}\n {actions && (\n <div className=\"mt-[22px] flex flex-wrap items-center justify-center gap-3\">{actions}</div>\n )}\n {accentBar && (\n <hr className=\"tollerud-accent-bar mx-auto mt-8 max-w-[320px] border-0\" />\n )}\n </div>\n )\n }\n)\nCTABand.displayName = 'CTABand'\n\nexport { CTABand }\n"]}