
The dinosaur-bitten logo
Intro, SVG, Text
NewFree
A logo intro on a brick wall at night, with no characters: a glass tube flies in, a blue flame heats it and bends it letter by letter along the outline of the brand, then the transformer's lever flips, the box hums and the gas comes on in fits and starts until the pink light holds on the bricks. 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 neon-bent logo</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/quicksand@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="scena">
<!-- the stage: the script measures it, traces the logo into tubes, paints the bricks and builds the transformer -->
<svg class="palco" data-stage role="img" aria-label="Lowlit" xmlns="http://www.w3.org/2000/svg">
<defs>
<!-- the brick wall: two tiles the script paints on a canvas, the wall in the dark and the wall lit by the sign -->
<pattern id="bricks" patternUnits="userSpaceOnUse" width="200" height="200" data-bricks>
<image width="200" height="200" preserveAspectRatio="none" data-bricks-image />
</pattern>
<pattern id="bricks-lit" patternUnits="userSpaceOnUse" width="200" height="200" data-bricks-lit>
<image width="200" height="200" preserveAspectRatio="none" data-bricks-lit-image />
</pattern>
<!-- where the light of the sign reaches the wall: strong around the tubes, gone a little further out -->
<radialGradient id="reach" cx="0.5" cy="0.5" r="0.5">
<stop offset="0" class="portata" />
<stop offset="0.55" class="portata portata--mezza" />
<stop offset="1" class="portata portata--via" />
</radialGradient>
<mask id="light-mask" maskUnits="userSpaceOnUse" data-light-mask>
<rect fill="url(#reach)" data-light-reach />
</mask>
<!-- the coloured air in front of the wall -->
<radialGradient id="air" cx="0.5" cy="0.5" r="0.5">
<stop offset="0" class="aria" />
<stop offset="1" class="aria aria--via" />
</radialGradient>
<!-- the warm light of the torch on the wall while the glass is bent -->
<radialGradient id="torch-light" cx="0.5" cy="0.5" r="0.5">
<stop offset="0" class="luce-cannello" />
<stop offset="1" class="luce-cannello luce-cannello--via" />
</radialGradient>
<!-- the dark corners of the night -->
<radialGradient id="vignette" cx="0.5" cy="0.46" r="0.75">
<stop offset="0.45" class="vignetta vignetta--via" />
<stop offset="1" class="vignetta" />
</radialGradient>
<!-- the torch flame: deep blue at the base, light blue, then gone at the tip -->
<linearGradient id="flame-outer" x1="0" y1="1" x2="0" y2="0">
<stop offset="0" class="fiamma-stop fiamma-stop--base" />
<stop offset="0.45" class="fiamma-stop" />
<stop offset="1" class="fiamma-stop fiamma-stop--via" />
</linearGradient>
<linearGradient id="flame-inner" x1="0" y1="1" x2="0" y2="0">
<stop offset="0" class="fiamma-cuore-stop" />
<stop offset="1" class="fiamma-cuore-stop fiamma-cuore-stop--punta" />
</linearGradient>
<!-- the steel of the transformer -->
<linearGradient id="box-steel" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" class="scatola-stop scatola-stop--luce" />
<stop offset="1" class="scatola-stop" />
</linearGradient>
<!-- the glows: the script sizes their boxes and blurs to the letters -->
<filter id="halo" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB" data-halo-filter>
<feGaussianBlur stdDeviation="20" data-halo-blur />
</filter>
<filter id="near" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB" data-near-filter>
<feGaussianBlur stdDeviation="5" data-near-blur />
</filter>
<filter id="heat" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB" data-heat-filter>
<feGaussianBlur stdDeviation="4" result="b" data-heat-blur />
<feMerge>
<feMergeNode in="b" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter id="shade" filterUnits="userSpaceOnUse" data-shade-filter>
<feGaussianBlur stdDeviation="3" data-shade-blur />
</filter>
</defs>
<!-- the wall, in the dark and lit by the sign -->
<rect fill="url(#bricks)" data-wall />
<rect fill="url(#bricks-lit)" mask="url(#light-mask)" data-wall-lit />
<rect class="aria-colore" fill="url(#air)" data-air />
<rect class="aria-colore" fill="url(#torch-light)" data-torch-light />
<rect fill="url(#vignette)" data-vignette />
<!-- the transformer, the cable to the sign, the lever and the hum -->
<g data-box-place>
<g data-box>
<g data-box-shake></g>
</g>
</g>
<path class="cavo" data-cable />
<!-- the sign: every outline of the logo is a glass tube, bent by the flame and then lit by the gas -->
<g data-sign>
<g class="ombra-tubo" filter="url(#shade)" data-shadows></g>
<g data-flame-place>
<g data-flame>
<path class="fiamma" fill="url(#flame-outer)" d="M0 0C-0.2 -0.14 -0.2 -0.42 -0.1 -0.62C-0.05 -0.76 -0.02 -0.9 0 -1C0.02 -0.9 0.05 -0.76 0.1 -0.62C0.2 -0.42 0.2 -0.14 0 0Z" />
<path class="fiamma" fill="url(#flame-inner)" d="M0 -0.03C-0.09 -0.1 -0.1 -0.3 -0.04 -0.46C-0.02 -0.54 0 -0.6 0 -0.62C0 -0.6 0.02 -0.54 0.04 -0.46C0.1 -0.3 0.09 -0.1 0 -0.03Z" />
</g>
</g>
<g data-caps></g>
<g class="vetro" data-glass></g>
<g class="gas-alone" filter="url(#halo)" data-halo></g>
<g class="gas-vicino" filter="url(#near)" data-near></g>
<g class="gas-tubo" data-gas></g>
<g class="gas-cuore" data-core></g>
<g class="vetro-lucido" data-shine></g>
<g filter="url(#heat)" data-hot></g>
<g class="caldo-cuore" data-hot-core></g>
<!-- the straight stretch of tube still to be bent, in the hands -->
<g data-tail>
<line class="ombra-tubo ombra-tubo--coda" filter="url(#shade)" data-tail-shadow />
<line class="vetro-coda" data-tail-glass />
<line class="vetro-lucido" data-tail-shine />
<line class="caldo" filter="url(#heat)" data-tail-hot />
</g>
</g>
</svg>
<p class="nota">Click or tap to see it again</p>
</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.
32 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 neon-bent logo” from Animorio and fit it into my siteThe logo is drawn on a canvas (the word in its typeface, or the picture) and every pixel becomes a value from 0 to 1; marching squares follow the line where the value crosses one half and give smooth, closed outlines, which Ramer-Douglas-Peucker thins out. Glass can't make a sharp corner: every corner becomes a small quadratic curve. The pieces are sorted left to right and pieces stacked one over the other (the dot of the i) stay in the same letter. Each outline starts at its lowest point, runs to the right and leaves a small gap between its two ends, where the electrodes go.
Every outline is an open path drawn several times (shadow, glass, highlight, gas, glow), and the part already bent is a stroke-dasharray as long as the progress. The straight piece still to be bent is a line that starts at the bend and points at a spot on the outline 0.3 letters further on: following that direction instead of the exact tangent, it turns smoothly through the curves. It is never longer than the outline left to bend and never leaves the stage.
The orange stretch is the same path with a single dash: a stroke-dasharray as long as the heat and a negative stroke-dashoffset so that it ends right on the bend; a feGaussianBlur with feMerge gives it its glow and a shorter yellow stroke the hottest point. The heat of each outline goes from 1 to 0 after the flame has passed, so the glass turns clear again from behind. The flame is two drops with a blue gradient; their scale and tilt flicker with sines of the timeline's clock.
Lit, every tube is a wide blurred glow, a near glow, the pink tube and an almost white heart, with an opacity given by how much gas there is, how lit that letter is and the power. The bricks are painted on a canvas twice with the same seeds: in the dark and lit pink. The lit one sits on top, with a radial-gradient mask around the sign and an opacity equal to how lit the sign is on average, so the wall follows every flicker.
The whole intro is one timeline, with the labels start, bend, cool, switch, light, rest and leave, and timeScale for the speed. The flickers are a series of sets on the power and on the letters, written as pairs of time and value and softened by FLICKER; the first time the stubborn letter is always the same, then it changes. If IMAGE holds an address, the outline of the dark or coloured parts of the picture (or its shape, if it is light on transparent) becomes the tubes. 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 | 'Lowlit' | The logo as a word: the outline of every letter becomes a glass tube. |
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 and the outline of its dark or coloured parts becomes the tubes. |
BEND | script.js | 3.4 | How many seconds the flame takes to bend the tube into the whole logo. |
FLICKER | script.js | 1 | How much the gas stutters before the light holds: 0 comes on clean, 2 is a fight, with more jolts. |
GLOW | script.js | 1 | How strong the glow is, around the tubes and on the bricks (0 = just the lit tubes). |
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 logo stays lit before it is switched off. |
LOOP | script.js | true | Whether the sign switches off, the tubes wind back and a new one is bent. With false the logo stays lit, with a tremble now and then. |
To present a logo with the mood of a place at night: the opening of the site of a cocktail bar, a pizzeria, a club, a barber, a festival or a brand that wants an after-dark feel, a preview for a client, a loading screen, a social post. It works with a written wordmark and with a picture of simple shapes.
The same animation with the sizes adapted: the logo is almost as wide as the screen, the bricks keep their size and the tube being bent never goes past the edges. A tap restarts it.
Nothing moves: the sign, already bent, and the transformer fade in on the wall, then the light comes up slowly, with no flicker. If the animation starts again, the light fades out and the sign fades away.
GSAP 3.15.0, Quicksand (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 18 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.