Type
Type or copy.
SKILL.md.agents/skills/thorbis-type/
Follow the skill selection policy and shared Linear baseline. For mobile-app work, the Native contract (D-025) is required.
Scope and required context
Linear baseline: This skill specializes one part of Thorbis; it does not introduce another product grammar. Preserve quiet chrome, one dominant work region, structured density, stable action neighborhoods, contextual surfaces, visible keyboard paths, durable state, and role-adaptive mobile. Use the Thorbis × Linear pattern matrix only when the owning pattern is ambiguous.
Mobile platform gate (D-025): Every mobile-app task requires the Native contract, HIG-001–HIG-022, and relevant live Apple Human Interface Guidelines (opens in a new tab). Apple HIG governs iOS/iPadOS behavior over conflicting web/Linear rules. Cite rule IDs and topic URLs in specifications, component contracts, PRs, and release evidence. Android retains host conventions. Normative requirements and exceptions have one owner: Native.
Type is the product. Dispatchers read more than they click.
This is its own skill. Drop it at .agents/skills/type.md. Pick this file. Do not average it with the others.
Live: https://design.thorbis.com/skills/type
Rules is what we ship. Research is the homework. `DESIGN.md` is the constitution. `AGENTS.md` is the contract.
This skill holds: D-003 (no raw type in product code), D-016 (prefer a mark; a word names the action), the type scale, wrapping, measure, and the words we use.
Homework: Rasmus Andersson on Inter. Optical size on the axis. Interface type that stays calm at 13 and 32. Geist Mono for numbers that must line up. Grammar, not a costume font.
UI owns the picture. Color owns the pair. This file owns the face, the scale, the wrap, and the sentence.
thorbis-type-SKILL.md
First
- Who is reading, and from where? Dispatcher at 7 a.m. Tech in a crawlspace. Owner on the books.
- Is this chrome or content? Chrome is 13. Content is 14. Do not mix them to “fit.”
- Is the control a mark, or does it need a word? Search, theme, close, command: no word.
Save invoice,Cancel job,Arrive: a word. D-016. - Is the number the job? Money, hours, the shop's printed number: Geist Mono, tabular. A street is Inter.
Do not offer a menu of faces. Make the call.
Face
- Inter Variable with
opsz.ss01andcv11. The UI face. Calm at 13. Calm at 32. - Geist Mono for code, the shop's printed number, money, shortcuts. Tabular. The books depend on it.
Two families. No costume font. No Inter on a number that should be tabular mono. No SF Pro on a workbench (that is iOS chrome, Native). No trailer face on Showcase (Cinematic).
Root is antialiased. -webkit-font-smoothing: antialiased. Inter on macOS without it looks heavy.
Tokens own the size and weight. No text-[13.5px]. No font-bold as a mood. D-003.
Scale
| Role | Size | Weight | Line | Where |
|---|---|---|---|---|
| Page title | 32 | 500 | 1.25 | The h1. One per page. |
| Section | 16 | 500 | 1.5 | Inside the sheet |
| Content | 14 | 400 | 1.5 | Sentences, rows, help |
| Chrome | 13 | 500 | 1.45 | Nav, chips, pills |
| Caption | 12 | 500 | 1.4 | Location, timestamps |
Chrome is 13. Content is 14. A compact commit is about 32px tall; Controls owns shared density and touch sizing. A chip is about 28. If the button is louder than the sentence, shrink the button.
Display 32 tracks tight (letter-spacing: -0.02em or tracking-tight). Default tracking on a 32 is loose. Body does not track tight.
Measure 65–75ch. More space above a heading than below it. The heading belongs to what follows. Tight inside a group. Generous between groups.
A record title in the location bar is 20 / 500. It is not a second page title. The page has one 32.
Numbers
Tabular nums on money, hours, quantities. Geist Mono when the number is the job ($186.00, 1.5 hr, JOB-1842 in a caption).
- Numerals for counts:
3 jobs, notthree jobs. - Shop currency. Same precision in a column.
- Non-breaking space between a number and its unit.
- A column of money stays tabular and right-sitting. Do not wrap a dollar in the middle of the amount.
JOB-1842is a caption. The title is114 Oak. Street first.- Show the number the shop already prints on the work order (
JOB-1842). Never show an internal id (work_order_id, a UUID, a database key). The dispatcher reads that number back from the paper. An internal id looks like a different job.
A column of totals that is technically centered but looks drunk will not be trusted on payday. Optical alignment beats geometric center.
Wrapping
- Headings:
text-wrap: balance. - Body:
text-wrap: pretty. - Non-breaking space between a number and its unit (
$186.00,1.5 hr). - Typographic quotes and apostrophes. Ellipsis is
…. Straight ticks look like a dump from the old software. - Hyphenate last, never in a heading.
- A thin nbsp only when balance still leaves a widow. A lonely “due” on the next line of an invoice looks careless.
- A job street may ellipsis. Chrome labels fade the overflow (
mask-image) instead of a hard clip when the word is the only cue. - Keep the mark together. A hanging parenthesis after a name is how a quote looks cheap.
Do not center body on a workbench. Centered type is ceremony: a hero, a symmetrical product, a universal claim. Left-aligned type is reading: specs, comparisons, chapters, proof. Do not center a paragraph of numbers. Showcase may center a headline. Body stays left even there.
Copy
- Sentence case. Second person. Active voice.
- Prefer a mark. When a control has a word, it names the action.
Save invoice.Cancel job. NotContinue. NotSubmit. Search, theme, close, command: no word. D-016. - Errors name the problem and the exit.
Could not save the invoice. Check the card and try again. - Empty names the one action.
No open jobs. Create a job. 7 a.m., not7am. Ellipsis is…. Typographic quotes.- Job, stop, tech, truck. Street first:
114 Oak, then the leak. - Status is a word: Open. En route. On site. Not a green blob.
- No marketing on a board. No kickers. No all-caps labels.
- Title Case is allowed on Showcase headlines only.
- Labels persist. Placeholders are emptiness (
Mike Reyes), not the label (Enter name). - Help sits under the field. An error takes its place. Not a toast.
Assign…means a picker is coming.Assignmeans it already happened. Techs trust the difference.
| Ours | Not |
|---|---|
| Job | Ticket, case, request |
| Stop | Appointment slot |
| Tech | Agent, resource, user |
| Truck | Vehicle asset |
| Board | Kanban, pipeline |
| Sheet | Modal, drawer, card |
| Dispatch | Assign, allocate |
| Arrive | Check in, clock |
Worked: a job row
The identity is a real <a>. Title is 114 Oak at 14 / 500. Caption is Leak · Mike · 7 a.m. at 12 / 500 marker. Status is the word En route, not a chip rainbow. Money, if present, is Geist Mono, tabular, on the end. The street may ellipsis. The status word does not.
The page title is Jobs. It is 32. It is not in the row.
Worked: an invoice
The question is Inter 16 / 500. The number is Geist Mono, $186.00, large enough to trust, never a second blue. Assumptions sit under it in 14 / 400. A column of line items is tabular, right-sitting, same precision. Do not wrap $186.00 as $ then 186.00. Evidence profile: no marketing sentence. Product Evidence.
Never
- A third face
- Centered body on a workbench
- Monospace as a vibe
- A placeholder that is the label (
Enter name) - Inputs under 16px on a phone
JOB-1842as the title of a row- An internal id on a screen the shop reads (
work_order_id, a UUID) - A word on a button a mark would have made obvious
- A kicker above a page title
- All-caps labels
text-[13px]or a page-local face- SF Pro on the job (chrome on iOS only)
- A trailer font on Showcase
- Straight quotes in customer notes
- Proportional numbers in a money column
Audit
- Inter on the UI. Geist Mono on the shop's number and money
- The number on screen is the one printed on the work order
- Chrome 13. Content 14. One 32 on the page
- Measure 65–75ch. Headings
balance. Bodypretty - Street first. Status is a word
- Marks where the action is obvious. Words where it is not. D-016
- No raw type in product code. D-003
- Phone inputs 16px or larger
- Tabular money. Non-breaking unit
- Empty and error sentences exist
Two failures: do not ship.
Done
Name the face, the role on the scale, and the sentence you wrote. Name anything you refused: a third face, a kicker, a word on a mark.
Applied bookmark research
Reviewed 2026-09-06. These are Thorbis applications and review exercises, not replacements for DESIGN.md, COMPONENTS.md, or the owning skill. Linear remains the operational baseline. External advice that conflicts with the constitution stays out.
These worked examples are not a claim that the product behaviors have been implemented or verified.
Keep operational text steady and unambiguous
Owning skill: type.
Changing digits, shifting labels, and brittle wrapping make money and status harder to inspect.
Evaluate numeric alignment where amounts are compared, stable action labels during requests, and wrapping with real content. Treat optical adjustments as controlled system decisions. Keep the existing font families and semantic type roles.
Thorbis example: An invoice comparison aligns changing amounts without hiding their currency or precision. A long property name wraps without displacing the next action. Save remains the action; the adjacent status explains what happened.
Verify: Try zero, negative and large amounts, long names, missing values, fallback fonts, text expansion, and browser zoom. Compare readability at actual size rather than approving a magnified specimen alone.
Do not import: No blanket balanced wrapping on data rows, copied display face, custom page-local type scale, or status copy that claims more than the system knows.
Evidence: Details that make interfaces feel better (opens in a new tab); Web Interface Guidelines (opens in a new tab); Invisible Details (opens in a new tab). Source access limits.
All skills
The bundle includes every skill. Use Resources to choose the smallest context for a task.