A minimalistic, low-level CSS framework
A low-level, lightweight and modern CSS system, authoring tool built on Sass. Give your project a solid foundation.
@forward 'header';
@forward 'footer';
@use 'sprucecss/scss/spruce' as *;
.site-footer {
background-color: color('background', 'footer');
padding-block: spacer-clamp('xl', 'xxl');
&__top {
@include layout-grid('l', 14rem);
}
&__logo {
--dimension: 4rem;
block-size: var(--dimension);
display: inline-flex;
inline-size: var(--dimension);
}
&__title {
font-size: font-size('h4');
margin-block: 0 spacer('m');
}
&__navigation {
@include clear-list;
@include layout-stack('xs');
a {
color: color(text);
text-decoration: none;
&:hover,
&:focus,
&:active,
&[aria-current='page'] {
color: color('primary');
}
&[aria-current='page'] {
font-weight: 700;
}
}
}
&__bottom {
padding-block-start: spacer('l');
@include breakpoint('md') {
align-items: center;
display: flex;
gap: spacer('s');
justify-content: space-between;
}
}
&__copyright {
margin-block: 0;
}
}
@use 'sprucecss/scss/spruce' as *;
.site-header {
position: relative;
&__inner {
--block-size: 6rem;
align-items: center;
block-size: var(--block-size);
display: flex;
flex-wrap: wrap;
gap: spacer-clamp('s', 'l');
justify-content: space-between;
}
&__column {
align-items: center;
display: flex;
flex-grow: 1;
gap: spacer-clamp('s', 'l');
}
&__actions {
align-items: center;
display: flex;
gap: spacer-clamp('s', 'm');
}
&__logo {
--dimension: 4rem;
block-size: var(--dimension);
display: inline-flex;
inline-size: var(--dimension);
}
&__email {
display: none;
text-decoration: none;
@include breakpoint('sm') {
display: inline-block;
}
}
&__navigation {
margin-inline-start: auto;
@include breakpoint('md') {
margin-inline-start: 0;
}
ul {
border-block-start: 1px solid color('border');
@include breakpoint('sm') {
border-block: none;
}
}
}
}
@use 'dark-colors' as dark;
@use 'sprucecss/scss/spruce' with (
$colors: (
'footer': (
'background': hsl(215deg 100% 98%),
)
),
$dark-colors: dark.$colors,
$typography: (
'font-family-base': #{'Open Sans', sans-serif},
'font-family-heading': #{'Manrope', sans-serif},
),
);
@use 'sass:color';
$color-black: hsl(206deg 100% 7%);
$color-danger: hsl(0deg 71% 51%);
$color-gray-dark: hsl(0deg 0% 100% / 8%);
$color-gray: hsl(0deg 0% 97%);
$color-primary: hsl(261deg 54% 70%);
$color-secondary: hsl(227deg 92% 55%);
$color-success: hsl(150deg 100% 33%);
$color-white: hsl(0deg 0% 95%);
$colors: (
'base': (
'background': $color-black,
'blockquote-border': $color-primary,
'border': $color-gray-dark,
'code-background': hsl(207deg 64% 18%),
'code-foreground': $color-white,
'heading': $color-white,
'link': $color-primary,
'link-hover': color.scale($color-primary, $lightness: 20%),
'mark-background': hsl(50 100% 80%),
'mark-foreground': $color-black,
'marker': $color-primary,
'primary': $color-primary,
'secondary': $color-secondary,
'text': $color-gray,
),
'btn': (
'primary-background': hsl(261 52% 59%),
'primary-background-hover': hsl(261 52% 65%),
'primary-foreground': $color-white,
'secondary-background': $color-secondary,
'secondary-background-hover': color.adjust($color-secondary, $lightness: 5%),
'secondary-foreground': $color-white,
),
'footer': (
'background': hsl(206deg 100% 5%),
),
'form': (
'background': color.scale($color-black, $lightness: 5%),
'background-disabled': $color-black,
'border': $color-gray-dark,
'border-disabled': $color-gray-dark,
'border-focus': $color-primary,
'check-background': $color-primary,
'check-focus-ring': $color-primary,
'check-foreground': $color-black,
'invalid': $color-danger,
'invalid-focus-ring': color.adjust($color-danger, $alpha: -0.75),
'label': $color-white,
'legend': $color-white,
'placeholder': hsl(0deg 0% 60%),
'range-thumb-background': $color-primary,
'range-thumb-focus-ring': $color-primary,
'range-track-background': $color-gray-dark,
'ring-focus': color.adjust($color-primary, $alpha: -0.75),
'select-foreground': hsl(0deg 0% 100%),
'text': $color-gray,
'valid': $color-success,
'valid-focus-ring': color.adjust($color-success, $alpha: -0.75),
),
'selection': (
'background': $color-primary,
'foreground': $color-white,
),
'scrollbar': (
'thumb-background': hsl(0deg 0% 100% / 15%),
'thumb-background-hover': hsl(0deg 0% 100% / 25%),
'track-background': hsl(0deg 0% 100% / 5%),
),
'table': (
'border': $color-gray-dark,
'caption': $color-gray,
'heading': $color-white,
'hover': hsl(0deg 0% 100% / 5%),
'text': $color-gray,
'stripe': hsl(0deg 0% 100% / 2.5%),
)
);
@use 'sprucecss/scss/spruce' as *;
@include generate-color-variables(
$dark-colors,
':root[data-theme-mode="dark"]'
);
[data-theme-mode='dark'] {
color-scheme: dark;
}
@use 'sprucecss/scss/spruce' as *;
@include font-face(
'Manrope',
'../../font/manrope-v13-latin_latin-ext-regular.woff2'
);
@include font-face(
'Manrope',
'../../font/manrope-v13-latin_latin-ext-300.woff2',
300
);
@include font-face(
'Manrope',
'../../font/manrope-v13-latin_latin-ext-600.woff2',
600
);
@include font-face(
'Manrope',
'../../font/manrope-v13-latin_latin-ext-700.woff2',
700
);
@include font-face(
'Manrope',
'../../font/manrope-v13-latin_latin-ext-800.woff2',
800
);
@include font-face(
'Open Sans',
'../../font/open-sans-v34-latin_latin-ext-regular.woff2'
);
@include font-face(
'Open Sans',
'../../font/open-sans-v34-latin_latin-ext-700.woff2',
700
);
@forward 'config';
@forward 'fonts';
@forward 'styles';
@forward 'dark-mode';
@use 'sprucecss/scss/spruce' as *;
@include generate-styles;
@forward 'config';
@forward 'component';



Good to Know
Spruce CSS in nutshell.
Spruce CSS is small and tries not to be in your way. It gives you a solid foundation and utilities, but the only included components are forms (which you can opt out of).
It is for you if you like to handle your CSS/SCSS in separate files and write your code. It uses just a few helper classes; most components are drop-ins.
By modern, we mean it uses new CSS stuff sometimes at the expense of backward compatibility. Fortunately, nowadays, the new CSS features are released in bulk across different vendors.
With modern CSS, you can solve more with less code. It is around 1400 lines and weights a little, and you can choose what things you want to use to make it even smaller.
Using modern CSS to handle a dark theme or support a different writing direction (RTL) is more manageable. If you use Spruce CSS the intended way, you will be okay with a new theme or RTL support.
Everything on this documentation page or under the components supports them with just a little code.
Sass can help a lot when writing a CSS framework or using one. You can use Spruce as a standalone CSS file, too, but to maximalize its potential, we suggest Sass. For a simple compile setup, check out our related blog post.