Skip to content

Commit d4f8d2b

Browse files
committed
feat(v0.2): dock-style pipeline + compress_finished_job
On-chain: - CompressedJob struct for post-settlement job data archival - compress_finished_job instruction: copies job fields to Merkle leaf, closes Job PDA, reclaims rent back to poster - CompressedJobAccounts context with poster + job validation Pipeline demo: - Dock-style animation: compact icon nodes, active enlarges in-flow - Compress step now shows job PDA closure + rent reclaim - Reputation step for agent track record - Helper text visible only on active step - ZK layer (cyan) styling for compression nodes - Neighbor magnification effect
1 parent 3a169f8 commit d4f8d2b

3 files changed

Lines changed: 239 additions & 154 deletions

File tree

client/src/App.css

Lines changed: 86 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,17 @@ body::before {
286286
border-right: 1px dashed rgba(251, 191, 36, 0.08);
287287
}
288288

289+
.zone-zk {
290+
right: 0;
291+
width: 18%;
292+
background: linear-gradient(270deg, rgba(6, 182, 212, 0.04) 0%, transparent 100%);
293+
border-left: 1px dashed rgba(6, 182, 212, 0.08);
294+
}
295+
296+
.zone-zk .zone-label {
297+
color: #22d3ee;
298+
}
299+
289300
.zone-label {
290301
position: absolute;
291302
top: 8px;
@@ -371,82 +382,114 @@ body::before {
371382
}
372383
}
373384

374-
/* Nodes */
385+
/* Nodes — Dock-style: compact icons by default, enlarge in-flow on active */
375386
.pipeline-node {
376387
display: flex;
377388
flex-direction: column;
378389
align-items: center;
379-
gap: 0.3rem;
380-
padding: 0.7rem 0.4rem;
381-
border-radius: 14px;
390+
gap: 0.1rem;
391+
padding: 0.35rem 0.25rem;
392+
border-radius: 10px;
382393
border: 1px solid transparent;
383394
position: relative;
384-
transition: all 0.4s ease;
385-
min-width: 60px;
395+
transition: all 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);
396+
min-width: 32px;
386397
}
387398

388399
.pipeline-node .node-icon {
389-
font-size: 1.3rem;
390-
transition: transform 0.3s ease;
400+
font-size: 0.95rem;
401+
transition: all 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);
391402
}
392403

393404
.pipeline-node .node-label {
394-
font-size: 0.62rem;
405+
font-size: 0;
395406
font-weight: 700;
396407
text-transform: uppercase;
397408
letter-spacing: 0.06em;
398409
color: var(--text-dim);
399-
transition: color 0.3s ease;
410+
transition: all 0.3s ease;
411+
opacity: 0;
412+
max-height: 0;
413+
overflow: hidden;
414+
line-height: 1;
400415
}
401416

402417
/* Layer-specific styling */
403418
.pipeline-node.l1 {}
404419

405420
.pipeline-node.er .node-label {
406421
color: var(--er-color);
407-
opacity: 0.5;
422+
}
423+
424+
.pipeline-node.zk .node-label {
425+
color: #22d3ee;
408426
}
409427

410428
.pipeline-node.done .node-label {
411429
color: var(--done-color);
412-
opacity: 0.5;
413430
}
414431

415-
/* Active state */
432+
/* ── Dock: near neighbor — slightly bigger, no transform ── */
433+
.pipeline-node.node-near {
434+
padding: 0.4rem 0.3rem;
435+
}
436+
437+
.pipeline-node.node-near .node-icon {
438+
font-size: 1.1rem;
439+
}
440+
441+
/* ── Dock: active node — enlarged in-flow ── */
416442
.pipeline-node.node-active {
417443
border-color: var(--border-glow);
418444
background: rgba(52, 211, 153, 0.06);
445+
padding: 0.5rem 0.5rem;
446+
min-width: 56px;
419447
}
420448

421449
.pipeline-node.node-active.er {
422450
border-color: var(--er-glow);
423451
background: rgba(251, 191, 36, 0.06);
424452
}
425453

454+
.pipeline-node.node-active.zk {
455+
border-color: rgba(6, 182, 212, 0.4);
456+
background: rgba(6, 182, 212, 0.06);
457+
}
458+
426459
.pipeline-node.node-active .node-icon {
427-
transform: scale(1.2);
428-
filter: drop-shadow(0 0 10px var(--accent-glow));
460+
font-size: 1.3rem;
461+
filter: drop-shadow(0 0 8px var(--accent-glow));
429462
}
430463

431464
.pipeline-node.node-active.er .node-icon {
432-
filter: drop-shadow(0 0 10px var(--er-glow));
465+
filter: drop-shadow(0 0 8px var(--er-glow));
466+
}
467+
468+
.pipeline-node.node-active.zk .node-icon {
469+
filter: drop-shadow(0 0 8px rgba(6, 182, 212, 0.5));
433470
}
434471

435472
.pipeline-node.node-active .node-label {
473+
font-size: 0.55rem;
474+
opacity: 1;
475+
max-height: 1em;
436476
color: var(--accent);
437477
}
438478

439479
.pipeline-node.node-active.er .node-label {
440480
color: var(--er-color);
441-
opacity: 1;
481+
}
482+
483+
.pipeline-node.node-active.zk .node-label {
484+
color: #22d3ee;
442485
}
443486

444487
/* Ring pulse on active */
445488
.node-ring {
446489
position: absolute;
447-
inset: -4px;
448-
border-radius: 18px;
449-
border: 2px solid var(--accent);
490+
inset: -3px;
491+
border-radius: 13px;
492+
border: 1.5px solid var(--accent);
450493
opacity: 0;
451494
animation: ringPulse 1.5s ease-out infinite;
452495
}
@@ -455,6 +498,10 @@ body::before {
455498
border-color: var(--er-color);
456499
}
457500

501+
.pipeline-node.zk .node-ring {
502+
border-color: #22d3ee;
503+
}
504+
458505
@keyframes ringPulse {
459506
0% {
460507
opacity: 0.6;
@@ -478,116 +525,40 @@ body::before {
478525

479526
.pipeline-node.node-done .node-label {
480527
color: var(--text-dim);
481-
482-
}
483-
484-
/* ZK Compression layer */
485-
.pipeline-node.zk .node-label {
486-
color: #22d3ee;
528+
font-size: 0.5rem;
487529
opacity: 0.5;
530+
max-width: 60px;
488531
}
489532

490-
.pipeline-node.node-active.zk {
491-
border-color: rgba(6, 182, 212, 0.4);
492-
background: rgba(6, 182, 212, 0.06);
493-
}
494-
495-
.pipeline-node.node-active.zk .node-icon {
496-
filter: drop-shadow(0 0 10px rgba(6, 182, 212, 0.5));
497-
}
498-
499-
.pipeline-node.node-active.zk .node-label {
500-
color: #22d3ee;
501-
opacity: 1;
502-
}
503-
504-
.pipeline-node.zk .node-ring {
505-
border-color: #22d3ee;
506-
}
507-
508-
/* Stage group layout */
509-
.pipeline-stage-group {
510-
margin-bottom: 0.5rem;
511-
}
512-
513-
.stage-label {
514-
display: flex;
515-
align-items: center;
516-
gap: 0.5rem;
517-
padding: 0.3rem 0.5rem;
518-
margin-bottom: 0.4rem;
519-
}
520-
521-
.stage-name {
522-
font-size: 0.65rem;
523-
font-weight: 700;
524-
text-transform: uppercase;
525-
letter-spacing: 0.08em;
526-
color: #64748b;
527-
}
528-
529-
.stage-badge-sm {
530-
font-size: 0.55rem;
531-
font-weight: 700;
532-
padding: 0.1rem 0.4rem;
533-
border-radius: 4px;
534-
text-transform: uppercase;
535-
letter-spacing: 0.06em;
536-
}
537-
538-
.stage-badge-sm-l1 {
539-
background: rgba(52, 211, 153, 0.1);
540-
color: #34d399;
541-
}
542-
543-
.stage-badge-sm-er {
544-
background: rgba(251, 191, 36, 0.1);
545-
color: #fbbf24;
546-
}
547-
548-
.stage-badge-sm-zk {
549-
background: rgba(6, 182, 212, 0.1);
550-
color: #22d3ee;
551-
}
552-
553-
.stage-label-l1 .stage-name {
554-
color: rgba(52, 211, 153, 0.6);
555-
}
556-
557-
.stage-label-er .stage-name {
558-
color: rgba(251, 191, 36, 0.6);
559-
}
560-
561-
.stage-label-zk .stage-name {
562-
color: rgba(6, 182, 212, 0.6);
563-
}
564-
565-
.pipeline-stage-track {
566-
display: flex;
567-
align-items: flex-start;
568-
gap: 0;
569-
}
570-
533+
/* Node column wrapper */
571534
.pipeline-node-col {
572535
display: flex;
573536
flex-direction: column;
574537
align-items: center;
575-
gap: 0.25rem;
538+
gap: 0.2rem;
539+
transition: all 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
576540
}
577541

578-
/* Helper text under each node */
542+
/* Helper text — only visible on active */
579543
.node-helper {
580544
font-size: 0.55rem;
581-
color: #334155;
545+
color: #64748b;
582546
text-align: center;
583-
max-width: 80px;
547+
max-width: 100px;
584548
line-height: 1.3;
585-
transition: color 0.3s;
586-
min-height: 2.2em;
549+
animation: helperFadeIn 0.3s ease forwards;
587550
}
588551

589-
.node-helper-active {
590-
color: #64748b;
552+
@keyframes helperFadeIn {
553+
from {
554+
opacity: 0;
555+
transform: translateY(-4px);
556+
}
557+
558+
to {
559+
opacity: 1;
560+
transform: translateY(0);
561+
}
591562
}
592563

593564
/* ---- Bottom Row ---- */

0 commit comments

Comments
 (0)