Dividers
Thin line separating content groups within a single surface. Material parity (`/components/dividers`). Covers full-width, inset, middle (with text), and sub-header dividers. Defines when to use vs whitespace alone.
Spec — Dividers
Facet *isual*of Koder Design. Material parity: https://m3.material.io/components/dividers.
When to use a divider vs whitespace
| Need | Use |
|---|---|
| Visually group ungrouped rows | Divider |
| Already grouped by indent / card / surface | Whitespace only |
| Separate sections with title | Subheader divider |
| Inline content split (mid-paragraph) | Inline divider with text |
| Compact list with many rows | Divider (otherwise hard to scan) |
| Spacious layout, few items | Whitespace |
Rule: divider answers "where does one group end and the next begin". If whitespace already makes that clear, skip the divider.
4 variants
| Variant | Width | Padding | Use |
|---|---|---|---|
| *ull-bleed* | 100% of container | 0 | Separates major sections at surface edge |
| *nset* | Indented from left | 16 px (matches list inset) | List rows with leading icon/avatar |
| *iddle (with content)* | Two segments around centered text/icon | n/a | Section heading inline |
| *ubheader* | Full-bleed + label above | 0 | Labeled section break |
Anatomy
Full-bleed:
────────────────────────────────────────
Inset:
───────────────────────────────────── (← 16 px left padding)
Middle with text:
────────────── OR ──────────────────
Subheader:
Section title
────────────────────────────────────- *ine thickness* 1 px (logical pixel)
- *olor*
outline-variant(low-emphasis surface line) - *ubheader label*
label-large(14/20, weight 500),text-muted - *nline text*
label-medium, 8-12 px padding around text
R1 — Color and emphasis
| Emphasis | Color | Use |
|---|---|---|
| Low (default) | outline-variant |
Most dividers |
| High | outline |
Rare — only when divider is the primary visual structure |
| Decorative | primary 12% |
Highlight a section break (e.g., onboarding) |
Never use full saturation (primary solid) — divider should be subtle background, not foreground.
R2 — Orientation
| Orientation | Use |
|---|---|
| *orizontal*(default) | Between rows / sections in a vertical layout |
| *ertical* | Between items in a horizontal layout (toolbar, segmented controls) |
Vertical divider:
- Height: 24 px (matches surrounding control height OR set explicitly)
- Width: 1 px
- Margin: 8 px horizontal
R3 — Inset rules
Inset divider's left edge aligns with the START of meaningful content in the row above. Common alignments:
| Inset distance | Aligns with |
|---|---|
| 16 px | First text character (list item with no leading element) |
| 56 px | After a 24 px icon + 16 px gap |
| 72 px | After a 40 px avatar + 16 px gap |
Goal: divider visually splits the content into discrete rows without crossing into the leading-element column. The leading column reads as "continuous" while the text column reads as "discrete rows".
R4 — Middle (with content) divider
Inline text divider for section breaks within text content:
────────────── OR ──────────────
────────── CONTINUED ──────────
───────── • • • ─────────- Text padded 8-12 px on either side
- Text is
label-medium,text-muted(subtle) - Line on each side, equal length
- Used for: onboarding step breaks, "Show more" pagination, modal
alternate-action separator ("OR sign in with…")
R5 — Subheader divider
Pairs a label-large heading with a full-bleed divider below:
System
────────────────────────────────────
Notifications ⌄
Privacy ⌄
Storage ⌄
Account
────────────────────────────────────
Profile ⌄
Sign out- Used for grouped list sections (Settings is the canonical example)
- Label sits at standard list left-padding (16 px); divider is
full-bleed below
- Label is
text-mutedweight 500 — secondary emphasis vs row labels
R6 — Spacing
Standard vertical spacing around a divider:
| Density | Above | Below |
|---|---|---|
| Compact | 4 px | 4 px |
| Default | 8 px | 8 px |
| Comfortable | 12 px | 12 px |
If dividers are between list rows of fixed height, NO extra spacing — divider sits at the row boundary. Spacing applies for free-form dividers (between cards, sections, etc.).
R7 — Accessibility
- Decorative divider:
role="separator"+aria-orientationifvertical (default horizontal); no extra label needed
- Subheader: heading semantics drive the divider's meaning — divider
itself remains
role="separator"; heading is a real<h2>/<h3>element - Middle-text divider: same — text inside is the meaning; divider is
decorative
- DO NOT add
aria-labelto a divider with descriptive text — it'svisual scaffolding, not content
R8 — Per-preset variation
| Preset | Color | Thickness |
|---|---|---|
material3 |
outline-variant (1 px low-emphasis) |
1 px |
material2 |
12% on-surface alpha (sharper) | 1 px |
ios_cupertino |
Hairline .separator (0.5 px on retina) |
0.5 px |
gnome |
Subtle 1 px gray | 1 px |
windows_11 |
Mica-aware subtle 1 px | 1 px |
brutalist |
Solid black, thick | 2-3 px |
terminal_classic |
ASCII ──────────────── |
n/a |
R9 — Forbidden patterns
- ❌ Multiple consecutive dividers (no double / triple lines)
- ❌ Divider thicker than 2 px (becomes a border / rule)
- ❌ Saturated primary color as divider (visual noise)
- ❌ Divider where whitespace alone would do (over-decoration)
- ❌ Divider between EVERY card in a card list (cards are already
self-grouped)
- ❌ Divider crossing into the leading-element column (icon /
avatar) of inset list rows
- ❌ Vertical divider taller than its surrounding controls (looks
detached)
- ❌ Decorative divider with
aria-label(clutters screen readeroutput)
Cross-link
themes/color-roles.kmd—outline-variant/outlinetokenthemes/typography.kmd—label-largefor subheader labelcomponents/lists.kmd— most common host contextfoundations/elements.kmd— Container family (divider is a sub-classof structural element)