A tray of pale dough slides into a hairline deck oven, the lift door drops, the timer hand sweeps once, then the door rises and the loaves come out risen and baked in the accent color.
Also known as: baking animation, isometric oven, hairline animation.
<div class="hln-bakery-oven" role="img" aria-label="Loaves bake in an oven and come out risen"><svg viewBox="-47 -34.77 100 54.55" aria-hidden="true"><g><polygon points="-38,13 6,35 6,34 -38,12"/><polygon points="42,17 6,35 6,34 42,16"/><polygon points="-2,-6 42,16 6,34 -38,12"/></g><g><polygon points="-1.5,0.75 0,1.5 0,-7.5 -1.5,-8.25"/><polygon points="1.5,0.75 0,1.5 0,-7.5 1.5,-8.25"/><polygon points="0,-9 1.5,-8.25 0,-7.5 -1.5,-8.25"/></g><g><polygon points="25,14 26.5,14.75 26.5,5.75 25,5"/><polygon points="28,14 26.5,14.75 26.5,5.75 28,5"/><polygon points="26.5,4.25 28,5 26.5,5.75 25,5"/></g><g><polygon points="-15,7.5 -13.5,8.25 -13.5,-0.75 -15,-1.5"/><polygon points="-12,7.5 -13.5,8.25 -13.5,-0.75 -12,-1.5"/><polygon points="-13.5,-2.25 -12,-1.5 -13.5,-0.75 -15,-1.5"/></g><g><polygon points="11.5,20.75 13,21.5 13,12.5 11.5,11.75"/><polygon points="14.5,20.75 13,21.5 13,12.5 14.5,11.75"/><polygon points="13,11 14.5,11.75 13,12.5 11.5,11.75"/></g><g><polygon points="-17,-1.5 13,13.5 13,10.5 -17,-4.5"/><polygon points="30,5 13,13.5 13,10.5 30,2"/><polygon points="0,-13 30,2 13,10.5 -17,-4.5"/></g><line x1="-15" y1="-2" x2="11" y2="11" class="hln-bakery-oven-l"/><polygon points="-2,-11 26,3 26,-12 -2,-26"/><line x1="-2" y1="-26" x2="-15" y2="-19.5" class="hln-bakery-oven-l"/><line x1="26" y1="3" x2="13" y2="9.5" class="hln-bakery-oven-l"/><line x1="-2" y1="-11" x2="-15" y2="-4.5" class="hln-bakery-oven-l"/><g class="hln-bakery-oven-tray"><g><polygon points="-6,-2.2 6,3.8 6,3 -6,-3"/><polygon points="12,0.8 6,3.8 6,3 12,0"/><polygon points="0,-6 12,0 6,3 -6,-3"/></g><g class="hln-bakery-oven-loaf"><path d="M-2.76,-3.25 A2.26,3 0 0 1 1.76,-3.25 A2.26,1.13 0 0 1 -2.76,-3.25 Z"/><line x1="-1.2" y1="-6" x2="0.2" y2="-5.3" class="hln-bakery-oven-l"/></g><g class="hln-bakery-oven-loaf"><path d="M0.74,-1.5 A2.26,3 0 0 1 5.26,-1.5 A2.26,1.13 0 0 1 0.74,-1.5 Z"/><line x1="2.3" y1="-4.25" x2="3.7" y2="-3.55" class="hln-bakery-oven-l"/></g><g class="hln-bakery-oven-loaf"><path d="M4.24,0.25 A2.26,3 0 0 1 8.76,0.25 A2.26,1.13 0 0 1 4.24,0.25 Z"/><line x1="5.8" y1="-2.5" x2="7.2" y2="-1.8" class="hln-bakery-oven-l"/></g></g><path fill-rule="evenodd" d="M-16,-5 L14,10 L14,-9 L-16,-24 Z M-15,-4.5 L13,9.5 L13,-5.5 L-15,-19.5 Z"/><polygon points="30,2 14,10 14,-9 30,-17"/><polygon points="0,-32 30,-17 14,-9 -16,-24"/><g class="hln-bakery-oven-door"><polygon points="-15,-4.5 13,9.5 13,-5.5 -15,-19.5"/><polygon points="-12,-7 10,4 10,-4 -12,-15" class="hln-bakery-oven-l"/><line x1="-9" y1="-3.5" x2="7" y2="4.5"/></g><g><polygon points="-17.5,-23.75 13.5,-8.25 13.5,-18.25 -17.5,-33.75"/><polygon points="31,-17 13.5,-8.25 13.5,-18.25 31,-27"/><polygon points="0,-42.5 31,-27 13.5,-18.25 -17.5,-33.75"/></g><line x1="-13" y1="-27.5" x2="-11.5" y2="-26.75" class="hln-bakery-oven-l"/><line x1="-10" y1="-26" x2="-8.5" y2="-25.25" class="hln-bakery-oven-l"/><line x1="-7" y1="-24.5" x2="-5.5" y2="-23.75" class="hln-bakery-oven-l"/><line x1="-4" y1="-23" x2="-2.5" y2="-22.25" class="hln-bakery-oven-l"/><line x1="-1" y1="-21.5" x2="0.5" y2="-20.75" class="hln-bakery-oven-l"/><line x1="2" y1="-20" x2="3.5" y2="-19.25" class="hln-bakery-oven-l"/><line x1="5" y1="-18.5" x2="6.5" y2="-17.75" class="hln-bakery-oven-l"/><line x1="8" y1="-17" x2="9.5" y2="-16.25" class="hln-bakery-oven-l"/><path d="M13.74,-33 L13.74,-28 A2.26,1.13 0 0 0 18.26,-28 L18.26,-33 Z"/><ellipse cx="16" cy="-33" rx="2.26" ry="1.13"/><polygon points="19.4,-2.7 19.47,-3.31 19.66,-3.96 19.97,-4.6 20.38,-5.22 20.87,-5.78 21.42,-6.25 22,-6.6 22.58,-6.82 23.13,-6.91 23.62,-6.84 24.03,-6.64 24.34,-6.3 24.53,-5.85 24.6,-5.3 24.53,-4.69 24.34,-4.04 24.03,-3.4 23.62,-2.78 23.13,-2.22 22.58,-1.75 22,-1.4 21.42,-1.18 20.87,-1.09 20.38,-1.16 19.97,-1.36 19.66,-1.7 19.47,-2.15"/><g transform="matrix(-1 0.5 0 -1 22 -4)"><g class="hln-bakery-oven-hand"><line x1="0" y1="0" x2="0" y2="2"/></g></g><polygon points="24,3 20,5 20,3.5 24,1.5" class="hln-bakery-oven-l"/><polygon points="24,0 20,2 20,0.5 24,-1.5" class="hln-bakery-oven-l"/></svg></div>
.hln-bakery-oven {
--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-bakery-oven svg {
width: 100%;
height: 100%;
overflow: visible;
fill: #ffffff;
stroke: #1c1d21;
stroke-width: 1.25;
stroke-linejoin: round;
stroke-linecap: round;
}
.hln-bakery-oven svg * {
vector-effect: non-scaling-stroke;
}
.hln-bakery-oven-l {
stroke: #9a9ca3;
}
.hln-bakery-oven-tray {
animation: hln-bakery-oven-tray 7s linear infinite;
}
.hln-bakery-oven-door {
animation: hln-bakery-oven-door 7s linear infinite;
}
.hln-bakery-oven-hand {
transform-origin: 0 0;
animation: hln-bakery-oven-hand 7s linear infinite;
}
.hln-bakery-oven-loaf {
transform-box: fill-box;
transform-origin: 50% 100%;
animation: hln-bakery-oven-loaf 7s linear infinite;
}
@keyframes hln-bakery-oven-tray {
0%, 8% { transform: translate(calc(var(--u) * -8), calc(var(--u) * 4)); animation-timing-function: cubic-bezier(.65, 0, .35, 1); }
20%, 66% { transform: translate(calc(var(--u) * 0), calc(var(--u) * 0)); animation-timing-function: cubic-bezier(.3, 0, .25, 1.08); }
80%, 100% { transform: translate(calc(var(--u) * -8), calc(var(--u) * 4)); }
}
@keyframes hln-bakery-oven-door {
0%, 20% { transform: translate(calc(var(--u) * 0), calc(var(--u) * -13)); animation-timing-function: cubic-bezier(.5, 0, .3, 1.15); }
27%, 58% { transform: translate(calc(var(--u) * 0), calc(var(--u) * 0)); animation-timing-function: cubic-bezier(.65, 0, .35, 1); }
65%, 100% { transform: translate(calc(var(--u) * 0), calc(var(--u) * -13)); }
}
@keyframes hln-bakery-oven-hand {
0%, 27% { transform: rotate(0deg); animation-timing-function: cubic-bezier(.65, 0, .35, 1); }
58%, 100% { transform: rotate(360deg); }
}
@keyframes hln-bakery-oven-loaf {
0% { transform: scale(0.7, 0.55); fill: #fff; opacity: 0; animation-timing-function: cubic-bezier(.22, 1, .36, 1); }
6%, 40% { transform: scale(0.7, 0.55); fill: #fff; opacity: 1; animation-timing-function: cubic-bezier(.3, 1.45, .5, 1); }
50%, 88% { transform: scale(1); fill: var(--c); opacity: 1; animation-timing-function: ease-in; }
96%, 100% { transform: scale(1); fill: var(--c); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
.hln-bakery-oven * {
animation-play-state: paused !important;
animation-delay: calc(var(--delay, 0s) - 5.8s) !important;
}
}
@media (prefers-reduced-motion: reduce) {
.hln-bakery-oven, .hln-bakery-oven *, .hln-bakery-oven::before, .hln-bakery-oven::after, .hln-bakery-oven *::before, .hln-bakery-oven *::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.