Raxx · internal docs

internal · gated

MarketTimeWidget — 4 Variant Mockups

Produced for operator request 2026-05-31. Explores richer treatments of the MarketTimeWidget beyond the post-#3182 baseline (tabular-nums, moss pulse, no-wrap). Each variant covers two modes and two states.

Screenshots rendered 2026-06-06 at 1440×900 via Playwright (Chromium).

Related memory rules: - feedback_moss_pill_live_indicator — moss-pill is a brand pattern; every variant preserves it - feedback_all_surfaces_confidence_engine — CE moss/cream/ink palette used throughout - feedback_no_forward_looking_framing — countdown labels say "Closes in" / "Opens in", not predictions


Comparison Grid

All 4 Variants


Variant A — Baseline

Variant A Baseline

The post-#3182 reference implementation. A flat, single-line compact strip in the AppHeader: day name + ET time + pill + countdown. Full/Dashboard mode scales up the time display to 22px and adds the pill inline. No spatial or session-boundary information is conveyed — purely a status strip. It's the lowest-weight option and the stable floor for evaluating the others.


Variant B — Hours Bar

Variant B Hours Bar

Adds an SVG horizontal timeline covering a 16-hour window (4 AM–8 PM ET) divided into three colored segments: premarket (dim moss), regular hours (solid moss), after-hours (dim moss). A live "now" marker (white tick + pulsing dot) slides across. Compact mode shows a ~120px bar beside the time label; full/Dashboard mode expands to a labeled 460px bar with ticks at 4 AM, 9:30, 12 PM, 4 PM, and 8 PM. The now-marker gives instant spatial awareness of where you are in the session — no reading required.


Variant C — Clock Face

Variant C Clock Face

A 24-hour radial clock SVG as the identifying element. The outer ring is divided into arc segments keyed to the CE palette — bright moss for regular trading hours, dim moss for extended hours, transparent for the closed overnight gap. A single hand points to the current ET hour; a pulsing dot marks the hand tip when the market is open. Compact mode embeds a 32px circle in the AppHeader before the time label; full/Dashboard mode uses a 96px face alongside the day/time/pill strip. This is the most brand-distinctive treatment — nothing else in the app looks like it.


Variant D — Rich Schedule

Variant D Rich Schedule

A full-card Dashboard widget that surfaces everything a user needs before a session: day + full date at large size, live ET time at 26px tabular-nums, the session's open and close times flanking a thin progress line, a ticking countdown with seconds separated to prevent layout jitter (46h 28m · 07s), and a next-holiday note. Compact/AppHeader mode trims to a text strip similar to A. The full card is meaningfully richer than the other full modes — it answers "when does it open, when does it close, what's coming up" without a click.


Comparison Table

Variant Visual density Information revealed Engineering effort (days)
A — Baseline Low Status + countdown only 0 — already shipped
B — Hours Bar Medium Spatial position in trading day 1–2
C — Clock Face Medium Session arc + temporal position 2–3
D — Rich Schedule High Open/close times, countdown, holiday 1–2

Designer's Recommendation

Ship C (Clock Face) in the AppHeader compact slot + D (Rich Schedule) as the Dashboard card.

Variant C's compact 32px SVG clock is the most brand-distinctive element any of the four variants produce. The hand-position against the moss arc communicates "where are we in the trading day" at a glance without the user reading any text — that's a meaningful UX improvement over A's pure text strip. The engineering cost is the highest of the set (2–3 days) but the SVG is fully self-contained; no library dependency.

Variant D's full card wins for the Dashboard slot — it has the most information density in the clearest layout, and the separated-seconds countdown (h/m · s) is a thoughtful touch that keeps the layout stable while making the live nature of the data visible.

Variant B is a strong second option if C feels too unconventional. The hours bar in full/Dashboard mode is highly legible and would be immediately understood by any user who thinks in "session blocks." Compact B is weaker — the mini bar without a legend may feel opaque on first encounter.

Variant A is the floor. Keep it if there's no bandwidth for anything else, but the other three represent meaningful UX gains with small implementation budgets.


Files

File Variant Description
variant-a-baseline.html A — Baseline What shipped in #3182 (reference)
variant-b-hours-bar.html B — Hours Bar SVG horizontal trading-day bar with live now-marker
variant-c-clock-face.html C — Clock Face 24h radial clock with session arcs + live hand
variant-d-rich-schedule.html D — Rich Schedule Card with day/date, open/close times, ticking countdown, holiday note

Each file is fully self-contained: no external CSS, no CDN dependencies, live JavaScript ticking at 1s intervals.


Variant Intents + Tradeoffs

Variant A — Baseline (reference)

Intent: Document what is already live. A flat, single-line, compact strip: day name + ET time + pill + countdown. Full mode adds larger time display.

Tradeoffs: - Very low visual weight — fits cleanly into any header. - Carries no spatial/contextual information about where we are in the trading day. - Serves well as the stable floor for comparing the others.

Data dependency: is_open, next_open_at, next_close_at (all already available).


Variant B — SVG Hours Bar

Intent: Make the trading day legible as a spatial timeline. A 16-hour window (4 AM–8 PM ET) is rendered as an SVG bar divided into three segments: premarket (dim moss), regular hours (solid moss), after-hours (dim moss). A live "now" marker (white tick + pulsing green dot) slides across.

Compact mode: 120px bar sits beside a compact day/time label. The bar becomes a mini progress indicator — "where are we in today's session at a glance?"

Full mode: 460px bar with labeled time ticks (4 AM / 9:30 / 12 PM / 4 PM / 8 PM). Hover tooltip names the segment. The now-marker's pulse animation makes it feel alive.

Tradeoffs: - High legibility for spatial position in the trading day — particularly useful for users who think in "session blocks." - Compact bar may feel opaque on first encounter without a legend. - Tooltip is hover-only; mobile needs a tap reveal. - Adds ~40px of horizontal width vs. baseline compact. - Requires no new data (segment boundaries are static constants).

Data dependency: Same as A. Segment boundaries are hardcoded constants.


Variant C — Clock Face

Intent: A radial 24h clock face as the identifying element. The outer ring is divided into four arc segments keyed to the CE palette: premarket (dim moss arc), regular hours (bright moss arc), after-hours (dim moss arc), closed (transparent gap). A single moss hand points to the current ET hour. The minute-position dot pulses when the market is open.

Compact mode: 32px circle sits in the header before the time label. The clock functions as a "what session is active" glyph — the hand's position against the moss arc is immediately readable.

Full mode: 96px clock alongside day name, time, pill, and countdown. The larger face shows tick marks at 0h, 6h, 12h, 18h.

Tradeoffs: - Highest brand distinctiveness — a radial 24h clock is unusual and memorable. This is the "coolest thing" candidate. - Compact 32px face is readable but requires brief user orientation on first use (24h, not 12h). - The SVG is fully self-contained; no canvas or external library needed. - Requires no new data beyond what's already available. - Animation is disciplined: one pulsing dot, one ticking hand. Nothing else moves.

Data dependency: Same as A. Clock hand uses client-side ET time only.


Variant D — Rich Schedule

Intent: A card mode that shows everything a trader needs before the session: the current date and time prominently, the session's open/close times side by side, a live countdown with the seconds component ticking, and the next market holiday. Compact mode trims to day + time + pill + countdown, slightly tighter than baseline.

Full mode key elements: - Day name + full date ("Saturday, Jun 6") — large and prominent - Live ET time at 26px tabular-nums - Pill with moss pulse - Open time / connector line / Close time (9:30 AM — 4:00 PM) - Countdown with separated seconds ("46h 28m · 07s") so h/m stays stable while seconds tick - Next holiday note (static data, operator-supplied or hardcoded for v1)

Tradeoffs: - Highest information density of the four. Best for a dedicated Dashboard widget slot; too tall for an AppHeader insert. - Compact version is strictly a text strip — no new visual affordance vs. A. - Holiday note requires either a hardcoded lookup table or a new API field. For v1 a static US market holiday list is ~10 lines of data. - The separated-seconds pattern (46h 28m · 07s) is specifically chosen to prevent layout jitter from seconds changing the h/m column width.

Data dependency: is_open, next_open_at, next_close_at (already available) + optional next_holiday: { date, name } from getMarketHours().


Decision Matrix

Criterion A (Baseline) B (Hours Bar) C (Clock Face) D (Rich Schedule)
Information density Low Medium Medium High
Compact-mode legibility Excellent Good Good Good
Full-mode legibility Good Very good Very good Excellent
Visual weight in header Minimal +40px wide +32px wide Minimal
Data-source complexity None new None new None new +holiday field (optional)
Animation discipline 1 pulse 1 pulse + sliding marker 1 pulse + rotating hand 1 pulse + ticking seconds
Accessibility (screen reader) Good (text) Needs ARIA Needs ARIA Good (text)
Brand distinctiveness Low Medium High Medium
Implementation complexity 1 (shipped) 2 3 2

How to Evaluate

Navigate to:

https://raxx-mockups.pages.dev/market-time-widget-variants-2026-06-06/

Open each HTML file and view at: - Desktop (1280px) — check the full-mode cards read cleanly - Tablet (768px) — check the state-row wraps without clipping - Mobile (375px) — verify compact-mode header doesn't overflow

Key evaluation questions: 1. Does the compact-mode widget feel native in the AppHeader dark bar? 2. At a glance, can you tell where you are in the trading day without reading text? 3. Does the animation feel disciplined (not distracting during a backtest review)? 4. Does the full-mode add meaningful context versus just a bigger version of compact?


Specs for feature-developer

If picking up these mockups, getMarketHours() already returns the fields needed for A, B, and C. Variant D's holiday note is the only additive field:

{
  "is_open": true,
  "next_open_at": "2026-06-09T13:30:00Z",
  "next_close_at": "2026-06-09T20:00:00Z",
  "next_holiday": {
    "date": "2026-07-03",
    "name": "Independence Day"
  }
}

The next_holiday field can be omitted at first (the widget hides the holiday band when absent) and added in a follow-up backend card.

All client-side clock math uses Intl.DateTimeFormat with timeZone: 'America/New_York' — no moment.js or date-fns dependency. The existing etWallClockToUtc helper in MarketTimeWidget.js can be extracted to a shared util.