Files
CurrenciCombo/src/index.css
nsatoshi b66ec0a78f
Some checks failed
CI / Frontend Lint (push) Failing after 6s
CI / Frontend Type Check (push) Failing after 6s
CI / Frontend Build (push) Failing after 6s
CI / Frontend E2E Tests (push) Failing after 9s
CI / Orchestrator Build (push) Failing after 6s
CI / Contracts Compile (push) Failing after 6s
CI / Contracts Test (push) Failing after 6s
Security Scan / Dependency Vulnerability Scan (push) Failing after 4s
Security Scan / OWASP ZAP Scan (push) Failing after 4s
PR G: portal /transactions page + 12-state machine view (#11)
2026-04-22 17:18:52 +00:00

3947 lines
87 KiB
CSS

/* ═══════════════════════════════════════════════════════════════
TransactFlow — IDE-Style Transaction Builder
Dark theme professional workspace
═══════════════════════════════════════════════════════════════ */
:root {
--bg-base: #0e0e10;
--bg-surface: #141418;
--bg-elevated: #1a1a20;
--bg-hover: #22222a;
--bg-active: #2a2a34;
--bg-input: #18181e;
--border: #2a2a32;
--border-subtle: #222228;
--text-primary: #e4e4e8;
--text-secondary: #9898a4;
--text-muted: #5c5c68;
--accent-blue: #3b82f6;
--accent-green: #22c55e;
--accent-yellow: #eab308;
--accent-red: #ef4444;
--accent-purple: #a855f7;
--accent-orange: #f97316;
--title-bar-height: 40px;
--activity-bar-width: 48px;
--status-bar-height: 24px;
--font-mono: 'SF Mono', 'Cascadia Code', 'Fira Code', 'JetBrains Mono', 'Consolas', monospace;
--font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', Roboto, sans-serif;
--radius-sm: 4px;
--radius-md: 6px;
--radius-lg: 8px;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body, #root {
height: 100%;
width: 100%;
overflow: hidden;
font-family: var(--font-sans);
font-size: 13px;
color: var(--text-primary);
background: var(--bg-base);
-webkit-font-smoothing: antialiased;
}
/* Scrollbar */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #333; border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: #444; }
/* ─── APP SHELL ─────────────────────────────────────────────── */
.app-shell {
display: flex;
flex-direction: column;
height: 100vh;
width: 100vw;
overflow: hidden;
}
.app-body {
display: flex;
flex: 1;
min-height: 0;
overflow: hidden;
}
/* ─── TITLE BAR ─────────────────────────────────────────────── */
.title-bar {
height: var(--title-bar-height);
background: var(--bg-surface);
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 12px;
gap: 12px;
-webkit-app-region: drag;
user-select: none;
flex-shrink: 0;
}
.title-bar-left, .title-bar-right {
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
}
.title-bar-center {
flex: 1;
display: flex;
justify-content: center;
max-width: 480px;
margin: 0 auto;
}
.title-bar-logo {
display: flex;
align-items: center;
gap: 6px;
}
.title-bar-name {
font-weight: 700;
font-size: 13px;
color: var(--text-primary);
letter-spacing: -0.3px;
}
.title-bar-workspace {
font-size: 12px;
color: var(--text-secondary);
}
.title-bar-separator {
width: 1px;
height: 16px;
background: var(--border);
}
.title-bar-search {
display: flex;
align-items: center;
gap: 8px;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 5px 12px;
color: var(--text-muted);
font-size: 12px;
cursor: pointer;
width: 100%;
transition: border-color 0.15s;
}
.title-bar-search:hover {
border-color: var(--text-muted);
}
.title-bar-search kbd {
margin-left: auto;
font-size: 10px;
font-family: var(--font-mono);
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 3px;
padding: 1px 5px;
color: var(--text-muted);
}
.mode-selector {
display: flex;
align-items: center;
gap: 6px;
padding: 3px 10px;
border-radius: var(--radius-sm);
cursor: pointer;
font-size: 12px;
color: var(--text-secondary);
position: relative;
transition: background 0.15s;
}
.mode-selector:hover { background: var(--bg-hover); }
.mode-dot {
width: 7px;
height: 7px;
border-radius: 50%;
flex-shrink: 0;
}
.mode-dropdown {
position: absolute;
top: 100%;
left: 0;
margin-top: 4px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 4px;
z-index: 100;
min-width: 160px;
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
}
.mode-option {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 10px;
border-radius: var(--radius-sm);
cursor: pointer;
font-size: 12px;
color: var(--text-secondary);
transition: background 0.1s;
}
.mode-option:hover { background: var(--bg-hover); color: var(--text-primary); }
.mode-option.active { background: var(--bg-active); color: var(--text-primary); }
.title-bar-action {
display: flex;
align-items: center;
gap: 5px;
padding: 4px 12px;
border-radius: var(--radius-sm);
border: 1px solid transparent;
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s;
background: transparent;
color: var(--text-secondary);
}
.title-bar-action.validate {
color: var(--accent-green);
border-color: var(--accent-green)30;
}
.title-bar-action.validate:hover { background: rgba(34,197,94,0.1); }
.title-bar-action.simulate {
color: var(--accent-blue);
border-color: var(--accent-blue)30;
}
.title-bar-action.simulate:hover { background: rgba(59,130,246,0.1); }
.title-bar-action.execute {
color: #fff;
background: var(--accent-blue);
border-color: var(--accent-blue);
}
.title-bar-action.execute:hover { background: #2563eb; }
.icon-btn {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border-radius: var(--radius-sm);
border: none;
background: transparent;
color: var(--text-secondary);
cursor: pointer;
position: relative;
transition: all 0.15s;
}
.icon-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
.notification-badge {
position: absolute;
top: 2px;
right: 2px;
width: 14px;
height: 14px;
background: var(--accent-red);
color: #fff;
border-radius: 50%;
font-size: 9px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
}
/* ─── ACTIVITY BAR ──────────────────────────────────────────── */
.activity-bar {
width: var(--activity-bar-width);
background: var(--bg-surface);
border-right: 1px solid var(--border);
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 4px 0;
flex-shrink: 0;
}
.activity-bar-top, .activity-bar-bottom {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
}
.activity-btn {
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
border-radius: var(--radius-md);
border: none;
background: transparent;
color: var(--text-muted);
cursor: pointer;
position: relative;
transition: all 0.15s;
}
.activity-btn:hover { color: var(--text-secondary); background: var(--bg-hover); }
.activity-btn.active {
color: var(--text-primary);
background: var(--bg-active);
}
.activity-btn.active::before {
content: '';
position: absolute;
left: -4px;
top: 8px;
bottom: 8px;
width: 2px;
background: var(--accent-blue);
border-radius: 1px;
}
/* ─── WORKSPACE ─────────────────────────────────────────────── */
.workspace {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
min-height: 0;
overflow: hidden;
}
.workspace-upper {
flex: 1;
display: flex;
min-height: 0;
overflow: hidden;
}
.panel-divider.vertical {
width: 1px;
background: var(--border);
cursor: col-resize;
flex-shrink: 0;
transition: background 0.15s;
}
.panel-divider.vertical:hover { background: var(--accent-blue); }
.panel-divider.horizontal {
height: 1px;
background: var(--border);
cursor: row-resize;
flex-shrink: 0;
transition: background 0.15s;
}
.panel-divider.horizontal:hover { background: var(--accent-blue); }
/* ─── LEFT PANEL ────────────────────────────────────────────── */
.left-panel {
background: var(--bg-surface);
display: flex;
flex-direction: column;
min-width: 0;
flex-shrink: 0;
overflow: hidden;
}
.panel-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
border-bottom: 1px solid var(--border-subtle);
flex-shrink: 0;
}
.panel-title {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-secondary);
}
.left-panel-search {
padding: 8px 12px;
position: relative;
flex-shrink: 0;
}
.left-panel-search .search-icon {
position: absolute;
left: 20px;
top: 50%;
transform: translateY(-50%);
color: var(--text-muted);
}
.left-panel-search input {
width: 100%;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 6px 8px 6px 30px;
font-size: 12px;
color: var(--text-primary);
outline: none;
transition: border-color 0.15s;
}
.left-panel-search input:focus { border-color: var(--accent-blue); }
.left-panel-search input::placeholder { color: var(--text-muted); }
.left-panel-filters {
display: flex;
gap: 2px;
padding: 0 12px 8px;
flex-shrink: 0;
}
.filter-btn {
display: flex;
align-items: center;
gap: 4px;
padding: 3px 8px;
border-radius: var(--radius-sm);
border: none;
background: transparent;
color: var(--text-muted);
font-size: 11px;
cursor: pointer;
transition: all 0.15s;
}
.filter-btn:hover { background: var(--bg-hover); color: var(--text-secondary); }
.filter-btn.active { background: var(--bg-active); color: var(--text-primary); }
.left-panel-content {
flex: 1;
overflow-y: auto;
padding-bottom: 8px;
}
.component-category { margin-bottom: 2px; }
.category-header {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
cursor: pointer;
color: var(--text-secondary);
font-size: 12px;
font-weight: 500;
transition: background 0.1s;
user-select: none;
}
.category-header:hover { background: var(--bg-hover); }
.category-icon { font-size: 13px; }
.category-label { flex: 1; }
.category-count {
font-size: 10px;
color: var(--text-muted);
background: var(--bg-active);
padding: 1px 6px;
border-radius: 8px;
}
.category-items { padding: 2px 0; }
.category-items.flat { padding: 2px 0; }
.component-item {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 12px 5px 24px;
cursor: grab;
color: var(--text-secondary);
font-size: 12px;
transition: all 0.1s;
user-select: none;
}
.component-item:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
.component-item:active { cursor: grabbing; }
.drag-handle {
color: var(--text-muted);
flex-shrink: 0;
opacity: 0;
transition: opacity 0.15s;
}
.component-item:hover .drag-handle { opacity: 1; }
.component-icon { font-size: 14px; flex-shrink: 0; }
.component-label { flex: 1; }
.component-category-badge {
font-size: 10px;
opacity: 0.7;
}
.fav-btn {
border: none;
background: transparent;
color: var(--text-muted);
cursor: pointer;
padding: 2px;
border-radius: 2px;
opacity: 0;
transition: all 0.15s;
display: flex;
align-items: center;
}
.component-item:hover .fav-btn { opacity: 1; }
.fav-btn.active { opacity: 1; color: var(--accent-yellow); }
.fav-btn:hover { color: var(--accent-yellow); }
.empty-state {
padding: 24px;
text-align: center;
color: var(--text-muted);
font-size: 12px;
}
/* ─── CANVAS ────────────────────────────────────────────────── */
.canvas-container {
display: flex;
flex-direction: column;
height: 100%;
width: 100%;
}
.canvas-region {
flex: 1;
min-width: 0;
min-height: 0;
position: relative;
}
.canvas-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 14px;
background: var(--bg-surface);
border-bottom: 1px solid var(--border-subtle);
flex-shrink: 0;
gap: 12px;
}
.canvas-header-left, .canvas-header-right, .canvas-header-center {
display: flex;
align-items: center;
gap: 8px;
}
.canvas-tx-name {
font-weight: 600;
font-size: 13px;
color: var(--text-primary);
}
.canvas-version {
font-size: 11px;
color: var(--text-muted);
background: var(--bg-active);
padding: 1px 6px;
border-radius: var(--radius-sm);
}
.canvas-save-state {
display: flex;
align-items: center;
gap: 4px;
font-size: 11px;
color: var(--text-muted);
}
.canvas-env-btn {
display: flex;
align-items: center;
gap: 5px;
padding: 3px 10px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: transparent;
color: var(--text-secondary);
font-size: 12px;
cursor: pointer;
transition: all 0.15s;
}
.canvas-env-btn:hover { background: var(--bg-hover); border-color: var(--text-muted); }
.canvas-action-btn {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 10px;
border-radius: var(--radius-sm);
border: none;
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s;
background: transparent;
}
.canvas-action-btn.validate { color: var(--accent-green); }
.canvas-action-btn.validate:hover { background: rgba(34,197,94,0.1); }
.canvas-action-btn.simulate { color: var(--accent-blue); }
.canvas-action-btn.simulate:hover { background: rgba(59,130,246,0.1); }
.canvas-action-btn.execute {
color: #fff;
background: var(--accent-blue);
}
.canvas-action-btn.execute:hover { background: #2563eb; }
.canvas-body {
flex: 1;
background: var(--bg-base);
position: relative;
min-height: 0;
}
.canvas-empty {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
pointer-events: none;
z-index: 5;
}
.canvas-empty-content {
text-align: center;
color: var(--text-muted);
}
.canvas-empty-icon {
font-size: 48px;
margin-bottom: 16px;
opacity: 0.3;
}
.canvas-empty-content h3 {
font-size: 16px;
font-weight: 600;
color: var(--text-secondary);
margin-bottom: 8px;
}
.canvas-empty-content p {
font-size: 13px;
margin-bottom: 4px;
}
.canvas-empty-hint {
font-size: 12px;
margin-top: 8px !important;
}
.canvas-empty-hint kbd {
font-family: var(--font-mono);
font-size: 11px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 3px;
padding: 1px 5px;
}
.canvas-inspector {
display: flex;
align-items: center;
gap: 12px;
padding: 4px 14px;
background: var(--bg-surface);
border-top: 1px solid var(--border-subtle);
font-size: 11px;
color: var(--text-muted);
flex-shrink: 0;
}
.inspector-item {
display: flex;
align-items: center;
gap: 4px;
}
.inspector-separator {
width: 1px;
height: 12px;
background: var(--border);
}
/* React Flow overrides */
.canvas-body .react-flow__background { background: var(--bg-base) !important; }
.canvas-body .react-flow__controls {
background: var(--bg-elevated) !important;
border: 1px solid var(--border) !important;
border-radius: var(--radius-md) !important;
box-shadow: 0 4px 12px rgba(0,0,0,0.3) !important;
}
.canvas-body .react-flow__controls-button {
background: transparent !important;
border-bottom: 1px solid var(--border) !important;
fill: var(--text-secondary) !important;
color: var(--text-secondary) !important;
}
.canvas-body .react-flow__controls-button:hover {
background: var(--bg-hover) !important;
}
.canvas-body .react-flow__controls-button svg { fill: var(--text-secondary) !important; }
.canvas-minimap {
background: var(--bg-elevated) !important;
border: 1px solid var(--border) !important;
border-radius: var(--radius-md) !important;
}
/* ─── TRANSACTION NODE ──────────────────────────────────────── */
.transaction-node {
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
min-width: 160px;
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
transition: all 0.15s;
}
.transaction-node:hover { box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
.transaction-node.selected { border-color: var(--accent-blue) !important; box-shadow: 0 0 0 1px var(--accent-blue), 0 4px 16px rgba(59,130,246,0.2); }
.node-header {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 10px 6px;
border-bottom: 1px solid var(--border-subtle);
}
.node-icon { font-size: 15px; }
.node-label { font-size: 12px; font-weight: 600; color: var(--text-primary); flex: 1; }
.node-status { display: flex; align-items: center; }
.node-body {
padding: 4px 10px 8px;
}
.node-category {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.5px;
font-weight: 500;
}
.node-handle {
width: 8px !important;
height: 8px !important;
background: var(--bg-active) !important;
border: 2px solid var(--accent-blue) !important;
}
.node-handle:hover { background: var(--accent-blue) !important; }
/* ─── RIGHT PANEL ───────────────────────────────────────────── */
.right-panel {
background: var(--bg-surface);
display: flex;
flex-direction: column;
flex-shrink: 0;
min-width: 0;
overflow: hidden;
}
.chat-header-agent {
display: flex;
align-items: center;
gap: 6px;
cursor: pointer;
padding: 2px 6px;
border-radius: var(--radius-sm);
font-size: 12px;
font-weight: 600;
color: var(--text-primary);
position: relative;
transition: background 0.15s;
}
.chat-header-agent:hover { background: var(--bg-hover); }
.agent-dropdown {
position: absolute;
top: 100%;
left: 0;
margin-top: 4px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 4px;
z-index: 100;
min-width: 180px;
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
}
.agent-option {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 10px;
border-radius: var(--radius-sm);
cursor: pointer;
font-size: 12px;
font-weight: 400;
color: var(--text-secondary);
transition: background 0.1s;
}
.agent-option:hover { background: var(--bg-hover); color: var(--text-primary); }
.agent-option.active { background: var(--bg-active); color: var(--text-primary); }
.context-toggle {
font-size: 11px;
padding: 2px 8px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: transparent;
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s;
}
.context-toggle:hover { background: var(--bg-hover); color: var(--text-secondary); }
.context-toggle.active { background: var(--bg-active); color: var(--text-primary); border-color: var(--accent-blue); }
.agent-tabs {
display: flex;
border-bottom: 1px solid var(--border-subtle);
padding: 0 8px;
flex-shrink: 0;
}
.agent-tab {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
padding: 8px 4px;
border: none;
border-bottom: 2px solid transparent;
background: transparent;
cursor: pointer;
transition: all 0.15s;
}
.agent-tab:hover { background: var(--bg-hover); }
.agent-tab.active { border-bottom-width: 2px; }
.context-panel {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1px;
background: var(--border-subtle);
border-bottom: 1px solid var(--border-subtle);
flex-shrink: 0;
}
.context-section {
padding: 6px 10px;
background: var(--bg-surface);
}
.context-label {
font-size: 10px;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.3px;
display: block;
margin-bottom: 2px;
}
.context-value {
font-size: 12px;
color: var(--text-secondary);
font-weight: 500;
}
.context-value.pass { color: var(--accent-green); }
.context-value.fail { color: var(--accent-red); }
.chat-messages {
flex: 1;
overflow-y: auto;
padding: 8px;
display: flex;
flex-direction: column;
gap: 8px;
}
.chat-message {
padding: 8px 10px;
border-radius: var(--radius-md);
font-size: 12px;
line-height: 1.5;
}
.chat-message.agent {
background: var(--bg-elevated);
border: 1px solid var(--border-subtle);
}
.chat-message.user {
background: rgba(59,130,246,0.1);
border: 1px solid rgba(59,130,246,0.2);
}
.chat-message.system {
background: var(--bg-input);
border: 1px solid var(--border-subtle);
color: var(--text-muted);
font-family: var(--font-mono);
font-size: 11px;
}
.message-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 4px;
}
.message-agent {
font-weight: 600;
font-size: 11px;
color: var(--text-secondary);
}
.message-time {
font-size: 10px;
color: var(--text-muted);
font-family: var(--font-mono);
}
.message-content {
color: var(--text-primary);
}
.action-tray {
display: flex;
gap: 4px;
padding: 6px 8px;
border-top: 1px solid var(--border-subtle);
border-bottom: 1px solid var(--border-subtle);
flex-wrap: wrap;
flex-shrink: 0;
}
.action-tray-btn {
display: flex;
align-items: center;
gap: 3px;
padding: 3px 7px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: transparent;
color: var(--text-muted);
font-size: 10px;
cursor: pointer;
transition: all 0.15s;
white-space: nowrap;
}
.action-tray-btn:hover { background: var(--bg-hover); color: var(--text-secondary); border-color: var(--text-muted); }
.chat-input-area {
display: flex;
gap: 6px;
padding: 8px;
flex-shrink: 0;
}
.chat-input-area input {
flex: 1;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 7px 10px;
font-size: 12px;
color: var(--text-primary);
outline: none;
transition: border-color 0.15s;
}
.chat-input-area input:focus { border-color: var(--accent-blue); }
.chat-input-area input::placeholder { color: var(--text-muted); }
.send-btn {
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: var(--radius-md);
border: none;
background: var(--accent-blue);
color: #fff;
cursor: pointer;
transition: background 0.15s;
flex-shrink: 0;
}
.send-btn:hover { background: #2563eb; }
.send-btn:disabled { background: var(--bg-active); color: var(--text-muted); cursor: default; }
/* ─── BOTTOM PANEL ──────────────────────────────────────────── */
.bottom-panel {
background: var(--bg-surface);
display: flex;
flex-direction: column;
flex-shrink: 0;
overflow: hidden;
}
.bottom-panel-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 8px;
border-bottom: 1px solid var(--border-subtle);
flex-shrink: 0;
}
.bottom-panel-tabs {
display: flex;
gap: 0;
overflow-x: auto;
}
.bottom-tab {
display: flex;
align-items: center;
gap: 5px;
padding: 7px 12px;
border: none;
border-bottom: 2px solid transparent;
background: transparent;
color: var(--text-muted);
font-size: 11px;
cursor: pointer;
transition: all 0.15s;
white-space: nowrap;
}
.bottom-tab:hover { color: var(--text-secondary); background: var(--bg-hover); }
.bottom-tab.active { color: var(--text-primary); border-bottom-color: var(--accent-blue); }
.tab-badge {
font-size: 9px;
padding: 0 5px;
border-radius: 8px;
font-weight: 600;
}
.tab-badge.info { background: rgba(59,130,246,0.2); color: var(--accent-blue); }
.tab-badge.warn { background: rgba(234,179,8,0.2); color: var(--accent-yellow); }
.tab-badge.error { background: rgba(239,68,68,0.2); color: var(--accent-red); }
.bottom-panel-actions {
display: flex;
gap: 2px;
}
.icon-btn-sm {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: var(--radius-sm);
border: none;
background: transparent;
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s;
}
.icon-btn-sm:hover { background: var(--bg-hover); color: var(--text-secondary); }
.bottom-panel-content {
flex: 1;
overflow: auto;
min-height: 0;
}
/* Terminal */
.terminal-content {
font-family: var(--font-mono);
font-size: 12px;
height: 100%;
display: flex;
flex-direction: column;
}
.terminal-filter {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 10px;
border-bottom: 1px solid var(--border-subtle);
color: var(--text-muted);
flex-shrink: 0;
}
.terminal-filter input {
flex: 1;
background: transparent;
border: none;
color: var(--text-secondary);
font-family: var(--font-mono);
font-size: 11px;
outline: none;
}
.terminal-filter input::placeholder { color: var(--text-muted); }
.terminal-entries {
padding: 4px 10px;
flex: 1;
overflow-y: auto;
}
.terminal-entry {
display: flex;
gap: 8px;
padding: 2px 0;
line-height: 1.6;
}
.terminal-time { color: var(--text-muted); flex-shrink: 0; }
.terminal-level { font-weight: 600; flex-shrink: 0; min-width: 50px; }
.terminal-source { color: var(--accent-blue); flex-shrink: 0; }
.terminal-msg { color: var(--text-primary); }
.terminal-cursor { padding: 2px 0; }
.cursor-blink {
color: var(--accent-blue);
animation: blink 1s step-end infinite;
}
@keyframes blink {
50% { opacity: 0; }
}
/* Validation */
.validation-content { padding: 4px 10px; }
.validation-entry {
display: flex;
gap: 8px;
padding: 4px 0;
font-size: 12px;
align-items: baseline;
}
.validation-severity {
font-size: 10px;
font-weight: 600;
font-family: var(--font-mono);
padding: 1px 6px;
border-radius: var(--radius-sm);
flex-shrink: 0;
}
.validation-entry.error .validation-severity { background: rgba(239,68,68,0.15); color: var(--accent-red); }
.validation-entry.warning .validation-severity { background: rgba(234,179,8,0.15); color: var(--accent-yellow); }
.validation-entry.info .validation-severity { background: rgba(59,130,246,0.15); color: var(--accent-blue); }
.validation-node {
font-family: var(--font-mono);
color: var(--accent-purple);
font-size: 11px;
}
.validation-msg { color: var(--text-secondary); }
/* 800 System */
.system-800-content { padding: 10px; }
.system-800-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 8px;
}
.system-800-card {
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 10px;
}
.system-800-card-header {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.3px;
color: var(--text-muted);
margin-bottom: 4px;
}
.system-800-card-value {
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 4px;
}
.system-800-card-status {
font-size: 10px;
font-weight: 600;
}
.system-800-card-status.healthy { color: var(--accent-green); }
.system-800-card-status.idle { color: var(--text-muted); }
.system-800-card-status.error { color: var(--accent-red); }
/* Settlement table */
.settlement-content { overflow-x: auto; }
.settlement-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
.settlement-table th {
text-align: left;
padding: 6px 12px;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.3px;
color: var(--text-muted);
border-bottom: 1px solid var(--border);
font-weight: 600;
position: sticky;
top: 0;
background: var(--bg-surface);
}
.settlement-table td {
padding: 6px 12px;
color: var(--text-secondary);
border-bottom: 1px solid var(--border-subtle);
}
.settlement-table tr:hover td { background: var(--bg-hover); }
.mono { font-family: var(--font-mono); font-size: 11px; }
.status-badge {
font-size: 10px;
font-weight: 600;
padding: 2px 8px;
border-radius: 10px;
border: 1px solid;
text-transform: capitalize;
white-space: nowrap;
}
/* Audit */
.audit-content { padding: 4px 10px; }
.audit-entry {
display: flex;
gap: 8px;
padding: 3px 0;
font-size: 12px;
align-items: baseline;
}
.audit-time {
font-family: var(--font-mono);
font-size: 11px;
color: var(--text-muted);
flex-shrink: 0;
}
.audit-user {
color: var(--accent-blue);
font-weight: 500;
flex-shrink: 0;
}
.audit-action {
font-family: var(--font-mono);
font-size: 11px;
color: var(--accent-purple);
flex-shrink: 0;
}
.audit-detail { color: var(--text-secondary); }
/* Empty tab */
.empty-tab-content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
gap: 8px;
color: var(--text-muted);
font-size: 12px;
}
/* ─── STATUS BAR ────────────────────────────────────────────── */
.status-bar {
height: var(--status-bar-height);
background: var(--accent-blue);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 12px;
font-size: 11px;
color: rgba(255,255,255,0.9);
flex-shrink: 0;
}
.status-bar-left, .status-bar-right {
display: flex;
align-items: center;
gap: 12px;
}
.status-item {
display: flex;
align-items: center;
gap: 4px;
white-space: nowrap;
}
.status-dot {
width: 6px;
height: 6px;
border-radius: 50%;
}
.status-dot.green { background: #4ade80; }
.status-dot.red { background: #f87171; }
.status-kbd {
font-family: var(--font-mono);
font-size: 10px;
background: rgba(255,255,255,0.15);
border-radius: 3px;
padding: 0 4px;
}
/* ─── COMMAND PALETTE ───────────────────────────────────────── */
.command-palette-overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.5);
display: flex;
justify-content: center;
padding-top: 80px;
z-index: 1000;
backdrop-filter: blur(2px);
}
.command-palette {
width: 520px;
max-height: 400px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
box-shadow: 0 16px 48px rgba(0,0,0,0.5);
display: flex;
flex-direction: column;
overflow: hidden;
}
.command-palette-input {
display: flex;
align-items: center;
gap: 10px;
padding: 12px 16px;
border-bottom: 1px solid var(--border);
color: var(--text-muted);
}
.command-palette-input input {
flex: 1;
background: transparent;
border: none;
font-size: 14px;
color: var(--text-primary);
outline: none;
}
.command-palette-input input::placeholder { color: var(--text-muted); }
.command-palette-results {
flex: 1;
overflow-y: auto;
padding: 4px;
}
.command-group-header {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted);
padding: 8px 12px 4px;
font-weight: 600;
}
.command-item {
display: flex;
align-items: center;
gap: 8px;
padding: 7px 12px;
border-radius: var(--radius-sm);
cursor: pointer;
color: var(--text-secondary);
transition: all 0.1s;
}
.command-item:hover { background: var(--bg-hover); color: var(--text-primary); }
.command-label { flex: 1; font-size: 13px; }
.command-shortcut {
font-family: var(--font-mono);
font-size: 10px;
background: var(--bg-active);
border: 1px solid var(--border);
border-radius: 3px;
padding: 1px 6px;
color: var(--text-muted);
}
.command-empty {
padding: 24px;
text-align: center;
color: var(--text-muted);
font-size: 13px;
}
.command-item.selected {
background: var(--bg-active);
color: var(--text-primary);
}
/* ─── TRANSACTION TABS ──────────────────────────────────────── */
.transaction-tabs {
display: flex;
align-items: center;
background: var(--bg-base);
border-bottom: 1px solid var(--border-subtle);
padding: 0;
flex-shrink: 0;
overflow-x: auto;
}
.transaction-tab {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
font-size: 12px;
color: var(--text-muted);
cursor: pointer;
border-right: 1px solid var(--border-subtle);
white-space: nowrap;
transition: all 0.15s;
user-select: none;
}
.transaction-tab:hover { background: var(--bg-hover); color: var(--text-secondary); }
.transaction-tab.active { background: var(--bg-surface); color: var(--text-primary); }
.tab-close {
display: flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
border: none;
background: transparent;
color: var(--text-muted);
cursor: pointer;
border-radius: 2px;
opacity: 0;
transition: all 0.15s;
}
.transaction-tab:hover .tab-close { opacity: 1; }
.tab-close:hover { background: var(--bg-active); color: var(--text-primary); }
.transaction-tab-add {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: none;
background: transparent;
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s;
}
.transaction-tab-add:hover { color: var(--text-secondary); background: var(--bg-hover); }
/* ─── CANVAS TOOLBAR ────────────────────────────────────────── */
.canvas-toolbar-separator {
width: 1px;
height: 16px;
background: var(--border);
margin: 0 2px;
}
.canvas-toolbar-btn {
display: flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
border: none;
background: transparent;
color: var(--text-muted);
cursor: pointer;
border-radius: var(--radius-sm);
transition: all 0.15s;
}
.canvas-toolbar-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
.canvas-toolbar-btn:disabled { opacity: 0.3; cursor: default; }
.canvas-toolbar-btn:disabled:hover { background: transparent; color: var(--text-muted); }
.canvas-tx-name {
font-weight: 600;
font-size: 13px;
color: var(--text-primary);
cursor: pointer;
padding: 1px 4px;
border-radius: var(--radius-sm);
transition: background 0.15s;
}
.canvas-tx-name:hover { background: var(--bg-hover); }
.canvas-tx-name-input {
font-weight: 600;
font-size: 13px;
color: var(--text-primary);
background: var(--bg-input);
border: 1px solid var(--accent-blue);
border-radius: var(--radius-sm);
padding: 1px 6px;
outline: none;
width: 200px;
}
.zoom-display {
font-size: 10px !important;
font-family: var(--font-mono) !important;
min-width: 36px;
cursor: default !important;
}
/* ─── SIMULATION OVERLAY ────────────────────────────────────── */
.simulation-overlay {
position: absolute;
inset: 0;
background: rgba(14, 14, 16, 0.8);
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
color: var(--accent-blue);
font-size: 14px;
font-weight: 500;
z-index: 10;
}
.simulation-spinner {
width: 20px;
height: 20px;
border: 2px solid var(--border);
border-top-color: var(--accent-blue);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
.simulation-results-overlay {
position: absolute;
bottom: 16px;
right: 16px;
z-index: 10;
}
.simulation-results-card {
background: var(--bg-elevated);
border: 1px solid var(--accent-green);
border-radius: var(--radius-lg);
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
max-width: 400px;
overflow: hidden;
}
.simulation-results-header {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-bottom: 1px solid var(--border-subtle);
font-size: 12px;
font-weight: 600;
color: var(--text-primary);
}
.simulation-dismiss {
margin-left: auto;
border: none;
background: transparent;
color: var(--text-muted);
cursor: pointer;
padding: 2px;
}
.simulation-dismiss:hover { color: var(--text-primary); }
.simulation-results-body {
padding: 10px 12px;
font-family: var(--font-mono);
font-size: 11px;
color: var(--text-secondary);
line-height: 1.6;
white-space: pre-wrap;
margin: 0;
}
.selected-info { color: var(--accent-blue); font-weight: 500; }
/* ─── NODE BADGES ───────────────────────────────────────────── */
.node-badges {
display: flex;
align-items: center;
gap: 4px;
flex-shrink: 0;
}
.node-badge {
display: flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
border-radius: 50%;
font-size: 8px;
}
.node-badge.compliance { background: rgba(34, 197, 94, 0.2); color: var(--accent-green); }
.node-badge.routing { background: rgba(249, 115, 22, 0.2); font-size: 7px; }
.transaction-node.status-valid { border-color: var(--accent-green) !important; }
.transaction-node.status-warning { border-color: var(--accent-yellow) !important; }
.transaction-node.status-error { border-color: var(--accent-red) !important; }
/* ─── NOTIFICATION DROPDOWN ─────────────────────────────────── */
.notification-wrapper, .user-menu-wrapper {
position: relative;
}
.notification-dropdown, .user-menu-dropdown {
position: absolute;
top: 100%;
right: 0;
margin-top: 8px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
box-shadow: 0 12px 36px rgba(0,0,0,0.5);
z-index: 200;
min-width: 300px;
overflow: hidden;
}
.notification-dropdown-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 14px;
border-bottom: 1px solid var(--border-subtle);
font-size: 12px;
font-weight: 600;
color: var(--text-primary);
}
.mark-read-btn {
font-size: 10px;
color: var(--accent-blue);
background: transparent;
border: none;
cursor: pointer;
}
.mark-read-btn:hover { text-decoration: underline; }
.notification-item {
display: flex;
gap: 10px;
padding: 10px 14px;
cursor: pointer;
transition: background 0.15s;
align-items: flex-start;
}
.notification-item:hover { background: var(--bg-hover); }
.notification-item.read { opacity: 0.6; }
.notification-dot {
width: 6px;
height: 6px;
border-radius: 50%;
flex-shrink: 0;
margin-top: 5px;
}
.notification-content {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.notification-title {
font-size: 12px;
font-weight: 600;
color: var(--text-primary);
}
.notification-message {
font-size: 11px;
color: var(--text-secondary);
line-height: 1.4;
}
.notification-time {
font-size: 10px;
color: var(--text-muted);
font-family: var(--font-mono);
}
/* ─── USER MENU ─────────────────────────────────────────────── */
.user-menu-dropdown { min-width: 240px; }
.user-menu-profile {
display: flex;
gap: 10px;
padding: 12px 14px;
align-items: center;
}
.user-avatar {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--accent-blue);
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: 600;
flex-shrink: 0;
}
.user-name { font-size: 13px; font-weight: 600; color: var(--text-primary); }
.user-role { font-size: 11px; color: var(--text-muted); }
.user-menu-divider { height: 1px; background: var(--border-subtle); }
.user-menu-item {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 14px;
font-size: 12px;
color: var(--text-secondary);
cursor: pointer;
transition: background 0.15s;
}
.user-menu-item:hover { background: var(--bg-hover); color: var(--text-primary); }
.user-menu-item.logout { color: var(--accent-red); }
.user-menu-item.logout:hover { background: rgba(239, 68, 68, 0.1); }
.user-menu-badge {
margin-left: auto;
font-size: 10px;
padding: 1px 6px;
border-radius: 8px;
background: rgba(59, 130, 246, 0.2);
color: var(--accent-blue);
font-weight: 600;
}
/* ─── SCOPE SELECTOR ────────────────────────────────────────── */
.chat-header-actions {
display: flex;
align-items: center;
gap: 4px;
}
.scope-selector {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 6px;
border-radius: var(--radius-sm);
font-size: 10px;
color: var(--text-muted);
cursor: pointer;
position: relative;
transition: all 0.15s;
}
.scope-selector:hover { background: var(--bg-hover); color: var(--text-secondary); }
.scope-dropdown {
position: absolute;
top: 100%;
right: 0;
margin-top: 4px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 4px;
z-index: 100;
min-width: 160px;
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
}
.scope-option {
padding: 5px 10px;
font-size: 11px;
color: var(--text-secondary);
cursor: pointer;
border-radius: var(--radius-sm);
transition: background 0.1s;
}
.scope-option:hover { background: var(--bg-hover); color: var(--text-primary); }
.scope-option.active { background: var(--bg-active); color: var(--text-primary); }
.icon-btn-xs {
display: flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
border-radius: var(--radius-sm);
border: none;
background: transparent;
color: var(--text-muted);
cursor: pointer;
transition: all 0.15s;
}
.icon-btn-xs:hover { background: var(--bg-hover); color: var(--text-secondary); }
.icon-btn-xs.active { background: var(--bg-active); color: var(--text-primary); }
/* ─── THREAD HISTORY ────────────────────────────────────────── */
.thread-history {
border-bottom: 1px solid var(--border-subtle);
flex-shrink: 0;
max-height: 160px;
overflow-y: auto;
}
.thread-history-header {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.3px;
color: var(--text-muted);
padding: 6px 10px 4px;
font-weight: 600;
}
.thread-item {
display: flex;
align-items: flex-start;
gap: 8px;
padding: 6px 10px;
cursor: pointer;
transition: background 0.15s;
}
.thread-item:hover { background: var(--bg-hover); }
.thread-item-content {
display: flex;
flex-direction: column;
gap: 1px;
}
.thread-item-title { font-size: 12px; color: var(--text-secondary); }
.thread-item-meta { font-size: 10px; color: var(--text-muted); }
.context-value.warn { color: var(--accent-yellow); }
/* ─── SETTINGS PANEL ────────────────────────────────────────── */
.settings-panel { padding: 8px 0; }
.settings-group { margin-bottom: 4px; }
.settings-group-header {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.3px;
color: var(--text-muted);
padding: 8px 12px 4px;
font-weight: 600;
}
.settings-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 5px 12px;
font-size: 12px;
color: var(--text-secondary);
}
.settings-value {
font-size: 11px;
color: var(--text-muted);
font-family: var(--font-mono);
}
/* ─── AGENT LIST ────────────────────────────────────────────── */
.agent-list-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
transition: background 0.15s;
}
.agent-list-item:hover { background: var(--bg-hover); }
.agent-list-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.agent-list-name { font-size: 12px; color: var(--text-primary); font-weight: 500; }
.agent-list-desc { font-size: 11px; color: var(--text-muted); }
/* ─── TOOLTIP ───────────────────────────────────────────────── */
.component-tooltip {
position: fixed;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 10px 12px;
z-index: 1000;
max-width: 280px;
box-shadow: 0 8px 24px rgba(0,0,0,0.5);
pointer-events: none;
}
.tooltip-header {
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 4px;
}
.tooltip-desc {
font-size: 11px;
color: var(--text-secondary);
line-height: 1.4;
margin-bottom: 6px;
}
.tooltip-meta {
display: flex;
align-items: center;
gap: 8px;
}
.tooltip-cat {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.tooltip-fields {
font-size: 10px;
color: var(--text-muted);
margin-top: 4px;
}
/* ─── BOTTOM PANEL EXTRAS ───────────────────────────────────── */
.bottom-search-bar, .bottom-filter-bar {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 10px;
border-bottom: 1px solid var(--border-subtle);
flex-shrink: 0;
}
.bottom-search-bar input {
flex: 1;
background: transparent;
border: none;
color: var(--text-secondary);
font-size: 12px;
outline: none;
}
.bottom-search-bar input::placeholder { color: var(--text-muted); }
.bottom-search-bar svg { color: var(--text-muted); }
.filter-pill {
padding: 2px 8px;
border-radius: 10px;
border: 1px solid var(--border);
background: transparent;
color: var(--text-muted);
font-size: 10px;
cursor: pointer;
transition: all 0.15s;
}
.filter-pill:hover { background: var(--bg-hover); color: var(--text-secondary); }
.filter-pill.active { background: var(--bg-active); color: var(--text-primary); border-color: var(--accent-blue); }
.direction-badge {
font-size: 10px;
font-weight: 600;
font-family: var(--font-mono);
}
.direction-badge.inbound { color: var(--accent-green); }
.direction-badge.outbound { color: var(--accent-blue); }
.exception-type {
font-family: var(--font-mono);
font-size: 10px;
color: var(--accent-orange);
padding: 1px 6px;
background: rgba(249, 115, 22, 0.1);
border-radius: var(--radius-sm);
flex-shrink: 0;
}
.messages-content, .events-content, .reconciliation-content, .exceptions-content {
padding: 4px 0;
overflow-x: auto;
}
/* ═══════════════════════════════════════════════════════════════
PORTAL — Login, Layout, Dashboard, Modules
═══════════════════════════════════════════════════════════════ */
/* ── Loading Screen ── */
.portal-loading {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
background: var(--bg-base);
color: var(--text-secondary);
gap: 16px;
font-size: 14px;
}
.portal-loading-spinner {
width: 32px; height: 32px;
border: 3px solid var(--border);
border-top-color: var(--accent);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
/* ── Login Page ── */
.login-page {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: var(--bg-base);
position: relative;
overflow: hidden;
padding: 24px;
}
.login-bg-grid {
position: absolute;
inset: 0;
background-image:
linear-gradient(rgba(59,130,246,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(59,130,246,0.03) 1px, transparent 1px);
background-size: 40px 40px;
}
.login-bg-glow {
position: absolute;
top: 30%;
left: 50%;
width: 600px;
height: 600px;
transform: translate(-50%, -50%);
background: radial-gradient(circle, rgba(59,130,246,0.08) 0%, transparent 70%);
pointer-events: none;
}
.login-container {
display: flex;
max-width: 1000px;
width: 100%;
gap: 48px;
position: relative;
z-index: 1;
align-items: center;
}
.login-left {
flex: 1;
display: flex;
flex-direction: column;
gap: 32px;
}
.login-right {
flex: 1;
max-width: 420px;
display: flex;
flex-direction: column;
gap: 12px;
}
.login-brand {
display: flex;
flex-direction: column;
gap: 8px;
}
.login-logo {
display: flex;
align-items: center;
gap: 12px;
}
.login-logo h1 {
font-size: 24px;
font-weight: 700;
color: var(--text-primary);
margin: 0;
line-height: 1.2;
}
.login-plc {
font-size: 11px;
font-weight: 600;
color: var(--accent);
letter-spacing: 2px;
margin-top: -2px;
}
.login-tagline {
font-size: 14px;
color: var(--text-secondary);
margin: 0;
}
.login-features {
display: flex;
flex-direction: column;
gap: 18px;
}
.login-feature {
display: flex;
gap: 14px;
align-items: flex-start;
}
.login-feature-icon {
width: 36px;
height: 36px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
color: var(--accent);
}
.login-feature h3 {
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin: 0 0 3px;
}
.login-feature p {
font-size: 12px;
color: var(--text-secondary);
margin: 0;
line-height: 1.4;
}
.login-compliance-badges {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.compliance-badge {
padding: 4px 10px;
font-size: 10px;
font-weight: 600;
letter-spacing: 1px;
border: 1px solid var(--border);
border-radius: 4px;
color: var(--text-secondary);
background: var(--bg-surface);
}
.login-card {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 12px;
padding: 28px;
display: flex;
flex-direction: column;
gap: 20px;
}
.login-card-header {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
text-align: center;
color: var(--accent);
}
.login-card-header h2 {
font-size: 18px;
color: var(--text-primary);
margin: 0;
}
.login-card-header p {
font-size: 12px;
color: var(--text-secondary);
margin: 0;
}
.login-error {
padding: 10px 14px;
background: rgba(239,68,68,0.1);
border: 1px solid rgba(239,68,68,0.3);
border-radius: 6px;
color: #ef4444;
font-size: 12px;
}
.login-wallets {
display: flex;
flex-direction: column;
gap: 10px;
}
.wallet-option {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 16px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 10px;
cursor: pointer;
transition: all 0.15s;
color: var(--text-primary);
}
.wallet-option:hover {
border-color: var(--accent);
background: var(--bg-hover);
}
.wallet-option.connecting {
border-color: var(--accent);
opacity: 0.8;
}
.wallet-option:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.wallet-option-left {
display: flex;
align-items: center;
gap: 12px;
}
.wallet-icon {
width: 40px;
height: 40px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
}
.wallet-icon.metamask { background: rgba(245,133,36,0.15); }
.wallet-icon.walletconnect { background: rgba(59,130,246,0.15); }
.wallet-icon.coinbase { background: rgba(0,82,255,0.15); }
.wallet-name {
display: block;
font-size: 14px;
font-weight: 600;
color: var(--text-primary);
}
.wallet-desc {
display: block;
font-size: 11px;
color: var(--text-secondary);
margin-top: 2px;
}
.wallet-arrow { color: var(--text-secondary); }
.wallet-spinner {
width: 18px; height: 18px;
border: 2px solid var(--border);
border-top-color: var(--accent);
border-radius: 50%;
animation: spin 0.7s linear infinite;
}
.login-divider {
display: flex;
align-items: center;
gap: 12px;
color: var(--text-secondary);
font-size: 11px;
}
.login-divider::before, .login-divider::after {
content: '';
flex: 1;
height: 1px;
background: var(--border);
}
.login-demo-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 12px;
background: linear-gradient(135deg, rgba(59,130,246,0.15), rgba(168,85,247,0.15));
border: 1px solid rgba(59,130,246,0.3);
border-radius: 8px;
color: var(--text-primary);
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s;
}
.login-demo-btn:hover {
border-color: var(--accent);
background: linear-gradient(135deg, rgba(59,130,246,0.25), rgba(168,85,247,0.25));
}
.login-terms {
font-size: 10px;
color: var(--text-secondary);
text-align: center;
line-height: 1.5;
margin: 0;
}
.login-security-note {
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
font-size: 10px;
color: var(--text-secondary);
}
/* ── Portal Layout ── */
.portal-layout {
display: flex;
flex-direction: column;
height: 100vh;
background: var(--bg-base);
color: var(--text-primary);
}
.portal-topbar {
display: flex;
align-items: center;
justify-content: space-between;
height: 48px;
padding: 0 16px;
background: var(--bg-surface);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
z-index: 100;
}
.portal-topbar-left {
display: flex;
align-items: center;
gap: 12px;
}
.portal-topbar-center {
display: flex;
align-items: center;
}
.portal-topbar-right {
display: flex;
align-items: center;
gap: 8px;
}
.portal-logo {
display: flex;
align-items: center;
gap: 10px;
cursor: pointer;
}
.portal-logo-text {
display: flex;
align-items: baseline;
gap: 6px;
}
.portal-logo-name {
font-size: 14px;
font-weight: 700;
color: var(--text-primary);
}
.portal-logo-plc {
font-size: 9px;
font-weight: 600;
color: var(--accent);
letter-spacing: 1.5px;
}
.portal-env-badge {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 12px;
background: rgba(34,197,94,0.1);
border: 1px solid rgba(34,197,94,0.2);
border-radius: 12px;
font-size: 11px;
font-weight: 600;
color: #22c55e;
}
.env-dot {
width: 6px;
height: 6px;
background: #22c55e;
border-radius: 50%;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.portal-icon-btn {
position: relative;
width: 34px;
height: 34px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: 1px solid transparent;
border-radius: 6px;
cursor: pointer;
color: var(--text-secondary);
transition: all 0.15s;
}
.portal-icon-btn:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
.portal-notif-badge {
position: absolute;
top: 4px;
right: 4px;
width: 14px;
height: 14px;
background: #ef4444;
border-radius: 50%;
font-size: 8px;
font-weight: 700;
color: white;
display: flex;
align-items: center;
justify-content: center;
}
.portal-notif-wrapper, .portal-user-wrapper {
position: relative;
}
.portal-dropdown {
position: absolute;
top: 100%;
right: 0;
margin-top: 6px;
min-width: 280px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 8px;
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
z-index: 200;
overflow: hidden;
}
.portal-dropdown-header {
padding: 10px 14px;
font-size: 11px;
font-weight: 600;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
border-bottom: 1px solid var(--border);
}
.portal-dropdown-item {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 10px 14px;
cursor: pointer;
transition: background 0.1s;
}
.portal-dropdown-item:hover {
background: var(--bg-hover);
}
.dropdown-dot {
width: 8px;
height: 8px;
border-radius: 50%;
margin-top: 4px;
flex-shrink: 0;
}
.dropdown-dot.warning { background: #eab308; }
.dropdown-dot.info { background: #3b82f6; }
.dropdown-dot.success { background: #22c55e; }
.dropdown-title {
font-size: 12px;
font-weight: 600;
color: var(--text-primary);
}
.dropdown-desc {
font-size: 11px;
color: var(--text-secondary);
margin-top: 2px;
}
.portal-dropdown-section {
padding: 10px 14px;
}
.portal-dropdown-divider {
height: 1px;
background: var(--border);
}
.portal-dropdown-action {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
padding: 8px 14px;
background: transparent;
border: none;
color: var(--text-secondary);
font-size: 12px;
cursor: pointer;
transition: all 0.1s;
text-align: left;
}
.portal-dropdown-action:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
.portal-dropdown-action.danger:hover {
color: #ef4444;
}
.portal-user-btn {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 10px;
background: transparent;
border: 1px solid transparent;
border-radius: 6px;
cursor: pointer;
color: var(--text-primary);
transition: all 0.15s;
}
.portal-user-btn:hover {
background: var(--bg-hover);
border-color: var(--border);
}
.portal-avatar {
width: 28px;
height: 28px;
background: var(--accent);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.portal-user-info {
display: flex;
flex-direction: column;
text-align: left;
}
.portal-user-name {
font-size: 12px;
font-weight: 600;
}
.portal-user-role {
font-size: 10px;
color: var(--text-secondary);
text-transform: capitalize;
}
.portal-wallet-addr {
display: flex;
align-items: center;
gap: 6px;
font-size: 12px;
color: var(--text-secondary);
}
.copy-btn {
background: transparent;
border: none;
color: var(--text-secondary);
cursor: pointer;
padding: 2px;
}
.copy-btn:hover { color: var(--accent); }
.portal-wallet-bal {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 6px;
font-size: 12px;
color: var(--text-primary);
}
.chain-badge {
font-size: 10px;
padding: 2px 6px;
background: var(--bg-hover);
border-radius: 4px;
color: var(--text-secondary);
}
/* ── Portal Body ── */
.portal-body {
display: flex;
flex: 1;
overflow: hidden;
}
.portal-sidebar {
width: 220px;
background: var(--bg-surface);
border-right: 1px solid var(--border);
display: flex;
flex-direction: column;
justify-content: space-between;
flex-shrink: 0;
transition: width 0.2s;
overflow: hidden;
}
.portal-sidebar.collapsed {
width: 56px;
}
.portal-nav-items {
display: flex;
flex-direction: column;
padding: 8px;
gap: 2px;
}
.portal-nav-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
background: transparent;
border: none;
border-radius: 6px;
color: var(--text-secondary);
font-size: 13px;
cursor: pointer;
transition: all 0.1s;
text-align: left;
position: relative;
white-space: nowrap;
}
.portal-nav-item:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
.portal-nav-item.active {
background: rgba(59,130,246,0.1);
color: var(--accent);
}
.nav-active-indicator {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 3px;
height: 18px;
background: var(--accent);
border-radius: 0 3px 3px 0;
}
.portal-nav-footer {
padding: 8px;
border-top: 1px solid var(--border);
display: flex;
flex-direction: column;
gap: 2px;
}
.portal-collapse-btn {
display: flex;
align-items: center;
justify-content: center;
padding: 8px;
background: transparent;
border: none;
border-radius: 6px;
color: var(--text-secondary);
cursor: pointer;
transition: all 0.1s;
}
.portal-collapse-btn:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
.portal-content {
flex: 1;
overflow: auto;
background: var(--bg-base);
}
/* ── Transaction Builder Module Wrapper ── */
.transaction-builder-module {
height: 100%;
display: flex;
flex-direction: column;
}
.transaction-builder-module .app-layout {
height: 100%;
}
/* ── Page Common Styles ── */
.page-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
padding: 24px 28px 16px;
}
.page-header h1 {
display: flex;
align-items: center;
gap: 10px;
font-size: 22px;
font-weight: 700;
color: var(--text-primary);
margin: 0;
}
.page-subtitle {
font-size: 13px;
color: var(--text-secondary);
margin: 4px 0 0;
}
.page-header-actions {
display: flex;
gap: 8px;
}
.btn-primary {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
background: var(--accent);
border: none;
border-radius: 6px;
color: white;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: opacity 0.15s;
}
.btn-primary:hover { opacity: 0.9; }
.btn-secondary {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text-secondary);
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s;
}
.btn-secondary:hover {
border-color: var(--text-secondary);
color: var(--text-primary);
}
/* ── Dashboard ── */
.dashboard-page {
padding: 0 28px 28px;
}
.dashboard-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24px 0 16px;
}
.dashboard-header-left h1 {
font-size: 22px;
font-weight: 700;
margin: 0;
}
.dashboard-subtitle {
font-size: 13px;
color: var(--text-secondary);
margin: 4px 0 0;
}
.dashboard-header-right {
display: flex;
align-items: center;
gap: 12px;
}
.time-range-selector {
display: flex;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 6px;
overflow: hidden;
}
.time-range-btn {
padding: 6px 12px;
background: transparent;
border: none;
color: var(--text-secondary);
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s;
}
.time-range-btn:hover { color: var(--text-primary); }
.time-range-btn.active {
background: var(--accent);
color: white;
}
.refresh-btn {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text-secondary);
font-size: 11px;
cursor: pointer;
}
.refresh-btn:hover { color: var(--text-primary); border-color: var(--text-secondary); }
/* KPI Cards */
.kpi-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 12px;
margin-bottom: 16px;
}
.kpi-card {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 8px;
padding: 16px;
}
.kpi-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.kpi-label {
font-size: 11px;
font-weight: 500;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.3px;
}
.kpi-icon { color: var(--text-secondary); }
.kpi-icon.positive { color: #22c55e; }
.kpi-icon.negative { color: #ef4444; }
.kpi-icon.warning { color: #eab308; }
.kpi-value {
font-size: 22px;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 4px;
}
.kpi-value.positive { color: #22c55e; }
.kpi-value.negative { color: #ef4444; }
.kpi-change {
display: flex;
align-items: center;
gap: 4px;
font-size: 11px;
font-weight: 500;
}
.kpi-change.positive { color: #22c55e; }
.kpi-change.negative { color: #ef4444; }
.kpi-sub {
display: flex;
gap: 8px;
font-size: 10px;
color: var(--text-secondary);
}
.alert-card { border-color: rgba(234,179,8,0.3); }
/* Dashboard Grid */
.dashboard-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.dashboard-card {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 8px;
overflow: hidden;
}
.card-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
border-bottom: 1px solid var(--border);
}
.card-header h3 {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin: 0;
}
.card-action {
display: flex;
align-items: center;
gap: 4px;
background: transparent;
border: none;
color: var(--accent);
font-size: 11px;
cursor: pointer;
}
.card-action:hover { text-decoration: underline; }
.card-header-actions {
display: flex;
gap: 8px;
align-items: center;
}
/* Asset Allocation */
.allocation-chart { padding: 16px; }
.allocation-bar {
display: flex;
height: 24px;
border-radius: 4px;
overflow: hidden;
margin-bottom: 14px;
}
.allocation-segment {
transition: opacity 0.15s;
cursor: pointer;
}
.allocation-segment:hover { opacity: 0.8; }
.allocation-legend {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 6px;
}
.legend-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
}
.legend-dot {
width: 8px;
height: 8px;
border-radius: 2px;
flex-shrink: 0;
}
.legend-label { color: var(--text-secondary); flex: 1; }
.legend-value { color: var(--text-primary); font-weight: 500; font-family: 'SF Mono', monospace; font-size: 10px; }
.legend-pct { color: var(--text-secondary); font-size: 10px; }
/* Positions */
.positions-table { padding: 0; }
.positions-header {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
padding: 8px 16px;
font-size: 10px;
font-weight: 600;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.3px;
border-bottom: 1px solid var(--border);
}
.position-row {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
padding: 8px 16px;
font-size: 12px;
border-bottom: 1px solid rgba(255,255,255,0.03);
transition: background 0.1s;
}
.position-row:hover { background: var(--bg-hover); }
.position-name {
display: flex;
flex-direction: column;
}
.position-asset-class {
font-size: 9px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* Accounts List */
.accounts-list { padding: 0; }
.account-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 16px;
border-bottom: 1px solid rgba(255,255,255,0.03);
transition: background 0.1s;
}
.account-row:hover { background: var(--bg-hover); }
.account-info {
display: flex;
align-items: center;
gap: 10px;
}
.account-type-badge {
font-size: 9px;
font-weight: 600;
padding: 2px 6px;
border-radius: 3px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-primary);
}
.account-type-badge.operating { background: rgba(59,130,246,0.15); color: #3b82f6; }
.account-type-badge.treasury { background: rgba(20,184,166,0.15); color: #14b8a6; }
.account-type-badge.custody { background: rgba(168,85,247,0.15); color: #a855f7; }
.account-type-badge.stablecoin { background: rgba(16,185,129,0.15); color: #10b981; }
.account-type-badge.nostro { background: rgba(234,179,8,0.15); color: #eab308; }
.account-name { font-size: 12px; }
.account-balance {
text-align: right;
display: flex;
flex-direction: column;
}
.account-currency {
font-size: 10px;
color: var(--text-secondary);
}
/* Alerts */
.alerts-list { padding: 0; }
.alert-row {
display: flex;
align-items: flex-start;
gap: 8px;
padding: 10px 16px;
border-bottom: 1px solid rgba(255,255,255,0.03);
font-size: 11px;
}
.alert-severity {
font-weight: 700;
font-size: 9px;
flex-shrink: 0;
min-width: 55px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.alert-category {
font-weight: 600;
color: var(--text-primary);
flex-shrink: 0;
min-width: 60px;
}
.alert-message {
color: var(--text-secondary);
line-height: 1.4;
}
/* Activity List */
.activity-list { padding: 0; }
.activity-row {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 8px 16px;
border-bottom: 1px solid rgba(255,255,255,0.03);
}
.activity-dot {
width: 6px;
height: 6px;
border-radius: 50%;
margin-top: 5px;
flex-shrink: 0;
}
.activity-content {
flex: 1;
display: flex;
flex-direction: column;
}
.activity-action {
font-size: 12px;
font-weight: 600;
color: var(--text-primary);
}
.activity-detail {
font-size: 11px;
color: var(--text-secondary);
margin-top: 1px;
}
.activity-time {
font-size: 10px;
color: var(--text-secondary);
font-family: 'SF Mono', monospace;
flex-shrink: 0;
}
/* Modules Quick Access */
.modules-card { grid-column: 1 / -1; }
.modules-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
padding: 14px;
}
.module-card {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
padding: 16px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 8px;
cursor: pointer;
transition: all 0.15s;
color: var(--text-primary);
text-align: center;
position: relative;
}
.module-card:hover {
border-color: var(--accent);
background: var(--bg-hover);
transform: translateY(-1px);
}
.module-card:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.module-name {
font-size: 13px;
font-weight: 600;
}
.module-desc {
font-size: 10px;
color: var(--text-secondary);
line-height: 1.4;
}
.module-badge {
position: absolute;
top: 8px;
right: 8px;
font-size: 9px;
padding: 2px 6px;
background: rgba(168,85,247,0.15);
color: #a855f7;
border-radius: 4px;
font-weight: 600;
}
/* ── Accounts Page ── */
.accounts-page, .treasury-page, .reporting-page, .compliance-page, .settlements-page, .settings-page {
padding: 0 28px 28px;
}
.accounts-summary, .settlements-summary, .treasury-summary {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
margin: 0 28px 16px;
padding: 0;
}
.accounts-page .accounts-summary,
.treasury-page .treasury-summary,
.settlements-page .settlements-summary {
margin: 0 0 16px;
}
.summary-card {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 8px;
padding: 14px 16px;
display: flex;
flex-direction: column;
gap: 4px;
}
.summary-label {
font-size: 11px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.3px;
}
.summary-value {
font-size: 20px;
font-weight: 700;
color: var(--text-primary);
}
.summary-value.green { color: #22c55e; }
.summary-value.red { color: #ef4444; }
.summary-value.orange { color: #f97316; }
.summary-sub {
font-size: 10px;
color: var(--text-secondary);
}
/* Table Toolbar */
.table-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 0;
gap: 12px;
margin-bottom: 4px;
}
.table-toolbar-left, .table-toolbar-right {
display: flex;
align-items: center;
gap: 8px;
}
.search-input-wrapper {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 10px;
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text-secondary);
}
.search-input-wrapper input {
background: transparent;
border: none;
color: var(--text-primary);
font-size: 12px;
outline: none;
width: 180px;
}
.filter-group {
display: flex;
align-items: center;
gap: 4px;
color: var(--text-secondary);
}
.filter-group select {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 4px;
color: var(--text-primary);
font-size: 11px;
padding: 5px 8px;
outline: none;
}
.view-toggle {
display: flex;
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 4px;
overflow: hidden;
}
.view-toggle button {
padding: 5px 12px;
background: transparent;
border: none;
color: var(--text-secondary);
font-size: 11px;
cursor: pointer;
}
.view-toggle button.active {
background: var(--accent);
color: white;
}
/* Account Table */
.account-table {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 8px;
overflow: hidden;
}
.account-table-header {
display: grid;
grid-template-columns: 2.5fr 0.7fr 1.2fr 1.2fr 0.8fr 1.5fr 0.8fr 0.8fr;
padding: 10px 16px;
font-size: 10px;
font-weight: 600;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.3px;
border-bottom: 1px solid var(--border);
background: var(--bg-elevated);
}
.account-table-body {
max-height: 500px;
overflow-y: auto;
}
.account-table-row {
display: grid;
grid-template-columns: 2.5fr 0.7fr 1.2fr 1.2fr 0.8fr 1.5fr 0.8fr 0.8fr;
padding: 8px 16px;
font-size: 12px;
border-bottom: 1px solid rgba(255,255,255,0.03);
align-items: center;
transition: background 0.1s;
}
.account-table-row:hover { background: var(--bg-hover); }
.account-table-name {
display: flex;
align-items: center;
gap: 8px;
}
.expand-btn {
background: transparent;
border: none;
color: var(--text-secondary);
cursor: pointer;
padding: 2px;
display: flex;
}
.expand-placeholder { width: 18px; }
.account-type-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.account-name-text {
font-weight: 500;
color: var(--text-primary);
display: block;
}
.account-type-label {
font-size: 10px;
color: var(--text-secondary);
text-transform: capitalize;
display: block;
}
.account-table-cell {
font-size: 12px;
color: var(--text-primary);
}
.account-table-cell.balance { font-weight: 600; }
.account-status-badge {
font-size: 10px;
font-weight: 600;
padding: 2px 8px;
border-radius: 4px;
text-transform: capitalize;
}
.account-status-badge.active { background: rgba(34,197,94,0.15); color: #22c55e; }
.account-status-badge.frozen { background: rgba(249,115,22,0.15); color: #f97316; }
.account-status-badge.closed { background: rgba(107,114,128,0.15); color: #6b7280; }
.swift-badge {
font-size: 9px;
padding: 1px 4px;
background: rgba(59,130,246,0.1);
border-radius: 2px;
color: var(--accent);
margin-left: 4px;
}
.row-action-btn {
background: transparent;
border: none;
color: var(--text-secondary);
cursor: pointer;
padding: 4px;
border-radius: 3px;
}
.row-action-btn:hover { color: var(--text-primary); background: var(--bg-hover); }
.account-table-cell.actions {
display: flex;
gap: 2px;
}
.small { font-size: 10px; }
.mono { font-family: 'SF Mono', 'Fira Code', monospace; }
/* ── Treasury Page ── */
.treasury-grid {
display: flex;
flex-direction: column;
gap: 12px;
}
.positions-table-card, .forecast-card {
width: 100%;
}
.treasury-table { overflow-x: auto; }
.treasury-table-header {
display: grid;
grid-template-columns: 1.8fr 1fr 1fr 1fr 1fr 1.2fr 1fr;
padding: 10px 16px;
font-size: 10px;
font-weight: 600;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.3px;
border-bottom: 1px solid var(--border);
background: var(--bg-elevated);
}
.treasury-table-row {
display: grid;
grid-template-columns: 1.8fr 1fr 1fr 1fr 1fr 1.2fr 1fr;
padding: 10px 16px;
font-size: 12px;
border-bottom: 1px solid rgba(255,255,255,0.03);
align-items: center;
}
.treasury-table-row:hover { background: var(--bg-hover); }
.instrument-name { font-weight: 500; }
.asset-class-badge {
font-size: 9px;
padding: 2px 6px;
background: var(--bg-hover);
border-radius: 3px;
color: var(--text-secondary);
}
.positive { color: #22c55e; }
.negative { color: #ef4444; }
.custodian-name { font-size: 11px; color: var(--text-secondary); }
/* Cash Forecast */
.forecast-chart {
display: flex;
align-items: flex-end;
gap: 4px;
height: 160px;
padding: 16px;
}
.forecast-bar-wrapper {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
justify-content: flex-end;
}
.forecast-bar {
width: 100%;
background: rgba(59,130,246,0.3);
border-radius: 2px 2px 0 0;
transition: height 0.3s;
min-height: 4px;
}
.forecast-bar.actual {
background: var(--accent);
}
.forecast-label {
font-size: 8px;
color: var(--text-secondary);
margin-top: 4px;
white-space: nowrap;
}
.forecast-legend {
display: flex;
gap: 16px;
padding: 0 16px 12px;
font-size: 10px;
color: var(--text-secondary);
}
.legend-dot.actual { background: var(--accent); }
.legend-dot.projected { background: rgba(59,130,246,0.3); }
/* ── Reporting Page ── */
.standards-tabs {
display: flex;
gap: 8px;
margin: 0 28px 12px;
padding: 0;
}
.reporting-page .standards-tabs { margin: 0 0 12px; }
.standard-tab {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 18px;
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text-secondary);
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s;
}
.standard-tab:hover { border-color: var(--text-secondary); }
.standard-tab.active {
background: var(--bg-elevated);
}
.standard-dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.standard-count {
font-size: 10px;
padding: 1px 6px;
background: var(--bg-hover);
border-radius: 8px;
}
.standard-detail-card {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 8px;
padding: 18px 20px;
margin-bottom: 16px;
}
.standard-detail-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
margin-bottom: 8px;
}
.standard-detail-header h3 { margin: 0; font-size: 16px; font-weight: 700; }
.standard-full-name {
font-size: 11px;
color: var(--text-secondary);
margin-top: 2px;
}
.jurisdiction-badge {
font-size: 10px;
padding: 3px 8px;
background: var(--bg-hover);
border-radius: 4px;
color: var(--text-secondary);
}
.standard-description {
font-size: 12px;
color: var(--text-secondary);
line-height: 1.5;
margin: 0 0 12px;
}
.key-statements-label {
font-size: 10px;
font-weight: 600;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.3px;
}
.statements-list {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 6px;
}
.statement-badge {
font-size: 10px;
padding: 3px 8px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 4px;
color: var(--text-primary);
}
/* Reports Table */
.reports-table { overflow-x: auto; }
.reports-table-header {
display: grid;
grid-template-columns: 2fr 0.8fr 1.2fr 0.8fr 0.8fr 0.8fr 0.7fr 0.7fr;
padding: 10px 16px;
font-size: 10px;
font-weight: 600;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.3px;
border-bottom: 1px solid var(--border);
background: var(--bg-elevated);
}
.reports-table-row {
display: grid;
grid-template-columns: 2fr 0.8fr 1.2fr 0.8fr 0.8fr 0.8fr 0.7fr 0.7fr;
padding: 10px 16px;
font-size: 12px;
border-bottom: 1px solid rgba(255,255,255,0.03);
align-items: center;
}
.reports-table-row:hover { background: var(--bg-hover); }
.report-name { font-weight: 500; }
.standard-badge {
font-size: 9px;
font-weight: 600;
padding: 2px 6px;
border: 1px solid;
border-radius: 3px;
}
.report-type { text-transform: capitalize; font-size: 11px; color: var(--text-secondary); }
.report-period { text-transform: capitalize; font-size: 11px; }
.report-status {
display: flex;
align-items: center;
gap: 4px;
font-size: 11px;
font-weight: 500;
text-transform: capitalize;
}
.report-actions {
display: flex;
gap: 4px;
}
/* ── Compliance Page ── */
.compliance-metrics {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
margin-bottom: 16px;
}
.metric-card {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 8px;
padding: 14px 16px;
}
.metric-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 6px;
}
.metric-label {
font-size: 11px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.3px;
}
.metric-value {
font-size: 20px;
font-weight: 700;
margin-bottom: 2px;
}
.metric-sub {
font-size: 10px;
color: var(--text-secondary);
margin-bottom: 8px;
}
.metric-bar {
height: 4px;
background: var(--bg-hover);
border-radius: 2px;
overflow: hidden;
}
.metric-bar-fill {
height: 100%;
border-radius: 2px;
transition: width 0.3s;
}
.compliance-grid {
display: grid;
grid-template-columns: 1.5fr 1fr;
gap: 12px;
}
.alert-table-row {
display: flex;
align-items: flex-start;
gap: 8px;
padding: 10px 16px;
border-bottom: 1px solid rgba(255,255,255,0.03);
font-size: 11px;
}
.alert-sev-badge {
font-size: 9px;
font-weight: 700;
padding: 2px 6px;
border: 1px solid;
border-radius: 3px;
flex-shrink: 0;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.alert-cat {
font-weight: 600;
color: var(--text-primary);
flex-shrink: 0;
min-width: 50px;
}
.alert-msg {
color: var(--text-secondary);
flex: 1;
line-height: 1.4;
}
.alert-status-badge {
display: flex;
align-items: center;
gap: 3px;
font-size: 10px;
text-transform: capitalize;
flex-shrink: 0;
}
.alert-time {
flex-shrink: 0;
font-size: 10px;
color: var(--text-secondary);
}
.alert-assigned {
flex-shrink: 0;
font-size: 10px;
color: var(--accent);
}
.regulatory-list { padding: 0; }
.regulatory-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 16px;
border-bottom: 1px solid rgba(255,255,255,0.03);
}
.regulatory-info {
display: flex;
flex-direction: column;
gap: 3px;
}
.regulatory-name {
font-size: 12px;
font-weight: 500;
color: var(--text-primary);
}
.regulatory-status {
display: flex;
align-items: center;
gap: 4px;
font-size: 10px;
text-transform: capitalize;
}
.regulatory-status.compliant { color: #22c55e; }
.regulatory-status.review_needed { color: #eab308; }
.regulatory-dates {
display: flex;
flex-direction: column;
gap: 2px;
text-align: right;
font-size: 10px;
color: var(--text-secondary);
}
/* ── Settlements Page ── */
.settlements-table { overflow-x: auto; }
.settlements-table-header {
display: grid;
grid-template-columns: 1.2fr 0.6fr 0.8fr 1fr 0.6fr 1.2fr 1fr 1fr 0.7fr;
padding: 10px 16px;
font-size: 10px;
font-weight: 600;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.3px;
border-bottom: 1px solid var(--border);
background: var(--bg-elevated);
}
.settlements-table-row {
display: grid;
grid-template-columns: 1.2fr 0.6fr 0.8fr 1fr 0.6fr 1.2fr 1fr 1fr 0.7fr;
padding: 10px 16px;
font-size: 12px;
border-bottom: 1px solid rgba(255,255,255,0.03);
align-items: center;
}
.settlements-table-row:hover { background: var(--bg-hover); }
.type-badge {
font-size: 9px;
font-weight: 600;
padding: 2px 8px;
border: 1px solid;
border-radius: 3px;
}
.settlement-status {
display: flex;
align-items: center;
gap: 4px;
font-size: 11px;
font-weight: 500;
text-transform: capitalize;
}
.csd-badge {
font-size: 10px;
padding: 2px 6px;
background: var(--bg-hover);
border-radius: 3px;
color: var(--text-secondary);
}
/* ── Settings Page ── */
.settings-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.settings-section {
padding: 12px 16px;
}
.setting-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid rgba(255,255,255,0.03);
}
.setting-label {
font-size: 12px;
color: var(--text-secondary);
}
.setting-value {
font-size: 12px;
color: var(--text-primary);
font-weight: 500;
}
.permissions-list {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.permission-badge {
font-size: 10px;
padding: 3px 8px;
background: rgba(59,130,246,0.1);
border: 1px solid rgba(59,130,246,0.2);
border-radius: 4px;
color: var(--accent);
}
/* ================================================================= */
/* /transactions page (PR G — arch step 8) */
/* ================================================================= */
.transactions-page { padding: 24px; display: flex; flex-direction: column; gap: 20px; }
.transactions-page .back-button {
background: none; border: none; color: var(--accent);
cursor: pointer; font-size: 13px; padding: 0; margin-bottom: 8px;
}
.transactions-page .back-button:hover { text-decoration: underline; }
.source-badge {
font-size: 10px; letter-spacing: 0.08em; padding: 2px 8px;
border-radius: 10px; font-weight: 600; text-transform: uppercase;
}
.source-badge--live { background: rgba(34,197,94,0.15); color: #22c55e; }
.source-badge--degraded { background: rgba(239,68,68,0.15); color: #ef4444; }
.source-badge--mocked { background: rgba(148,163,184,0.20); color: #94a3b8; }
.portal-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.portal-table th, .portal-table td { padding: 10px 12px; text-align: left; border-bottom: 1px solid rgba(148,163,184,0.12); }
.portal-table th { font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: #94a3b8; font-weight: 600; }
.portal-table tbody tr { transition: background 0.12s ease; }
.portal-table .portal-table-row { cursor: pointer; }
.portal-table .portal-table-row:hover { background: rgba(99,102,241,0.06); }
.portal-table .mono { font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 12px; }
.portal-table .truncate { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.portal-table .row-chevron { color: #64748b; }
.state-chip, .role-chip {
display: inline-flex; align-items: center; gap: 6px;
padding: 3px 10px; border-radius: 999px; font-size: 11px;
font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase;
background: rgba(99,102,241,0.14); color: #a5b4fc;
}
.state-chip--committed { background: rgba(34,197,94,0.15); color: #22c55e; }
.state-chip--aborted { background: rgba(239,68,68,0.15); color: #ef4444; }
.state-chip--validating,
.state-chip--executing,
.state-chip--partially_executed { background: rgba(245,158,11,0.15); color: #f59e0b; }
.state-chip--draft { background: rgba(148,163,184,0.18); color: #cbd5e1; }
.state-chip--closed { background: rgba(148,163,184,0.25); color: #e2e8f0; }
.role-chip--submitter { background: rgba(99,102,241,0.14); color: #a5b4fc; }
.role-chip--approver { background: rgba(245,158,11,0.14); color: #f59e0b; }
.role-chip--releaser { background: rgba(14,165,233,0.14); color: #38bdf8; }
.role-chip--validator { background: rgba(168,85,247,0.14); color: #c084fc; }
.role-chip--coordinator{ background: rgba(148,163,184,0.18); color: #cbd5e1; }
.state-machine-view { padding: 12px 8px 4px; }
.state-machine-grid {
display: grid; gap: 10px;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
}
.state-pill {
display: flex; align-items: center; gap: 10px;
padding: 10px 14px; border-radius: 10px;
border: 1px solid rgba(148,163,184,0.18);
background: rgba(15,23,42,0.35); color: #e2e8f0;
font-size: 12px; font-weight: 500; letter-spacing: 0.03em;
}
.state-pill-dot {
width: 10px; height: 10px; border-radius: 50%;
background: rgba(148,163,184,0.45);
}
.state-pill--visited { border-color: rgba(99,102,241,0.35); }
.state-pill--visited .state-pill-dot { background: #818cf8; }
.state-pill--current {
border-color: #22c55e;
box-shadow: 0 0 0 2px rgba(34,197,94,0.18);
background: rgba(34,197,94,0.08);
}
.state-pill--current .state-pill-dot { background: #22c55e; }
.state-pill--pending { opacity: 0.55; }
.state-pill--terminal.state-pill--visited { border-color: #f59e0b; }
.state-machine-legend {
display: flex; gap: 16px; padding: 12px 4px 0;
font-size: 11px; color: #94a3b8;
}
.legend-item { display: inline-flex; align-items: center; gap: 6px; }
.legend-item .dot { width: 8px; height: 8px; border-radius: 50%; }
.legend-item .dot--current { background: #22c55e; }
.legend-item .dot--visited { background: #818cf8; }
.legend-item .dot--pending { background: rgba(148,163,184,0.45); }
.loading-row, .empty-row { padding: 20px; color: #94a3b8; text-align: center; font-size: 13px; }
.error-banner {
padding: 10px 14px; border-radius: 8px; font-size: 12px;
background: rgba(239,68,68,0.10); color: #fca5a5;
border: 1px solid rgba(239,68,68,0.25); margin: 8px 0;
}
.muted { color: #94a3b8; }