Font Awesome provides comprehensive SCSS source files for customization, theming, and build-time optimization. The SCSS files offer variables, mixins, and modular imports for fine-grained control over Font Awesome's appearance and functionality.
// Complete Font Awesome
@import '~@fortawesome/fontawesome-free/scss/fontawesome';
@import '~@fortawesome/fontawesome-free/scss/solid';
@import '~@fortawesome/fontawesome-free/scss/regular';
@import '~@fortawesome/fontawesome-free/scss/brands';scss/fontawesome.scss: Core Font Awesome frameworkscss/solid.scss: Solid icon style definitionsscss/regular.scss: Regular icon style definitionsscss/brands.scss: Brand icon style definitionsscss/_variables.scss: SCSS variables and icon definitions (152KB)scss/_mixins.scss: SCSS mixins and utility functionsscss/_functions.scss: SCSS utility functionsscss/_core.scss: Core Font Awesome stylingscss/_icons.scss: Icon-specific SCSS rules// Font paths and display
$fa-font-path: '../webfonts' !default;
$fa-font-display: block !default;
// CSS class configuration
$fa-css-prefix: 'fa' !default;
$fa-version: '7.0.1' !default;
$fa-border-color: #eee !default;
$fa-inverse: #fff !default;
$fa-li-width: 2em !default;Customization example:
// Custom font path
$fa-font-path: '/assets/fonts';
// Custom CSS prefix
$fa-css-prefix: 'icon';
// Custom border color
$fa-border-color: #ccc;
@import '~@fortawesome/fontawesome-free/scss/fontawesome';// Animation durations
$fa-animation-duration: 1s !default;
$fa-spin-animation-duration: 2s !default;
// Animation timing functions
$fa-animation-timing: linear !default;// Base sizing
$fa-size-scale-base: 1em !default;
// Named sizes
$fa-2xs: 0.625em !default;
$fa-xs: 0.75em !default;
$fa-sm: 0.875em !default;
$fa-lg: 1.25em !default;
$fa-xl: 1.5em !default;
$fa-2xl: 2em !default;@mixin fa-icon($icon: null, $style: solid) {
// Apply Font Awesome icon styles
}Usage:
.custom-icon {
@include fa-icon('user', solid);
}@mixin fa-size($size) {
font-size: $size;
}Usage:
.large-icon {
@include fa-size(2em);
}@mixin fa-content($icon-unicode) {
content: $icon-unicode;
}Usage:
.my-icon::before {
@include fa-content('\f007'); // user icon unicode
font-family: 'Font Awesome 7 Free';
font-weight: 900;
}Font Awesome provides SCSS variables for all icon Unicode values:
// Solid icons
$fa-var-user: \f007;
$fa-var-home: \f015;
$fa-var-heart: \f004;
$fa-var-search: \f002;
$fa-var-envelope: \f0e0;
$fa-var-phone: \f095;
$fa-var-calendar: \f133;
$fa-var-download: \f019;
// Regular icons (far-)
$fa-var-user: \f007; // Regular user
$fa-var-heart: \f004; // Regular heart
$fa-var-file: \f15b; // Regular file
$fa-var-folder: \f07b; // Regular folder
// Brand icons (fab-)
$fa-var-github: \f09b;
$fa-var-twitter: \f099;
$fa-var-facebook: \f09a;
$fa-var-linkedin: \f08c;Usage:
.github-icon::before {
content: $fa-var-github;
font-family: 'Font Awesome 7 Brands';
font-weight: 400;
}@mixin fa-spin($duration: $fa-spin-animation-duration) {
animation: fa-spin $duration infinite linear;
}
@mixin fa-pulse($duration: $fa-animation-duration) {
animation: fa-pulse $duration infinite;
}Usage:
.spinning-loader {
@include fa-spin(1s);
}
.pulsing-heart {
@include fa-pulse(0.5s);
}@mixin fa-rotate($degrees) {
transform: rotate(#{$degrees}deg);
}
@mixin fa-flip($axis: horizontal) {
@if $axis == horizontal {
transform: scaleX(-1);
} @else if $axis == vertical {
transform: scaleY(-1);
} @else if $axis == both {
transform: scale(-1);
}
}Usage:
.rotated-icon {
@include fa-rotate(45);
}
.flipped-icon {
@include fa-flip(horizontal);
}// Override default colors
$fa-primary-color: #007bff !default;
$fa-secondary-color: #6c757d !default;
$fa-success-color: #28a745 !default;
$fa-danger-color: #dc3545 !default;
$fa-warning-color: #ffc107 !default;
$fa-info-color: #17a2b8 !default;Custom theme example:
// Dark theme variables
$fa-primary-color: #0d6efd;
$fa-border-color: #333;
$fa-inverse: #000;
// Custom icon colors
.fa-primary { color: $fa-primary-color; }
.fa-success { color: $fa-success-color; }
.fa-danger { color: $fa-danger-color; }
@import '~@fortawesome/fontawesome-free/scss/fontawesome';// Custom size scale
$fa-size-scale-base: 1.2em;
// Custom named sizes
$fa-xs: 0.8em;
$fa-sm: 1em;
$fa-lg: 1.5em;
$fa-xl: 2em;
$fa-2xl: 2.5em;
// Generate custom size classes
@each $size, $value in (
'tiny': 0.5em,
'huge': 4em,
'massive': 6em
) {
.fa-#{$size} {
font-size: $value;
}
}// Import only core framework (no icons)
@import '~@fortawesome/fontawesome-free/scss/fontawesome';// Import core + solid icons only
@import '~@fortawesome/fontawesome-free/scss/fontawesome';
@import '~@fortawesome/fontawesome-free/scss/solid';// Import core framework
@import '~@fortawesome/fontawesome-free/scss/_variables';
@import '~@fortawesome/fontawesome-free/scss/_mixins';
@import '~@fortawesome/fontawesome-free/scss/_core';
// Define only needed icons
.fa-user::before { content: $fa-var-user; }
.fa-home::before { content: $fa-var-home; }
.fa-heart::before { content: $fa-var-heart; }@function fa-content($icon-name) {
@return map-get($fa-icons, $icon-name);
}Usage:
.custom-icon::before {
content: fa-content('user');
font-family: 'Font Awesome 7 Free';
}@function strip-unit($number) {
@if type-of($number) == 'number' and not unitless($number) {
@return $number / ($number * 0 + 1);
}
@return $number;
}
@function fa-divide($dividend, $divisor) {
@return $dividend / $divisor;
}// Only import needed partials
@import '~@fortawesome/fontawesome-free/scss/_variables';
@import '~@fortawesome/fontawesome-free/scss/_mixins';
@import '~@fortawesome/fontawesome-free/scss/_core';
// Custom icon definitions (smaller subset)
.fa-user::before { content: $fa-var-user; }
.fa-home::before { content: $fa-var-home; }
// ... only icons you need// Custom font-face definitions
@font-face {
font-family: 'My Custom FA';
src: url('custom-subset.woff2') format('woff2');
font-weight: 900;
font-display: swap; // Better performance
}
// Override font family
$fa-font-family: 'My Custom FA';// Generate CSS custom properties
:root {
--fa-primary: #{$fa-primary-color};
--fa-border: #{$fa-border-color};
--fa-inverse: #{$fa-inverse};
}
// Use in styles
.fa-primary { color: var(--fa-primary); }
.fa-border { border-color: var(--fa-border); }// Responsive sizing mixins
@mixin fa-responsive-size($base-size: 1em) {
font-size: $base-size;
@media (min-width: 768px) {
font-size: $base-size * 1.2;
}
@media (min-width: 1024px) {
font-size: $base-size * 1.5;
}
}
// Usage
.responsive-icon {
@include fa-responsive-size(1em);
}// Custom bounce animation
@keyframes fa-bounce {
0%, 20%, 53%, 80%, 100% {
animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transform: translate3d(0,0,0);
}
40%, 43% {
animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transform: translate3d(0, -8px, 0);
}
70% {
animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transform: translate3d(0, -4px, 0);
}
90% {
transform: translate3d(0,-1px,0);
}
}
.fa-bounce {
animation: fa-bounce 1s;
}