@ltm-blueverse/alpha-semantic-hub 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +307 -1567
  2. package/explorer/src/App.tsx +83 -83
  3. package/explorer/src/index.css +3 -3
  4. package/explorer/src/ui/primitives.css +25 -25
  5. package/explorer/src/workspaces/DecisionWorkspace/DecisionWorkspace.tsx +7 -7
  6. package/explorer/src/workspaces/DiffMergeWorkspace/DiffMergeWorkspace.tsx +4 -4
  7. package/explorer/src/workspaces/EnrichWorkspace/EntityResolutionTab.tsx +24 -24
  8. package/explorer/src/workspaces/EnrichWorkspace/RegistryTab.tsx +22 -22
  9. package/explorer/src/workspaces/GraphWorkspace/GraphCanvas.tsx +1 -1
  10. package/explorer/src/workspaces/GraphWorkspace/GraphInspectorPanel.tsx +18 -18
  11. package/explorer/src/workspaces/GraphWorkspace/GraphLoadingOverlay.tsx +25 -25
  12. package/explorer/src/workspaces/GraphWorkspace/GraphWorkspace.tsx +28 -28
  13. package/explorer/src/workspaces/GraphWorkspace/MarkdownContentViewer.tsx +15 -15
  14. package/explorer/src/workspaces/GraphWorkspace/graphAnalytics.ts +1 -1
  15. package/explorer/src/workspaces/GraphWorkspace/graphConfig.ts +15 -15
  16. package/explorer/src/workspaces/GraphWorkspace/graphSceneLayers.ts +8 -8
  17. package/explorer/src/workspaces/GraphWorkspace/graphSceneState.ts +11 -11
  18. package/explorer/src/workspaces/GraphWorkspace/graphTheme.ts +66 -66
  19. package/explorer/src/workspaces/GraphWorkspace/plugins/explorationEffectsPlugin.tsx +17 -17
  20. package/explorer/src/workspaces/GraphWorkspace/plugins/explorationEffectsPluginPhaseC.tsx +22 -22
  21. package/explorer/src/workspaces/GraphWorkspace/plugins/legendPlugin.tsx +7 -7
  22. package/explorer/src/workspaces/GraphWorkspace/plugins/neighborhoodPanelPlugin.tsx +10 -10
  23. package/explorer/src/workspaces/GraphWorkspace/plugins/temporalOverlayPlugin.tsx +9 -9
  24. package/explorer/src/workspaces/ImportExportWorkspace/ImportExportWorkspace.tsx +4 -4
  25. package/explorer/src/workspaces/LineageWorkspace/LineageDiagram.tsx +8 -8
  26. package/explorer/src/workspaces/ManageWorkspace/KGOverviewTab.tsx +5 -5
  27. package/explorer/src/workspaces/ManageWorkspace/OntologySummaryTab.tsx +19 -19
  28. package/explorer/src/workspaces/MemoryWorkspace.tsx +2 -2
  29. package/explorer/src/workspaces/OntologyWorkspace/AlignmentsTab.tsx +30 -30
  30. package/explorer/src/workspaces/OntologyWorkspace/HealthTab.tsx +26 -26
  31. package/explorer/src/workspaces/OntologyWorkspace/OntologyEditor.tsx +32 -32
  32. package/explorer/src/workspaces/OntologyWorkspace/OntologyLoader.tsx +22 -22
  33. package/explorer/src/workspaces/OntologyWorkspace/OntologyManager.tsx +40 -40
  34. package/explorer/src/workspaces/OntologyWorkspace/OntologySearch.tsx +22 -22
  35. package/explorer/src/workspaces/OntologyWorkspace/ProposalReview.tsx +31 -31
  36. package/explorer/src/workspaces/OntologyWorkspace/SKOSVocabularyManager.tsx +26 -26
  37. package/explorer/src/workspaces/OntologyWorkspace/ShaclStudio.tsx +21 -21
  38. package/explorer/src/workspaces/OntologyWorkspace/VersionsTab.tsx +38 -38
  39. package/explorer/src/workspaces/OntologyWorkspace/ontologyEditorModel.ts +3 -3
  40. package/explorer/src/workspaces/ReasoningWorkspace.tsx +4 -4
  41. package/explorer/src/workspaces/SparqlWorkspace/SparqlWorkspace.tsx +3 -3
  42. package/explorer/src/workspaces/VocabularyWorkspace/ConceptTree.tsx +3 -3
  43. package/explorer/src/workspaces/VocabularyWorkspace/ImportDropzone.tsx +4 -4
  44. package/explorer/src/workspaces/VocabularyWorkspace/PropertyPanel.tsx +8 -8
  45. package/explorer/src/workspaces/VocabularyWorkspace/Sidebar.tsx +4 -4
  46. package/explorer/src/workspaces/VocabularyWorkspace/VocabularyWorkspace.tsx +3 -3
  47. package/package.json +1 -1
@@ -49,7 +49,7 @@ export const legendPlugin: GraphPlugin = {
49
49
  style={{
50
50
  ...swatchStyle,
51
51
  background: item.color,
52
- boxShadow: `0 0 0 1px rgba(255,255,255,0.06), 0 0 18px ${item.color}44`,
52
+ boxShadow: `0 0 0 1px rgba(28, 20, 24,0.06), 0 0 18px ${item.color}44`,
53
53
  }}
54
54
  />
55
55
  <div style={{ minWidth: 0, flex: 1 }}>
@@ -75,7 +75,7 @@ const panelBodyStyle: CSSProperties = {
75
75
  };
76
76
 
77
77
  const panelEyebrowStyle: CSSProperties = {
78
- color: "#c99aa3",
78
+ color: "#aa485b",
79
79
  fontSize: 11,
80
80
  fontWeight: 700,
81
81
  letterSpacing: "0.08em",
@@ -88,8 +88,8 @@ const legendRowStyle: CSSProperties = {
88
88
  gap: 10,
89
89
  padding: "8px 10px",
90
90
  borderRadius: 12,
91
- border: "1px solid rgba(255,255,255,0.06)",
92
- background: "rgba(255,255,255,0.025)",
91
+ border: "1px solid rgba(28, 20, 24,0.06)",
92
+ background: "rgba(28, 20, 24,0.025)",
93
93
  };
94
94
 
95
95
  const swatchStyle: CSSProperties = {
@@ -100,7 +100,7 @@ const swatchStyle: CSSProperties = {
100
100
  };
101
101
 
102
102
  const rowTitleStyle: CSSProperties = {
103
- color: "#fff1f3",
103
+ color: "#2d1619",
104
104
  fontSize: 13,
105
105
  fontWeight: 600,
106
106
  overflow: "hidden",
@@ -109,12 +109,12 @@ const rowTitleStyle: CSSProperties = {
109
109
  };
110
110
 
111
111
  const rowMetaStyle: CSSProperties = {
112
- color: "#c99aa3",
112
+ color: "#aa485b",
113
113
  fontSize: 12,
114
114
  };
115
115
 
116
116
  const emptyTextStyle: CSSProperties = {
117
- color: "#c99aa3",
117
+ color: "#aa485b",
118
118
  fontSize: 12,
119
119
  lineHeight: 1.5,
120
120
  };
@@ -170,13 +170,13 @@ const panelBodyStyle: CSSProperties = {
170
170
  };
171
171
 
172
172
  const panelEyebrowStyle: CSSProperties = {
173
- color: "#fff1f3",
173
+ color: "#2d1619",
174
174
  fontSize: 14,
175
175
  fontWeight: 700,
176
176
  };
177
177
 
178
178
  const summaryStyle: CSSProperties = {
179
- color: "#c99aa3",
179
+ color: "#aa485b",
180
180
  fontSize: 12,
181
181
  lineHeight: 1.5,
182
182
  };
@@ -187,18 +187,18 @@ const neighborButtonStyle: CSSProperties = {
187
187
  gap: 10,
188
188
  width: "100%",
189
189
  padding: "8px 10px",
190
- background: "rgba(255,255,255,0.025)",
191
- border: "1px solid rgba(255,255,255,0.06)",
190
+ background: "rgba(28, 20, 24,0.025)",
191
+ border: "1px solid rgba(28, 20, 24,0.06)",
192
192
  borderRadius: 12,
193
193
  cursor: "pointer",
194
194
  };
195
195
 
196
196
  const controlButtonStyle: CSSProperties = {
197
197
  padding: "7px 10px",
198
- background: "rgba(255,255,255,0.03)",
199
- border: "1px solid rgba(255,255,255,0.08)",
198
+ background: "rgba(28, 20, 24,0.03)",
199
+ border: "1px solid rgba(28, 20, 24,0.08)",
200
200
  borderRadius: 10,
201
- color: "#dce7f4",
201
+ color: "#18212c",
202
202
  cursor: "pointer",
203
203
  fontSize: 12,
204
204
  };
@@ -211,7 +211,7 @@ const swatchStyle: CSSProperties = {
211
211
  };
212
212
 
213
213
  const rowTitleStyle: CSSProperties = {
214
- color: "#fff1f3",
214
+ color: "#2d1619",
215
215
  fontSize: 13,
216
216
  fontWeight: 600,
217
217
  overflow: "hidden",
@@ -220,12 +220,12 @@ const rowTitleStyle: CSSProperties = {
220
220
  };
221
221
 
222
222
  const rowMetaStyle: CSSProperties = {
223
- color: "#c99aa3",
223
+ color: "#aa485b",
224
224
  fontSize: 12,
225
225
  };
226
226
 
227
227
  const emptyTextStyle: CSSProperties = {
228
- color: "#c99aa3",
228
+ color: "#aa485b",
229
229
  fontSize: 12,
230
230
  lineHeight: 1.5,
231
231
  };
@@ -49,19 +49,19 @@ export const temporalOverlayPlugin: GraphPlugin = {
49
49
  padding: "8px 12px",
50
50
  borderRadius: 999,
51
51
  border: "1px solid rgba(255, 107, 129, 0.18)",
52
- background: "linear-gradient(135deg, rgba(6, 15, 27, 0.88), rgba(11, 22, 39, 0.76))",
52
+ background: "linear-gradient(135deg, rgba(255, 255, 255, 0.88), rgba(255, 255, 255, 0.76))",
53
53
  boxShadow: "0 12px 30px rgba(0, 0, 0, 0.28)",
54
- color: "#ffdfe4",
54
+ color: "#2e161a",
55
55
  fontSize: 11,
56
56
  letterSpacing: "0.05em",
57
57
  textTransform: "uppercase",
58
58
  pointerEvents: "none",
59
59
  }}
60
60
  >
61
- <span style={{ color: "#7fc6ff", fontWeight: 700 }}>Temporal</span>
61
+ <span style={{ color: "#2f7fd6", fontWeight: 700 }}>Temporal</span>
62
62
  <span>{label}</span>
63
63
  {typeof temporal.activeNodeCount === "number" ? (
64
- <span style={{ color: "#c99aa3" }}>{temporal.activeNodeCount.toLocaleString()} active</span>
64
+ <span style={{ color: "#aa485b" }}>{temporal.activeNodeCount.toLocaleString()} active</span>
65
65
  ) : null}
66
66
  </div>
67
67
  ),
@@ -113,7 +113,7 @@ const panelBodyStyle: CSSProperties = {
113
113
  };
114
114
 
115
115
  const panelEyebrowStyle: CSSProperties = {
116
- color: "#c99aa3",
116
+ color: "#aa485b",
117
117
  fontSize: 11,
118
118
  fontWeight: 700,
119
119
  letterSpacing: "0.08em",
@@ -126,17 +126,17 @@ const detailRowStyle: CSSProperties = {
126
126
  gap: 16,
127
127
  padding: "8px 10px",
128
128
  borderRadius: 12,
129
- border: "1px solid rgba(255,255,255,0.06)",
130
- background: "rgba(255,255,255,0.025)",
129
+ border: "1px solid rgba(28, 20, 24,0.06)",
130
+ background: "rgba(28, 20, 24,0.025)",
131
131
  };
132
132
 
133
133
  const detailLabelStyle: CSSProperties = {
134
- color: "#c99aa3",
134
+ color: "#aa485b",
135
135
  fontSize: 12,
136
136
  };
137
137
 
138
138
  const detailValueStyle: CSSProperties = {
139
- color: "#fff1f3",
139
+ color: "#2d1619",
140
140
  fontSize: 12,
141
141
  fontWeight: 600,
142
142
  };
@@ -112,7 +112,7 @@ export function ImportExportWorkspace() {
112
112
  <input {...getInputProps()} />
113
113
  {file ? (
114
114
  <>
115
- {file.name.endsWith(".json") ? <FileJson size={40} color="#4cc38a" /> : <FileText size={40} color="#4cc38a" />}
115
+ {file.name.endsWith(".json") ? <FileJson size={40} color="#1f9d5f" /> : <FileText size={40} color="#1f9d5f" />}
116
116
  <div style={{ color: "var(--ws-text)", fontWeight: 700 }}>{file.name}</div>
117
117
  <div className="ws-body" style={{ fontSize: 11 }}>{(file.size / 1024).toFixed(1)} KB — click to replace</div>
118
118
  </>
@@ -174,7 +174,7 @@ export function ImportExportWorkspace() {
174
174
  className="ws-btn"
175
175
  onClick={handleExport}
176
176
  disabled={isExporting}
177
- style={{ width: "100%", justifyContent: "center", background: "var(--ws-purple-soft)", borderColor: "rgba(192,132,252,0.3)", color: "#d8b4fe" }}
177
+ style={{ width: "100%", justifyContent: "center", background: "var(--ws-purple-soft)", borderColor: "rgba(192,132,252,0.3)", color: "#9333ea" }}
178
178
  >
179
179
  {isExporting ? <><Loader2 size={15} className="ws-spin" />Preparing…</> : <><Download size={15} />Download Export</>}
180
180
  </button>
@@ -185,8 +185,8 @@ export function ImportExportWorkspace() {
185
185
  {/* Toasts */}
186
186
  <div style={{ position: "fixed", bottom: 28, right: 28, display: "flex", flexDirection: "column", gap: 10, zIndex: 1000 }}>
187
187
  {toasts.map((t) => (
188
- <div key={t.id} className="ws-animate-in" style={{ display: "flex", alignItems: "center", gap: 10, padding: "13px 18px", borderRadius: "var(--ws-radius-sm)", background: t.type === "success" ? "rgba(16,36,22,0.96)" : "rgba(40,10,10,0.96)", border: `1px solid ${t.type === "success" ? "rgba(76,195,138,0.4)" : "rgba(255,123,114,0.4)"}`, boxShadow: "0 8px 24px rgba(0,0,0,0.5)", backdropFilter: "blur(12px)" }}>
189
- {t.type === "success" ? <CheckCircle2 size={16} color="#4cc38a" /> : <AlertCircle size={16} color="#ff7b72" />}
188
+ <div key={t.id} className="ws-animate-in" style={{ display: "flex", alignItems: "center", gap: 10, padding: "13px 18px", borderRadius: "var(--ws-radius-sm)", background: t.type === "success" ? "rgba(255, 255, 255,0.96)" : "rgba(255, 255, 255,0.96)", border: `1px solid ${t.type === "success" ? "rgba(76,195,138,0.4)" : "rgba(255,123,114,0.4)"}`, boxShadow: "0 8px 24px rgba(0,0,0,0.5)", backdropFilter: "blur(12px)" }}>
189
+ {t.type === "success" ? <CheckCircle2 size={16} color="#1f9d5f" /> : <AlertCircle size={16} color="#ec2315" />}
190
190
  <span style={{ color: "var(--ws-text)", fontSize: 13, fontWeight: 500 }}>{t.text}</span>
191
191
  </div>
192
192
  ))}
@@ -7,15 +7,15 @@ import { ReactFlow, Background, Controls } from "@xyflow/react";
7
7
  import "@xyflow/react/dist/style.css";
8
8
 
9
9
  const THEME_CSS = `
10
- .react-flow { background: var(--ws-bg, #080407); }
10
+ .react-flow { background: var(--ws-bg, #f9f7f7); }
11
11
  .react-flow__node-group {
12
12
  background: rgba(255,45,75,0.04);
13
13
  border: 1px dashed rgba(255,45,75,0.18);
14
14
  border-radius: 10px;
15
15
  }
16
16
  .react-flow__node-default {
17
- background: rgba(6,13,26,0.92);
18
- color: var(--ws-text, #ffe9ec);
17
+ background: rgba(255, 255, 255,0.92);
18
+ color: var(--ws-text, #2d1619);
19
19
  border: 1px solid rgba(255,45,75,0.22);
20
20
  border-radius: 8px;
21
21
  padding: 10px 12px;
@@ -23,9 +23,9 @@ const THEME_CSS = `
23
23
  font-size: 12px;
24
24
  box-shadow: 0 4px 16px rgba(0,0,0,0.4);
25
25
  }
26
- .react-flow__controls { background: rgba(6,13,26,0.9); border: 1px solid rgba(255,45,75,0.18); border-radius: 10px; }
26
+ .react-flow__controls { background: rgba(255, 255, 255,0.9); border: 1px solid rgba(255,45,75,0.18); border-radius: 10px; }
27
27
  .react-flow__controls-button { background: transparent; border-color: rgba(255,45,75,0.15); color: var(--ws-text-muted, #8f6d75); }
28
- .react-flow__controls-button:hover { background: rgba(255,45,75,0.1); color: var(--ws-text, #ffe9ec); }
28
+ .react-flow__controls-button:hover { background: rgba(255,45,75,0.1); color: var(--ws-text, #2d1619); }
29
29
  `;
30
30
 
31
31
  export function LineageDiagram() {
@@ -127,11 +127,11 @@ export function LineageDiagram() {
127
127
  }, [activeId]);
128
128
 
129
129
  return (
130
- <div style={{ width: "100%", height: "100%", position: "relative", background: "var(--ws-bg, #080407)" }}>
130
+ <div style={{ width: "100%", height: "100%", position: "relative", background: "var(--ws-bg, #f9f7f7)" }}>
131
131
  <style>{THEME_CSS}</style>
132
132
 
133
133
  {/* Toolbar */}
134
- <div style={{ position: "absolute", top: 14, left: 14, right: 14, zIndex: 10, display: "flex", gap: 8, alignItems: "center", background: "rgba(4,10,18,0.88)", backdropFilter: "blur(14px)", padding: "8px 12px", borderRadius: 12, border: "1px solid rgba(255,45,75,0.16)", boxShadow: "0 4px 20px rgba(0,0,0,0.4)" }}>
134
+ <div style={{ position: "absolute", top: 14, left: 14, right: 14, zIndex: 10, display: "flex", gap: 8, alignItems: "center", background: "rgba(255, 255, 255,0.88)", backdropFilter: "blur(14px)", padding: "8px 12px", borderRadius: 12, border: "1px solid rgba(255,45,75,0.16)", boxShadow: "0 4px 20px rgba(0,0,0,0.4)" }}>
135
135
  <span className="ws-eyebrow" style={{ color: "var(--ws-accent, #ff2d4b)", marginRight: 4 }}>PROV-O Lineage</span>
136
136
  <input
137
137
  className="ws-input"
@@ -155,7 +155,7 @@ export function LineageDiagram() {
155
155
  </div>
156
156
 
157
157
  {error ? (
158
- <div style={{ position: "absolute", top: 60, left: 14, right: 14, zIndex: 10, padding: 12, borderRadius: 14, color: "#ffb4c2", background: "rgba(255,157,175,0.1)", border: "1px solid rgba(255,157,175,0.18)" }}>
158
+ <div style={{ position: "absolute", top: 60, left: 14, right: 14, zIndex: 10, padding: 12, borderRadius: 14, color: "#e98498", background: "rgba(255,157,175,0.1)", border: "1px solid rgba(255,157,175,0.18)" }}>
159
159
  {error}
160
160
  </div>
161
161
  ) : null}
@@ -31,10 +31,10 @@ function TypeBar({ label, count, total, color }: { label: string; count: number;
31
31
  const pct = total > 0 ? Math.round((count / total) * 100) : 0;
32
32
  return (
33
33
  <div style={{ display: "flex", alignItems: "center", gap: 10, padding: "5px 0" }}>
34
- <div style={{ width: 120, flexShrink: 0, color: "#f0cdd3", fontSize: 12, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }} title={label}>
34
+ <div style={{ width: 120, flexShrink: 0, color: "#602b34", fontSize: 12, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }} title={label}>
35
35
  {label}
36
36
  </div>
37
- <div style={{ flex: 1, height: 6, borderRadius: 999, background: "rgba(255,255,255,0.06)", overflow: "hidden" }}>
37
+ <div style={{ flex: 1, height: 6, borderRadius: 999, background: "rgba(28, 20, 24,0.06)", overflow: "hidden" }}>
38
38
  <div
39
39
  style={{
40
40
  width: `${pct}%`,
@@ -53,8 +53,8 @@ function TypeBar({ label, count, total, color }: { label: string; count: number;
53
53
  );
54
54
  }
55
55
 
56
- const NODE_COLORS = ["#3E79F2", "#149287", "#2F9F61", "#555FD6", "#8A56D8", "#B65473", "#C9922E", "#ff2d4b", "#ff7a45"];
57
- const EDGE_COLORS = ["#4cc38a", "#ff8fa0", "#d2a8ff", "#ff7a45", "#ff7b72", "#ff2d4b", "#ff2d4b", "#8A56D8"];
56
+ const NODE_COLORS = ["#3e79f2", "#149287", "#2f9f61", "#555fd6", "#6d28d9", "#b65473", "#8a5a10", "#ff2d4b", "#e86a2e"];
57
+ const EDGE_COLORS = ["#1f9d5f", "#d9455e", "#7c3aed", "#e86a2e", "#ec2315", "#ff2d4b", "#ff2d4b", "#6d28d9"];
58
58
 
59
59
  function buildTypeMap(nodes: NodeItem[], key: keyof NodeItem): Record<string, number> {
60
60
  const map: Record<string, number> = {};
@@ -198,7 +198,7 @@ export function KGOverviewTab() {
198
198
  return (
199
199
  <div className="ws-page">
200
200
  {error ? (
201
- <div style={{ margin: "16px 22px 0 22px", padding: 12, borderRadius: 14, color: "#ffb4c2", background: "rgba(255,157,175,0.1)", border: "1px solid rgba(255,157,175,0.18)" }}>
201
+ <div style={{ margin: "16px 22px 0 22px", padding: 12, borderRadius: 14, color: "#e98498", background: "rgba(255,157,175,0.1)", border: "1px solid rgba(255,157,175,0.18)" }}>
202
202
  {error}
203
203
  </div>
204
204
  ) : null}
@@ -41,7 +41,7 @@ function ConceptRow({
41
41
  paddingBottom: 5,
42
42
  borderRadius: 6,
43
43
  cursor: "pointer",
44
- color: depth === 0 ? "#f0cdd3" : "#b08b93",
44
+ color: depth === 0 ? "#602b34" : "#b08b93",
45
45
  fontSize: depth === 0 ? 13 : 12,
46
46
  transition: "background 120ms ease",
47
47
  }}
@@ -97,7 +97,7 @@ function SchemePanel({
97
97
  >
98
98
  <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
99
99
  {expanded ? <ChevronDown size={14} color="#b08b93" /> : <ChevronRight size={14} color="#b08b93" />}
100
- <span style={{ color: "#ffeaed", fontSize: 14, fontWeight: 700 }}>{scheme.label}</span>
100
+ <span style={{ color: "#2d1619", fontSize: 14, fontWeight: 700 }}>{scheme.label}</span>
101
101
  </div>
102
102
  <span style={{ color: "#9c7a82", fontSize: 11 }}>
103
103
  {isLoading ? "…" : `${totalConcepts} concept${totalConcepts !== 1 ? "s" : ""}`}
@@ -137,9 +137,9 @@ export function OntologySummaryTab({
137
137
  {/* Header */}
138
138
  <div style={headerStyle}>
139
139
  <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
140
- <BookOpen size={18} color="#d2a8ff" />
140
+ <BookOpen size={18} color="#7c3aed" />
141
141
  <div>
142
- <div style={{ color: "#fff0f2", fontSize: 16, fontWeight: 700 }}>Ontology Summary</div>
142
+ <div style={{ color: "#2d1619", fontSize: 16, fontWeight: 700 }}>Ontology Summary</div>
143
143
  <div style={{ color: "#b08b93", fontSize: 12 }}>
144
144
  {isLoading
145
145
  ? "Loading schemes…"
@@ -161,7 +161,7 @@ export function OntologySummaryTab({
161
161
  {isLoading ? (
162
162
  <div style={{ padding: 24, display: "flex", flexDirection: "column", gap: 10 }}>
163
163
  {[90, 75, 60].map((w, i) => (
164
- <div key={i} style={{ height: 36, borderRadius: 8, background: "rgba(255,255,255,0.04)", width: `${w}%` }} />
164
+ <div key={i} style={{ height: 36, borderRadius: 8, background: "rgba(28, 20, 24,0.04)", width: `${w}%` }} />
165
165
  ))}
166
166
  </div>
167
167
  ) : schemes.length === 0 ? (
@@ -185,13 +185,13 @@ export function OntologySummaryTab({
185
185
  {selectedConcept ? (
186
186
  <div style={detailPanelStyle}>
187
187
  <div style={{ display: "flex", justifyContent: "space-between", alignItems: "flex-start", marginBottom: 16 }}>
188
- <div style={{ color: "#d2a8ff", fontSize: 11, fontWeight: 700, letterSpacing: "0.06em", textTransform: "uppercase" }}>
188
+ <div style={{ color: "#7c3aed", fontSize: 11, fontWeight: 700, letterSpacing: "0.06em", textTransform: "uppercase" }}>
189
189
  Concept Detail
190
190
  </div>
191
191
  <button onClick={() => setSelectedConcept(null)} style={{ background: "transparent", border: "none", color: "#b08b93", cursor: "pointer", fontSize: 16 }}>×</button>
192
192
  </div>
193
193
 
194
- <h3 style={{ color: "#ffffff", fontSize: 18, fontWeight: 800, letterSpacing: "-0.03em", margin: "0 0 6px 0" }}>
194
+ <h3 style={{ color: "#16181d", fontSize: 18, fontWeight: 800, letterSpacing: "-0.03em", margin: "0 0 6px 0" }}>
195
195
  {selectedConcept.pref_label}
196
196
  </h3>
197
197
  {selectedConcept.notation ? (
@@ -204,7 +204,7 @@ export function OntologySummaryTab({
204
204
  {selectedConcept.description ? (
205
205
  <div style={detailSectionStyle}>
206
206
  <div style={detailLabelStyle}>Description</div>
207
- <div style={{ color: "#f0cdd3", fontSize: 13, lineHeight: 1.6 }}>{selectedConcept.description}</div>
207
+ <div style={{ color: "#602b34", fontSize: 13, lineHeight: 1.6 }}>{selectedConcept.description}</div>
208
208
  </div>
209
209
  ) : null}
210
210
 
@@ -227,7 +227,7 @@ export function OntologySummaryTab({
227
227
  <div
228
228
  key={child.uri}
229
229
  onClick={() => setSelectedConcept(child)}
230
- style={{ color: "#ff8fa0", fontSize: 12, cursor: "pointer", padding: "3px 0" }}
230
+ style={{ color: "#d9455e", fontSize: 12, cursor: "pointer", padding: "3px 0" }}
231
231
  >
232
232
  → {child.pref_label}
233
233
  </div>
@@ -252,7 +252,7 @@ const shellStyle: React.CSSProperties = {
252
252
  flexDirection: "column",
253
253
  width: "100%",
254
254
  height: "100%",
255
- background: "#0a0508",
255
+ background: "#fdfcfc",
256
256
  overflow: "hidden",
257
257
  };
258
258
 
@@ -273,7 +273,7 @@ const openBrowserBtnStyle: React.CSSProperties = {
273
273
  borderRadius: 8,
274
274
  border: "1px solid rgba(210,168,255,0.22)",
275
275
  background: "rgba(210,168,255,0.08)",
276
- color: "#d2a8ff",
276
+ color: "#7c3aed",
277
277
  fontSize: 12,
278
278
  fontWeight: 600,
279
279
  cursor: "pointer",
@@ -282,13 +282,13 @@ const openBrowserBtnStyle: React.CSSProperties = {
282
282
  const treeColumnStyle: React.CSSProperties = {
283
283
  flex: 1,
284
284
  overflowY: "auto",
285
- borderRight: "1px solid rgba(255,255,255,0.06)",
285
+ borderRight: "1px solid rgba(28, 20, 24,0.06)",
286
286
  };
287
287
 
288
288
  const schemeCardStyle: React.CSSProperties = {
289
289
  borderRadius: 10,
290
290
  border: "1px solid rgba(210,168,255,0.1)",
291
- background: "rgba(255,255,255,0.02)",
291
+ background: "rgba(28, 20, 24,0.02)",
292
292
  overflow: "hidden",
293
293
  };
294
294
 
@@ -301,21 +301,21 @@ const schemeHeaderStyle: React.CSSProperties = {
301
301
  background: "transparent",
302
302
  border: "none",
303
303
  cursor: "pointer",
304
- borderBottom: "1px solid rgba(255,255,255,0.05)",
304
+ borderBottom: "1px solid rgba(28, 20, 24,0.05)",
305
305
  };
306
306
 
307
307
  const detailPanelStyle: React.CSSProperties = {
308
308
  width: 300,
309
309
  padding: "20px",
310
310
  overflowY: "auto",
311
- borderLeft: "1px solid rgba(255,255,255,0.06)",
311
+ borderLeft: "1px solid rgba(28, 20, 24,0.06)",
312
312
  flexShrink: 0,
313
313
  };
314
314
 
315
315
  const detailSectionStyle: React.CSSProperties = {
316
316
  marginTop: 14,
317
317
  paddingTop: 12,
318
- borderTop: "1px solid rgba(255,255,255,0.06)",
318
+ borderTop: "1px solid rgba(28, 20, 24,0.06)",
319
319
  };
320
320
 
321
321
  const detailLabelStyle: React.CSSProperties = {
@@ -330,9 +330,9 @@ const detailLabelStyle: React.CSSProperties = {
330
330
  const altLabelChipStyle: React.CSSProperties = {
331
331
  padding: "3px 8px",
332
332
  borderRadius: 999,
333
- background: "rgba(255,255,255,0.05)",
334
- border: "1px solid rgba(255,255,255,0.08)",
335
- color: "#c99aa3",
333
+ background: "rgba(28, 20, 24,0.05)",
334
+ border: "1px solid rgba(28, 20, 24,0.08)",
335
+ color: "#aa485b",
336
336
  fontSize: 11,
337
337
  };
338
338
 
@@ -345,7 +345,7 @@ const iconButtonStyle: CSSProperties = {
345
345
  height: 30,
346
346
  borderRadius: 8,
347
347
  border: `1px solid ${GRAPH_THEME.ui.surface.panelBorder}`,
348
- background: "rgba(255, 255, 255, 0.04)",
348
+ background: "rgba(28, 20, 24, 0.04)",
349
349
  color: GRAPH_THEME.ui.text.body,
350
350
  cursor: "pointer",
351
351
  };
@@ -459,6 +459,6 @@ const alertStyle: CSSProperties = {
459
459
  borderRadius: 8,
460
460
  border: "1px solid rgba(248, 81, 73, 0.28)",
461
461
  background: "rgba(248, 81, 73, 0.1)",
462
- color: "#ffb4ad",
462
+ color: "#552925",
463
463
  fontSize: 12,
464
464
  };
@@ -21,13 +21,13 @@ const RELATIONS: AlignmentRelation[] = [
21
21
  ];
22
22
 
23
23
  const RELATION_COLORS: Record<AlignmentRelation, string> = {
24
- "owl:equivalentClass": "#7ce7d3",
25
- "owl:equivalentProperty": "#7ce7d3",
26
- "skos:exactMatch": "#9ee8d7",
24
+ "owl:equivalentClass": "#0e8571",
25
+ "owl:equivalentProperty": "#0e8571",
26
+ "skos:exactMatch": "#0e7f66",
27
27
  "skos:closeMatch": "#ff2d4b",
28
- "skos:broadMatch": "#ff7a45",
29
- "skos:narrowMatch": "#ff7a45",
30
- "skos:relatedMatch": "#d2a8ff",
28
+ "skos:broadMatch": "#e86a2e",
29
+ "skos:narrowMatch": "#e86a2e",
30
+ "skos:relatedMatch": "#7c3aed",
31
31
  };
32
32
 
33
33
  export function AlignmentsTab() {
@@ -242,7 +242,7 @@ export function AlignmentsTab() {
242
242
  const cellItems = matrix.cells.get(key) ?? [];
243
243
  const isDiag = row.uri === col.uri;
244
244
  return (
245
- <td key={col.uri} style={{ ...matrixCellStyle, background: isDiag ? "rgba(255,255,255,0.015)" : undefined }}>
245
+ <td key={col.uri} style={{ ...matrixCellStyle, background: isDiag ? "rgba(28, 20, 24,0.015)" : undefined }}>
246
246
  {isDiag ? <span style={mutedStyle}>—</span> : cellItems.length ? (
247
247
  <div style={{ display: "flex", flexDirection: "column", gap: 4 }}>
248
248
  {cellItems.map((item) => (
@@ -355,10 +355,10 @@ export function AlignmentsTab() {
355
355
  <div style={suggestionListStyle}>
356
356
  {suggestions.map((item) => (
357
357
  <button key={`${item.source_uri}-${item.target_uri}-${item.relation}`} style={suggestionStyle} onClick={() => handleAcceptSuggestion(item)}>
358
- <span style={{ color: "#fff0f2", fontWeight: 800 }}>{item.source_label}</span>
358
+ <span style={{ color: "#2d1619", fontWeight: 800 }}>{item.source_label}</span>
359
359
  <span style={{ color: RELATION_COLORS[item.relation] }}>{item.relation}</span>
360
- <span style={{ color: "#fff0f2", fontWeight: 800 }}>{item.target_label}</span>
361
- <span style={{ color: "#c99aa3" }}>{Math.round(item.score * 100)}%</span>
360
+ <span style={{ color: "#2d1619", fontWeight: 800 }}>{item.target_label}</span>
361
+ <span style={{ color: "#aa485b" }}>{Math.round(item.score * 100)}%</span>
362
362
  </button>
363
363
  ))}
364
364
  {!suggestions.length ? <p style={mutedStyle}>Run suggestions to review ranked candidate mappings.</p> : null}
@@ -372,14 +372,14 @@ export function AlignmentsTab() {
372
372
  {alignments.map((item) => (
373
373
  <div key={item.id} style={rowStyle}>
374
374
  <div>
375
- <div style={{ color: "#fff0f2", fontWeight: 800 }}>{item.source_label || item.source_uri}</div>
375
+ <div style={{ color: "#2d1619", fontWeight: 800 }}>{item.source_label || item.source_uri}</div>
376
376
  <div style={monoStyle}>{item.source_uri}</div>
377
377
  </div>
378
378
  <div style={{ ...relationBadgeStyle, color: RELATION_COLORS[item.relation], borderColor: `${RELATION_COLORS[item.relation]}55` }}>
379
379
  {item.relation}
380
380
  </div>
381
381
  <div>
382
- <div style={{ color: "#fff0f2", fontWeight: 800 }}>{item.target_label || item.target_uri}</div>
382
+ <div style={{ color: "#2d1619", fontWeight: 800 }}>{item.target_label || item.target_uri}</div>
383
383
  <div style={monoStyle}>{item.target_uri}</div>
384
384
  </div>
385
385
  <div style={confidenceStyle}>{Math.round(item.confidence * 100)}%</div>
@@ -398,40 +398,40 @@ export function AlignmentsTab() {
398
398
  function Metric({ label, value }: { label: string; value: number }) {
399
399
  return (
400
400
  <div style={metricStyle}>
401
- <span style={{ color: "#9ee8d7", fontSize: 20, fontWeight: 900 }}>{value.toLocaleString()}</span>
401
+ <span style={{ color: "#0e7f66", fontSize: 20, fontWeight: 900 }}>{value.toLocaleString()}</span>
402
402
  <span style={{ color: "#9c7a82", fontSize: 11 }}>{label}</span>
403
403
  </div>
404
404
  );
405
405
  }
406
406
 
407
407
  const pageStyle: CSSProperties = { height: "100%", overflow: "auto", padding: 22, display: "flex", flexDirection: "column", gap: 16 };
408
- const heroStyle: CSSProperties = { display: "flex", justifyContent: "space-between", gap: 18, padding: 22, border: "1px solid rgba(255,107,129,0.12)", borderRadius: 22, background: "linear-gradient(135deg, rgba(11,25,42,0.94), rgba(7,14,25,0.9))" };
409
- const kickerStyle: CSSProperties = { display: "inline-flex", gap: 8, alignItems: "center", color: "#9ee8d7", fontSize: 11, fontWeight: 900, letterSpacing: "0.12em", textTransform: "uppercase" };
410
- const titleStyle: CSSProperties = { margin: "8px 0", color: "#fff0f2", fontSize: 26, letterSpacing: "-0.04em" };
411
- const textStyle: CSSProperties = { margin: 0, color: "#c99aa3", lineHeight: 1.6, maxWidth: 620 };
408
+ const heroStyle: CSSProperties = { display: "flex", justifyContent: "space-between", gap: 18, padding: 22, border: "1px solid rgba(255,107,129,0.12)", borderRadius: 22, background: "linear-gradient(135deg, rgba(255, 255, 255,0.94), rgba(255, 255, 255,0.9))" };
409
+ const kickerStyle: CSSProperties = { display: "inline-flex", gap: 8, alignItems: "center", color: "#0e7f66", fontSize: 11, fontWeight: 900, letterSpacing: "0.12em", textTransform: "uppercase" };
410
+ const titleStyle: CSSProperties = { margin: "8px 0", color: "#2d1619", fontSize: 26, letterSpacing: "-0.04em" };
411
+ const textStyle: CSSProperties = { margin: 0, color: "#aa485b", lineHeight: 1.6, maxWidth: 620 };
412
412
  const summaryGridStyle: CSSProperties = { display: "grid", gridTemplateColumns: "repeat(3, minmax(100px, 1fr))", gap: 10, minWidth: 320 };
413
- const metricStyle: CSSProperties = { padding: 14, borderRadius: 16, background: "rgba(255,255,255,0.035)", border: "1px solid rgba(255,107,129,0.1)", display: "flex", flexDirection: "column", gap: 4 };
413
+ const metricStyle: CSSProperties = { padding: 14, borderRadius: 16, background: "rgba(28, 20, 24,0.035)", border: "1px solid rgba(255,107,129,0.1)", display: "flex", flexDirection: "column", gap: 4 };
414
414
  const gridStyle: CSSProperties = { display: "grid", gridTemplateColumns: "minmax(320px, 0.9fr) minmax(360px, 1.1fr)", gap: 16 };
415
- const cardStyle: CSSProperties = { padding: 18, border: "1px solid rgba(255,107,129,0.12)", borderRadius: 20, background: "rgba(12,6,9,0.78)", boxShadow: "inset 0 1px 0 rgba(255,255,255,0.04)" };
416
- const sectionTitleStyle: CSSProperties = { margin: "0 0 14px", color: "#fff0f2", fontSize: 16 };
415
+ const cardStyle: CSSProperties = { padding: 18, border: "1px solid rgba(255,107,129,0.12)", borderRadius: 20, background: "rgba(255, 255, 255,0.78)", boxShadow: "inset 0 1px 0 rgba(28, 20, 24,0.04)" };
416
+ const sectionTitleStyle: CSSProperties = { margin: "0 0 14px", color: "#2d1619", fontSize: 16 };
417
417
  const labelStyle: CSSProperties = { display: "block", color: "#9c7a82", fontSize: 11, fontWeight: 800, margin: "10px 0 6px", textTransform: "uppercase", letterSpacing: "0.08em" };
418
- const inputStyle: CSSProperties = { width: "100%", boxSizing: "border-box", border: "1px solid rgba(255,107,129,0.14)", borderRadius: 12, padding: "10px 12px", background: "rgba(6,3,5,0.8)", color: "#fff0f2" };
418
+ const inputStyle: CSSProperties = { width: "100%", boxSizing: "border-box", border: "1px solid rgba(255,107,129,0.14)", borderRadius: 12, padding: "10px 12px", background: "rgba(255, 255, 255,0.8)", color: "#2d1619" };
419
419
  const twoColStyle: CSSProperties = { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 12 };
420
- const primaryButtonStyle: CSSProperties = { marginTop: 14, width: "100%", border: "1px solid rgba(124,231,211,0.35)", borderRadius: 12, padding: "11px 13px", background: "linear-gradient(135deg, rgba(20,151,136,0.55), rgba(255,45,75,0.35))", color: "#fff0f2", fontWeight: 900, cursor: "pointer", display: "inline-flex", alignItems: "center", justifyContent: "center", gap: 8 };
420
+ const primaryButtonStyle: CSSProperties = { marginTop: 14, width: "100%", border: "1px solid rgba(124,231,211,0.35)", borderRadius: 12, padding: "11px 13px", background: "linear-gradient(135deg, rgba(20,151,136,0.55), rgba(255,45,75,0.35))", color: "#2d1619", fontWeight: 900, cursor: "pointer", display: "inline-flex", alignItems: "center", justifyContent: "center", gap: 8 };
421
421
  const secondaryButtonStyle: CSSProperties = { ...primaryButtonStyle, background: "rgba(255,107,129,0.08)", borderColor: "rgba(255,107,129,0.18)" };
422
422
  const suggestionListStyle: CSSProperties = { display: "flex", flexDirection: "column", gap: 8, marginTop: 14, maxHeight: 260, overflow: "auto" };
423
- const suggestionStyle: CSSProperties = { display: "grid", gridTemplateColumns: "1fr auto 1fr auto", gap: 10, alignItems: "center", textAlign: "left", border: "1px solid rgba(255,107,129,0.1)", borderRadius: 12, background: "rgba(255,255,255,0.03)", padding: 10, cursor: "pointer" };
423
+ const suggestionStyle: CSSProperties = { display: "grid", gridTemplateColumns: "1fr auto 1fr auto", gap: 10, alignItems: "center", textAlign: "left", border: "1px solid rgba(255,107,129,0.1)", borderRadius: 12, background: "rgba(28, 20, 24,0.03)", padding: 10, cursor: "pointer" };
424
424
  const tableStyle: CSSProperties = { display: "flex", flexDirection: "column", gap: 8 };
425
- const rowStyle: CSSProperties = { display: "grid", gridTemplateColumns: "1fr auto 1fr auto auto", gap: 12, alignItems: "center", padding: 12, borderRadius: 14, background: "rgba(255,255,255,0.03)", border: "1px solid rgba(255,107,129,0.08)" };
425
+ const rowStyle: CSSProperties = { display: "grid", gridTemplateColumns: "1fr auto 1fr auto auto", gap: 12, alignItems: "center", padding: 12, borderRadius: 14, background: "rgba(28, 20, 24,0.03)", border: "1px solid rgba(255,107,129,0.08)" };
426
426
  const monoStyle: CSSProperties = { color: "#9c7a82", fontSize: 11, fontFamily: "JetBrains Mono, monospace", wordBreak: "break-all" };
427
427
  const relationBadgeStyle: CSSProperties = { padding: "5px 9px", border: "1px solid", borderRadius: 999, fontSize: 10, fontWeight: 900 };
428
- const confidenceStyle: CSSProperties = { color: "#ff7a45", fontWeight: 900 };
429
- const iconButtonStyle: CSSProperties = { width: 34, height: 34, borderRadius: 10, border: "1px solid rgba(255,157,175,0.18)", background: "rgba(255,157,175,0.08)", color: "#ff9daf", cursor: "pointer" };
428
+ const confidenceStyle: CSSProperties = { color: "#e86a2e", fontWeight: 900 };
429
+ const iconButtonStyle: CSSProperties = { width: 34, height: 34, borderRadius: 10, border: "1px solid rgba(255,157,175,0.18)", background: "rgba(255,157,175,0.08)", color: "#e0556d", cursor: "pointer" };
430
430
  const mutedStyle: CSSProperties = { margin: 0, color: "#9c7a82", fontSize: 13 };
431
- const errorStyle: CSSProperties = { padding: 12, borderRadius: 14, color: "#ffb4c2", background: "rgba(255,157,175,0.1)", border: "1px solid rgba(255,157,175,0.18)" };
432
- const ephemeralBannerStyle: CSSProperties = { padding: "9px 14px", borderRadius: 12, color: "#ff7a45", background: "rgba(242,182,109,0.08)", border: "1px solid rgba(242,182,109,0.22)", fontSize: 12 };
431
+ const errorStyle: CSSProperties = { padding: 12, borderRadius: 14, color: "#e98498", background: "rgba(255,157,175,0.1)", border: "1px solid rgba(255,157,175,0.18)" };
432
+ const ephemeralBannerStyle: CSSProperties = { padding: "9px 14px", borderRadius: 12, color: "#e86a2e", background: "rgba(242,182,109,0.08)", border: "1px solid rgba(242,182,109,0.22)", fontSize: 12 };
433
433
  const matrixTableStyle: CSSProperties = { borderCollapse: "collapse", minWidth: "100%", fontSize: 12 };
434
434
  const matrixCornerStyle: CSSProperties = { padding: "8px 12px", borderBottom: "1px solid rgba(255,107,129,0.1)" };
435
- const matrixColHeaderStyle: CSSProperties = { padding: "8px 12px", color: "#9ee8d7", fontWeight: 900, borderBottom: "1px solid rgba(255,107,129,0.1)", textAlign: "center", whiteSpace: "nowrap" };
436
- const matrixRowHeaderStyle: CSSProperties = { padding: "8px 12px", color: "#9ee8d7", fontWeight: 900, borderRight: "1px solid rgba(255,107,129,0.1)", whiteSpace: "nowrap" };
435
+ const matrixColHeaderStyle: CSSProperties = { padding: "8px 12px", color: "#0e7f66", fontWeight: 900, borderBottom: "1px solid rgba(255,107,129,0.1)", textAlign: "center", whiteSpace: "nowrap" };
436
+ const matrixRowHeaderStyle: CSSProperties = { padding: "8px 12px", color: "#0e7f66", fontWeight: 900, borderRight: "1px solid rgba(255,107,129,0.1)", whiteSpace: "nowrap" };
437
437
  const matrixCellStyle: CSSProperties = { padding: "8px 10px", borderBottom: "1px solid rgba(255,107,129,0.06)", borderRight: "1px solid rgba(255,107,129,0.06)", textAlign: "center", verticalAlign: "middle", minWidth: 100 };