← Back to the portal concept Engineering handoff · concept · internal

Portal sign-in reskin

Reskin of the customer portal sign-in pages (/accounts/login/ and /accounts/login/password/) to the 2026 brand system. This is a template and stylesheet change only. No changes to authentication logic, routing, or the identifier-first flow. The report viewer and everything post-login are out of scope.

Working reference: the interactive concept page. Source of truth for markup and CSS: portal.html in the Perspectum-Concept repo. The page is self-contained: one inline style block plus assets/css/tokens.css and assets/fonts/fonts.css.

Scope

In scope: the two login templates, forgot-password page styling to match, the logo asset swap (portal-logo.png is replaced by perspectum-navy.svg), fonts, colours, spacing.

Not in scope: auth behaviour, staff OAuth route, session handling, report rendering (report output colours are regulated and must never be restyled), post-login pages.

Flow mapping

Live routeConcept equivalentNotes
/accounts/login/Step 1: username field + NextIdentifier-first flow preserved exactly
/accounts/login/password/Step 2: password + Sign in, staff block appearsStaff OAuth link de-emphasised below a “Perspectum staff” divider, not a parallel card
/accounts/forgot_password“Forgotten your password?” link above the password fieldKeep route, restyle page to match
/accounts/oauth/login/“Staff sign in” outline buttonUnchanged target

The concept demonstrates the two steps with a few lines of JS on one page. In production these remain two server-rendered templates; no JS flow change is requested.

Layout

Desktop (>980px): two equal columns (grid-template-columns: 1fr 1fr), min-height 100vh. Left: warm off-white sign-in column, content block max-width 380px, centred both ways. Right: navy panel, content block max-width 420px, centred, with a decorative concentric-arc SVG positioned absolutely top right (pointer-events: none, clipped by overflow: hidden).

Mobile (<980px): columns stack, sign-in first, no forced viewport height, 24px horizontal padding, input font-size raised to 16px to prevent iOS zoom on focus. Short desktop viewports (<820px height) use the compressed spacing set already in the stylesheet.

Design tokens

Single source: assets/css/tokens.css. Copy into portal static assets; do not fork values.

TokenValueUsage
--bg#F7F4EELeft column ground, primary button text
--ink#0A1A2FBody text, navy panel ground, outline button border
--ink-soft#3D3D3DSecondary text, muted labels
--rule#E2DBC9Hairlines, input borders, dividers
--terracotta as --accent#B05434Primary button fill only; never as small text or outline
--sandstone as --accent-light#E9A582Bold em in the navy panel heading only
--science-light#82A892Status dot
--data#5BC8E6Decorative arcs on navy only (dark grounds only, per brand rules)
--radius-sm6pxInputs and buttons
--dur / --ease200ms / cubic-bezier(.2,.6,.2,1)All transitions

Typography: --display (Space Grotesk) for headings, eyebrows, labels and the certification line; --body (Inter) for body and buttons. Fonts are self-hosted woff2 in assets/fonts/; serve them from portal infrastructure, no external font CDN.

States and interactions

ElementStateBehaviour
Text inputFocusBorder --ink, ring 0 0 0 3px rgba(10,26,47,0.12), no default outline
Primary buttonHoverfilter: brightness(0.92), 200ms
Staff outline buttonHoverBackground --bg-card (#EFEAE0)
Links (left column)HoverUnderlined; --ink-soft to --ink
Navy panel list itemHoverTitle underlines; the whole row is the link target
FormErrorNot designed yet. Use --terracotta border on the failing input plus a 14px message below it in --ink; do not introduce a new red. Confirm final copy with brand
FormSubmittingDisable button, keep label; no spinner needed at this scale

Edge cases carried over from the live page

These behaviours exist today and must survive the reskin: the unsupported-browser modal, the JavaScript-disabled notice, and the “Report a problem” mailto modal. Restyle them with the same tokens (navy text on off-white, hairline rules); do not drop them.

Long values: the username field accepts long strings; input scrolls internally, no wrap. Translations are not in scope (single-language page).

Content

All strings are in the concept page and are final unless flagged: eyebrow “Customer Portal”, heading “Sign in”, subline “Access your reports and studies.”, the authorised-users notice, and the footer links (Report a problem, Provide feedback, Terms of Use, Privacy Policy; both PDFs unchanged).

Flagged, resolve before build:

  1. Field label: concept says “Username”. Confirm whether the live step accepts email as well; label accordingly.
  2. Certification line (ISO 27001, Cyber Essentials Plus, NHS DSPT, GDPR, HIPAA): pending QARA confirmation. Build as a template include that can be removed without layout impact.
  3. “All services operational”: must be driven by a real status source, or ship as a plain “Service status” link with no dot and no claim. Do not hard-code the operational state.
  4. Navy panel list items (What is new, Training, Sample reports): destinations to be confirmed. Build as a list partial; items must be removable individually, and the panel must look intentional with one, two or three items.

Accessibility

Focus order: logo, username, primary button, then footer links; on step 2: password, forgotten-password link, sign in, staff sign in. Labels are real <label for> elements, not placeholders. The decorative arc SVG carries aria-hidden="true". Logo alt="Perspectum". All text combinations in the concept pass WCAG AA on their grounds; if any value changes, re-check the terracotta button text and the 66%-opacity text on navy. Both steps must be fully keyboard-operable, which they are by default as standard forms.

Analytics

Add click tracking to the three navy-panel items and the staff sign-in link, using whatever the portal already uses. This is the evidence for keeping or cutting the panel content after 60 days.

Assets to take from the concept repo

assets/logos/perspectum-navy.svg (wordmark, single colour #0A1A2F), assets/css/tokens.css, assets/fonts/ (fonts.css plus six woff2 files), and portal.html itself as the markup reference.