LITON LITON One · UI Spec · v1.2 · approved 08-31 Binds every future module
Theme
Contrast
Density
—
2 themes × 3 contrast levels × 3 densities · 18 renderings, one stylesheet

Nine colors. Two faces. Three axes. One language.

Every element on this page is drawn from liton-one-ui.css — the stylesheet extracted from the Sales CRM mockup. Flip the switches above: the spec re-renders itself, because the spec is the system. Set three attributes on any future build and it inherits all of it.

Border radius
0px · dots only
Box shadows
0 · hairlines instead
Motion moves
3 · nothing else
Amber budget
≈5% · earned
§ 01

The laws

From the Liton Design System Package v1.0 and the UX SOP. Components below assume all of them.
L-01Flat, square, hairlined. No radius above 0, no shadows, no gradients. Surfaces separate by 1px lines and background steps, nothing else.
L-02Two typefaces, roles never swap. Inter Tight carries display and body. JetBrains Mono carries eyebrows, labels, chips, IDs, and any number that is the protagonist.
L-03Amber is earned. One primary CTA per section, at most one filled-amber KPI per board, one amber bar per chart. Amber is fill or ring on light grounds — as text it renders through --accent-text.
L-04One meaning per color. The four status colors mean completed / warning / failed / future everywhere — never selected, never hover, never theme.
L-05One italic word per headline, colored through the amber text token. Two italics = none.
L-06Every color flows through a token. Literals are legal only on committed navy surfaces (covers, chrome). This is what makes 18 renderings from one stylesheet possible.
L-07Numbers get doors. A count or KPI that cannot be clicked is a report, not an interface. Tiles, strips, and numbers are buttons.
L-08Motion is state made visible. Three moves only: 120ms hover, 0.2s state fill, 2s staleness ring. Reduced-motion collapses all of them.
§ 02

Color tokens

The live swatch column renders the current axis setting — flip theme or contrast and watch it move.
TokenRoleLightDarkLive
--bg · --bg-2 · --bg-3Surface steps#FFFFFF · #F7F7F7 · #ECECEC#0E1622 · #151F2D · #1C283A
--cardCard ground#FFFFFF#151F2D
--inkPrimary ink#00274A#E7EDF4
--ink-2Secondary ink / body#01426A#C2CCD8
--ink-3Labels · captions#5F6672 (pkg #6E7783 = calm)#8A97A8
--line · --line-2Hairlines strong · subtle#C8C8C8 · #E8E8E8#2D3B4E · #243142
--accentAmber — fill / ring, constant#FBB715#FBB715
--accent-textAmber as type (DV-06)#9A6700#F2C766
--accent-tintFeatured panel · one per surface#FFF1CF#3A2D09
--ok / --ok-bgCompleted#1F7A4D / #E8F3EC#9BDDB5 / #173A29
--warn / --warn-bgWarning#A34A05 / #FFF1CF#F5D07A / #4A3606
--bad / --bad-bgMissing · failed#8A1C1C / #FBEAEA#F3A3A3 / #4A1C1C
--future / --future-bgScheduled · inert (dashed)#5F6672 / #F7F7F7#8A97A8 / #1C283A
--navy-fixed setCommitted navy surfaces#00274A · mut #9FB1C4 · line #103A5E · ok #4FB27E — identical in every mode
--heat-1…4Activity ramp — four stops, never red#FFF1CF · #FBD76A · #FBB715 · #D99500#3A2D09 · #8A6A10 · #FBB715 · #F2C766
--sel-bgHover / selected ground#FFF8E6#2A2410
--focus / --focus-wFocus ring · width#00274A · 2px#FBB715 · 2px

What each contrast level changes

LevelIntentOverridesGuaranteed floor
CalmLong reading sessions, print-adjacent reviewSofter hairlines; labels return to the package’s original slate #6E7783AA (4.5:1) for body on white/card; micro-labels on tinted surfaces may ride ≈4.2:1
NormalThe shipping default— (base tokens, incl. the DV-06 AA nudges)AA (4.5:1) everywhere, both themes — verified by computed ratios
HighLow vision, bright rooms, projector demos, long shiftsDarker/lighter inks and status colors, stronger hairlines, 3px focus ring, 1px border on every pill — and the type itself gets easier: body 14.5px at weight 500, headings and every mono label step to 600, fine print bumps ≈1px, tracking relaxes to 0≈AAA (7:1) for body and labels; 3:1+ on all boundaries; least-strain type
§ 03

Type scale

Twelve tokens from Design System file 03. Tracking eases negative as size grows; mono opens wide at small sizes. Density never touches type.
--display-2 · 72/0.94/−.04em
Find by attribute.
--display-3 · 56/0.98/−.035em
3,247 SKUs. One catalog.
--h1 · 40/1.02/−.03em
Quote Q10482 · Harborview
--h2 · 28/1.05/−.025em
One queue. It can reach zero.
--h3 · 22/1.1/−.02em
Stage · legal next moves
--body-l · 17/1.65
The lede face. One short paragraph under a display headline.
--body-m · 14/1.65
Default body, web and email. Verbs first, numbers next, adjectives last.
--body-s · 12/1.6
Captions and footnotes. Minimum body size — never smaller.
--eyebrow · JBM 11/+.22em
Lead → Opportunity → Quote → Order
--label · JBM 10/+.14em
Manufacturer rep · ESD · Territory
--mono-l · JBM 14/1.5
LR4-30-90-WH-JA8 · $48,200 · 1,248 lm
§ 04

Density

Three settings, switched per user in My Admin. Density moves space and control padding only — type sizes, hairlines, and color never change.
TokenGovernsCompactStandardComfortable
--d-cell-y / -xQueue and feed row padding8 / 1213 / 1618 / 20
--d-cardCard body padding121624
--d-gapGrid gaps between cards121824
--d-ctl-y / -xCTA padding8 / 1412 / 2014 / 24
--d-act-y / -xAction-chip padding4 / 86 / 108 / 14
--d-table-y / -xTable cell padding8 / 1212 / 1416 / 18
--d-kpiKPI tile padding121824
--d-strip-y / -xCount-strip cell padding10 / 1214 / 1618 / 20

All values sit on the 8pt scale (4 · 8 · 12 · 16 · 24 · 32 · 48 · 64 · 96 · 128) — no half steps. Compact is for ISS working screens (Do, Lists); Comfortable is for Learn, Admin, and review surfaces; Standard everywhere else. On mobile, touch targets hold the 44×44 floor at every density.

§ 05

Components

Live — rendered from the stylesheet at the current axis setting. Class names match the mockup one-to-one.

CTAs .cta · three tiers, never four · one primary per section

Action chips .act-b · row work · verb-led (DV-03)

Chips & pills .chip filters · .pill status · .sla clocks

Completed Warning Failed Scheduled Open 3D OVERESD 2DTODAY

KPI tiles .kpi · one number, one label, one trend · every tile is a door

Count strip .strip · every number is a door

Queue row .qrow · the reason it is here + the clock, always

Q10482Quote
Follow-up date passed 3 days ago
$48,200Harborview Medical TowerBeacon Reps NEday 77 of 90
3D OVER
HF-0142Handoff
Manuel Muñiz needs the paint spec confirmed for SO-88623
Due tomorrowFrom Customer ServiceWaiting on you
DUE 1D

List table table.lt · first column is a business number · navy underline on the header

QuoteProject / jobStageValuePast due
Q10482Harborview Medical TowerFollow-up$48,2003 d
Q10102Mercer Street LoftsOpen$112,00034 d

Stage strip .stages

Open
Follow-up
Revised
Won

Key-value grid .kv

Value
$48,200
Agency
Beacon Reps NE · Dana Ortiz
Issued · expires
Jun 16 · day 77 of 90

Form field .fld · mono label above, navy focus stroke

Trail .tev · actor + timestamp + changed-from → changed-to

Stage FOLLOW-UP → WON · order SO-88901 linked
SEP 01 · 9:41A · M.SEVILLANO
Note · “GC pushing on price — holding at list.”
AUG 11 · 3:12P · M.SEVILLANO
Stage OPEN → FOLLOW-UP
JUL 22 · 9:41A · M.SEVILLANO

Bars & heat .brow sorted, one amber · .heat four stops

Beacon Reps NE
$6.2M
Corelight Partners
$4.8M
Meridian West
$3.9M
none · light · steady · heavy · peak · future

Callout .note · amber-tint · one per surface

Earned: the amber-tint panel appears at most once per surface, or it stops meaning anything.
§ 06

The menu

Top bar + surface nav — the one frame every module ships inside. Fixed order, learned once, held everywhere. Live below at the current axis setting.
LITON LITON One · Sales CRM M.SEVILLANO · ISS
Surface content renders here
narrow the window to see the mobile strip

Anatomy — every measurement

PartSpecRules
.topbarSticky · height --d-topbar (48 / 56 / 64 by density) · 1px bottom hairline · 18px gaps · 20px side padding. Chrome tokens: white ground + navy ink in light; committed navy #00274A in dark, so the white logo merges seamlessly.Present on every page of every module. Order is fixed: logo · divider · module label · search · compose · user.
.topbar .logo-l / .logo-dApproved PNG lockups at 24px tall — the digital minimum. Navy-transparent on light chrome, white-on-navy on dark. Clear space = cap-height of the “L”.PNG only, never SVG. Fallback: “LITON” in Inter Tight, all caps. Never recolor, stretch, or crowd.
.topbar .modModule label · mono 10.5px · +0.22em · uppercase · chrome-muted.Names the module (“One · Sales CRM”) — the user always knows which sibling they are in.
.topbar .searchFlex · max 520px · 1px chrome border · 7×12px padding · 12.5px text · ⌘K hint chip · amber border on hover.Universal search on every page — never only on Find. Opens the Command Bar; an unambiguous number lands on the Record.
.topbar .plus34×34 · 1px border · hover fills amber with navy glyph.The Compose affordance — always top-right, on every page (Create Quote · Log Interaction · Raise Handoff).
.topbar .meUser chip · mono 10px · uppercase · 1px border.Name + role — role scoping is row-level security, not hidden UI.
.snav212px column · 1px right hairline · pinned rail at the bottom.The seven surfaces, fixed order #1–#7, all present always — a module with nothing for a slot ships the stub.
.snav .nvItem: mono index 9.5px + Inter Tight 13.5px/500 label · padding --d-nav-y × 18px (6 / 9 / 12 by density) · hover = bg step · 120ms.Labels carry scent (“Do”, “Find”), never schema. High contrast bolds them to 600.
.snav .nv.onActive: 2px amber left border + bg step + full ink · carries aria-current="page".The nav’s single earned amber. On mobile it becomes a 2px amber underline.
.snav .bdgBadge: amber fill · navy 10px mono · weight 600.Only on Do — the live queue count. A number here is a promise the Queue can cash.
.snav .rail · .pinPin rail: bottom-anchored · mono 10.5px rows · 5px dot. Stale pin: warn dot + the 2s ring pulse.Per-user bookmarks, on every page; flagged at 30 days, never silently removed; the full set lives in My Admin.
@media ≤980pxThe column becomes a horizontal scroll strip; groups and rail hide; active state moves to the amber underline; touch targets hold 44×44.Pins stay reachable from My Admin (#7).
§ 07

Articles — the Learn page

Surface #6: “I don’t know how this works, or what happens next.” Retrieve · Prove. How-to articles, product rules, the report catalogue, and the stage-map pages all wear this form.
Help / Learn/How-to/Quoting

Create a quote.

Standard and existing items only — custom fixtures keep today’s path until the rules engine lands. Saving does the paperwork for you.

Updated · Aug 27Owner · M.SevillanoApplies to · CRM v1

Open the Composer from the Plus icon — top right, on every page — or press ⌘K and type “new quote”. It is a workspace, not a form: drafts survive interruption.

  1. Add lines by part number. Each part links to its spec sheet; lead time is opt-in, live from the Item Record.
  2. Check the rules the Composer surfaces — special minimum order and finish MOQ show per line, before you save.
  3. Save. The quote logs itself, a follow-up task is created, and the 90-day expiry clock is stamped.

What fires on save

Three consequences, none typed: the quote lands in your Queue on its follow-up date, the Trail opens with the issue event, and day 75 arms the near-expiry reminder.

One callout per article. Use it for the single thing that prevents a support call — here: a quote marked Won must link a sales order first.
Raises a Handoff to the owner
RuleDetail
MEASUREOne reading column, .article max 68ch, left-aligned. No second column of prose, ever.
TITLEVerb-led, like every Liton line: “Create a quote.” · “Read the order chain.” Never “Quoting overview.” One italic amber word allowed, rarely spent.
HEADBreadcrumb → title → one lede → meta line. The meta is mandatory: Updated · Owner · Applies-to. An article nobody owns is a rumor.
BODY14px/1.7 in secondary ink; h2s open with a hairline top rule; links underlined — color alone never carries a link. Every object mentioned links to its Record.
STEPSNumbered with mono 01 02 03 markers (.steps), one action per step, hairline-separated.
CALLOUTAt most one amber-tint .note per article — the one thing that prevents a support call. Everything else is body.
RULES & TERMSProduct rules render as .term cards (mono term + plain-language line) — the “engineering rules nobody wrote down,” written down.
STAGE MAPSThe state-machine page embeds the real .stages strip + the legal-moves table — stages, preconditions, who may, what fires. Never a drawn diagram that can drift.
ADDRESSEvery article is a real page — /crm/help/{slug} — shareable, back-button safe, listed in the report catalogue with a one-line purpose.
FEEDBACK“Flag as outdated →” on every article raises a Handoff to the owner — doc rot becomes a measurable state with a clock, like everything else.
DENSITYThe reading column keeps its own rhythm at every density — user density governs the chrome around it, never the prose.
VOICEQuiet, technical, plain. Explain the system’s behavior, not the reader’s feelings. No marketing voice, no banned words, no exclamation points.
§ 08

Motion

Three moves, proposed as DV-01 — state made visible, never decoration. Reduced-motion collapses everything to instant.
MoveSpecUsed forLive
HOVER120ms easeHover and selection on chips, rows, tiles, nav
STATE FILL0.2s width · then color flipStage advance, progress bars, verdict flips
Won
STALENESS RING2s flat outline pulseStale pins (30-day rule), invalidated ESDs, breached SLAs Not opened in 30 days
§ 09

Accessibility floor

The SOP’s floor is WCAG 2.1 AA. The Normal contrast level is the shipping default and meets it in both themes.
A-01Contrast: 4.5:1 body text, 3:1 large text and boundaries, at Normal. High targets ≈7:1. Calm relaxes hairlines only — never body text on white/card.
A-02Focus: every action keyboard-reachable, ring = var(--focus) at var(--focus-w) (3px in High). Try Tab on this page.
A-03Touch: 44×44 minimum on mobile at every density — compact shrinks padding, not targets.
A-04Never color alone: status carries a dot + a word; the flagged bar carries a text marker; trends carry arrows.
A-05State is programmatic: toggles carry aria-pressed, the active surface carries aria-current, counts and stage labels are live regions.
A-06Reduced motion is honored globally — all three moves collapse to instant.
A-07The DV-06 caveat: the package’s approved amber-2 #D99500 passes at no size on white. Amber-as-text therefore renders through --accent-text (#9A6700 light / #F2C766 dark) — pending Eman’s gate, this is the standing rule.
§ 10

Consume it

One stylesheet, three attributes. Density and contrast are per-user settings — surface them in My Admin (#7).
<!-- 1 · load the system (self-host approved for both faces) -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter+Tight:ital,wght@0,300;0,400;0,500;0,600;0,700;1,500&family=JetBrains+Mono:wght@400;500;600&display=swap">
<link rel="stylesheet" href="liton-one-ui.css">

<!-- 2 · set the axes (all optional; unset = system / normal / standard) -->
<html data-theme="dark" data-contrast="high" data-density="compact">

/* 3 · per-user, from My Admin: */
document.documentElement.dataset.density = user.prefs.density;   // "compact" | "" | "comfortable"
document.documentElement.dataset.contrast = user.prefs.contrast; // "low" | "" | "high"
// theme: leave unset to follow the OS; stamp "light"/"dark" to override

/* 4 · build with the classes on this page:
   .topbar .snav (the menu) · .cta .act-b .chip .pill .sla .kpi
   .strip .qrow .lt .kv .stages .tev .brow .fstage .fld .note .heat
   · t-* type tokens
   New component needed? Route to design — don't invent. */

The stylesheet lives next to the mockup: …\LITON One CRM\Claude Code- Eman Laptop\liton-one-ui.css. It carries the full token matrix (2 themes × 3 contrasts × 3 densities = 18 renderings), every component above, and the motion vocabulary — values traceable to Design System Package v1.0 with deviations DV-01/02/06 marked in-file. Status colors and glyphless dot-pills are internal-only; nothing here ships customer-facing.