Skip to content

Job Board Template

A listings skeleton: a filter that actually filters, a real list, and no invented urgency. The postings are sample data and say so — the pattern is the deliverable.

0
MIT licensev1.0.02 KB gzipzero dependenciesby Motif Studioadded 2026-09-24review due 2026-12-23
Live playground — drag, click, hoversandboxed previewsample copy

Open roles

  • Design engineer

    Design systems · Remote (EU) · Full-time

  • Front-end engineer

    Marketing site · Remote (global) · Contract

  • Accessibility engineer

    Platform · Berlin · Full-time

  • Docs writer

    Developer relations · Remote (Americas) · Part-time

4 of 4 sample postings — the roles are illustrative, the filter is real.

Ambience
vibes

Ambience is a live light wash over the preview. Full palette re-theming of every demo arrives with Theme Studio (Pro).

deps: zeroJSX + TailwindMIT · original
template-job-board.tsx
// Job Board Template — the demo's own source, extracted verbatim.
// From src/components/demos/scenes/set-21.tsx, export JobBoardTemplate.
// Needs React 18+ and Tailwind CSS v4. The classes below include this site's
// token utilities (bg-panel, text-ink-dim, chip …); their values are served as
// CSS custom properties at /api/exports/tokens.json. The reduced-motion branch
// is part of the source, not an afterthought.
// 2 helpers the demo imports are inlined above it, verbatim.

import { useState } from "react";

const JOB_POSTINGS = [
  { role: "Design engineer", team: "Design systems", place: "Remote (EU)", type: "Full-time" },
  { role: "Front-end engineer", team: "Marketing site", place: "Remote (global)", type: "Contract" },
  { role: "Accessibility engineer", team: "Platform", place: "Berlin", type: "Full-time" },
  { role: "Docs writer", team: "Developer relations", place: "Remote (Americas)", type: "Part-time" },
];

const JOB_FILTERS = ["All roles", "Remote only"] as const;

export function JobBoardTemplate() {
  const [filter, setFilter] = useState<"all" | "remote">("all");
  const postings = filter === "remote" ? JOB_POSTINGS.filter((j) => j.place.startsWith("Remote")) : JOB_POSTINGS;

  return (
    <div className="flex h-full w-full items-center justify-center bg-[#08090f] px-4 py-8">
      <div className="w-full max-w-md rounded-2xl border border-white/10 bg-[#0c0e14] p-4">
        <div className="flex flex-wrap items-center justify-between gap-2">
          <p className="text-[10px] font-bold uppercase tracking-[0.24em] text-emerald-300/70">Open roles</p>
          <div role="group" aria-label="Filter roles by location" className="flex gap-1">
            {JOB_FILTERS.map((label, i) => {
              const value: "all" | "remote" = i === 0 ? "all" : "remote";
              return (
                <button
                  key={label}
                  type="button"
                  onClick={() => setFilter(value)}
                  aria-pressed={filter === value}
                  className={`rounded-lg px-2 py-1 text-[10px] font-semibold transition-colors ${
                    filter === value ? "bg-emerald-400/20 text-emerald-100" : "text-ink-faint hover:text-ink"
                  }`}
                >
                  {label}
                </button>
              );
            })}
          </div>
        </div>
        <ul className="mt-3 space-y-1.5">
          {postings.map((job) => (
            <li key={job.role} className="rounded-xl border border-white/8 bg-white/4 px-3 py-2">
              <p className="text-[12px] font-semibold text-ink">{job.role}</p>
              <p className="mt-0.5 text-[10px] text-ink-faint">
                {job.team} · {job.place} · {job.type}
              </p>
            </li>
          ))}
        </ul>
        <p className="mt-3 border-t border-white/8 pt-2 text-[10px] text-ink-faint">
          {postings.length} of {JOB_POSTINGS.length} sample postings — the roles are illustrative, the filter is real.
        </p>
      </div>
    </div>
  );
}

Snippet provenance

lines 1–65 · v1.0.0
v1.0.0Motif Studio2026-09-24the only version the catalog records for this asset

No changelog entry mentions “Job Board Template”, so the catalog records a single version for it.

Every line above is attributed to the single version this catalog records — we keep no per-line history, so no per-line attribution is invented. See the provenance page for the rule and the gaps.

Review notes · anchored to code lines

Threads attach to a line number in this asset's snippet, so a remark about the focus trap stays next to it.

demo · stored in this browser

Loading notes…

The snippet on this page is 65 lines long, so anchors run 1–65. Notes are per-asset and per-browser; a shared review thread is a server feature, and this panel is the local stand-in that proves the anchoring works.

Dependency-aware copy: zero packages to install — paste and run. All markup is original Motif UI content (MIT).

Course rail — understand it before you ship it

Theme Studio preview

Theming example — two token themes

Assets are token-driven (100% design-token driven). Here the same scene runs under two theme presets from the token sheet.

Midnight / violet

Open roles

  • Design engineer

    Design systems · Remote (EU) · Full-time

  • Front-end engineer

    Marketing site · Remote (global) · Contract

  • Accessibility engineer

    Platform · Berlin · Full-time

  • Docs writer

    Developer relations · Remote (Americas) · Part-time

4 of 4 sample postings — the roles are illustrative, the filter is real.

--accent 262 · dark surfaces

Bone / amber

Open roles

  • Design engineer

    Design systems · Remote (EU) · Full-time

  • Front-end engineer

    Marketing site · Remote (global) · Contract

  • Accessibility engineer

    Platform · Berlin · Full-time

  • Docs writer

    Developer relations · Remote (Americas) · Part-time

4 of 4 sample postings — the roles are illustrative, the filter is real.

--accent 40 · paper surfaces

90-second read

Usage recipe — where this fits

Start here when a page shape is 80% of the battle — a landing, a changelog, a waitlist — then replace the demo voice with yours.

Duplicate the template, re-theme the tokens, then replace sections one at a time so the layout never breaks mid-edit.

belongs in templatesclick behaviour

Cost honesty

Performance note

2 KB gzippage-scale — a whole page — budget images first; the interactive parts are a small fraction of the weight.

Cheaper alternative — compose the same page from section assets to strip what you do not need.

What it needs

Browser support strip

CSS Gridnext/image or picturecustom propertiesscroll-margin for anchorsall evergreen browsers

No polyfills ship with the asset — if a listed feature is missing in a target browser, the graceful fallback is the static layout.

prefers-reduced-motion

Reduced-motion fallback

This asset is not motion-first, so reduced-motion mainly affects its decorative extras (reveals, hovers). The content layer never depends on motion to be readable.

Pressable step-through

Keyboard walk demo

Step through what a keyboard user experiences with this asset.

1

Skip link jumps to main content

Auto-suggested

Composition map — what pairs well

One original micro-case

Inspiration context

The landing that loaded before the hero photo

A template-heavy landing shipped with a 2MB hero image, so the headline appeared 4 seconds late on 3G. The fix: a skeleton shell in the template's own layout plus width/height on the image. Perceived load dropped to under a second because the frame painted first.

Written in-house — no screenshots, no borrowed imagery. The pattern, not the pixels.

Every version, why

Changelog — this asset

v1.0.02026-09-24

Current release — this page documents the asset as shipped.

v1.0.02026-08-18

Token pass: colours and radii moved to the design-token sheet; a11y score raised to the current bar.

v0.1.02026-07-02

Initial release to the library — original markup, MIT licensed.

30-day sparkline

Copy history

0copies this month

Sample series from this asset's usage fingerprint · last 12 days shown.

Future queue

Community remixes

Queue opens after launch. Remixes arrive as alternate versions of this asset — same job, different voice — submitted by users and audited by the studio before they appear beside the original.

0 remixes yetaudited by studiocredit + link back to the remixer

Star / favourite

Save this asset

Your collection is stored in this browser (localStorage) — no account needed.

Build a page around it

Pairs well with a prompt

This asset belongs inside a bigger build — here is the prompt that would generate a page containing it:

SaaS onboarding — activation in one flow

Welcome checklist · Plan step · Invite step

verified

Exact tree

Bundled dependencies — disclosed

template-job-board.tsx3.0 KB raw · ~1 KB gzip
(no runtime dependencies)the CSS ships with the snippet

Full snippet ≈ 3.0 KB raw, ~1 KB gzip — before any framework you already load.

Download

Export as single file

Grab the asset as one file, ready to paste into your project.

Files are generated in your browser from the snippets on this page — nothing leaves the tab.

Scale, not clutter

Sizing system — three densities

Density is a token decision, not a per-page override — pick one density per product surface and hold it. Active: Default.

Runnable copy

Open in a sandbox

Opens this asset in a new tab with its stylesheet injected — a real, editable HTML document in your browser. No account, no upload.

If the tab is blocked, use the single-file export instead — same content, saved locally.

Written version first

Tutorial transcript

This asset does not have a video yet — so the written version stands in: the code line walk below narrates the snippet line by line, and the design rationale on this page explains the default decisions. When a video ships, this exact panel hosts its full transcript.

video: not yettranscript: line walk belowformat: markdown, searchable

Annotated snippet

Code line walk

The lines that matter, with the reason they matter. Click one:

Trade-off, visible

Size vs. quality slider

~2 KB~6 KB~12 KB

Standard · CSS + hover states

~6 KB

adds transitions, focus-visible and reduced-motion rules

The slider is honest: the slim tier has no JS, the pro tier pays for behaviour. Start slim, upgrade only the surfaces that need it.

HTML → React, priced

Stack-switch cost note

Taking the HTML/CSS version into a React component costs real work — and the cost is predictable:

Event wiring

Hover, focus and click become handlers — the CSS stays, the state appears.

Props for the knobs

Every inline value that should vary becomes a prop with a default — the defaults must match the CSS exactly.

The estimate

A clean port of this asset is 20–45 minutes for a React developer — the 0-character stylesheet is the easy half.

Find it the way you say it

Tag synonyms

Search on this site resolves synonyms globally — "dropdown", "select" and "picker" land on the same asset, so you never need to know the catalog's internal vocabulary.

When to pick which

Sibling comparison

Data table — data table
CompareJob Board TemplateSaaS Launch PageAgency Showcase
KindTemplatesTemplatesTemplates
Bundle2 KB gzip24 KB gzip21.3 KB gzip
a11y98/10097/10095/100
Dependenciesnonenonenone
Copies / mo01,6801,120
Interactionsclickscroll, clickscroll, hover

The honest verdict — Job Board Template is the lighter default here; reach for SaaS Launch Page when its extra weight buys an interaction this one lacks.

Who made it, when, audited

Provenance tags

studio originalby Motif Studiopublished 2026-09-24MITa11y audit 98/100editorial audit 93/100v1.0.0

Every template ships with its origin and its audits visible — provenance is part of the product.

Honest effort cue

Time-to-build meter

~3

copy-copies to assemble this build

(copy a section, paste your copy, move on)

one tile = one copy-paste round trip

The build, measured

Case-study numbers

Page weight

~2 KB gzip

stylesheet + template markup, before your images

Requests

~4

estimates CSS + fonts + the first screen's assets

Copies / mo

0

how often this template was copied this month

Two token themes, live

Rebrand playbacks

Open roles

  • Design engineer

    Design systems · Remote (EU) · Full-time

  • Front-end engineer

    Marketing site · Remote (global) · Contract

  • Accessibility engineer

    Platform · Berlin · Full-time

  • Docs writer

    Developer relations · Remote (Americas) · Part-time

4 of 4 sample postings — the roles are illustrative, the filter is real.

One template, two token sheets — the build survives a rebrand without structural edits.

Same build, both modes

Dark / light template twins

dark twinprefers-dark

Open roles

  • Design engineer

    Design systems · Remote (EU) · Full-time

  • Front-end engineer

    Marketing site · Remote (global) · Contract

  • Accessibility engineer

    Platform · Berlin · Full-time

  • Docs writer

    Developer relations · Remote (Americas) · Part-time

4 of 4 sample postings — the roles are illustrative, the filter is real.

light twinprefers-light

Open roles

  • Design engineer

    Design systems · Remote (EU) · Full-time

  • Front-end engineer

    Marketing site · Remote (global) · Contract

  • Accessibility engineer

    Platform · Berlin · Full-time

  • Docs writer

    Developer relations · Remote (Americas) · Part-time

4 of 4 sample postings — the roles are illustrative, the filter is real.

Swap the lead, compare pairings

Section swap explorer

Try a different lead section under this template's frame:

✦ New · 121 verified prompts
Ship pages that feel alive

Copy-ready components and AI prompts, tested before you paste.

Browse libraryTry the Lab
Aurora Hero Section — Sectionsopen asset →

Swap comparisons: which lead says more about the template's audience? The best pairing is the one whose voice matches your copy.

Start your own build

Blank-canvas pack

Build a template from a checklist instead of a blank page. Tick the sections your page needs:

4 sections chosen — a sane first build is 3–5. The checklist rides along in the JSON export.

CLI-ready

Copy the entire build — JSON spec

Export this template's build as a machine-readable spec — paste it into a future Motif CLI to reproduce the assembly.

{
  "spec": "motif-build/v1",
  "template": "template-job-board",
  "title": "Job Board Template",
  "author": "Motif Studio",
  "published": "2026-09-24",
  "stack": [
    "React"
  ],
  "theme": {
    "mode": "dark",
    "hue": 262
  },
  "sections": [
    "hero",
    "proof",
    "feature",
    "footer"
  ],
  "lead": "hero-aurora",
  "license": "MIT"
}

How this page is assembled

Recipe cards

The parts that make up this build, and the library assets that play each part:

Features

capabilities at a glance

Close

one calm action to end on

React vs HTML — see the diff

One-click stack selector

The static build

1 lines of dependency-free CSS — paste and run.

Sample of the stylesheet ready in this template:

Diff verdict: same visuals, zero runtime — the cheapest version.

Accept & moderate

Community template submissions

Templates built by the community can join this gallery. The flow is explicit: submit a build URL + the asset list → studio audit (originality, a11y, size) → published beside the originals with credit.

queue opens after launchaudit: originality · a11y · sizecredit + backlink to the builder

Zip of assets + README

Template bundle downloads

One zip for offline use: the stylesheet, a blank index.html shell with it wired in, the JSON build spec and a README that tells the next person how to rebrand and where the recipe lives. No account, no build step.

README.mdbuild.jsonstyles.cssindex.html

Packaged client-side as a classic (uncompressed) zip — open with any OS unzip tool.

Read next — two guides and a prompt

picked by tag overlap, not by hand

How these three were chosen: essays scored on shared tags (0 and 0 matches), then prompt scored on block/vibe overlap (1 matches). The rule lives in src/lib/spine.ts, so the same asset always links to the same three pages and a second reader can reproduce the choice.

–remixes · this browser

The counter is a note to yourself — it adds one each time you tap, in motif:remix-count:v1, and goes nowhere. A real, public remix count would need a server and accounts; this site has neither, and it would rather say that than print a number it cannot own.

Was this helpful?