Visual language specification for the Nexus Hub Dashboard. Defines the 6-skin theme engine, glassmorphism panel system, typography scale, colour tokens, spacing rules, animation parameters, and component patterns. All values extracted from NEXUS_APP.html v1 CSS (4068 lines).
6-skin system with CSS custom properties and localStorage persistence
The Hub Dashboard supports 6 visual themes (skins). Each skin defines a set of CSS custom properties applied to :root. The active skin is stored in localStorage('nexus-hub-skin') and applied on page load. Skins can be switched via hub top bar swatches or FAB cycle action.
| Skin ID | Name | --hub-primary | --hub-surface | --hub-glow | --hub-border |
|---|---|---|---|---|---|
nexus-dark | Nexus Indigo | #6366F1 | rgba(15,23,42,0.6) | rgba(99,102,241,0.15) | rgba(99,102,241,0.2) |
codezero | CodeZero Violet | #8B5CF6 | rgba(20,10,40,0.6) | rgba(139,92,246,0.15) | rgba(139,92,246,0.2) |
arctic | Arctic Blue | #38BDF8 | rgba(10,20,35,0.6) | rgba(56,189,248,0.12) | rgba(56,189,248,0.18) |
graphite | Apple Graphite | #A1A1AA | rgba(20,20,22,0.65) | rgba(161,161,170,0.08) | rgba(161,161,170,0.15) |
aurora | Aurora Glass | #34D399 | rgba(5,25,20,0.6) | rgba(52,211,153,0.12) | rgba(52,211,153,0.18) |
ember | Ember Forge | #F97316 | rgba(30,15,5,0.6) | rgba(249,115,22,0.15) | rgba(249,115,22,0.2) |
:root {
--hub-primary: [accent colour];
--hub-surface: [panel background with alpha];
--hub-glow: [glow/shadow accent];
--hub-border: [panel border colour];
--hub-text: #FFFFFF;
--hub-text-dim: rgba(255,255,255,0.7);
--hub-text-muted: rgba(255,255,255,0.4);
--hub-bg: #0A0A0F;
--hub-bg2: #12121A;
}
Frosted glass visual language for elevated surfaces
.glass-panel {
background: var(--hub-surface);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid var(--hub-border);
border-radius: 16px;
box-shadow: 0 8px 32px rgba(0,0,0,0.3),
inset 0 1px 0 rgba(255,255,255,0.05);
}
.glass-panel-sm {
background: var(--hub-surface);
backdrop-filter: blur(12px);
border: 1px solid var(--hub-border);
border-radius: 12px;
box-shadow: 0 4px 16px rgba(0,0,0,0.2);
}
Usage: Org cards use .glass-panel. Roadmap items, metric boxes, and badges use .glass-panel-sm.
Font families, sizes, weights, and hierarchy
| Element | Font | Size | Weight | Colour |
|---|---|---|---|---|
| Hub title (System Dashboard) | Inter | 24px | 800 | --hub-text |
| Card org name | Inter | 16px | 700 | --hub-text |
| Card domain | Inter | 11px | 500 | --hub-primary |
| Card description | Inter | 12px | 400 | --hub-text-dim |
| Stat value | Inter | 18px | 700 | --hub-text |
| Stat label | Inter | 9px | 600 | --hub-text-muted |
| Badge | Inter | 9px | 600 | varies |
| Roadmap title | Inter | 12px | 600 | --hub-text |
| Roadmap ETA | monospace | 10px | 500 | --hub-primary |
| Timeline text | Inter | 11px | 400 | --hub-text-dim |
| Timeline time | monospace | 10px | 400 | --hub-text-muted |
| Sidebar nav item | Inter | 13px | 500 | --hub-text-dim / --hub-primary (active) |
| Version badge | monospace | 10px | 600 | --hub-primary |
Base colours used across all skins
Grid system, gaps, padding rules
| Context | Value | CSS |
|---|---|---|
| Hub layout gap | 24px | grid gap between main and sidebar |
| Cards grid gap | 16px | gap between org cards |
| Card padding | 20px | internal padding |
| Card border-radius | 16px | rounded corners |
| Roadmap item gap | 8px | between roadmap entries |
| Top bar height | 56px | fixed hub top bar |
| Sidebar width (workspace) | 240px | fixed left sidebar |
| Run panel width | 300px | slide-out right panel |
| FAB size | 48px | trigger button diameter |
| FAB position | bottom:24px right:24px | fixed position |
| Breakpoint | Cards Columns | Layout |
|---|---|---|
| > 1100px | 3 columns | Main + sidebar side-by-side |
| 900px - 1100px | 2 columns | Main + sidebar side-by-side (narrower) |
| < 900px | 1 column | Stacked (sidebar below main) |
Motion design parameters
| Animation | Property | Duration | Easing | Trigger |
|---|---|---|---|---|
| Card reveal | opacity, transform(translateY) | 500ms | cubic-bezier(0.4,0,0.2,1) | Staggered: 100ms + (index * 80ms) delay |
| Roadmap reveal | opacity, transform(translateY) | 500ms | cubic-bezier(0.4,0,0.2,1) | Staggered with delay classes (d1-d5) |
| Card hover | transform(translateY), box-shadow | 200ms | ease | :hover pseudo-class |
| Theme switch | CSS custom properties | 300ms | ease | Skin button click |
| FAB open/close | opacity, transform(scale) | 200ms | ease | Trigger click |
| Run panel slide | transform(translateX) | 250ms | ease | .open class toggle |
| Sidebar item hover | background, color | 150ms | ease | :hover pseudo-class |
/* Base state (hidden) */
.hub-reveal {
opacity: 0;
transform: translateY(20px);
transition: opacity 500ms cubic-bezier(0.4,0,0.2,1),
transform 500ms cubic-bezier(0.4,0,0.2,1);
}
/* Visible state */
.hub-reveal.visible {
opacity: 1;
transform: translateY(0);
}
/* Stagger delays */
.hub-reveal-d1 { transition-delay: 100ms; }
.hub-reveal-d2 { transition-delay: 200ms; }
.hub-reveal-d3 { transition-delay: 300ms; }
.hub-reveal-d4 { transition-delay: 400ms; }
.hub-reveal-d5 { transition-delay: 500ms; }
Reusable UI component specifications
Glass panel card displaying organisation information and stats.
.hub-card {
/* Inherits .glass-panel */
cursor: pointer;
transition: transform 200ms ease, box-shadow 200ms ease;
}
.hub-card:hover {
transform: translateY(-4px);
box-shadow: 0 12px 40px rgba(0,0,0,0.4),
0 0 20px var(--hub-glow);
}
.hub-badge {
font-size: 9px;
font-weight: 600;
padding: 3px 9px;
border-radius: 9999px;
border: 1px solid;
text-transform: uppercase;
letter-spacing: 0.05em;
}
| Variant | Background | Border | Text | Usage |
|---|---|---|---|---|
| Role | rgba(primary, 0.1) | rgba(primary, 0.2) | --hub-primary | User role (admin, user) |
| Active | rgba(16,185,129,0.1) | rgba(16,185,129,0.2) | #10B981 | Status: active |
| Pilot | rgba(245,158,11,0.1) | rgba(245,158,11,0.2) | #F59E0B | Status: pilot |
| Planned | rgba(255,255,255,0.05) | rgba(255,255,255,0.1) | --hub-text-muted | Status: planned |
| Chameleon | rgba(139,92,246,0.08) | rgba(139,92,246,0.2) | #8B5CF6 | Has Chameleon forms |
.hub-roadmap-progress {
height: 4px;
background: rgba(255,255,255,0.1);
border-radius: 2px;
overflow: hidden;
margin: 6px 0;
}
.hub-roadmap-progress-fill {
height: 100%;
background: var(--hub-primary);
border-radius: 2px;
transition: width 600ms ease;
}
.nav-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 14px;
border-radius: 8px;
font-size: 13px;
font-weight: 500;
color: var(--hub-text-dim);
cursor: pointer;
transition: background 150ms ease, color 150ms ease;
}
.nav-item:hover {
background: rgba(var(--hub-primary-rgb), 0.08);
color: var(--hub-text);
}
.nav-item.active {
background: rgba(var(--hub-primary-rgb), 0.12);
color: var(--hub-primary);
font-weight: 600;
}
.nexus-fab {
position: fixed;
bottom: 24px;
right: 24px;
z-index: 1000;
}
.nexus-fab-trigger {
width: 48px;
height: 48px;
border-radius: 50%;
background: var(--hub-primary);
color: white;
font-weight: 800;
font-size: 18px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
box-shadow: 0 4px 16px rgba(0,0,0,0.3);
}
.nexus-fab-menu {
position: absolute;
bottom: 60px;
right: 0;
min-width: 220px;
background: var(--hub-surface);
backdrop-filter: blur(20px);
border: 1px solid var(--hub-border);
border-radius: 12px;
padding: 8px;
opacity: 0;
transform: scale(0.9);
pointer-events: none;
transition: opacity 200ms ease, transform 200ms ease;
}
.nexus-fab.open .nexus-fab-menu {
opacity: 1;
transform: scale(1);
pointer-events: all;
}
Per-organisation CSS injection from nav-menu pipeline
When entering a workspace, the nav-menu pipeline can return a theme object with CSS custom property overrides. These are injected into a <style id="theme-override"> element as :root variables.
/* nav_config.theme example */
{
"--na-primary": "#D4607F",
"--na-bg": "#FFFAF5",
"--na-text": "#1F2937",
"--na-brand-gradient": "linear-gradient(135deg, #F2A0B5, #F4A261)",
"--na-body-class": "arc-theme"
}
/* Applied as: */
:root {
--na-primary: #D4607F;
--na-bg: #FFFAF5;
--na-text: #1F2937;
--na-brand-gradient: linear-gradient(135deg, #F2A0B5, #F4A261);
}
/* Extra scoped CSS for brand gradient (non-variable): */
.sidebar-org {
background: linear-gradient(135deg, #F2A0B5, #F4A261);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
When returning to hub, the theme-override style is cleared and document.body.className is reset, restoring the hub skin.