diff --git a/package-lock.json b/package-lock.json index eeb7c2a..4125b70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "dockship", "version": "0.1.0", "dependencies": { + "@radix-ui/react-progress": "^1.1.8", "@radix-ui/react-slot": "^1.2.4", "@types/dockerode": "^3.3.47", "class-variance-authority": "^0.7.1", @@ -848,6 +849,68 @@ } } }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", + "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", @@ -1301,7 +1364,7 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" diff --git a/package.json b/package.json index a13920d..c4b6f18 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "start": "next start" }, "dependencies": { + "@radix-ui/react-progress": "^1.1.8", "@radix-ui/react-slot": "^1.2.4", "@types/dockerode": "^3.3.47", "class-variance-authority": "^0.7.1", diff --git a/src/app/applications/page.tsx b/src/app/applications/page.tsx index 108c2cb..04cbdd3 100644 --- a/src/app/applications/page.tsx +++ b/src/app/applications/page.tsx @@ -5,8 +5,8 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { StatusIndicator } from "@/components/dashboard/StatusIndicator"; -import { MetricBar } from "@/components/dashboard/MetricBar"; import { Play, Square, RotateCcw, MoreVertical, Plus } from "lucide-react"; +import { Progress } from "@/components/ui/progress"; const applications = [ { @@ -130,7 +130,7 @@ export default function ApplicationsPage() {
CPU
- + {app.cpu}%
@@ -141,7 +141,7 @@ export default function ApplicationsPage() { Memory
- + {app.memory}%
diff --git a/src/app/monitoring/page.tsx b/src/app/monitoring/page.tsx index 95c3a18..5950844 100644 --- a/src/app/monitoring/page.tsx +++ b/src/app/monitoring/page.tsx @@ -3,7 +3,6 @@ import { DashboardLayout } from "@/components/dashboard/DashboardLayout"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; -import { MetricBar } from "@/components/dashboard/MetricBar"; import { LineChart, Line, @@ -14,6 +13,7 @@ import { AreaChart, Area, } from "recharts"; +import { Progress } from "@/components/ui/progress"; const cpuData = [ { time: "00:00", value: 45 }, @@ -88,7 +88,7 @@ export default function MonitoringPage() { Cluster CPU
68%
- + @@ -97,7 +97,7 @@ export default function MonitoringPage() { Cluster Memory
71%
- +
@@ -337,14 +337,14 @@ export default function MonitoringPage() { CPU {container.cpu}% - +
Memory {container.memory}%
- +
Network diff --git a/src/app/nodes/page.tsx b/src/app/nodes/page.tsx index 565c9d2..9155e78 100644 --- a/src/app/nodes/page.tsx +++ b/src/app/nodes/page.tsx @@ -5,8 +5,8 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { StatusIndicator } from "@/components/dashboard/StatusIndicator"; -import { MetricBar } from "@/components/dashboard/MetricBar"; import { Server, Plus, Settings, Trash2 } from "lucide-react"; +import { Progress } from "@/components/ui/progress"; const nodes = [ { @@ -130,7 +130,7 @@ export default function NodesPage() { CPU ({node.cpu.cores} cores)
{node.cpu.usage}%
- + {/* Memory */} @@ -141,7 +141,7 @@ export default function NodesPage() {
{node.memory.percentage}%
- +
{node.memory.used} / {node.memory.total}
@@ -151,7 +151,7 @@ export default function NodesPage() {
Disk
{node.disk.percentage}%
- +
{node.disk.used} / {node.disk.total}
diff --git a/src/app/overview/page.tsx b/src/app/overview/page.tsx index 1083036..c6ce00f 100644 --- a/src/app/overview/page.tsx +++ b/src/app/overview/page.tsx @@ -6,7 +6,6 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { StatusIndicator } from "@/components/dashboard/StatusIndicator"; -import { MetricBar } from "@/components/dashboard/MetricBar"; import { Box, Server, @@ -15,6 +14,7 @@ import { ArrowRight, Clock, } from "lucide-react"; +import { Progress } from "@/components/ui/progress"; const recentDeployments = [ { @@ -172,7 +172,7 @@ export default function OverviewPage() {
- + {app.cpu}% @@ -180,7 +180,7 @@ export default function OverviewPage() {
- + {app.memory}% @@ -257,12 +257,12 @@ export default function OverviewPage() { CPU {node.cpu}%
- +
Memory {node.memory}%
- +
Containers {node.containers} diff --git a/src/components/dashboard/MetricBar.tsx b/src/components/dashboard/MetricBar.tsx deleted file mode 100644 index f3c1c3c..0000000 --- a/src/components/dashboard/MetricBar.tsx +++ /dev/null @@ -1,32 +0,0 @@ -interface MetricBarProps { - value: number; - max: number; - variant?: "default" | "success" | "warning" | "danger"; -} - -export function MetricBar({ value, max, variant = "default" }: MetricBarProps) { - const percentage = Math.min((value / max) * 100, 100); - - const getColor = () => { - if (variant !== "default") { - switch (variant) { - case "success": return "bg-success"; - case "warning": return "bg-warning"; - case "danger": return "bg-destructive"; - } - } - - if (percentage > 80) return "bg-destructive"; - if (percentage > 60) return "bg-warning"; - return "bg-primary"; - }; - - return ( -
-
-
- ); -} diff --git a/src/components/ui/progress.tsx b/src/components/ui/progress.tsx index f9f131e..e7a416c 100644 --- a/src/components/ui/progress.tsx +++ b/src/components/ui/progress.tsx @@ -1,23 +1,31 @@ -import * as React from "react"; -import * as ProgressPrimitive from "@radix-ui/react-progress"; +"use client" -import { cn } from "@/lib/utils"; +import * as React from "react" +import * as ProgressPrimitive from "@radix-ui/react-progress" -const Progress = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, value, ...props }, ref) => ( - - - -)); -Progress.displayName = ProgressPrimitive.Root.displayName; +import { cn } from "@/lib/utils" -export { Progress }; +function Progress({ + className, + value, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { Progress }