Instructions. Edit Basalt with confidence.
Where everything lives in the Webflow Designer, how the motion is wired, and what to change when you make the template your own.
Getting started
Basalt ships with 15 pages: Home, Product, Integrations, Pricing, About, Careers, Blog, Blog Post (CMS template), Contact, Style Guide, Instructions, Licenses, Changelog, 404 and Password.
Classes follow Client-First naming. Global classes such as button, card, tag, heading-style-h2 and padding-section-medium are styled once and reused on every page. Colors, fonts and layout sizes are Webflow Variables, so open the Variables panel first when you rebrand.
The Style Guide page shows every global class in one place. Edit a class there and the change carries across the site.
Fonts
Go to Site settings → Fonts → Google Fonts and add:
- Fraunces, weights 300 to 500, for headings
- Inter Tight, weights 400 to 700, for body copy
- Martian Mono, for labels, buttons and tags
Fraunces needs its variable axes fixed so the headings stay crisp and upright. Select each heading class (heading-style-h1 to h3, text-statement) and add the custom property in the Style panel. Weight 360 and -0.02em tracking are already set on the classes.
font-variation-settings: "opsz" 72, "SOFT" 0, "WONK" 0;
Martian Mono is set slightly condensed. On text-style-mono, button, tag and form_label add:
font-stretch: 87.5%;
How to Edit GSAP Animations
Where the code lives
All motion runs from one script in Site settings → Custom code → Footer code. GSAP and its ScrollTrigger and SplitText plugins are loaded by Webflow's built-in GSAP integration (Site settings → GSAP: GSAP on, ScrollTrigger and SplitText ticked), so the template has no GSAP script tags of its own. Every block looks for its own data-animate elements, so one script serves every page and does nothing where its attribute is missing. If a plugin is switched off, the page stays static instead of breaking.
<!-- Site settings → GSAP: GSAP on, ScrollTrigger and SplitText ticked.
Webflow adds them to every page; no GSAP script tags are needed. -->
<script>
/* Basalt animations, blocks G1–G25 */
function basaltInit(){ ... }
</script>Webflow reserves data-ix for its own interactions, so Basalt uses data-animate. Add or edit it in the element's Settings panel under Custom attributes.
Animation blocks
| Block | What it does | data-animate | Pages |
|---|---|---|---|
| G1 | Intro timeline that G2 and G3 play on. No preloader. | none | All |
| G2 | Hero H1 lines rise from a mask, hero children fade up, navbar drops in. | hero split-hero fade | All |
| G3 | Basalt columns breathe and rise under the cursor. Wanders on its own on touch screens. | hero + .hero_columns [data-hex] | Home |
| G4 | Live latency and events/s numbers, scroll hint line. | live-latency live-events scroll-hint | Home |
| G5 | Logo strip scrolls in an endless loop. | marquee | Home, any logo strip |
| G6 | Section headings reveal line by line from a mask. | split | All |
| G7 | Statement words brighten as you scroll through them. | split-scrub | Home, any statement |
| G8 | Children rise in sequence, single blocks rise into view. | stagger reveal window | All |
| G9 | Product window: event stream, latency chart and card micro-motion. | stream chart-line cap-dot cap-hand cap-fill cap-pulse cap-rows | Home |
| G10 | Scroll position switches the product window panes. Panes cycle every 4 s on mobile. | step window-pane window-tab window | Home |
| G11 | Numbers count up from 40% when they enter. data-decimals sets the decimals. | count | Home, any metric |
| G12 | Testimonial Tabs autoplay with a progress line under each tab. | testimonials testimonial-progress | Home |
| G13 | Footer wordmark rises into view. | footer-logo | All |
| G14 | Capability cards scroll sideways on a sticky panel, with a progress bar. Desktop only. | horizontal horizontal-track horizontal-clip horizontal-progress | Home |
| G15 | Navbar hides on scroll down, returns on scroll up, darkens after 40px. | navbar | All |
| G16 | Magnetic buttons and the logo line lift on hover. Mouse and trackpad only. | magnetic logo logo-line | All |
| G17 | CTA honeycomb: seams glow around the cursor, cells ignite and cool, a wave runs on entry and on submit. | cta cta-clip cta-glow cta-cell form | Marketing pages with the CTA |
| G18 | Inner pages: list rows rise in turn, card grids rise with a slight scale, media drifts against the scroll. | rows cards parallax | Inner pages |
| G19 | Endless horizontal drift for repeating art, such as the Home 2 rock-layer lines. data-speed sets seconds per loop (default 40); data-direction="right" reverses it. | drift | Home 2 |
| G20 | Minimal loops inside illustrations. Add data-motion to an <svg> with any of: flow (dashed connectors stream), stack (log rows land), model (lines type in, a row scans the table), serve (hub breathes), dots (regions blink), schema (fields write in), bars (histogram breathes, flagged bar flashes), hexgrid (cells warm and cool), rings (orbits pulse), sensor (readings flicker). rail-spark sends a light along a line. | data-motion rail-spark | Home 2 |
| G21 | Terminal typing. Each direct child of the container is one line; command lines type character by character, lines with data-type="out" appear at once. Loops after data-hold seconds (default 3) and only plays while on screen. | type | Home 3 |
| G22 | Row hover. On a link row with data-hover="row", the child whose class contains "arrow" nudges up-right and turns white. The row's own hover state handles the background and left line. Fine pointers only. | data-hover="row" | Home 3, Home 4 |
| G23 | Thumbnail scroll. On a card with data-hover="thumb", the tall screenshot marked data-thumb scrolls from top to bottom while hovered and eases back on leave. Fine pointers only. | data-hover="thumb" data-thumb | Overview |
| G24 | Signal terrain (Home 5 hero). Stacked ridge lines breathe, the cursor raises a bright peak and the probe tag names the live source under it. Without a pointer the peak wanders on its own; reduced motion shows one still frame. | data-animate="terrain" data-row data-probe | |
This is some text inside of a div block. | This is some text inside of a div block. | This is some text inside of a div block. |
Settings
Timings sit in one SETTINGS object at the top of the script. Change a value and publish.
| Key | Default | What it changes |
|---|---|---|
revealEase | 'expo.out' | Easing for heading, section, row and card reveals |
revealDuration | 1.1 | Seconds for section heading line reveals (G6) |
staggerEach | 0.06 | Seconds between children in hero fades, stagger groups and card grids |
columnLift | 90 | How high hero columns rise under the cursor, in px (G3) |
columnRadius | 170 | Cursor influence radius on the hero columns, in px (G3) |
marqueeSpeed | 32 | Seconds per logo marquee loop (G5). Higher is slower. |
testimonialDelay | 7 | Seconds each testimonial shows before the next tab (G12) |
navHideAfter | 400 | Pixels scrolled before the navbar hides on scroll down (G15) |
Turning animations off
- One element: select it, open Settings → Custom attributes and delete its
data-animateattribute. The element stays visible and still. - One block site-wide: delete or comment out that block (for example everything under
/* G5 LOGO MARQUEE */) in the footer script. - Everything: remove the Basalt script from the footer code. Remove the three GSAP scripts as well if nothing else uses them. The layout does not depend on JavaScript.
Reduced motion and scrolling
The script uses gsap.matchMedia(). When a visitor has prefers-reduced-motion turned on, reveals, splits, counters, the marquee, the product window loops, parallax, magnetic buttons and the CTA glow do not run, and content shows in its final state. The hero columns stand still without breathing or the intro rise, and testimonials stop autoplaying.
Basalt never pins sections or replaces the browser's scrolling. Native scrolling stays intact, and the sticky product window and capabilities panel use CSS position: sticky set in the Style panel.
Interactions (IX3)
- Navbar menu: an IX3 click interaction on
navbar_menu-buttontogglesis-openonnavbar. CSS slides the menu down and turns the two lines into a cross below 991px. - This is some text inside of a div block.
- FAQ accordion: an IX3 click interaction on
faq_triggertogglesis-openon its parentfaq_item. CSS animates the height and the plus icon. - Pricing toggle, code samples and testimonials use the native Webflow Tabs element. Edit tab content in the Navigator, and keep the testimonial tab links in the same order as their panes.
Line system
- Rails: one
page-railsdiv sits insidepage-wrapperand draws the two vertical lines at the container edges. - Section lines: add the
section-linecombo class to a section for a top border with ┌ and ┐ marks where it meets the rails. The marks are the ::before and ::after pseudo-elements. - Corner frames: add
corner-frameto a card or box for four bracket marks. Set the--ccustom property on the element to change their color. - Contained backgrounds: put full-bleed art inside a
rail-clipdiv so it stops at the rails.
/* Custom property on a card to recolor its corner marks */ --c: var(--status--live);
Hero columns & CTA honeycomb
The basalt columns on the home hero and the honeycomb behind the CTA are inline SVG in Embed elements, each under Webflow's 50,000 character limit. G3 animates the columns and G17 animates the honeycomb.
- Make them lighter or darker: change opacity on
hero_bg(default 0.75) orcta_clip-bg(default 0.7). - Remove them: delete the Embed inside
hero_bgorcta_clip-bg. The script skips any block whose elements are missing. - Calm the motion: lower
columnLiftin SETTINGS for smaller columns, or delete the G17 block for a static honeycomb.
CMS
Three collections drive the dynamic pages. Every card on Blog, Careers and Integrations is a Collection List bound to them, so new items appear without design work.
- Blog Posts: name, slug, category, excerpt, cover image, author, publish date, read time, featured switch and rich text body. The Blog Post page is the collection template.
- Careers Roles: role name, slug, department (Engineering, Product & Design, Go-to-market), team, location, type, summary and description. Roles list on the Careers page in one Collection List per department, each filtered by that field.
- Integrations: name, slug, category, short description, icon and status. Cards fill the Integrations grid and can be filtered by category.
To add an item, open the CMS panel, pick the collection and select New item.
Inline SVG
The logo mark, icons and illustrations are inline SVG inside Embed elements. They inherit color from the text color, so a change to the parent's color restyles them. To swap one, double-click the Embed and paste your own SVG code. Keep fill="currentColor" or stroke="currentColor" to keep the theme colors.
<svg class="logo_mark" viewBox="0 0 24 24" fill="none" aria-hidden="true"> <path d="M1.75 12 6.6 3.5h10.8l4.85 8.5-4.85 8.5H6.6z" stroke="currentColor" stroke-width="1.5"/> <path data-animate="logo-line" d="M2.8 13.8H21.2" stroke="currentColor" stroke-width="1.5"/> </svg>