ClassesLumos 0.0.1

Tokens

Every custom property the framework declares: colors, spacing, type, radii, layout. Change a token and everything built on it follows.

Tokens are the framework's Style panel. Every size, color and space in Lumos resolves to one of these custom properties, so a change here moves the whole site at once rather than one element at a time.

Anything shown as a range is fluid: it interpolates between the two values as the viewport grows from 320px to 1440px, so there is no breakpoint where the type or spacing jumps. This page is generated from base.css.

Swatches

NameValueNotes
--light-100#ffffffThe lightest swatch. The page surface in light themes.
--light-200#ebebebA step down from white, used for the page ground behind raised surfaces.
--light-300#d9d9d9
--dark-700#453e42
--dark-800#2f2b2dThe raised surface in dark themes.
--dark-900#1f1d1eThe page surface in dark themes.
--brand-500#c6fb50The brand color. Used as an accent and as the primary button fill.
--brand-text--dark-900Text color that sits on the brand color, chosen for contrast.

Typography primitives

NameValueNotes
--primary-familyvar(--font-inter, system-ui, sans-serif)The typeface everything uses. Swap this and the whole site follows.
--primary-regular400
--primary-medium500
--primary-bold700
--primary-trim-top0.4emHow much of the font's built-in space above the cap height to remove, so headings sit flush with what is beside them.
--primary-trim-bottom0.38emThe same below the baseline.

Letter spacing

NameValueNotes
--letter-spacing-tight-0.03em
--letter-spacing-normal0em

Line height

NameValueNotes
--line-height-small1
--line-height-medium1.1
--line-height-large1.3
--line-height-huge1.5

Borders & focus

NameValueNotes
--border-width0.0625rem
--focus-width0.125remThickness of the focus ring. Never set this to zero.
--focus-offset0.1827remHow far the focus ring sits outside the element.
--focus-offset-innercalc(var(--focus-width) * -1)A negative offset, for a focus ring that must sit inside a clipped element.

Hover motion

NameValueNotes
--hover-duration200ms
--hover-easeease

Opening motion

NameValueNotes
--open-duration--hover-duration
--open-ease--hover-ease

Radius

NameValueNotes
--radius-small0.5rem
--radius-main1rem
--radius-round100vw

Fluid scale range

NameValueNotes
--viewport-min320The viewport width, in pixels, where every fluid value sits at its minimum.
--viewport-max1440The viewport width where every fluid value reaches its maximum.

Max width

NameValueNotes
--max-width-small70remA comfortable reading measure for long text.
--max-width-maincalc(var(--viewport-max) / 16 * 1rem)The widest the main container gets, matching --viewport-max.
--max-width-full100%
NameValueNotes
--nav-height5remThe height the fixed nav reserves.

Heading & text styles

NameValueNotes
--display64px → 112px (fluid)
--display-line-height--line-height-small
--display-letter-spacing--letter-spacing-tight
--display-text-transformnone
--display-margin-top--space-7
--display-margin-bottom--space-6
--display-font-family--primary-family
--display-font-weight--primary-medium
--display-trim-top--primary-trim-top
--display-trim-bottom--primary-trim-bottom
--display-text-wrapbalance
--h148px → 80px (fluid)
--h1-line-height--line-height-small
--h1-letter-spacing--letter-spacing-tight
--h1-text-transformnone
--h1-margin-top--space-7
--h1-margin-bottom--space-6
--h1-font-family--primary-family
--h1-font-weight--primary-medium
--h1-trim-top--primary-trim-top
--h1-trim-bottom--primary-trim-bottom
--h1-text-wrapbalance
--h240px → 64px (fluid)
--h2-line-height--line-height-small
--h2-letter-spacing--letter-spacing-tight
--h2-text-transformnone
--h2-margin-top--space-7
--h2-margin-bottom--space-5
--h2-font-family--primary-family
--h2-font-weight--primary-medium
--h2-trim-top--primary-trim-top
--h2-trim-bottom--primary-trim-bottom
--h2-text-wrapbalance
--h336px → 48px (fluid)
--h3-line-height--line-height-medium
--h3-letter-spacing--letter-spacing-tight
--h3-text-transformnone
--h3-margin-top--space-6
--h3-margin-bottom--space-5
--h3-font-family--primary-family
--h3-font-weight--primary-medium
--h3-trim-top--primary-trim-top
--h3-trim-bottom--primary-trim-bottom
--h3-text-wrapbalance
--h428px → 32px (fluid)
--h4-line-height--line-height-medium
--h4-letter-spacing--letter-spacing-tight
--h4-text-transformnone
--h4-margin-top--space-6
--h4-margin-bottom--space-4
--h4-font-family--primary-family
--h4-font-weight--primary-medium
--h4-trim-top--primary-trim-top
--h4-trim-bottom--primary-trim-bottom
--h4-text-wrapbalance
--h522px → 24px (fluid)
--h5-line-height--line-height-medium
--h5-letter-spacing--letter-spacing-tight
--h5-text-transformnone
--h5-margin-top--space-5
--h5-margin-bottom--space-4
--h5-font-family--primary-family
--h5-font-weight--primary-medium
--h5-trim-top--primary-trim-top
--h5-trim-bottom--primary-trim-bottom
--h5-text-wrapbalance
--h616px → 18px (fluid)
--h6-line-height--line-height-medium
--h6-letter-spacing--letter-spacing-tight
--h6-text-transformnone
--h6-margin-top--space-5
--h6-margin-bottom--space-3
--h6-font-family--primary-family
--h6-font-weight--primary-medium
--h6-trim-top--primary-trim-top
--h6-trim-bottom--primary-trim-bottom
--h6-text-wrapbalance
--text-large18px → 20px (fluid)
--text-large-line-height--line-height-large
--text-large-letter-spacing--letter-spacing-normal
--text-large-text-transformnone
--text-large-margin-top--space-4
--text-large-margin-bottom--space-4
--text-large-font-family--primary-family
--text-large-font-weight--primary-regular
--text-large-trim-top--primary-trim-top
--text-large-trim-bottom--primary-trim-bottom
--text-large-text-wrappretty
--text-main16px → 18px (fluid)
--text-main-line-height--line-height-huge
--text-main-letter-spacing--letter-spacing-normal
--text-main-text-transformnone
--text-main-margin-top--space-4
--text-main-margin-bottom--space-4
--text-main-font-family--primary-family
--text-main-font-weight--primary-regular
--text-main-trim-top--primary-trim-top
--text-main-trim-bottom--primary-trim-bottom
--text-main-text-wrappretty
--text-small14px → 16px (fluid)
--text-small-line-height--line-height-huge
--text-small-letter-spacing--letter-spacing-normal
--text-small-text-transformnone
--text-small-margin-top--space-4
--text-small-margin-bottom--space-4
--text-small-font-family--primary-family
--text-small-font-weight--primary-regular
--text-small-trim-top--primary-trim-top
--text-small-trim-bottom--primary-trim-bottom
--text-small-text-wrappretty

Site layout

NameValueNotes
--site-margin16px → 48px (fluid)The space between the page edge and its content.
--site-gutter16px → 32px (fluid)The space between grid and flex children.
--site-widthcalc(100% - var(--site-margin) * 2)The content width once the site margins are taken off.

Spacing

NameValueNotes
--space-16px → 8px (fluid)
--space-210px → 12px (fluid)
--space-314px → 16px (fluid)
--space-420px → 24px (fluid)
--space-528px → 32px (fluid)
--space-632px → 40px (fluid)
--space-736px → 48px (fluid)
--space-840px → 64px (fluid)
--section-space-small48px → 80px (fluid)
--section-space-medium64px → 112px (fluid)
--section-space-large88px → 160px (fluid)
--section-space-nav-overlap160px → 224px (fluid)Top padding for the first section under an overlapping nav, so the bar does not cover its content.