Files
wehub-resource-sync d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

142 lines
3.6 KiB
CSS

/**
* Shared 4.5s animation timeline for the DeployGraphic vignette: the connector
* line sweep and the browser outline trace. Each connector line is a 1px
* faint grey track (styled in the TSX) clipping an absolutely-positioned
* white sweep that travels top to bottom; the lower line's sweep is delayed
* so the two read as one continuous flow. The moment the lower sweep's
* leading edge lands on the browser's top edge the outline trace takes over:
* four rounded-rect border overlay copies (a top pair and a side pair,
* mirrored left/right) are revealed by animated clip-path inset windows, so
* the white line splits at top-center, draws outward along the top border,
* bends around the exact rounded-corner geometry, and continues down the
* sides while the tail releases from center and follows the head — a
* traveling pulse that runs out and off the outline. Under
* prefers-reduced-motion everything is static: plain faint lines, no sweep,
* no trace.
*
* Timeline (percent of 4.5s): each sweep's full pass spans 22% (~1s); the
* lower sweep is delayed 0.9s, so its leading edge reaches the line bottom at
* 0.9s + 0.5s = 1.395s = 31%, where the trace begins with no gap. Trace head
* runs center → corner over 31→43%, head descends the sides while the tail
* crosses the top over 43→55%, and the tail descends and exits the open
* bottom by 67%; the loop rests until 100%. The top windows keep a 14px-tall
* strip (12px radius + 1px border on each box edge) so the corner arc
* belongs to the top pair; the side pair starts 13px down, exactly where the
* arc ends.
*/
.sweep {
position: absolute;
inset: 0;
background: var(--text-inverse);
transform: translateY(-101%);
animation: deploy-line-sweep 4.5s linear infinite;
}
.sweepLower {
animation-delay: 0.9s;
}
@keyframes deploy-line-sweep {
0% {
transform: translateY(-101%);
}
22% {
transform: translateY(101%);
}
100% {
transform: translateY(101%);
}
}
.traceTopLeft {
clip-path: inset(0 50% calc(100% - 14px) 50%);
animation: deploy-trace-top-left 4.5s linear infinite;
}
.traceTopRight {
clip-path: inset(0 50% calc(100% - 14px) 50%);
animation: deploy-trace-top-right 4.5s linear infinite;
}
.traceSideLeft {
clip-path: inset(13px calc(100% - 14px) calc(100% - 13px) 0);
animation: deploy-trace-side-left 4.5s linear infinite;
}
.traceSideRight {
clip-path: inset(13px 0 calc(100% - 13px) calc(100% - 14px));
animation: deploy-trace-side-right 4.5s linear infinite;
}
@keyframes deploy-trace-top-left {
0%,
31% {
clip-path: inset(0 50% calc(100% - 14px) 50%);
}
43% {
clip-path: inset(0 50% calc(100% - 14px) 0);
}
55%,
100% {
clip-path: inset(0 100% calc(100% - 14px) 0);
}
}
@keyframes deploy-trace-top-right {
0%,
31% {
clip-path: inset(0 50% calc(100% - 14px) 50%);
}
43% {
clip-path: inset(0 0 calc(100% - 14px) 50%);
}
55%,
100% {
clip-path: inset(0 0 calc(100% - 14px) 100%);
}
}
@keyframes deploy-trace-side-left {
0%,
43% {
clip-path: inset(13px calc(100% - 14px) calc(100% - 13px) 0);
}
55% {
clip-path: inset(13px calc(100% - 14px) 0 0);
}
67%,
100% {
clip-path: inset(100% calc(100% - 14px) 0 0);
}
}
@keyframes deploy-trace-side-right {
0%,
43% {
clip-path: inset(13px 0 calc(100% - 13px) calc(100% - 14px));
}
55% {
clip-path: inset(13px 0 0 calc(100% - 14px));
}
67%,
100% {
clip-path: inset(100% 0 0 calc(100% - 14px));
}
}
@media (prefers-reduced-motion: reduce) {
.sweep {
display: none;
animation: none;
}
.traceTopLeft,
.traceTopRight,
.traceSideLeft,
.traceSideRight {
display: none;
animation: none;
}
}