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() {
@@ -141,7 +141,7 @@ export default function ApplicationsPage() {
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 }