Typography.js
A powerful toolkit for building websites with beautiful typography.
Install
npm install typography
Demo/playground
http://kyleamathews.github.io/typography.js
Why
Typography is a complex system of interrelated styles. 100s of style
declarations on dozens of elements must be in harmonious order. Trying
one design change can mean making dozens of tedious recalculations and
CSS value changes. Creating new Typography themes with CSS feels hard.
Typography.js provides a vastly simpler way to define and
explore typography designs.
You provide configuration to the Typography.js JS api and it uses its
Typography engine to generate CSS for block and inline
elements.
Typography.js makes it easy to create designs that are unique, personal, and
custom to your project.
Themes & Plugins
- themes: Typography.js themes are simple Javascript objects. As
such they're easy to share across projects or even
open source and share via
NPM.
- plugins: Plugins are functions that extend or modify the core
Typography engine. They can change how headers are styled
or add specialized styles e.g. for code or tables.
Javascript usage
import Typography from 'typography'
const typography = new Typography({
baseFontSize: '18px',
baseLineHeight: '30px',
headerFontFamily: ['Avenir Next', 'Helvetica Neue', 'Segoe UI', 'Helvetica', 'Arial', 'sans-serif'],
bodyFontFamily: ['Georgia', 'serif'],
})
typography.toString()
typography.injectStyles()
Themes
We maintain 29 (and counting) themes that are ready to use on your next
project. These are each published as seperate NPM packages. Explore
themes at http://kyleamathews.github.io/typography.js.
Using themes
Here's an example of how to use the Funston theme.
- First save the package to your project
npm install --save typography-theme-funston
- Then import and pass into Typography when initializing.
import Typography from 'typography'
import funstonTheme from 'typography-theme-funston'
const typography = new Typography(funstonTheme)
Customizing themes
Themes are just javascript objects so it's easy to modify them as
needed. For example, if you're using the Funston theme but want to
increase the base font size slightly:
import Typography from 'typography'
import funstonTheme from 'typography-theme-funston'
funstonTheme.baseFontSize = '22px'
funstonTheme.baseLineHeight = '31px'
const typography = new Typography(funstonTheme)
Or if you'd like to use the imperative API overrideThemeStyles
to directly set/override
styles on a theme:
import Typography from 'typography'
import funstonTheme from 'typography-theme-funston'
funston.overrideThemeStyles = ({ rhythm }, options) => ({
'h2,h3': {
marginBottom: rhythm(1/2),
marginTop: rhythm(2),
}
})
const typography = new Typography(funstonTheme)
Published Typography.js Themes
Plugins
plugins are functions that extend or modify the core typography engine.
they can change how headers are styled or add specialized styles e.g.
for code or tables. currently there's one plugin available,
typography-plugin-code
.
To use the Code plugin, first install using NPM.
npm install --save typography-plugin-code
Then add to your theme before creating a new typography object.
import Typography from 'typography'
import CodePlugin from 'typography-plugin-code'
import sternGroveTheme from 'typography-theme-stern-grove'
sternGroveTheme.plugins = [
new CodePlugin(),
]
const typography = new Typography(sternGroveTheme)
React.js helper components.
Typography.js includes two helper components for your React.js projects,
TypographyStyle
and GoogleFont
. These are ideal for
server-rendering.
TypographyStyle
creates a style element and inserts the generated
CSS for your theme.GoogleFont
creates the link element to include the Google Fonts &
weights specified in your theme.
To use, first install the package npm install --save react-typography
then import them into your html.js
file.
import { TypographyStyle, GoogleFont } from 'react-typography'
import typography from 'utils/typography'
<html>
<head>
<TypographyStyle typography={typography} />
<GoogleFont typography={typography} />
</head>
<body>
// stuff
</body>
</html>
API
When creating a new instance of Typography, you can pass in an
configuration object. All configuration keys are optional.
- baseFontSize: The base font size in pixels, defaults to "16px"
- baseLineHeight: The base line height in pixels, defaults to "24px".
- modularScales: An array of modular scales.
[
{
scale: 'octave',
},
{
scale: 'golden',
maxWidth: '768px',
},
]
- googleFonts: An array specifying Google Fonts for this project.
googleFonts: [
{
name: 'Montserrat',
styles: [
'700',
],
},
{
name: 'Merriweather',
styles: [
'400',
'400i',
'700',
'700i',
'900',
'900i',
],
},
],
- headerFontFamily: An array of strings specifying the font family stack for headers e.g.
['Helvetica', 'sans-serif']
. Defaults to a system UI font stack. - bodyFontFamily: An array of strings specifying the font family stack for the body, defaults to
['georgia', 'serif']
. - headerGray: The "lightness" value for headers (in hsl). Defaults to 20.
- headerGrayHue: The "hue" value for headers (in hsl). Defaults to 0. Also accepts three named hues, "cool", "slate", and "warm".
- bodyGray: The "lightness" value for body text (in hsl). Defaults to 20.
- bodyGrayHue: The "hue" value for body text (in hsl). Defaults to 0. Also accepts three named hues, "cool", "slate", and "warm".
- headerWeight: Specify the font weight for headers. Defaults to 900.
- bodyWeight: Specify the font weight for body text. Defaults to 'normal'.
- boldWeight: Specify the font weight for bold (b, strong, dt, th) elements. Defaults to "bold".
- blockMarginBottom: Specify the default margin-bottom for block elements. Defaults to one "rhythm unit" or the base line height.
- includeNormalize: Include in generated CSS normalize.css. Normalize.css is an excellent project which works to normalize the base CSS across browsers and serves as an excellent foundation for Typography.js. We include normalize.CSS by default but if you're already including it elsewhere in your project, you can disable including it here by passing
false
. - overrideStyles: Imperative API for directly adding to or
overriding auto-generated styles. It's called with a Vertical
Rhythm object, the options object, and the algorithmically generated
styles.
overrideStyles: ({ adjustFontSizeTo, rhythm }, options, styles) => ({
h1: {
fontFamily: ['Montserrat', 'sans-serif'].join(','),
},
blockquote: {
...adjustFontSizeTo('19px'),
color: gray(41),
fontStyle: 'italic',
paddingLeft: rhythm(13/16),
marginLeft: rhythm(-1),
borderLeft: `${rhythm(3/16)} solid ${gray(10)}`,
},
'blockquote > :last-child': {
marginBottom: 0,
},
})
- overrideThemeStyles: This has the same function signature as
overrideStyles
but should be used in place of overrideStyles
when
using a 3rd-party theme so as to not delete the theme's own
overrideStyles
function.
overrideThemeStyles: ({ rhythm }, options, styles) => ({
'h2,h3': {
marginBottom: rhythm(1/2),
marginTop: rhythm(2),
}
})
Developing Typography.js
Typography.js is a monorepo facilitated by
Lerna.
TODO: document constants + compass-vertical-rhythm + using
typgraphy.js for inline styles.