feat(ui): apply professional Nothing.tech aesthetics to Live Ops Space
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 1m1s
CD Pipeline / build-and-deploy (push) Successful in 4m38s
CD Pipeline / post-deploy-checks (push) Has been cancelled
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 1m1s
CD Pipeline / build-and-deploy (push) Successful in 4m38s
CD Pipeline / post-deploy-checks (push) Has been cancelled
This commit is contained in:
@@ -110,11 +110,11 @@ function stateLabel(t: ReturnType<typeof useTranslations>, state: string): strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
function stateClass(state: string): string {
|
function stateClass(state: string): string {
|
||||||
if (state === "working") return "border-[#4a90d9] bg-[#eef5ff] text-[#1f5b9b]";
|
if (state === "working") return "border-[#4a90d9] bg-white/70 backdrop-blur-[20px] text-[#4a90d9] shadow-[0_0_15px_rgba(74,144,217,0.4)]";
|
||||||
if (state === "verified") return "border-[#8fc29a] bg-[#f0faf2] text-[#17602a]";
|
if (state === "verified") return "border-[#8fc29a] bg-white/70 backdrop-blur-[20px] text-[#17602a]";
|
||||||
if (state === "blocked") return "border-[#e2a29b] bg-[#fff0ef] text-[#9f2f25]";
|
if (state === "blocked") return "border-[#e2a29b] bg-white/70 backdrop-blur-[20px] text-[#9f2f25]";
|
||||||
if (state === "waiting") return "border-[#d9b36f] bg-[#fff7e8] text-[#8a5a08]";
|
if (state === "waiting") return "border-[#d9b36f] bg-white/70 backdrop-blur-[20px] text-[#8a5a08]";
|
||||||
return "border-[#d8d3c7] bg-white text-[#5f5b52]";
|
return "border-[#d8d3c7] bg-white/70 backdrop-blur-[20px] text-[#5f5b52]";
|
||||||
}
|
}
|
||||||
|
|
||||||
function stateFromWorkItemStatus(status: string): string {
|
function stateFromWorkItemStatus(status: string): string {
|
||||||
@@ -289,13 +289,13 @@ export default function OpenClawLiveOpsSpacePage({
|
|||||||
<div
|
<div
|
||||||
key={zone.zone_id}
|
key={zone.zone_id}
|
||||||
data-testid="openclaw-zone"
|
data-testid="openclaw-zone"
|
||||||
className="absolute flex h-14 w-28 -translate-x-1/2 -translate-y-1/2 rotate-[-2deg] items-center gap-2 border border-[#cbd4d8] bg-white/95 px-2 shadow-[0_10px_24px_rgba(54,72,88,0.12)] backdrop-blur"
|
className="absolute flex h-14 w-32 -translate-x-1/2 -translate-y-1/2 rotate-[-2deg] items-center gap-2 rounded-xl border border-white/40 bg-white/70 px-2.5 shadow-[0_8px_32px_rgba(31,38,135,0.07)] backdrop-blur-[20px]"
|
||||||
style={{ left: `${zone.position.x}%`, top: `${zone.position.y}%` }}
|
style={{ left: `${zone.position.x}%`, top: `${zone.position.y}%` }}
|
||||||
>
|
>
|
||||||
<span className="flex h-8 w-8 shrink-0 items-center justify-center border border-[#d8d3c7] bg-[#f7f8f7] text-[#4a90d9]">
|
<span className="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-white/50 bg-white/40 text-[#4a90d9] shadow-sm backdrop-blur-md">
|
||||||
<Icon className="h-4 w-4" aria-hidden="true" />
|
<Icon className="h-4 w-4" aria-hidden="true" />
|
||||||
</span>
|
</span>
|
||||||
<span className="min-w-0 truncate text-[11px] font-semibold text-[#34302a]">
|
<span className="min-w-0 truncate font-mono text-[11px] font-semibold tracking-tight text-[#34302a]">
|
||||||
{zone.label}
|
{zone.label}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -307,7 +307,7 @@ export default function OpenClawLiveOpsSpacePage({
|
|||||||
key={item.work_item_id}
|
key={item.work_item_id}
|
||||||
data-testid="openclaw-work-token"
|
data-testid="openclaw-work-token"
|
||||||
className={cn(
|
className={cn(
|
||||||
"openclaw-work-token absolute h-8 w-20 -translate-x-1/2 -translate-y-1/2 border px-2 py-1 text-[10px] font-semibold shadow-[0_8px_20px_rgba(54,72,88,0.16)]",
|
"openclaw-work-token absolute h-8 w-24 -translate-x-1/2 -translate-y-1/2 rounded-full border px-3 py-1 text-[10px] font-semibold shadow-[0_8px_20px_rgba(54,72,88,0.12)] flex items-center justify-center",
|
||||||
stateClass(stateFromWorkItemStatus(item.status)),
|
stateClass(stateFromWorkItemStatus(item.status)),
|
||||||
)}
|
)}
|
||||||
style={{
|
style={{
|
||||||
@@ -316,7 +316,7 @@ export default function OpenClawLiveOpsSpacePage({
|
|||||||
animationDelay: `${index * 0.35}s`,
|
animationDelay: `${index * 0.35}s`,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span className="block truncate">{item.work_item_id}</span>
|
<span className="block truncate font-mono tracking-wider">{item.work_item_id}</span>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
@@ -324,34 +324,39 @@ export default function OpenClawLiveOpsSpacePage({
|
|||||||
<div
|
<div
|
||||||
key={agent.agent_id}
|
key={agent.agent_id}
|
||||||
data-testid="openclaw-agent-avatar"
|
data-testid="openclaw-agent-avatar"
|
||||||
className="openclaw-agent absolute -translate-x-1/2 -translate-y-1/2"
|
className="openclaw-agent absolute -translate-x-1/2 -translate-y-1/2 flex flex-col items-center"
|
||||||
style={{
|
style={{
|
||||||
left: `${agent.position.x}%`,
|
left: `${agent.position.x}%`,
|
||||||
top: `${agent.position.y}%`,
|
top: `${agent.position.y}%`,
|
||||||
animationDelay: `${index * 0.28}s`,
|
animationDelay: `${index * 0.28}s`,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<div className="relative">
|
||||||
className={cn(
|
{agent.state === "working" && (
|
||||||
"relative flex h-14 w-14 items-center justify-center border-2 bg-white shadow-[0_16px_30px_rgba(54,72,88,0.2)]",
|
<div className="openclaw-working-ripple absolute inset-0 rounded-full border-2 border-[#4a90d9]" />
|
||||||
stateClass(agent.state),
|
|
||||||
)}
|
)}
|
||||||
>
|
<div
|
||||||
<span
|
|
||||||
className={cn(
|
className={cn(
|
||||||
"absolute -right-1 -top-1 h-3 w-3 border border-white",
|
"relative z-10 flex h-14 w-14 items-center justify-center rounded-full border-2 shadow-[0_16px_30px_rgba(54,72,88,0.15)] transition-all duration-300",
|
||||||
agent.state === "blocked"
|
stateClass(agent.state),
|
||||||
? "bg-[#d95f4f]"
|
|
||||||
: agent.state === "verified"
|
|
||||||
? "bg-[#4f9b62]"
|
|
||||||
: agent.state === "working"
|
|
||||||
? "bg-[#4a90d9]"
|
|
||||||
: "bg-[#f0bd69]",
|
|
||||||
)}
|
)}
|
||||||
/>
|
>
|
||||||
<Bot className="h-6 w-6" aria-hidden="true" />
|
<span
|
||||||
|
className={cn(
|
||||||
|
"absolute -right-0 -top-0 h-3.5 w-3.5 rounded-full border-2 border-white",
|
||||||
|
agent.state === "blocked"
|
||||||
|
? "bg-[#d95f4f] animate-pulse"
|
||||||
|
: agent.state === "verified"
|
||||||
|
? "bg-[#4f9b62]"
|
||||||
|
: agent.state === "working"
|
||||||
|
? "bg-[#4a90d9] animate-pulse"
|
||||||
|
: "bg-[#f0bd69]",
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<Bot className={cn("h-6 w-6", agent.state === "working" ? "animate-bounce-slow text-[#4a90d9]" : "")} aria-hidden="true" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-1 max-w-28 truncate border border-[#d8d3c7] bg-white px-1.5 py-0.5 text-center text-[10px] font-semibold text-[#34302a] shadow-sm">
|
<div className="mt-2 max-w-32 truncate rounded-md border border-white/50 bg-white/70 px-2 py-1 text-center font-mono text-[10px] font-semibold text-[#34302a] shadow-sm backdrop-blur-[10px]">
|
||||||
{agent.label}
|
{agent.label}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -553,6 +558,32 @@ export default function OpenClawLiveOpsSpacePage({
|
|||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@keyframes openclaw-ripple {
|
||||||
|
0% {
|
||||||
|
transform: scale(0.8);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: scale(2.4);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.openclaw-working-ripple {
|
||||||
|
animation: openclaw-ripple 2s cubic-bezier(0, 0, 0.2, 1) infinite;
|
||||||
|
}
|
||||||
|
@keyframes openclaw-bounce-slow {
|
||||||
|
0%, 100% {
|
||||||
|
transform: translateY(-8%);
|
||||||
|
animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: translateY(0);
|
||||||
|
animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.animate-bounce-slow {
|
||||||
|
animation: openclaw-bounce-slow 2s infinite;
|
||||||
|
}
|
||||||
.openclaw-flow-packet {
|
.openclaw-flow-packet {
|
||||||
animation: openclaw-flow-packet 5.8s ease-in-out infinite;
|
animation: openclaw-flow-packet 5.8s ease-in-out infinite;
|
||||||
will-change: transform, opacity;
|
will-change: transform, opacity;
|
||||||
|
|||||||
Reference in New Issue
Block a user