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 abbreviate4c · 5050 · fw. The human path keeps the descriptive group label ("Foreseeable"); the id uses the code (4c).
  • The base composition is spelled outessentials, not ee.
  • Embedded families are spelled outspeakers · 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.