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
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
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
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
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)
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
| PO | Due date |
|---|---|
| PO-88213 | Aug 21, 2026(in 7 days) |
| PO-88214 | Aug 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
| Class | Role |
|---|---|
| .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;
--overdueonly adds colour. - No
--mutedmodifier — use the existing.bo-u-text-mutedutility instead. - No editable variant — use a plain native
<input type="date">for data entry.
Contrast — 6 AA pairs this component uses (generated, CI-gated)
| Text | on | Light | Dark |
|---|---|---|---|
| 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).