Icon Tab
Live preview
filled-primary
A single external-egress navigation link rendered as an icon + label pair — e.g. a repository or fleet-manifest link in site chrome.
components/icon-tab/recipe.jsonWhen to use Icon Tab
Use for a single external-egress link rendered as an icon + label pair — e.g. a repository or fleet-manifest link in site chrome. One instance per destination.
When not to use
- In-page navigation. That's a different semantic — see
docs-sidenavandwiki-toc-sidebarfor within-site and within-article navigation respectively.
Variants
| Variant | Behaviour |
|---|---|
| Filled-primary | The primary egress tab — filled icon, no border treatment. Only variant committed in this release. |
A bordered, light-background ghost variant exists in source material
(template-agnostic-ui.html) but is deferred — see Open questions below.
Icon mechanism — decided 2026-08-10
Inline SVG (fill="currentColor"), not a CSS background-image icon slot. Inline
SVG gives clean colour inheritance through currentColor with no separate
icon-color token needed; a background-image alternative would remove the HTML's
dependency on icon content but lose that inheritance, requiring a new --icon-color
token or a filter workaround. Kept simple for this release.
Open questions (deferred, not blocking this release)
- Ghost variant.
template-agnostic-ui.htmluses a bordered, light-background.btnvariant alongside the filled version. Deferred to a later milestone — commit onlyfilled-primarynow. Whether it eventually becomes awf-icon-tab--ghostmodifier of this same component, or a separateicon-btncomponent (different semantic emphasis: secondary/inline action vs. primary egress tab), is left open. --ps-font-displaytoken. Not yet intokens/dtcg-bundle.json— currently resolved via the Woodfine theme's--displaycustom property, which works today inside that theme. This component lands now with the gap flagged; formalizing--ps-font-displayas a canonical token is separate follow-up DESIGN-TOKEN-CHANGE work, tracked but not blocking.
Tokens
| Token | Role in this component |
|---|---|
{primitive.font.family.display} | Label typeface (falls back to --pds-font-display until --ps-font-display is formalized — see Open questions). |
{semantic.text.primary} | Resting icon/label colour. |
{semantic.interactive.link} | Hover colour. |
{semantic.interactive.focus} | Focus-visible outline colour. |
Accessibility
The recipe targets WCAG 2.2 AA.
- Native link semantics. A plain
<a href>— norole="button"override; this is navigation, not an action. - Named destination in the accessible name.
aria-labelmust name the destination clearly (e.g. "Fleet Manifest," never just the platform name like "GitHub") and end with the literal suffix "(opens in new tab)" per WCAG 2.4.4 Link Purpose (Level AA). - Icon never separately announced. The SVG carries
aria-hidden="true"andfocusable="false"(the latter required for older SVG user agents); the label span carries the full accessible text. rel="noopener"is required alongsidetarget="_blank".- Screen readers announce: "<Destination name> (opens in new tab), link."
Reference
Source material: template-agnostic-ui.html.
Important Information
Design System disclosure
This site provides open-source design tokens, documentation, and self-hostable software published by Woodfine Capital Projects Inc. Information here is for general reference only and does not constitute an offer, warranty, or a guarantee of fitness for any particular purpose. Statements regarding planned, intended, or targeted future features are forward-looking and subject to change without notice; they are not undertaken to be updated except as required by law.