Complete SCSS API providing layout utilities, conversion functions, and generated variables that mirror the JavaScript functionality while leveraging SCSS-specific features for advanced styling scenarios.
The SCSS API is organized into several modules that can be imported individually or collectively.
// Import all layout functionality
@use '@carbon/layout';
// Import specific modules
@use '@carbon/layout/scss/convert';
@use '@carbon/layout/scss/spacing';
@use '@carbon/layout/scss/utilities';Module Organization:
index.scss - Main entry point forwarding all modulesscss/convert - Unit conversion functionsscss/spacing - Generated spacing variablesscss/utilities - Utility functions for advanced use casesscss/generated/* - Build-time generated variables and mapsCore conversion functions with type checking and error handling.
/// Default font size for conversions
/// @type Number
$base-font-size: 16px !default;
/// Convert px to rem units (recommended)
/// @param {Number} $px - Value with px unit
/// @return {Number} Value with rem unit
@function to-rem($px);
/// Convert px to rem units (deprecated)
/// @param {Number} $px - Value with px unit
/// @return {Number} Value with rem unit
/// @deprecated Use to-rem() instead
@function rem($px);
/// Convert px to em units
/// @param {Number} $px - Value with px unit
/// @return {Number} Value with em unit
@function em($px);Usage Examples:
@use '@carbon/layout/scss/convert' as convert;
.component {
// Recommended approach
height: convert.to-rem(64px); // 4rem
padding: convert.to-rem(16px); // 1rem
font-size: convert.em(14px); // 0.875em
// Legacy function (still works but deprecated)
margin: convert.rem(12px); // 0.75rem
// Custom base font size
$custom-base: 18px;
line-height: math.div(24px, $custom-base) * 1rem; // 1.333rem
}Advanced utility functions for working with maps and complex data structures.
/// Access nested map values with dot notation
/// @param {Map} $map - Source map
/// @param {Arglist} $keys - Key chain to traverse
/// @return {*} Value at key path
@function map-deep-get($map, $keys...);
/// Get map key by numeric index
/// @param {Map} $map - Source map
/// @param {Integer} $index - 1-based index
/// @return {String} Key at given index
@function key-by-index($map, $index);
/// Get the last item from a map
/// @param {Map} $map - Source map
/// @return {*} Last map value
@function last-map-item($map);Usage Examples:
@use '@carbon/layout/scss/utilities' as utils;
@use '@carbon/layout' as layout;
// Deep map access
$nested-config: (
spacing: (
small: (
mobile: 0.5rem,
desktop: 1rem
)
)
);
$mobile-spacing: utils.map-deep-get($nested-config, spacing, small, mobile); // 0.5rem
// Key by index
$first-spacing-key: utils.key-by-index(layout.$spacing, 1); // First spacing key
// Last map item
$largest-spacing: utils.last-map-item(layout.$spacing); // Last spacing valueBuild-time generated variables providing direct access to all spacing values.
// Individual spacing variables
$spacing-01: 0.125rem !default;
$spacing-02: 0.25rem !default;
$spacing-03: 0.5rem !default;
$spacing-04: 0.75rem !default;
$spacing-05: 1rem !default;
$spacing-06: 1.5rem !default;
$spacing-07: 2rem !default;
$spacing-08: 2.5rem !default;
$spacing-09: 3rem !default;
$spacing-10: 4rem !default;
$spacing-11: 5rem !default;
$spacing-12: 6rem !default;
$spacing-13: 10rem !default;
// Spacing map for programmatic access
$spacing: (
spacing-01: $spacing-01,
spacing-02: $spacing-02,
// ... all spacing values
) !default;Usage Examples:
@use '@carbon/layout' as layout;
.component {
padding: layout.$spacing-05; // 1rem
margin: layout.$spacing-07; // 2rem
gap: layout.$spacing-03; // 0.5rem
}
// Programmatic spacing
@each $key, $value in layout.$spacing {
.#{$key} {
margin: $value;
}
}
// Generate utility classes
@for $i from 1 through 13 {
$key: spacing-#{'%02d' % $i};
.p-#{$i} {
padding: map.get(layout.$spacing, $key);
}
}Container sizing variables for consistent component dimensions.
// Individual container variables
$container-01: 1.5rem !default;
$container-02: 2rem !default;
$container-03: 2.5rem !default;
$container-04: 3rem !default;
$container-05: 4rem !default;
// Container map
$container: (
container-01: $container-01,
container-02: $container-02,
container-03: $container-03,
container-04: $container-04,
container-05: $container-05,
) !default;Usage Examples:
@use '@carbon/layout' as layout;
.button {
height: layout.$container-02; // 2rem
&--small {
height: layout.$container-01; // 1.5rem
}
&--large {
height: layout.$container-04; // 3rem
}
}
// Generate container utility classes
@each $key, $value in layout.$container {
.h-#{str-slice($key, 11)} { // Remove 'container-' prefix
height: $value;
}
}Named size variables with semantic naming for component dimensions.
// Individual size variables
$size-xs: 1.5rem !default;
$size-sm: 2rem !default;
$size-md: 2.5rem !default;
$size-lg: 3rem !default;
$size-xl: 4rem !default;
$size-2xl: 5rem !default;
// Size map (if generated)
$sizes: (
xs: $size-xs,
sm: $size-sm,
md: $size-md,
lg: $size-lg,
xl: $size-xl,
2xl: $size-2xl,
) !default;Usage Examples:
@use '@carbon/layout' as layout;
.avatar {
width: layout.$size-sm; // 2rem
height: layout.$size-sm; // 2rem
&--large {
width: layout.$size-lg; // 3rem
height: layout.$size-lg; // 3rem
}
}
// Size-based component variants
$component-sizes: (xs, sm, md, lg, xl, 2xl);
@each $size in $component-sizes {
.component--#{$size} {
width: map.get(layout.$sizes, $size);
height: map.get(layout.$sizes, $size);
}
}Icon sizing variables for consistent iconography.
// Individual icon size variables
$icon-size-01: 1rem !default;
$icon-size-02: 1.25rem !default;
// Icon size map
$icon-size: (
icon-size-01: $icon-size-01,
icon-size-02: $icon-size-02,
) !default;Usage Examples:
@use '@carbon/layout' as layout;
.icon {
width: layout.$icon-size-01; // 1rem
height: layout.$icon-size-01; // 1rem
&--large {
width: layout.$icon-size-02; // 1.25rem
height: layout.$icon-size-02; // 1.25rem
}
}
// Icon button with consistent sizing
.icon-button {
width: layout.$container-02; // 2rem
height: layout.$container-02; // 2rem
.icon {
width: layout.$icon-size-01; // 1rem
height: layout.$icon-size-01; // 1rem
}
}Override default configuration to customize the system:
// Override base font size before importing
$base-font-size: 18px;
@use '@carbon/layout/scss/convert' as convert with (
$base-font-size: 18px
);
.component {
// Conversion now uses 18px as base instead of 16px
height: convert.to-rem(36px); // 2rem (36/18)
}Create custom mixins using layout utilities:
@use '@carbon/layout' as layout;
@use '@carbon/layout/scss/convert' as convert;
@mixin component-size($size) {
$height: map.get(layout.$container, container-#{$size});
height: $height;
padding: 0 calc($height * 0.5);
font-size: convert.to-rem(14px);
@if $size >= 3 {
font-size: convert.to-rem(16px);
}
}
.button {
@include component-size(2); // Uses container-02
&--large {
@include component-size(4); // Uses container-04
}
}Combining SCSS variables with responsive design:
@use '@carbon/layout' as layout;
.responsive-container {
padding: layout.$spacing-05; // 1rem
@media (min-width: 42rem) { // md breakpoint
padding: layout.$spacing-07; // 2rem
}
@media (min-width: 66rem) { // lg breakpoint
padding: layout.$spacing-10; // 4rem
}
}
// Fluid spacing in SCSS
.hero {
padding: 5vw layout.$spacing-06; // Mix fluid and fixed
min-height: layout.$size-2xl; // 5rem
}SCSS functions include built-in error handling:
@use '@carbon/layout/scss/convert' as convert;
.component {
// These will cause compilation errors:
// height: convert.to-rem(64); // Error: Expected px unit
// width: convert.to-rem("64px"); // Error: Expected number
// Correct usage:
height: convert.to-rem(64px); // ✓ 4rem
width: convert.to-rem(32px); // ✓ 2rem
}The SCSS build process generates variables from JavaScript values:
// Generated during npm run build
// These files are created automatically:
// scss/generated/_spacing.scss
// scss/generated/_container.scss
// scss/generated/_icon-size.scss
// scss/generated/_size.scss
// scss/generated/_layout.scss (deprecated)
@use '@carbon/layout' as layout;
// All generated variables are available
.component {
padding: layout.$spacing-05;
height: layout.$container-02;
.icon {
width: layout.$icon-size-01;
height: layout.$icon-size-01;
}
}// SCSS for static base styles
@use '@carbon/layout' as layout;
.component {
height: layout.$container-02;
padding: layout.$spacing-05;
}// JavaScript for dynamic behavior
import { breakpointUp, spacing07 } from '@carbon/layout';
const dynamicStyles = {
[breakpointUp('lg')]: {
padding: spacing07, // Dynamic based on breakpoint
},
};