Template Vanilla Site MIT
Job Board
A dense, structured developer job-board template for DevSnips built with semantic HTML, CSS, and vanilla JavaScript. Light, neutral, and information-dense: a sticky navigation bar with a responsive mobile menu, a jobs view with keyword search plus location and job-type filters, category chips, a result count, and a paginated job list; a job detail view with company sidebar (apply / save) and a details sidebar; a companies directory grid and a company detail view with open positions; a saved jobs view with an empty state; and a candidate area with a sidebar and profile, applications (status table), and saved-jobs tabs. Includes a scoped apply modal, toast notifications, and a mobile filter drawer. Split into modular files: code.html (HTML structure) + style.css (the design system, following the shared design-tokens.md --ds-* token layer with an opt-in dark mode and reduced-motion guard) + script.js (all views, rendering, filtering, pagination, save/apply, and interactions), with preview.html as a self-contained single-file preview of the UI. No React, Vue, Next.js, Tailwind, Bootstrap, backend, database, or job-posting API.
- Vanilla
- HTML
- Pages
- Site
- Stack
- Vanilla HTML/CSS/JS + HTML
- Theme
- System
- Responsive
- Yes
- Files
- 7
- License
- MIT
Preview
The whole site, live.
Scroll inside the frame, switch viewports, or open the raw preview in a new tab — it is the same file the CLI installs.
devsnips.dev/templates/vanilla/job-board/ What's inside
Everything the folder ships.
Straight from the registry's metadata — every line maps to a file you can open in the source tabs below.
- sticky navigation with responsive mobile menu (aria-expanded toggle)
- jobs view with keyword search (title, skill, company, location)
- location and job-type filter selects
- category filter chips (all, remote, frontend, backend, full stack, devops, data, design)
- live result count
- paginated job list (8 per page) with prev/next and numbered pages
- job cards with company logo letter, title, company, meta (location, salary, work mode, posted), and skill tags
- save / unsave jobs (bookmark) with toast feedback
- job detail view with description, responsibilities, requirements, skills, and benefits plus a company info sidebar and apply/save actions
- companies directory grid (auto-fill responsive cards)
- company detail view with about, info sidebar, and open positions list
- saved jobs view with empty state
- candidate area with sidebar (avatar, name, role) and profile, applications, and saved tabs
- applications table with status badges (applied, pending, shortlisted, interview, rejected, accepted)
- scoped apply modal (role=dialog, aria-modal, Escape to close, click-overlay to close)
- toast notifications (success and default)
- mobile filter drawer (location, type, category chips) with overlay and Escape handling
- single-page view switching (jobs, job detail, companies, company detail, saved, candidate)
- opt-in dark mode via prefers-color-scheme (calm inverted system, accent preserved)
- reduced-motion support (prefers-reduced-motion disables animations and smooth scroll)
- DevSnips --ds-* shared design-token layer (design-tokens.md) with template tokens mapped on top
- modular file split (code.html + style.css + script.js)
Technical
Stack, scripts, structure.
Everything you need to know before you install.
root 4
-
AGENTS.mddoc -
metadata.jsonconfig -
preview.htmlpreview -
README.mddoc
pages/ 3
-
code.htmlcode -
script.jscode -
style.csscode
Install
One command, whole folder.
Pulls the template into your project through the DevSnips CLI. The registry path below is stable across the CLI, MCP server and Skills.
npx devsnips add Vanilla/Templates/job-board Vanilla/Templates/job-board AI-ready
Hand the whole job to your agent — Cursor, Cline, Claude Code or Windsurf. One prompt installs the template, fixes the theme toggle, optimises it and reshapes it for what you are building.
Scaffold the DevSnips template "Job Board" (Vanilla/Templates/job-board) into this project, then audit, fix and tailor it. 1. Install — if the DevSnips MCP server is connected, fetch the resource with get_resource(id="Vanilla/Templates/job-board"). Otherwise run npx devsnips add Vanilla/Templates/job-board and install the dependencies the template declares. 2. Audit — check the template end to end before changing anything: theme toggling (dark/light), responsive behaviour, accessibility, unused files and assets. 3. Fix — repair what the audit found, starting with the theme toggle: it must persist across reloads, never flash the wrong theme on first paint, and every component must read the same tokens in both modes. 4. Optimise and adapt — trim what the site does not need, then customise the template for the product being built here: replace the placeholder branding, copy, imagery, navigation and routes so it reads as this project rather than as a demo.
devsnips://templates/job-board The same path the CLI, MCP server and Skills resolve — one registry, one resource URI.
Source
Read it before you ship it.
The README, manifest and entry document — verbatim, straight from the registry.
# Job Board Template (Vanilla)
A dense, structured **developer job-board** template built for DevSnips with
semantic HTML, CSS, and vanilla JavaScript. The template is split into modular
files — `code.html` (HTML structure) + `style.css` (the design system) +
`script.js` (all views, rendering, filtering, pagination, save/apply, and
interactions) — with `preview.html` as a self-contained single-file preview of
the UI so you can open it directly and see exactly how the template looks.
**Technology:** vanilla
**Category:** templates
**Subcategory:** job-board
**Type:** single-page (one-page job-board application with view switching)
## Files
```
Job Board/
├── code.html # HTML structure (links style.css + script.js) — the modular source
├── style.css # the design system (DevSnips --ds-* tokens + Job Board template tokens)
├── script.js # views, rendering, search, filters, pagination, save/apply, mobile nav + drawer (vanilla JS, no deps)
├── preview.html # single-file preview of the UI (inlines style.css + script.js) — open this to see it
├── metadata.json # DevSnips registration metadata
└── README.md # This file
```
No `assets/` directory is required. The template uses no local images, icons,
or fonts. Company logos are rendered as single-letter text avatars, status and
meta indicators use inline SVG and emoji, and the fonts (Inter and JetBrains
Mono) are loaded from Google Fonts (see **Dependencies**).
## Preview
Open `preview.html` directly in a browser to see the template — it is a
self-contained single-file preview that inlines the CSS and JS:
```bash
cd "Vanilla/Templates/job-board"
python3 -m http.server 8080
# visit http://localhost:8080/preview.html
```
For development and customization, work with the split files — open `code.html`
(which references `style.css` and `script.js` relatively) in the same served
folder. The whole template runs without a build step. The only external requests
are Google Fonts (Inter and JetBrains Mono), loaded from a CDN.
Per the shared `design-tokens.md` convention, the template folder contains
exactly **one** `preview.html`. It is the canonical preview shown by the DevSnips
website. It is fully responsive, uses the template's real CSS/JS, uses relative
paths, and loads correctly when opened directly.
### Architecture
The template is split into three modular files plus a single-file preview:
- **`code.html`** — the HTML shell (navigation, jobs view, job detail view,
companies view, company detail view, saved jobs view, candidate area, apply
modal, toast container, and mobile filter drawer) that links `style.css` and
`script.js`. This is the modular source you customize.
- **`style.css`** — the entire design system: the DevSnips `--ds-*` shared token
block (per `design-tokens.md`), the Job Board `--template-*` and original
`--color-*` tokens mapped onto the shared layer, base/typography/button styles,
every view and component style, the responsive breakpoints, the opt-in dark
mode override, and the reduced-motion guard.
- **`script.js`** — the runtime: application data (10 companies, 24 jobs,
applications), view state, render functions (job cards, job list, pagination,
job detail, company directory, company detail, candidate tabs), search and
filtering, save/apply, the apply modal, toasts, mobile nav, and the mobile
filter drawer. No dependencies.
- **`preview.html`** — a self-contained single-file preview that inlines
`style.css` and `script.js` into the `code.html` structure, so it can be opened
directly with no build step and renders identically to the modular version.
## Views
The application is a single page that switches between these views (no page
reloads):
1. **Jobs** — the default view. A search bar (keyword search across title,
skill, company, and location), location and job-type filter selects, category
chips, a live result count, and a paginated job list (8 jobs per page).
2. **Job Detail** — full job posting with description, responsibilities,
requirements, skills, and benefits, plus a company-info sidebar with an
**Apply Now** button and a **Save Job** toggle, and a job-details sidebar.
3. **Companies** — a responsive auto-fill grid of company cards (logo, name,
description, location, size, open positions).
4. **Company Detail** — company about, an info sidebar, and the list of open
positions at that company.
5. **Saved Jobs** — the jobs the user has bookmarked, with an empty state when
none are saved.
6. **Candidate** — a sidebar (avatar, name, role) with three tabs: **Profile**
(candidate details and profile completion), **Applications** (a status table
with badges), and **Saved Jobs**.
## Interactions
- **Search** — debounced keyword search (250ms) filtering across job title,
company, skills, and location.
- **Filters** — location and job-type selects refine the list; category chips
filter by role family.
- **Pagination** — prev/next and numbered page buttons; the list shows 8 jobs
per page.
- **Save / Unsave** — bookmark any job from its card or the detail sidebar; a
toast confirms the action and the saved view updates live.
- **Apply** — opens a scoped modal dialog (name, email, cover note) that records
an application and shows a success toast.
- **Mobile nav** — below 768px the nav links collapse into a dropdown toggled by
a hamburger button with `aria-expanded` state.
- **Mobile filter drawer** — below 768px the location/type filter selects move
into a slide-in drawer with an overlay and an **Apply Filters** action;
Escape and overlay click close it.
- **Toasts** — transient success and default notifications in the bottom-right.
## Design System
The template follows the shared `Vanilla/Templates/design-tokens.md`
specification. The `:root` block defines the DevSnips `--ds-*` token layer
(neutrals, blue accent, semantic status colors, typography, radius, shadow,
motion) and maps the template's original `--color-*` vocabulary onto those
tokens, so the visual output is preserved while the shared system remains the
source of truth. Template-specific tokens (`--template-nav-height`,
`--template-sidebar-width`, `--template-max-width`) extend the shared system.
## Customization
- **Content** — edit the `companies` and `jobs` arrays and the `applications`
state at the top of `script.js` (or in the inlined block of `preview.html`).
Each job carries title, company, location, salary, work mode, type,
experience, posted time, skills, description, responsibilities, requirements,
and benefits.
- **Theme** — adjust the `--ds-*` tokens in `style.css` (`:root`). Because the
component styles consume the template's `--color-*` names (which map onto
`--ds-*`), changing the shared tokens re-themes the whole board. The dark
mode override lives in the `@media (prefers-color-scheme: dark)` block.
- **Branding** — the nav brand mark and wordmark live in the `.nav-brand` /
`.nav-brand-icon` elements in `code.html`.
- **Page size** — change `pageSize` (default `8`) in `script.js` to alter how
many jobs appear per page.
## Responsive Behavior
The layout adapts at four breakpoints:
- **≤ 1024px** — the job-detail two-column grid collapses to one column; the
detail sidebar becomes a two-column grid; the candidate sidebar narrows.
- **≤ 768px** — nav links collapse into a dropdown menu; the candidate sidebar
becomes a horizontal row; the company grid becomes a single column; the
location/type filter selects hide and a **Filters** button opens the drawer.
- **≤ 640px** — the search bar compacts to a single-row search input plus the
Filters button.
- **≤ 480px** — page and nav padding reduce; the search bar stacks vertically;
the filter drawer goes full-width.
There is no horizontal overflow from 320px to 1920px.
## Accessibility
- Semantic landmarks (`nav`, the main container, `aside`, `section`).
- ARIA labels on navigation, the search input, filter selects, the modal dialog,
and icon buttons; `aria-expanded` on the mobile nav toggle and menu.
- The apply modal uses `role="dialog"`, `aria-modal="true"`, and
`aria-labelledby`; Escape and overlay-click close it.
- `role="list"` / `role="listitem"` on job listings.
- Visible `:focus-visible` outlines on all interactive controls.
- All controls are native `button`, `a`, `input`, `select`, or `textarea`, so
they are keyboard-operable by default.
- `prefers-reduced-motion` disables animations and smooth scrolling.
- Status badges use text labels (not color alone) to convey application state.
## Dependencies
- Google Fonts — Inter (UI) and JetBrains Mono (monospace), loaded from a CDN.
System font fallbacks are defined in the token stack, so the template remains
usable without the font download.
No JavaScript libraries, build tools, or frameworks are used.
## Browser Support
Chrome, Firefox, Safari, and Edge (modern evergreen browsers). The template
uses standard HTML, CSS custom properties, and vanilla JavaScript (ES2015+). # AGENTS.md — Job Board
Guidance for an AI agent adapting this template. Read this before editing.
## What this template is
A dense, structured developer job board: single-page view switching (jobs, job detail, companies, company detail, saved, candidate) with keyword search, location/type filters, category chips, paginated lists, a scoped apply modal, toasts, and a mobile filter drawer. All data lives in `script.js`.
## Design system
Built on the shared [`design-tokens.md`](../design-tokens.md) `--ds-*` token system. The template's original `--color-*` vocabulary is mapped onto `--ds-*` tokens so the light-mode visual output is preserved while the shared system is the foundation. **Light is the default**; opt-in calm dark mode via `prefers-color-scheme` (accent + status colors preserved).
## File layout
```
Job Board/
├── pages/
│ ├── code.html # HTML structure (links style.css + script.js)
│ ├── style.css # the design system (--ds-* tokens + --color-* mapping)
│ └── script.js # all views, rendering, filtering, pagination, save/apply, drawer
├── preview.html # self-contained preview (inlines CSS+JS)
├── metadata.json
└── README.md
```
All data (10 companies, 24 jobs, applications) lives in `script.js`.
## How to adapt it
1. **Swap the dataset**: replace the company/job/application arrays in `pages/script.js` with realistic content per `design-tokens.md` §48.
2. **Rebrand**: edit the `--ds-*` tokens in `pages/style.css` `:root`—the `--color-*` mapping resolves them automatically.
3. **Add a filter**: add a category chip + a filter predicate in the jobs view rendering in `script.js`.
4. **Rebuild the preview**: regenerate `preview.html` by inlining `style.css` and `script.js` into `code.html`.
## Do not
- Do not introduce a framework or a backend. Views are rendered client-side from in-memory data.
- Do not break the `--color-*` → `--ds-*` mapping unless you also rewrite the stylesheet's value references.
- Do not use color alone for job status—badges convey state via text labels too.
## Quality bar
ARIA on the search input, filter selects, apply modal (`role=dialog`/`aria-modal`, Esc + overlay close), `aria-expanded` on the mobile toggle, `:focus-visible` rings, reduced-motion guard, status badges convey state beyond color. Run `python3 scripts/qa/resources/qa_vanilla.py` after changes.