Sarva Foam — commitment through quality

Sarva Foam ERP — design system

The working system for 185 screens across 13 team workspaces. Every value on this page is a token; nothing downstream hardcodes one. Contrast ratios are measured, not estimated.

01 Brand and the anti-reflex decision

The scene that decided it

06:40 at the Hosur unit. The night shift's rebonded blocks are coming out of the steam curing chambers and the air above them is still moving. High-bay LED is fighting low orange light through the roof vents. A planner in a cotton shirt is at a wall-mounted terminal, deciding which of four units takes the 32-tonne Sleepwell order before the 08:00 handover.

Glare and daylight force a high-contrast light interface. A dark console would be unreadable on that wall at that hour. Steam, wet steel and cold water force the hue.

What we rejected

First-order reflex. Industrial grey #64748B with safety orange #F97316, mono display face, dense card grid. That is the guess anyone could make from the category name alone.
Second-order reflex. Forest green and amber “sustainability” — nearly irresistible for a recycler, and already the look of another manufacturing build in this workspace.
What we chose. Deep petrol on a toned ground, ruled like a ledger, with Sarva red held back so that inside the product red can only ever mean stop.

Two registers, deliberately different

Brand registerProduct register
WhereLanding page, sign-in, printed documents180 working screens
VoiceCommitted, photographic, confidentRestrained, dense, quiet
Sarva redPresent as identityOnly ever means rejected / overdue / failed
Variance / motion / density6 / 4 / 42 / 2 / 7
The dashboard does not look like the landing page. That is intentional, and it is stated here so it is not read as inconsistency.

02 Colour strategy: restrained

Tinted neutrals plus a petrol accent on under 10% of the surface. Neutrals are tinted toward the brand's own hue (196) at 0.003–0.010 chroma — never toward a generic “warm” or “cool”, and never into the cream/sand band. Ratios below are measured with scripts/contrast.py.

Neutrals
Brand
Semantic — states only, never decoration
Density grade ramp — sequential, because density is an ordered axis
Ink flips at D130. --d-ink-hi on --d-120 measures only 3.24:1, so D80–D120 take the dark ink and D130–D150 take the light one. Verified, not eyeballed.

03 Status vocabulary

Square tags, not pills: they replace the rubber stamps on a paper batch record, which is literally what this system is displacing. Colour is never the only signal — every tag carries a word, and the ones that gate a handoff carry an icon too.

Order and document lifecycle
Draft Submitted Confirmed Planned In production Partially ready Ready to dispatch Dispatched Invoiced Closed Cancelled On hold
Quality
QC pass QC fail QC hold Under test Deviation open Use as is Rework Rejected
Production and stock
Curing Cure complete In cutting Reserved Available Below reorder Aged 90+ days
Approval and gates
ATP satisfied Credit exposure over limit Cure time not elapsed — hard stop

04 Typography

Display — Barlow Condensed

A condensed grotesk with a signage lineage. It is the voice of the weighbridge slip and the packing list, and practically it fits long field labels into narrow ledger columns without truncating.

Waste in, grade out
15,000 tonnes of trim, recovered every year
Bhopal · Hosur · Pithampur · Bhiwandi
The reason it is condensed

Net after deduction

18,420 kg

Body — Atkinson Hyperlegible Next

Chosen from the scene rather than from taste. Operators read twelve-character batch codes off a wall terminal under glare, and this face was designed to disambiguate I l 1 and 0 O. A misread lot number in a traceability system is not a cosmetic failure.

The glyphs that matter
I l 1   0 O o   5 S   8 B
Real batch codes from this system
BLK-HSR-2611-0184
GRN-BPL-26-01178
SO-2611 / D110 / 32.400 MT
Product scale
16px — record body, form values
14px — table cells, the workhorse size
13px — secondary, breadcrumb, footnote
12px uppercase — the document label
Uppercase is a document convention here, not a decoration. --case-head: uppercase is applied to panel headers, <th> and field labels only — the convention of the BMR, GRN and packing list this ERP replaces. Page titles and every marketing heading stay sentence case.

05 Space, shape and elevation

Form archetype: Ledger. Ruled, tabular, records, no depth. Every value here is a token because the six form decisions are what make one product look different from another — see docs/DESIGN.md §6.

Spacing scale

Shape — three radii, locked

--r-ctl 2px
--r-card 3px
--r-lg 5px

Elevation — hairline only

Panels are bounded records, never floating cards. Shadow is reserved for the three things that genuinely overlay.

card — none
pop — menu
modal — drawer

Density

TokenValueWhere
--h-ctl36pxButtons, inputs, selects
--h-ctl-sm28pxToolbar, segmented, chips
--h-row34pxTable rows
--h-ctl-lg44pxShop floor, via .t-lg
--bw / --bw-strong1px / 1.5pxHairline; 1.5px under a header only

06 Controls

Buttons — every variant, size and state

Variants
Sizes, with and without an icon
States — default, hover, focus, disabled, loading
Segmented

Inputs — default, filled, error, disabled

Search
Attachment
Drop the customer PO here, or
Deviation note

07 Surfaces and data

The table is the centrepiece of this system, so it is the component that gets the most care: a ruled grid with a sticky head, a sortable column, selection, a bulk bar, a totals foot and right-aligned tabular figures. A ledger always foots.

Order register

2 orders selected
Order CustomerGrade Qty (MT)Value PromiseStatusGate
4 open orders121.900₹1,42,68,300
Showing 1–4 of 4

Tabs

The active tab is filled, not underlined — on a dense screen a 2px rule does not answer “where am I”. Counts travel with the label. Built as Components.tabs(): lazy-mounted panels, the active tab in the URL, and arrow-key navigation per WAI-ARIA.

Order
SO-2611
Customer
Sheela Foam Ltd — Sleepwell, Noida
GSTIN
09AABCS1429B1ZP
Grade
D110
Quantity
32.400 MT
Ship from
Hosur · U2

Menu, drawer and toast

08 Domain components

The parts that exist because this is Sarva Foam and not a generic ERP. This is the section that proves the system was made for this client.

Density grade chip

Density (kg/m³) is the axis this business turns on: it drives the BOM, the yield standard, the price, the QC specification and how much fits on a truck. It appears on every list screen, so it gets one consistent, ordered encoding.

D80D100D110 D120D130D150
In a row, where it actually lives
BlockGradeDensityWeight
BLK-HSR-2611-0184D110110.4418 kg
BLK-HSR-2611-0185D130129.1497 kg
BLK-BPL-2611-0092D8079.6302 kg

Cure countdown — gate G7

A block cannot go to cutting before its cure elapses. The gate is enforced, not described: the button is genuinely disabled.

Chamber 3 · BLK-HSR-2611-0184Curing
02:41
Chamber 1 · BLK-HSR-2611-0179Cure complete
00:00

Weighbridge and yield reconciliation

Not in the SOW

Sarva buys waste trim by weight at quality it cannot verify at the gate. Net weight is not what you can use. This block turns a weighbridge reading into usable kilograms, and prices the supplier on ₹/usable-kg rather than ₹/kg. It is the largest margin lever in a recycling business and no line in the brief covers it.

Gross21,860kg
Tare2,180kg
Net19,680kg
Moisture 4.1%−807kg
Contamination−453kg
Usable18,420kg
Yield
93.6%
Standard for this supplier
95.5%
Effective rate
₹24.86 / usable-kg
Contracted
₹23.20 / kg
Yield is 1.9 points below standard. This lot moves Bansal Traders' composite scorecard from B to C and flags the next PO for review.

Lineage — forward and backward genealogy

Present on every record. Two clicks from a Sleepwell dispatch back to the bale of trims and the supplier who sold it.

Lifecycle — the 13-state sales order

DraftSubmittedPrice approved Credit checkedConfirmedPlanned In productionPartially readyReady to dispatch DispatchedDeliveredInvoicedClosed
Side exits
On holdShort closedCancelled

Figure row and load utilisation

Trim intake, MTD
1,284 MT
+6.2% vs last month
Rebonded output
1,196 MT
+4.8%
Average yield
93.1%
−1.4 pts vs standard
OTIF
91.4%
+2.1 pts

Foam is volumetric, not dense. A truck fills by cubic metre long before it reaches its weight limit, so load planning gates on both and names the binding constraint. An ERP that plans foam dispatch on tonnage alone is simply wrong.

Vehicle weight — MH-04-KL-8821
38%
Vehicle volume — binding
104%
Load exceeds vehicle volume by 1.4 CBM — dispatch blocked (G9)

09 Feedback and states

The unhappy paths are what convince a buyer that this is a system rather than a screenshot. Every list screen in the build ships all of these.

Empty

No production orders yet

PPC releases orders to the plant once the schedule is confirmed for the shift.

Zero results

Nothing matches “D140”

D140 is not an active grade. The ladder runs D80, D100, D110, D120, D130, D150.

Loading

Permission denied

Production is not your workspace

You are signed in as Sales. Ask a Production team admin for access, or open the linked order instead.

Error

MRP run did not complete

The BOM version for D110 is not approved, so material could not be exploded. Approve it in Masters, then re-run.

Offline — first run

Working offline. Stage confirmations are queued and will sync when the shop-floor network returns.

Welcome, Devendra

Your shift starts at 06:00. Three production orders are waiting for Hosur.

Inline notes
MRP last ran at 05:40 today. 14 purchase recommendations and 9 production recommendations are open.
GRN-BPL-26-01178 passed incoming QC. 18,420 usable kg released to raw material stock.
Foaming Line 2 at Hosur is under breakdown. Capacity for the 24 Sep shift is down 22% and four orders are affected.
Batch QC failed on BMR-2611-041: density 104.2 against a D110 specification of 108–112. A deviation is open for QA disposition.

10 Iconography

One family, one 1.5px stroke, one 24×24 viewBox, inlined as an SVG sprite in assets/js/icons.js. No emoji, no icon font, no second family.

11 Bans

Written down so the discipline is visible and auditable. These are enforced by scripts/check.py and by review.

Visual

  • Emoji as icons; icon fonts; a second icon family
  • Gradient text, glassmorphism, glow, purple-blue gradients
  • Side-stripe borders — a coloured border-left over 1px as an accent
  • Three equal cards as the answer to every section
  • A tiny uppercase tracked eyebrow above every marketing section
  • Numbered section markers used as scaffolding
  • Cream, sand, paper, linen or ivory grounds — or a token named for one
  • Shadow doing a border's job; any container radius above 5px
  • Dark mode — the brief does not ask, and a half-done one reads as a bug
  • Stock handshakes, lightbulbs, people pointing at a laptop

Content and behaviour

  • Lorem ipsum, placeholder names, invented-sounding currency
  • A TODO, a dead link, a bare href="#"
  • alert() — use the toast
  • A control that does nothing when clicked
  • A list screen without its empty, zero-result and error states
  • Pale placeholder text — placeholders take --muted
  • Colour as the only signal for a status
  • Text overflowing its container at any breakpoint
  • Red used for anything in the product except danger
  • A hover state that shifts layout