Base styles

The document defaults every page starts from: the cotton ground, ink text, the type roles on h1 to h3 and body, links, focus, and the reset. One base per bundle (site, demos, health check, contact, tour).

Foundation · stable · v1.0.0 · owner: Site system lead · contract 19 of 20 points (open: figma)

Reference

Source reference; not an executed check.

ground
--cotton
text
--ink
links
--link

Do and don't

2 positive / 2 negative authored documentation examples (2 each required); 1 reference (1 required); 0 failed. References and failures do not count; this is not behavior acceptance.

Do: Semantic section heading

Authored by base.ts

Rendered consumer example; not an executed correctness check. heading Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: Base styles · Do: Semantic section heading Use the full-page example to follow page links.

The real heading keeps its semantic section level while using an existing compact type role supplied by the shared styles.

Do: Readable document text

Authored by base.ts

Rendered consumer example; not an executed correctness check. text Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: Base styles · Do: Readable document text Use the full-page example to follow page links.

The native paragraph inherits the common reading defaults; no page-specific type or colour is invented.

Don't: A component selector placed in base CSS

Authored by base.ts

Rule illustration; not an executed check. base / base.elements-only

styles/core/base.css
.promo-tile { padding: var(--space-8); }
A component-specific class belongs to that component's stylesheet, rather than becoming an undocumented document default.

Don't: A page-specific default for every heading

Authored by base.ts

Rule illustration; not an executed check. base / base.elements-only

styles/core/base.css
.campaign-page h2 { color: var(--madder); }
A local page decision in the base layer couples global defaults to one consumer; illustrate the misplaced ownership without editing base styles.

Rules

RuleWhyCheck
Base styles target elements (h1, p, a), not classes, except the shared field contexts.Classes belong to elements; base is the default.Automated: scripts/site/system/check.ts (ownership)

API

No props.

Contract details

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

Identity

AspectValue
Idbase
LayerFoundations
Categoryfoundation
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/foundations/base.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Base styles as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • Loaded first in every bundle. Why: Elements build on one shared default.

Do not use when

  • To style a specific element. Why: Element styles live in the element's own stylesheet.

Anatomy

PartWhat it is
sitestyles/core/base.css, styles/site/base.css
appsstyles/{health-check,contact,tour,ja-display}/base.css

Made of: nothing (a base element).

Used in: pages directly.

Variants

VariantWhenWhy
light and darkEvery page, following the reader's setting.The same roles resolve to light or dark values, so no element chooses its own.

States

StateRendered or not applicable
defaultThe specimen.
hoverNot applicable: A foundation is not interactive.
focus-visibleNot applicable: Not focusable.
activeNot applicable: Not interactive.
disabledNot applicable: Nothing to disable.
loadingNot applicable: Values are built into the stylesheet.
emptyNot applicable: The build fails if a value is missing.
errorNot applicable: Unresolved values fail the brand gate, not the reader.
currentNot applicable: No current item.
visitedNot applicable: Not a link.
expandedNot applicable: Does not open.

Tokens

PartToken
body.background--cotton
body.color--ink
a.color--link
:focus-visible--focus

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; columns stack under 768 px; the wrap keeps a 16 px gutter on phones.
wrappingText wraps; nothing scrolls sideways.
textExpansionJapanese runs 20 to 40% longer; headings break between phrases (jaBreaks) and blocks grow downwards.

Spacing and rhythm

AspectValue
internalNot applicable: a foundation has no box of its own.
externalNot applicable.
rhythmApplies to every element that reads it.

Motion

AspectValue
NoneA foundation does not move.

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
roleNot rendered on the site; its specimen in the Library is a list
nameThe foundation's name
keyboardNot interactive.
focusNot focusable.
screenReaderThe specimen is a plain list of names and values.
contrastEvery text and ground pair in the palette is checked (check-brand).
targetNot a target.

Content

SlotLengthVoice
document headings and paragraphs (consumer-owned)Heading or page-template budgets; base CSS imposes no copy lengthUse semantic headings and readable paragraphs. Base styles supply defaults, not permission to turn body copy into a visual heading.
link wording (consumer-owned)The link element's declared budgetName the destination or action in the words; the shared underline and focus treatment do not explain a vague label.

Good: “What happens next (Heading's section title)” · “Book a conversation (Button's named destination)”

Bad: “OVERVIEW (Heading's rejected capitals label)” · “Click here (Button's rejected vague label)”

Japanese: The document or consuming element sets Japanese language and wording; base CSS supplies :lang(ja) line breaking, headings with zero letter spacing and non-italic emphasis. Keep token and code names unchanged. Recheck Japanese wrapping and preserve the native-review-pending notice; these defaults do not translate content or complete native review.

Icons and illustrations

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

Decisions and exceptions

  • None.

Usage

376 owned-class occurrences in built pages plus metadata-token references in built CSS (measured by npm run site:system).

No application mechanism is declared.

Current check result: not assessed by this report. Declarations and source-file presence do not establish executed enforcement or accepted coverage.

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.