fluidms
v1.0.0
Published
A font-size system based on Modular Scale and Fluid Typography built with Sass and CSS custom properties.
Downloads
271
Maintainers
Readme
FluidMS
FluidMS offers a font-size system that enables you to use Modular Scale in combination with the Fluid Typography technique. It also ensures that all your typography always sits on a baseline grid which size you can define.
Requirements
FluidMS is built on Dart Sass.
Getting Started
Installing
In order to use FluidMS, first install the package:
$ npm install fluidms --save
Next, you need to import the Sass files into your project:
// Your `main.scss` file.
@use "<path-to-fluidms-node-package>/src/fluidms.scss";
If you are following an ITCSS approach in your project, you might want to import the individual partials of FluidMS instead:
// Your `main.scss` file.
// Settings
@use "<path-to-fluidms-node-package>/src/settings/settings.config";
// Tools
@use "<path-to-fluidms-node-package>/src/tools/tools.utils";
@use "<path-to-fluidms-node-package>/src/tools/tools.ms";
@use "<path-to-fluidms-node-package>/src/tools/tools.font-size";
@use "<path-to-fluidms-node-package>/src/tools/tools.line-height";
// Generic
@use "<path-to-fluidms-node-package>/src/generic/generic.ms-custom-properties";
// Elements
@use "<path-to-fluidms-node-package>/src/elements/elements.page";
// Objects
...
// Components
...
// Utilities
...
Usage
To use FluidMS, you only need to apply the fluidms-font-size()
mixin to the elements you want to assign font-sizes to:
.foo {
@include fluidms-font-size();
}
Just calling the mixin without any arguments assigns the base font-size to the element along with a line-height that is calculated to automatically fit into the defined baseline grid.
Let’s see how we can affect the generated font-size of an element:
.larger-text {
@include fluidms-font-size(
$font-size: ms(1)
);
}
Here we are calling the mixin with altering the $font-size
parameter. For that, we are using the ms()
function (ms
stands for “Modular Scale”). What we are doing here is to say: “Assign a font-size here, but set the font-size to the next bigger scale entity than our base font-size (hence 1).” We could also set the font-size to the next bigger scale entity by passing $font-size: ms(2)
and so on.
Negative entites are also possible:
.smaller-text {
@include fluidms-font-size(
$font-size: ms(-2)
);
}
Read more about Modular Scale here.
Custom font-size
Instead of relying on the modular scale for a specific font-size and using the ms()
function for the $font-size
parameter, you can also pass a custom font-size:
.custom-font-size {
@include fluidms-font-size(
$font-size: 38px
);
}
Any value that is valid for the native CSS font-size
property is also valid here.
Changing the line-height
By default, the line height is automatically calculated so that it fits onto the defined baseline grid. However, if you need to manually assign a custom line-height to an element, you can do so with an additional argument:
.custom-line-height {
@include fluidms-font-size(
$font-size: ms(3),
$line-height: 50px
);
}
Possible values for the $line-height
parameter are:
- A number with any unit that’s valid for
line-height
declarations (or unit-less) - The keyword
inherit
- The keyword
normal
You can also completely omit the output of a line-height declaration by setting its value to false
:
.no-line-height {
@include fluidms-font-size(
$font-size: ms(3),
$line-height: false
);
}
($line-height: none
also works for omitting the output)
Increasing/Decreasing the line-height
There may be situations where the generated line-height is not quite what you need, but you still want to benefit from the automatic baseline grid adaptation. So instead of assigning a custom line-height and risking loosing the anchoring to the baseline grid, you can tweak the line-height upwards or downwards and still be on the baseline grid:
.slightly-smaller-line-height {
@include fluims-font-size(
$line-height-modifier: -1
);
}
.slightly-bigger-line-height {
@include fluims-font-size(
$line-height-modifier: 1
);
}
As you can see, we can deviate from the default line-height in integer increments (positive and negative). In theory, every integer is possible here (e.g. 1.000.000
), but mostly you will only tweak the line-height a little bit.
Note that $line-height-modifier
only has affect when the $line-height
parameter is set to auto
(default).
!important
You will not find any CSS jokes about the usage of !important
here. The fact is, it may well be that you need an !important
here and there and actually, it sometimes can be a pretty good idea, too.
Anyhow, FluidMS has got you covered for these situations:
.i-need-important {
@include fluidms-font-size(
$font-size: ms(1),
$important: true
);
}
This outputs the font-size as well as the line-height with a trailing !important
in the declaration.
Adjusting
FluidMS comes with predefined configuration settings that you can fit to your needs. You’ll find all the config in the provided _settings.config.scss
file.
Changing the baseline grid
FluidMS provides a baseline grid out of the box. That means that every line-height that is automatically generated by FluidMS sits on this vertical grid. You can change the size of that grid by altering the $GLOBAL-BASELINE
variable:
$GLOBAL-BASELINE: 0.25rem !default;
$GLOBAL-BASELINE
needs to be defined with a rem
unit. It has been proven to be a good idea to define a value between 0.1rem
– 0.333rem
.
If your design doesn’t require a global baseline grid, you can also disable it:
$GLOBAL-BASELINE: false !default;
Changing the global line-height
You can define an ideal line-height that is taken into account when calculating the actual line-height. The value you define here is more just a rough direction of what the resulting line-height will be.
$GLOBAL-LINE-HEIGHT: 1.5 !default;
Changing the global line-height ratio
The bigger font-sizes get, the lesser the line-height needs to be in relation to its font-size. Hence, we provide an option to decrease the line-height in proportion to the font-size, the bigger the font-size gets.
$GLOBAL-LINE-HEIGHT-RATIO: 1 !default;
Don’t get crazy with this variable’s value! Only nudge the ratio slightly and always test all the possible font-sizes with multiline text.
Configure the Fluid Typography values
With Fluid Typography, you basically define a viewport range in which all the font-sizes are fluid, i.e. the font-sizes are sized according to the viewport size — if the viewport size is small, the font-size is too. If the viewport size is large, so is the font-size.
Defining the viewport range
You can define the range in which the typography is fluid with the min-viewport
and max-viewport
entries in the $CONFIG
Sass map:
$CONFIG: (
min-viewport: 480px,
max-viewport: 1280px,
) !default;
Defining the base font-size
This means that on every viewport that’s between 480px
and 1280px
wide, the typography will be fluid. How big the font-size is below and above this range can be defined with the min-font-size
and max-font-size
entries in $CONFIG
:
$CONFIG: (
min-font-size: 16px,
max-font-size: 24px,
min-viewport: 480px,
max-viewport: 1280px,
) !default;
Below a viewport of 480px
, the font-size will be 16px
and not smaller. Above a viewport of 1280px
the font-size will be 24px
and not larger. Between these two viewport sizes, the font-size will evenly scale between 16px
and 24px
. However these are just the base values when the default font-size is used. If we assign a larger font-size for an element like this:
.larger-text {
@include fluidms-font-size(
$font-size: ms(1)
);
}
then the minimum and maximum font-size should of course be bigger. How much bigger it is can be defined via the ratio
entry in the $CONFIG
Sass map:
Defining a font-size ratio
$CONFIG: (
min-font-size: 16px,
max-font-size: 24px,
min-viewport: 480px,
max-viewport: 1280px,
ratio: 1.1,
) !default;
With a ratio of 1.1
, the font-size of the example above will be 17.6px
(16px * 1.1
) on screens smaller than 480px
. On screens larger than 1280px
, the font-size will be 26.4px
(24px * 1.1
).
If we use the mixin with $font-size: ms(2)
, this font-size will be again 1.1x bigger than that one and so on.
Changing the ratio at different breakpoints
What seems like a good ratio on small screens might not be suited on larger screens as the different font-sizes are too similar to each other related to the viewport size. In this case you can optionally change the ratio for different breakpoints:
$CONFIG: (
min-font-size: 16px,
max-font-size: 24px,
min-viewport: 480px,
max-viewport: 1280px,
ratio: 1.1,
1024px: (
ratio: 1.3,
),
) !default;
Our default ratio is still 1.1
, but above screens of 1024px
, our ratio is increased to 1.3
. This means that our different font-sizes are more diverging in their sizes.
Defining a set of scales
In order to even be able to use different font-sizes, we need to define a set of different font-size entities. For that, we add a scales
list to the $CONFIG
map.
$CONFIG: (
min-font-size: 16px,
max-font-size: 24px,
min-viewport: 480px,
max-viewport: 1280px,
ratio: 1.1,
1024px: (
ratio: 1.3,
),
scales: (
6,
5,
4,
3,
2,
1,
0,
-1,
-2,
-3,
),
) !default;
Positive and negative integers are valid here. The numbers we add here basically result in the values we can use in the ms()
function.
Browser Support
As FluidMS uses the clamp()
math function, the browser support is limited accordingly. A non-supporting browser will simply ignore the fluid base font-size and will not show any fluid typography.