# Board

Columns of cards, side by side on a wide screen in a frame that scrolls sideways, and stacked on a phone.

Block: `smbk-board`. Status: experimental. Figma: the Figma file, https://www.figma.com/community/file/1688324308358870630. Desktop and mobile: differ by presentation only.

## Options

| Axis | Values | Default | Meaning |
|---|---|---|---|

Parts: `smbk-board__columns`, `smbk-board__scroll-hint`

## Markup

```html
<div class="smbk-board" data-scrollbar="">
  <div class="smbk-board__columns">
    <section class="smbk-board-column" aria-labelledby="board-1-title" data-scrollbar="">
      <div class="smbk-board-column__head">
        <div class="smbk-board-column__heading">
          <h3 class="smbk-board-column__title" id="board-1-title">Website, preview</h3>
          <div class="smbk-board-column__meter">
            <div
              aria-label="Agents on the website"
              class="smbk-capacity-meter"
              role="meter"
              aria-valuemin="0"
              aria-valuemax="2"
              aria-valuenow="1"
              aria-valuetext="1 of 2 places"
            >
              <span class="smbk-capacity-meter__segments" aria-hidden="true">
                <span class="smbk-capacity-meter__segment smbk-capacity-meter__segment--filled"></span>
                <span class="smbk-capacity-meter__segment"></span>
              </span>
              <span class="smbk-capacity-meter__words" aria-hidden="true">1 of 2 places</span>
            </div>
          </div>
        </div>
        <div class="smbk-board-column__action">
          <button
            type="button"
            class="smbk-btn smbk-btn--tone-ghost smbk-btn--size-sm smbk-btn--icon-only"
            aria-label="Add an agent to the website"
          >
            <i
              class="ph ph-plus smbk-icon smbk-icon--size-md smbk-btn__icon"
              aria-hidden="true"
            ></i>
          </button>
        </div>
      </div>
      <div class="smbk-board-column__group">
        <div class="smbk-board-column__group-head">
          <span
            class="smbk-status-dot smbk-status-dot--tone-warning smbk-board-column__dot"
            aria-hidden="true"
          >
            <span class="smbk-status-dot__dot"></span>
          </span>
          <span class="smbk-board-column__group-label" id="board-2-label">Waiting on you</span>
          <span
            class="smbk-badge smbk-badge--look-soft smbk-badge--tone-info smbk-badge--size-sm smbk-board-column__count"
            id="board-2-count"
          >
            <span class="smbk-badge__label">2</span>
          </span>
        </div>
        <ul class="smbk-board-column__cards" aria-labelledby="board-2-label board-2-count">
          <li class="smbk-board-column__card">
            <article class="smbk-card smbk-card--surface-raised smbk-card--layout-compact">
              <div class="smbk-card__content">
                <header class="smbk-card__header smbk-card__header--type-title smbk-card__header--size-sm">
                  <div class="smbk-card__header-text">
                    <div class="smbk-card__title-row">
                      <h4 class="smbk-card__title"><a class="smbk-card__link" href="#token-export">Review the token export</a></h4>
                    </div>
                  </div>
                </header>
                <div class="smbk-card__body smbk-card__body--type-text">Check the new color ladder against the contrast pairs.</div>
                <footer class="smbk-card__footer smbk-card__footer--type-actions smbk-card__footer--rule-off">
                  <div class="smbk-card__footer-row">
                    <div class="smbk-card__footer-start">
                      <span class="smbk-badge smbk-badge--look-soft smbk-badge--tone-info smbk-badge--size-sm">
                        <span class="smbk-badge__label">Design</span>
                      </span>
                    </div>
                    <div class="smbk-card__footer-end">
                      <span class="smbk-avatar smbk-avatar--size-xs smbk-avatar--tone-inverse smbk-avatar--type-image">
                        <img
                          class="smbk-avatar__image"
                          src="data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22480%22%20height%3D%22270%22%3E%3Crect%20width%3D%22480%22%20height%3D%22270%22%20fill%3D%22%235c7798%22%2F%3E%3Ccircle%20cx%3D%22360%22%20cy%3D%2290%22%20r%3D%2260%22%20fill%3D%22%23cc0d0d%22%2F%3E%3C%2Fsvg%3E"
                          alt="Assigned to Maya Chen"
                        >
                      </span>
                    </div>
                  </div>
                </footer>
              </div>
            </article>
          </li>
          <li class="smbk-board-column__card">
            <article class="smbk-card smbk-card--surface-raised smbk-card--layout-compact">
              <div class="smbk-card__content">
                <header class="smbk-card__header smbk-card__header--type-title smbk-card__header--size-sm">
                  <div class="smbk-card__header-text">
                    <div class="smbk-card__title-row">
                      <h4 class="smbk-card__title"><a class="smbk-card__link" href="#pricing">Approve the pricing page</a></h4>
                    </div>
                  </div>
                </header>
                <footer class="smbk-card__footer smbk-card__footer--type-actions smbk-card__footer--rule-off">
                  <div class="smbk-card__footer-row">
                    <div class="smbk-card__footer-start">
                      <span class="smbk-badge smbk-badge--look-soft smbk-badge--tone-info smbk-badge--size-sm">
                        <span class="smbk-badge__label">Copy</span>
                      </span>
                    </div>
                    <div class="smbk-card__footer-end">
                      <span
                        class="smbk-avatar smbk-avatar--size-xs smbk-avatar--tone-inverse smbk-avatar--type-initials"
                        role="img"
                        aria-label="Assigned to Leo Park"
                      >
                        <span class="smbk-avatar__initials" aria-hidden="true">LP</span>
                      </span>
                    </div>
                  </div>
                </footer>
              </div>
            </article>
          </li>
        </ul>
      </div>
      <div class="smbk-board-column__group">
        <div class="smbk-board-column__group-head">
          <span
            class="smbk-status-dot smbk-status-dot--tone-info smbk-board-column__dot"
            aria-hidden="true"
          >
            <span class="smbk-status-dot__dot"></span>
          </span>
          <span class="smbk-board-column__group-label" id="board-3-label">In progress</span>
          <span
            class="smbk-badge smbk-badge--look-soft smbk-badge--tone-info smbk-badge--size-sm smbk-board-column__count"
            id="board-3-count"
          >
            <span class="smbk-badge__label">1</span>
          </span>
        </div>
        <ul class="smbk-board-column__cards" aria-labelledby="board-3-label board-3-count">
          <li class="smbk-board-column__card">
            <article class="smbk-card smbk-card--surface-raised smbk-card--layout-compact">
              <div class="smbk-card__content">
                <header class="smbk-card__header smbk-card__header--type-title smbk-card__header--size-sm">
                  <div class="smbk-card__header-text">
                    <div class="smbk-card__title-row">
                      <h4 class="smbk-card__title"><a class="smbk-card__link" href="#footer-links">Fix the footer links</a></h4>
                    </div>
                  </div>
                </header>
                <footer class="smbk-card__footer smbk-card__footer--type-actions smbk-card__footer--rule-off">
                  <div class="smbk-card__footer-row">
                    <div class="smbk-card__footer-start">
                      <span class="smbk-badge smbk-badge--look-soft smbk-badge--tone-danger smbk-badge--size-sm">
                        <span class="smbk-badge__label">Bug</span>
                      </span>
                    </div>
                    <div class="smbk-card__footer-end">
                      <span
                        class="smbk-avatar smbk-avatar--size-xs smbk-avatar--tone-inverse smbk-avatar--type-initials"
                        role="img"
                        aria-label="Assigned to Ana Silva"
                      >
                        <span class="smbk-avatar__initials" aria-hidden="true">AS</span>
                      </span>
                    </div>
                  </div>
                </footer>
              </div>
            </article>
          </li>
        </ul>
      </div>
    </section>
    <section class="smbk-board-column" aria-labelledby="board-4-title" data-scrollbar="">
      <div class="smbk-board-column__head">
        <div class="smbk-board-column__heading">
          <h3 class="smbk-board-column__title" id="board-4-title">Docs, preview</h3>
          <div class="smbk-board-column__meter">
            <div
              aria-label="Agents on the docs"
              class="smbk-capacity-meter"
              role="meter"
              aria-valuemin="0"
              aria-valuemax="2"
              aria-valuenow="2"
              aria-valuetext="2 of 2 places"
            >
              <span class="smbk-capacity-meter__segments" aria-hidden="true">
                <span class="smbk-capacity-meter__segment smbk-capacity-meter__segment--filled"></span>
                <span class="smbk-capacity-meter__segment smbk-capacity-meter__segment--filled"></span>
              </span>
              <span class="smbk-capacity-meter__words" aria-hidden="true">2 of 2 places</span>
            </div>
          </div>
        </div>
        <div class="smbk-board-column__action">
          <button
            type="button"
            class="smbk-btn smbk-btn--tone-ghost smbk-btn--size-sm smbk-btn--icon-only"
            aria-label="Add an agent to the docs"
          >
            <i
              class="ph ph-plus smbk-icon smbk-icon--size-md smbk-btn__icon"
              aria-hidden="true"
            ></i>
          </button>
        </div>
      </div>
      <div class="smbk-board-column__group">
        <div class="smbk-board-column__group-head">
          <span
            class="smbk-status-dot smbk-status-dot--tone-info smbk-board-column__dot"
            aria-hidden="true"
          >
            <span class="smbk-status-dot__dot"></span>
          </span>
          <span class="smbk-board-column__group-label" id="board-5-label">In progress</span>
          <span
            class="smbk-badge smbk-badge--look-soft smbk-badge--tone-info smbk-badge--size-sm smbk-board-column__count"
            id="board-5-count"
          >
            <span class="smbk-badge__label">2</span>
          </span>
        </div>
        <ul class="smbk-board-column__cards" aria-labelledby="board-5-label board-5-count">
          <li class="smbk-board-column__card">
            <article class="smbk-card smbk-card--surface-raised smbk-card--layout-compact">
              <div class="smbk-card__content">
                <header class="smbk-card__header smbk-card__header--type-title smbk-card__header--size-sm">
                  <div class="smbk-card__header-text">
                    <div class="smbk-card__title-row">
                      <h4 class="smbk-card__title"><a class="smbk-card__link" href="#release-notes">Write the release notes</a></h4>
                    </div>
                  </div>
                </header>
                <div class="smbk-card__body smbk-card__body--type-text">One line per change, in plain words.</div>
                <footer class="smbk-card__footer smbk-card__footer--type-actions smbk-card__footer--rule-off">
                  <div class="smbk-card__footer-row">
                    <div class="smbk-card__footer-start">
                      <span class="smbk-badge smbk-badge--look-soft smbk-badge--tone-info smbk-badge--size-sm">
                        <span class="smbk-badge__label">Docs</span>
                      </span>
                    </div>
                    <div class="smbk-card__footer-end">
                      <span
                        class="smbk-avatar smbk-avatar--size-xs smbk-avatar--tone-inverse smbk-avatar--type-initials"
                        role="img"
                        aria-label="Assigned to Leo Park"
                      >
                        <span class="smbk-avatar__initials" aria-hidden="true">LP</span>
                      </span>
                    </div>
                  </div>
                </footer>
              </div>
            </article>
          </li>
          <li class="smbk-board-column__card">
            <article class="smbk-card smbk-card--surface-raised smbk-card--layout-compact">
              <div class="smbk-card__content">
                <header class="smbk-card__header smbk-card__header--type-title smbk-card__header--size-sm">
                  <div class="smbk-card__header-text">
                    <div class="smbk-card__title-row">
                      <h4 class="smbk-card__title"><a class="smbk-card__link" href="#guides">Move the guides to the new host</a></h4>
                    </div>
                  </div>
                </header>
                <footer class="smbk-card__footer smbk-card__footer--type-actions smbk-card__footer--rule-off">
                  <div class="smbk-card__footer-row">
                    <div class="smbk-card__footer-start">
                      <span class="smbk-badge smbk-badge--look-soft smbk-badge--tone-info smbk-badge--size-sm">
                        <span class="smbk-badge__label">Docs</span>
                      </span>
                    </div>
                    <div class="smbk-card__footer-end">
                      <span class="smbk-avatar smbk-avatar--size-xs smbk-avatar--tone-inverse smbk-avatar--type-image">
                        <img
                          class="smbk-avatar__image"
                          src="data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22480%22%20height%3D%22270%22%3E%3Crect%20width%3D%22480%22%20height%3D%22270%22%20fill%3D%22%235c7798%22%2F%3E%3Ccircle%20cx%3D%22360%22%20cy%3D%2290%22%20r%3D%2260%22%20fill%3D%22%23cc0d0d%22%2F%3E%3C%2Fsvg%3E"
                          alt="Assigned to Maya Chen"
                        >
                      </span>
                    </div>
                  </div>
                </footer>
              </div>
            </article>
          </li>
        </ul>
      </div>
    </section>
    <section class="smbk-board-column" aria-labelledby="board-6-title" data-scrollbar="">
      <div class="smbk-board-column__head">
        <div class="smbk-board-column__heading">
          <h3 class="smbk-board-column__title" id="board-6-title">Shop, preview</h3>
          <div class="smbk-board-column__meter">
            <div
              aria-label="Agents on the shop"
              class="smbk-capacity-meter"
              role="meter"
              aria-valuemin="0"
              aria-valuemax="2"
              aria-valuenow="0"
              aria-valuetext="0 of 2 places"
            >
              <span class="smbk-capacity-meter__segments" aria-hidden="true">
                <span class="smbk-capacity-meter__segment"></span>
                <span class="smbk-capacity-meter__segment"></span>
              </span>
              <span class="smbk-capacity-meter__words" aria-hidden="true">0 of 2 places</span>
            </div>
          </div>
        </div>
        <div class="smbk-board-column__action">
          <button
            type="button"
            class="smbk-btn smbk-btn--tone-ghost smbk-btn--size-sm smbk-btn--icon-only"
            aria-label="Add an agent to the shop"
          >
            <i
              class="ph ph-plus smbk-icon smbk-icon--size-md smbk-btn__icon"
              aria-hidden="true"
            ></i>
          </button>
        </div>
      </div>
      <div class="smbk-board-column__group">
        <div class="smbk-board-column__group-head">
          <span
            class="smbk-status-dot smbk-status-dot--tone-success smbk-board-column__dot"
            aria-hidden="true"
          >
            <span class="smbk-status-dot__dot"></span>
          </span>
          <span class="smbk-board-column__group-label" id="board-7-label">Done this week</span>
          <span
            class="smbk-badge smbk-badge--look-soft smbk-badge--tone-info smbk-badge--size-sm smbk-board-column__count"
            id="board-7-count"
          >
            <span class="smbk-badge__label">1</span>
          </span>
        </div>
        <ul class="smbk-board-column__cards" aria-labelledby="board-7-label board-7-count">
          <li class="smbk-board-column__card">
            <article class="smbk-card smbk-card--surface-raised smbk-card--layout-compact">
              <div class="smbk-card__content">
                <header class="smbk-card__header smbk-card__header--type-title smbk-card__header--size-sm">
                  <div class="smbk-card__header-text">
                    <div class="smbk-card__title-row">
                      <h4 class="smbk-card__title"><a class="smbk-card__link" href="#gift-card">Add the gift card</a></h4>
                    </div>
                  </div>
                </header>
                <footer class="smbk-card__footer smbk-card__footer--type-actions smbk-card__footer--rule-off">
                  <div class="smbk-card__footer-row">
                    <div class="smbk-card__footer-start">
                      <span class="smbk-badge smbk-badge--look-soft smbk-badge--tone-success smbk-badge--size-sm">
                        <span class="smbk-badge__label">Feature</span>
                      </span>
                    </div>
                    <div class="smbk-card__footer-end">
                      <span
                        class="smbk-avatar smbk-avatar--size-xs smbk-avatar--tone-inverse smbk-avatar--type-initials"
                        role="img"
                        aria-label="Assigned to Ana Silva"
                      >
                        <span class="smbk-avatar__initials" aria-hidden="true">AS</span>
                      </span>
                    </div>
                  </div>
                </footer>
              </div>
            </article>
          </li>
        </ul>
      </div>
    </section>
  </div>
  <div class="smbk-board__scroll-hint" aria-hidden="true">
    <div class="smbk-table__scroll-track"><span class="smbk-table__scroll-thumb"></span></div>
  </div>
</div>
```

## React

```tsx
import { Board } from './design-system/components/board/board.js';
import { BoardColumn, BoardGroup } from './design-system/components/board-column/board-column.js';
import { CapacityMeter } from './design-system/components/capacity-meter/capacity-meter.js';
import { Button } from './design-system/components/button/button.js';
import { Card, CardHeader, CardFooter } from './design-system/components/card/card.js';
import { Badge } from './design-system/components/badge/badge.js';
import { Avatar } from './design-system/components/avatar/avatar.js';

<Board aria-label="Agents by project, preview">
  <BoardColumn title="Website, preview" meter={<CapacityMeter filled={1} segments={2} aria-label="Agents on the website" />} action={<Button tone="ghost" size="sm" icon-only icon="Plus" aria-label="Add an agent to the website" />}>
    <BoardGroup label="Waiting on you" dot="warning" count={2}>
      <Card surface="raised" layout="compact" header={<CardHeader size="sm" headingLevel={4} title="Review the token export" href="#token-export" />} footer={<CardFooter start={<Badge look="soft" size="sm" tone="info">Design</Badge>} end={<Avatar size="xs" tone="inverse" src="data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22480%22%20height%3D%22270%22%3E%3Crect%20width%3D%22480%22%20height%3D%22270%22%20fill%3D%22%235c7798%22%2F%3E%3Ccircle%20cx%3D%22360%22%20cy%3D%2290%22%20r%3D%2260%22%20fill%3D%22%23cc0d0d%22%2F%3E%3C%2Fsvg%3E" alt="Assigned to Maya Chen" />} />}>Check the new color ladder against the contrast pairs.</Card>
      <Card surface="raised" layout="compact" header={<CardHeader size="sm" headingLevel={4} title="Approve the pricing page" href="#pricing" />} footer={<CardFooter start={<Badge look="soft" size="sm" tone="info">Copy</Badge>} end={<Avatar size="xs" tone="inverse" alt="Assigned to Leo Park">LP</Avatar>} />} />
    </BoardGroup>
    <BoardGroup label="In progress" dot="info" count={1}>
      <Card surface="raised" layout="compact" header={<CardHeader size="sm" headingLevel={4} title="Fix the footer links" href="#footer-links" />} footer={<CardFooter start={<Badge look="soft" size="sm" tone="danger">Bug</Badge>} end={<Avatar size="xs" tone="inverse" alt="Assigned to Ana Silva">AS</Avatar>} />} />
    </BoardGroup>
  </BoardColumn>
  <BoardColumn title="Docs, preview" meter={<CapacityMeter filled={2} segments={2} aria-label="Agents on the docs" />} action={<Button tone="ghost" size="sm" icon-only icon="Plus" aria-label="Add an agent to the docs" />}>
    <BoardGroup label="In progress" dot="info" count={2}>
      <Card surface="raised" layout="compact" header={<CardHeader size="sm" headingLevel={4} title="Write the release notes" href="#release-notes" />} footer={<CardFooter start={<Badge look="soft" size="sm" tone="info">Docs</Badge>} end={<Avatar size="xs" tone="inverse" alt="Assigned to Leo Park">LP</Avatar>} />}>One line per change, in plain words.</Card>
      <Card surface="raised" layout="compact" header={<CardHeader size="sm" headingLevel={4} title="Move the guides to the new host" href="#guides" />} footer={<CardFooter start={<Badge look="soft" size="sm" tone="info">Docs</Badge>} end={<Avatar size="xs" tone="inverse" src="data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22480%22%20height%3D%22270%22%3E%3Crect%20width%3D%22480%22%20height%3D%22270%22%20fill%3D%22%235c7798%22%2F%3E%3Ccircle%20cx%3D%22360%22%20cy%3D%2290%22%20r%3D%2260%22%20fill%3D%22%23cc0d0d%22%2F%3E%3C%2Fsvg%3E" alt="Assigned to Maya Chen" />} />} />
    </BoardGroup>
  </BoardColumn>
  <BoardColumn title="Shop, preview" meter={<CapacityMeter filled={0} segments={2} aria-label="Agents on the shop" />} action={<Button tone="ghost" size="sm" icon-only icon="Plus" aria-label="Add an agent to the shop" />}>
    <BoardGroup label="Done this week" dot="success" count={1}>
      <Card surface="raised" layout="compact" header={<CardHeader size="sm" headingLevel={4} title="Add the gift card" href="#gift-card" />} footer={<CardFooter start={<Badge look="soft" size="sm" tone="success">Feature</Badge>} end={<Avatar size="xs" tone="inverse" alt="Assigned to Ana Silva">AS</Avatar>} />} />
    </BoardGroup>
  </BoardColumn>
</Board>
```

## Stylesheet

```css
/* smbk-board — Board. Figma "Board" 7118:1603 (Platform: Desktop, Mobile; the layout switch here).
 * Columns of cards side by side on a wide screen, the large inline gap apart, in a frame that scrolls
 * sideways when they run past it; in a narrow space they stack, one under another at full width, the
 * large stack gap apart, and nothing scrolls sideways. Where the browser hides its own scrollbar until the
 * frame scrolls (a phone, a trackpad), a thin bar along the frame's foot shows that there is more
 * sideways, drawn with the table's track and thumb. */

.smbk-board {
  box-sizing: border-box;
  position: relative;
  display: block;
  width: 100%;
  overflow-x: auto;
  /* The system's scrollbar: thin, in the subtle border color, on a clear track. */
  scrollbar-width: thin;
  scrollbar-color: var(--smbk-color-border-subtle) transparent;
}

/* A frame that scrolls is a region the keyboard reaches: its ring is drawn inside its edge, which clips. */
.smbk-board:focus-visible {
  outline: var(--smbk-focus-ring-width) solid var(--smbk-color-border-focus);
  outline-offset: calc(-1 * var(--smbk-focus-ring-width));
}

.smbk-board__columns {
  display: flex;
  align-items: flex-start;
  gap: var(--smbk-space-inline-lg);
  width: max-content;
  min-width: 100%;
}

/* ---- the scroll hint (the shared script marks the frame `data-scroll-hint`) ---- */

.smbk-board__scroll-hint {
  display: none;
}

.smbk-board[data-scroll-hint] .smbk-board__scroll-hint {
  position: sticky;
  left: 0;
  display: block;
  padding: var(--smbk-space-inset-xs) var(--smbk-space-inset-sm);
  pointer-events: none;
}

/* While the system's scrollbar shows over the frame (scrollbar.ts), in the same strip, the hint's bar fades out of
   its way (its fade is the table's). */
.smbk-board[data-scroll-hint]:has(> .smbk-scrollbar[data-shown]) .smbk-table__scroll-track {
  opacity: 0;
}

/* ---- the narrow form: the columns stack and the frame no longer scrolls sideways ---- */

@container style(--smbk-layout: narrow) {
  .smbk-board {
    overflow-x: visible;
  }

  .smbk-board__columns {
    flex-direction: column;
    align-items: stretch;
    gap: var(--smbk-space-stack-lg);
    width: auto;
  }

  .smbk-board__scroll-hint {
    display: none;
  }
}
```

## Tokens it reads

```json
{
  "color": {
    "border": {
      "subtle": {
        "$type": "color",
        "$value": "{{color.grey.300}}",
        "$description": "Dividers and quiet edges."
      },
      "focus": {
        "$type": "color",
        "$value": "{{color.red.600}}",
        "$description": "Keyboard focus ring on controls."
      }
    }
  },
  "focus": {
    "ring": {
      "width": {
        "$type": "dimension",
        "$value": "{{border-width.2}}",
        "$description": "Thickness of the focus ring."
      }
    }
  },
  "space": {
    "inline": {
      "lg": {
        "$type": "dimension",
        "$value": "{{space.12}}",
        "$description": "Gap between things side by side, large."
      }
    },
    "inset": {
      "xs": {
        "$type": "dimension",
        "$value": "{{space.4}}",
        "$description": "Padding inside a component, extra small."
      },
      "sm": {
        "$type": "dimension",
        "$value": "{{space.6}}",
        "$description": "Padding inside a component, small."
      }
    },
    "stack": {
      "lg": {
        "$type": "dimension",
        "$value": "{{space.16}}",
        "$description": "Gap between things stacked one above another, large."
      }
    }
  }
}
```

## Purpose

Shows work in lanes: one column per project, person or stage, each with its cards. On a wide screen the lanes sit side by side, so the reader can compare them; on a phone they stack, one under another.

## Anatomy

- The block, a frame that scrolls sideways when its columns run past it.
- The columns part, the row of board columns, the large inline gap apart.
- The scroll hint part, a thin bar along the frame's foot that shows there is more sideways and how much is in view. It shows where the browser's own scrollbar takes no room, such as on a phone or a trackpad, and wherever the system's scrollbar is drawn over the frame; it fades while that bar shows, in the same strip.

## When to use

- For a few lanes of comparable work that a reader scans side by side.
- For a dashboard of projects, each with its items grouped by where they stand.

## When not to use

- For one lane. Use a [board column](board-column.md) alone.
- For many items with many details each. Use a [table](table.md).

## Behavior

On a wide screen the columns sit side by side at the large column width. When they need more room than the frame has, the frame scrolls sideways inside itself, so the page never does. In a narrow space the columns stack at full width, the large stack gap apart, and nothing scrolls sideways. Put `data-layout="narrow"` or `"wide"` on an element around the board to choose either form.

Moving cards between columns by dragging is not part of the board.

## Accessibility

### What it does for you

- While the columns run past the frame, the frame is a region named by the board's label and a stop for the Tab key, so the arrow keys can scroll it sideways. It shows the focus ring inside its edge. When everything fits, it is neither.
- The columns are read in the order they come in the page, left to right on a wide screen and top to bottom on a phone.
- Each column is a region of its own, named by its title.

### What you must do

- Give the board an `aria-label` that says what it shows, such as "Agents by project".

### How to test

- On a wide screen with columns past the frame, Tab to the frame: the focus ring shows inside its edge, and the arrow keys scroll it sideways.
- With a screen reader, the frame and each column are found as regions by their names, and the columns are read in page order.
- With text at 200% and the page 320 pixels wide, the columns stack and nothing scrolls sideways.
- In a forced-color mode, the focus ring on the frame stays visible.

### Keyboard

| Key | What it does |
|---|---|
| Tab | Moves focus to the frame while the columns run past it, then into the columns. |
| Left Arrow or Right Arrow | Scrolls the frame sideways while it has focus. |

## Usage rules

### Do

- Keep to a few columns, each named.
- Put the column that needs the reader first, first.

### Don't

- Hide columns on a phone; they stack instead.
- Nest a board in a board column.
