Liquid Metal Buttons · chrome & liquid metal for any website · v1.0
Make every button liquid.
Chrome, gold, mercury, holographic and 8 more metals on your own buttons, links, badges and cards. The reflections follow your pointer, hover melts the metal, a press squishes it and ripples. It stays a real button, and the label stays readable. A script tag, a React component or a Framer component.
One-time payment · Instant download · Single-project license · Free v1.x updates
- Your buttons stay real buttons
- Labels keep 4.5:1 contrast
- One WebGL context for all
- No dependencies · 14.7 KB gzipped
Showcase: all 12 metals
Chrome
Polished mirror chrome. The horizon in it moves with your pointer.
preset="chrome"Try Chrome with your label →Gold
Warm, deep yellow gold for the button that matters most.
preset="gold"Try Gold with your label →Mercury
The most liquid one. Hover it and the metal melts under the pointer.
preset="mercury"Try Mercury with your label →Holographic
Pastel rainbow foil, with a dark label that stays readable on every color.
preset="holographic"Try Holographic with your label →Gunmetal
Dark blue-grey steel with a light label. Quiet, serious, still shiny.
preset="gunmetal"Try Gunmetal with your label →Rose Gold
Pink gold for softer brands, with the same contrast-safe label.
preset="rose-gold"Try Rose Gold with your label →Black Chrome
A near-black mirror. Looks expensive on light pages.
preset="black-chrome"Try Black Chrome with your label →Titanium
Brushed grey with a fine grain and a hint of color.
preset="titanium"Try Titanium with your label →Copper
Orange-red copper, warm against dark backgrounds.
preset="copper"Try Copper with your label →Oil Slick
Dark metal with a rainbow sheen that shifts as it flows.
preset="oil-slick"Try Oil Slick with your label →Ice
Cold, pale blue metal for winter launches and clean tech.
preset="ice"Try Ice with your label →Neon Edge
A glowing violet rim around a dark fill. Focus it with Tab to see the glow.
preset="neon-edge"Try Neon Edge with your label →
Buttons, pills, icons, badges and cards
Five variants, each with sizes, radius and rim thickness. With no button or link inside, the tag itself becomes the metal: a badge, a price card, any box.
Button
variant="button"Pill
variant="pill"Icon button
variant="icon"- NewBetaLive
Badge
variant="badge" - Annual planTwo months free. Cancel any time.
Card
variant="card"
Still your button
The metal is a layer inside your own button or link, behind the label. Tab, Enter and Space, form submits, links, disabled and screen readers all work as they did. Try it here.
A button, a link, a disabled button
Tab through them: each has its own focus ring and glow. Screen readers hear a button, a link and a dimmed button.
30 buttons, one WebGL context
Every metal surface on a page is drawn by one shared renderer. These numbers are live, from this page. Scroll away and the frame rate drops to paused.
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- WebGL contexts
- –
- Metal surfaces on this page
- –
- Frames / s
- –
Playground
Type your label, pick a metal, a variant and a size, then shape it. The code under the preview follows along: copy it for a script tag, React or Framer.
Hover it, press it, Tab to it.
<script src="/liquid-metal-buttons.min.js" defer></script>
<pf-liquid-metal preset="chrome" variant="pill" size="lg" weight="600">
<button type="button">Get started</button>
</pf-liquid-metal>Like what you made? The snippet runs with the script from the download.
Buy Liquid Metal Buttons · $12Works with
- FramerCode component: label, link or your own component, properties panelIn the v1.0 download
- WebflowCustom attribute data-liquid-metal on any Button, or attach by classIn the v1.0 download
- Plain HTML / any site<pf-liquid-metal> around your <button> or <a> + one scriptIn the v1.0 download
- WordPressCustom HTML block, or skin the Button block by classIn the v1.0 download
- ShopifyTheme asset + Custom Liquid; Add to cart keeps workingIn the v1.0 download
- Squarespace, WixCode Injection / embed block (plan must allow custom code)In the v1.0 download
- React, Next.js, Vite<LiquidMetal onClick> renders a real <button> or <a>, server-renderedIn the v1.0 download
What it does
- 12 metals. Chrome, gold, mercury, holographic, gunmetal, rose gold, black chrome, titanium, copper, oil slick, ice and neon edge, or your own colors, fill, iridescence and brushed grain.
- Alive, not busy. Reflections follow the pointer anywhere on the page (and the tilt of a phone). Hover melts the metal, a press squishes it and sends a ripple from your finger, focus glows, and a glint sweeps across now and then.
- Still your button. The metal is a layer inside your <button> or <a>, behind the label. Tab, Enter, Space, forms, links, disabled and screen readers work exactly as before.
- Readable labels. Behind the label, the metal stays in a brightness range with at least 4.5:1 contrast against the label color, whatever the reflections do. Pick any label color; the metal adapts.
- Buttons, pills, icons, badges, cards. Five variants with sizes, radius, rim thickness, label font and weight. Or skin buttons already on the page with a selector or a data attribute.
- Many on a page. Every button on the page shares one WebGL context: 30 buttons cost one context, not 30. Offscreen ones pause, idle ones skip frames, and quality steps down on slow devices.
- Respectful. Reduce Motion shows still metal. Without WebGL you get a CSS version of the same metal, with the same contrast.
- Same settings everywhere. HTML attributes, data attributes, React props, or Framer's properties panel.
What's in the download
- liquid-metal-buttons.min.js: drop-in script for any website (36 KB, 14.7 KB gzipped)
- liquid-metal-buttons.esm.js + TypeScript types, for bundlers
- react/LiquidMetal.tsx: React component (React 18+, server-rendered, renders a real <button> or <a>)
- framer/LiquidMetal.tsx: the Framer code component, with a link, tap event and Framer's font picker
- demo.html with every preset and variant, forms, links and skinning existing buttons; quick starts for each platform
- Free updates to v1.x
Single-project license (LICENSE.md in the download): one website or project per license.
Install in about a minute
Upload liquid-metal-buttons.min.js from the download to your site.
Add the script once, and wrap any button or link in a <pf-liquid-metal> tag. It stays your button.
Pick a preset and a variant, or set size, radius, label color and the rest as attributes.
<script src="/liquid-metal-buttons.min.js" defer></script>
<pf-liquid-metal preset="chrome" variant="pill">
<a href="/start">Get started</a>
</pf-liquid-metal>Paste script/webflow/footer-code.html from the download into Site settings → Custom code → Footer code (or host the .js file and add its script tag there).
Select a Button → Element settings → Custom attributes: name data-liquid-metal, value chrome (or any preset). Add data-lm-variant = pill for a pill.
Publish. Custom code runs on the published site.
<!-- or skin every button with one class, from a Code Embed: -->
<pf-liquid-metal attach=".cta-button" preset="gold" variant="pill"></pf-liquid-metal>Custom code needs a paid Webflow site plan.
Upload liquid-metal-buttons.min.js to your Media library or your theme, and copy its URL.
Add a Custom HTML block with the script and your button in a <pf-liquid-metal> tag.
<script src="https://your-site.com/wp-content/uploads/liquid-metal-buttons.min.js" defer></script>
<pf-liquid-metal preset="gold"><a href="/shop">Shop now</a></pf-liquid-metal>On WordPress.com, you need a plan that allows custom code.
Online Store → Themes → Edit code → Assets: upload liquid-metal-buttons.min.js, and add its script tag before </body> in theme.liquid.
Skin the theme's own buttons by class. Add to cart keeps working: it's still the theme's button.
<script src="{{ 'liquid-metal-buttons.min.js' | asset_url }}" defer></script>
<pf-liquid-metal attach=".product-form__submit" preset="gold" variant="pill"></pf-liquid-metal>Copy react/LiquidMetal.tsx into your project. It needs only React 18+.
Use it like a button: onClick, type, disabled and every other prop go to the real element.
import LiquidMetal from "./LiquidMetal"
<LiquidMetal preset="chrome" variant="pill" onClick={start}>
Get started
</LiquidMetal>
<LiquidMetal as="a" href="/pricing" preset="gold">Pricing</LiquidMetal>Next.js: the server renders the real button with a CSS version of the metal; WebGL takes over in the browser.
In your Framer project, go to Assets → Code → + → New component file, and name it LiquidMetal.
Replace the file's contents with framer/LiquidMetal.tsx from the download, and save.
Drag LiquidMetal onto the canvas, set the label, font, link or tap interaction, and pick a preset.
On the Framer canvas you see a still frame, which keeps the editor fast. Set On Canvas to Live to see it move there.
Squarespace and Wix: add the script and the tag in a Code or Embed block (your plan must allow custom code). The download's README has a quick start for every platform and the full settings reference.
Liquid Metal Buttons
$12 one-time
- Script tag, React and Framer builds
- All 12 metals, five variants and every setting
- Free v1.x updates
- Single-project license
Secure checkout by Polar. Instant download after payment.
FAQ
Where does it work?
Anywhere you can add a script tag: Webflow, WordPress, Shopify, Squarespace, Wix, plain HTML. Also React/Next.js and Framer. Site builders need a plan that allows custom code.
Does my button still work like a button?
Yes. The metal is drawn in a layer inside your button or link, behind its label, and ignores the pointer. Clicks, Tab and focus, Enter and Space, form submits, links, disabled and screen readers are all your element's own. Take the tag away and the element is exactly what it was.
Can people read the label?
Yes. Behind the label, the metal is kept in a brightness range that gives at least 4.5:1 contrast (WCAG AA) with the label color, while the rim keeps the full shine. We measured it on every preset. If you change the label color, the metal adapts.
What about pages with lots of buttons?
Every button on the page shares one WebGL context and one renderer, so 30 buttons cost about what one does. Buttons offscreen don't render, idle ones skip frames, and quality steps down on slow devices. It also shares the page-wide budget with our other WebGL products.
Can I use it on buttons my site builder makes?
Yes. Give a Webflow button the custom attribute data-liquid-metal="gold", or point one tag at a class: attach=".cta-button". Shopify, WordPress and Squarespace buttons work the same way.
What about Reduce Motion and old browsers?
With Reduce Motion on, visitors see still metal. Without WebGL there's a CSS gradient version of the same metal, with the same label contrast.
Does it slow my page down?
The script is 14.7 KB gzipped with no dependencies, and draws only buttons that are on screen and changing. In our tests 30 buttons on one page ran at 40-55 fps even on a software renderer with no GPU.
What's the license?
Single project: one website or project per purchase. The details are in LICENSE.md in the download.
Do I get updates?
Yes, free updates for v1.x.
Questions before buying?
Email hi@gunnargray.com.
Hear about updates
The launch, new metals, v1.x releases and the occasional new tool. No more than that.