Phase 1: Extract 6 shared CSS modules (table-section, log-panel, rate-colors, refresh-indicator, chart-card, section-card) eliminating ~135 duplicate class definitions across 11 files. Phase 2: Replace all hardcoded hex colors in CSS modules with design system variables. Strip ~55 hex fallbacks from var() patterns. Fix 4 undefined variable names (--accent, --bg-base, --surface, --bg-surface-raised). Phase 3: Replace ~45 hardcoded hex values in ProcessDiagram SVG components with var() CSS custom properties. Fix Dashboard.tsx color prop. Phase 4: Create CSS modules for AdminLayout, DatabaseAdminPage, OidcCallback (previously 100% inline). Extract shared PageLoader component (replaces 3 copy-pasted spinner patterns). Move AppsTab static inline styles to CSS classes. Extract LayoutShell StarredList styles. 58 files changed, net -219 lines. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
324 lines
5.2 KiB
CSS
324 lines
5.2 KiB
CSS
/* Back link */
|
|
.backLink {
|
|
font-size: 13px;
|
|
color: var(--text-muted);
|
|
text-decoration: none;
|
|
margin-bottom: 12px;
|
|
display: inline-block;
|
|
}
|
|
|
|
.backLink:hover {
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
/* Route header card */
|
|
.headerCard {
|
|
background: var(--bg-surface);
|
|
border: 1px solid var(--border-subtle);
|
|
border-radius: var(--radius-lg);
|
|
box-shadow: var(--shadow-card);
|
|
padding: 16px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.headerRow {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
gap: 16px;
|
|
}
|
|
|
|
.headerLeft {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
}
|
|
|
|
.headerRight {
|
|
display: flex;
|
|
gap: 20px;
|
|
}
|
|
|
|
.headerStat {
|
|
text-align: center;
|
|
}
|
|
|
|
.headerStatLabel {
|
|
font-size: 12px;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.6px;
|
|
color: var(--text-muted);
|
|
margin-bottom: 2px;
|
|
}
|
|
|
|
.headerStatValue {
|
|
font-size: 14px;
|
|
font-weight: 700;
|
|
font-family: var(--font-mono);
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
/* Diagram + Stats side-by-side */
|
|
.diagramStatsGrid {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 16px;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.diagramPane,
|
|
.statsPane {
|
|
background: var(--bg-surface);
|
|
border: 1px solid var(--border-subtle);
|
|
border-radius: var(--radius-lg);
|
|
box-shadow: var(--shadow-card);
|
|
padding: 16px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.paneTitle {
|
|
font-size: 13px;
|
|
font-weight: 700;
|
|
color: var(--text-primary);
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
/* Processor type badges */
|
|
.processorType {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
padding: 2px 6px;
|
|
border-radius: var(--radius-sm);
|
|
font-size: 9px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
.typeConsumer {
|
|
background: var(--running-bg);
|
|
color: var(--running);
|
|
}
|
|
|
|
.typeProducer {
|
|
background: var(--success-bg);
|
|
color: var(--success);
|
|
}
|
|
|
|
.typeEnricher {
|
|
background: var(--amber-bg);
|
|
color: var(--amber);
|
|
}
|
|
|
|
.typeValidator {
|
|
background: var(--running-bg);
|
|
color: var(--running);
|
|
}
|
|
|
|
.typeTransformer {
|
|
background: var(--bg-hover);
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.typeRouter {
|
|
background: var(--purple-bg);
|
|
color: var(--purple);
|
|
}
|
|
|
|
.typeProcessor {
|
|
background: var(--bg-hover);
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
/* Tabs section */
|
|
.tabSection {
|
|
margin-top: 20px;
|
|
}
|
|
|
|
/* Route name in table */
|
|
.routeNameCell {
|
|
font-size: 12px;
|
|
font-weight: 500;
|
|
color: var(--text-primary);
|
|
font-family: var(--font-mono);
|
|
}
|
|
|
|
.tableSection {
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
/* Chart grid */
|
|
.chartGrid {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 16px;
|
|
}
|
|
|
|
.chartTitle {
|
|
font-size: 12px;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
color: var(--text-secondary);
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
/* Executions table */
|
|
.executionsTable {
|
|
background: var(--bg-surface);
|
|
border: 1px solid var(--border-subtle);
|
|
border-radius: var(--radius-lg);
|
|
box-shadow: var(--shadow-card);
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* Error patterns */
|
|
.errorPatterns {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
.errorRow {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 10px 12px;
|
|
background: var(--bg-surface);
|
|
border: 1px solid var(--border-subtle);
|
|
border-radius: var(--radius-lg);
|
|
font-size: 12px;
|
|
}
|
|
|
|
.errorMessage {
|
|
flex: 1;
|
|
font-family: var(--font-mono);
|
|
color: var(--text-primary);
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
max-width: 400px;
|
|
}
|
|
|
|
.errorCount {
|
|
font-weight: 700;
|
|
color: var(--error);
|
|
margin: 0 12px;
|
|
}
|
|
|
|
.errorTime {
|
|
color: var(--text-muted);
|
|
font-size: 12px;
|
|
}
|
|
|
|
/* Route flow section */
|
|
.routeFlowSection {
|
|
background: var(--bg-surface);
|
|
border: 1px solid var(--border-subtle);
|
|
border-radius: var(--radius-lg);
|
|
box-shadow: var(--shadow-card);
|
|
padding: 16px;
|
|
margin-top: 16px;
|
|
}
|
|
|
|
/* Empty / muted text */
|
|
.emptyText {
|
|
color: var(--text-muted);
|
|
font-size: 13px;
|
|
padding: 8px 0;
|
|
}
|
|
|
|
/* Recording pill */
|
|
.recordingPill {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
background: var(--bg-surface);
|
|
border: 1px solid var(--border-subtle);
|
|
border-radius: var(--radius-lg);
|
|
padding: 6px 12px;
|
|
}
|
|
|
|
.recordingLabel {
|
|
font-size: 12px;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
/* Taps section */
|
|
.tapsSection {
|
|
margin-top: 16px;
|
|
}
|
|
|
|
.tapsHeader {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 12px 16px;
|
|
}
|
|
|
|
.tapsTitle {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.emptyState {
|
|
padding: 40px;
|
|
text-align: center;
|
|
color: var(--text-muted);
|
|
font-size: 13px;
|
|
}
|
|
|
|
.tapActions {
|
|
display: flex;
|
|
gap: 6px;
|
|
align-items: center;
|
|
}
|
|
|
|
.tapActionBtn {
|
|
background: none;
|
|
border: none;
|
|
color: var(--text-muted);
|
|
cursor: pointer;
|
|
font-size: 14px;
|
|
padding: 2px 4px;
|
|
border-radius: var(--radius-sm);
|
|
line-height: 1;
|
|
transition: color 0.15s;
|
|
}
|
|
|
|
.tapActionBtn:hover {
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
/* Tap modal */
|
|
.tapModalBody {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
}
|
|
|
|
.tapFormRow {
|
|
display: flex;
|
|
gap: 12px;
|
|
}
|
|
|
|
.tapFormRow > * {
|
|
flex: 1;
|
|
}
|
|
|
|
.monoTextarea {
|
|
font-family: var(--font-mono);
|
|
font-size: 12px;
|
|
}
|
|
|
|
.tapModalFooter {
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
gap: 8px;
|
|
margin-top: 8px;
|
|
padding-top: 12px;
|
|
border-top: 1px solid var(--border-subtle);
|
|
}
|
|
|