Task page

The whole document of a stand-alone app (contact form, health check, team survey, their privacy pages): focused header, the task in one column, a compact footer with the data note.

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

Do and don't

Do: Health check

Rendered by task-page.ts

Open example: Task page · Do: Health check Use the full-page example to follow page links.

One task, one column.

Do: Privacy page

Rendered by task-page.ts

Open example: Task page · Do: Privacy page Use the full-page example to follow page links.

The same shell for its notice.

Don't: The site navigation

Rendered by task-page.ts

Open example: Task page · Don't: The site navigation Use the full-page example to follow page links.

A task page keeps the reader on the task.

Don't: A woven edge above the footer

Rendered by task-page.ts

Open example: Task page · Don't: A woven edge above the footer Use the full-page example to follow page links.

Task and footer are both cotton.

Rules

RuleWhyCheck
Task pages are generated from this template at build time; no hand-written page HTML.One shell keeps every task page consistent and checkable (closes EX-SITE-004).Automated: scripts/site/system/check-pages.ts (task pages follow page-apps)

API

PropTypeRequiredDefaultWhat it does
titlestringYesDocument title.
descriptionstringNoMeta description.
noindexbooleanNofalseKeep out of search.
commentstringNoAn internal note kept as an HTML comment.
alternatesobjectNoEnglish and Japanese paths.
styleslistYesThe app's stylesheets after /css/brand.css.
scriptstringNoThe app's module script.
skipI18nbooleanNofalseThe skip link is translated by the app.
headerobjectYesTask header props.
langBannerbooleanNofalseMount for the app's language banner.
bodyhtmlYesThe task body (Task body template).
announcerbooleanNofalseA polite live region for the app.
footerobjectNoTask footer props.

Contract details

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

Identity

AspectValue
Idtask-page
LayerTemplates
Categorysection
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/templates/task-page.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Task page as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • Pages where the reader does one task and the app's own script runs. Why: One shell for every task page: the same head, header, skip link and footer, composed from registered elements.

Do not use when

  • Content pages. Why: They use the page shell with the site header and footer.

Anatomy

PartWhat it is
headMeta, title, alternates, the brand stylesheet, the app's stylesheets and script
skipa.skip-link
headerTask header
bannerp.lang-banner (filled by the app)
mainmain#main with the task body
announcerdiv#announcer (aria-live)
footerTask footer

Made of: task-header, task-footer, task-body.

Used in: page-apps.

Variants

VariantWhenWhy
defaultWherever the page declaration places it.One shape per job keeps pages predictable.

States

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

Tokens

PartToken
page.ground--cotton

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
internalThe task body's own padding.
externalWhole document.
rhythmHeader, task, footer, all on cotton: no woven edge (D-SITE-003).

Motion

AspectValue
NoneNo intrinsic element animation. The optional claude-entrance consumer profile may translate below-fold structure once (20px, --dur-weave, --ease-enter, --stagger); reduced motion disables it. This preserved baseline entrance is separate from element playback.

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
roleregion (section) named by its heading
nameIts h2, by aria-labelledby
keyboardLinks and buttons inside, in reading order.
focusThe --focus ring on every link and button inside.
screenReaderRead in source order; decorative weaving is aria-hidden.
contrastInk on cotton 14:1; text on every dye field 4.5:1 or better (checked by check-brand).
targetLinks and buttons are 44 px tall.

Content

SlotLengthVoice
title6 wordsThe task · Loom

Good: “Contact · Loom”

Bad: “Loom | Contact Us Page”

Japanese: Japanese is filled by each app's script from its i18n/ja.json; /ja/contact/ is filled at build time.

Icons and illustrations

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

Decisions and exceptions

Usage

7 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.