Layout helpers for digital and software products using the Carbon Design System
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
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
},
};Install with Tessl CLI
npx tessl i tessl/npm-carbon--layout