@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.
- package/README.md +307 -1567
- package/explorer/src/App.tsx +83 -83
- package/explorer/src/index.css +3 -3
- package/explorer/src/ui/primitives.css +25 -25
- package/explorer/src/workspaces/DecisionWorkspace/DecisionWorkspace.tsx +7 -7
- package/explorer/src/workspaces/DiffMergeWorkspace/DiffMergeWorkspace.tsx +4 -4
- package/explorer/src/workspaces/EnrichWorkspace/EntityResolutionTab.tsx +24 -24
- package/explorer/src/workspaces/EnrichWorkspace/RegistryTab.tsx +22 -22
- package/explorer/src/workspaces/GraphWorkspace/GraphCanvas.tsx +1 -1
- package/explorer/src/workspaces/GraphWorkspace/GraphInspectorPanel.tsx +18 -18
- package/explorer/src/workspaces/GraphWorkspace/GraphLoadingOverlay.tsx +25 -25
- package/explorer/src/workspaces/GraphWorkspace/GraphWorkspace.tsx +28 -28
- package/explorer/src/workspaces/GraphWorkspace/MarkdownContentViewer.tsx +15 -15
- package/explorer/src/workspaces/GraphWorkspace/graphAnalytics.ts +1 -1
- package/explorer/src/workspaces/GraphWorkspace/graphConfig.ts +15 -15
- package/explorer/src/workspaces/GraphWorkspace/graphSceneLayers.ts +8 -8
- package/explorer/src/workspaces/GraphWorkspace/graphSceneState.ts +11 -11
- package/explorer/src/workspaces/GraphWorkspace/graphTheme.ts +66 -66
- package/explorer/src/workspaces/GraphWorkspace/plugins/explorationEffectsPlugin.tsx +17 -17
- package/explorer/src/workspaces/GraphWorkspace/plugins/explorationEffectsPluginPhaseC.tsx +22 -22
- package/explorer/src/workspaces/GraphWorkspace/plugins/legendPlugin.tsx +7 -7
- package/explorer/src/workspaces/GraphWorkspace/plugins/neighborhoodPanelPlugin.tsx +10 -10
- package/explorer/src/workspaces/GraphWorkspace/plugins/temporalOverlayPlugin.tsx +9 -9
- package/explorer/src/workspaces/ImportExportWorkspace/ImportExportWorkspace.tsx +4 -4
- package/explorer/src/workspaces/LineageWorkspace/LineageDiagram.tsx +8 -8
- package/explorer/src/workspaces/ManageWorkspace/KGOverviewTab.tsx +5 -5
- package/explorer/src/workspaces/ManageWorkspace/OntologySummaryTab.tsx +19 -19
- package/explorer/src/workspaces/MemoryWorkspace.tsx +2 -2
- package/explorer/src/workspaces/OntologyWorkspace/AlignmentsTab.tsx +30 -30
- package/explorer/src/workspaces/OntologyWorkspace/HealthTab.tsx +26 -26
- package/explorer/src/workspaces/OntologyWorkspace/OntologyEditor.tsx +32 -32
- package/explorer/src/workspaces/OntologyWorkspace/OntologyLoader.tsx +22 -22
- package/explorer/src/workspaces/OntologyWorkspace/OntologyManager.tsx +40 -40
- package/explorer/src/workspaces/OntologyWorkspace/OntologySearch.tsx +22 -22
- package/explorer/src/workspaces/OntologyWorkspace/ProposalReview.tsx +31 -31
- package/explorer/src/workspaces/OntologyWorkspace/SKOSVocabularyManager.tsx +26 -26
- package/explorer/src/workspaces/OntologyWorkspace/ShaclStudio.tsx +21 -21
- package/explorer/src/workspaces/OntologyWorkspace/VersionsTab.tsx +38 -38
- package/explorer/src/workspaces/OntologyWorkspace/ontologyEditorModel.ts +3 -3
- package/explorer/src/workspaces/ReasoningWorkspace.tsx +4 -4
- package/explorer/src/workspaces/SparqlWorkspace/SparqlWorkspace.tsx +3 -3
- package/explorer/src/workspaces/VocabularyWorkspace/ConceptTree.tsx +3 -3
- package/explorer/src/workspaces/VocabularyWorkspace/ImportDropzone.tsx +4 -4
- package/explorer/src/workspaces/VocabularyWorkspace/PropertyPanel.tsx +8 -8
- package/explorer/src/workspaces/VocabularyWorkspace/Sidebar.tsx +4 -4
- package/explorer/src/workspaces/VocabularyWorkspace/VocabularyWorkspace.tsx +3 -3
- 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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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: #
|
|
168
|
+
color: #481f26;
|
|
169
169
|
font-size: 12px;
|
|
170
170
|
font-weight: 700;
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
.sem-chip--warm {
|
|
174
|
-
color: #
|
|
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: #
|
|
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(
|
|
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(
|
|
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(
|
|
236
|
-
box-shadow: inset 0 1px 0 rgba(
|
|
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: #
|
|
242
|
-
border: 1px solid rgba(
|
|
243
|
-
background: rgba(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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: "#
|
|
9
|
-
if (o.includes("reject") || o.includes("denied") || o.includes("fail")) return { color: "#
|
|
10
|
-
if (o.includes("defer") || o.includes("pending") || o.includes("review")) return { color: "#
|
|
11
|
-
return { color: "var(--ws-text-muted)", bg: "rgba(
|
|
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","#
|
|
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 ? "#
|
|
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: "#
|
|
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: "#
|
|
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 ? "#
|
|
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: "#
|
|
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: "#
|
|
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 ? "#
|
|
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(
|
|
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: "#
|
|
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: "#
|
|
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: "#
|
|
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: "#
|
|
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="#
|
|
227
|
+
<ScanSearch size={18} color="#e86a2e" />
|
|
228
228
|
<div>
|
|
229
|
-
<div style={{ color: "#
|
|
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: "#
|
|
241
|
-
<span style={{ color: "#
|
|
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: "#
|
|
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: "#
|
|
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="#
|
|
313
|
+
<GitMerge size={11} color="#e86a2e" />
|
|
314
314
|
<div style={{ flex: 1, minWidth: 0 }}>
|
|
315
|
-
<div style={{ color: "#
|
|
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: "#
|
|
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(
|
|
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: "#
|
|
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(
|
|
377
|
-
border: "1px solid rgba(
|
|
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(
|
|
385
|
-
border: "1px solid rgba(
|
|
386
|
-
color: "#
|
|
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(
|
|
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(
|
|
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: "#
|
|
17
|
-
merge: { label: "MERGE", color: "#
|
|
18
|
-
"add-node": { label: "ADD NODE", color: "#
|
|
19
|
-
"update-node": { label: "UPDATE NODE", color: "#
|
|
20
|
-
"add-edge": { label: "ADD EDGE", color: "#
|
|
21
|
-
delete: { label: "DELETE", color: "#
|
|
22
|
-
infer: { label: "INFER", color: "#
|
|
23
|
-
"vocab-import": { label: "VOCAB", color: "#
|
|
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: "#
|
|
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: "#
|
|
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: "#
|
|
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="#
|
|
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(
|
|
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 ?? "#
|
|
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: "#
|
|
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(
|
|
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(
|
|
233
|
-
border: "1px solid rgba(
|
|
234
|
-
boxShadow: "inset 0 1px 0 rgba(
|
|
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
|
-
color: "#
|
|
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: "#
|
|
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: "#
|
|
2655
|
+
color: "#16181d",
|
|
2656
2656
|
border: `1px solid ${GRAPH_THEME.palette.background.shellBorder}`,
|
|
2657
2657
|
borderRadius: 10,
|
|
2658
2658
|
cursor: "pointer",
|