creatordesign system
GitHub
Collection sections
Collections · Creator Design System

Collection sections

The vocabulary a collection route is assembled from — every block, running, with the markup the real routes ship.

The vocabulary a route is assembled from. Every section below is a block you can drop into any route of any collection — that is what makes them worth having rather than being page-specific markup.

Each demo is the travel collection's own markup, called from its own builder. If a section only looks right inside one route, it is not a section yet.

Collection hero

A collection index has to say what it is before it starts listing. The art does the saying, so the copy can be short. It is decoration, so it is aria-hidden and it stops dead under reduced motion.

The travel collection

Every road, in order.

The lead sits under it.

.col-hero · .col-hero__art — the globe turns, the flight draws itself, the palm leans

The meta strip

"How much is here" is the second question after "what is this", so the numbers sit directly under the hero copy.

31posts
6countries
4trips
18cities

.col-meta — add .col-meta-paper when it is not on the dark hero

Groups — the widest cut

Icon, name, count. Anything more and it competes with the places below it.

.col-groups · .col-group — press one; aria-pressed carries the state

Places — a picture, a name, a sentence

The same three parts every collection card has, in a travel-shaped body.

.col-places · .col-place — the art is a placeholder, not a photograph, so the demo never depends on one

Spots — the narrowest cut

The smallest shape, so thirty of them can sit in a row without the page becoming a grid nobody reads.

Tokyo4 Kyoto2 Hanoi3 Lisbon3 Porto2 Tbilisi5 Cusco3

.col-spots · .col-spot

A series card

It shows the shape of the whole body of work: how many parts, over how long, and where it went.

The order — a series, laid out

The one thing a series has that a group does not is sequence, so it gets a spine. The rule stops at the last item rather than trailing into nothing.

Post rows

The list every route ends with. A row rather than a card, because by this point the reader is scanning titles, not looking at pictures.

The facet sidebar

Checkboxes, because more than one can be true at once, and native inputs so the keyboard works for free.

Filtering

Everywhere

Kind of place
Regions

.col-facets · .col-facet — or-within-a-facet: ticking beach and mountains means either, not both

Widgets — the rail beside a post

Every widget is the same object: a label, a body, sometimes a footer. Six of them read as one column rather than six competing boxes. A blog needs them most, but a course rail and a trip rail want the same shape — so they are shared.

Written by
Swarnil Singhai Builds things, then writes down what broke.
56 posts · since 2021
Newsletter

One email when something is worth reading. No schedule, because a schedule is how newsletters get padded.

.col-widget · .col-widget__title · .col-widget-accent for the one that is the point rather than a note

Numbered lists

Recent, popular, next. Numbers rather than bullets, because in these lists the order is the information.

Tags

A count beside each, so the shape of the cloud is data rather than decoration.

.col-tags · .col-tagaria-current marks the one you are filtered to

Reading progress

The same idea as the navbar hairline: a line already on the page doing a second job, rather than a new piece of chrome.

62% read

.col-progress — drive --value from scroll

The stage — a post whose body is a video

The media leads and the rest of the series sits beside it, because the second question after "play this" is always "what is after it". Course needed it first; nothing in it knows about courses.

← Previous
Lesson 6 of 14Layout14:02

Grid, in four rules

Next →

.col-stage · .col-stagebar — previous and next are the entire navigation of an ordered collection, so they get the width

The playlist

The syllabus, beside a player. It is .curriculum — the same modules, the same lesson rows, the same tick. All the modifier adds is a body that scrolls, because a contents list should not become a different component the moment it moves next to a video.

The transcript

Timestamps down the left, so the column of times is scannable and the line the player is on can be marked without the text moving.

Outcomes

What you will be able to do afterwards. A promise reads as a promise in a list and as marketing in a paragraph.

Read a design system as two tiers of tokens rather than a pile of classesBuild a layout with four grid properties instead of a frameworkSet a type scale you can defend in a reviewRation one accent colour so it still means something on page forty

.col-checks · .col-check

The offer and the files

The one card on a page that is asking for something, so it is the one that carries the accent. Beside it, what comes with the thing — rows, because a download is an action and actions read as a list.

Enrol
Free $49
14 lessons, 2h 06mStarter files for every lessonCertificate at the endYours once you have it
Start lesson one

Thirty days, no questions. The refund form does not ask why.

.col-offer · .col-files · .col-file

Resume

The strip at the top of an index for someone who has been here before. It outranks the hero's call to action, because "carry on" beats "start" for everyone it applies to and is invisible to everyone it does not.

Shortcuts and notes

A player has shortcuts whether or not it advertises them, and advertising them is cheaper than a help page. The note box keeps nothing — it is here because the shape of the page is wrong without somewhere to put a thought.

Shortcuts
Next lessonNPrevious lessonPMark completeM
They do nothing while you are typing
At 1:19

.col-keys uses the system's .kbd · .col-note

Next in series

The registry

Every section, where it is used, and whether it needs JavaScript. A section is only done when it works in both themes, at every width, and with the script blocked unless it is listed as needing it.

SectionUsed on
.col-heroindex — no JS
.col-searchindex, group — no JS
.col-metaindex, group, series — no JS
.col-groupsindex — no JS
.col-placesindex, group — no JS
.col-spotsindex, group, place — no JS
.col-facetsindex, group — needs JS
.col-seriesindex, place — no JS
.col-orderseries — no JS
.col-postseverywhere — no JS
.col-postpost — no JS
.col-nextpost, series — no JS
.col-rail · .col-widgetpost rails everywhere — no JS
.col-miniwidgets — no JS
.col-tags · .col-tagpost, index — no JS
.col-tocpost — needs JS only for scrollspy
.col-progresspost — needs JS
.col-stage · .col-stagebarpost, when the body is a video — no JS
.col-playlistpost — no JS
.col-transcriptpost — no JS
.col-panelpost — needs JS, and stacks under its own headings without it
.col-checksseries, place — no JS
.col-offerseries — no JS
.col-filespost, series — no JS
.col-keys · .col-notepost — no JS
.col-resumeindex — no JS
.col-mapplanned
.col-galleryplanned
.col-figuresplanned