# Guideword — Next.js Directory Template

> A nextjs directory template set as a printed trade directory: paid tiers as print weights, no auth or database, two functions wire your own data and checkout.

- Price: $34, one-time
- License: Standard
- Version: 1.0.0
- Category: Directory
- Editions: React, HTML
- Dark mode: Yes
- Stack: Next.js >=15 <17, React >=19 <20, Tailwind CSS >=4 <5
- Dependencies: `lucide-react`

## What's inside

- 9 pages
- 39 components
- 94 design tokens plus 94 dark overrides

## Pages

| Path | Sections |
| --- | --- |
| `/` | `site-header`, `home-verso`, `classified-index`, `home-recto`, `site-footer` |
| `/trades` | `site-header`, `classified-table`, `site-footer` |
| `/trades/clock-and-watch-repairs/3` | `site-header`, `heading-band`, `trade-page`, `site-footer` |
| `/a-z/s/1` | `site-header`, `az-spread`, `site-footer` |
| `/listing/spoke-and-spanner` | `site-header`, `listing-opener`, `listing-record`, `listing-as-printed`, `site-footer` |
| `/search` | `site-header`, `search-spread`, `classified-index`, `site-footer` |
| `/amendments` | `site-header`, `amendments-slip`, `site-footer` |
| `/list-your-business` | `site-header`, `listing-head`, `listing-form`, `site-footer` |
| `/components` | `site-header`, `site-footer` |

## Components

| Name | What it renders |
| --- | --- |
| `site-header` | The register's type-set name and edition, four routes in the link ink with the page's section underlined as current, the lamp switch and a quiet "List your business"; below lg the routes take their own row. |
| `home-verso` | The spread's left page: the running head with the latest correction, "Find someone who fixes it." at d6, the derived counts, the search and the classified index. |
| `classified-index` | Every heading with a dot leader to the page it opens on, under a "Page" column head, in two columns from sm; no counts. |
| `home-recto` | The spread's right page: page 2 of the typeset register, turning in place with ‹ › and the thumb letters, the end repeat "A line entry is free" at its foot. |
| `site-footer` | The colophon: the editors by name, the check window and the edition the checks hold to, and every route including /components. |
| `classified-table` | The classified index as a table, Trade · Entries · Pages · See also, 24 rows with every figure derived, a heading that runs over giving both pages, beside the route's band with the H1, the counts and the one filled action. |
| `heading-band` | A trades page's left half: the running head with the book's folio, the heading as H1, its entries and pages, what it follows on the page, see also, the district select and the Any day · Open Saturdays group, the active filters as chips, the result line and the filled "List your business". |
| `trade-page` | The spread: the band, then the book's folio with the thumb index on its fore-edge, ‹ › turning only the heading's folios; a filter re-typesets the heading's matching entries into their own run in place, and nothing matching is a sentence with each filter offered relaxed. |
| `az-spread` | The name index's spread: the thumb index as a head row of twenty-six, the letter band and one page of the letter's run; ‹ › route to the next address standalone and turn the page in place when embedded. |
| `az-band` | The letter band in two pieces: the running head, the letter at d5 and the derived lede; then the letter's pages with their guide words, the trades filed under it with the page each opens on, and the cross-reference to the classified index. |
| `listing-opener` | The entry set large: the heading as kicker, the name at d4 in its tier's weight, the number at d3 as a tel: link in the acting ink, the address, the tier in words, and the plate beside it for a box; a delisted entry prints its date and reason first and is struck. |
| `listing-record` | The record as ruled rows: services, what it does not do, hours row by row or "Hours not given", the check and how long it holds or when it lapsed, listed since, and every amendment as before → after with how it came in. |
| `listing-as-printed` | The entry between its real neighbours at the register's 280px column measure, headed "As printed · p. n" with a link to the page; a delisted entry says when it left the pages and points at the slip. |
| `search-spread` | The search spread: the field opened on ?q= with one sentence saying how many entries matched and under which heading, the results typeset as a page with the alphabetical first and last match as guide words, and the classified index to start from when nothing does. |
| `amendments-slip` | The corrigenda slip: the running head and "Amendments" at d5 beside the derived counts and a one-clause helper with its hint, then every correction and delisting newest first on one measure. |
| `listing-head` | The head of the listing page: the running head saying a line entry is free, "List your business" at d4 and one line on what the page does. |
| `listing-form` | Seven fields validated on blur and on submit from one message table, the weight picker priced beside each weight, the one filled "Send your entry", and a receipt that says Not sent while no desk is connected. |
| `ui/directory-page` | One printed page: guide words and folio in the live page head, the legend with its hint, two columns under a full-ink rule, and the foot with "continues on page n"; or, as a roll, every page of a run in one flow under a running head that follows the entries in view. |
| `ui/entry` | One entry in its printed weight: line (name, dot leader, number, address), bold ("Paid listing ·" and a line of services) or box (directory yellow, plate, copy, hours, the number set large). |
| `ui/thumb-index` | A to Z cut into the fore-edge, the open page's letters reversed in a half-round ink tab, unfiled letters printed but not linked; a head row of two by thirteen below lg. |
| `ui/register-search` | The GET search to /search with the filled "Search" and the live near-miss line that names the heading a reader's word is filed under. |
| `ui/action` | The action shape in two weights: filled #0000ee under a white label, or quiet with an ink-grey edge. |
| `ui/text-link` | The three link inks as class strings: the underlined ink link, the turn link in the one blue for what moves the page, and the box link that stays ink on the yellow island. |
| `ui/mode-toggle` | One button between newsprint and the desk lamp, named for what pressing it does, aria-pressed. |
| `ui/wordmark` | The register's name in Big Shoulders caps with the edition beneath, in data-brand-name. |
| `ui/item-list` | One ItemList in JSON-LD per trades page, derived from the same fixture the page prints, with every character a parser acts on escaped. |
| `ui/local-business` | One LocalBusiness JSON-LD node per listing: the name, the E.164 telephone, the address, the box copy as description and openingHoursSpecification where hours exist; nothing for a delisted entry. |
| `ui/amendment` | One row of the slip at full ink: the date, the entry linking to its listing, the field with before → after or "Delisted: closed", and "By reader report", "By phone check" or "Left the pages". |
| `ui/proof-slip` | The submitter's entry set one column wide in the weight picked, under the heading it files beneath and a ruled head saying from which page, with its cost in lines of the column from measure(). |
| `ui/pagination` | The page head: guide words and folio in a polite live line over the full-ink rule, with the book's ends, ‹ and ›, that disable on the first and last page instead of wrapping. |
| `ui/search-input` | The register's search field: a native search input under a persistent label, a clear control that returns focus, and the near-miss cross-reference announced as you type. |
| `ui/field` | A labelled native control on the card, found by its edge; invalid keeps a critical edge, a glyph and a sentence while the ink ring is drawn round it. |
| `ui/form` | The submit form: a two-column fieldset from lg that keeps every value on a rejected submit; its receipt is a ruled, padded slip focused on success. |
| `ui/form-error-summary` | The panel a failed submit moves focus to: the critical soft ground under a full critical edge, the count in words and one link per field. |
| `ui/filter-chip` | An active filter printed as a ruled tag with a 40px remove control; the chips stay on the page when nothing matches. |
| `ui/variant-selector` | The proof slip's weight picker: line, bold or box as native radios with the price beside each, the chosen row told by dot, ink edge and ground together. |
| `ui/popover` | The one slip of card stock over the page, hairline all round and no shadow; vendored because the hint composes it. |
| `ui/hint` | A one-clause line with its reasoning one press away, behind a 24px trigger named for what it opens. |
| `ui/toggle-group` | A row of ruled segments sharing one ink edge, the chosen one reversed in ink like the thumb tab: the heading band's day filter, and the styleguide's pages-or-roll switch. |
## Design tokens

| Token | Light | Dark override |
| --- | --- | --- |
| `--background` | `#f4f2eb` | `#141310` |
| `--foreground` | `#1a1711` | `#ece9e1` |
| `--card` | `#fdfcf9` | `#1d1c18` |
| `--card-foreground` | `#1a1711` | `#ece9e1` |
| `--secondary` | `#e5e3dc` | `#2b2a26` |
| `--secondary-foreground` | `#1a1711` | `#ece9e1` |
| `--muted` | `#ebe9e2` | `#0f0e0b` |
| `--muted-foreground` | `#5e5a53` | `#aca9a1` |
| `--border` | `#d2cfc7` | `#373531` |
| `--surface-overlay` | `#fdfcf9` | `#262420` |
| `--rule` | `#1a1711` | `#ece9e1` |
| `--leader` | `#88867f` | `#76746f` |
| `--primary` | `#0000ee` | `#0000ee` |
| `--primary-foreground` | `#ffffff` | `#ffffff` |
| `--primary-hover` | `#0000c3` | `#0000c3` |
| `--primary-active` | `#000099` | `#000099` |
| `--accent` | `#f8e574` | `#edd55e` |
| `--accent-foreground` | `#1a1711` | `#1a1711` |
| `--box-link` | `#1a1711` | `#1a1711` |
| `--box-link-hover` | `#1a1711` | `#1a1711` |
| `--box-ring` | `#1a1711` | `#1a1711` |
| `--box-rule` | `#1a1711` | `#1a1711` |
| `--box-muted` | `#4b483c` | `#4b483c` |
| `--link` | `#1a1711` | `#ece9e1` |
| `--link-hover` | `#1a1711` | `#ece9e1` |
| `--link-visited` | `#5e5a53` | `#aca9a1` |
| `--turn` | `#0000ee` | `#8ba6fd` |
| `--ring` | `#1a1711` | `#ece9e1` |
| `--field` | `#ffffff` | `#0d0c0a` |
| `--field-border` | `#88867f` | `#76746f` |
| `--control-border` | `#88867f` | `#76746f` |
| `--selection` | `#e2e0d7` | `#302e28` |
| `--selection-foreground` | `#1a1711` | `#ece9e1` |
| `--selection-border` | `#1a1711` | `#ece9e1` |
| `--positive` | `#007835` | `#27b058` |
| `--positive-foreground` | `#ffffff` | `#141310` |
| `--positive-soft` | `#e8f9eb` | `#112917` |
| `--positive-border` | `#abd8b3` | `#295233` |
| `--positive-fill` | `#16833f` | `#309b52` |
| `--warning` | `#9a5700` | `#e18200` |
| `--warning-foreground` | `#ffffff` | `#141310` |
| `--warning-soft` | `#fff1e5` | `#321d0a` |
| `--warning-border` | `#ecc19c` | `#623e1c` |
| `--warning-fill` | `#a96000` | `#c77304` |
| `--critical` | `#d0003c` | `#f76d77` |
| `--critical-foreground` | `#ffffff` | `#141310` |
| `--critical-soft` | `#ffefef` | `#36191a` |
| `--critical-border` | `#f5b9b9` | `#683739` |
| `--critical-fill` | `#c24954` | `#de5e68` |
| `--number-slot` | `8.5rem` | `8.5rem` |
| `--radius` | `0.25rem` | `0.25rem` |
| `--radius-page` | `0rem` | `0rem` |
| `--radius-tab` | `9999px` | `9999px` |
| `--icon-stroke` | `2` | `2` |
| `--ease-house` | `cubic-bezier(0.2, 0, 0, 1)` | `cubic-bezier(0.2, 0, 0, 1)` |
| `--duration-micro` | `120ms` | `120ms` |
| `--duration-state` | `150ms` | `150ms` |
| `--text-caption` | `0.75rem` | `0.75rem` |
| `--leading-caption` | `1.4` | `1.4` |
| `--text-small` | `0.875rem` | `0.875rem` |
| `--leading-small` | `1.45` | `1.45` |
| `--text-body` | `1rem` | `1rem` |
| `--leading-body` | `1.55` | `1.55` |
| `--text-lead` | `1.125rem` | `1.125rem` |
| `--leading-lead` | `1.6` | `1.6` |
| `--text-d1` | `1.5rem` | `1.5rem` |
| `--leading-d1` | `1.1` | `1.1` |
| `--tracking-d1` | `0.01em` | `0.01em` |
| `--text-d2` | `2rem` | `2rem` |
| `--leading-d2` | `1.05` | `1.05` |
| `--tracking-d2` | `0.005em` | `0.005em` |
| `--text-d3` | `clamp(2rem, 1.6rem + 1.6vw, 2.666rem)` | `clamp(2rem, 1.6rem + 1.6vw, 2.666rem)` |
| `--leading-d3` | `1` | `1` |
| `--tracking-d3` | `0.005em` | `0.005em` |
| `--text-d4` | `clamp(2.5rem, 1.8rem + 2.6vw, 3.553rem)` | `clamp(2.5rem, 1.8rem + 2.6vw, 3.553rem)` |
| `--leading-d4` | `0.95` | `0.95` |
| `--tracking-d4` | `0` | `0` |
| `--text-d5` | `clamp(3rem, 2rem + 3.8vw, 4.736rem)` | `clamp(3rem, 2rem + 3.8vw, 4.736rem)` |
| `--leading-d5` | `0.92` | `0.92` |
| `--tracking-d5` | `0` | `0` |
| `--text-d6` | `clamp(3.553rem, 1.6rem + 5.9vw, 6.313rem)` | `clamp(3.553rem, 1.6rem + 5.9vw, 6.313rem)` |
| `--leading-d6` | `0.9` | `0.9` |
| `--tracking-d6` | `0` | `0` |
| `--tracking-label` | `0.06em` | `0.06em` |
| `--tracking-heading` | `0.03em` | `0.03em` |
| `--weight-line` | `400` | `400` |
| `--weight-medium` | `500` | `500` |
| `--weight-bold` | `700` | `700` |
| `--weight-box` | `800` | `800` |
| `--weight-display` | `800` | `800` |
| `--font-display` | `var(--font-guideword-display), "Arial Narrow", Impact, sans-serif` | `var(--font-guideword-display), "Arial Narrow", Impact, sans-serif` |
| `--font-text` | `var(--font-guideword-text), "Franklin Gothic", ui-sans-serif, system-ui, sans-serif` | `var(--font-guideword-text), "Franklin Gothic", ui-sans-serif, system-ui, sans-serif` |
| `--font-sans` | `var(--font-text)` | `var(--font-text)` |
| `--font-figures` | `var(--font-guideword-figures), var(--font-guideword-text), ui-sans-serif, system-ui, sans-serif` | `var(--font-guideword-figures), var(--font-guideword-text), ui-sans-serif, system-ui, sans-serif` |
## Use it

- Registry: `bunx shadcn add https://tailthemes.com/r/guideword.json`
- MCP: [https://tailthemes.com/api/mcp](https://tailthemes.com/api/mcp)
- Download: [https://tailthemes.com/api/download/guideword](https://tailthemes.com/api/download/guideword)

## Links

- Product page: [https://tailthemes.com/themes/guideword](https://tailthemes.com/themes/guideword)
- Live preview: [https://tailthemes.com/preview/guideword](https://tailthemes.com/preview/guideword)
- Docs: [https://tailthemes.com/docs/guideword](https://tailthemes.com/docs/guideword)
- Manifest JSON: [https://tailthemes.com/api/themes/guideword](https://tailthemes.com/api/themes/guideword)
- Registry item: [https://tailthemes.com/r/guideword.json](https://tailthemes.com/r/guideword.json)
