.container { position: relative; padding: 12px 0 4px; } /* Background track line spanning full width between first and last dot */ .track { position: absolute; top: 16px; left: calc(100% / 14); right: calc(100% / 14); height: 2px; background: var(--border-subtle); border-radius: 1px; } .trackFill { height: 100%; background: var(--amber); border-radius: 1px; transition: width 0.4s ease; } .trackFailed { background: var(--error); } /* Steps row — dots + labels positioned over the track */ .steps { position: relative; display: flex; justify-content: space-between; } .step { display: flex; flex-direction: column; align-items: center; width: calc(100% / 7); } /* Dots */ .dot { width: 10px; height: 10px; border-radius: 50%; border: 2px solid var(--border-subtle); background: var(--surface, #1a1a1a); display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: all 0.2s ease; } .dot.completed { background: var(--amber); border-color: var(--amber); color: var(--surface, #1a1a1a); } .dot.active { border-color: var(--amber); background: var(--amber); box-shadow: 0 0 0 3px color-mix(in srgb, var(--amber) 25%, transparent); animation: pulse 2s ease-in-out infinite; } .dot.failed { background: var(--error); border-color: var(--error); box-shadow: 0 0 0 3px color-mix(in srgb, var(--error) 25%, transparent); } /* Labels */ .label { font-size: 10px; color: var(--text-muted); text-align: center; margin-top: 6px; line-height: 1; opacity: 0.6; } .labelDone { opacity: 0.8; } .labelActive { color: var(--amber); font-weight: 600; opacity: 1; } .labelFailed { color: var(--error); font-weight: 600; opacity: 1; } @keyframes pulse { 0%, 100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--amber) 25%, transparent); } 50% { box-shadow: 0 0 0 5px color-mix(in srgb, var(--amber) 10%, transparent); } }