Specs · v0.3

The WDS Object Framework

One model for naming, categorising and cataloguing every object in the design system — so the team that builds the components and the people who assemble pages share one language.

Status: v0.3Reconciles: the build taxonomyScope: Page chrome · tiers · namingAudience: design + build
01

Building & Authoring

Core model

The system is described two ways. They describe the same objects — and meet at the catalogue.

Building

Coding the system. Define Components, Elements, Foundations and Partials so they're reusable and re-skinnable per client.

Audience · the build team
Authoring

Assembling pages. Pick Blocks and Components from the catalogue and arrange them into a page.

Audience · page-builders

The full stack, top to bottom — the Page frame (Chrome), the content tiers that nest inside it, and the build layer beneath the assembly line.

PageThe published output. A frame (Chrome) wrapping assembled content — what a visitor sees.Result
ChromeThe frame around the content: the App Bar and the Footer. The persistent shell, not rungs on the nesting ladder (§02).Shell
SectionA titled band of the page — groups Blocks under one heading or surface. The outermost content tier.Author
BlockA drop-in page section you place and configure — "Event Grid", "Featured Banner", "Agenda". The unit of page-building.Author picks ★
ComponentA complete, self-contained object — Event Card, Replayer, Channel Card. Arrives inside a Block.Author · via Block
assembly line
ElementA reusable sub-piece shared across objects — Time Row, Date Stack, Speaker Row, Button. Built once, composed in.Build team
FoundationsThe Brand Pack: colour, type, spacing, icons. Shared once; never duplicated per object.Build team
PartialA core build primitive — the Blade mechanism objects are assembled from. As important as any other tier; the build team's day-to-day.Build team
Two surfaces, not one
  • Authoring catalogue (above the line): Blocks and Components — what a page-builder assembles.
  • Brand Pack (our public design system): Foundations, plus selected Elements — buttons, icons — plus Components, published as brand decisions. This site is it.
  • Surfacing is its own axis: tier is what an object is; Surface is where it's published.
  • Partials are foundational — a critical build primitive and the build team's focus. They aren't shown in the authoring catalogue, but that's a question of surface, not importance.
02

Page chrome

Page-level

A Page is a frame around content. The frame is Chrome: the persistent shell (the App Bar and the Footer). What it wraps is Content, the nesting ladder (§03). Chrome sits alongside the content tiers; it is not a rung on the ladder.

App BarThe persistent top bar: workspace logo, primary wayfinding and sign-in.
ContentEverything the shell wraps: the Section → Element nesting ladder (§03). Page and event headers live here, not in chrome.
FooterThe persistent bottom region: secondary links, meta and legal. May be a custom footer per hub.
!
Navigation is a content element, not chrome.
Wayfinding chrome is the App Bar. The Navigation element is a separate reusable built object placed within content. Chrome frames the page; the Navigation element sits inside it. The path disambiguates which one is meant.
03

Section, Block, Component & Element

The content tiers nest, largest to smallest — a Page breaks into titled Sections, a Section groups Blocks, a Block arranges Components, and a Component is built from Elements.

Page BlockAuthor picks ★

A page section — one or more Components arranged and configured for a slot. This is what an author drops onto a page.

ComponentAuthor · via Block

A complete, self-contained object with its own shell — built from Elements, and themeable on its own.

ElementBuild team

The smallest reusable piece — one job, one slot, used across several objects. Built once; authors never place it directly.

Page→ Section→ Block→ Component→ Element — each contains the one to its right; the Page wraps its Sections in chrome.
Note
  • Some Elements are published in the Brand Pack — our public design system. A Button (Element) and icons (Foundation) appear there as brand references, even though authors never place them on a page. That's the Surface axis, not the tier.
04

Naming

Convention

A name is a path through the catalogue: Family → Bucket → Group → Variant. The component's id derives from that path, agreed jointly between Build and Authoring.

Family→ Bucket→ Group→ Variant
the content type·the role it plays·variants on the bucket's one axis·the built component
Events→ Cards→ Foreseeable (4C)→ Essentials + Media + Speakers
id derives →event-card-4c-essentials-media-speakers
Id conventions
  • Container spans abbreviate — 4c · 5050 · fw. The human path keeps the descriptive group label ("Foreseeable"); the id uses the code (4c).
  • The base composition is spelled out — essentials, not ee.
  • Embedded families are spelled out — speakers · sponsors · photos · video.
  • Span is in the id; size is not. The Group segment carries the container span (4c · 5050 · fw — the footprint). Size (density · S/M/L) is a parameter on the component, like mode — addressable for overrides, never an id segment.

The axes the name does not carry — each lives on its own axis:

AxisWhat it isExamples
NameThe path. Fixed — one per component; carries the span (Group).Events → Cards → Foreseeable (4C) → Essentials + Media + Speakers
StateFacts the data carries. Select or modify rendering; never in the name.live · replay
SettingConfigured per use, not built in.feed · placement · layout · spotlight · field visibility
ParameterComponent inputs set per instance, addressable for overrides.mode (LM/DM) · size (S/M/L density)
1
One grouping axis per bucket.
The grouping axis is a property of the bucket, not the system — each bucket declares exactly one, and it differs by bucket because the buckets are different kinds of object. A bucket is settled when you can name its single axis in one word. Flexible: which axis, and which buckets a family has. Fixed: one axis per bucket (never a mix), and the id derives the same way regardless.
2
Object vs arrangement vs block.
A Card is the single-event object (the atom, cardinality event). A Listing is a self-contained component that arranges a set of cards (cardinality event[]) within a sub-page 4C/6C container. A full-width listing is not a component at all — at full width the Block arranges the cards itself, so it lives in the Block tier (Page → Section → Block → Component → Element). Don't model the full-width case as a Listing component.
Why path-derived ids
  • One object = one identity across design, code and catalogue. Every object is named once, and the path is the contract between Build and Authoring — no object ships until both sides sign off.
  • The design file says Event Card/Featured; older build code says event_featured_card — same object, two names. Fix: one canonical path, the id derived from it (event-card-4c-essentials-media-speakers), so the two systems can't drift.
05

What's next

Three moves turn this model into a worked catalogue.

Sequence
  • Work the Events family as the template — five buckets (Heros · Banners · Cards · Listings · Backchannel), each declaring its one grouping axis; name the roster.
  • Extend to the sibling families — Channels · Speakers · Sponsors · Themes get the same bucket page; confirm per family which buckets earn a place.
  • Fill each component's contract in CoWork — catalogue id, content, Brand Pack tokens and build, per component, all derived from its path.
WDS Object Framework — Spec v0.3
Splits Page chrome (App Bar · Footer) from the content nesting ladder (Section → Block → Component → Element), and names every object as a path — Family → Bucket → Group → Variant — from which the id derives. Each bucket declares one grouping axis. Draft — scope is page chrome, tiers and naming; spacing, shadows and radii are out of scope for now.