Every primitive and every screen pattern, with real LP content, on the approved direction: the aurora ground washed with the tenant’s colours, glass cards, and the gradient spent only on signature moments. Inputs stay fully white with visible borders; text is Carbon at 16.85:1 and Slate at 11.88:1. Body text is 16px, table rows are 48px, inputs are 44px. If anything here is hard to read on this device, the floor moves before a single module screen is built.
Five warm neutrals for the frame; the only colour on a screen is the tenant's own pair, spent on the aurora ground and the signature moments — a coloured frame would fight every customer's brand.
Primary text, the OS badge, the primary button, focus rings
Secondary text, hover on Carbon
Cards, inputs, table rows
Page background
Dividers, borders, table headers, disabled states
VNTURE — no second E — followed by OS reversed out of a rounded square. Built from type, never an image file.
Type and a rounded square, not an image — so the badge is as sharp in a 16px browser tab as it is on a 1024px splash. The square’s 22% corner is `--os-badge-radius`; it styles the mark and the module squares alone, while the chassis takes the softer 20/16/12/8 glass-era ladder.
Signed in, the far left of the bar is the CUSTOMER’s logo, with the VNTURE OS badge following it at 20px — a maker’s mark, not a peer. Everything below is drawn at the bar’s own 28px height, on the bar’s own glass, from a file the customer could plausibly upload — including the two that break a top bar, the one that disappears into it, and the workspace that has uploaded nothing.
THE LAST ROW IS THE RULE: a workspace with no logo wears the badge AS its mark and gets no second one, so there is never more than one OSbadge in a bar. The box is computed from the intrinsic size the server measured, so it is on the element before the image is fetched — the bar cannot jump on a cold load, and it does not jump when a mark 404s either: the VNTURE OS badge lands in the box the logo would have had. A near-white mark is separated from the glass by --mark-edge, a drop-shadow that traces the file’s alpha, never a plate behind it.
These are the generator’s real output, rendered from the same badge geometry the components use. iOS is the one target that still needs a PNG; the 180px SVG above is its master.
Two customer-supplied colours, everything else derived. The gradient appears only here: key figures via the text twins, the ask bar's edge, avatar rings, primary buttons, progress fills, section dots, the launcher tiles.
| Token | Value | What it guarantees |
|---|---|---|
| --tenant-gradient | #FF6A2C → #FFB452 | The signature device — fills only, never glyphs |
| --tenant-on-gradient | #16181D | 6.22:1 against the worse stop — measured, so LP’s is dark ink, not assumed White |
| --tenant-ink | #BB4100 | 5.43:1 on White · 5.15:1 on Mist |
| --tenant-gradient-text | #BB4100 → #965F00 | Key figures’ twins: 5.34:1 or better on White |
| --tenant-mark | #E9560C | Every outlined tile’s 1.5px line: 3.62:1 on White · 3.11:1 on this workspace’s own bar |
| --tenant-fill-gradient | #E9560C → #BD7902 | The ONE filled object on a surface — the module, org or place you are in |
| --tenant-on-fill | #FFFFFF | 3.56:1 against the worse stop — a glyph is a graphical object, so the floor is 3:1 and the FILL moves to meet it, not the ink |
| --tenant-primary-tint-8 | #FFF3EE | The active pill’s wash — opaque, so its ink’s ratio is known |
One reading face, ranked by size, weight and colour — sentence case everywhere, and only one size below 15px, reserved for timestamps. Caps and the reading-surface monospace are retired outside the logo.
The line above this one is Meta — the quietest voice on the page, and still 15px: nothing in the product renders under the floor. It is only ever a timestamp or a provenance caption. Everything you have to read to do your work is 16px.
One height: 44px — no size prop makes it smaller. The primary wears the tenant gradient with the measured on-gradient ink; the secondary is white and soft.
The quiet way onward: the tenant's ink, no underline until hover, and a real 44px target — standalone on its own line, or overhanging the line it sits inside.
While you were away, this workspace moved 3 deals forward and logged 5 activities · see the log
Two mailboxes are connected · Manage mailboxes
White surfaces, visible borders, 16px text — which also stops iOS zooming on focus.
Enter a number in international format, e.g. +31 6 1234 5678.
PNG, JPEG, WebP or SVG · up to 2048 KB
The spoken notice is played per brand at the start of every call.
A badge stamps what a thing IS — a role, a kind, a brand. 28px, so it cannot be mistaken for the 44px control beside it.
A CONDITION, not a classification: how a row is doing rather than what it is. The ordinary state is Slate — a mark every row carries is not a mark — and semantic tone is spent only on the exceptions.
Three agents all running used to be three filled green badges, which made “nothing is wrong” the loudest thing on the workspace home. Only the paused one is worth being pulled towards.
48px rows, 15px semibold headers, tabular figures in the money column.
| Deal | Brand | Stage | Value |
|---|---|---|---|
| Sustainability keynote — Q4 kickoff | LP Agency | Proposal | € 18.500 |
| Circular packaging sprint | LP Agency | Won | € 42.000 |
| Seed follow-on | LP Ventures | Qualified | € 250.000 |
| Venture scan — retail energy | LP Agency | Discovery | € 12.000 |
| Charging data pilot | LP Ventures | Proposal | € 75.000 |
Dialogs are built on the native element, so the focus trap and Escape are the browser's.
Leads land here the moment someone scans your card. Print the QR from Cards → Setup.
Phosphor, extracted at build time into path data — one family, no icon package, no image files. Every module has a glyph, which is what a launcher tile shows instead of the module's table prefix.
Phosphor Icons v2.1.1 (@phosphor-icons/core), MIT licensed — extracted at build time, so the app ships path data and no icon package. Two weights of the one family: bold everywhere, fill on the module tile and nowhere else.
The tile is white with a hairline and a soft shadow, under the tenant’s own ink. Exactly one tile per surface is filled: the module you are in, on the deepened tenant gradient under the measured glyph. Today is standing in for the current one here.
A launcher tile is aimed at, not read. Six of these are the owner’s own choices — a house, three figures, an envelope, a dated grid, a card with a portrait, and a delegation tree for the agents, which is what an agent roster actually is.
If two glyphs can be confused, this row is where it shows. Hover any of them for its name.
The verbs and the furniture. One family and one weight — bold — so the set is coherent because it was drawn that way, not because the drawings were chosen to match.
20px is the system default beside 16px body text, and 18px is the smallest the component will draw. Bold is the weight that still has a counter at those sizes — regular goes grey beside the type, and fill closes a magnifying glass into a blob.
One corner answers both questions: the OS badge opens the module launcher, the avatar opens the account menu with the organisation switcher inside it. The left sidebar belongs to the module you are in and lists nothing else.
The work sits here. The sidebar on the left belongs to CRM and changes completely when the badge switches module; it never lists the other modules, and the organisation switcher is not at its foot — it is in the avatar, one corner away.
Open the first one. Four entries is what org LP loads today — Today, Contacts, Business Cards, Agents — and it is the configuration that was never looked at while the launcher was a grid of squares: the panel narrowed with the module count, the labels were wide-tracked caps, and every one of them was cut to a single letter. As rows the names are written out in full, the panel is one sensible width per column count rather than a width per module count, and nothing in the panel truncates at all. Twelve entries is where the filter field appears, and below that the marker simply opens on the module you are in.
Measured, not asserted: a row is 56px tall and the full column wide, so the smallest target in the panel is more than double the 44px floor; the name is 16px medium in sentence case, written out in full, with no truncation anywhere in the component; the module’s own drawing sits at 20px reversed out of a 40px Carbon square — the OS badge that opened the panel, at row size. No caps anywhere: the section labels are the quiet 15px sentence-case label, ranked by weight and colour. The panel is 23rem at one column and 38rem at two, and neither width moves when a module is installed or switched off. A second column arrives at six entries, where a single column plus a “Not enabled” foot first exceeds the scroller’s 544px ceiling. The module you are in is marked twice and quietly, and there is no third signal: the selected surface under the whole row, and its square inverted to White with the accent as its boundary — the name stays Carbon, so a pale tenant colour cannot make the row you are standing on the hardest one to read. All four triggers are 44px. Every row in the account menu is 48px, and every row in the bell is at least 56px.
The corner is four objects from 768px up and two below it, which is arithmetic rather than taste: after the mark and the breadcrumb the bar has 648px of slack at 1280, 162px at 768, 66px at 640 and 16px at 375, and two more 44px circles cost 104px. Narrow the window past 768 and the bell and the ticket move into the avatar’s menu as the two rows at the top of it, with a dot on the avatar where the count was — nothing becomes unreachable, and the page name never loses letters to a control.
5results
| Deal | Brand | Stage | Value | Last activity |
|---|---|---|---|---|
| LP Agency | Proposal | € 18.500 | ||
| LP Agency | Won | € 42.000 | ||
Seed follow-onSolarDuck | LP Ventures | Qualified | € 250.000 | |
Venture scan — retail energyAhold Delhaize | LP Agency | Discovery | € 12.000 | |
Charging data pilotFastned | LP Ventures | Proposal | € 75.000 |
Editing this once demonstrates the conflict and undo path.
Inbound call · 12 min
"…we would want the keynote before the annual report lands, so early November."
Re: intro after Web Summit
Asked for two references in banking before the proposal goes to her director.
Card scanned · Web Summit Lisbon
Captured on the LP Ventures card, consent given for follow-up.
Note
Prefers morning calls. Do not route to the voice agent — wants a human.
Web Summit Lisbon · LP Ventures
Merge into the existing contact Marc de Wit (Alliander)
Calls, recordings and SMS for both brands.
Played at the start of every inbound call on this brand's numbers.
The page LP Agency screenshots for clients.
| Service | Purpose | Region |
|---|---|---|
| Google Cloud | Application and database hosting | europe-west4 (NL) |
| Telnyx | Telephony and SMS | EU |
| Self-hosted ASR | Call transcription | Our own infrastructure |
Read every section on this device before approving.
If any line asked you to lean in, say so now: raising the floor from 16px to 17px is one token change today and a rewrite of every module screen later.