core-concepts
Fluid Tokens
Using and customizing fluid units in @purposeUI projects.
Overview
@purposeUI uses the clamp() function to define fluid, responsive tokens for properties like font-size, padding, margin, gap, border-radius, and blur. This allows values to scale between a minimum and maximum based on viewport width, reducing reliance on media queries and improving consistency.
A custom SCSS mixin, fluid(), is used to simplify this. It takes two arguments—min and max—and returns a clamp() expression with a calculated viewport-based value between them. This makes fluid sizing easy to apply and consistent across the codebase.
Mixin Usage
@use "../mixins" as *;
.eyebrow {
font-size: fluid(12px, 24px);
}
// Use with interpolation
.is-blurred {
filter: blur(#{fluid(2px, 4px)});
}
Defaults
// tokens.scss
// used for font-size utilities
font-size: (
xs: fluid(10px, 12px),
sm: fluid(12px, 14px),
md: fluid(14px, 16px),
ml: fluid(16px, 18px),
lg: fluid(18px, 22px),
xl: fluid(22px, 26px),
2xl: fluid(26px, 32px),
3xl: fluid(32px, 40px),
4xl: fluid(38px, 52px),
5xl: fluid(44px, 64px),
6xl: fluid(48px, 80px),
7xl: fluid(56px, 96px),
),
// used for border-radius utilities
radius: (
zero: 0,
xs: fluid(2px, 4px),
sm: fluid(4px, 8px),
md: fluid(8px, 12px),
ml: fluid(10px, 16px),
lg: fluid(16px, 24px),
xl: fluid(20px, 32px),
max: 1e5px,
),
// Used for filters and backdrop-filters utilities
blur: (
xs: blur(#{fluid(1px, 2px)}),
sm: blur(#{fluid(2px, 4px)}),
md: blur(#{fluid(4px, 6px)}),
ml: blur(#{fluid(5px, 8px)}),
lg: blur(#{fluid(8px, 12px)}),
xl: blur(#{fluid(10px, 16px)}),
),
// used for margin, padding, gap, top/right/bottom/left, flex-basis utilities
size: (
auto: auto,
zero: 0px,
3xs: fluid(1px, 2px),
2xs: fluid(2px, 4px),
xs: fluid(3px, 6px),
sm: fluid(4px, 8px),
md: fluid(8px, 12px),
ml: fluid(10px, 16px),
lg: fluid(14px, 20px),
xl: fluid(16px, 24px),
2xl: fluid(20px, 32px),
3xl: fluid(24px, 40px),
4xl: fluid(30px, 48px),
5xl: fluid(36px, 56px),
6xl: fluid(42px, 64px),
7xl: fluid(48px, 72px),
8xl: fluid(56px, 80px),
9xl: fluid(64px, 96px),
10xl: fluid(80px, 120px),
max: 1e5px,
),