Модуль typography

base
body {
    font-size       : var(--body-size-base, 16px);
    font-family     : var(--body-font-family, "Open Sans", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
    line-height     : var(--body-line-height, 1.6);
    color           : var(--body-color, #333);
    text-align      : var(--body-text-align, null);
    background-color: var(--body-bg, #fff);
}

// чтобы сравнять размер шрифта body и html для нормальной работы rem 
html {
    font-size: var(--html-size-base, var(--body-size-base, 16px));
} 

h1, h2, h3, h4, h5, h6 {
    font-weight: var(--headings-font-weight, normal);
    line-height: var(--headings-line-height, 1.2);
}

h1, .h1 {
    font-size: var(--h1-font-size, 2.5rem);
    margin: var(--h1-margin, .7em 0 .5em 0);
}

h2, .h2 {
    font-size: var(--h2-font-size, 2rem);
    margin: var(--h2-margin, 1.1em 0 .5em 0);
}

h3, .h3 {
    font-size: var(--h3-font-size, 1.75rem);
    margin: var(--h3-margin, 1.1em 0 .5em 0);
}

h4, .h4 {
    font-size: var(--h4-font-size, 1.5rem);
    margin: var(--h4-margin, 1.1em 0 .5em 0);
}

h5, .h5 {
    font-size: var(--h5-font-size, 1.25rem);
    margin: var(--h5-margin, 1.1em 0 .5em 0);
}

h6, .h6 {
    font-size: var(--h6-font-size, 1rem);
    margin: var(--h6-margin, 1.1em 0 .5em 0);
}

p {
    margin: var(--paragraph-margin, 0 0 1rem 0);
}
blocks
:root {
    --blockquote-margin: 20px 0;
    --blockquote-padding: 10px 0 10px 25px;
    --blockquote-border-left: 5px solid var(--primary400);
    --blockquote-color: var(--primary500);
    --blockquote-border-radius: 8px;
    --blockquote-background: null;
    
    --blockquote-link-color: var(--secondary500);
    --blockquote-link-decoration: underline;
    --blockquote-link-hover-color: var(--secondary700);
    --blockquote-link-hover-decoration: none;
    
    --pre-bg-color: var(--primary50);
    --pre-text-color: var(--gray800);
    --pre-padding: 10px 15px 10px 25px;
    --pre-margin: 20px 0;
    --pre-border-top: var(--primary150);
    --pre-border-right: var(--primary150);
    --pre-border-bottom: var(--primary150);
    --pre-border-left: var(--primary150);
    --pre-line-height: 1.5;
    --pre-border-radius: 3px;
    --pre-font-size: .9rem;

    --code-background: var(--primary50);
    --code-padding: 0 5px;
    --code-border-radius: 3px;
    --code-font-size: .9em;
    --code-color: inherit;
}

blockquote {
    margin       : var(--blockquote-margin);
    padding      : var(--blockquote-padding);
    border-left  : var(--blockquote-border-left);
    color        : var(--blockquote-color);
    border-radius: var(--blockquote-border-radius);
    background   : var(--blockquote-background);
}

pre {
    padding      : var(--pre-padding);
    margin       : var(--pre-margin);
    background   : var(--pre-bg-color);
    color        : var(--pre-text-color);
    border-top   : var(--pre-border-top);
    border-right : var(--pre-border-right);
    border-bottom: var(--pre-border-bottom);
    border-left  : var(--pre-border-left);
    line-height  : var(--pre-line-height);
    border-radius: var(--pre-border-radius);
    font-size    : var(--pre-font-size);
    font-family  : var(--font-family-monospace);
    white-space  : pre-wrap;
    -moz-tab-size: 4;
    tab-size     : 4;
}

code {
    font-family  : var(--font-family-monospace);
    background   : var(--code-background);
    padding      : var(--code-padding);
    border-radius: var(--code-border-radius);
    font-size    : var(--code-font-size);
    color        : var(--code-color);
    white-space  : nowrap;
    display      : inline-block;
}

var {
    font-family     : var(--font-family-monospace);
    font-style      : normal;
    padding         : 5px;
    background-color: var(--var-background-color, #f4efdf);
    color           : var(--var-text-color, #333);
    font-size       : var(--var-font-size, .9rem);
    border-radius   : var(--var-border-radius, 3px);
}

kbd {
    font-family     : var(--font-family-monospace);
    font-style      : normal;
    padding         : 5px;
    background-color: var(--kbd-background-color, #f4efdf);
    color           : var(--kbd-text-color, #f4efdf);
    font-size       : var(--kbd-font-size, .9rem);
    border-radius   : var(--kbd-border-radius, 3px);
}

samp {
    font-family     : var(--font-family-monospace);
    font-style      : normal;
    padding         : 5px;
    background-color: var(--samp-background-color, #d0ecb9);
    color           : var(--samp-text-color, #333);
    font-size       : var(--samp-font-size, .9rem);
    border-radius   : var(--samp-border-radius, 3px);
}

mark {
    padding         : var(--mark-padding, 0 4px);
    background-color: var(--mark-background-color, #F7F2C6);
    border-radius   : var(--mark-border-radius, 3px);
    font-size       : var(--mark-font-size, .95em);
}
details
details summary::before {
    content     : var(--summary-marker, "❯");
    color       : var(--summary-marker-color);
    margin-right: var(--summary-marker-margin-r, .6em);
    transition  : transform var(--summary-marker-time, 0.2s);
    display     : inline-block;
}

details[open] summary:before {
    transform: rotate(var(--summary-marker-rotate, 90deg));
}
images
img.circle {
    border-radius: 50%;
}

img.thumbnail {
    border : var(--thumbnail-border, #DDDDDD 1px solid);
    padding: var(--thumbnail-padding, 4px);
}

img.left {
    float : left;
    margin: var(--img-left-margin, 5px 20px 5px 0);
}

img.right {
    float : right;
    margin: var(--img-right-margin, 5px 0 5px 20px);
}

img.center {
    margin : 0 auto;
    display: block;
}
lines
hr {
    display   : block;
    padding   : 0;
    border    : none;
    border-top: var(--hr-border, 1px solid #AAAAAA);
    margin    : var(--hr-margin, 20px 0);
}

hr.dashed {
    border-top-style: dashed;
}

hr.dotted {
    border-top-style: dotted;
}

hr.double {
    border-top-style: double;
}
print
@media print {
    body {
        color     : #000;
        background: white;
    }

    ul,
    img {
        page-break-inside: avoid;
    }

    .hide-print {
        display: none !important;
    }

    .flex {
        display: block !important;
    }

    .flex>div {
        width  : 100% !important;
        padding: 0 !important;
    }
}
root
:root {
    --font-family-monospace: Consolas, "PT Mono", "Roboto Mono", "Liberation Mono", "Segoe UI Mono", "Courier New", monospace,
}
table
table {
    width: 100%;
    border-collapse: collapse;

    tr {
        border-bottom: var(--table-tr-border-bottom, #d7dfe1 1px solid);
    }

    thead tr {
        background   : var(--table-th-background, #eff2f3);
        border-bottom: var(--table-th-border-bottom, #ced8da 1px solid);
        border-top   : var(--table-th-border-top, #c8d3d6 1px solid);
    }

    th {
        text-align: left;
        padding   : var(--table-th-padding, .6rem .5rem);
    }

    td {
        vertical-align: top;
        padding       : var(--table-td-padding, .5rem);
    }

    &.table-striped tbody {
        tr:nth-of-type(odd) {
            background: var(--table-striped-odd-bg, #ffffff);
        }

        tr:nth-of-type(even) {
            background: var(--table-striped-even-bg, #f1f5f5);
        }
    }

    &.table-border-none tr {
        border: none;
    }

    &.table-border {
        td:not(:last-child) {
            border-right: var(--table-td-border-right, #d7dfe1 1px solid);
        }

        th:not(:last-child) {
            border-right: var(--table-th-border-right, #ced8da 1px solid);
        }
    }

    &.table-hover tbody {
        tr:hover {
            background: var(--table-tr-hover-bg, #d6e2e2);
        }
    }
}