Widgets

A shared content frame, unboxed values and quiet states. Your application owns placement, data and configuration.

Heading, content and footer

Use a real heading and a unique accessible name. Description, header action and footer are optional. A host may choose a scheme and stretch its cell; the body keeps its footer at the bottom.

Membership at a glance

Demonstration values; labels retain ordinary typography.

Active
42
Probationary
0
<section class="widget" aria-labelledby="membership">
  <header class="widget-header">
    <div class="widget-heading">
      <h2 id="membership" class="widget-title">Membership at a glance</h2>
      <p class="widget-description">Optional description</p>
    </div>
    <a class="widget-action" href="/members">Optional action</a>
  </header>
  <div class="widget-content">Caller content</div>
  <footer class="widget-footer">
    <a class="more" href="/members">Member directory</a>
  </footer>
</section>

widget--plain-header removes the header divider. --widget-padding and --widget-border-color provide deliberate presentation choices. Text links inherit the scheme foreground; anchor buttons retain their button colors and focus treatment. Components emit no placement/editor wrapper or layout utility classes.

Unboxed metrics

A standalone metric is a definition list. Groups use dl.widget-metrics with div.widget-metric groups, each containing its own dt and dd. Numeric values appear above labels visually, while terms remain first in the semantic DOM.

<dl class="widget-metric">
  <dt>Active</dt>
  <dd class="widget-metric-value widget-metric-value--short font-metric tnum"
      style="--widget-metric-size: var(--text-4xl);
             --widget-metric-weight: 650;
             --widget-metric-width: 80%;">42</dd>
  <dd class="widget-metric-detail">Optional units or detail</dd>
</dl>
Value-only typography hooks
HookPropertyUnset
--font-metricfont-family via .font-metricBody font
--font-metric-sizeInitial font-size via .font-metricUnderlying value style
--font-metric-widthInitial font-stretch via .font-metricUnderlying value style
--widget-metric-sizefont-sizetext-2xl, or the short/long variation
--widget-metric-weightfont-weightExisting bold weight
--widget-metric-widthfont-stretchInherited stretch

Choose widget-metric-value--short for tall short values (text-4xl) or widget-metric-value--long for compact long values (text-lg). The default is text-2xl. Callers choose after formatting; CSS does not count digits or guarantee a single-line fit. Explicit hooks override these defaults. Size hooks do not change leading or tracking; pair token-sized overrides with the matching short/long variation, or set the matching line-height and letter-spacing locally on the value.

Width means glyph width when the font supports its registered width axis, never widget columns. Static fonts remain readable. Long values wrap without clipping or hiding digits. No font is selected or downloaded.

.font-metric keeps the family expression matching Baseplate's var(--font-metric, var(--font-body, sans-serif)), sans-serif contract. Its optional --font-metric-size and --font-metric-width hooks provide initial value settings; widget-specific size/width hooks take precedence. Unset settings preserve the underlying styles through revert-layer. Labels, units, descriptions and ordinary numbers keep their typography. Callers supply locale, formatted values and units.

Keep size/weight utilities off hook-controlled values: the utilities layer intentionally wins over component hooks. .font-metric and .tnum remain compatible.

Use dd.widget-metric-status for missing, denied or unavailable values; omit the prominent-value and font classes. A known zero stays 0.

Quiet inline messages

You're all caught up.

Optional supporting detail.

<div class="widget-message">
  <span class="widget-message-icon" aria-hidden="true">Optional icon</span>
  <div class="widget-message-content">
    <p>Temporarily unavailable</p>
    <p class="widget-message-detail">Try again later or open the full page.</p>
  </div>
</div>

Omit the icon and detail when unnecessary. The message adds no card or forced live region; the host chooses dynamic feedback semantics. Reuse Timeline, StatusIndicator and ProgressBar inside content slots, and give charts an equivalent table independent of the renderer.

Chart data, progress and video

table.widget-table keeps compact native columns, ordinary type and single quiet row separators at narrow sizes. Keep captions and header scopes; replace table--lined on chart fallback tables.

Use the existing progress height hook for thin card progress: style="--progress-height: var(--line-025)". The default is line-05; progress-bar--thick uses line-1. Fill/background, status and timeline variations remain caller choices.

A video uses the existing .embed inside the content slot. Use a descriptive iframe title and a direct-video link when embedding is unavailable. The YouTube examples show narrow/wide output with autoplay disabled. YouTube needs at least 200px in both dimensions; narrower hosts should show the direct-link state.

<div class="widget-content">
  <div class="embed" style="min-block-size: 200px;">
    <iframe class="block border-0"
      src="https://www.youtube.com/embed/M7lc1UVf-VE?autoplay=0"
      title="YouTube embedded-player demonstration" loading="lazy"
      referrerpolicy="strict-origin-when-cross-origin"
      allow="encrypted-media; picture-in-picture" allowfullscreen
      style="min-block-size: 200px;"></iframe>
  </div>
</div>
<footer class="widget-footer">
  <a href="https://www.youtube.com/watch?v=M7lc1UVf-VE">Watch on YouTube</a>
</footer>

Baseplate owns flips and controls on the back: permissions, draft state, saved configuration and reset/Save behavior. Either face can use this frame; the shared references demonstrate output.

Design Machines library coverage

The final read-only comparison inspected 34 admitted widgets: 29 in the library and 5 already placed on the board. The examples cover shared compositions rather than copying domain renderers. The install displayed v1.0.0-beta.2; its exact source SHA was unavailable. Populated Atlas states absent from the live install were compared against the pinned producer templates.

Additional references cover incomplete profile progress and next steps, runtime/backup facts, metric-plus-summary tables, ranked category/place/date lists, populated notifications/activity, sharing-aware metrics and map data fallback. Multi-column data retains every column in a labelled, keyboard-focusable scroll region at narrow sizes.

Every observed board/library widget mapped to a reference composition
Observed widgetLocationCompositionExample
Organization activityBoardActivity timelineView example
Network mapBoardEmpty map + four-column city fallback; no map runtimeView example
Open proposalsBoardProposal list + caller footerView example
Needs my inputBoardProposal/deadline listView example
Drafts I'm working onBoardCaller-filtered proposal listView example
Unread notificationsLibraryPopulated notification list + empty stateView example
Profile completionLibraryThin progress + remaining next actions; optional footerView example
Linked organizationsLibraryIdentity/link listView example
Membership at a glanceLibraryGrouped metricsView example
Membership requirementsLibraryMetric + requirements table; empty/unavailable statesView example
CirclesLibraryMetric + kind/count tableView example
Connection requestsLibraryQuiet empty message + caller action/footerView example
Connected organizationsLibraryMetric + identity listView example
Assembly healthLibraryOrdinary facts + status + per-fact actionView example
AssemblyLibraryOrdinary runtime fact table; optional footerView example
UpdatesLibraryOrdinary status/message + actionView example
BackupsLibraryDestination/status tableView example
Organizations in the networkLibraryStandalone count metricView example
People in the network*LibrarySharing-aware unavailable metric and detailView example
Network over timeLibraryStatic illustration + independent data tableView example
SectorsLibraryRanked labels/counts + decorative bars + full tableView example
Average organization sizeLibraryFormatted decimal metric + denominator detailView example
Cities in the networkLibraryStandalone metric + ordinary detailView example
Countries in the networkLibraryStandalone count metricView example
People over timeLibraryFour-column membership-position fallback + provisional observationView example
Organization typesLibraryRanked breakdown with wrapping labelsView example
Places in the networkLibraryPlace label/count list + shown-count noteView example
Recently joinedLibraryLink/date listView example
Respond byLibraryProposal/deadline listView example
Recent decisionsLibraryDecision timelineView example
Governance at a glanceLibraryGrouped metrics + year detailView example
Open proposal countLibraryStandalone prominent value + label/detailView example
Needs my input countLibraryStandalone prominent value + label/detailView example
Decisions this yearLibraryKnown zero metricView example

Back-face controls currently expose Columns, Rows and Colour scheme. Baseplate owns their flip, validation and Save behavior. No production board or configuration was changed.

Sources and ownership

Extracted from Baseplate 1821a8dd, Governance d995f68d and Atlas 03b03b90. Baseplate font-metric producer 257acac4 is merged on trusted main. The source comparison records original labels, deliberate variations and omitted route/editor exceptions.

Baseplate owns validated theme configuration, saved metric overrides, reset and dashboard editor behavior. Entry limits, sort/filter settings and video/embed configuration belong to the owning Go widgets; Live Wires only styles their output. Templ emits semantic slots without bundling CSS. These references do not retest application persistence or migrate consumers.

Open narrow/wide references Exact sources and full contract