Comms
The bottom-right corner — the close of the us diagonal (brand top-left ↔ comms bottom-right), and the mirror of Preferences. No fuss — just a round silver-blue button. One door with one job: talk to a human — no sales-or-support fork, no channel picker, no bot to get past. Comms is helpful background, not the main event — that's why this corner wears silver, not gold. (The AI assistant is its own launcher in the app-bar middle; this door is for people.)
BetaComms is Beta — CommsCorner is the pattern’s component. The mailto transport is settled; the popover + message form stage arrives only when a real comms backend ships.
Today the launcher IS the mailto link. Click it and your mail client opens — current page and build version already filled into the subject and body. No popover, no form. The mailto is the transport that never breaks, and hiding it behind a popover that can fail would defeat the point. When a real comms backend arrives (support inbox, websocket, the works), the pattern grows a popover and form next to this fallback — and the click still falls back to your mail client whenever the popover machinery can't run.
A round silver-blue button parked at bottom-right, mirror of Preferences at bottom-left. The trigger is a real <a href="mailto:…"> — left-click opens your mail client; right-click and middle-click behave like a real link (copy email, open as link). The page path and build version hitch a ride in the email body.
One way in — no sales-or-support fork, no chat / email / call menu, no bot to get past. The only choice you make is open comms with a human. When something's wrong, you shouldn't have to sort yourself into a queue before a person can help.
The mailto bakes page path and build version into the email body, so support knows where you were and which build you were on. When a real backend takes over, the same details ride the websocket or inbox channel — never on screen, always along for the ride.
This is the human door. The AI assistant has its own launcher in the app-bar middle. This button reaches a person — keep the two apart.
Silver-blue, bottom-right — the close of the us diagonal (brand top-left ↔ comms bottom-right), mirror of Preferences at bottom-left. They're the only silver that sticks around. Toasts stack above this corner, so a notification can never bury the door. Better still, it outlives the page: Comms mounts above the app's ErrorBoundary, out of reach of content errors — so the door still opens when the page behind it has crashed. Which is exactly when you want a human (and any AI assist here always keeps a bail-to-human escape hatch). (ADR-0027 · ADR-0025.)
API
The pattern’s component is CommsCorner — mount it once at the shell root, above the application’s ErrorBoundary (SiteLayout and Portal already mount it; pass them the comms config instead of mounting a second corner). One required prop, three optional.
- mailto
- The receiving address. Required — the launcher renders as a real mailto anchor pointed here, so link semantics (copy email address, open as link) come for free.
- subjectPrefix?
- Subject-line prefix; the current page path is appended after it. Defaults to the chrome bundle’s localized “Halo feedback”.
- version?
- Build version stamp appended to the email body alongside the page path — ambient context for support, never visible chrome.
- onError?
- Telemetry reporter — fires once if the corner’s internal boundary catches. The degraded fallback (same silver silhouette, pre-computed mailto) renders regardless; the door never closes.
Usage
import { CommsCorner } from '@halo-compliance/ui'
// Mount once, at the shell root, ABOVE the application's ErrorBoundary —
// the door must still open when the page behind it has crashed.
// (SiteLayout and Portal already mount it; pass comms={{ … }} there
// instead of mounting a second corner.)
<CommsCorner
mailto="support@halocompliance.com"
subjectPrefix="Halo feedback" // optional — chrome default applies
version={BUILD_VERSION} // rides along in the email body
onError={reportChromeError} // degraded fallback renders regardless
/>Related
- /shell — the shell’s four-corner lattice this door closes.
- /preferences — the mirror silver corner at bottom-left.
- /error-states — the degraded fallback that renders when the corner’s own boundary catches.