An isometric hairline workspace: lines of code type onto the monitor, a plant leans over the keyboard, and steam curls up from the accent mug in a slow, seamless loop.
Also known as: isometric desk illustration, workspace animation, hairline animation.
<div class="hln-desk-setup" role="img" aria-label="A desk with a monitor typing code and a steaming mug"><svg viewBox="-38 -25.09 92 50.18" aria-hidden="true"><g><polygon points="-32,10 16,34 16,33 -32,9"/><polygon points="46,19 16,34 16,33 46,18"/><polygon points="-2,-6 46,18 16,33 -32,9"/></g><g><polygon points="-1.2,0.1 0,0.7 0,-12.3 -1.2,-12.9"/><polygon points="1.2,0.1 0,0.7 0,-12.3 1.2,-12.9"/><polygon points="0,-13.5 1.2,-12.9 0,-12.3 -1.2,-12.9"/></g><g><polygon points="32.8,17.1 34,17.7 34,4.7 32.8,4.1"/><polygon points="35.2,17.1 34,17.7 34,4.7 35.2,4.1"/><polygon points="34,3.5 35.2,4.1 34,4.7 32.8,4.1"/></g><g><polygon points="-17.2,8.1 -16,8.7 -16,-4.3 -17.2,-4.9"/><polygon points="-14.8,8.1 -16,8.7 -16,-4.3 -14.8,-4.9"/><polygon points="-16,-5.5 -14.8,-4.9 -16,-4.3 -17.2,-4.9"/></g><g><polygon points="16.8,25.1 18,25.7 18,12.7 16.8,12.1"/><polygon points="19.2,25.1 18,25.7 18,12.7 19.2,12.1"/><polygon points="18,11.5 19.2,12.1 18,12.7 16.8,12.1"/></g><g><polygon points="-18,-5 18,13 18,11.5 -18,-6.5"/><polygon points="36,4 18,13 18,11.5 36,2.5"/><polygon points="0,-15.5 36,2.5 18,11.5 -18,-6.5"/></g><g><polygon points="6,-5.5 14,-1.5 14,-2.1 6,-6.1"/><polygon points="18,-3.5 14,-1.5 14,-2.1 18,-4.1"/><polygon points="10,-8.1 18,-4.1 14,-2.1 6,-6.1"/></g><g><polygon points="11.4,-5.4 12.6,-4.8 12.6,-9.2 11.4,-9.8"/><polygon points="13.8,-5.4 12.6,-4.8 12.6,-9.2 13.8,-9.8"/><polygon points="12.6,-10.4 13.8,-9.8 12.6,-9.2 11.4,-9.8"/></g><g><polygon points="1.3,-15.15 25.3,-3.15 25.3,-16.15 1.3,-28.15"/><polygon points="26.5,-3.75 25.3,-3.15 25.3,-16.15 26.5,-16.75"/><polygon points="2.5,-28.75 26.5,-16.75 25.3,-16.15 1.3,-28.15"/></g><polygon points="2.3,-15.65 24.3,-4.65 24.3,-15.65 2.3,-26.65" class="hln-desk-setup-l"/><g class="hln-desk-setup-code" style="--delay: -0s"><line x1="3.8" y1="-24.3" x2="14.3" y2="-19.05"/></g><g class="hln-desk-setup-code" style="--delay: -0.25s"><line x1="5.8" y1="-21.5" x2="18.3" y2="-15.25"/></g><g class="hln-desk-setup-code" style="--delay: -0.5s"><line x1="5.8" y1="-19.7" x2="12.3" y2="-16.45"/></g><g class="hln-desk-setup-code" style="--delay: -0.75s"><line x1="7.8" y1="-16.9" x2="20.3" y2="-10.65"/></g><g class="hln-desk-setup-code" style="--delay: -1s"><line x1="3.8" y1="-17.1" x2="9.3" y2="-14.35"/></g><g><polygon points="-5,-4 11,4 11,3.2 -5,-4.8"/><polygon points="16,1.5 11,4 11,3.2 16,0.7"/><polygon points="0,-7.3 16,0.7 11,3.2 -5,-4.8"/></g><line x1="0.9" y1="-6.25" x2="-2.9" y2="-4.35" class="hln-desk-setup-l"/><line x1="2.5" y1="-5.45" x2="-1.3" y2="-3.55" class="hln-desk-setup-l"/><line x1="4.1" y1="-4.65" x2="0.3" y2="-2.75" class="hln-desk-setup-l"/><line x1="5.7" y1="-3.85" x2="1.9" y2="-1.95" class="hln-desk-setup-l"/><line x1="7.3" y1="-3.05" x2="3.5" y2="-1.15" class="hln-desk-setup-l"/><line x1="8.9" y1="-2.25" x2="5.1" y2="-0.35" class="hln-desk-setup-l"/><line x1="10.5" y1="-1.45" x2="6.7" y2="0.45" class="hln-desk-setup-l"/><line x1="12.1" y1="-0.65" x2="8.3" y2="1.25" class="hln-desk-setup-l"/><line x1="13.7" y1="0.15" x2="9.9" y2="2.05" class="hln-desk-setup-l"/><line x1="-1.2" y1="-6.1" x2="13.6" y2="1.3" class="hln-desk-setup-l"/><line x1="-2.8" y1="-5.3" x2="12" y2="2.1" class="hln-desk-setup-l"/><g><polygon points="14.5,4.75 16.5,5.75 16.5,4.85 14.5,3.85"/><polygon points="19.5,4.25 16.5,5.75 16.5,4.85 19.5,3.35"/><polygon points="17.5,2.35 19.5,3.35 16.5,4.85 14.5,3.85"/></g><path d="M24.89,-0.7 L25.45,2.5 A2.55,1.27 0 0 0 30.55,2.5 L31.11,-0.7 Z"/><ellipse cx="28" cy="-0.7" rx="3.11" ry="1.56"/><ellipse cx="25.8" cy="-3.9" rx="1.3" ry="3.4" transform="rotate(-30 25.8 -3.9)"/><ellipse cx="30.2" cy="-4.1" rx="1.3" ry="3.4" transform="rotate(30 30.2 -4.1)"/><ellipse cx="28" cy="-4.9" rx="1.3" ry="3.4" transform="rotate(0 28 -4.9)"/><polygon points="19.8,5.6 19.77,5.36 19.7,5.12 19.58,4.87 19.42,4.63 19.23,4.42 19.02,4.24 18.8,4.1 18.58,4.01 18.37,3.98 18.18,4.01 18.02,4.09 17.9,4.22 17.83,4.39 17.8,4.6 17.83,4.84 17.9,5.08 18.02,5.33 18.18,5.57 18.37,5.78 18.58,5.96 18.8,6.1 19.02,6.19 19.23,6.22 19.42,6.19 19.58,6.11 19.7,5.98 19.77,5.81" fill="none"/><path d="M14.6,2.6 L14.6,6 A2.4,1.2 0 0 0 19.4,6 L19.4,2.6 Z" class="hln-desk-setup-a"/><ellipse cx="17" cy="2.6" rx="2.4" ry="1.2" class="hln-desk-setup-a"/><ellipse cx="17" cy="2.6" rx="1.7" ry="0.85" class="hln-desk-setup-l"/><path class="hln-desk-setup-steam" style="--delay: 0s" fill="none" d="M16.1,1.6 c-1.4,-1.8 1.4,-3 0,-4.8 s1.4,-3 0,-4.8"/><path class="hln-desk-setup-steam" style="--delay: -1.5s" fill="none" d="M18.1,1.6 c-1.4,-1.8 1.4,-3 0,-4.8 s1.4,-3 0,-4.8"/></svg></div>
.hln-desk-setup {
--c: var(--hln-color, #ff4f2e);
font-size: var(--hln-size, 16px);
position: relative;
display: grid;
place-items: center;
width: 22em;
height: 12em;
border-radius: 0.75em;
background: #f6f5f1;
overflow: hidden;
--u: 1px;
}
.hln-desk-setup svg {
width: 100%;
height: 100%;
overflow: visible;
fill: #ffffff;
stroke: #1c1d21;
stroke-width: 1.25;
stroke-linejoin: round;
stroke-linecap: round;
}
.hln-desk-setup svg * {
vector-effect: non-scaling-stroke;
}
.hln-desk-setup-l {
stroke: #9a9ca3;
}
.hln-desk-setup-a {
fill: var(--c);
}
.hln-desk-setup-code {
transform-box: fill-box;
transform-origin: 0 0;
animation: hln-desk-setup-code 6s linear infinite;
animation-delay: var(--delay);
}
.hln-desk-setup-steam {
stroke: #9a9ca3;
animation: hln-desk-setup-steam 3s linear infinite;
animation-delay: var(--delay);
}
@keyframes hln-desk-setup-code {
0%, 6% { transform: scale(0); opacity: 1; animation-timing-function: steps(6, end); }
18%, 84% { transform: scale(1); opacity: 1; animation-timing-function: ease-in; }
92%, 100% { transform: scale(1); opacity: 0; }
}
@keyframes hln-desk-setup-steam {
0% { opacity: 0; transform: translate(calc(var(--u) * 0), calc(var(--u) * 0)); animation-timing-function: ease-out; }
25% { opacity: 1; transform: translate(calc(var(--u) * 0), calc(var(--u) * -1.5)); animation-timing-function: linear; }
70% { opacity: 0.7; transform: translate(calc(var(--u) * 0), calc(var(--u) * -4)); animation-timing-function: ease-in; }
100% { opacity: 0; transform: translate(calc(var(--u) * 0), calc(var(--u) * -5.5)); }
}
@media (prefers-reduced-motion: reduce) {
.hln-desk-setup * {
animation-play-state: paused !important;
animation-delay: calc(var(--delay, 0s) - 2.4s) !important;
}
}
@media (prefers-reduced-motion: reduce) {
.hln-desk-setup, .hln-desk-setup *, .hln-desk-setup::before, .hln-desk-setup::after, .hln-desk-setup *::before, .hln-desk-setup *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}--hln-color on the element or a parent.
Currently previewing #3b82f6.--hln-size. Every other dimension is in
em, so the whole thing scales together. Currently previewing 16px.transition or animation
shorthand. Staggered delays are relative, so they keep their rhythm.