Pro
$29 / month
Unlimited analyses, AI proposals and win/loss insights.
Pre-Sales OS
The logo, colours, type and every interface component, in every state, with example data. This is the reference the product is built from.
ds/logo · LogoMark on a 4-unit grid (public/mark.svg, src/components/ds/logo.tsx)
The dot is the decision. It sits at the top, before anything else: before the call, before the quote, before the proposal.
The line beneath is what you build once you've decided, and only then.
Mark only
26px (22px small)
App top bar below 640px. Marketing header below 360px. On a violet tile for the favicon and app icon.
Mark and wordmark, md
26px mark, 17px text, 8px gap
App top bar from 640px, mobile menu, marketing header and footer, sign-in pages, invite, unsubscribe, 404 and error pages.
Mark and wordmark, sm
22px mark, 15px text, 8px gap
The smallest lockup, for tight spaces. No screen uses it today.
Client-facing documents carry no Pre-Sales OS mark. Proposals are branded with the freelancer's own logo and end with the line “Prepared with Pre-Sales OS”.
On paper
Every screen today: violet mark and OS, ink Pre-Sales. The same on white.
On a violet tile
Favicon and app icon only: a white mark on brand violet.
On ink
For the dark download only; no screen uses it. on-ink text, brand-on-ink mark and OS.
The mark is always brand violet #7B61FF, never brand-strong: that darker violet is for button fills. Keep the logo off verdict colours, photos and gradients.
Don't stretch or squash it
Don't recolour the mark
Don't rotate it
Don't add shadows or effects
Don't set OS in ink
Don't change the wordmark font
tokens · globals.css
paper
#F6F5F1
Page background
surface
#FFFFFF
Cards, inputs, menus
ink
#1A1A1F
Primary text, ink buttons
ink-soft
#3A3940
Secondary reading text
ink-muted
#55545C
Labels, meta
rule
#DDD9CF
Hairline dividers
rule-strong
#8F897C
Form-control borders
brand
#7B61FF
Logo, focus ring
brand-strong
#6B4FF0
Primary button fill
link
#5B43E0
Links
verdict-take
#5FD08C
Take
Verdicts only
verdict-careful
#F2B84B
Proceed carefully
Verdicts only
verdict-risk
#F2685C
High risk
Verdicts only
danger
#B3261E
Remove, Revoke, Delete
Destructive text only
type scale · Newsreader, IBM Plex Sans, IBM Plex Mono
The colour rule: saturated colour appears in three places only. Verdicts get a full colour field with ink text. The brand violet is for the logo, primary actions, links, focus rings and selected choice controls. Destructive text actions use the danger red. Everything else is ink, grey or paper.
ds/button · Button, every variant and size
ds/button · Button states: loading, disabled, asChild as a link
ds/input · Input: empty, filled, prefix and suffix, invalid, disabled
Enter a valid email address.
ds/textarea · Textarea, variant reading with showCount
308 characters
Paste the client's message as it arrived.
ds/select · Select, default and size sm
ds/select-button · SelectButton as a menu trigger: the stage control on the analyses rows and the analysis page (32px from md, 44px below; never coloured by stage)
ds/choice · Checkbox and RadioGroup
ds/choice · Segmented, billing period
ds/form-field · FormField with a hint, with an error, required
As it should appear on proposals.
Enter an amount above $0.
ds/chip · Chip, removable
ds/verdict · VerdictField, size hero
Verdict
Verdict
Verdict
ds/verdict · VerdictField, size compact with meta
Verdict
Verdict
Verdict
ds/verdict · VerdictField without a decision: not scored, PROCESSING, FAILED
Verdict
Verdict
Verdict
ds/verdict · VerdictBadge, all decisions and none
ds/status-text · StatusText, pipeline stages, proposal stages, pending
ds/score-bar · ScoreBar, scored and not scored
ds/risk-fit-chart · RiskFitChart, plain (one highlighted) and with colourByVerdict. Quill Publishing has no fit score.
| Analysis | Risk | Fit | Verdict |
|---|---|---|---|
| Ledgerly | 55 | 90 | Proceed carefully |
| Morgan Studio | 18 | 84 | Take |
| Northwind Foods | 82 | 35 | High risk |
| Fernhill Clinic | 24 | 77 | Take |
| Atlas Logistics | 48 | 62 | Proceed carefully |
| Bluebird Learning | 74 | 41 | High risk |
| Harbour & Co | 12 | 93 | Take |
| Kestrel Energy | 52 | 70 | Proceed carefully |
| Oakridge Dental | 20 | 88 | Take |
| Quill Publishing | 41 | Not scored | Proceed carefully |
| Redwood Capital | 68 | 55 | High risk |
| Sable Studio | 15 | 80 | Take |
| Analysis | Risk | Fit | Verdict |
|---|---|---|---|
| Ledgerly | 55 | 90 | Proceed carefully |
| Morgan Studio | 18 | 84 | Take |
| Northwind Foods | 82 | 35 | High risk |
| Fernhill Clinic | 24 | 77 | Take |
| Atlas Logistics | 48 | 62 | Proceed carefully |
| Bluebird Learning | 74 | 41 | High risk |
| Harbour & Co | 12 | 93 | Take |
| Kestrel Energy | 52 | 70 | Proceed carefully |
| Oakridge Dental | 20 | 88 | Take |
| Quill Publishing | 41 | Not scored | Proceed carefully |
| Redwood Capital | 68 | 55 | High risk |
| Sable Studio | 15 | 80 | Take |
ds/stat-list · StatList, rows (billing) and columns
ds/usage-meter · UsageMeter, within the limit, limit reached, unlimited
3 of 5 outcomes this month
5 of 5 outcomes this month — limit reached
ds/card · Card, default and emphasis, as a plan comparison
$29 / month
Unlimited analyses, AI proposals and win/loss insights.
$79 / month
Everything in Pro, plus a shared workspace for your team.
ds/page-header · PageHeader with eyebrow, back link, description and actions (renders its own h1)
Analysis
Analysed 8 October 2026. A good fit, but resolve the open risks before proposing.
ds/empty-state · EmptyState
Paste a client message and get a verdict before you write a proposal.
ds/first-use-empty-state · FirstUseEmptyState (two columns from lg, preview hidden below md)
Paste what a client sent you. In about a minute you'll know whether to take it, go carefully or walk away, and what to ask on the call.
ds/progress-steps · ProgressSteps, horizontal (current: Scope) and vertical (current: Pricing)
ds/action-bar · ActionBar. Inline on desktop; on phones it sticks to the bottom of the screen and the buttons share the width.
ds/app-shell/trial-ended-notice · the strip shown once under the top bar after a Pro trial ends, saying the account is view only (static example; the live one remembers dismissal per trial in localStorage).
Your Pro trial ended on 21 October 2026. Your account is view only: everything you've made is still here, and new analyses need Pro. What changed
ds/app-shell/status-chip, setup-summary · Plan status in the shell. The chip in its three looks (trial, last 3 days with the Choose a plan link, view only with the Upgrade action), and the setup summary as it sits in the account menu (static examples).
ds/settings-layout · SettingsLayout inside a frame (renders its own h1). Inside the gallery no item is active, because the path does not match any of them.
Used to sign in and for forwarded briefs.
ds/responsive-dialog · ResponsiveDialog: dialog on desktop, bottom sheet on phones
ds/menu · Menu with link items, a separator and a danger item
ds/menu · Labelled groups (MenuGroup, MenuLabel, MenuSeparator): the analysis page's Actions menu
ds/video-player · VideoPlayer inline (max 720px wide), with chapters below
Chapters
ds/video-dialog · VideoDialog: the player in ResponsiveDialog, chapters beside the video from lg, a bottom sheet below md
ds/data-list · DataList (table on desktop, cards on phones).
| Client · project | Verdict | Risk | Stage | Updated |
|---|---|---|---|---|
| Ledgerly · Webflow site and brand refresh | Proceed carefully | 55 | Call scheduled | 8 October 2026 |
| Morgan Studio · Design system audit | Take | 18 | Proposal sent | 7 October 2026 |
| Northwind Foods · E-commerce migration | High risk | 82 | Analysed | 6 October 2026 |
| Fernhill Clinic · Patient portal UX | Take | 24 | Won | 4 October 2026 |
| Atlas Logistics · Marketing site redesign | Proceed carefully | 48 | Contacted | 3 October 2026 |
| Bluebird Learning · Course platform front end | High risk | 74 | Lost | 2 October 2026 |
| Harbour & Co · Brand identity | Take | 12 | Proposal sent | 30 September 2026 |
| Kestrel Energy · Investor microsite | Proceed carefully | 52 | On hold | 29 September 2026 |
| Oakridge Dental · Booking flow UX audit | Take | 20 | Contacted | 27 September 2026 |
| Quill Publishing · Newsletter redesign | Proceed carefully | 41 | Analysed | 25 September 2026 |
| Redwood Capital · Client dashboard | High risk | 68 | Analysed | 22 September 2026 |
| Sable Studio · Portfolio site | Take | 15 | Won | 20 September 2026 |
ds/data-list · DataList empty state
Your analyses will appear here.
ds/view-tabs · ViewTabs and ViewSwitch
Tabs with counts. Each tab is a link, so Back restores the state. The active tab has an ink underline.
With a trailing slot (md and up only), for the match count and Clear.
Inside a 360px box the row scrolls within itself; the page does not.
Tabs without counts.
ViewSwitch: List and Board (Board is hidden below md because the board is desktop only).
ViewSwitch: Desk and List, with the second option active.
ds/command-bar · CommandBar
Press / anywhere outside a field to focus the search.
No chips · bar height: 44px
One chip · bar height: 44px
Four chips (remove one: the height does not change) · bar height: 44px
With a filter slot (placeholder button, task 07 supplies the real one) · bar height: 44px
Phone arrangement in a 360px frame. The layout follows the viewport, so narrow the window below 768px to see the search box and filter slot only.
Chips and sort hide below md · bar height: 44px
ds/filter-panel · FilterPanel
0 active
ds/verdict-strip · VerdictStrip and meters
The strip takes its colour from the verdict only, and is neutral without one. Bars are never coloured by value.
ds/row-actions · RowActions
Hover or tab onto a row on desktop; on a phone the overflow button is always visible.
Marlowe & Finch Studio
Website rebuild · via email
Halden Outdoor
Shopify migration · by Priya
Quillon Health
Patient app MVP
360px frame
Marlowe & Finch Studio
Website rebuild · via email
Halden Outdoor
Shopify migration · by Priya
Quillon Health
Patient app MVP
ds/stat-strip · StatStrip
By default the strip is desktop only (md and up): on a phone it is hidden and the screen supplies its own form, such as tabs or an inline numbers line. Labels and notes wrap in narrow cells; values never do.
phone="grid": the same cells in two hairline-ruled columns below md. A wide cell spans both, as does a cell left alone on its row. Narrow the window to see it.
ds/group-header · GroupHeader and QueueCard
Call tomorrow at 10:00
Marlowe & Finch
Brand refresh · $9,800
High risk · waiting for your answer
A very long client name that has to truncate before it reaches the edge of the card
Mobile app · $42,000
The collapse is viewport-based: below md each card becomes the compact phone row (client and reason on the left, primary action on the right, no secondary action). The Marlowe & Finch card has an overflow menu, shown at every width (revealed on hover or focus from md).
360px container (the phone form appears when the viewport is below md)
Sent 6 days ago · no reply yet
Northfield Dental Group with a long name
Website rebuild · $18,500
ds/proposal-page · ProposalPage
Patient app MVP
Seasonal menu site
Course platform
Website for
Seasonal menu site
Course platform
Brand refresh
Patient app MVP
Seasonal menu site
Patient app MVP
ds/brief-timeline · BriefTimeline
ds/confirm-dialog · ConfirmDialog
ds/snooze-dialog · SnoozeDialog
The busy example is busy for three seconds (Cancel, Escape and Snooze do nothing), then keeps its server error until it is closed. Call date preselects Tomorrow and has a shorter line on the phone sheet; Change call date preselects the current date and adds Remove the date at the footer's left.
ds/data-text · DataText, numbers in the data face
Last 7 days: 5 briefs analysed, 4 proposals sent.
ds/deal-row · DealRow, Today row with step and overflow
Take · Analysed · Waiting 5 days
Waiting 5 days
ds/deal-row · DealRow, an outline step; a long title that truncates (no date column)
Proposal sent · $18,500 · Answered 19 Oct
Answered 19 Oct
Take · Contacted
ds/deal-row · DealRow, Watch rows (no step or overflow): strip, High risk badge, FAILED
Contacted · waiting 26 days · Quiet 26 days
Quiet 26 days
Waiting 9 days
Sent 18 Oct
ds/deal-row · DealRow in a 360px frame. The phone layout follows the viewport, so this frame shows the md+ layout unless the window itself is narrow
Take · Analysed · Waiting 5 days
Waiting 5 days
ds/month-rate-chart · MonthRateChart, six months, Oct so far, Jul with no outcomes, reference 56%
| Month | Won | Lost | Win rate |
|---|---|---|---|
| May | 2 | 1 | 67% |
| Jun | 1 | 3 | 25% |
| Jul | 0 | 0 | — |
| Aug | 2 | 2 | 50% |
| Sep | 4 | 2 | 67% |
| Oct so far | 3 | 2 | 60% |
ds/month-rate-chart · MonthRateChart, no outcomes in any month, no reference
| Month | Won | Lost | Win rate |
|---|---|---|---|
| May | 0 | 0 | — |
| Jun | 0 | 0 | — |
| Jul | 0 | 0 | — |
| Aug | 0 | 0 | — |
| Sep | 0 | 0 | — |
| Oct so far | 0 | 0 | — |
ds/rate-bar-list · RateBarList, by verdict and by fit (a band with too few outcomes: no meter, a dash and noRateLabel for screen readers; and a note)
3 closed deals had no fit score.