Identifies Loom through a still woven mark and outlined Archivo name, with optical cuts for supported sizes.

Atom · draft · v1.1.0 · owner: Site system lead · contract 19 of 20 points (open: figma)

Do and don't

Do: The lockup

Rendered by logo.ts

Open example: Logo · Do: The lockup Use the full-page example to follow page links.

Existing positions retain the currentColor signature: 22/26 px core and 34 px footer.

Do: Standalone mark

Rendered by logo.ts

Open example: Logo · Do: Standalone mark Use the full-page example to follow page links.

Use at 32 px or above with a parent-supplied accessible name.

Do: Optical small mark

Rendered by logo.ts

Open example: Logo · Do: Optical small mark Use the full-page example to follow page links.

Use the 16–24 px asset cut; the favicon generator supplies its plate and accessible document context.

Do: Outlined name

Rendered by logo.ts

Open example: Logo · Do: Outlined name Use the full-page example to follow page links.

Use a visible cap-height of at least 24 px; the labelled parent supplies the Loom name once.

Don't: Repeated in content

Rendered by logo.ts

Open example: Logo · Don't: Repeated in content Use the full-page example to follow page links.

The logo is for home and footer only.

Don't: Stretched or recoloured

Rendered by logo.ts

Open example: Logo · Don't: Stretched or recoloured Use the full-page example to follow page links.

The drawing is outlined from Archivo at fixed proportions.

Rules

RuleWhyCheck
Native lockup placements remain 22/26/34 px; standalone normal mark is at least 32 px, optical small mark is 16–24 px, and outlined wordmark has at least 24 px visible cap-height. Preserve every viewBox aspect ratio.A nonempty SVG can still violate its optical minimum; real styled consumers must measure the visible word path as well as the SVG viewport.Automated: tests/site/logo-sizing.spec.ts
Positive specimens declare their rendered initial state and document language; each registered visual variant has a positive example.Machine and Library consumers need the same examples without turning declarations into execution evidence.Automated: tests/unit/v4-example-coverage.test.ts
The existing website lockup remains in the header and footer; standalone asset variants do not authorize additional page placements.System asset support and website placement are separately governed.Automated: scripts/site/system/check-pages.ts (.wordmark only in header and footer)
Inline variants are decorative hidden SVGs in currentColor; their labelled parent supplies the accessible name. Standalone SVG exports carry the Loom image label. Preserve the aspect ratio and minimum size for each variant.Paint, naming and optical-size obligations remain explicit across supported uses.Automated: tests/unit/site-system.test.ts

API

PropTypeRequiredDefaultWhat it does
variantlockup | mark | mark-small | wordmarkNo"lockup"Lockup: existing 26 px core signature, 22 px at viewport widths up to 380 px, and 34 px in the footer. Mark: standalone symbol at 32 px or above. Mark-small: optical 16–24 px symbol/favicon cut. Wordmark: outlined Archivo name at 24 px visible cap-height or above. Parent supplies accessible name and placement.

Contract details

The full contract: identity, anatomy, variants, states, tokens, layout, motion, accessibility, content, tests

Identity

AspectValue
Idlogo
LayerAtoms
Categorybrand
OwnerSite system lead
Statusdraft
Version1.1.0
Sourceapps/showcase/site/system/atoms/logo.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26D-SITE-019 refinement: measured woven square, optical small cut and retained outlined Archivo; candidate final geometry remains under review.

Use when

  • The lockup in existing header and footer positions. Why: The name and mark identify the home link.
  • A standalone identity asset or favicon at its supported size. Why: Mark, small-mark and wordmark variants have distinct asset roles without authorizing new website placements.

Do not use when

  • Repeated as arbitrary content decoration. Why: Use expressive IdentityArt for large illustrative moments.
  • Recoloured in a dye or stretched. Why: The identity uses ink or cotton and preserves its authored aspect ratio.

Anatomy

PartWhat it is
rootsvg lockup (mark and wordmark) inside a.wordmark.
markFour precisely joined turning modules, with an optical small cut.
wordmarkLoom in Archivo, outlined.

Made of: tokens:colour.

Used in: footer, header, task-header.

Variants

VariantWhenWhy
lockupExisting core/header at 26 px, 22 px up to 380 px viewport width; existing footer at 34 px.Mark and name identify the home link at the retained scale.
markStandalone identity assets at 32 px or above.The normal cut preserves joined-module detail at larger sizes.
mark-smallFavicon or compact asset at 16–24 px.An optical cut preserves open small-size joins; use lockup for the existing 22/26 px core and 34 px footer signature.
wordmarkStandalone outlined name with at least 24 px visible cap-height.The name can identify a standalone asset without adding a new expressive illustration.

States

StateRendered or not applicable
defaultdefault
hoverNot applicable: The parent link (wordmark) carries hover; the logo itself does not change.
focus-visibleNot applicable: The logo does not take focus; links and buttons inside it carry their own focus ring.
activeNot applicable: The logo cannot be pressed.
disabledNot applicable: The logo has nothing to disable.
loadingNot applicable: The logo is rendered at build time and is complete when the page loads.
emptyNot applicable: The logo is not rendered without content; the builder skips it.
errorNot applicable: The logo shows no data that can fail.
currentNot applicable: The logo has no current item.
visitedNot applicable: The logo is not a link.
expandedNot applicable: The logo does not open or close.

Tokens

PartToken
root.fillcurrentColor (ink on cotton, cotton on ink)
lockup.height26 px core; 22 px at viewport widths up to 380 px; 34 px in .footer-name
mark.height--logo-mark-height → --space-9 (32 px)
mark-small.height--logo-small-mark-height → --space-8 (24 px)
wordmark.height--logo-wordmark-height → --space-9 (32 px SVG; at least 24 px visible cap-height)
--logo-padding-space-3var(--space-3)
--logo-color-inkvar(--ink)
--logo-padding-left-space-5var(--space-5)
--logo-margin-left-space-5var(--space-5)
--logo-border-left-rule-hairvar(--rule-hair)
--logo-border-left-inkvar(--ink)
--logo-font-type-small-strongvar(--type-small-strong)
--logo-gap-space-3var(--space-3)
--logo-mark-heightvar(--space-9)
--logo-small-mark-heightvar(--space-8)
--logo-wordmark-heightvar(--space-9)

Layout

AspectValue
min22/26 px core lockup and 34 px footer lockup; 24 px optical small mark by default (supported 16–24 px); 32 px normal mark; 32 px wordmark SVG with at least 24 px visible cap-height
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; the existing core lockup is 22 px up to 380 px and 26 px above; the footer stays 34 px. Standalone variants retain their component-token sizes at these breakpoints and preserve their authored aspect ratios.
wrappingNever.
textExpansionThe outlined name does not expand; translated parent labels remain outside the SVG.

Spacing and rhythm

AspectValue
internalThe lockup's own clear space (one ribbon width (14/48 of visible mark); at least 6 px around the 26 px lockup).
externalSet by the existing header or footer; standalone assets retain their own clear space.
rhythmHeader and footer only.

Motion

AspectValue
NoneThe mark is still; it represents finished cloth.

Runtime and reuse

  1. Render-only element; mount any registered child enhancements separately. Preserve required Site CSS, fonts, responsive and locale rules from nativeElement.

Accessibility passport

AspectValue
roleInline variants are aria-hidden, nonfocusable SVGs; a labelled parent owns meaning. Standalone generated exports are named images.
nameExisting home link: Loom home / Loomホーム. Standalone asset: Loom, supplied once by the image or its parent.
keyboardThe SVG has no interaction. Existing home link retains native keyboard behavior.
focusExisting home link is first in the header after the skip link; standalone assets take no focus.
screenReaderThe parent link or standalone image supplies one name; no duplicate inline SVG announcement.
contrastUse measured current foreground/ground pairs; no inherited contrast numeral.
targetThe existing home link is 44 px tall; static asset variants are not interactive targets.

Content

SlotLengthVoice
accessible name on the owning link or standalone image (not a Logo prop)One concise name: Loom home for the home link, or Loom for a standalone identity imageThe inline SVG is decorative and hidden. Supply its purpose once on the owning link or image; do not announce both an image name and a duplicate wordmark.

Good: “Loom home” · “Loom”

Bad: “Logo” · “Loom logo Loom home (duplicate announcement)”

Japanese: The outlined wordmark stays Loom in every language. The existing Japanese home-link name is 「Loomホーム」 and belongs to the parent, not a translation prop on Logo. The standalone owner supplies the name once; no new placement or native review is established here.

Icons and illustrations

None: this element uses no icon or illustration of its own.

Decisions and exceptions

Usage

235 uses across the built pages (measured by npm run site:system).

Tests

AspectValue
unittests/unit/site-system.test.ts: renders every do and don't example through the registry and checks the classes it owns
visualNot yet: there are no screenshot baselines; the Library page is checked for sideways scroll at 1440 px by tests/site/system.spec.ts
a11ytests/site/system.spec.ts: axe (0 serious or critical) on the element's Library page in light and dark
parityscripts/site/system/check.ts: Library examples are rendered by the same render function the site imports

Figma

not-yet: The Loom Site Figma library is the last stage of the plan; this element is not mapped yet.

Open in Storybook

Start with a conversation about your system.

We read your system, show you what we found, and agree with your team what to fix first.