Type Scale Utility

Our wrapper utility is constructed as follows:

/* @link https://utopia.fyi/generator-mk-ii?c=320,21,1.2,1140,24,1.25,5,2, */

:root {
--fluid-min-width: 320;
--fluid-max-width: 1140;

--fluid-screen: 100vw;
--fluid-bp: calc((var(--fluid-screen) - var(--fluid-min-width) / 16 * 1rem) / (var(--fluid-max-width) - var(--fluid-min-width)));
}

@media screen and (min-width: 1140px) {
:root {
--fluid-screen: calc(var(--fluid-max-width) * 1px);
}
}

:root {
--f--2-min: 14.58;
--f--2-max: 15.36;
--step--2: calc(((var(--f--2-min) / 16) * 1rem) + (var(--f--2-max) - var(--f--2-min)) * var(--fluid-bp));

--f--1-min: 17.5;
--f--1-max: 19.2;
--step--1: calc(((var(--f--1-min) / 16) * 1rem) + (var(--f--1-max) - var(--f--1-min)) * var(--fluid-bp));

--f-0-min: 21;
--f-0-max: 24;
--step-0: calc(((var(--f-0-min) / 16) * 1rem) + (var(--f-0-max) - var(--f-0-min)) * var(--fluid-bp));

--f-1-min: 25.2;
--f-1-max: 30;
--step-1: calc(((var(--f-1-min) / 16) * 1rem) + (var(--f-1-max) - var(--f-1-min)) * var(--fluid-bp));

--f-2-min: 30.24;
--f-2-max: 37.5;
--step-2: calc(((var(--f-2-min) / 16) * 1rem) + (var(--f-2-max) - var(--f-2-min)) * var(--fluid-bp));

--f-3-min: 36.29;
--f-3-max: 46.88;
--step-3: calc(((var(--f-3-min) / 16) * 1rem) + (var(--f-3-max) - var(--f-3-min)) * var(--fluid-bp));

--f-4-min: 43.55;
--f-4-max: 58.59;
--step-4: calc(((var(--f-4-min) / 16) * 1rem) + (var(--f-4-max) - var(--f-4-min)) * var(--fluid-bp));

--f-5-min: 52.25;
--f-5-max: 73.24;
--step-5: calc(((var(--f-5-min) / 16) * 1rem) + (var(--f-5-max) - var(--f-5-min)) * var(--fluid-bp));
}

Purpose

The type-scale utility uses Utopia to 'Elegantly scale type and space without breakpoints'. It provides a fluid type scale that can be defined by you. By default, the utility gives you a starting point, but you can feel free to override the file by using the Utopia calculator directly.

Example

const theme = {
breakpoints: {
md: '48em',
lg: '68em',
},
sizeScale: {
200: 'var(--step--2)',
300: 'var(--step--1)',
400: 'var(--step-0)',
500: 'var(--step-1)',
600: 'var(--step-2)',
700: 'var(--step-3)',
800: 'var(--step-4)',
900: 'var(--step-5)',
},
};

module.exports = {
theme,
tokens: {
text: {
items: theme.sizeScale,
responsive: true,
property: 'font-size',
},
},
};
<h2 class="text-900">Heading</h2>