Brand guidelines

Design system

Every page, module and component on the site, built from one set of tokens and one motion engine. Everything here is live: change a token in the tuner and the whole site follows.

Where the build stands

Counted from the source on every build.

Pages
18
Components
11
Modules
58
Tokens
1080
All CSS, gzipped
105.3 KB
All JS, gzipped
87.6 KB

Pages and what they are built from

/ HeroBannerReleaseCardsMissionList
/404 None
/blog Crumbblog/BlogHeroblog/Carouselblog/PostGridblog/FeaturedLinkblog/CtaBand
/blog/[slug] Crumbblog/PostMetablog/PictosIconsblog/Chartblog/RelatedPostsblog/CtaBand
/brand Crumbbrand/MotionStagebrand/SectionHeadbrand/BrandReelWordmarkIcons
/brand/identity Crumbbrand/MotionStagebrand/SectionHeadbrand/LogoConstructionbrand/LogoOpticalWordmarkMark
/brand/messaging Crumbbrand/MotionStagebrand/SectionHead
/brand/motion Crumbbrand/MotionStagebrand/SectionHeadbrand/BrowserMini
/design-system CrumbButtonMenuSheetAccordionTileIconsWordmarkMarkmodules/Artifact
/design-system/sample/[...style] CrumbHeroBannerReleaseCardsMissionList
/lab Crumblab/LabCard
/lab/[slug] Crumblab/LabPlayer
/products CrumbAccordionproduct/Heroproduct/Dayproduct/Quotesproduct/Changeproduct/Pickerproduct/Askmodules/NewsToast
/products/code CrumbHeroAccordionmodules/Sectionmodules/SectionIntromodules/AppShellmodules/LogoWallmodules/Plansmodules/Changelogmodules/CodeSnippetmodules/TerminalTabsmodules/MediaColumnsmodules/BannerCardmodules/QuoteListmodules/ResourceCardsmodules/CtaBand
/products/science CrumbHeroAccordionmodules/Sectionmodules/SectionIntromodules/VideoSpotlightmodules/AccordionMediamodules/MediaTabsmodules/QuoteRailmodules/LogoGridmodules/ResourceCardsmodules/NewsToast
/products/security CrumbHeroAccordionmodules/Sectionmodules/SectionIntromodules/VideoSpotlightmodules/FeatureListmodules/BannerCardmodules/FeatureRowsmodules/ResourceCardsmodules/NewsToast
/products/tag CrumbHeromodules/Sectionmodules/SectionIntromodules/VideoSpotlightmodules/QuoteRailmodules/BannerCardmodules/ScrollStepsmodules/MediaTabsmodules/FeatureRowsmodules/LogoWallmodules/CtaBand
/research None

Rules the build enforces

  • No hard-coded values: colors, sizes, spacing and timings come from tokens.css. The only literals are a 1px hairline and zero.
  • Every token is used and every token used exists. Dead tokens and dead CSS fail the build.
  • One motion engine: springs on one frame loop (motion.js). No keyframes, no eased transforms, no second animation loop.
  • One dependency, Astro, which builds static HTML. No framework, no UI or animation library.
  • Every shared component is catalogued here.
  • Every control on every page names what it does (data-action) and has a name, and every page publishes structured data. A page that does not fails the build.

The gate runs before every build and deploy. scripts/gate.mjs

Color

Primitives are raw swatches. The theme maps them to roles, once for light and once for dark, and any section can pin a theme or invert it.

Primitives

Theme roles

light

--bgvar(--swatch-ivory-medium)
--bg-raisedvar(--swatch-ivory-light)
--bg-raised-hovervar(--swatch-white)
--inkvar(--swatch-slate-dark)
--ink-hovervar(--swatch-slate-4)
--link-hovervar(--swatch-slate-light)
--ink-60var(--slate-a60)
--ink-40var(--slate-a40)
--linevar(--slate-a10)
--line-strongvar(--slate-a25)
--seamvar(--slate-a12)
--cardvar(--swatch-oat)
--card-hovervar(--swatch-oat-dark)
--lab-stagevar(--swatch-slate-dark)
--brand-orangevar(--swatch-brand-orange)
--accentvar(--brand-orange)
--accent-hovervar(--swatch-brand-orange-dark)
--accent-inkvar(--swatch-ivory-light)
--hover-washvar(--slate-a05)
--divider-on-inversevar(--ivory-a20)
--on-mediavar(--swatch-white)
--media-avar(--swatch-media-a)
--media-bvar(--swatch-media-b)
--media-cvar(--swatch-media-c)
--media-dvar(--swatch-media-d)
--media-evar(--swatch-media-e)
--media-cloudvar(--swatch-media-cloud)
--tile-1var(--swatch-heather-dark)
--tile-2var(--brand-orange)
--tile-3var(--swatch-cactus-dark)
--tile-4var(--swatch-coral-light)
--tile-5var(--swatch-sky)
--tile-6var(--swatch-heather)
--tile-7var(--swatch-cactus)
--blog-post-bgvar(--swatch-white)
--blog-surfacevar(--swatch-paper)
--blog-card-bgvar(--swatch-ivory-medium)
--blog-muted-2var(--swatch-slate-5)
--blog-hairlinevar(--swatch-ivory-dark)
--blog-underlinevar(--swatch-cloud-medium)
--play-bgvar(--swatch-white)
--play-bg-hovervar(--swatch-ivory-light)
--play-inkvar(--swatch-slate-dark)
--chart-plotvar(--swatch-white)
--chart-gridvar(--swatch-cloud-grid)
--chart-axisvar(--swatch-slate-light)
--chart-1var(--brand-orange)
--chart-2var(--swatch-chart-blue)
--chart-3var(--swatch-chart-magenta)
--chart-4var(--swatch-chart-olive)
--ink-mutedvar(--swatch-slate-light)
--ink-dimvar(--swatch-cloud-dark)
--surface-bandvar(--swatch-ivory-medium)
--surface-sheetvar(--swatch-white)
--surface-softvar(--swatch-ivory-dark)
--line-controlvar(--swatch-cloud-light)
--line-control-strongvar(--swatch-cloud-medium)
--texturevar(--ivory-a60)
--scrimvar(--slate-a40)
--pp-play-bgvar(--swatch-slate-3)
--pp-play-linevar(--swatch-slate-medium)
--pp-play-inkvar(--swatch-ivory-light)
--pp-dot-inkvar(--swatch-ivory-light)
--tile-ink-1var(--swatch-white)
--tile-ink-2var(--swatch-slate-medium)
--tile-ink-3var(--swatch-white)
--tile-ink-4var(--swatch-slate-medium)
--tile-ink-5var(--swatch-slate-medium)
--tile-ink-6var(--swatch-slate-medium)
--tile-ink-7var(--swatch-slate-medium)

dark

--bgvar(--swatch-slate-dark)
--bg-raisedvar(--swatch-slate-3)
--bg-raised-hovervar(--swatch-slate-4)
--inkvar(--swatch-ivory-light)
--ink-hovervar(--swatch-ivory-dark)
--link-hovervar(--swatch-cloud-medium)
--ink-60var(--ivory-a60)
--ink-40var(--ivory-a40)
--linevar(--ivory-a10)
--line-strongvar(--ivory-a25)
--seamvar(--ivory-a12)
--cardvar(--swatch-slate-medium)
--card-hovervar(--swatch-slate-5)
--lab-stagevar(--swatch-slate-dark)
--brand-orangevar(--swatch-brand-orange)
--accentvar(--brand-orange)
--accent-hovervar(--swatch-brand-orange-dark)
--accent-inkvar(--swatch-ivory-light)
--hover-washvar(--ivory-a08)
--divider-on-inversevar(--slate-a20)
--on-mediavar(--swatch-white)
--media-avar(--swatch-media-a)
--media-bvar(--swatch-media-b)
--media-cvar(--swatch-media-c)
--media-dvar(--swatch-media-d)
--media-evar(--swatch-media-e)
--media-cloudvar(--swatch-media-cloud)
--tile-1var(--swatch-heather-dark)
--tile-2var(--brand-orange)
--tile-3var(--swatch-cactus-dark)
--tile-4var(--swatch-coral-light)
--tile-5var(--swatch-sky)
--tile-6var(--swatch-heather)
--tile-7var(--swatch-cactus)
--blog-post-bgvar(--swatch-slate-dark)
--blog-surfacevar(--swatch-slate-2)
--blog-card-bgvar(--swatch-slate-3)
--blog-muted-2var(--swatch-cloud-light)
--blog-hairlinevar(--swatch-slate-4)
--blog-underlinevar(--swatch-slate-light)
--play-bgvar(--swatch-ivory-light)
--play-bg-hovervar(--swatch-white)
--play-inkvar(--swatch-slate-dark)
--chart-plotvar(--swatch-slate-4)
--chart-gridvar(--swatch-slate-medium)
--chart-axisvar(--swatch-cloud-medium)
--chart-1var(--brand-orange)
--chart-2var(--swatch-chart-blue)
--chart-3var(--swatch-chart-magenta)
--chart-4var(--swatch-chart-olive)
--ink-mutedvar(--swatch-cloud-medium)
--ink-dimvar(--swatch-slate-light)
--surface-bandvar(--swatch-slate-2)
--surface-sheetvar(--swatch-slate-3)
--surface-softvar(--swatch-slate-4)
--line-controlvar(--swatch-slate-medium)
--line-control-strongvar(--swatch-slate-light)
--texturevar(--ivory-a08)
--scrimvar(--slate-a60)
--pp-play-bgvar(--swatch-slate-3)
--pp-play-linevar(--swatch-slate-medium)
--pp-play-inkvar(--swatch-ivory-light)
--pp-dot-inkvar(--swatch-ivory-light)
--tile-ink-1var(--swatch-white)
--tile-ink-2var(--swatch-slate-medium)
--tile-ink-3var(--swatch-white)
--tile-ink-4var(--swatch-slate-medium)
--tile-ink-5var(--swatch-slate-medium)
--tile-ink-6var(--swatch-slate-medium)
--tile-ink-7var(--swatch-slate-medium)

Section theming

page theme

Introducing FutureHuman

A system that grows with the people it serves.

data-theme="light"

Introducing FutureHuman

A system that grows with the people it serves.

data-theme="dark"

Introducing FutureHuman

A system that grows with the people it serves.

data-theme="invert"

Introducing FutureHuman

A system that grows with the people it serves.

Type

One role scale for every page, from the reference system: display, headlines 1 to 6, body. The size at this window width is measured live.

Roles

Headings

Built for people

Built for people

Built for people

Built for people

Built for people

Built for people

FutureHuman builds systems that serve people’s long‑term well-being.

FutureHuman builds systems that serve people’s long‑term well-being.

Copy

FutureHuman builds systems that serve people’s long‑term well-being.

FutureHuman builds systems that serve people’s long‑term well-being.

FutureHuman builds systems that serve people’s long‑term well-being.

FutureHuman builds systems that serve people’s long‑term well-being.

FutureHuman builds systems that serve people’s long‑term well-being.

FutureHuman builds systems that serve people’s long‑term well-being.

FutureHuman builds systems that serve people’s long‑term well-being.

Page type tokens

Older, page-level names still read by the home page and the blog.

Line breaks

Drag the corner to change the measure. Headings balance, copy wraps pretty, and the line guard keeps a word from sitting alone on the last line.

At FutureHuman, we build systems to serve people’s long‑term well-being.

Technology should extend what people can do, measured against human purpose and human flourishing. Every part of this system is built once, named, and reused, so the whole stays in balance as it grows.

Space

The spacing scale, the section rhythm and the measures. Sizes marked live are read at this width.

Spacing scale

Section rhythm

Measures

Containers

Layout

Every module sits in the shell: the container box holding a 12-column grid, placed by column span.

Spans

12664443333222222111111111111

Breakpoints

--bp-wide 1180--bp-fold 991--bp-tablet 767--bp-post 599--bp-chart 720--bp-chart-s 576--bp-orbit 1023This window:

Shape

Radii, lines, shadows and opacity steps.

Radii

Shadows

Opacity

Icons

Material Symbols Rounded, one set, drawn from src/data/icons.js. Aliases in brackets.

arrow_forward
arrow_outward
calendar_today
category
close
dark_mode
folder
grid_view
keyboard_arrow_down
light_mode
link
mail
menu
fullscreen
play_arrow
schedule
search
sell
share
tune
view_list
add
remove
arrow_upward
arrow_back
replay
open_in_new
info
pause
calendar_month
description
table_chart
forum
cloud
download
check
check_circle
slideshow
tag
more_horiz
settings
bolt
notifications
groups
code
bar_chart
history
toggle_on
key
shield
call
terminal
hub
science
biotech
verified
psychology
language
smartphone
desktop_windows
extension
content_copy
merge
rocket_launch
bug_report
sync_alt
person

Components

Shared parts, live. Each lists the tokens its styles read; click one to tune it.

Button

The one button: every action and call to action on the site (home, blog, /products, /lab, /design-system).

Props and usage

To pick one of several values use Menu; a link inside running text is a plain <a>. The slot is the text; class and any other attribute pass through. variant: ink | light | accent | outline | soft | quiet (default ink), a colour. size: s (28) | m (34) | l (36) | xl (40), one scale for every variant; without a size a button takes its variant's default (m; light l; accent, outline and quiet xl). The text sits in a span, which base.css trims to cap height so the capitals centre (a button written by hand wraps its text the same way). A link by default (href, placeholder '#'); as="button" renders a <button type="button">. icon leads, iconEnd trails, arrow adds the nudging arrow, ring hovers with a 2px ring instead of a fill change (claude.com chrome), label names an icon-only button.

Menu

A button that opens a listbox (motion.js [data-menu]): the chosen option's label shows on the button; picking fires 'menu:pick' {value} on the host.

Props and usage

Use it to choose one value: the role and task pickers on /products, the version picker on /lab, /design-system. For a list of links under a nav item use Dropdown, not Menu; for a single action use Button. options: [{ value, label, buttonLabel? }]; value: the chosen one (default the first); label names the list; class passthrough. variant 'chip' (28px bordered, default) or 'word' (an underlined word inside a sentence). id: page scripts find it and use its ._menu.

I need the .

Sheet

A drawer (slides in from the right) or a modal (centered card) over a scrim. motion.js [data-sheet] opens it from any element with data-sheet-open="<id>"; Escape, the scrim and [data-sheet-close] close it.

Props and usage

Content goes in the slot. Used for the capabilities drawer and the use-case modal on /products and the demos on /design-system; a [data-sheet-focus] element in the slot takes focus on open. Not for the phone site menu (MobileMenu) or a short list of choices (Menu). class passthrough. id: the data-sheet-open target (required); kind: drawer | modal (default drawer); label names the dialog; theme: the panel's data-theme.

Accordion

One-open-at-a-time questions and answers (motion.js [data-accordion]): the FAQ on /products and the demo on /design-system.

Props and usage

Use it for a list of short questions with plain-text answers. Not for folding link groups: the footer, the mobile menu and the blog filters use motion.js fold() instead. items: [{ q, a }], a is text with [[words|/href]] markup for links; open: the row that starts open (default 0, the first; -1 none). class passthrough.

What is a token?

A named value, defined once in tokens.css and read everywhere it is needed.

What happens when I change one?

Every place that reads it changes with it, on every page.

Where does motion come from?

Springs in one engine, with their stiffness and damping as tokens.

Tile

A colored illustration tile: a tile color (1..7, or 0 for the plain ground) under a hand-drawn squiggle texture, with an optional line pictogram.

Props and usage

Used for hero tiles, deck cards, the picker stack, the news card and quote media on /products, and on /design-system. Not for interface icons (use Icons), a bare line drawing without the colored ground (use blog/Pictos), or a photo or video. Size it from outside. On the blog, post cards wear one (src/lib/post-art.js derives its color, texture and pictogram from the post's slug); post pages draw their own around blog/Pictos. A colored tile also carries its color's pictogram ink (--tile-ink, from --tile-ink-N: white or slate, whichever holds 3:1 on it). tile: 0..7 (default 0); texture: 1..8, four rotations and their mirrors, other numbers wrap (default 1); art: a Pictos number (optional). class passthrough; any other attribute lands on the element; extra content goes in the slot.

--tile-{n}--tile-ink-{n}

Artifact

The finished file a use case hands back, drawn as a small app window: a team-chat channel, a document, a sheet or a deck.

Props and usage

Placeholder art built from the system (lines, cells, tiles), not screenshots. Size it from outside; it keeps a 608:413 shape. On /products the file each Day card hands back and the Picker stack and use-case modal; the chat windows of the product pages' steps and tabs; /design-system. Styles in artifact.css, loaded here. Decorative (aria-hidden), so name the file in text beside it. For a plain colored illustration use Tile.astro. kind: chat | doc (default) | sheet | slides; title: the window title (default ''); tile: the doc and slides figure's Tile color (default 6); class.

--tile-{n}

Popcard

The hover card on the product hero tiles and the capability map, sprung in on --po.

Props and usage

A title, a Tile as its picture and up to three lines of copy, in a sheet with the menu shadow. It opens beside the tile or map node under the pointer and stays open while the pointer is on it. Use it to preview what a tile or node holds; for a choice use Menu, for a dialog use Sheet.

Campaign readout

Pull last week’s results and get a one-page readout.

Crumb

The crumb bar under the nav (blog, brand, product, lab, design system): the path on the left, a section's pages as tabs in the middle when it has them, an "Explore" link on the right.

Props and usage

Put it first inside Base on a section page; the home page has none. It is not the site navigation (Nav, which Base renders), and Base writes the breadcrumb structured data on its own. path: [{ label, href }], the last entry is the current page; tabs: [{ label, href, current }] with tabsLabel; explore: { label, href, icon }. path defaults to []; tabs and explore are optional, explore's icon defaults to arrow_outward; class passthrough (brand passes crumb-brand).

Wordmark and mark

FUTURE HUMAN wordmark: the full name, which folds into the FH mark.

Props and usage

Used in Nav on every page, and on /brand, /brand/identity and /design-system. motion.js folds the nav's instance (id navLogo) on scroll, so give every other instance its own id. Not where only the square mark fits (the footer, the usage plates, a small slot): use Mark; for the construction figures use brand/LogoConstruction. id (default 'navLogo'); href (default '/'); label: its accessible name (default 'FutureHuman home'); tag: a (default), or div or span for a logo that is not a link; docked: draw the H already docked on the F (default false); class passthrough.

Wordmark
Mark

Modules

Sections of a page, built from the components and placed on the grid. Open one to see it live on its page.

Site

Banner

module · 38 tokens

The home page's feature banner: a card of sky and clouds with a title, a subline and a light Button.

Props and usage

The .bleed layer expands to a full-bleed on scroll (motion.js) while the sky and clouds move in parallax. Use it for one headline release. motion.js finds it by id (bannerCard, bleed), so there is one per page; for a list of releases use ReleaseCards. title/sub: arrays of authored lines (no <br>: each line is a span that sets as a line where it fits; in a phone container the title's lines stay whole as phrases and the subline's run together and balance, components.css); cta: { label, href }.

Used by

design-system/sample/[...style]index

Open live

Footer

chrome · 37 tokens

The site footer on every page, rendered once by Base: the FH Mark, the legal line and social links, then four columns of link groups, on the inverted theme.

Props and usage

At 991px and under the groups fold into an accordion (motion.js [data-fgroup], fold()). Do not place it in a page; edit the data to change its links. For a call to action band on the blog use blog/CtaBand. No props; reads footer and social from src/data/footer.js and legal from src/data/site.js. A string item links to '#'.

Used by

Base

Hero

module · 73 tokens

The home page's opening: a display headline over seven columns with the lede beside it where the lede's five columns hold 40+ characters (a 1200 shell), else the lede under the headline at its measure; both rise in.

Props and usage

Use it for a page that opens on one statement. /products opens with product/Hero and the blog with blog/BlogHero instead. center: a product page's opening instead, everything centred in one stack (eyebrow, serif headline, lede, buttons), as on the claude.com product pages; each part rises in turn. title: string with [[word|/href]] markup for underlined links; lede: string; center (default false); eyebrow and actions ([{ label, href, variant }], the first ink and the rest soft unless they say) for the centred stack; badge (a pill over the headline, in place of the eyebrow) and note (fine print under the buttons), both optional. split: the words on four columns beside the page's own picture (the media slot, eight columns), the actions stacked, and an optional row of ways (ways: { label, items: [{ icon, label, href }] }) across the foot; centred, with the picture under it, on a narrower page, and the picture left out on a phone.

Used by

design-system/sample/[...style]indexproducts/codeproducts/scienceproducts/securityproducts/tag

Open live

MissionList

module · 39 tokens

The home page's closing section: a statement heading beside a list of linked rows, each a title and a tag.

Props and usage

A row's rule draws on hover while the other rows dim (motion.js [data-row]); heading and list rise in on scroll. Use it for a short index of links under one statement. For blog posts use blog/PostGrid; for release cards use ReleaseCards. statement: string; rows: [{ title, tag, href }].

Used by

design-system/sample/[...style]index

Open live

MobileMenu

chrome · 58 tokens

The site menu on phones and tablets: a dialog with the nav items (grouped ones fold open), a theme toggle and the mobileButtons.

Props and usage

Base renders it once on every page; motion.js opens it from Nav's burger (1180px and under) and closes it if the window grows past that. Do not place it in a page, and not for page content: a page's drawer or modal is Sheet. No props; reads nav and mobileButtons from src/data/nav.js and menuLabel from src/data/site.js. A string item links to '#'.

Used by

Base

Nav

chrome · 39 tokens

The site header on every page, rendered once by Base: the Wordmark (motion.js folds it into the mark on scroll), the primary links with a Dropdown under each grouped item, the theme toggle and the split CTA with its own Dropdown.

Props and usage

At 1180px and under the links give way to the burger, which opens MobileMenu. Do not place it in a page; a section's path and pages go in Crumb. No props; reads nav and ctaMenu from src/data/nav.js and cta from src/data/site.js. A string item links to '#'.

Used by

Base

ReleaseCards

module · 47 tokens

The home page's release cards: a section title over a row of cards, each with a title, a body, date, category, detail links and a "Read announcement" Button.

Props and usage

Cards lift on hover (motion.js [data-card]) and rise in on scroll; three across only where each body keeps 34+ characters a line, else two (an odd last card spans the row) or one; a row shares one anatomy (title, body, details, button). Use it for the latest few announcements. For one headline release use Banner; for blog posts use blog/PostGrid. heading: string (default 'Latest releases'); items: [{ title: [phrases], body, date, category, details: [{ label, href }], href }]. A title's phrases stay whole (.phrase): they share a line where they fit and break between each other first.

Used by

design-system/sample/[...style]index

Open live

Blog

BlogHero

module · 40 tokens

The blog index's opening: the title, the intro and a CTA button on the left, the category links on the right.

Props and usage

Use it once at the top of /blog, under the Crumb, with PostGrid below: a category link filters that list (blog.js), and so does /blog#<slug>. Not for a post page (/blog/<slug> builds its own title block) or other sections: the home page uses Hero, /products uses product/Hero. No props; reads blog.title, blog.intro, blog.cta ({ label, href }) and blog.categories ([{ label, slug }]) from src/data/blog.js.

Used by

blog/index

Open live

Carousel

module · 22 tokens

Infinite marquee of recent posts.

Props and usage

The list is rendered twice; motion.js drifts the track by half. Use it on /blog under BlogHero, fed the ten newest posts (recent in src/data/blog.js); each item links to /blog/<slug>, and hover brakes the drift. For the full, filterable list use PostGrid; for a post page's related posts use RelatedPosts. items: [{ slug, title, date }], required (no default).

Used by

blog/index

Open live

Chart

module · 55 tokens

Chart block: line or bar, one panel or small multiples.

Props and usage

The drawing is src/lib/chart.js: the server draws it at the figure's design width, blog.js draws it again at the width each plot really has (and on every change of that width), so labels keep their size, every category stays visible down to a 320 phone, and a bar chart too narrow for its names turns its bars sideways. Hover and tap tooltips live in blog.js. Use it for a { type: 'chart' } block in a post body on /blog/<slug>: the page spreads the block into props, inside a <figure> with the caption. It draws data series only; for a picture or a diagram use an image block. Props: kind (default 'line'), title (''), x ([]), series ([{ name, values }], default []), panels ([{ title, series }], default null), unit (''), decimals (1), yMax (null), sharedY (false), width (default 'column'; 'bleed' sizes like 'full'), id ('', sets the element id).

Used by

blog/[slug]

CtaBand

module · 75 tokens

The closing band in the inverted theme: a heading with its action buttons, and a newsletter card with an email field.

Props and usage

Use it as the last section of /blog and of every post page (/blog/<slug>). The form does not submit anywhere yet (onsubmit returns false). For a call to action inside a section use Button; this band is the blog's page ending, not a module for other pages. No props; reads blog.band ({ heading, actions: [{ label, href, variant }], newsletter: { title, body, placeholder, fine } }) from src/data/blog.js.

Used by

blog/[slug]blog/index

Open live

FeaturedLink

module · 69 tokens

A featured link card: a small label with a link icon, a title, a line of body and a button, beside its image when it has one.

Props and usage

Without an image there is no media slot and no stand-in: the card is one text column, its button beside the copy where the card is wide enough (blog.css). Use it on /blog, between PostGrid and CtaBand, to point at one piece outside the post list (a guide, a playbook). To link a post use PostCard; for the page's closing call to action use CtaBand. No props; reads blog.featured ({ label, title, body, cta: { label, href }, image?: { src, alt } }) from src/data/blog.js.

Used by

blog/index

Open live

Filters

module · 25 tokens

The blog's filter and sort sidebar: one folding row per filter group, each a list of radio buttons (sort) or checkboxes.

Props and usage

PostGrid renders it, so do not place it yourself. blog.js folds the rows (the shared accordion from motion.js) and filters and sorts PostGrid's cards by the groups labelled Sort by, Category and Product; when the sidebar collapses, PostGrid's filter button opens it as a popover. No props; reads blog.filters ([{ label, options, type: 'radio'|'check' }]) from src/data/blog.js. A radio group starts on its first option.

Used by

blog/PostGrid

Pictos

module · 0 tokens

Simple line pictograms for illustration tiles.

Props and usage

n picks one; they are placeholders for real art. Four drawings that repeat (n 5 draws n 1); the stroke is currentColor and the SVG sets no size, so the parent sets its color and size. Used in PostCard, a post page's hero tile and its image blocks without a src, and through Tile's art. For a colored tile with the squiggle texture use Tile (it takes art); for interface icons use Icons. n (default 1).

Used by

Tilemodules/BannerCardmodules/Changelogmodules/CtaBandmodules/Plansmodules/SectionIntroblog/[slug]

PostCard

module · 40 tokens

One post as a card linking to /blog/<slug>: its cover (the post's color under a turned squiggle texture, with its pictogram in the tile's own ink, whole inside the tile's safe inset, all from the post's slug: src/lib/post-art.js), its date, title and category.

Props and usage

Lifts on hover (motion.js). Where blog.js marks it data-orphan (the odd last card of a two-across list), it spans the row with its tile beside its text. Use it inside a .post-grid: PostGrid renders one per post on /blog (blog.js filters, sorts and pages them), RelatedPosts on a post page. The cover is the post's own wherever the card sits, the same as the tile on its page; no list assigns it. For a lab experiment use LabCard; for the moving strip use Carousel. post: { slug, title, date, category, product }, required; index (default 0), written to data-index.

Used by

blog/PostGridblog/RelatedPosts

PostGrid

module · 72 tokens

The blog's post list: the Filters sidebar, a search field, a grid/list toggle and a filter button over one PostCard per post, then "View more".

Props and usage

Use it once on /blog (its ids are fixed), fed every post. blog.js searches, filters, sorts and pages it, and shows blog.empty when nothing matches. For a short fixed set of posts use RelatedPosts; for the moving strip of recent posts use Carousel. posts: [{ slug, title, date, category, product }], required; each card wears its post's own cover. Also reads blog.search, blog.pageSize and blog.empty from src/data/blog.js.

Used by

blog/index

Open live

PostMeta

module · 28 tokens

The post's details: a column beside the title on wide screens, a row of columns under the lede at <=1180 (blog.css).

Props and usage

It shows the category, product, date, reading time and a Copy link action (blog.js copies the page URL). A detail with no value (a post with no product) is left out rather than shown empty. Use it once in a post page's header (/blog/<slug>), after the lede. For a post in a list use PostCard. post: { category, product, date, minutes }, required.

Used by

blog/[slug]

RelatedPosts

module · 39 tokens

A "Related posts" section: a heading and a line of body over a grid of PostCards.

Props and usage

Use it on a post page (/blog/<slug>), before the CtaBand; the page passes up to four other posts, same category first. For the full, filterable list on /blog use PostGrid; for the moving strip of recent posts use Carousel. posts: [{ slug, title, date, category, product }], required; each card wears its post's own cover, the one it wears in the post list and on its page. Also reads blog.related ({ title, body }) from src/data/blog.js.

Used by

blog/[slug]

Product

Ask

module · 82 tokens

Closing ask. The box grows with what you type; the button is the accent.

Props and usage

It goes nowhere yet (placeholder): submitting keeps you here. The last section of /products, after the FAQ; once per page (product.js [data-ask-bar] blocks the submit and sends on Enter). Not a working form or a general call to action: for a link or button use Button.astro; the blog's closing band is blog/CtaBand.astro. No props; reads page.ask ({ title, lede, placeholder, label, href }) from src/data/product.js.

Used by

products

Open live

Change

module · 80 tokens

"Change the way you work", the three columns, then "See what FutureHuman can do": the capabilities drawer and the map.

Props and usage

A /products section, after Quotes; once per page. Its button opens the drawer (Sheet.astro, id capsDrawer); product.js runs the map. For the three columns alone use Trio.astro; the map is Constellation.astro, which only this section places. No props; reads page.change ({ title, items, see, drawer }) and capabilities ({ groups: [{ id, label, items }] }) from src/data/product.js.

Used by

products

Open live

Constellation

module · 71 tokens

The capability map: FutureHuman at the center, six groups around it, each group's capabilities around the group; product.js draws and moves it.

Props and usage

Where the shell is too narrow for a radial drawing to keep clear of its own lines (product.css, --cq-map) the same groups are drawn as headed lists instead. Both drawings are aria-hidden: screen readers get one list of every capability with its line of copy. Only placed by Change.astro on /products, once per page. Not the place to read the capabilities: the drawer in Change.astro (Sheet.astro) lists them with their copy. No props; reads capabilities ({ center, groups }) from src/data/product.js and mapLayouts and mapEdges from src/data/product-map.js.

Used by

product/Change

Day

module · 146 tokens

"Put FutureHuman to work".

Props and usage

Role tabs, then the day (8AM, 12PM, 4PM) for the chosen role. Every role's deck is rendered here; switching role swaps which deck is live (product.js). The /products section under the hero (id work); once per page. Not for opening one use case by role and task (use Picker.astro), and not on any other page or twice on one: product.js drives one by id. No props; reads page.work, page.picker.roleLabel, roles, days, apps and deckTiles from src/data/product.js.

Used by

products

Open live

Hero

module · 70 tokens

Hero: the headline in the middle of two rings of use-case tiles turning in opposite directions (product.js drives the orbit, the intro burst, the hover freeze and the scroll choreography).

Props and usage

Under the stage: the video card, then the three columns. Wide: rings orbit; <=1180 the outer ring goes; <=599 the inner ring becomes one strip scrolling left. The /products hero, once per page. For the site home hero use components/Hero.astro; for the blog's, blog/BlogHero.astro. No props; reads page.hero, page.trio (Trio.astro), heroTiles and tasks from src/data/product.js.

Used by

products

Open live

Picker

module · 105 tokens

"I'm in [role] and I need to make the [task]." The two words are menus; the rails pick too.

Props and usage

The stack shows the role's three use cases (front one opened as a file window); drag the front card or use the arrow keys to cycle; click it, press Enter, or pick a task in the rail to open the use case. The task rail lists the chosen role's tasks, so neither rail runs past the stack. The rails drift apart slightly as the section scrolls past. <=1180: sentence and stack only. A /products section, once per page (product.js [data-picker]); the use case opens in a Sheet.astro modal. Not for a plain choice or a dialog elsewhere (use Menu.astro or Sheet.astro), and not to walk through one role's day (use Day.astro). No props; reads page.picker, page.hero, page.work, roles, tasks, apps and deckTiles from src/data/product.js.

Used by

products

Open live

Quotes

module · 64 tokens

Customer voice, a section of its own: it opens on the section step (--section-main) under its heading (page.quotes.label), so it never starts on bare media under the use case before it.

Props and usage

Then square media on the left, the quote on the right with the name pinned to the bottom, a player, and arrows; side by side down to a 900 shell (the quote on seven columns under a 1068 shell), then the media in a landscape crop over the quote at its measure. Play reads the quote karaoke-style: it dims, and each word darkens as the clip passes it. The clip is a placeholder: the player keeps time and the waveform is a working seek slider, but no audio is loaded. A /products section after Day, once per page (product.js [data-quotes]). Customer quotes only: for a marquee of posts use blog/Carousel.astro. No props; reads page.quotes ({ label, play, pause, seek, prev, next, items: [{ text, name, role, length, tile, art }] }) from src/data/product.js.

Used by

products

Open live

Trio

module · 21 tokens

Three numbered columns under a top rule (under the hero, and in "Change the way you work").

Props and usage

They rise in on scroll; no hover. For /products only (product/Hero.astro and Change.astro; styles in product.css). On the brand pages a three-up is the page's own .three grid. items: [{ title, body }]; level: the heading level of each title (default 3; the hero passes 2).

Used by

product/Changeproduct/Hero

Brand

BrandReel

module · 54 tokens

The /brand hero: a film with no words, the identity's elements under real forces (src/scripts/brand-reel.js).

Props and usage

It opens on the empty light ground, so the first frame rendered here is that ground at the name's framing. Once per page, as the /brand hero; the page must also load brand-motion.js, which runs the two BrowserMini windows the film opens. For one move with its own control use MotionStage.astro; for the nav fold in a browser window on its own, BrowserMini.astro. reel: { label, controls: { pause, play, aria }, nav: { aria, v2, v3 } }, all copy (story.reel in src/data/brand-story.js); no default.

Used by

brand/index

Open live

BrowserMini

module · 17 tokens

The page in miniature: a browser window whose page scrolls under its nav, and whose nav logo folds past the first stretch of scroll and opens again at the top (brand-motion.js, [data-scroll-fold]).

Props and usage

One component for every place the nav fold is shown: the v2 study on /brand/motion and the hero film on /brand. Not for a stage on its own: a fold, dot or bridge with its control is MotionStage.astro (this wraps one, with no control). id: the stage's id; scene: fold (default) | fold-v3; aria: the scroll area's label; label: the logo's label; class: extra classes

Used by

brand/BrandReelbrand/motion

Open live

LogoConstruction

module · 43 tokens

Construction and clear-space figures, side by side.

Props and usage

Dimensions are the artwork's own numbers (viewBox units, from brand.logo.geometry); labels are mono, dimension lines take the accent. For the construction section of /brand/identity. Not the logo in use: place the mark with Mark.astro and the name with Wordmark.astro; the mark at each size is LogoOptical.astro. notes: the prose for each figure, [construction, clear space], set under its own figure (on the figures' columns where they sit side by side). Reads brand.logo.geometry and brand.logo.figures from src/data/brand.js and draws #mark-sym (MarkSymbol.astro, in Base). [x1,y1,x2,y2,label,lx,ly,anchor]

Used by

brand/identity

Open live

LogoOptical

module · 32 tokens

Optical-size ladder: the mark at each size the system uses, with the F/H gap measured live by brand.js from the tokens.

Props and usage

Light and dark ladders side by side, for the optical-size section of /brand/identity (the page must load brand.js). Not the logo in use and not for any other page: place the mark at one size with Mark.astro and the name with Wordmark.astro; for the construction and clear space use LogoConstruction.astro. notes: the prose for each ladder, [light, dark], set under its own ladder (on the ladders' columns where they sit side by side). Reads brand.logo.ladder from src/data/brand.js and the sizes from the spec-sizes token in tokens.json.

Used by

brand/identity

Open live

MotionStage

module · 17 tokens

A live stage for the identity's motion (src/lib/fold.js, mounted by src/scripts/brand-motion.js).

Props and usage

The first frame is rendered here at build time from the same code, so the page reads correctly before any script runs. For every moving logo on /brand, /brand/identity, /brand/motion and /brand/messaging (the page loads brand-motion.js). Not for the nav fold in a browser window (BrowserMini.astro), the /brand hero film (BrandReel.astro) or a still logo (Mark.astro, Wordmark.astro). Props, with defaults: id, label, scene (fold), frame (plain), centered (false), start, autoplay (0), back (true), controls (true), title, vb, class. The default slot is the stage's note: it sits in the caption under the control (beside the stage, for a square one with room).

Used by

brand/BrowserMinibrand/identitybrand/indexbrand/messagingbrand/motion

Open live

SectionHead

module · 24 tokens

The head of a brand section: its label (the mono tag) always above its title.

Props and usage

One component and one role on all four brand pages, for a centered moment and a working piece alike, so peer sections read as peers: every title is the same size at a given width (--fs-cat up to --pdp-head-fit; a long one balances into more lines, it never shrinks), on the section's axis: centered over statements, lists and tables, at the start in a section that holds a live demo and where the copy runs left on a phone (brand-pdp.css .head). Titles pass through glue() (src/lib/glue.js). Not for a page's own title (the hero's eyebrow, h1 and lede) or a card's title (h3 in a tile, tenet or trait). title: the heading; tag: the label above it (optional); size: 'xl' sets a closing statement at the banner size.

Used by

brand/identitybrand/indexbrand/messagingbrand/motion

Open live

StageControls

module · 46 tokens

A stage's control and its state readout, locked in place.

Props and usage

The control is the system's outline button (base.css .btn). MotionStage renders one in each stage's caption, the control and its readout as one group from the stage's start edge (on the hero's axis under a page hero's stage); use it on its own only beside a stage with controls={false}. Not a general button (use Button.astro). Labels come from brandSection.controls[kind] (src/data/brand-section.js); brand-motion.js drives them. id: the stage's svg id; kind: fold (default) | dot | bridge; class: extra classes on the row dir: the stage's resting direction (1 folded or built, -1 open or on the dot; default -1)

Used by

brand/MotionStage

Lab

LabCard

module · 29 tokens

A lab experiment in the catalogue: its poster, name and summary, how many versions it has and when the latest landed.

Props and usage

Use it in the /lab grid, one per experiment from getLab() (src/lib/lab.js); it links to that experiment's player at /lab/<slug>. For the experiment's own page use LabPlayer; for a blog post use PostCard. Labels come from lab.card in src/data/lab.js. exp: { slug, title, summary, kicker?, aspect (default '16/9'), cardUrl, posterUrl, latest, versions: [{ id, name, date }] }, required.

Used by

lab/index

Open live

LabPlayer

module · 100 tokens

The player page. The stage shows the selected version as a still with its caption.

Props and usage

Play (on the stage or on a version's card) opens that version as its own full page, /lab/<slug>/<version>/, so it runs in its native full viewport on any device; the browser's Back returns here. The version menu, the cards and ?v= select. Behaviour in src/scripts/lab.js. Use it once on /lab/<slug>; it renders the h1 and, when there is more than one version, the versions list. For the /lab catalogue use LabCard. exp: an experiment from getLab() (src/lib/lab.js): title, summary, kicker?, aspect (default '16/9'), requires?, inputs?, latest, versions [{ id, name, date, build?, scene, summary, url, stillUrl, thumbUrl }]. Labels: lab.player in src/data/lab.js.

Used by

lab/[slug]

Motion

Every movement is a damped spring: stiffness k, damping c, and the ratio ζ = c / 2√k (1 is critical, the fastest settle with no overshoot). Press a lane to play it; drag the sliders to feel the change.

In use

Hover lift --lift · snappy

Hover me

Mouse only: a tap never leaves it lifted.

Reveal --reveal-y · soft

Copy rises into place.

Words --words-span-ms · soft

Every word arrives on its own spring

Tuner

Change any token and see it on every page, in your browser only. Copy the changes as CSS and hand them to the build to make them permanent.

Changes

 

Motion tokens apply after a reload.

--s-1
.25rem
read by 18 · aliased by 5src/scripts/studio/panel-style.css · src/styles/artifact.css · src/styles/base.css · src/styles/blog.css · src/styles/brand-pdp.css · src/styles/brand.css · src/styles/components.css · src/styles/ds.css · src/styles/lab.css · src/styles/modules/logos.css · src/styles/modules/news.css · src/styles/modules/plans.css · src/styles/modules/shell.css · src/styles/modules/snip.css · src/styles/modules/tabs.css · src/styles/modules.css · src/styles/product.css · src/styles/studio.css · --row-title-gap · --pdp-seg-gap · --studio-bar-pad · --pp-map-knock · --pp-map-stop
--s-2
.5rem
read by 22 · aliased by 5src/scripts/studio/panel-style.css · src/styles/artifact.css · src/styles/base.css · src/styles/blog.css · src/styles/brand-pdp.css · src/styles/components.css · src/styles/ds.css · src/styles/lab.css · src/styles/modules/cta.css · src/styles/modules/log.css · src/styles/modules/mcols.css · src/styles/modules/news.css · src/styles/modules/quotes.css · src/styles/modules/res.css · src/styles/modules/shell.css · src/styles/modules/snip.css · src/styles/modules/steps.css · src/styles/modules/tabs.css · src/styles/modules/term.css · src/styles/modules.css · src/styles/product.css · src/styles/studio.css · --pdp-seg-px · --xray-bar-pad · --news-gap · --pp-map-knock · --pp-map-clear
--s-3
.75rem
read by 22 · aliased by 4src/scripts/studio/panel-style.css · src/styles/artifact.css · src/styles/base.css · src/styles/blog.css · src/styles/brand-pdp.css · src/styles/brand.css · src/styles/components.css · src/styles/ds.css · src/styles/lab.css · src/styles/modules/cta.css · src/styles/modules/flist.css · src/styles/modules/log.css · src/styles/modules/news.css · src/styles/modules/plans.css · src/styles/modules/rows.css · src/styles/modules/shell.css · src/styles/modules/snip.css · src/styles/modules/tabs.css · src/styles/modules.css · src/styles/product.css · src/styles/studio.css · src/styles/xray.css · --xray-bar-pad · --pp-ask-bar-pad · --news-pad · --pdp-speed-h
--s-4
1rem
read by 22 · aliased by 19src/styles/base.css · src/styles/blog.css · src/styles/brand-pdp.css · src/styles/brand.css · src/styles/components.css · src/styles/ds.css · src/styles/lab.css · src/styles/modules/banner.css · src/styles/modules/cta.css · src/styles/modules/flist.css · src/styles/modules/log.css · src/styles/modules/logos.css · src/styles/modules/news.css · src/styles/modules/quotes.css · src/styles/modules/rows.css · src/styles/modules/shell.css · src/styles/modules/snip.css · src/styles/modules/steps.css · src/styles/modules/term.css · src/styles/modules.css · src/styles/product.css · src/styles/studio.css · --card-pad · --banner-pad · --blog-card-gap · --feat-pad · --nl-pad · --carousel-py · --related-p-gap · --chart-pad · --face-meta-gap · --xray-bar-edge · --studio-edge · --lab-caption-pad · --lab-v-gap · --ds-card-pad · --news-edge · --pp-ask-bar-pad · --pdp-card-px · --strip-fade · --pcard-px
--s-5
1.5rem
read by 22 · aliased by 11src/scripts/studio/panel-style.css · src/styles/blog.css · src/styles/brand-pdp.css · src/styles/brand.css · src/styles/components.css · src/styles/ds.css · src/styles/lab.css · src/styles/modules/banner.css · src/styles/modules/cta.css · src/styles/modules/flist.css · src/styles/modules/log.css · src/styles/modules/logos.css · src/styles/modules/mcols.css · src/styles/modules/plans.css · src/styles/modules/quotes.css · src/styles/modules/rows.css · src/styles/modules/shell.css · src/styles/modules/steps.css · src/styles/modules/tabs.css · src/styles/modules/term.css · src/styles/modules.css · src/styles/product.css · --hero-lede-gap · --mission-head-gap · --card-pad · --blog-card-pad · --feat-pad · --nl-pad · --spec-gap · --modal-pad · --lab-stage-chrome · --pdp-card-py · --reel-max-h
--s-6
2rem
read by 22 · aliased by 10src/pages/404.astro · src/styles/blog.css · src/styles/brand-pdp.css · src/styles/brand.css · src/styles/components.css · src/styles/ds.css · src/styles/lab.css · src/styles/modules/banner.css · src/styles/modules/cta.css · src/styles/modules/flist.css · src/styles/modules/log.css · src/styles/modules/logos.css · src/styles/modules/mcols.css · src/styles/modules/plans.css · src/styles/modules/quotes.css · src/styles/modules/res.css · src/styles/modules/rows.css · src/styles/modules/tabs.css · src/styles/modules/term.css · src/styles/modules.css · src/styles/product.css · src/styles/studio.css · --card-meta-gap · --banner-pad · --nl-pad · --lab-facts-gap · --lab-caption-pad · --ds-card-pad · --pdp-card-px · --pp-orbit-clear · --pcard-px · --pdp-safe
--s-7
3rem
read by 13 · aliased by 4src/styles/blog.css · src/styles/brand-pdp.css · src/styles/components.css · src/styles/modules/am.css · src/styles/modules/banner.css · src/styles/modules/cta.css · src/styles/modules/flist.css · src/styles/modules/logos.css · src/styles/modules/plans.css · src/styles/modules/quotes.css · src/styles/modules/rows.css · src/styles/modules/tabs.css · src/styles/product.css · --card-meta-gap · --modal-pad · --pdp-card-py · --reel-max-h
--s-8
4rem
read by 12 · aliased by 3src/styles/blog.css · src/styles/brand-pdp.css · src/styles/components.css · src/styles/ds.css · src/styles/modules/am.css · src/styles/modules/logos.css · src/styles/modules/quotes.css · src/styles/modules/rows.css · src/styles/modules/steps.css · src/styles/modules/tabs.css · src/styles/modules/term.css · src/styles/product.css · --banner-pad · --blog-side-gap · --bhero-gap
--s-9
6rem
read by 7src/styles/blog.css · src/styles/brand-pdp.css · src/styles/modules/am.css · src/styles/modules/mcols.css · src/styles/modules/plans.css · src/styles/modules/quotes.css · src/styles/modules/term.css
--s-10
8rem
read by 0
--hero-top
clamp(40px,calc(40px + 98 * var(--fluid)),138px)
read by 1 · aliased by 1src/styles/components.css · --hero-close
--hero-bottom
clamp(40px,calc(40px + 72 * var(--fluid)),112px)
read by 0 · aliased by 1--hero-close
--section-gap
clamp(72px,calc(72px + 73 * var(--fluid)),145px)
read by 1src/styles/components.css
--mission-gap
clamp(56px,calc(56px + 32 * var(--fluid)),88px)
read by 1src/styles/components.css
--footer-gap
read by 1src/styles/components.css
--footer-pad
read by 1src/styles/components.css
--banner-h2-to-p
clamp(20px,calc(20px + 12 * var(--fluid)),32px)
read by 1src/styles/components.css
--banner-p-to-btn
clamp(28px,calc(28px + 12 * var(--fluid)),40px)
read by 1src/styles/components.css
--title-to-grid
24px
read by 1src/styles/components.css
--card-h3-mb
16px
read by 1src/styles/components.css
--card-meta-gap
clamp(var(--s-6),calc(var(--s-6) + 16 * var(--fluid)),var(--s-7))
read by 1src/styles/components.css
--card-btn-mt
34px
read by 1src/styles/components.css
--meta-py
12px
read by 1src/styles/components.css
--row-py
16px
read by 1src/styles/components.css
--list-offset
-16px
read by 1src/styles/components.css
--footer-row-h
read by 1src/styles/components.css
--fgroup-gap
48px
read by 1src/styles/components.css
--fh3-mb
8px
read by 1src/styles/components.css
--flink-py
read by 1src/styles/components.css
--fmeta-gap
14px
read by 1src/styles/components.css
--hero-lede-gap
var(--s-5)
read by 1src/styles/components.css
--mission-head-gap
var(--s-5)
read by 1src/styles/components.css
--card-fit
6cqi
read by 0 · aliased by 5--card-pad · --feat-pad · --nl-pad · --pdp-card-px · --pdp-card-py
--card-pad
clamp(var(--s-4),var(--card-fit),max(var(--s-5),var(--col-gap)))
read by 1src/styles/components.css
--banner-pad
clamp(var(--s-6),calc(var(--s-6) + 32 * var(--fluid)),var(--s-8)) clamp(var(--s-4),calc(var(--s-4) + 16 * var(--fluid)),var(--s-6))
read by 1src/styles/components.css
--banner-r
clamp(var(--r-l),calc(var(--r-l) + 8 * var(--fluid)),var(--r-xl))
read by 1src/styles/components.css
--row-title-gap
var(--s-1)
read by 1src/styles/components.css
--social-inset
0px
read by 1src/styles/components.css
--dd-pad
24px
read by 1src/styles/components.css
--dd-min-w
250px
read by 1src/styles/components.css
--dd-col-w
202px
read by 1src/styles/components.css
--dd-col-gap
40px
read by 1src/styles/components.css
--dd-head-mb
10px
read by 1src/styles/components.css
--dd-head-mt
30px
read by 1src/styles/components.css
--dd-link-py
read by 1src/styles/components.css
--dd-offset-y
14px
read by 1src/styles/components.css
--dd-offset-x
-48px
read by 1src/styles/components.css
--nav-link-px
read by 1src/styles/components.css
--nav-link-h
read by 1src/styles/components.css
--nav-chev-gap
4px
read by 1src/styles/components.css
--nav-menu-mr
25px
read by 1src/styles/components.css
--nav-cta-chev-w
45px
read by 1src/styles/components.css
Tuning