Handoff: Powder Coating Logix — Visual Redesign
Overview
This package redirects Powder Coating Logix from a generic Bootstrap-admin aesthetic to a calmer, more industrial voice — warm neutrals, a single ember accent, monospace numerics, borders-over-shadows, domain signals on screen.
Three representative screens are mocked end-to-end (Dashboard, Jobs list, Daily board). The same tokens, type stack, and component vocabulary extend to every other page in the app.
About the Design Files
The files in this bundle (Design Review.html, mock_components.jsx, screens_before.jsx, screens_after.jsx, review_app.jsx) are HTML/React design references, not production code to copy.
Your task is to recreate the "after" designs inside PowderCoating.Web — an ASP.NET Core MVC app with Razor .cshtml views, Bootstrap 5, and jQuery. Use the codebase's existing patterns (Razor partials, tag helpers, the _Layout.cshtml shell, Bootstrap utility classes) — do not introduce React.
Where the HTML mocks use inline React-style components, translate them to:
- CSS custom properties + Bootstrap 5 overrides in
wwwroot/css/site.css - Razor partial views in
Views/Shared/for repeated primitives (status chip, metric tile, section header) - Tag helpers in
TagHelpers/for things already modeled that way (e.g. the sortable column pattern)
Fidelity
High-fidelity. Colors, typography, spacing, radii, and interaction affordances in the "after" mocks are final. Pixel-match the layout and tokens; use the codebase's existing icons (Bootstrap Icons) and form controls. No emoji.
Screens
1. Dashboard (Views/Dashboard/Index.cshtml)
Replace:
- The gradient "Welcome Back!" banner (currently
background: var(--sidebar-gradient)). - The 6-tile rainbow KPI grid with icon bubbles.
With, in order:
- Hero brief — a single card, split 1.6 / 1 columns.
- Left half: small mono kicker with date (
SATURDAY · APRIL 18), followed by a one-sentence prose summary in Fraunces 500 / 26px, letter-spacing -0.015em, with--badred on the "running hot" substring. Two buttons below: primary "Open daily board" (ink fill), secondary "Oven schedule" (outlined). - Right half: 2×2 grid of
Metrictiles with mono numerals, a mono kicker label, and an optional delta in--ok/--badwithbi-arrow-up-right/bi-arrow-down-right.
- Left half: small mono kicker with date (
- Needs attention row — a single card with a header ("Needs attention · chip showing count") and 3 equal cells separated by vertical 1px rules. Each cell: status chip, large mono number, one-line label, mono detail.
- Two-up — left 2/3: "Floor activity" feed (time · mono job id · customer · event-chip). Right 1/3: A/R aging with 4px bars, mono dollar amounts aligned right.
No icon bubbles anywhere. No gradient backgrounds.
2. Jobs list (Views/Jobs/Index.cshtml)
Replace:
- Both stat strips (
.stats-cards-desktopAND.mobile-stats-compact). - The
bg-white shadow-smtable card chrome. - The purple-link job number styling.
With:
- Single metric strip — one card, 5 columns, each cell a
Metricprimitive. Delete the mobile-stats duplicate; the strip is already compact enough. - Toolbar — left: search input (with
/shortcut hint) + pill-row of quick views (All,Due ≤ 48h,On floor,Ready,Mine). Right: Filters + New job (ink fill). - Table — borderless rows, 1px soft rules, mono uppercase headers at 10px / 0.12em tracking. Columns: Job (mono), Description (with a tiny dot + customer subline), Customer, Due (mono, red if hot), Status (chip), Priority (small text), Total (right-aligned mono), … menu.
- Hot-job indicator — a 2px red bar on the left edge of the job ID cell, not a colored row.
- Keyboard hint footer — mono text:
↑↓ to move · ↵ to open · ⌘F to filter.
3. Daily board (Views/Jobs/Board.cshtml)
Replace:
- Column tints (every column currently has its own bg color).
- Priority-as-colored-left-border (
border-left: 4px solid {{priorityColor}}).
With:
- Column header — mono uppercase label + small count pill. No fill. A thin 1px
--ruleunderline separates header from cards. - Curing column — gets a small live "oven meter" strip:
<i class="bi-fire"></i> 180°C · 14 minwith a pulsing--emberdot. The strip is the only saturated color on the board. - Hot jobs — a single 2px red edge on the card's left, drawn as a pseudo-element so it doesn't change card padding.
- Card footer — 1px
--rule-softtop border, mono row: powder swatch (9px color chip generated from a lookup onPowderInventory.ColorHexor a name→hex map) + powder name + parts count + priority dot. - Toolbar — segmented view switch (Board / List / Oven) + mono stats line (
11 jobs on floor · 2 hot · avg cycle 3.2 d) + Group/Hide controls.
Design Tokens
Add these to the top of wwwroot/css/site.css (or a new wwwroot/css/tokens.css linked from _Layout.cshtml before Bootstrap):
:root {
/* Neutrals — warm paper */
--pcl-ink: #0F0F10;
--pcl-graphite: #1A1A1C;
--pcl-slate: #3A3A3E;
--pcl-steel: #6B6B70;
--pcl-mute: #9A9A9F;
--pcl-rule: #E4E2DC;
--pcl-rule-soft: #EFEDE7;
--pcl-paper: #FAFAF7;
--pcl-paper-2: #F3F1EB;
--pcl-card: #FFFFFF;
/* Signal — shared chroma, varied hue */
--pcl-ember: oklch(0.68 0.17 50);
--pcl-ember-tint: oklch(0.95 0.04 55);
--pcl-ember-ink: oklch(0.42 0.15 40);
--pcl-ok: oklch(0.62 0.11 155);
--pcl-ok-tint: oklch(0.95 0.04 155);
--pcl-warn: oklch(0.76 0.13 80);
--pcl-warn-tint: oklch(0.96 0.05 85);
--pcl-bad: oklch(0.60 0.19 25);
--pcl-bad-tint: oklch(0.95 0.04 25);
--pcl-cool: oklch(0.58 0.09 240);
--pcl-cool-tint: oklch(0.95 0.03 240);
/* Bootstrap overrides */
--bs-body-bg: var(--pcl-paper);
--bs-body-color: var(--pcl-ink);
--bs-border-color: var(--pcl-rule);
--bs-primary: var(--pcl-ink); /* primary actions are ink-filled */
}
/* Dark surface variant — applied on data-surface="ink" */
[data-surface="ink"] {
--pcl-paper: #0E0E10;
--pcl-paper-2: #17171A;
--pcl-card: #1C1C20;
--pcl-ink: #F4F2EC;
--pcl-slate: #C2C0BA;
--pcl-steel: #8A8883;
--pcl-rule: #2B2B2F;
--pcl-rule-soft:#232327;
}
Spacing / radius / type scale
| Token | Value | Use |
|---|---|---|
| radius-sm | 4px | swatches, small chips |
| radius | 6px | buttons, inputs, cards within a card |
| radius-lg | 8px | top-level cards, toolbars |
| space-1…6 | 4 / 8 / 12 / 16 / 20 / 24 px | grid gaps |
| font-display | Fraunces 500, -0.015em | hero brief only |
| font-ui | Inter 400/500/600, -0.005em | everything else |
| font-mono | IBM Plex Mono 400/500, feature-settings "zero" | all numerics, IDs, timestamps, keyboard hints, column kickers |
Type sizes
| Name | Size / line | Weight | Use |
|---|---|---|---|
| display | 26 / 1.2 | Fraunces 500 | dashboard hero sentence |
| h1 | 22 / 1.25 | Inter 600 | page title |
| h2 | 16 / 1.35 | Inter 600 | section header inside card |
| body | 13 / 1.5 | Inter 400 | table rows, card body |
| meta | 12 / 1.5 | Inter 400 --pcl-slate |
secondary text |
| kicker | 10 / 1.2, 0.14em tracking, uppercase | IBM Plex Mono 500 --pcl-steel |
column headers, card section labels |
| metric | 26 / 1 | IBM Plex Mono 500 | KPI value |
Razor Partials to Build
_StatusChip.cshtml
@model (string Kind, string Text)
<span class="pcl-chip pcl-chip-@Model.Kind">
<span class="pcl-chip-dot"></span>@Model.Text
</span>
CSS: background --pcl-{kind}-tint, color --pcl-{kind}, dot --pcl-{kind}, IBM Plex Mono 10.5px, 2px 8px padding, 99px radius. Kinds: neutral, ok, warn, bad, cool, ember.
Use this everywhere status badges exist today: Jobs, Invoices, Equipment, Maintenance, Customers. Replace every occurrence of bg-success bg-warning bg-danger badges.
_Metric.cshtml
@model (string Label, string Value, string? Delta, string? DeltaDir)
Renders: mono kicker label, mono 26px value, optional mono delta with arrow. No icon bubble.
_SectionHeader.cshtml
Kicker label + title + optional right-aligned mono meta. Replaces today's <div class="card-header fw-bold">.
_PowderSwatch.cshtml
@model (string ColorHex, string Name, int? Size)
<span class="pcl-swatch" style="background:@Model.ColorHex" title="@Model.Name"></span>
9px color chip + 1px rgba(0,0,0,0.12) border. Use it anywhere a powder name appears.
Interactions & Behavior
- Hover on table row:
background: var(--pcl-paper-2)only. No elevation change. - Row keyboard nav: arrow keys move a focus ring,
enteropens. The hint footer on Jobs list documents this. - Buttons: primary =
--pcl-inkbg,--pcl-paperfg; ghost =--pcl-cardbg,--pcl-ruleborder,--pcl-inktext. No box shadows. 6px radius. - Focus ring: 2px outline in
--pcl-ember, 2px offset. - Oven meter pulse:
@keyframes pulse { 0%,100% { opacity: 1 } 50% { opacity: 0.3 } }on the ember dot — 1.5s. This is the only loop animation allowed. Kill.badge-glow-critical. - Toast / alert: keep existing Toastr wiring; restyle to use the tokens.
Sidebar
Keep the existing sidebar structure but:
- Ship only Paper (default) and Ink sidebar themes. Delete the 12
[data-sidebar=…]gradient variants. - Active item: 2px
--pcl-emberleft bar + icon tinted ember +--pcl-papertext. No gradient. - Add a ⌘K search affordance at the top of the nav (scaffold — wire later).
- Group headers: mono uppercase, 0.12em tracking,
rgba(255,255,255,0.35)on ink surface.
Files to Touch
| Layer | File | Change |
|---|---|---|
| Tokens | wwwroot/css/site.css |
Prepend :root token block; delete rainbow KPI colors, glow keyframes, 11 of 12 sidebar palettes |
| Layout | Views/Shared/_Layout.cshtml |
Swap sidebar theming; load Fraunces + IBM Plex Mono + Inter from Google Fonts; add _StatusChip + _Metric partials |
| Dashboard | Views/Dashboard/Index.cshtml |
Rewrite top 60% of the file (welcome banner + KPI grid) |
| Jobs | Views/Jobs/Index.cshtml |
Collapse both stat strips into one metric row; restyle table; add quick-view chips |
| Board | Views/Jobs/Board.cshtml |
Kill column tints + priority left-border; add oven meter; card footer redesign |
| Shared | Views/Shared/_Metric.cshtml, _StatusChip.cshtml, _SectionHeader.cshtml, _PowderSwatch.cshtml |
New partials |
The remaining CRUD pages (Customers, Invoices, Inventory, etc.) inherit the new look automatically once the tokens, _StatusChip, and _Metric partials land — they all use the same stat-strip + card-table layout today.
Shipping Order
- Tokens + font imports — ½ day
_StatusChip+_Metricpartials and a codebase-wide find-and-replace ofbadge bg-{color}/ stat-card markup — 1 day- Dashboard rewrite — ½ day
- Jobs list rewrite — ½ day
- Daily board rewrite — 1 day
- Sidebar simplification + ⌘K scaffold — ½ day
- Sweep remaining list pages (Customers, Invoices, Equipment, Maintenance, Vendors, PO) using the established partials — 1–2 days
~5–6 dev days to ship the visual overhaul.
Files in This Bundle
Design Review.html— interactive document with before/after comparisons. Open locally.mock_components.jsx,screens_before.jsx,screens_after.jsx,review_app.jsx— React source for the mocks. Reference only.CLAUDE.md— brief for Claude Code when run insidePowderCoating.Web/.DARK_MODE.md— supplemental brief that supersedes the dark-surface tokens below and adds Bootstrap theme binding, a persisted toggle, and per-screen verification. Read this if you're implementing or fixing dark mode.
Assets
No new image assets required. Keep wwwroot/images/pcl-logo.png. Powder color hex values come from existing PowderInventory.ColorHex column (or a name→hex fallback map in a new Helpers/PowderSwatchHelper.cs if that column isn't populated).