Show the next action, not the whole system
Every surface answers “what should I do next, and why me?” before it offers navigation. Detail is available, never mandatory.
Vecto design system · Prototype
Vecto runs real ventures on a fixed methodology: six operational stages, human gates, and a queue of action items that tells each person what to do next. This page is the reference for the components that carry that work — the same ones used by the dashboard, the roadmap and the company-facing views.
Vecto is an operating system for building businesses on a 50-day cycle. These six principles decide every judgement call in the rest of this document.
Every surface answers “what should I do next, and why me?” before it offers navigation. Detail is available, never mandatory.
Health, blockers and gate decisions carry their reason with them. A user should never have to reconstruct why something is amber.
Vecto-internal and company-shared content look different everywhere. Nobody should have to remember who can see what.
Operators live here all day. Density comes from rhythm and alignment, not from shrinking type or removing labels.
One typeface, one accent, and hairlines only where structure genuinely changes. Nothing is emphasised unless it needs a decision.
Every status carries a shape or a glyph as well as a hue, so the system survives greyscale, projection and colour vision deficiency.
A near-white paper substrate, warm grey ink, and one desaturated blue that means “Vecto” and nothing else. The palette is deliberately quiet so the status scale can be the loudest thing on the page.
Rule. The brand blue is structural only — identity, focus, current position, selection. It never encodes health, so it can never be mistaken for the RAG scale.
The working surface. Almost white, warm rather than blue, and comfortable for a full day of operational reading.
The same ink as the text at four per cent. Every quiet surface in the product is this, so tints never clash.
Where you are and what is selected. Used sparingly enough that it always means something.
Three layers: a raw palette nothing references directly, semantic roles that components consume, and a Tailwind theme mapping. Components never write a literal colour.
Every neutral surface and every line is the text colour at a low alpha, so nothing in the interface is a separate grey that has to be kept in tune.
--backgroundThe page itself.--canvasRecessed areas: rails, specimens, inset panels.--cardWorking surfaces that carry a hairline.--mutedTable headers and inset notes.--accentHover and selected fills.--brand-surfaceCurrent position and selection.Three weights of hairline, used deliberately. Most surfaces need none at all — space separates them.
Rule. Reach for the lightest line that works. A border is for a real structural boundary, not for outlining every element.
--border-subtleRepeated dividers inside one container.--borderThe default hairline between things.--border-strongOnly where a line must survive a busy background.--ringFocus, and only focus.Seven tones cover every state in the product. Blocked is violet rather than red so “someone must unblock this” never reads as “this failed”.
Rule. A component picks a tone from the domain and looks its classes up in ui/tone.ts. No status colour is written inline anywhere.
--brandIdentity, current position, selection.--successComplete, approved, on track.--warningAt risk, in review, due today.--destructiveOverdue, rejected, off track.--infoIn progress, informational.--blockedDependency stopped, overridden.--neutralNot started, waiting, no signal.Each role has a paired foreground that is contrast-safe on its own tinted surface in both themes.
| Role | Fill token | Text token | Used for |
|---|---|---|---|
| Brand | --brand | --brand-foreground | Identity, current position, selection. |
| Success | --success | --success-foreground | Complete, approved, on track. |
| Warning | --warning | --warning-foreground | At risk, in review, due today. |
| Destructive | --destructive | --destructive-foreground | Overdue, rejected, off track. |
| Info | --info | --info-foreground | In progress, informational. |
| Blocked | --blocked | --blocked-foreground | Dependency stopped, overridden. |
| Neutral | --neutral | --neutral-foreground | Not started, waiting, no signal. |
One typeface. Inter carries the entire interface, and hierarchy comes from size, weight and colour rather than a change of voice. A system monospace appears only where a person might quote a string back to us.
Northwind Freight
Gates awaiting your decision
Approve the Northwind pricing model before the build stage opens
Gate G3 cannot open until a named approver signs the pricing model. Two build tasks are already sequenced behind it.
Stage gate · Northwind Freight · O3 · Commercial model
31 / 50
Numbers are tabular everywhere by default, so a column of figures is always comparable without extra classes.
Rule. Metadata is sentence case at text-xs in the muted colour. No tracked uppercase labels — they shout, and almost nothing in an operating system needs to shout.
| Role | Size | Weight | Where |
|---|---|---|---|
| Page title | text-3xl / 4xl | Semibold | Route and venture titles |
| Section | text-xl / 2xl | Semibold | Section and dialog titles |
| Item title | text-base | Semibold | Action items, cards, rows |
| Body | text-sm | Regular | Explanations and descriptions |
| Metadata | text-xs | Regular, muted | Provenance: source, venture, stage |
| Reference | text-xs | font-mono | Task refs and capability grants |
The physical rules: how far apart things sit, how sharp their corners are, how far off the page they lift, and how fast they move.
A 4px base grid. Density switches the padding inside information-dense patterns via CSS variables, and never changes type size.
| Token | Comfortable | Compact | Applies to |
|---|---|---|---|
--density-row-py | 0.6875rem | 0.4375rem | List rows |
--density-card-p | 1.25rem | 0.875rem | Card padding |
--density-cell-py | 0.6875rem | 0.4375rem | Table cells |
--density-gap | 0.75rem | 0.5rem | Grid gaps |
Small and even. Corners should be felt rather than noticed, and nothing in the system is a pill except a progress track.
Three levels, and the first two are barely there. Height in this product means “temporarily on top of your work”, so real shadow is reserved for things you dismiss.
--elevation-flatA hairline expressed as a ring. The default for anything resting on the page.--elevation-raisedOne pixel of separation. Used only where a surface must lift off a tint.Lucide, 1.5px stroke, sized to the line box. Icons clarify a label; they never replace one except in a control with an accessible name.
Rule. No icon-only button without an aria-label. No status communicated by icon colour alone.
Motion confirms a change; it never announces one. Everything is suppressed under prefers-reduced-motion, which the global stylesheet handles once for the whole system.
| Token | Duration | Used for |
|---|---|---|
--motion-fast | 100ms | Hover and press feedback |
--motion-base | 160ms | Colour and border transitions |
--motion-slow | 260ms | Progress and meter fills |
--motion-ease | cubic-bezier(.32,.72,0,1) | Every transition in the system |
Coss buttons, unchanged apart from the Vecto radius and colour roles. What matters here is not the variants but the discipline about which one appears where.
Rule. One filled button per surface. If a card offers two things, the second is ghost or outline — the reader must never have to choose between two equal-weight actions.
Focus is a single global treatment: a two-pixel ring in the brand colour with a two-pixel offset, applied by :focus-visible in the base layer rather than per component.
Every control is wrapped in a Field so the label, description and error are associated programmatically rather than by proximity.
Rule. No placeholder-as-label. A field that can be filled in has a visible label, and the description explains the consequence, not the format.
Shown to the company everywhere in their portal.
Matches task references such as NW-114.
Recorded permanently in the venture audit history.
Set by the methodology; not editable directly.
Select for a short, known list. Combobox once the list is long enough that a person would rather type than scan.
Critical means the 50-day target moves if this slips.
Determines which Vecto specialist is suggested as owner.
Choice controls carry the consequence in their description. Switches apply immediately; checkboxes and radios are part of a form that is submitted.
Company Members will see it in their roadmap.
Tomas Lindqvist is notified immediately.
Who owns this action?
A gate older than this is escalated to the Portfolio Director.
Anything that covers the work has to earn it. Tooltips explain, popovers hold a small decision, dialogs demand one, sheets hold a record, and toasts confirm what already happened.
Rule. A tooltip may never carry information that is not available elsewhere, because it does not exist on touch.
A dialog for a decision with a small amount of context; a sheet when the reader needs the underlying record while they decide.
Rule. A toast confirms something that already happened. It never carries the only copy of a decision, and never asks a question.
Vecto has more states than a typical product, and people read them under time pressure. Every state is defined once in a registry — label, tone, shape, icon and the sentence explaining what it means — and every surface reads from it.
Rule. Colour is never the only carrier. Each state also has a shape, and health additionally carries its RAG letter, so the system survives greyscale printing and colour-vision deficiency.
What an action item is currently asking of the signed-in person. Distinct from the underlying task status, which describes the work.
| Status | Meaning | Tone |
|---|---|---|
| Nothing is in the way. The owner can start immediately. | brand | |
| Work has started and the owner still holds it. | info | |
| Owned by this user but progress depends on someone else. | neutral | |
| Submitted and awaiting a named human decision. | warning | |
| A dependency or decision is preventing any progress. | blocked | |
| Closed with evidence. Retained briefly for confirmation. | success |
Urgency is derived from the due date at read time, never stored. It outranks status when deciding how loud an item should be.
| Value | Kind | Meaning |
|---|---|---|
| Overdue | Urgency (derived) | Past its due date. Always sorted to the top of the queue. |
| Due today | Urgency (derived) | Must be closed before the end of the working day. |
| Due soon | Urgency (derived) | Falls inside the next three working days. |
| Scheduled | Urgency (derived) | Sequenced by the methodology; no attention needed yet. |
| Critical | Priority (assigned) | Threatens the 50-day launch target if it slips again. |
| High | Priority (assigned) | On the critical path for the current stage. |
| Normal | Priority (assigned) | Methodology default. |
| Low | Priority (assigned) | Can move without downstream consequence. |
Every task and action deadline is rendered by DueDate, on every surface — cards, rows, lists, tables, roadmap milestones and the work panel. What varies is loudness, not the component: work that is late or lands today carries a badge on the date, and everything else is quiet metadata, because a list where every date is coloured has no urgent dates in it.
Rule. A task or action due date is always a DueDate. Show the urgency once: where the badge appears, the text beside it carries only what the badge has not already said.
| State | Badge | Text beside it |
|---|---|---|
| Overdue | Destructive | What is left of the phrase — “by 2 days” |
| Due today | Warning | The time — “17:00” |
| Due soon, scheduled | None | The whole phrase — “Due Thursday”, “5 Aug” |
| Completed | None | When it closed — “Completed 21 July” |
Size xs in rows, tables and roadmap milestones, sm in cards and the work panel. Two other date patterns exist and are not this one: a roadmap phase carries a neutral range badge, because a span is not a deadline, and calendar entries and timestamps are read as data.
Task status describes the work itself. Gate state describes a human decision. Health describes a venture. They are deliberately drawn differently so they are never confused at a glance.
| Value | Family | Meaning |
|---|---|---|
| Not started | Task status | Instantiated from the methodology, not yet picked up. |
| In progress | Task status | Actively being worked by its owner. |
| On hold | Task status | Deliberately paused by the venture lead. |
| Blocked | Task status | A predecessor or external input is unresolved. |
| Done | Task status | Complete with the evidence its definition of done requires. |
| Not ready | Gate state | Required predecessors or evidence are still outstanding. |
| Ready for review | Gate state | All entry criteria met and awaiting an eligible reviewer. |
| In review | Gate state | A named reviewer has picked the gate up. |
| Approved | Gate state | Signed off. Recorded append-only with approver and time. |
| Rejected | Gate state | Returned with required feedback; venture marked at risk. |
| Overridden | Gate state | Bypassed by an authorised user with a mandatory reason. |
| G · On track | Venture health | No overdue critical work and no blocked gates. |
| A · At risk | Venture health | Slipping against the 50-day target or awaiting a decision. |
| R · Off track | Venture health | A failed gate or a blocker on the critical path. |
| Vecto internal | Visibility | Never rendered for Company Members. |
| Shared with company | Visibility | Visible to the company, using company-facing wording. |
Action items are projected from many places in the system. The source icon tells the reader what kind of object they are about to open before they open it.
StatusBadge is the base chip. Everything above is a thin wrapper around it bound to one registry, which is why a new state can never be introduced without a label, a shape and a definition.
The unit the whole product is built around. An action item is a read model: it is projected from a task, a gate, an AI output or a request, and it exists to tell one person what to do next and why.
Rule. Every card answers four questions in a fixed order — what is being asked, why it is being asked, what it is holding up, and the single next action. The primary action is always the filled button, and there is only ever one.
Stage gateNorthwind FreightO3Commercial model
Gate G3 cannot open until a named approver signs the pricing model. Two build tasks are already sequenced behind it.
Done when: Model approved or returned with written feedback, and the decision recorded against G3.
Requested by Sofia Marchetti
AI output reviewNorthwind FreightO4Product design
Generated from the approved product spec. Nothing is in the way — this is the next task in your queue.
Done when: Every screen either accepted or annotated with a specific correction.
The status marker carries the loudest fact about the item. Urgency outranks status: an overdue item in review reads as overdue, because that is what the reader has to act on.
Stage gateNorthwind FreightO3Commercial model
Gate G3 cannot open until a named approver signs the pricing model. Two build tasks are already sequenced behind it.
Done when: Model approved or returned with written feedback, and the decision recorded against G3.
Requested by Sofia Marchetti
Information requestHalcyon CareS4Customer discovery
Requested from Halcyon on day 6. Discovery synthesis is scheduled to start tomorrow and needs at least five transcripts.
Done when: Five or more transcripts uploaded to the request.
Requested by Daniel Osei
AI output reviewNorthwind FreightO4Product design
Generated from the approved product spec. Nothing is in the way — this is the next task in your queue.
Done when: Every screen either accepted or annotated with a specific correction.
Blocker decisionNorthwind FreightO4Payments
Neither provider has been signed off. Integration cannot begin, and the launch date moves by a day for each day this stays open.
Done when: A provider chosen and the decision recorded with its rationale.
Requested by Marcus Deane
Roadmap taskHalcyon CareS8Investment
Sequenced by the methodology for day 42. Metrics are already available in the venture dashboard.
Roadmap taskHalcyon CareS2Brand
Closed on day 9 with the registrar confirmation attached.
The dense variant for grouped lists, where cards would cost too much vertical space. Same information priority, same status marker, no loss of state.
Rule. Anything marked Vecto internal must be visually distinguishable at a glance and must never be rendered in a company-facing view. The badge is a reminder, not the enforcement — that lives in the query.
Vecto internal view
Blocker decisionNorthwind FreightO4Payments
Neither provider has been signed off. Integration cannot begin, and the launch date moves by a day for each day this stays open.
Done when: A provider chosen and the decision recorded with its rationale.
Requested by Marcus Deane
Shared with the company
Information requestS4Customer discovery
Requested from Halcyon on day 6. Discovery synthesis is scheduled to start tomorrow and needs at least five transcripts.
Done when: Five or more transcripts uploaded to the request.
Requested by Daniel Osei
A venture runs a 50-day Builder cycle through six operational stages, with strategy sub-stages running alongside. The roadmap components exist so a person can find their position in the methodology in under a second.
Stage markers carry the code, not just a colour, so O4 is identifiable in a dense list and in a sentence.
Position and health are separate properties. Northwind sits on O4 and O4 is blocked, so the card is branded and the marker is not.
Rule. The current stage is the only element on the track that uses the brand colour. Brand marks position, never health.
Progress is shown against the plan, not in isolation. The tick is where the methodology says the venture should be today, and the variance is stated in words as well as in position.
Pillars group work above the stage level. They are a label, not a status, so they are drawn quietly.
Gates are where a human takes responsibility. They are the one place in Vecto where the interface deliberately slows down, states the entry criteria, and refuses to let a decision be made without a written record.
Rule. A gate never opens itself. Entry criteria are shown before the decision, unmet criteria are stated plainly, and every decision — including an override — demands a note that is kept.
Stage gate G3 · Northwind Freight
Submitted by Sofia Marchetti · Submitted 2 days ago
Entry criteria
Required sign-off
1 criterion outstanding. Approval is disabled until they are met, or until the gate is overridden with a recorded reason.
Override is granted per venture, never as a global role. When it is present the control is visible but weighted below the ordinary decisions, and it requires a reason.
Stage gate G3 · Northwind Freight
Submitted by Sofia Marchetti · Submitted 2 days ago
Entry criteria
Required sign-off
1 criterion outstanding. Approval is disabled until they are met, or until the gate is overridden with a recorded reason.
Vecto is a two-sided system: Vecto staff and the company's own people work in the same venture. Who someone is — and which side they sit on — has to be readable without opening a profile.
Rule. An avatar always encodes the person's kind. Vecto Admins are ink, Vecto Team Members carry the brand surface, and company people are neutral. Nobody should have to hover to find out whether they are talking to the client.
Chips name the person and, where it matters, their relationship to the item — owner, requester, approver.
The roles the prototype models. Capability is always scoped to a venture; there is no global superuser in the interface.
| Role | Sees | Can decide |
|---|---|---|
| PRPriya RaghunathanPortfolio Director | Every venture, internal and shared | Approve, reject and override gates |
| TLTomas LindqvistOperations Architect | Assigned ventures, internal and shared | Approve and reject gates on their ventures |
| MDMarcus DeaneFounder, Northwind Freight | Their own venture, shared items only | Approve gates assigned to the company |
Numbers in Vecto are operational, not decorative. A figure is only useful next to the thing it is measured against, so metrics carry their context and health always carries its reason.
Rule. A metric never appears without the sentence that makes it actionable. Direction is coloured by whether the movement is good, not by whether it is up.
Ventures underway
12+2
Across three Vecto pods. Two entered O1 this week.
Median days to launch
47days+3
Against the 50-day target. Trailing six completed cycles.
Gates awaiting review
5-1
Two have been open longer than the 48-hour review window.
Action items overdue
180
9 sit with Vecto, 9 with company owners.
The portfolio unit. Health is stated with the reason that produced it, the position in the 50-day cycle, and the people accountable.
Logistics · O4 Build the product
The payment provider decision has been open for 4 days and is blocking 9 build tasks on the critical path.
Health services · S4 Customer discovery
Waiting on customer interview transcripts from Halcyon. Discovery synthesis slips a day for each day they are late.
Creative services · O2 Define the operating model
Ahead of the methodology position with no overdue critical work and no gates outstanding.
Rule. Numerals are tabular everywhere so columns of figures align. Columns drop from the right as the viewport narrows; the reference, the task and its status always survive.
| Ref | Task | Status |
|---|---|---|
| NW-114 | Select the payment providerNW-109 | |
| NW-118 | Build the shipment tracking screen | |
| NW-121 | Publish the carrier onboarding guide | |
| NW-103 | Sign off the unit economics model | |
| NW-126 | Draft the pricing page copy |
The same table rendered for a Company Member. The internal/shared column is gone, because the distinction is meaningless to them and the internal rows never reach the client.
| Ref | Task | Status |
|---|---|---|
| NW-121 | Publish the carrier onboarding guide | |
| NW-103 | Sign off the unit economics model |
Every data-backed surface models five outcomes from the start. Designing the other four late is how products end up with a spinner where an explanation should be.
Rule. An empty queue is good news and should look like it. An empty list that has never been filled is neutral. They are different states and they get different copy.
Skeletons mirror the shape of the content that will replace them, so the layout does not jump. They are announced politely rather than silently.
Rule. An error says what failed, what the reader can do, and carries a reference they can quote. It never blames the reader and never shows a stack trace.
The venture loaded, but its task list did not. Nothing has been lost — try again, and if it keeps failing, send us the reference below.
Rule. Restricted is not an error. It explains the boundary and names the capability, without leaking what sits behind it.
This venture's internal working notes are visible to the Vecto team only. Ask your Vecto lead if you need something from them.
Requires venture.internal.read