---
id: slds.guidance.development
title: SLDS Development Guide
description: Root-level guidance for generating or optimizing SLDS-compliant code
summary: "Comprehensive development guide covering the component selection hierarchy (LBC → Blueprints → Hooks → Custom), framework-specific patterns, styling hooks usage, linter resolution, naming conventions, and code generation best practices."
artifact_type: guide
domain: development
topic: development
content_format: structured
complexity: intermediate
audience: [implementer]
tasks: [learn, implement, choose]
refs:
- slds.guidance.hooks.typography
- slds.guidance.hooks.spacing
- slds.guidance.uplift
- slds.guidance.hooks
- slds.guidance.hooks.color
- slds.guidance.blueprints
- slds.guidance.utilities
- slds.guidance.icons
- slds.guidance.design
tags: [development, lwc, slds, theming, styling-hooks]
keywords: [component hierarchy, Lightning Base Components, SLDS Blueprints, styling hooks, utility classes, code generation, linter, naming conventions]
---
# SLDS Development Guide
Root-level guidance for AI coding agents generating or optimizing SLDS-compliant code.
---
## What is SLDS?
The **Salesforce Lightning Design System** provides:
| Resource | Description |
|----------|-------------|
| **Lightning Base Components** | Pre-built LWC components with accessibility and theming built-in |
| **SLDS Blueprints** | CSS/HTML patterns for any framework (React, Vue, Angular, vanilla JS) |
| **Styling Hooks** | CSS custom properties (`--slds-g-*`) for theming |
| **Utility Classes** | Rapid styling classes for spacing, layout, visibility |
| **Icons** | SVG icons across action, utility, standard, custom, and doctype categories |
> **Version Note:** This guide targets **SLDS v2**. Legacy `--lwc-*` tokens and `slds-*--modifier` class syntax are deprecated.
---
## Component Selection Hierarchy
**Always follow this order when building UI:**
```
┌─────────────────────────────────────────────────────────────┐
│ 1. Lightning Base Components (LWC only) │
├─────────────────────────────────────────────────────────────┤
│ 2. SLDS Blueprints (any framework) │
├─────────────────────────────────────────────────────────────┤
│ 3. Custom with Styling Hooks │
├─────────────────────────────────────────────────────────────┤
│ 4. Custom CSS (last resort, still use hooks for values) │
└─────────────────────────────────────────────────────────────┘
```
### Level 1: Lightning Base Components (LWC Only)
Pre-built, accessible, themed components. **Always check first for LWC projects.**
| Component | Use Case |
|-----------|----------|
| `lightning-button` | All button actions |
| `lightning-input` | Text, email, number, date inputs |
| `lightning-combobox` | Dropdown selection |
| `lightning-datatable` | Tabular data with sorting/selection |
| `lightning-card` | Content containers |
| `lightning-modal` | Dialog overlays |
### Level 2: SLDS Blueprints
HTML/CSS patterns for non-LWC frameworks or when no Lightning Base Component exists.
### Level 3: Styling Hooks
CSS custom properties for theming. Use when customizing appearance.
```css
.my-card {
background: var(--slds-g-color-surface-1);
padding: var(--slds-g-spacing-4);
border-radius: var(--slds-g-radius-border-2);
}
```
### Level 4: Custom CSS
**Only when no hook exists for the property.** See [When Hooks Don't Exist](#when-hooks-dont-exist).
---
## Framework-Specific Patterns
### LWC Layout
```html
Content
```
### Non-LWC Layout (React, Vue, Angular)
```html
```
---
## Common Patterns Quick Reference
| Pattern | LWC Component | Blueprint |
|---------|---------------|-----------|
| Forms | `lightning-input`, `lightning-combobox` | Input, Combobox |
| Data Tables | `lightning-datatable` | Data Tables |
| Modals | `lightning-modal` | Modals |
| Cards | `lightning-card` | Cards |
**Form validation pattern (LWC):**
```javascript
handleSubmit() {
const allValid = [...this.template.querySelectorAll('lightning-input')]
.reduce((valid, input) => input.reportValidity() && valid, true);
if (allValid) { /* submit */ }
}
```
**Modal pattern (LWC):**
```javascript
import LightningModal from 'lightning/modal';
export default class MyModal extends LightningModal {
handleClose() { this.close('result'); }
}
```
---
## Core Rules
### Do
- Follow hierarchy: LBC → Blueprints → Styling Hooks → Custom CSS
- Use `var(--slds-g-*)` with fallbacks for all themeable values
- Create custom classes (e.g., `my-*`) instead of overriding `.slds-*`
- Verify components/hooks exist before implementing
### Don't
- Hard-code colors, spacing, or typography
- Override `.slds-*` classes directly
- Use deprecated `--lwc-*` tokens as primary values
- Use color alone to convey meaning
---
## When Hooks Don't Exist
Not all CSS properties have styling hooks. Use this decision tree:
```
Does a styling hook exist for this property?
├─ YES → Use the hook with fallback: var(--slds-g-*, fallback)
├─ NO → Is there a utility class?
│ ├─ YES → Use the utility class
│ └─ NO → Use minimal custom CSS with:
│ 1. Custom class (my-*, c-*)
│ 2. Document why no hook/utility exists
│ 3. Use hooks for related values (e.g., colors in gradients)
```
**Properties without hooks (examples):**
- `transform`, `transition` (use `--slds-g-timing-*` for duration only)
- `z-index` (use SLDS utility classes when possible)
- `cursor`
- `overflow`
- Complex gradients (use hook colors within gradient syntax)
**Example - gradient with hook colors:**
```css
.my-gradient-bg {
/* No gradient hook exists, but use hook colors */
background: linear-gradient(
to bottom,
var(--slds-g-color-surface-1),
var(--slds-g-color-surface-2)
);
}
```
---
## Naming Conventions
### Custom Class Names
Use a consistent prefix to avoid collision with SLDS:
| Pattern | Use Case | Example |
|---------|----------|---------|
| `my-*` | General custom styling | `my-card-header` |
| `c-*` | LWC component-specific | `c-accountList-row` |
| `[namespace]-*` | Package/app namespace | `acme-dashboard-widget` |
**Avoid:**
- Generic names: `container`, `wrapper`, `header`
- SLDS-like names: `custom-slds-button`
- BEM on SLDS classes: `slds-card__custom-header`
### Custom Hook Names (for app-level theming)
```css
:root {
/* Namespace your custom hooks */
--my-app-primary: var(--slds-g-color-brand-1);
--my-app-card-padding: var(--slds-g-spacing-4);
}
```
---
## Code Generation Style
When generating SLDS code, follow these patterns:
### Minimal HTML + Classes
```html
Title
```
### Avoid Unnecessary JavaScript
Use CSS/HTML solutions when possible:
- `slds-hide` instead of `{if}` for simple visibility
- `slds-is-selected` class toggling instead of complex state
### Component Structure (LWC)
```html
```
```css
/* Component CSS only for truly custom styles */
.my-custom-element {
/* Use hooks */
background: var(--slds-g-color-surface-2);
}
```
---
## Resources
| Resource | URL |
|----------|-----|
| SLDS Linter | https://developer.salesforce.com/docs/platform/slds-linter/guide |
| Lightning Components | https://developer.salesforce.com/docs/component-library/overview/components |
| SLDS Website | https://www.lightningdesignsystem.com/ |
| Styling Hooks Index | https://www.lightningdesignsystem.com/2e1ef8501/p/591960-global-styling-hooks |