
The origami-unfolding logo
Intro, SVG, Transitions
NewFree
A logo intro for a tailor’s shop: the screen is covered by two pieces of wool with a chalk line between them. The letters fall from the middle, the shears cut along the line, a counter climbs in steps of five, the buttons roll in; then the cut opens and the two pieces lift off towards the edges, and the page is underneath. In the Playground you type your own name or upload your own logo.
A folder that runs on its own: index.html, style.css, script.js and the libraries from a CDN. The React and Vue tabs hold the same demo as a ready component, which switches its animations off when it leaves the page.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>The logo cut along the line</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/archivo@5.3.0/index.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/geist-mono@5.3.0/index.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource/instrument-serif@5.3.0/400-italic.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="scena" data-scene>
<!-- the page of the tailor's shop: it waits under the cloth and comes in line by line once the cloth is cut -->
<div class="pagina" data-page>
<header class="testa riga" data-line>
<span>Made to measure</span>
<nav aria-label="Main"><a href="#fittings">Fittings</a><a href="#cloth">Cloth</a><a href="#visit">Visit</a></nav>
</header>
<div class="eroe">
<h1 class="marchio riga" data-line data-page-logo>Bias Cut</h1>
<!-- the seam under the logo: the stitches run in behind a little needle -->
<svg class="cucitura riga" data-line data-seam aria-hidden="true">
<defs><clipPath id="seam-clip"><rect data-seam-clip /></clipPath></defs>
<path class="cucitura-punti" clip-path="url(#seam-clip)" data-seam-stitches />
<g data-needle>
<path class="ago" d="M-26 -1.6L2 -0.6Q5 0 2 0.6L-26 1.6Q-29 0 -26 -1.6Z" />
<ellipse class="ago-cruna" cx="-22" cy="0" rx="2.6" ry="0.7" />
</g>
</svg>
<p class="motto riga" data-line><em>Suits cut by hand,</em></p>
<p class="motto riga" data-line><em>made to your measure.</em></p>
<p class="orari riga" data-line>Fittings by appointment</p>
<p class="riga" data-line>
<a class="bottone" href="#fittings">
<span class="bottone__fondo"></span>
<span class="bottone__testo">Book a fitting</span>
<svg class="bottone__freccia" viewBox="0 0 20 12" aria-hidden="true"><path d="M1 6H18M13 1.5L18 6L13 10.5" /></svg>
</a>
</p>
</div>
<p class="nota">Click or tap to see it again</p>
</div>
<!-- the cloth: two pieces of a sewing pattern with a chalk line between them. The script draws their cut edges every frame -->
<svg class="palco" data-stage aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
<defs>
<!-- the twill of the wool: fine diagonal ribs -->
<pattern id="twill" patternUnits="userSpaceOnUse" width="7" height="7" patternTransform="rotate(-38)">
<rect class="trama-fondo" width="7" height="7" />
<path class="trama" d="M0 1.6H7M0 5.1H7" />
</pattern>
<clipPath id="clip-top"><path data-clip-top /></clipPath>
<clipPath id="clip-bottom"><path data-clip-bottom /></clipPath>
<clipPath id="clip-count"><rect data-clip-count /></clipPath>
<!-- the shade a lifting piece of cloth throws on the page -->
<linearGradient id="shade-down" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" class="ombra" stop-opacity="0.32" />
<stop offset="1" class="ombra" stop-opacity="0" />
</linearGradient>
<linearGradient id="shade-up" x1="0" y1="1" x2="0" y2="0">
<stop offset="0" class="ombra" stop-opacity="0.32" />
<stop offset="1" class="ombra" stop-opacity="0" />
</linearGradient>
<!-- a picture logo, written in chalk: its dark and coloured parts become chalk, its light parts stay cloth -->
<filter id="chalk" color-interpolation-filters="sRGB">
<feColorMatrix type="matrix" data-chalk-matrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -0.48 -0.94 -0.18 0 1.6" />
<feComposite in2="SourceAlpha" operator="in" />
</filter>
</defs>
<rect fill="url(#shade-down)" data-shade-top />
<rect fill="url(#shade-up)" data-shade-bottom />
<!-- the upper piece: the logo, the counter and the cutting note -->
<g clip-path="url(#clip-top)">
<rect class="stoffa" data-cloth-top />
<rect fill="url(#twill)" data-twill-top />
<g data-top></g>
</g>
<!-- the lower piece: the grainline and the buttons -->
<g clip-path="url(#clip-bottom)">
<rect class="stoffa" data-cloth-bottom />
<rect fill="url(#twill)" data-twill-bottom />
<g data-bottom></g>
</g>
<path class="cimosa" data-edge-top />
<path class="cimosa" data-edge-bottom />
<!-- the chalk line: dashed ahead of the shears, a clean cut behind them -->
<g data-line-all>
<path class="linea-tratteggio" data-dash />
<path class="linea-taglio" data-cut />
</g>
<!-- the tailor's shears; the pivot screw is 0 0, the blades point right -->
<g data-shears>
<g data-blade-b>
<g transform="scale(1 -1)">
<path class="anello-bordo" d="M-3 2C-10 6 -17 10 -24 14" />
<ellipse class="anello-bordo" cx="-34" cy="18" rx="11" ry="7.5" transform="rotate(-24 -34 18)" />
<path class="anello" d="M-3 2C-10 6 -17 10 -24 14" />
<ellipse class="anello" cx="-34" cy="18" rx="11" ry="7.5" transform="rotate(-24 -34 18)" />
<path class="lama" d="M-6 0.8L62 0.8Q66.5 0.4 64 -1.2C48 -4.6 22 -9 2 -9.5C-5 -9.5 -9 -4 -6 0.8Z" />
<path class="lama-filo" d="M4 -0.6L59 -0.6" />
</g>
</g>
<g data-blade-a>
<path class="anello-bordo" d="M-3 2C-10 6 -17 10 -24 14" />
<ellipse class="anello-bordo" cx="-34" cy="18" rx="11" ry="7.5" transform="rotate(-24 -34 18)" />
<path class="anello" d="M-3 2C-10 6 -17 10 -24 14" />
<ellipse class="anello" cx="-34" cy="18" rx="11" ry="7.5" transform="rotate(-24 -34 18)" />
<path class="lama" d="M-6 0.8L62 0.8Q66.5 0.4 64 -1.2C48 -4.6 22 -9 2 -9.5C-5 -9.5 -9 -4 -6 0.8Z" />
<path class="lama-lume" d="M6 -6.4C24 -6.6 44 -4.4 58 -1.8" />
</g>
<circle class="vite" r="3.4" />
<circle class="vite-lume" cx="-0.9" cy="-0.9" r="1.1" />
</g>
</svg>
</main>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
<script src="script.js"></script>
</body>
</html>Change values, colours and text with the controls and watch the animation respond live. Or write in the code yourself. Then download the folder with your changes.
35 values to change
With the Animorio connector, Claude Code takes it from here, guide included, and fits it into your project. Paste this request:
Take “The logo cut along the line” from Animorio and fit it into my siteThe stage is an SVG whose viewBox is as big as the window, so one unit is one pixel, and underneath sits the real page, in HTML. The line cuts the screen at 60% of its height (TOP): the logo is measured on a canvas in the same typeface (measureText, actualBoundingBoxAscent for the true height) and takes the biggest size that fits the width and the room between the notes of the upper piece. The notes, the shears, the buttons and the teeth of the edge are counted on the short side of the window, with a minimum and a maximum, so they stay readable on a phone and do not grow huge on a big monitor.
Each piece of cloth is a path rebuilt every frame from two numbers: how far it has lifted and how wide the cut has opened. The cut edge is a zigzag: the teeth of the upper piece fall exactly into the gaps of the lower one, so while they are closed nothing shows. The same path is the clipPath of the piece’s content (logo, counter, notes, buttons), which is therefore cut away as the cloth lifts. Under each edge a rectangle with a gradient makes the shade on the page, stronger while the pieces are close and gone once they have left.
The shears are two equal halves (blade and ring) turning on the screw: one is a copy of the other flipped with scale(1 -1), and the script opens them by ±SNIP/2 degrees. They run from 7% of the width to off screen in 3 seconds with power1.inOut, that is inOutQuad, and the clean line goes from 9% to 102.5% with the same progress; nine yoyo snips open and close them on the way. The counter is three strips of digits inside a clipped window: the units roll all the time (STEP at a time), the tens and the hundreds only turn when the units pass their last step, like an odometer. An object goes from 0 to 100 in 3 seconds with power2.inOut and the strips follow it.
The whole intro is one timeline, with the labels start, fall, cut, open, reveal, rest and close and timeScale for the speed. The letters fall in 2 seconds with power1.out and a 0.05 stagger from the centre; the buttons come in from −80% of the width in 2.8, 2.7, 2.6… seconds with power2.inOut (inOutCubic) and turn by how far they travel divided by their radius, so they really roll. Once the cut is done the slit opens with elastic.out, the buttons leave, and 0.15 seconds later the pieces lift off in 1.5 seconds on the curve cubic-bezier(0.55, 0.055, 0.675, 0.19): GSAP does not have it among its own, so the script works it out itself (Newton and, when needed, bisection) and passes it as a function.
The page underneath is plain HTML: each line goes from opacity 0, a 10 pixel blur and 15 pixels lower to sharp in 0.6 seconds with a 0.1 stagger, then the filter is removed altogether. The seam is a dashed path uncovered by a widening clipPath, and the needle follows its tip, bobbing up and down at every stitch. If IMAGE holds an address, the logo becomes that picture: on the cloth a feColorMatrix filter turns it into chalk (the dark and coloured parts become chalk, the light parts and the transparent background stay cloth), on the page it stays as it is. In the Playground, next to the field, there is a button to upload a file, which goes into the code as a data: address.
| Name | File | Default | What it changes |
|---|---|---|---|
NAME | script.js | 'BIAS CUT' | The logo as a word: each letter falls on its own, the middle ones first. It is also the logo of the page underneath. |
IMAGE | script.js | '' | The logo as a picture: the address of a file, or upload it from your computer. If there is one, it takes the place of the word: in chalk on the cloth, in its own colours on the page. |
TOP | script.js | 0.6 | Where the line runs: how much of the screen the upper piece takes (0.6 = 60%); the lower one takes the rest. |
STEP | script.js | 5 | How much the counter climbs at each turn of its rollers: 1, 2, 5 or 10. |
BUTTONS | script.js | 5 | How many buttons roll in on the lower piece: each one has one more side, the last is round (0 = none). |
SNIP | script.js | 28 | How wide the shears open at every snip, in degrees (0 = they stay shut and slide). |
SPEED | script.js | 1 | The speed of the whole animation: 2 is twice as fast, 0.5 half as fast. |
REST | script.js | 4 | How many seconds the page stays on show before the cloth comes back to cover it. |
LOOP | script.js | true | Whether the cloth comes back over the page and it all starts again. With false the page stays uncovered. |
For the loading screen or the opening of a site that works with hands and cloth: a tailor’s shop, a fabric store, a clothing brand, a haberdashery, a sewing school; or to present a logo to a client or in a post. The cut that opens is also a transition from a cover to the real page, good for any site that wants a bold entrance. It works with a written wordmark and with a picture.
The same animation with the sizes adapted: the logo is almost as wide as the screen, the notes, the shears and the buttons have a minimum size to stay readable, and the teeth of the edge get finer. A tap restarts it.
Nothing moves: the cloth is shown already cut, with the logo in place, the counter at 100 and the buttons in a row; then it fades away and the page fades in in its place, with no movement either. If the animation starts again, the page fades and the cloth fades back in.
GSAP 3.15.0, Archivo (font variabile) 5.3.0, Geist Mono (font variabile) 5.3.0, Instrument Serif 5.3.0.
Compressed with gzip, the three demo files weigh 13 KB; the libraries: GSAP 28 KB.
Tested on 13 October 2026
Use it in your own projects and in your clients’ projects. Do not resell it or redistribute it as is. GSAP stays under its own Standard license. Full license.
With your account’s email and password.
or with your email
You’re signed in as .
With your account, you can download the zip of every animation and every pack, for free.