@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
@@ -9,7 +9,7 @@
9
9
  padding: 20px;
10
10
  background:
11
11
  radial-gradient(circle at top, rgba(255, 107, 129, 0.08), transparent 24%),
12
- linear-gradient(180deg, rgba(10, 5, 8, 0.94), rgba(3, 7, 14, 0.98));
12
+ linear-gradient(180deg, rgba(255, 255, 255, 0.94), rgba(255, 255, 255, 0.98));
13
13
  }
14
14
 
15
15
  .sem-workspace-frame > :last-child {
@@ -30,9 +30,9 @@
30
30
  border-radius: 16px;
31
31
  border: 1px solid var(--panel-border);
32
32
  background:
33
- linear-gradient(180deg, rgba(10, 5, 9, 0.88), rgba(14, 7, 11, 0.72)),
33
+ linear-gradient(180deg, rgba(255, 255, 255, 0.88), rgba(255, 255, 255, 0.72)),
34
34
  radial-gradient(circle at top right, rgba(255, 179, 109, 0.08), transparent 28%);
35
- box-shadow: var(--shadow-strong), inset 0 1px 0 rgba(255,255,255,0.04);
35
+ box-shadow: var(--shadow-strong), inset 0 1px 0 rgba(28, 20, 24,0.04);
36
36
  backdrop-filter: blur(18px);
37
37
  -webkit-backdrop-filter: blur(18px);
38
38
  }
@@ -102,15 +102,15 @@
102
102
  border-radius: 14px;
103
103
  border: 1px solid var(--panel-border);
104
104
  background:
105
- linear-gradient(180deg, rgba(11, 6, 9, 0.84), rgba(12, 6, 9, 0.72)),
105
+ linear-gradient(180deg, rgba(255, 255, 255, 0.84), rgba(255, 255, 255, 0.72)),
106
106
  radial-gradient(circle at top, rgba(255, 107, 129, 0.05), transparent 34%);
107
- box-shadow: 0 18px 44px rgba(0, 0, 0, 0.28), inset 0 1px 0 rgba(255,255,255,0.04);
107
+ box-shadow: 0 18px 44px rgba(0, 0, 0, 0.28), inset 0 1px 0 rgba(28, 20, 24,0.04);
108
108
  backdrop-filter: blur(18px);
109
109
  -webkit-backdrop-filter: blur(18px);
110
110
  }
111
111
 
112
112
  .sem-surface--subtle {
113
- background: linear-gradient(180deg, rgba(11, 6, 9, 0.7), rgba(11, 5, 8, 0.52));
113
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.52));
114
114
  }
115
115
 
116
116
  .sem-surface--accent {
@@ -165,19 +165,19 @@
165
165
  border-radius: 999px;
166
166
  border: 1px solid rgba(255, 107, 129, 0.16);
167
167
  background: rgba(255, 107, 129, 0.08);
168
- color: #ff9aab;
168
+ color: #481f26;
169
169
  font-size: 12px;
170
170
  font-weight: 700;
171
171
  }
172
172
 
173
173
  .sem-chip--warm {
174
- color: #ffce97;
174
+ color: #a04d0a;
175
175
  border-color: rgba(255, 179, 109, 0.16);
176
176
  background: rgba(255, 179, 109, 0.08);
177
177
  }
178
178
 
179
179
  .sem-chip--success {
180
- color: #8bf0bf;
180
+ color: #1c9e5c;
181
181
  border-color: rgba(80, 210, 159, 0.16);
182
182
  background: rgba(80, 210, 159, 0.08);
183
183
  }
@@ -192,7 +192,7 @@
192
192
  border-radius: 12px;
193
193
  border: 1px solid rgba(255, 138, 153, 0.12);
194
194
  background: rgba(0, 0, 0, 0.18);
195
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.03);
195
+ box-shadow: inset 0 1px 0 rgba(28, 20, 24,0.03);
196
196
  }
197
197
 
198
198
  .sem-command-group {
@@ -208,7 +208,7 @@
208
208
  padding: 4px;
209
209
  border-radius: 999px;
210
210
  border: 1px solid rgba(255, 138, 153, 0.12);
211
- background: rgba(10, 5, 8, 0.58);
211
+ background: rgba(255, 255, 255, 0.58);
212
212
  }
213
213
 
214
214
  .sem-button,
@@ -232,15 +232,15 @@
232
232
  .sem-button {
233
233
  color: white;
234
234
  border: 1px solid rgba(255, 107, 129, 0.2);
235
- background: linear-gradient(180deg, rgba(53, 130, 245, 0.3), rgba(25, 88, 185, 0.18));
236
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
235
+ background: linear-gradient(180deg, rgba(255, 45, 75, 0.3), rgba(212, 23, 54, 0.18));
236
+ box-shadow: inset 0 1px 0 rgba(28, 20, 24,0.05);
237
237
  font-weight: 700;
238
238
  }
239
239
 
240
240
  .sem-button-secondary {
241
- color: #d8e8fb;
242
- border: 1px solid rgba(255, 255, 255, 0.06);
243
- background: rgba(255, 255, 255, 0.035);
241
+ color: #16212e;
242
+ border: 1px solid rgba(28, 20, 24, 0.06);
243
+ background: rgba(28, 20, 24, 0.035);
244
244
  font-weight: 600;
245
245
  }
246
246
 
@@ -258,7 +258,7 @@
258
258
  }
259
259
 
260
260
  .sem-segmented button[data-active="true"] {
261
- background: linear-gradient(180deg, rgba(53, 130, 245, 0.34), rgba(25, 88, 185, 0.2));
261
+ background: linear-gradient(180deg, rgba(255, 45, 75, 0.34), rgba(212, 23, 54, 0.2));
262
262
  border-color: rgba(255, 138, 153, 0.2);
263
263
  }
264
264
 
@@ -271,7 +271,7 @@
271
271
  background: rgba(0, 0, 0, 0.22);
272
272
  color: var(--text-1);
273
273
  padding: 12px 14px;
274
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.03);
274
+ box-shadow: inset 0 1px 0 rgba(28, 20, 24,0.03);
275
275
  }
276
276
 
277
277
  .sem-input::placeholder,
@@ -329,7 +329,7 @@
329
329
  padding: 14px;
330
330
  border-radius: 16px;
331
331
  border: 1px solid rgba(255, 138, 153, 0.08);
332
- background: rgba(255, 255, 255, 0.025);
332
+ background: rgba(28, 20, 24, 0.025);
333
333
  color: var(--text-1);
334
334
  transition: transform 180ms ease, border-color 180ms ease, background 180ms ease;
335
335
  cursor: pointer;
@@ -343,7 +343,7 @@
343
343
 
344
344
  .sem-list-item[data-active="true"] {
345
345
  border-color: rgba(255, 138, 153, 0.22);
346
- background: linear-gradient(180deg, rgba(53, 130, 245, 0.18), rgba(25, 88, 185, 0.1));
346
+ background: linear-gradient(180deg, rgba(255, 45, 75, 0.18), rgba(212, 23, 54, 0.1));
347
347
  }
348
348
 
349
349
  .sem-table {
@@ -358,12 +358,12 @@
358
358
  font-size: 12px;
359
359
  font-weight: 700;
360
360
  padding: 10px 12px;
361
- border-bottom: 1px solid rgba(255,255,255,0.08);
361
+ border-bottom: 1px solid rgba(28, 20, 24,0.08);
362
362
  }
363
363
 
364
364
  .sem-table td {
365
365
  padding: 12px;
366
- border-bottom: 1px solid rgba(255,255,255,0.05);
366
+ border-bottom: 1px solid rgba(28, 20, 24,0.05);
367
367
  font-size: 13px;
368
368
  }
369
369
 
@@ -389,7 +389,7 @@
389
389
  linear-gradient(rgba(255, 45, 75, 0.028) 1px, transparent 1px),
390
390
  linear-gradient(90deg, rgba(255, 45, 75, 0.028) 1px, transparent 1px),
391
391
  radial-gradient(circle at top, rgba(255, 45, 75, 0.1), transparent 24%),
392
- linear-gradient(180deg, rgba(10, 5, 8, 0.94), rgba(6, 3, 5, 0.98));
392
+ linear-gradient(180deg, rgba(255, 255, 255, 0.94), rgba(255, 255, 255, 0.98));
393
393
  background-size: 44px 44px, 44px 44px, 100% 100%, 100% 100%;
394
394
  }
395
395
  .sem-section-title {
@@ -401,10 +401,10 @@
401
401
  text-transform: uppercase;
402
402
  letter-spacing: 0.06em;
403
403
  font-size: 12px;
404
- box-shadow: 0 0 18px rgba(255, 45, 75, 0.18), inset 0 1px 0 rgba(255,255,255,0.05);
404
+ box-shadow: 0 0 18px rgba(255, 45, 75, 0.18), inset 0 1px 0 rgba(28, 20, 24,0.05);
405
405
  }
406
406
  .sem-button:hover {
407
- box-shadow: 0 0 26px rgba(255, 45, 75, 0.4), inset 0 1px 0 rgba(255,255,255,0.05);
407
+ box-shadow: 0 0 26px rgba(255, 45, 75, 0.4), inset 0 1px 0 rgba(28, 20, 24,0.05);
408
408
  }
409
409
  .sem-chip {
410
410
  border-radius: 6px;
@@ -5,10 +5,10 @@ type OutcomeKind = "approved" | "rejected" | "deferred" | "pending" | string;
5
5
 
6
6
  function outcomeColor(outcome: string) {
7
7
  const o = (outcome ?? "").toLowerCase();
8
- if (o.includes("approv") || o.includes("accept")) return { color: "#6ee7b7", bg: "var(--ws-green-soft)", border: "rgba(76,195,138,0.3)" };
9
- if (o.includes("reject") || o.includes("denied") || o.includes("fail")) return { color: "#fca5a5", bg: "var(--ws-red-soft)", border: "rgba(255,123,114,0.3)" };
10
- if (o.includes("defer") || o.includes("pending") || o.includes("review")) return { color: "#fbbf24", bg: "var(--ws-amber-soft)", border: "rgba(242,182,109,0.3)" };
11
- return { color: "var(--ws-text-muted)", bg: "rgba(255,255,255,0.04)", border: "rgba(255,255,255,0.1)" };
8
+ if (o.includes("approv") || o.includes("accept")) return { color: "#0f8f6e", bg: "var(--ws-green-soft)", border: "rgba(76,195,138,0.3)" };
9
+ if (o.includes("reject") || o.includes("denied") || o.includes("fail")) return { color: "#4e2121", bg: "var(--ws-red-soft)", border: "rgba(255,123,114,0.3)" };
10
+ if (o.includes("defer") || o.includes("pending") || o.includes("review")) return { color: "#b45309", bg: "var(--ws-amber-soft)", border: "rgba(242,182,109,0.3)" };
11
+ return { color: "var(--ws-text-muted)", bg: "rgba(28, 20, 24,0.04)", border: "rgba(28, 20, 24,0.1)" };
12
12
  }
13
13
 
14
14
  function OutcomeBadge({ outcome }: { outcome: OutcomeKind }) {
@@ -28,7 +28,7 @@ interface ChainStep {
28
28
  [key: string]: unknown;
29
29
  }
30
30
 
31
- const NODE_ACCENTS = ["#ff2d4b","#4cc38a","#ff7a45","#c084fc","#ff7b72","#38bdf8","#a78bfa"];
31
+ const NODE_ACCENTS = ["#ff2d4b","#1f9d5f","#e86a2e","#8b5cf6","#ec2315","#0284c7","#7c3aed"];
32
32
 
33
33
  function ChainNode({ step, index }: { step: ChainStep; index: number }) {
34
34
  const accent = NODE_ACCENTS[index % NODE_ACCENTS.length];
@@ -211,7 +211,7 @@ export function DecisionWorkspace() {
211
211
  className={`ws-list-item${active ? " ws-list-item--active" : ""}`}
212
212
  onClick={() => void loadChain(d)}
213
213
  >
214
- <div style={{ fontWeight: 700, fontSize: 12, marginBottom: 5, color: active ? "#ffeef1" : "var(--ws-text)" }}>
214
+ <div style={{ fontWeight: 700, fontSize: 12, marginBottom: 5, color: active ? "#2d161a" : "var(--ws-text)" }}>
215
215
  {d.decision_id}
216
216
  </div>
217
217
  <div style={{ display: "flex", alignItems: "center", gap: 5, flexWrap: "wrap" }}>
@@ -231,7 +231,7 @@ export function DecisionWorkspace() {
231
231
  <div style={{ position: "absolute", inset: 0, background: "radial-gradient(ellipse 60% 40% at 70% 20%, rgba(255,45,75,0.04), transparent 55%)", pointerEvents: "none" }} />
232
232
 
233
233
  {error ? (
234
- <div style={{ padding: 12, borderRadius: 14, color: "#ffb4c2", background: "rgba(255,157,175,0.1)", border: "1px solid rgba(255,157,175,0.18)", margin: "16px 16px 0 16px", zIndex: 2, position: "relative" }}>
234
+ <div style={{ padding: 12, borderRadius: 14, color: "#e98498", background: "rgba(255,157,175,0.1)", border: "1px solid rgba(255,157,175,0.18)", margin: "16px 16px 0 16px", zIndex: 2, position: "relative" }}>
235
235
  {error}
236
236
  </div>
237
237
  ) : null}
@@ -80,13 +80,13 @@ export function DiffMergeWorkspace() {
80
80
  <div style={{ display: "grid", gridTemplateColumns: "140px 1fr 1fr", background: "rgba(0,0,0,0.28)", borderBottom: "1px solid var(--ws-border)" }}>
81
81
  <div style={{ padding: "10px 16px", fontSize: 11, fontWeight: 700, color: "var(--ws-text-dim)", letterSpacing: "0.08em", textTransform: "uppercase" }}>Field</div>
82
82
  <div style={{ padding: "10px 16px", fontSize: 11, fontWeight: 700, color: "var(--ws-accent)", letterSpacing: "0.08em", textTransform: "uppercase", borderLeft: "1px solid var(--ws-border)" }}>Primary (keep)</div>
83
- <div style={{ padding: "10px 16px", fontSize: 11, fontWeight: 700, color: "#fca5a5", letterSpacing: "0.08em", textTransform: "uppercase", borderLeft: "1px solid var(--ws-border)" }}>Duplicate (remove)</div>
83
+ <div style={{ padding: "10px 16px", fontSize: 11, fontWeight: 700, color: "#4e2121", letterSpacing: "0.08em", textTransform: "uppercase", borderLeft: "1px solid var(--ws-border)" }}>Duplicate (remove)</div>
84
84
  </div>
85
85
  {MOCK_FIELDS.map((row) => (
86
86
  <div key={row.label} style={{ display: "grid", gridTemplateColumns: "140px 1fr 1fr", borderBottom: "1px solid rgba(255,45,75,0.06)", background: row.differs ? "rgba(242,182,109,0.03)" : "transparent" }}>
87
87
  <div style={{ padding: "12px 16px", fontSize: 12, fontWeight: 600, color: "var(--ws-text-dim)" }}>{row.label}</div>
88
88
  <div style={{ padding: "12px 16px", fontSize: 13, color: "var(--ws-text)", borderLeft: "1px solid var(--ws-border)" }}>{row.primary}</div>
89
- <div style={{ padding: "12px 16px", fontSize: 13, color: row.differs ? "#fbbf24" : "var(--ws-text)", fontWeight: row.differs ? 700 : 400, borderLeft: "1px solid var(--ws-border)" }}>
89
+ <div style={{ padding: "12px 16px", fontSize: 13, color: row.differs ? "#b45309" : "var(--ws-text)", fontWeight: row.differs ? 700 : 400, borderLeft: "1px solid var(--ws-border)" }}>
90
90
  {row.duplicate}
91
91
  {row.differs && <span className="ws-pill ws-pill--amber" style={{ marginLeft: 8, fontSize: 9 }}>diff</span>}
92
92
  </div>
@@ -97,12 +97,12 @@ export function DiffMergeWorkspace() {
97
97
  {/* Status & action */}
98
98
  <div style={{ display: "flex", alignItems: "center", gap: 12 }}>
99
99
  {status === "success" && (
100
- <div style={{ display: "flex", alignItems: "center", gap: 7, color: "#6ee7b7", fontSize: 13 }}>
100
+ <div style={{ display: "flex", alignItems: "center", gap: 7, color: "#0f8f6e", fontSize: 13 }}>
101
101
  <CheckCircle2 size={15} />{msg}
102
102
  </div>
103
103
  )}
104
104
  {status === "error" && (
105
- <div style={{ display: "flex", alignItems: "center", gap: 7, color: "#fca5a5", fontSize: 13 }}>
105
+ <div style={{ display: "flex", alignItems: "center", gap: 7, color: "#4e2121", fontSize: 13 }}>
106
106
  <AlertCircle size={15} />{msg}
107
107
  </div>
108
108
  )}
@@ -58,10 +58,10 @@ function parseDuplicates(raw: RawDuplicateItem[]): DedupPair[] {
58
58
 
59
59
  function ScoreBar({ score }: { score: number }) {
60
60
  const pct = Math.min(100, Math.round(score * 100));
61
- const color = score >= 0.9 ? "#ff7b72" : score >= 0.75 ? "#ff7a45" : "#4cc38a";
61
+ const color = score >= 0.9 ? "#ec2315" : score >= 0.75 ? "#e86a2e" : "#1f9d5f";
62
62
  return (
63
63
  <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
64
- <div style={{ flex: 1, height: 4, borderRadius: 999, background: "rgba(255,255,255,0.06)", overflow: "hidden" }}>
64
+ <div style={{ flex: 1, height: 4, borderRadius: 999, background: "rgba(28, 20, 24,0.06)", overflow: "hidden" }}>
65
65
  <div style={{ width: `${pct}%`, height: "100%", borderRadius: 999, background: color, transition: "width 300ms ease" }} />
66
66
  </div>
67
67
  <span style={{ fontSize: 11, fontWeight: 700, color, minWidth: 34, textAlign: "right" }}>
@@ -101,7 +101,7 @@ function PairRow({
101
101
  <div style={{ flex: 1, minWidth: 0 }}>
102
102
  <div style={{ display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" }}>
103
103
  <span style={entityChipStyle}>{pair.a.label || pair.a.id}</span>
104
- <span style={{ color: "#ff7a45", fontSize: 12, fontWeight: 700 }}>≈</span>
104
+ <span style={{ color: "#e86a2e", fontSize: 12, fontWeight: 700 }}>≈</span>
105
105
  <span style={entityChipStyle}>{pair.b.label || pair.b.id}</span>
106
106
  </div>
107
107
  <div style={{ marginTop: 8 }}>
@@ -118,7 +118,7 @@ function PairRow({
118
118
  ...actionBtnStyle,
119
119
  background: "rgba(76,195,138,0.12)",
120
120
  border: "1px solid rgba(76,195,138,0.28)",
121
- color: "#4cc38a",
121
+ color: "#1f9d5f",
122
122
  }}
123
123
  >
124
124
  {merging ? <Loader2 size={12} className="animate-spin" /> : <GitMerge size={12} />}
@@ -135,13 +135,13 @@ function PairRow({
135
135
  <div style={{ marginTop: 12, display: "grid", gridTemplateColumns: "1fr 1fr", gap: 10 }}>
136
136
  {[
137
137
  { label: "Primary (keep)", entity: pair.a, accentColor: "#ff2d4b" },
138
- { label: "Duplicate (remove)", entity: pair.b, accentColor: "#ff7b72" },
138
+ { label: "Duplicate (remove)", entity: pair.b, accentColor: "#ec2315" },
139
139
  ].map(({ label, entity, accentColor }) => (
140
140
  <div key={entity.id} style={{ ...diffCardStyle, borderColor: `${accentColor}33` }}>
141
141
  <div style={{ color: accentColor, fontSize: 10, fontWeight: 700, letterSpacing: "0.06em", textTransform: "uppercase", marginBottom: 6 }}>
142
142
  {label}
143
143
  </div>
144
- <div style={{ color: "#ffeaed", fontSize: 13, fontWeight: 600 }}>{entity.label || entity.id}</div>
144
+ <div style={{ color: "#2d1619", fontSize: 13, fontWeight: 600 }}>{entity.label || entity.id}</div>
145
145
  <div style={{ color: "#b08b93", fontSize: 11, marginTop: 3 }}>{entity.type}</div>
146
146
  <div style={{ color: "#9c7a82", fontSize: 10, marginTop: 4, fontFamily: "monospace" }}>{entity.id}</div>
147
147
  </div>
@@ -224,9 +224,9 @@ export function EntityResolutionTab() {
224
224
  {/* Header */}
225
225
  <div style={headerStyle}>
226
226
  <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
227
- <ScanSearch size={18} color="#ff7a45" />
227
+ <ScanSearch size={18} color="#e86a2e" />
228
228
  <div>
229
- <div style={{ color: "#fff0f2", fontSize: 16, fontWeight: 700 }}>Entity Resolution</div>
229
+ <div style={{ color: "#2d1619", fontSize: 16, fontWeight: 700 }}>Entity Resolution</div>
230
230
  <div style={{ color: "#b08b93", fontSize: 12 }}>Detect and merge duplicate entities in the knowledge graph</div>
231
231
  </div>
232
232
  </div>
@@ -237,8 +237,8 @@ export function EntityResolutionTab() {
237
237
  <div style={{ display: "flex", alignItems: "center", gap: 16, flexWrap: "wrap" }}>
238
238
  <div style={{ flex: 1, minWidth: 240 }}>
239
239
  <div style={{ display: "flex", justifyContent: "space-between", marginBottom: 6 }}>
240
- <label style={{ color: "#f0cdd3", fontSize: 12, fontWeight: 600 }}>Similarity Threshold</label>
241
- <span style={{ color: "#ff7a45", fontSize: 12, fontWeight: 700 }}>{threshold.toFixed(2)}</span>
240
+ <label style={{ color: "#602b34", fontSize: 12, fontWeight: 600 }}>Similarity Threshold</label>
241
+ <span style={{ color: "#e86a2e", fontSize: 12, fontWeight: 700 }}>{threshold.toFixed(2)}</span>
242
242
  </div>
243
243
  <input
244
244
  type="range"
@@ -247,7 +247,7 @@ export function EntityResolutionTab() {
247
247
  step={0.01}
248
248
  value={threshold}
249
249
  onChange={(e) => setThreshold(parseFloat(e.target.value))}
250
- style={{ width: "100%", accentColor: "#ff7a45", cursor: "pointer" }}
250
+ style={{ width: "100%", accentColor: "#e86a2e", cursor: "pointer" }}
251
251
  />
252
252
  <div style={{ display: "flex", justifyContent: "space-between", color: "#9c7a82", fontSize: 10, marginTop: 2 }}>
253
253
  <span>More results (0.50)</span>
@@ -264,7 +264,7 @@ export function EntityResolutionTab() {
264
264
  </button>
265
265
  </div>
266
266
  {scanError ? (
267
- <div style={{ color: "#ff7b72", fontSize: 12, marginTop: 8 }}>{scanError}</div>
267
+ <div style={{ color: "#ec2315", fontSize: 12, marginTop: 8 }}>{scanError}</div>
268
268
  ) : null}
269
269
  </div>
270
270
 
@@ -310,9 +310,9 @@ export function EntityResolutionTab() {
310
310
  <div style={{ display: "flex", flexDirection: "column", gap: 6 }}>
311
311
  {mergeHistory.map((entry) => (
312
312
  <div key={entry.id} style={historyRowStyle}>
313
- <GitMerge size={11} color="#ff7a45" />
313
+ <GitMerge size={11} color="#e86a2e" />
314
314
  <div style={{ flex: 1, minWidth: 0 }}>
315
- <div style={{ color: "#f0cdd3", fontSize: 11, fontWeight: 500, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
315
+ <div style={{ color: "#602b34", fontSize: 11, fontWeight: 500, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
316
316
  {entry.summary}
317
317
  </div>
318
318
  <div style={{ color: "#9c7a82", fontSize: 10 }}>
@@ -336,7 +336,7 @@ const shellStyle: React.CSSProperties = {
336
336
  flexDirection: "column",
337
337
  width: "100%",
338
338
  height: "100%",
339
- background: "#0a0508",
339
+ background: "#fdfcfc",
340
340
  overflow: "hidden",
341
341
  };
342
342
 
@@ -350,7 +350,7 @@ const controlsCardStyle: React.CSSProperties = {
350
350
  margin: "16px 24px",
351
351
  padding: "16px 20px",
352
352
  borderRadius: 14,
353
- background: "linear-gradient(135deg, rgba(13,17,23,0.75), rgba(22,27,34,0.6))",
353
+ background: "linear-gradient(135deg, rgba(255, 255, 255,0.75), rgba(255, 255, 255,0.6))",
354
354
  border: "1px solid rgba(242,182,109,0.18)",
355
355
  flexShrink: 0,
356
356
  };
@@ -363,7 +363,7 @@ const scanBtnStyle: React.CSSProperties = {
363
363
  borderRadius: 10,
364
364
  background: "linear-gradient(135deg, rgba(242,182,109,0.22), rgba(242,182,109,0.1))",
365
365
  border: "1px solid rgba(242,182,109,0.32)",
366
- color: "#ff7a45",
366
+ color: "#e86a2e",
367
367
  fontSize: 13,
368
368
  fontWeight: 700,
369
369
  cursor: "pointer",
@@ -373,17 +373,17 @@ const scanBtnStyle: React.CSSProperties = {
373
373
  const pairCardStyle: React.CSSProperties = {
374
374
  padding: "12px 14px",
375
375
  borderRadius: 12,
376
- background: "linear-gradient(135deg, rgba(13,17,23,0.6), rgba(22,27,34,0.4))",
377
- border: "1px solid rgba(255,255,255,0.07)",
376
+ background: "linear-gradient(135deg, rgba(255, 255, 255,0.6), rgba(255, 255, 255,0.4))",
377
+ border: "1px solid rgba(28, 20, 24,0.07)",
378
378
  };
379
379
 
380
380
  const entityChipStyle: React.CSSProperties = {
381
381
  display: "inline-block",
382
382
  padding: "4px 10px",
383
383
  borderRadius: 8,
384
- background: "rgba(255,255,255,0.04)",
385
- border: "1px solid rgba(255,255,255,0.08)",
386
- color: "#ffeaed",
384
+ background: "rgba(28, 20, 24,0.04)",
385
+ border: "1px solid rgba(28, 20, 24,0.08)",
386
+ color: "#2d1619",
387
387
  fontSize: 12,
388
388
  fontWeight: 600,
389
389
  };
@@ -419,7 +419,7 @@ const diffCardStyle: React.CSSProperties = {
419
419
 
420
420
  const historyPanelStyle: React.CSSProperties = {
421
421
  width: 240,
422
- borderLeft: "1px solid rgba(255,255,255,0.06)",
422
+ borderLeft: "1px solid rgba(28, 20, 24,0.06)",
423
423
  padding: "16px 16px",
424
424
  overflowY: "auto",
425
425
  flexShrink: 0,
@@ -430,7 +430,7 @@ const historyRowStyle: React.CSSProperties = {
430
430
  alignItems: "flex-start",
431
431
  gap: 7,
432
432
  padding: "8px 0",
433
- borderBottom: "1px solid rgba(255,255,255,0.04)",
433
+ borderBottom: "1px solid rgba(28, 20, 24,0.04)",
434
434
  };
435
435
 
436
436
  const emptyStateStyle: React.CSSProperties = {
@@ -13,14 +13,14 @@ const OP_META: Record<
13
13
  { label: string; color: string; bg: string; border: string }
14
14
  > = {
15
15
  import: { label: "IMPORT", color: "#ff2d4b", bg: "rgba(255,45,75,0.12)", border: "rgba(255,45,75,0.28)" },
16
- export: { label: "EXPORT", color: "#c99aa3", bg: "rgba(143,168,198,0.08)", border: "rgba(143,168,198,0.18)" },
17
- merge: { label: "MERGE", color: "#ff7a45", bg: "rgba(242,182,109,0.12)", border: "rgba(242,182,109,0.28)" },
18
- "add-node": { label: "ADD NODE", color: "#4cc38a", bg: "rgba(76,195,138,0.12)", border: "rgba(76,195,138,0.28)" },
19
- "update-node": { label: "UPDATE NODE", color: "#ff8fa0", bg: "rgba(121,192,255,0.10)", border: "rgba(121,192,255,0.24)" },
20
- "add-edge": { label: "ADD EDGE", color: "#4cc38a", bg: "rgba(76,195,138,0.10)", border: "rgba(76,195,138,0.22)" },
21
- delete: { label: "DELETE", color: "#ff7b72", bg: "rgba(255,123,114,0.12)", border: "rgba(255,123,114,0.28)" },
22
- infer: { label: "INFER", color: "#d2a8ff", bg: "rgba(210,168,255,0.12)", border: "rgba(210,168,255,0.28)" },
23
- "vocab-import": { label: "VOCAB", color: "#ff8fa0", bg: "rgba(121,192,255,0.12)", border: "rgba(121,192,255,0.28)" },
16
+ export: { label: "EXPORT", color: "#aa485b", bg: "rgba(143,168,198,0.08)", border: "rgba(143,168,198,0.18)" },
17
+ merge: { label: "MERGE", color: "#e86a2e", bg: "rgba(242,182,109,0.12)", border: "rgba(242,182,109,0.28)" },
18
+ "add-node": { label: "ADD NODE", color: "#1f9d5f", bg: "rgba(76,195,138,0.12)", border: "rgba(76,195,138,0.28)" },
19
+ "update-node": { label: "UPDATE NODE", color: "#d9455e", bg: "rgba(121,192,255,0.10)", border: "rgba(121,192,255,0.24)" },
20
+ "add-edge": { label: "ADD EDGE", color: "#1f9d5f", bg: "rgba(76,195,138,0.10)", border: "rgba(76,195,138,0.22)" },
21
+ delete: { label: "DELETE", color: "#ec2315", bg: "rgba(255,123,114,0.12)", border: "rgba(255,123,114,0.28)" },
22
+ infer: { label: "INFER", color: "#7c3aed", bg: "rgba(210,168,255,0.12)", border: "rgba(210,168,255,0.28)" },
23
+ "vocab-import": { label: "VOCAB", color: "#d9455e", bg: "rgba(121,192,255,0.12)", border: "rgba(121,192,255,0.28)" },
24
24
  };
25
25
 
26
26
  const ALL_OPS: (RegistryEntryOp | "all")[] = [
@@ -64,7 +64,7 @@ function EntryRow({ entry }: { entry: ReturnType<typeof useRegistry>[number] })
64
64
 
65
65
  {/* Content */}
66
66
  <div style={{ flex: 1, minWidth: 0 }}>
67
- <div style={{ color: "#ffeaed", fontSize: 13, fontWeight: 500, wordBreak: "break-word" }}>
67
+ <div style={{ color: "#2d1619", fontSize: 13, fontWeight: 500, wordBreak: "break-word" }}>
68
68
  {entry.summary}
69
69
  </div>
70
70
  <div style={{ color: "#b08b93", fontSize: 11, marginTop: 3 }}>
@@ -109,14 +109,14 @@ export function RegistryTab() {
109
109
  <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
110
110
  <ClipboardList size={18} color="#ff2d4b" />
111
111
  <div>
112
- <div style={{ color: "#fff0f2", fontSize: 16, fontWeight: 700 }}>Document Registry</div>
112
+ <div style={{ color: "#2d1619", fontSize: 16, fontWeight: 700 }}>Document Registry</div>
113
113
  <div style={{ color: "#b08b93", fontSize: 12 }}>
114
114
  Audit log of all KG and Ontology mutations this session
115
115
  </div>
116
116
  </div>
117
117
  </div>
118
118
  <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
119
- <span style={{ color: "#c99aa3", fontSize: 12 }}>
119
+ <span style={{ color: "#aa485b", fontSize: 12 }}>
120
120
  {entries.length} event{entries.length !== 1 ? "s" : ""}
121
121
  </span>
122
122
  {entries.length > 0 ? (
@@ -134,7 +134,7 @@ export function RegistryTab() {
134
134
 
135
135
  {/* Filter pills */}
136
136
  <div style={filterBarStyle}>
137
- <Filter size={13} color="#c99aa3" />
137
+ <Filter size={13} color="#aa485b" />
138
138
  <div style={{ display: "flex", gap: 6, flexWrap: "wrap" }}>
139
139
  {ALL_OPS.map((op) => {
140
140
  const isActive = op === activeFilter;
@@ -151,12 +151,12 @@ export function RegistryTab() {
151
151
  cursor: "pointer",
152
152
  border: isActive
153
153
  ? `1px solid ${meta?.border ?? "rgba(255,107,129,0.35)"}`
154
- : "1px solid rgba(255,255,255,0.06)",
154
+ : "1px solid rgba(28, 20, 24,0.06)",
155
155
  background: isActive
156
156
  ? (meta?.bg ?? "rgba(255,45,75,0.14)")
157
157
  : "transparent",
158
158
  color: isActive
159
- ? (meta?.color ?? "#8ed3ff")
159
+ ? (meta?.color ?? "#1b3240")
160
160
  : "#b08b93",
161
161
  transition: "all 140ms ease",
162
162
  }}
@@ -195,7 +195,7 @@ const shellStyle: React.CSSProperties = {
195
195
  flexDirection: "column",
196
196
  width: "100%",
197
197
  height: "100%",
198
- background: "#0a0508",
198
+ background: "#fdfcfc",
199
199
  overflow: "hidden",
200
200
  };
201
201
 
@@ -213,7 +213,7 @@ const filterBarStyle: React.CSSProperties = {
213
213
  alignItems: "center",
214
214
  gap: 10,
215
215
  padding: "12px 24px",
216
- borderBottom: "1px solid rgba(255,255,255,0.05)",
216
+ borderBottom: "1px solid rgba(28, 20, 24,0.05)",
217
217
  flexShrink: 0,
218
218
  };
219
219
 
@@ -229,9 +229,9 @@ const feedStyle: React.CSSProperties = {
229
229
  const entryCardStyle: React.CSSProperties = {
230
230
  padding: "12px 14px",
231
231
  borderRadius: 12,
232
- background: "linear-gradient(135deg, rgba(13,17,23,0.6), rgba(22,27,34,0.4))",
233
- border: "1px solid rgba(255,255,255,0.06)",
234
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.03)",
232
+ background: "linear-gradient(135deg, rgba(255, 255, 255,0.6), rgba(255, 255, 255,0.4))",
233
+ border: "1px solid rgba(28, 20, 24,0.06)",
234
+ boxShadow: "inset 0 1px 0 rgba(28, 20, 24,0.03)",
235
235
  };
236
236
 
237
237
  const expandBtnStyle: React.CSSProperties = {
@@ -251,8 +251,8 @@ const detailPreStyle: React.CSSProperties = {
251
251
  padding: "10px 12px",
252
252
  borderRadius: 8,
253
253
  background: "rgba(0,0,0,0.28)",
254
- border: "1px solid rgba(255,255,255,0.06)",
255
- color: "#ff8fa0",
254
+ border: "1px solid rgba(28, 20, 24,0.06)",
255
+ color: "#d9455e",
256
256
  fontSize: 11,
257
257
  fontFamily: "'JetBrains Mono', monospace",
258
258
  overflowX: "auto",
@@ -268,7 +268,7 @@ const clearBtnStyle: React.CSSProperties = {
268
268
  borderRadius: 8,
269
269
  border: "1px solid rgba(255,123,114,0.22)",
270
270
  background: "rgba(255,123,114,0.06)",
271
- color: "#ff7b72",
271
+ color: "#ec2315",
272
272
  fontSize: 12,
273
273
  fontWeight: 600,
274
274
  cursor: "pointer",
@@ -2652,7 +2652,7 @@ export const GraphCanvas = forwardRef<GraphCanvasHandle, GraphCanvasProps>(
2652
2652
  left: 24,
2653
2653
  padding: "8px 16px",
2654
2654
  background: "linear-gradient(135deg, rgba(27, 79, 170, 0.9), rgba(53, 123, 255, 0.84))",
2655
- color: "#fff",
2655
+ color: "#16181d",
2656
2656
  border: `1px solid ${GRAPH_THEME.palette.background.shellBorder}`,
2657
2657
  borderRadius: 10,
2658
2658
  cursor: "pointer",