FairGarden Design

Section Divider

The seam between two bands, or a pause inside one: the straight cut, the seam rules, and the page's one shaped edge, the hill or the hatched fringe.

import { SectionDivider } from '@fairgarden-private/design/components/SectionDivider'

Render a band seam (seam, page-seam, hill, fringe) as the first child of the lower band's <Ground kind="band">, whose block padding is --ds-space-section. The divider takes that band's colors and sits on its top edge. chrome and pause sit in the flow where you place them. The default, straight, renders nothing: the change of ground is the cut.

Seams and pauses

Seams and pauses

Two different page grounds meet across the page-seam hairline, in the lower band's hairline color, in light and dark mode alike. Leave it out when the lower band opens with an eyebrow rule. Two bands on the same ground take the seam rule. A pause breaks one long band once, with a dotted run, or with the rule–dot–rule or dot-and-star ornament in the accent color. It never sits at a boundary.

Paper

A long run of reading ends here.

The pause breaks it once, then the text resumes.

Paper again: the seam rule

Tide: the page-seam hairline

White: the terminal band

SectionDividerSeams.tsx
import { Ground } from '@fairgarden-private/design/components/Ground'
import { SectionDivider } from '@fairgarden-private/design/components/SectionDivider'
import styles from './seams.module.css'

/**
 * paper → paper → tide → white. Each band pads its block edges with
 * --ds-space-section, and each seam divider is the lower band's first child.
 */
export function SectionDividerSeams() {
  return (
    <div className={styles.page}>
      <Ground kind="band" preset="paper" className={styles.band}>
        <div className={styles.container}>
          <p className={styles.head}>Paper</p>
          <p className={styles.text}>A long run of reading ends here.</p>
          <SectionDivider kind="pause" className={styles.pause} />
          <p className={styles.text}>The pause breaks it once, then the text resumes.</p>
        </div>
      </Ground>
      <Ground kind="band" preset="paper" className={styles.band}>
        <SectionDivider kind="seam" />
        <div className={styles.container}>
          <p className={styles.head}>Paper again: the seam rule</p>
        </div>
      </Ground>
      <Ground kind="band" preset="tide" className={styles.band}>
        <SectionDivider kind="page-seam" />
        <div className={styles.container}>
          <p className={styles.head}>Tide: the page-seam hairline</p>
          <SectionDivider kind="pause" ornament="dot" className={styles.pause} />
        </div>
      </Ground>
      <Ground kind="band" preset="white" className={styles.band}>
        <SectionDivider kind="page-seam" />
        <div className={styles.container}>
          <p className={styles.head}>White: the terminal band</p>
          <SectionDivider kind="pause" ornament="star" className={styles.pause} />
        </div>
      </Ground>
    </div>
  )
}

The hill

The hill

The hill sits only on the night media hero's lower seam, where tone separates the two grounds. The page ground below rises into the night band as one asymmetric curve, cresting at two thirds of the width. It stands 4.6% of the width high, clamped between 12 and 64 px, and no rule runs under it. The height joins the lower band's top padding. On a dark page, in print and in forced colors it drops for the straight seam. Use it for editorial and reference pages, once per page.

Night: the media hero

At least --size-px-10 of empty ground above the hill.

Paper rises into it

The curve is 4.6% of the width, clamped 12–64 px.

SectionDividerHill.tsx
import { Ground } from '@fairgarden-private/design/components/Ground'
import { SectionDivider } from '@fairgarden-private/design/components/SectionDivider'
import styles from './hill.module.css'

/**
 * The night media hero, then the paper band with the hill as its first
 * child. Switch the page to dark mode: the curve drops for the night band's
 * straight --primary12 seam.
 */
export function SectionDividerHill() {
  return (
    <div className={styles.page}>
      <Ground kind="band" preset="night" className={styles.night}>
        <div className={styles.container}>
          <p className={styles.head}>Night: the media hero</p>
          <p className={styles.text}>At least --size-px-10 of empty ground above the hill.</p>
        </div>
      </Ground>
      <Ground kind="band" preset="paper" className={styles.band}>
        <SectionDivider kind="hill" />
        <div className={styles.container}>
          <p className={styles.head}>Paper rises into it</p>
          <p className={styles.text}>The curve is 4.6% of the width, clamped 12–64 px.</p>
        </div>
      </Ground>
    </div>
  )
}

The hatched fringe

The hatched fringe

The fringe hangs short ticks from the night band's edge in light mode. It can sit on the footer's top edge, in the night band's ink, or under the media hero, in the page ground's ink. The ticks repeat at a fixed pitch and never stretch. Like the hill it drops on a dark page and in print, and the two share the page's one shaped edge.

Paper

The last page-ground band before the footer.

Night: the footer

Ticks hang from its top edge in light mode only.

SectionDividerFringe.tsx
import { Ground } from '@fairgarden-private/design/components/Ground'
import { SectionDivider } from '@fairgarden-private/design/components/SectionDivider'
import styles from './fringe.module.css'

/**
 * The fringe on the night footer's top edge, in the night band's ink. A page
 * carries one shaped edge; this demo shows the footer placement alone.
 */
export function SectionDividerFringe() {
  return (
    <div className={styles.page}>
      <Ground kind="band" preset="paper" className={styles.band}>
        <div className={styles.container}>
          <p className={styles.head}>Paper</p>
          <p className={styles.text}>The last page-ground band before the footer.</p>
        </div>
      </Ground>
      <Ground kind="band" preset="night" render={<footer />} className={styles.band}>
        <SectionDivider kind="fringe" />
        <div className={styles.container}>
          <p className={styles.head}>Night: the footer</p>
          <p className={styles.text}>Ticks hang from its top edge in light mode only.</p>
        </div>
      </Ground>
    </div>
  )
}

API Reference

The seam between two bands, or a pause inside one. Render a band seam (seam, page-seam, hill, fringe) as the first child of the lower band’s <Ground kind="band">, whose block padding is --ds-space-section (§11.1): the divider takes that band’s colors and sits on its top edge.

A shaped edge sits only where tone separates the seam: the night band against a page ground in light mode [D179]. On a dark page it drops for the night band’s straight --primary12 seam, and in print and forced colors for a straight rule. Use one shaped edge per page at most.

  • hill: first child of the page-ground band under the night media hero. The lower ground rises into the hero as one asymmetric curve, 4.6% of the width clamped 12–64 px, cresting at 0.667 of the width; no rule runs under it [D189]. The amplitude joins the band’s top padding.
  • fringe: first child of the night footer (ticks in the night band’s ink), or of the page-ground band under the night media hero (ticks in that band’s ink), hanging from the seam.
PropTypeDescription
heavy
boolean | undefined
kind
| 'straight'
| 'seam'
| 'page-seam'
| 'hill'
| 'fringe'
| 'chrome'
| 'pause'
| undefined

straight (default): the hard cut; no element renders, the ground change is the seam. seam: the same-ground --role-rule seam. page-seam: the hairline between two different page grounds, in the lower band’s --role-hairline, in both modes [D179]. hill: the Audubon hill on the night media hero’s lower seam, light mode only [D189]. fringe: the hatched fringe on the night band’s edge, light mode only [D172]. chrome: a header or footer chrome rule. pause: an ornamental pause inside one band.

ornament
SectionDividerOrnament | undefined
primary
| 'ruby'
| 'olive'
| 'sage'
| 'slate'
| 'sand'
| 'gray'
| 'mauve'
| 'brown'
| 'bronze'
| 'gold'
| 'red'
| 'crimson'
| 'tomato'
| 'pink'
| 'plum'
| 'indigo'
| 'iris'
| 'violet'
| 'purple'
| null
| undefined

Primary Radix scale: the rule, dots and ticks. Never defaulted; omitted, it inherits the lower band’s scope [D133].

secondary
| 'ruby'
| 'olive'
| 'sage'
| 'slate'
| 'sand'
| 'gray'
| 'mauve'
| 'brown'
| 'bronze'
| 'gold'
| 'red'
| 'crimson'
| 'tomato'
| 'pink'
| 'plum'
| 'indigo'
| 'iris'
| 'violet'
| 'purple'
| 'amber'
| 'blue'
| 'cyan'
| 'grass'
| 'green'
| 'jade'
| 'lime'
| 'mint'
| 'orange'
| 'sky'
| 'teal'
| 'yellow'
| null
| undefined

Secondary Radix scale: drives only the ornament-rule strokes (--role-accent). Never defaulted.

sectionDivider
SectionDividerKind

The seven §11.2 builds.

type SectionDividerKind = 'straight' | 'seam' | 'page-seam' | 'chrome' | 'pause' | 'hill' | 'fringe'<
  'straight' | 'seam' | 'page-seam' | 'chrome' | 'pause' | 'hill' | 'fringe' | null | undefined
>
SectionDividerOrnament

The pause ornament: line-dotted, ornament-rule-dot or ornament-rule-star (§4.8.2).

type SectionDividerOrnament = 'straight' | 'seam' | 'page-seam' | 'chrome' | 'pause' | 'hill' | 'fringe'<'dotted' | 'dot' | 'star' | null | undefined>
SectionDividerProps

Props for SectionDivider: div props, the kind with its options, and the color axes.

type SectionDividerProps = (
  | {
      kind?: 'straight' | 'seam' | 'page-seam' | 'hill' | 'fringe';
      heavy?: undefined;
      ornament?: undefined;
    }
  | { kind: 'chrome'; heavy?: boolean; ornament?: undefined }
  | { kind: 'pause'; heavy?: undefined; ornament?: SectionDividerOrnament }
) & {
  /**
   * Primary Radix scale: the rule, dots and ticks. Never defaulted;
   * omitted, it inherits the lower band's scope [D133].
   */
  primary?:
    | 'ruby'
    | 'olive'
    | 'sage'
    | 'slate'
    | 'sand'
    | 'gray'
    | 'mauve'
    | 'brown'
    | 'bronze'
    | 'gold'
    | 'red'
    | 'crimson'
    | 'tomato'
    | 'pink'
    | 'plum'
    | 'indigo'
    | 'iris'
    | 'violet'
    | 'purple'
    | null;
  /**
   * Secondary Radix scale: drives only the ornament-rule strokes
   * (`--role-accent`). Never defaulted.
   */
  secondary?:
    | 'ruby'
    | 'olive'
    | 'sage'
    | 'slate'
    | 'sand'
    | 'gray'
    | 'mauve'
    | 'brown'
    | 'bronze'
    | 'gold'
    | 'red'
    | 'crimson'
    | 'tomato'
    | 'pink'
    | 'plum'
    | 'indigo'
    | 'iris'
    | 'violet'
    | 'purple'
    | 'amber'
    | 'blue'
    | 'cyan'
    | 'grass'
    | 'green'
    | 'jade'
    | 'lime'
    | 'mint'
    | 'orange'
    | 'sky'
    | 'teal'
    | 'yellow'
    | null;
}

Specification: DESIGN-SYSTEM.md §11.2 (section divider and shaped edge), §4.9 (edge geometry) and D179, D189 (seams, the hill).