Spaces:
Running
Running
feat(roadmap): added "in progress";
Browse files
examples/cyberpunk-standalone/src/components/roadmap-section.tsx
CHANGED
@@ -1,12 +1,12 @@
|
|
1 |
"use client";
|
2 |
-
import { CheckCircle, Clock, Target, Github } from "lucide-react";
|
3 |
import { Badge } from "@/components/ui/badge";
|
4 |
import { cn } from "@/lib/utils";
|
5 |
|
6 |
interface RoadmapItem {
|
7 |
title: string;
|
8 |
description: string;
|
9 |
-
status: "completed" | "planned";
|
10 |
}
|
11 |
|
12 |
const roadmapItems: RoadmapItem[] = [
|
@@ -26,6 +26,11 @@ const roadmapItems: RoadmapItem[] = [
|
|
26 |
description: "Manual robot control with keyboard and slider inputs",
|
27 |
status: "completed",
|
28 |
},
|
|
|
|
|
|
|
|
|
|
|
29 |
{
|
30 |
title: "record",
|
31 |
description: "Record robot trajectories and sensor data to create datasets",
|
@@ -59,6 +64,14 @@ const statusConfig = {
|
|
59 |
bgColor: "bg-green-500/10 dark:bg-green-400/5",
|
60 |
borderColor: "border-green-500/30 dark:border-green-400/20",
|
61 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
planned: {
|
63 |
icon: Clock,
|
64 |
label: "PLANNED",
|
@@ -73,6 +86,9 @@ export function RoadmapSection() {
|
|
73 |
const completedCount = roadmapItems.filter(
|
74 |
(item) => item.status === "completed"
|
75 |
).length;
|
|
|
|
|
|
|
76 |
const totalCount = roadmapItems.length;
|
77 |
|
78 |
return (
|
@@ -101,15 +117,27 @@ export function RoadmapSection() {
|
|
101 |
<div className="bg-primary/30 dark:bg-primary/10 border-b border-primary/20 p-4">
|
102 |
<div className="flex items-center justify-between">
|
103 |
<div className="flex items-center gap-4">
|
104 |
-
<div className="flex items-center gap-
|
105 |
-
<div className="
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
</div>
|
114 |
</div>
|
115 |
<div className="text-xs text-muted-foreground">
|
@@ -152,7 +180,8 @@ export function RoadmapSection() {
|
|
152 |
{/* Content */}
|
153 |
<div className="flex-1 min-w-0">
|
154 |
<h4 className={cn("font-bold text-lg", config.textColor)}>
|
155 |
-
{item.title}
|
|
|
156 |
</h4>
|
157 |
<p className="text-muted-foreground text-sm mt-1">
|
158 |
{item.description}
|
@@ -175,7 +204,8 @@ export function RoadmapSection() {
|
|
175 |
<StatusIcon
|
176 |
className={cn(
|
177 |
"w-4 h-4 flex-shrink-0 ml-3",
|
178 |
-
config.textColor
|
|
|
179 |
)}
|
180 |
/>
|
181 |
</div>
|
|
|
1 |
"use client";
|
2 |
+
import { CheckCircle, Clock, Loader2, Target, Github } from "lucide-react";
|
3 |
import { Badge } from "@/components/ui/badge";
|
4 |
import { cn } from "@/lib/utils";
|
5 |
|
6 |
interface RoadmapItem {
|
7 |
title: string;
|
8 |
description: string;
|
9 |
+
status: "completed" | "in_progress" | "planned";
|
10 |
}
|
11 |
|
12 |
const roadmapItems: RoadmapItem[] = [
|
|
|
26 |
description: "Manual robot control with keyboard and slider inputs",
|
27 |
status: "completed",
|
28 |
},
|
29 |
+
{
|
30 |
+
title: "SO-100 leader arm",
|
31 |
+
description: "Leader arm teleoperation support for intuitive robot control",
|
32 |
+
status: "in_progress",
|
33 |
+
},
|
34 |
{
|
35 |
title: "record",
|
36 |
description: "Record robot trajectories and sensor data to create datasets",
|
|
|
64 |
bgColor: "bg-green-500/10 dark:bg-green-400/5",
|
65 |
borderColor: "border-green-500/30 dark:border-green-400/20",
|
66 |
},
|
67 |
+
in_progress: {
|
68 |
+
icon: Loader2,
|
69 |
+
label: "IN PROGRESS",
|
70 |
+
dotColor: "bg-orange-500 dark:bg-orange-400",
|
71 |
+
textColor: "text-orange-600 dark:text-orange-400",
|
72 |
+
bgColor: "bg-orange-500/10 dark:bg-orange-400/5",
|
73 |
+
borderColor: "border-orange-500/30 dark:border-orange-400/20",
|
74 |
+
},
|
75 |
planned: {
|
76 |
icon: Clock,
|
77 |
label: "PLANNED",
|
|
|
86 |
const completedCount = roadmapItems.filter(
|
87 |
(item) => item.status === "completed"
|
88 |
).length;
|
89 |
+
const inProgressCount = roadmapItems.filter(
|
90 |
+
(item) => item.status === "in_progress"
|
91 |
+
).length;
|
92 |
const totalCount = roadmapItems.length;
|
93 |
|
94 |
return (
|
|
|
117 |
<div className="bg-primary/30 dark:bg-primary/10 border-b border-primary/20 p-4">
|
118 |
<div className="flex items-center justify-between">
|
119 |
<div className="flex items-center gap-4">
|
120 |
+
<div className="flex items-center gap-4">
|
121 |
+
<div className="flex items-center gap-2">
|
122 |
+
<div className="w-2 h-2 bg-green-500 dark:bg-green-400 rounded-full"></div>
|
123 |
+
<span className="text-green-600 dark:text-green-400 text-xs">
|
124 |
+
{completedCount} COMPLETED
|
125 |
+
</span>
|
126 |
+
</div>
|
127 |
+
<div className="w-px h-4 bg-border dark:bg-white/10"></div>
|
128 |
+
<div className="flex items-center gap-2">
|
129 |
+
<div className="w-2 h-2 bg-orange-500 dark:bg-orange-400 rounded-full animate-pulse"></div>
|
130 |
+
<span className="text-orange-600 dark:text-orange-400 text-xs">
|
131 |
+
{inProgressCount} IN PROGRESS
|
132 |
+
</span>
|
133 |
+
</div>
|
134 |
+
<div className="w-px h-4 bg-border dark:bg-white/10"></div>
|
135 |
+
<div className="flex items-center gap-2">
|
136 |
+
<div className="w-2 h-2 bg-slate-500 dark:bg-muted-foreground rounded-full"></div>
|
137 |
+
<span className="text-slate-600 dark:text-muted-foreground text-xs">
|
138 |
+
{totalCount - completedCount - inProgressCount} PLANNED
|
139 |
+
</span>
|
140 |
+
</div>
|
141 |
</div>
|
142 |
</div>
|
143 |
<div className="text-xs text-muted-foreground">
|
|
|
180 |
{/* Content */}
|
181 |
<div className="flex-1 min-w-0">
|
182 |
<h4 className={cn("font-bold text-lg", config.textColor)}>
|
183 |
+
{item.title}
|
184 |
+
{item.title !== "SO-100 leader arm" ? "()" : ""}
|
185 |
</h4>
|
186 |
<p className="text-muted-foreground text-sm mt-1">
|
187 |
{item.description}
|
|
|
204 |
<StatusIcon
|
205 |
className={cn(
|
206 |
"w-4 h-4 flex-shrink-0 ml-3",
|
207 |
+
config.textColor,
|
208 |
+
item.status === "in_progress" && "animate-spin"
|
209 |
)}
|
210 |
/>
|
211 |
</div>
|