busy-office-ui
Menu

Date

Deprecated. .bo-date is a display: inline-flex, a gap, tabular numerals and a muted span — a .bo-cluster with two utilities. It ships no forced-colors rule, is not density-aware, and no screen in these docs uses it. A surface review scored it 1 of 12, the lowest in the framework.

Compose it instead, as shown below. The one decision worth keeping — that overdue is two-channel, so the word "Overdue" must be in the text — now lives on Amount, which documents the same contract for negative values.

It still works and is not going anywhere this major. @busy-office/ui is published, so removal waits for the next major version; this is a deprecation, not a deletion.

Use this instead

Aug 10, 2026 Overdue by 4 days Aug 21, 2026 (in 7 days)
View code
<!-- The replacement: a cluster, a tabular utility, and a badge.
     Two-channel by construction — the badge carries the WORD "Overdue",
     so the meaning survives without colour. -->
<span class="bo-cluster">
  <span class="bo-u-tabular">Aug 10, 2026</span>
  <span class="bo-badge bo-badge--danger">Overdue by 4 days</span>
</span>

<!-- and the ordinary case is just the text -->
<span class="bo-cluster">
  <span class="bo-u-tabular">Aug 21, 2026</span>
  <span class="bo-u-text-muted">(in 7 days)</span>
</span>

Same information, no bespoke component — and the badge makes the two-channel contract structural rather than a rule someone has to remember.

A read-only date value, the Amount/Quantity counterpart for dates: your app formats the absolute date and the optional relative text; this styles and aligns them. There's no editable variant — for data entry, use a plain native <input type="date">.

Basic

Aug 21, 2026 (in 7 days)
View code
<span class="bo-date">
  <span class="bo-date__value">Aug 21, 2026</span>
  <span class="bo-date__relative">(in 7 days)</span>
</span>

__relative is optional, muted, plain text — your app decides the wording ("in 7 days", "3 weeks ago").

Today

Aug 14, 2026 (today)
View code
<span class="bo-date">
  <span class="bo-date__value">Aug 14, 2026</span>
  <span class="bo-date__relative">(today)</span>
</span>

Overdue — two-channel

Aug 10, 2026 (Overdue by 4 days)
View code
<!-- two-channel, same contract as Amount's --negative — the word
     "Overdue" is in the text; colour only adds the hue. -->
<span class="bo-date bo-date--overdue">
  <span class="bo-date__value">Aug 10, 2026</span>
  <span class="bo-date__relative">(Overdue by 4 days)</span>
</span>

The word "Overdue" lives in the text, so colourblind and screen-reader users get the meaning without the colour — same contract as Amount's --negative. --overdue only adds the hue.

Muted (no dedicated modifier)

Jul 1, 2026
View code
<!-- no --muted modifier — .bo-u-text-muted (existing utility)
     already does this -->
<span class="bo-date bo-u-text-muted">
  <span class="bo-date__value">Jul 1, 2026</span>
</span>

There's no --muted modifier — the existing utility .bo-u-text-muted already does this; a component modifier would just duplicate it.

Editable date — a plain input, not .bo-date

View code
<!-- .bo-date is DISPLAY only, like .bo-amount. For an editable
     date, use a plain native input — nothing to add, a native date
     picker is already good. -->
<div class="bo-form-field">
  <label class="bo-form-field__label" for="dt-due">Due date</label>
  <input class="bo-input" id="dt-due" type="date" value="2026-08-21" />
</div>

.bo-date is read-only display, like .bo-amount. There's deliberately no input variant — a native date picker already covers entry well; nothing to add at this layer.

In a table column

PODue date
PO-88213Aug 21, 2026(in 7 days)
PO-88214Aug 10, 2026(Overdue by 4 days)
View code
<table class="bo-data-table">
  <thead><tr><th>PO</th><th>Due date</th></tr></thead>
  <tbody>
    <tr><td>PO-88213</td><td><span class="bo-date"><span class="bo-date__value">Aug 21, 2026</span><span class="bo-date__relative">(in 7 days)</span></span></td></tr>
    <tr><td>PO-88214</td><td><span class="bo-date bo-date--overdue"><span class="bo-date__value">Aug 10, 2026</span><span class="bo-date__relative">(Overdue by 4 days)</span></span></td></tr>
  </tbody>
</table>

Same component, dropped straight into a table cell — no table-specific variant needed.

Markup

<span class="bo-date">
  <span class="bo-date__value">Aug 21, 2026</span>       <!-- your app formats the date -->
  <span class="bo-date__relative">(in 7 days)</span>     <!-- optional -->
</span>

<!-- modifiers: --overdue -->

Quick reference generated

ClassRole
.bo-date block (root)
.bo-date--overdue variant: overdue
.bo-date__relative part: relative
.bo-date__value part: value

API generated from CSS

Blocks bo-date
Parts bo-date__relativebo-date__value
Variants bo-date--overdue
JS required None — CSS-only.
  • Read-only display, like Amount — your app formats the date and the optional relative text.
  • Overdue is two-channel — the word "Overdue" MUST be in the markup; --overdue only adds colour.
  • No --muted modifier — use the existing .bo-u-text-muted utility instead.
  • No editable variant — use a plain native <input type="date"> for data entry.
Contrast — 6 AA pairs this component uses (generated, CI-gated)
TextonLightDark
text-muted bg-surface 7.56 6.65
text-muted bg-muted 6.87 5.66
danger-text danger-subtle 5.91 8.06
danger-text bg-surface 6.47 8.89
danger-text bg-canvas 6.19 9.96
danger-text bg-muted 5.88 7.57

Maturity generated

Introduced
v0.1.0
CSS floor
Chrome/Edge 99 · Firefox 97 · Safari 15.4
Alignment scored
2026-08-21
Assistive-tech evidence
None recorded

Pin this component's first release with npm i @busy-office/ui@0.1.0. The floor is derived from this component's stylesheet alone — set by @layer — so it sits at or below the whole framework's Chrome/Edge 119 · Firefox 129 · Safari 17.5. No assistive-technology runtime result is recorded for any component: it needs a human listening to VoiceOver and NVDA on owner hardware; no gate in this repo can simulate announcement behaviour. What automation covers instead is test:axe across every page at 1440 and 390, and check:forced-colors — see accessibility.

Design-system alignment generated

73% (11/15) — how closely this component follows the design language. Each rule is scored 0-3 against a checkable citation; rules that don't apply leave the denominator. Scored 2026-08-21.

Rule Score Evidence
Typography 3 / 3 tabular-nums on __value, --bo-font-size-xs on __relative; zero raw literals
Colour 3 / 3 zero raw hex; text-muted/danger-text tokens, and the overdue contract is two-channel — the WORD "Overdue" is required in the text
Spacing 3 / 3 gap from --bo-space-1; zero raw dimension literals
Interaction n/a display-only; entry uses a native <input type="date"> directly, so there is no interaction story to score
Content 2 / 3 no wrong-choice clause in the opener. This row was scored before 94.7 defined the dimension and 94.10 made the clause the requirement; /components/date is on check:wrong-choice's TODO, and writing the clause raises this score and shrinks that list in one action
Fit 0 / 3 DEPRECATED (45.3) and prescribed in NO context: its own source says compose .bo-cluster + two utilities instead, and zero screens use it — 1 prose mention on /components/amount is the only occurrence outside its own page

Known gaps: fit — removed at the next major; until then the page documents the .bo-cluster replacement (roadmap 45.3, CHANGELOG Deprecated); content — write the wrong-choice clause the recipe requires (roadmap 94.10 ratchet).

↑↓ move Enter open Esc close