@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
|
@@ -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(
|
|
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: "#
|
|
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(
|
|
92
|
-
background: "rgba(
|
|
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: "#
|
|
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: "#
|
|
112
|
+
color: "#aa485b",
|
|
113
113
|
fontSize: 12,
|
|
114
114
|
};
|
|
115
115
|
|
|
116
116
|
const emptyTextStyle: CSSProperties = {
|
|
117
|
-
color: "#
|
|
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: "#
|
|
173
|
+
color: "#2d1619",
|
|
174
174
|
fontSize: 14,
|
|
175
175
|
fontWeight: 700,
|
|
176
176
|
};
|
|
177
177
|
|
|
178
178
|
const summaryStyle: CSSProperties = {
|
|
179
|
-
color: "#
|
|
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(
|
|
191
|
-
border: "1px solid rgba(
|
|
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(
|
|
199
|
-
border: "1px solid rgba(
|
|
198
|
+
background: "rgba(28, 20, 24,0.03)",
|
|
199
|
+
border: "1px solid rgba(28, 20, 24,0.08)",
|
|
200
200
|
borderRadius: 10,
|
|
201
|
-
color: "#
|
|
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: "#
|
|
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: "#
|
|
223
|
+
color: "#aa485b",
|
|
224
224
|
fontSize: 12,
|
|
225
225
|
};
|
|
226
226
|
|
|
227
227
|
const emptyTextStyle: CSSProperties = {
|
|
228
|
-
color: "#
|
|
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(
|
|
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: "#
|
|
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: "#
|
|
61
|
+
<span style={{ color: "#2f7fd6", fontWeight: 700 }}>Temporal</span>
|
|
62
62
|
<span>{label}</span>
|
|
63
63
|
{typeof temporal.activeNodeCount === "number" ? (
|
|
64
|
-
<span style={{ color: "#
|
|
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: "#
|
|
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(
|
|
130
|
-
background: "rgba(
|
|
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: "#
|
|
134
|
+
color: "#aa485b",
|
|
135
135
|
fontSize: 12,
|
|
136
136
|
};
|
|
137
137
|
|
|
138
138
|
const detailValueStyle: CSSProperties = {
|
|
139
|
-
color: "#
|
|
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="#
|
|
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: "#
|
|
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(
|
|
189
|
-
{t.type === "success" ? <CheckCircle2 size={16} color="#
|
|
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, #
|
|
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(
|
|
18
|
-
color: var(--ws-text, #
|
|
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(
|
|
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, #
|
|
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, #
|
|
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(
|
|
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: "#
|
|
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: "#
|
|
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(
|
|
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 = ["#
|
|
57
|
-
const EDGE_COLORS = ["#
|
|
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: "#
|
|
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 ? "#
|
|
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: "#
|
|
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="#
|
|
140
|
+
<BookOpen size={18} color="#7c3aed" />
|
|
141
141
|
<div>
|
|
142
|
-
<div style={{ color: "#
|
|
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(
|
|
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: "#
|
|
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: "#
|
|
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: "#
|
|
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: "#
|
|
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: "#
|
|
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: "#
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
334
|
-
border: "1px solid rgba(
|
|
335
|
-
color: "#
|
|
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(
|
|
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: "#
|
|
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": "#
|
|
25
|
-
"owl:equivalentProperty": "#
|
|
26
|
-
"skos:exactMatch": "#
|
|
24
|
+
"owl:equivalentClass": "#0e8571",
|
|
25
|
+
"owl:equivalentProperty": "#0e8571",
|
|
26
|
+
"skos:exactMatch": "#0e7f66",
|
|
27
27
|
"skos:closeMatch": "#ff2d4b",
|
|
28
|
-
"skos:broadMatch": "#
|
|
29
|
-
"skos:narrowMatch": "#
|
|
30
|
-
"skos:relatedMatch": "#
|
|
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(
|
|
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: "#
|
|
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: "#
|
|
361
|
-
<span style={{ color: "#
|
|
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: "#
|
|
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: "#
|
|
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: "#
|
|
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(
|
|
409
|
-
const kickerStyle: CSSProperties = { display: "inline-flex", gap: 8, alignItems: "center", color: "#
|
|
410
|
-
const titleStyle: CSSProperties = { margin: "8px 0", color: "#
|
|
411
|
-
const textStyle: CSSProperties = { margin: 0, color: "#
|
|
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(
|
|
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(
|
|
416
|
-
const sectionTitleStyle: CSSProperties = { margin: "0 0 14px", color: "#
|
|
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(
|
|
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: "#
|
|
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(
|
|
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(
|
|
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: "#
|
|
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: "#
|
|
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: "#
|
|
432
|
-
const ephemeralBannerStyle: CSSProperties = { padding: "9px 14px", borderRadius: 12, color: "#
|
|
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: "#
|
|
436
|
-
const matrixRowHeaderStyle: CSSProperties = { padding: "8px 12px", color: "#
|
|
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 };
|