typographic
Version:
Responsive typography with modular scale, font stacks, and more.
495 lines (385 loc) • 15.9 kB
text/stylus
// Typographic v2.9.2 - https://github.com/corysimmons/typographic
// Settings
$line-height-ratio = 1.75
$heading-ratio = $golden
$body-font = $helvetica
$body-font-weight = 300
$body-color = #666
$heading-font = $helvetica
$heading-font-weight = 500
$heading-color = #111
$min-font = 12px
$max-font = 20px
$min-width = 600px
$max-width = 1140px
$vertical-rhythm = true
// Ratios
$minor-second = 1.067
$major-second = 1.125
$minor-third = 1.2
$major-third = 1.25
$perfect-fourth = 1.333
$aug-fourth = 1.414
$perfect-fifth = 1.5
$minor-sixth = 1.6
$golden = 1.618
$major-sixth = 1.667
$minor-seventh = 1.778
$major-seventh = 1.875
$octave = 2
$major-tenth = 2.5
$major-eleventh = 2.667
$major-twelfth = 3
$double-octave = 4
// Sans-serif
$calibri = 'Calibri', 'Candara', 'Segoe', 'Segoe UI', 'Optima', 'Arial', 'sans-serif'
$candara = 'Candara', 'Calibri', 'Segoe', 'Segoe UI', 'Optima', 'Arial', 'sans-serif'
$courier = 'Courier New', 'Courier', 'Lucida Sans Typewriter', 'Lucida Typewriter', 'monospace'
$franklin = 'Franklin Gothic Medium', 'Arial', 'sans-serif'
$futura = 'Futura', 'Trebuchet MS', 'Arial', 'sans-serif'
$geneva = 'Geneva', 'Tahoma', 'Verdana', 'sans-serif'
$gill-sans = 'Gill Sans', 'Gill Sans MT', 'Calibri', 'sans-serif'
$helvetica = 'Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif'
$lucida-grande = 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Geneva', 'Verdana', 'sans-serif'
$optima = 'Optima', 'Segoe', 'Segoe UI', 'Candara', 'Calibri', 'Arial', 'sans-serif'
$segoe = 'Segoe', 'Segoe UI', 'Helvetica Neue', 'Arial', 'sans-serif'
$tahoma = 'Tahoma', 'Geneva', 'Verdana', 'sans-serif'
$trebuchet = 'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Tahoma', 'sans-serif'
$verdana = 'Verdana', 'Geneva', 'sans-serif'
// Serif
$antiqua = 'Book Antiqua', 'Palatino', 'Palatino Linotype', 'Palatino LT STD', 'Georgia', 'serif'
$baskerville = 'Baskerville', 'Baskerville old face', 'Hoefler Text', 'Garamond', 'Times New Roman', 'serif'
$bodoni = 'Bodoni MT', 'Didot', 'Didot LT STD', 'Hoefler Text', 'Garamond', 'Times New Roman', 'serif'
$cambria = 'Cambria', 'Georgia', 'serif'
$caslon = 'Big Caslon', 'Book Antiqua', 'Palatino Linotype', 'Georgia', 'serif'
$constantia = 'Constantia', 'Palatino', 'Palatino Linotype', 'Palatino LT STD', 'Georgia', 'serif'
$didot = 'Didot', 'Didot LT STD', 'Hoefler Text', 'Garamond', 'Times New Roman', 'serif'
$garamond = 'Garamond', 'Baskerville', 'Baskerville Old Face', 'Hoefler Text', 'Times New Roman', 'serif'
$goudy = 'Goudy Old Style', 'Garamond', 'Big Caslon', 'Times New Roman', 'serif'
$hoefler = 'Hoefler Text', 'Baskerville old face', 'Garamond', 'Times New Roman', 'serif'
$lucida-bright = 'Lucida Bright', 'Georgia', 'serif'
$palatino = 'Palatino', 'Palatino Linotype', 'Palatino LT STD', "Book Antiqua", 'Georgia', 'serif'
// Helpers
/**
* Creates a baseline grid based off your $line-height-ratio to help visualize your vertical rhythm grid. You can offset the grid by negative or positive pixels to line it up perfectly with the bottom of your text.
*
* @param {color} [$color=black] - A color to be lightened and used as the color for the grid.
* @param {number} [$px-offset=false] - A positive or negative number of pixels to offset the grid by. Useful for lining the bottom of the gridlines up with your text.
*
* @example
* grid-overlay(blue, 2)
*/
grid-overlay($color = black, $px-offset = false)
body
background: linear-gradient(to top, rgba($color, 10%) 5%, white 5%)
background-size: 100% ($line-height-ratio)em
if $px-offset
background-position: 0 unit($px-offset, 'px')
/**
* Returns a "vertical unit". Useful for specifying the height and margins of non-text elements like images and such.
*
* @param {number} [$units=1] - Number of units. Accepts floated numbers as well.
* @param {number} [$px-offset=false] - A positive or negative number of pixels to offset the grid by. Useful for lining the bottom of the gridlines up with your text. Since this doesn't compute a literal pixel you may need to use a floated number (multiples of .25 work well) to keep your rhythm on track.
*
* @example
* img
* padding-top vr-block(5.25, .5)
*/
vr-block($units = 1, $px-offset = false)
if $px-offset
return ( (($line-height-ratio * $max-font) / ($max-font / 2)) * ($units / 2) * (1 + ($px-offset / $max-font)) )em
else
return ( (($line-height-ratio * $max-font) / ($max-font / 2)) * ($units / 2) )em
// Typography Mixins
t-html()
font-family: $body-font
font-weight: $body-font-weight
color: $body-color
font-size: $min-font
line-height: ($line-height-ratio)em
@media (min-width: $min-width)
font-size: s('calc( %s + (%s - %s) * ((100vw - %s) / (%s - %s)) )', $min-font, remove-unit($max-font), remove-unit($min-font), $min-width, remove-unit($max-width), remove-unit($min-width))
@media (min-width: $max-width)
font-size: $max-font
t-p = t-html
t-reset()
margin: 0
padding: 0
t-block()
margin-bottom: ($line-height-ratio)em
t-heading()
font-family: $heading-font
font-weight: $heading-font-weight
color: $heading-color
clear: both
t-h1()
$local-min-font = $min-font * ($heading-ratio ** 1.75)
$local-max-font = $max-font * ($heading-ratio ** 1.75)
font-size: $local-min-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $min-font) / ($local-min-font / 1.25))em
line-height: (($line-height-ratio * $min-font) / ($local-min-font / 1.5))em
margin-bottom: (($line-height-ratio * $min-font) / ($local-min-font / .25))em
else
margin-top: 0
line-height: 1.1em
margin-bottom: .25em
@media (min-width: $min-width)
font-size: s('calc( %s + (%s - %s) * ((100vw - %s) / (%s - %s)) )', $local-min-font, remove-unit($local-max-font), remove-unit($local-min-font), $min-width, remove-unit($max-width), remove-unit($min-width))
@media (min-width: $max-width)
font-size: $local-max-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $max-font) / ($local-max-font / 1.25))em
line-height: (($line-height-ratio * $max-font) / ($local-max-font / 1.5))em
margin-bottom: (($line-height-ratio * $max-font) / ($local-max-font / .25))em
t-h2()
$local-min-font = $min-font * ($heading-ratio ** 1.4)
$local-max-font = $max-font * ($heading-ratio ** 1.4)
font-size: $local-min-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $min-font) / ($local-min-font / 1.25))em
line-height: (($line-height-ratio * $min-font) / ($local-min-font / 1.5))em
margin-bottom: (($line-height-ratio * $min-font) / ($local-min-font / .25) * (1 + (3 / $local-min-font)))em
else
margin-top: 0
line-height: 1.2em
margin-bottom: .25em
@media (min-width: $min-width)
font-size: s('calc( %s + (%s - %s) * ((100vw - %s) / (%s - %s)) )', $local-min-font, remove-unit($local-max-font), remove-unit($local-min-font), $min-width, remove-unit($max-width), remove-unit($min-width))
@media (min-width: $max-width)
font-size: $local-max-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $max-font) / ($local-max-font / 1.25))em
line-height: (($line-height-ratio * $max-font) / ($local-max-font / 1.5))em
margin-bottom: (($line-height-ratio * $max-font) / ($local-max-font / .25) * (1 + (3 / $local-max-font)))em
t-h3()
$local-min-font = $min-font * ($heading-ratio ** 1.05)
$local-max-font = $max-font * ($heading-ratio ** 1.05)
font-size: $local-min-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $min-font) / ($local-min-font / 1.25))em
line-height: (($line-height-ratio * $min-font) / ($local-min-font / 1.5))em
margin-bottom: (($line-height-ratio * $min-font) / ($local-min-font / .25) * (1 + (3 / $local-min-font)))em
else
margin-top: 0
line-height: 1.3em
margin-bottom: .25em
@media (min-width: $min-width)
font-size: s('calc( %s + (%s - %s) * ((100vw - %s) / (%s - %s)) )', $local-min-font, remove-unit($local-max-font), remove-unit($local-min-font), $min-width, remove-unit($max-width), remove-unit($min-width))
@media (min-width: $max-width)
font-size: $local-max-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $max-font) / ($local-max-font / 1.25))em
line-height: (($line-height-ratio * $max-font) / ($local-max-font / 1.5))em
margin-bottom: (($line-height-ratio * $max-font) / ($local-max-font / .25) * (1 + (3 / $local-max-font)))em
t-h4()
$local-min-font = $min-font * ($heading-ratio ** .7)
$local-max-font = $max-font * ($heading-ratio ** .7)
font-size: $local-min-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $min-font) / ($local-min-font / 1.25))em
line-height: (($line-height-ratio * $min-font) / ($local-min-font / 1.5))em
margin-bottom: (($line-height-ratio * $min-font) / ($local-min-font / .25) * (1 + (3 / $local-min-font)))em
else
margin-top: 0
line-height: 1.4em
margin-bottom: .25em
@media (min-width: $min-width)
font-size: s('calc( %s + (%s - %s) * ((100vw - %s) / (%s - %s)) )', $local-min-font, remove-unit($local-max-font), remove-unit($local-min-font), $min-width, remove-unit($max-width), remove-unit($min-width))
@media (min-width: $max-width)
font-size: $local-max-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $max-font) / ($local-max-font / 1.25))em
line-height: (($line-height-ratio * $max-font) / ($local-max-font / 1.5))em
margin-bottom: (($line-height-ratio * $max-font) / ($local-max-font / .25) * (1 + (3 / $local-max-font)))em
t-h5()
$local-min-font = $min-font * ($heading-ratio ** .35)
$local-max-font = $max-font * ($heading-ratio ** .35)
font-size: $local-min-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $min-font) / ($local-min-font / 1.25))em
line-height: (($line-height-ratio * $min-font) / ($local-min-font / 1.5))em
margin-bottom: (($line-height-ratio * $min-font) / ($local-min-font / .25))em
else
margin-top: 0
line-height: 1.5em
margin-bottom: .25em
@media (min-width: $min-width)
font-size: s('calc( %s + (%s - %s) * ((100vw - %s) / (%s - %s)) )', $local-min-font, remove-unit($local-max-font), remove-unit($local-min-font), $min-width, remove-unit($max-width), remove-unit($min-width))
@media (min-width: $max-width)
font-size: $local-max-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $max-font) / ($local-max-font / 1.25))em
line-height: (($line-height-ratio * $max-font) / ($local-max-font / 1.5))em
margin-bottom: (($line-height-ratio * $max-font) / ($local-max-font / .25))em
t-h6()
$local-min-font = $min-font
$local-max-font = $max-font
font-size: $local-min-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $min-font) / ($local-min-font / 1.25))em
line-height: (($line-height-ratio * $min-font) / ($local-min-font / 1.5))em
margin-bottom: (($line-height-ratio * $min-font) / ($local-min-font / .25) * (1 + (5 / $local-min-font)))em
else
margin-top: 0
line-height: 1.6em
margin-bottom: .25em
@media (min-width: $min-width)
font-size: s('calc( %s + (%s - %s) * ((100vw - %s) / (%s - %s)) )', $local-min-font, remove-unit($local-max-font), remove-unit($local-min-font), $min-width, remove-unit($max-width), remove-unit($min-width))
@media (min-width: $max-width)
font-size: $local-max-font
if $vertical-rhythm is true
margin-top: (($line-height-ratio * $min-font) / ($local-min-font / 1.25))em
line-height: (($line-height-ratio * $min-font) / ($local-min-font / 1.5))em
margin-bottom: (($line-height-ratio * $min-font) / ($local-min-font / .25) * (1 + (1 / $local-min-font)))em
t-blockquote()
font-style: italic
cite
display: block
font-style: normal
t-pre()
padding: vr-block(.5)
margin-bottom: vr-block(1)
code
padding: 0
t-code()
font-family: $courier
padding: ($line-height-ratio * .05)em ($line-height-ratio * .15)em
line-height: 0
t-abbr()
border-bottom: 1px dotted currentColor
cursor: help
t-dt()
color: $heading-color
font-weight: bold
t-fieldset()
padding: vr-block(.5) vr-block() vr-block()
border-width: 1px
border-style: solid
max-width: 100%
margin-bottom: vr-block(1, 1)
@media (min-width: $max-width)
margin-bottom: vr-block(1.25, -1)
button, input[type="submit"]
margin-bottom: 0
t-legend()
color: $heading-color
font-weight: bold
t-label()
display: block
padding-bottom: vr-block(.125)
margin-bottom: vr-block(-.25, -10)
t-input()
$local-min-font = $min-font
$local-max-font = $max-font
display: block
max-width: 100%
padding: vr-block(.25)
font-size: $local-min-font
margin-bottom: vr-block(.5, 7)
@media (min-width: $min-width)
font-size: s('calc( %s + (%s - %s) * ((100vw - %s) / (%s - %s)) )', $local-min-font, remove-unit($local-max-font), remove-unit($local-min-font), $min-width, remove-unit($max-width), remove-unit($min-width))
@media (min-width: $max-width)
font-size: $local-max-font
margin-bottom: vr-block(.25, 3.5)
t-button()
$local-min-font = $min-font
$local-max-font = $max-font
display: block
cursor: pointer
font-size: $local-min-font
padding: vr-block(.25) vr-block()
margin-bottom: vr-block(.75, -2)
@media (min-width: $min-width)
font-size: s('calc( %s + (%s - %s) * ((100vw - %s) / (%s - %s)) )', $local-min-font, remove-unit($local-max-font), remove-unit($local-min-font), $min-width, remove-unit($max-width), remove-unit($min-width))
@media (min-width: $max-width)
font-size: $local-max-font
margin-bottom: vr-block(.75)
t-table()
width: 100%
border-spacing: 0
border-collapse: collapse
margin-bottom: vr-block(1, 5)
@media (min-width: $max-width)
margin-bottom: vr-block(1, 3.5)
t-th()
text-align: left
color: $heading-color
padding: vr-block(.125) vr-block(.5)
@media (min-width: $max-width)
padding: vr-block(.25) vr-block(.5)
t-td()
padding: vr-block(.125) vr-block(.5)
@media (min-width: $max-width)
padding: vr-block(.25) vr-block(.5)
/**
* The Typographic Reset. This is where Typographic goes through every markup element and styles it to adhere to a vertical rhythm. After you set your variables in a settings file fire this mixin.
*
* @example
* typographic()
*/
typographic()
html
t-html()
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td
t-reset()
p, blockquote, pre,
address,
dl, ol, ul,
table
t-block()
h1, h2, h3, h4, h5, h6
t-heading()
h1
t-h1()
h2
t-h2()
h3
t-h3()
h4
t-h4()
h5
t-h5()
h6
t-h6()
blockquote
t-blockquote()
pre
t-pre()
code
t-code()
big, small, sub, sup
line-height: 0
abbr, acronym
t-abbr()
address
font-style: normal
dt
t-dt()
ul
padding-left: 1.1em
ol
padding-left: 1.4em
fieldset
t-fieldset()
legend
t-legend()
label
t-label()
input[type="text"], input[type="email"], input[type="password"], textarea
t-input()
input[type="submit"], button
t-button()
table
t-table()
th
t-th()
td
t-td()