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

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 +157 -1581
  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
@@ -37,16 +37,16 @@ interface OntologyEntry {
37
37
  type RightPanel = "none" | "search" | "skos";
38
38
 
39
39
  const STATUS_COLORS: Record<string, string> = {
40
- published: "#4cc38a",
41
- draft: "#ff7a45",
40
+ published: "#1f9d5f",
41
+ draft: "#e86a2e",
42
42
  external: "#ff2d4b",
43
43
  };
44
44
 
45
45
  const FORMAT_COLORS: Record<string, string> = {
46
- turtle: "#9ee8d7",
47
- xml: "#ff9daf",
48
- "json-ld": "#ff7a45",
49
- nt: "#d2a8ff",
46
+ turtle: "#0e7f66",
47
+ xml: "#e0556d",
48
+ "json-ld": "#e86a2e",
49
+ nt: "#7c3aed",
50
50
  unknown: "#9c7a82",
51
51
  };
52
52
 
@@ -93,7 +93,7 @@ function FormatBadge({ format }: { format: string }) {
93
93
  function Stat({ value, label }: { value: number; label: string }) {
94
94
  return (
95
95
  <div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: 1 }}>
96
- <span style={{ color: "#fff0f2", fontSize: 14, fontWeight: 800 }}>
96
+ <span style={{ color: "#2d1619", fontSize: 14, fontWeight: 800 }}>
97
97
  {value.toLocaleString()}
98
98
  </span>
99
99
  <span style={{ color: "#9c7a82", fontSize: 10 }}>{label}</span>
@@ -149,7 +149,7 @@ function RegistryRow({
149
149
  ...rowStyle,
150
150
  background: selected
151
151
  ? "rgba(255,45,75,0.1)"
152
- : "rgba(255,255,255,0.02)",
152
+ : "rgba(28, 20, 24,0.02)",
153
153
  borderColor: selected
154
154
  ? "rgba(255,107,129,0.26)"
155
155
  : "rgba(255,107,129,0.1)",
@@ -196,7 +196,7 @@ function RegistryRow({
196
196
  {busyToggle ? (
197
197
  <Loader2 size={13} style={{ animation: "spin 0.8s linear infinite" }} />
198
198
  ) : entry.enabled ? (
199
- <ToggleRight size={15} color="#4cc38a" />
199
+ <ToggleRight size={15} color="#1f9d5f" />
200
200
  ) : (
201
201
  <ToggleLeft size={15} color="#9c7a82" />
202
202
  )}
@@ -221,7 +221,7 @@ function RegistryRow({
221
221
  title="Remove from registry"
222
222
  onClick={handleRemove}
223
223
  disabled={busyRemove}
224
- style={{ ...actionBtnStyle, color: "#ff9daf" }}
224
+ style={{ ...actionBtnStyle, color: "#e0556d" }}
225
225
  >
226
226
  {busyRemove ? (
227
227
  <Loader2 size={13} style={{ animation: "spin 0.8s linear infinite" }} />
@@ -436,7 +436,7 @@ export function OntologyManager() {
436
436
  actionMsg.type === "ok"
437
437
  ? "rgba(76,195,138,0.06)"
438
438
  : "rgba(255,157,175,0.06)",
439
- color: actionMsg.type === "ok" ? "#4cc38a" : "#ff9daf",
439
+ color: actionMsg.type === "ok" ? "#1f9d5f" : "#e0556d",
440
440
  }}
441
441
  >
442
442
  {actionMsg.type === "ok" ? (
@@ -455,18 +455,18 @@ export function OntologyManager() {
455
455
  {loading ? (
456
456
  <div style={centerStyle}>
457
457
  <Loader2 size={22} color="#ff2d4b" style={{ animation: "spin 1s linear infinite" }} />
458
- <span style={{ color: "#c99aa3", fontSize: 13, marginTop: 10 }}>Loading registry…</span>
458
+ <span style={{ color: "#aa485b", fontSize: 13, marginTop: 10 }}>Loading registry…</span>
459
459
  </div>
460
460
  ) : filteredEntries.length === 0 ? (
461
461
  <div style={emptyStateStyle}>
462
462
  <BookMarked size={36} color="rgba(255,45,75,0.18)" />
463
- <div style={{ color: "#c99aa3", fontSize: 14, fontWeight: 600, marginTop: 14 }}>
463
+ <div style={{ color: "#aa485b", fontSize: 14, fontWeight: 600, marginTop: 14 }}>
464
464
  {searchQ ? "No ontologies match your search" : "No ontologies loaded yet"}
465
465
  </div>
466
466
  <div style={{ color: "#9c7a82", fontSize: 12, marginTop: 6, textAlign: "center", maxWidth: 300, lineHeight: 1.6 }}>
467
467
  {searchQ
468
468
  ? "Try a different search term or clear the filter."
469
- : <>Import from a URL, upload a file, or create a new ontology to get started. Click <strong style={{ color: "#ff6b81" }}>Load Ontology</strong> above.</>}
469
+ : <>Import from a URL, upload a file, or create a new ontology to get started. Click <strong style={{ color: "#d41736" }}>Load Ontology</strong> above.</>}
470
470
  </div>
471
471
  {!searchQ && (
472
472
  <button onClick={() => setShowLoader(true)} style={{ ...primaryToolBtnStyle, marginTop: 18 }}>
@@ -527,13 +527,13 @@ export function OntologyManager() {
527
527
  </div>
528
528
  <div style={detailBodyStyle}>
529
529
  <DetailSection label="URI">
530
- <span style={{ fontFamily: "monospace", fontSize: 11, wordBreak: "break-all", color: "#f0cdd3" }}>
530
+ <span style={{ fontFamily: "monospace", fontSize: 11, wordBreak: "break-all", color: "#602b34" }}>
531
531
  {selectedEntry.uri}
532
532
  </span>
533
533
  </DetailSection>
534
534
  {selectedEntry.description && (
535
535
  <DetailSection label="Description">
536
- <span style={{ color: "#f0cdd3", fontSize: 13, lineHeight: 1.6 }}>
536
+ <span style={{ color: "#602b34", fontSize: 13, lineHeight: 1.6 }}>
537
537
  {selectedEntry.description}
538
538
  </span>
539
539
  </DetailSection>
@@ -552,20 +552,20 @@ export function OntologyManager() {
552
552
  )}
553
553
  {selectedEntry.version && (
554
554
  <DetailSection label="Version">
555
- <span style={{ color: "#f0cdd3", fontSize: 12 }}>{selectedEntry.version}</span>
555
+ <span style={{ color: "#602b34", fontSize: 12 }}>{selectedEntry.version}</span>
556
556
  </DetailSection>
557
557
  )}
558
558
  {selectedEntry.loaded_at && (
559
559
  <DetailSection label="Loaded at">
560
- <span style={{ color: "#f0cdd3", fontSize: 12 }}>
560
+ <span style={{ color: "#602b34", fontSize: 12 }}>
561
561
  {new Date(selectedEntry.loaded_at).toLocaleString()}
562
562
  </span>
563
563
  </DetailSection>
564
564
  )}
565
565
  <div style={statRowStyle}>
566
- <StatBlock value={selectedEntry.class_count} label="Classes" color="#d2a8ff" />
567
- <StatBlock value={selectedEntry.concept_count} label="Concepts" color="#9ee8d7" />
568
- <StatBlock value={selectedEntry.property_count} label="Properties" color="#ff7a45" />
566
+ <StatBlock value={selectedEntry.class_count} label="Classes" color="#7c3aed" />
567
+ <StatBlock value={selectedEntry.concept_count} label="Concepts" color="#0e7f66" />
568
+ <StatBlock value={selectedEntry.property_count} label="Properties" color="#e86a2e" />
569
569
  </div>
570
570
  {selectedEntry.tags.length > 0 && (
571
571
  <DetailSection label="Tags">
@@ -605,7 +605,7 @@ export function OntologyManager() {
605
605
 
606
606
  function DetailSection({ label, children }: { label: string; children: React.ReactNode }) {
607
607
  return (
608
- <div style={{ borderTop: "1px solid rgba(255,255,255,0.05)", paddingTop: 10, paddingBottom: 2 }}>
608
+ <div style={{ borderTop: "1px solid rgba(28, 20, 24,0.05)", paddingTop: 10, paddingBottom: 2 }}>
609
609
  <div style={{ color: "#9c7a82", fontSize: 10, fontWeight: 700, textTransform: "uppercase" as const, letterSpacing: "0.07em", marginBottom: 4 }}>
610
610
  {label}
611
611
  </div>
@@ -616,7 +616,7 @@ function DetailSection({ label, children }: { label: string; children: React.Rea
616
616
 
617
617
  function StatBlock({ value, label, color }: { value: number; label: string; color: string }) {
618
618
  return (
619
- <div style={{ flex: 1, display: "flex", flexDirection: "column", alignItems: "center", gap: 2, padding: "10px 6px", background: "rgba(255,255,255,0.02)", borderRadius: 8, border: "1px solid rgba(255,255,255,0.05)" }}>
619
+ <div style={{ flex: 1, display: "flex", flexDirection: "column", alignItems: "center", gap: 2, padding: "10px 6px", background: "rgba(28, 20, 24,0.02)", borderRadius: 8, border: "1px solid rgba(28, 20, 24,0.05)" }}>
620
620
  <span style={{ color, fontSize: 18, fontWeight: 800 }}>{value.toLocaleString()}</span>
621
621
  <span style={{ color: "#9c7a82", fontSize: 10 }}>{label}</span>
622
622
  </div>
@@ -630,7 +630,7 @@ const shellStyle: React.CSSProperties = {
630
630
  flexDirection: "column",
631
631
  width: "100%",
632
632
  height: "100%",
633
- background: "#0a1525",
633
+ background: "#f7f7f8",
634
634
  overflow: "hidden",
635
635
  };
636
636
 
@@ -640,7 +640,7 @@ const toolbarStyle: React.CSSProperties = {
640
640
  gap: 10,
641
641
  padding: "12px 18px",
642
642
  borderBottom: "1px solid rgba(255,107,129,0.1)",
643
- background: "rgba(5,12,22,0.72)",
643
+ background: "rgba(255, 255, 255,0.72)",
644
644
  flexWrap: "wrap",
645
645
  flexShrink: 0,
646
646
  };
@@ -660,7 +660,7 @@ const searchInputStyle: React.CSSProperties = {
660
660
  background: "transparent",
661
661
  border: "none",
662
662
  outline: "none",
663
- color: "#fff0f2",
663
+ color: "#2d1619",
664
664
  fontSize: 12,
665
665
  width: "100%",
666
666
  };
@@ -677,13 +677,13 @@ const filterPillBase: React.CSSProperties = {
677
677
 
678
678
  const filterPillIdle: React.CSSProperties = {
679
679
  background: "transparent",
680
- color: "#c99aa3",
680
+ color: "#aa485b",
681
681
  borderColor: "rgba(255,107,129,0.1)",
682
682
  };
683
683
 
684
684
  const filterPillActive: React.CSSProperties = {
685
685
  background: "rgba(255,45,75,0.14)",
686
- color: "#fff0f2",
686
+ color: "#2d1619",
687
687
  borderColor: "rgba(255,107,129,0.26)",
688
688
  };
689
689
 
@@ -695,7 +695,7 @@ const toolBtnStyle: React.CSSProperties = {
695
695
  borderRadius: 8,
696
696
  border: "1px solid rgba(255,107,129,0.16)",
697
697
  background: "rgba(255,45,75,0.06)",
698
- color: "#c99aa3",
698
+ color: "#aa485b",
699
699
  fontSize: 12,
700
700
  fontWeight: 600,
701
701
  cursor: "pointer",
@@ -703,7 +703,7 @@ const toolBtnStyle: React.CSSProperties = {
703
703
 
704
704
  const toolBtnActive: React.CSSProperties = {
705
705
  background: "rgba(255,45,75,0.16)",
706
- color: "#fff0f2",
706
+ color: "#2d1619",
707
707
  borderColor: "rgba(255,107,129,0.28)",
708
708
  };
709
709
 
@@ -715,7 +715,7 @@ const primaryToolBtnStyle: React.CSSProperties = {
715
715
  borderRadius: 9,
716
716
  border: "1px solid rgba(255,45,75,0.3)",
717
717
  background: "linear-gradient(135deg, rgba(255,45,75,0.2), rgba(255,45,75,0.08))",
718
- color: "#ff6b81",
718
+ color: "#d41736",
719
719
  fontSize: 12,
720
720
  fontWeight: 700,
721
721
  cursor: "pointer",
@@ -782,7 +782,7 @@ const rowMainStyle: React.CSSProperties = {
782
782
  };
783
783
 
784
784
  const rowNameStyle: React.CSSProperties = {
785
- color: "#fff0f2",
785
+ color: "#2d1619",
786
786
  fontSize: 14,
787
787
  fontWeight: 700,
788
788
  };
@@ -825,7 +825,7 @@ const actionBtnStyle: React.CSSProperties = {
825
825
  borderRadius: 6,
826
826
  display: "grid",
827
827
  placeItems: "center",
828
- color: "#c99aa3",
828
+ color: "#aa485b",
829
829
  };
830
830
 
831
831
  const rightPanelStyle: React.CSSProperties = {
@@ -834,7 +834,7 @@ const rightPanelStyle: React.CSSProperties = {
834
834
  display: "flex",
835
835
  flexDirection: "column",
836
836
  borderLeft: "1px solid rgba(255,107,129,0.1)",
837
- background: "rgba(5,12,22,0.6)",
837
+ background: "rgba(255, 255, 255,0.6)",
838
838
  overflow: "hidden",
839
839
  };
840
840
 
@@ -848,7 +848,7 @@ const rightPanelHeaderStyle: React.CSSProperties = {
848
848
  };
849
849
 
850
850
  const rightPanelTitleStyle: React.CSSProperties = {
851
- color: "#fff0f2",
851
+ color: "#2d1619",
852
852
  fontSize: 13,
853
853
  fontWeight: 700,
854
854
  overflow: "hidden",
@@ -859,7 +859,7 @@ const rightPanelTitleStyle: React.CSSProperties = {
859
859
  const closePanelBtnStyle: React.CSSProperties = {
860
860
  background: "transparent",
861
861
  border: "none",
862
- color: "#c99aa3",
862
+ color: "#aa485b",
863
863
  cursor: "pointer",
864
864
  fontSize: 18,
865
865
  lineHeight: 1,
@@ -874,7 +874,7 @@ const browseBtnStyle: React.CSSProperties = {
874
874
  borderRadius: 7,
875
875
  border: "1px solid rgba(255,107,129,0.18)",
876
876
  background: "rgba(255,45,75,0.06)",
877
- color: "#ff6b81",
877
+ color: "#d41736",
878
878
  fontSize: 11,
879
879
  fontWeight: 600,
880
880
  cursor: "pointer",
@@ -899,9 +899,9 @@ const statRowStyle: React.CSSProperties = {
899
899
  const tagChipStyle: React.CSSProperties = {
900
900
  padding: "3px 8px",
901
901
  borderRadius: 999,
902
- background: "rgba(255,255,255,0.04)",
903
- border: "1px solid rgba(255,255,255,0.08)",
904
- color: "#c99aa3",
902
+ background: "rgba(28, 20, 24,0.04)",
903
+ border: "1px solid rgba(28, 20, 24,0.08)",
904
+ color: "#aa485b",
905
905
  fontSize: 11,
906
906
  };
907
907
 
@@ -36,11 +36,11 @@ interface EntityDetail {
36
36
  }
37
37
 
38
38
  const ENTITY_TYPE_COLORS: Record<string, string> = {
39
- class: "#d2a8ff",
40
- property: "#ff7a45",
41
- individual: "#9ee8d7",
39
+ class: "#7c3aed",
40
+ property: "#e86a2e",
41
+ individual: "#0e7f66",
42
42
  concept: "#ff2d4b",
43
- scheme: "#ff6b81",
43
+ scheme: "#d41736",
44
44
  unknown: "#9c7a82",
45
45
  };
46
46
 
@@ -110,12 +110,12 @@ function ResultRow({
110
110
  border: "1px solid",
111
111
  cursor: "pointer",
112
112
  transition: "160ms ease",
113
- background: selected ? "rgba(255,45,75,0.1)" : "rgba(255,255,255,0.02)",
113
+ background: selected ? "rgba(255,45,75,0.1)" : "rgba(28, 20, 24,0.02)",
114
114
  borderColor: selected ? "rgba(255,107,129,0.24)" : "rgba(255,107,129,0.08)",
115
115
  }}
116
116
  >
117
117
  <div style={{ display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" }}>
118
- <span style={{ color: "#fff0f2", fontSize: 13, fontWeight: 700, flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
118
+ <span style={{ color: "#2d1619", fontSize: 13, fontWeight: 700, flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
119
119
  {result.label || result.uri}
120
120
  </span>
121
121
  <TypeBadge entityType={result.entity_type} />
@@ -124,7 +124,7 @@ function ResultRow({
124
124
  {result.uri}
125
125
  </div>
126
126
  {result.definition && (
127
- <div style={{ color: "#c99aa3", fontSize: 12, lineHeight: 1.4, overflow: "hidden", display: "-webkit-box", WebkitLineClamp: 2, WebkitBoxOrient: "vertical" as const }}>
127
+ <div style={{ color: "#aa485b", fontSize: 12, lineHeight: 1.4, overflow: "hidden", display: "-webkit-box", WebkitLineClamp: 2, WebkitBoxOrient: "vertical" as const }}>
128
128
  {result.definition}
129
129
  </div>
130
130
  )}
@@ -211,8 +211,8 @@ function DetailPanel({
211
211
  <div style={detailPanelStyle}>
212
212
  <div style={detailHeaderStyle}>
213
213
  <div style={{ display: "flex", alignItems: "center", gap: 8, minWidth: 0 }}>
214
- <BookOpen size={14} color="#d2a8ff" />
215
- <span style={{ color: "#fff0f2", fontSize: 13, fontWeight: 700, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
214
+ <BookOpen size={14} color="#7c3aed" />
215
+ <span style={{ color: "#2d1619", fontSize: 13, fontWeight: 700, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
216
216
  Entity Detail
217
217
  </span>
218
218
  </div>
@@ -229,8 +229,8 @@ function DetailPanel({
229
229
 
230
230
  {error && (
231
231
  <div style={centerStyle}>
232
- <AlertCircle size={16} color="#ff9daf" />
233
- <span style={{ color: "#ff9daf", fontSize: 12, marginTop: 6 }}>{error}</span>
232
+ <AlertCircle size={16} color="#e0556d" />
233
+ <span style={{ color: "#e0556d", fontSize: 12, marginTop: 6 }}>{error}</span>
234
234
  </div>
235
235
  )}
236
236
 
@@ -238,7 +238,7 @@ function DetailPanel({
238
238
  <div style={detailBodyStyle}>
239
239
  <div style={{ marginBottom: 14 }}>
240
240
  <div style={{ display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap", marginBottom: 4 }}>
241
- <h3 style={{ margin: 0, color: "#fff0f2", fontSize: 17, fontWeight: 800, letterSpacing: "-0.03em" }}>
241
+ <h3 style={{ margin: 0, color: "#2d1619", fontSize: 17, fontWeight: 800, letterSpacing: "-0.03em" }}>
242
242
  {detail.label || detail.uri.split("/").pop()}
243
243
  </h3>
244
244
  <TypeBadge entityType={detail.entity_type} />
@@ -250,7 +250,7 @@ function DetailPanel({
250
250
 
251
251
  {detail.definition && (
252
252
  <DetailSection label="Definition">
253
- <p style={{ margin: 0, color: "#f0cdd3", fontSize: 13, lineHeight: 1.6 }}>
253
+ <p style={{ margin: 0, color: "#602b34", fontSize: 13, lineHeight: 1.6 }}>
254
254
  {detail.definition}
255
255
  </p>
256
256
  </DetailSection>
@@ -258,7 +258,7 @@ function DetailPanel({
258
258
 
259
259
  {detail.instance_count > 0 && (
260
260
  <DetailSection label="Instances">
261
- <span style={{ color: "#9ee8d7", fontSize: 14, fontWeight: 800 }}>
261
+ <span style={{ color: "#0e7f66", fontSize: 14, fontWeight: 800 }}>
262
262
  {detail.instance_count.toLocaleString()}
263
263
  </span>
264
264
  </DetailSection>
@@ -271,7 +271,7 @@ function DetailPanel({
271
271
 
272
272
  {detail.source_ontology && (
273
273
  <DetailSection label="Source Ontology">
274
- <span style={{ color: "#f0cdd3", fontSize: 12, fontFamily: "monospace" }}>
274
+ <span style={{ color: "#602b34", fontSize: 12, fontFamily: "monospace" }}>
275
275
  {detail.source_ontology}
276
276
  </span>
277
277
  </DetailSection>
@@ -294,7 +294,7 @@ function DetailPanel({
294
294
 
295
295
  function DetailSection({ label, children }: { label: string; children: React.ReactNode }) {
296
296
  return (
297
- <div style={{ paddingTop: 10, borderTop: "1px solid rgba(255,255,255,0.05)", marginTop: 10 }}>
297
+ <div style={{ paddingTop: 10, borderTop: "1px solid rgba(28, 20, 24,0.05)", marginTop: 10 }}>
298
298
  <div style={{ color: "#9c7a82", fontSize: 10, fontWeight: 700, textTransform: "uppercase" as const, letterSpacing: "0.07em", marginBottom: 5 }}>
299
299
  {label}
300
300
  </div>
@@ -453,7 +453,7 @@ const searchInputStyle: React.CSSProperties = {
453
453
  background: "transparent",
454
454
  border: "none",
455
455
  outline: "none",
456
- color: "#fff0f2",
456
+ color: "#2d1619",
457
457
  fontSize: 13,
458
458
  };
459
459
 
@@ -485,13 +485,13 @@ const typeFilterBtnBase: React.CSSProperties = {
485
485
 
486
486
  const typeFilterBtnIdle: React.CSSProperties = {
487
487
  background: "transparent",
488
- color: "#c99aa3",
488
+ color: "#aa485b",
489
489
  borderColor: "rgba(255,107,129,0.1)",
490
490
  };
491
491
 
492
492
  const typeFilterBtnActive: React.CSSProperties = {
493
493
  background: "rgba(255,45,75,0.14)",
494
- color: "#fff0f2",
494
+ color: "#2d1619",
495
495
  borderColor: "rgba(255,107,129,0.26)",
496
496
  };
497
497
 
@@ -523,7 +523,7 @@ const detailPanelStyle: React.CSSProperties = {
523
523
  display: "flex",
524
524
  flexDirection: "column",
525
525
  borderLeft: "1px solid rgba(255,107,129,0.1)",
526
- background: "rgba(6,3,5,0.5)",
526
+ background: "rgba(255, 255, 255,0.5)",
527
527
  overflow: "hidden",
528
528
  };
529
529
 
@@ -539,7 +539,7 @@ const detailHeaderStyle: React.CSSProperties = {
539
539
  const closeDetailBtnStyle: React.CSSProperties = {
540
540
  background: "transparent",
541
541
  border: "none",
542
- color: "#c99aa3",
542
+ color: "#aa485b",
543
543
  cursor: "pointer",
544
544
  padding: 2,
545
545
  display: "grid",
@@ -570,7 +570,7 @@ const collapseHdrStyle: React.CSSProperties = {
570
570
  gap: 5,
571
571
  background: "transparent",
572
572
  border: "none",
573
- color: "#c99aa3",
573
+ color: "#aa485b",
574
574
  fontSize: 12,
575
575
  fontWeight: 600,
576
576
  cursor: "pointer",
@@ -168,11 +168,11 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
168
168
  const getChangeIcon = (type: string) => {
169
169
  switch (type) {
170
170
  case "added":
171
- return <Plus size={14} color="#4cc38a" />;
171
+ return <Plus size={14} color="#1f9d5f" />;
172
172
  case "removed":
173
- return <Minus size={14} color="#ff6b6b" />;
173
+ return <Minus size={14} color="#e71313" />;
174
174
  case "modified":
175
- return <Edit size={14} color="#ff7a45" />;
175
+ return <Edit size={14} color="#e86a2e" />;
176
176
  default:
177
177
  return null;
178
178
  }
@@ -181,15 +181,15 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
181
181
  const getStateIcon = (state: string) => {
182
182
  switch (state) {
183
183
  case "published":
184
- return <CheckCircle size={20} color="#4cc38a" />;
184
+ return <CheckCircle size={20} color="#1f9d5f" />;
185
185
  case "approved":
186
186
  return <CheckCircle size={20} color="#ff2d4b" />;
187
187
  case "rejected":
188
- return <XCircle size={20} color="#ff6b6b" />;
188
+ return <XCircle size={20} color="#e71313" />;
189
189
  case "proposed":
190
- return <AlertCircle size={20} color="#ff7a45" />;
190
+ return <AlertCircle size={20} color="#e86a2e" />;
191
191
  default:
192
- return <Clock size={20} color="#c99aa3" />;
192
+ return <Clock size={20} color="#aa485b" />;
193
193
  }
194
194
  };
195
195
 
@@ -197,7 +197,7 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
197
197
  display: "flex",
198
198
  flexDirection: "column",
199
199
  height: "100%",
200
- background: "#0b0508",
200
+ background: "#ffffff",
201
201
  padding: "20px",
202
202
  overflow: "auto",
203
203
  };
@@ -213,7 +213,7 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
213
213
 
214
214
  const titleStyle: React.CSSProperties = {
215
215
  margin: 0,
216
- color: "#fff0f2",
216
+ color: "#2d1619",
217
217
  fontSize: "20px",
218
218
  fontWeight: "700",
219
219
  };
@@ -227,7 +227,7 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
227
227
 
228
228
  const diffPanelStyle: React.CSSProperties = {
229
229
  flex: 1,
230
- background: "rgba(12, 6, 9, 0.8)",
230
+ background: "rgba(255, 255, 255, 0.8)",
231
231
  borderRadius: "8px",
232
232
  border: "1px solid rgba(255, 107, 129, 0.12)",
233
233
  padding: "16px",
@@ -236,7 +236,7 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
236
236
 
237
237
  const commentsPanelStyle: React.CSSProperties = {
238
238
  width: "320px",
239
- background: "rgba(12, 6, 9, 0.8)",
239
+ background: "rgba(255, 255, 255, 0.8)",
240
240
  borderRadius: "8px",
241
241
  border: "1px solid rgba(255, 107, 129, 0.12)",
242
242
  padding: "16px",
@@ -250,7 +250,7 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
250
250
  gap: "10px",
251
251
  padding: "10px 12px",
252
252
  borderRadius: "6px",
253
- background: "rgba(6, 3, 5, 0.6)",
253
+ background: "rgba(255, 255, 255, 0.6)",
254
254
  marginBottom: "8px",
255
255
  cursor: "pointer",
256
256
  transition: "160ms ease",
@@ -264,7 +264,7 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
264
264
  borderRadius: "6px",
265
265
  border: "1px solid rgba(255, 107, 129, 0.2)",
266
266
  background: "rgba(255, 45, 75, 0.1)",
267
- color: "#fff0f2",
267
+ color: "#2d1619",
268
268
  fontSize: "12px",
269
269
  fontWeight: "600",
270
270
  cursor: "pointer",
@@ -276,8 +276,8 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
276
276
  padding: "10px 12px",
277
277
  borderRadius: "6px",
278
278
  border: "1px solid rgba(255, 107, 129, 0.2)",
279
- background: "rgba(6, 3, 5, 0.8)",
280
- color: "#fff0f2",
279
+ background: "rgba(255, 255, 255, 0.8)",
280
+ color: "#2d1619",
281
281
  fontSize: "13px",
282
282
  resize: "vertical",
283
283
  minHeight: "80px",
@@ -286,7 +286,7 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
286
286
  if (!proposal) {
287
287
  return (
288
288
  <div style={containerStyle}>
289
- <div style={{ color: "#c99aa3", fontSize: "14px" }}>Loading proposal...</div>
289
+ <div style={{ color: "#aa485b", fontSize: "14px" }}>Loading proposal...</div>
290
290
  </div>
291
291
  );
292
292
  }
@@ -298,7 +298,7 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
298
298
  {getStateIcon(proposal.state)}
299
299
  <div>
300
300
  <h1 style={titleStyle}>{proposal.summary}</h1>
301
- <div style={{ color: "#c99aa3", fontSize: "12px", marginTop: "4px" }}>
301
+ <div style={{ color: "#aa485b", fontSize: "12px", marginTop: "4px" }}>
302
302
  {proposal.author} • {new Date(proposal.created_at).toLocaleString()}
303
303
  </div>
304
304
  </div>
@@ -327,12 +327,12 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
327
327
 
328
328
  <div style={contentStyle}>
329
329
  <div style={diffPanelStyle}>
330
- <h2 style={{ margin: "0 0 16px", color: "#fff0f2", fontSize: "14px", fontWeight: "600" }}>
330
+ <h2 style={{ margin: "0 0 16px", color: "#2d1619", fontSize: "14px", fontWeight: "600" }}>
331
331
  <GitMerge size={16} style={{ marginRight: "8px", verticalAlign: "middle" }} />
332
332
  Diff Viewer
333
333
  </h2>
334
334
  {diff.length === 0 ? (
335
- <div style={{ color: "#c99aa3", fontSize: "13px" }}>No changes detected</div>
335
+ <div style={{ color: "#aa485b", fontSize: "13px" }}>No changes detected</div>
336
336
  ) : (
337
337
  diff.map((change, index) => (
338
338
  <div
@@ -345,10 +345,10 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
345
345
  >
346
346
  {getChangeIcon(change.type)}
347
347
  <div style={{ flex: 1 }}>
348
- <div style={{ color: "#fff0f2", fontSize: "13px", fontWeight: "600" }}>
348
+ <div style={{ color: "#2d1619", fontSize: "13px", fontWeight: "600" }}>
349
349
  {change.element}
350
350
  </div>
351
- <div style={{ color: "#c99aa3", fontSize: "11px" }}>
351
+ <div style={{ color: "#aa485b", fontSize: "11px" }}>
352
352
  {change.type}
353
353
  </div>
354
354
  </div>
@@ -357,50 +357,50 @@ export function ProposalReview({ proposalId }: { proposalId: string }) {
357
357
  )}
358
358
 
359
359
  <div style={{ marginTop: "20px", paddingTop: "16px", borderTop: "1px solid rgba(255, 120, 140, 0.12)" }}>
360
- <h3 style={{ margin: "0 0 12px", color: "#fff0f2", fontSize: "13px", fontWeight: "600" }}>
360
+ <h3 style={{ margin: "0 0 12px", color: "#2d1619", fontSize: "13px", fontWeight: "600" }}>
361
361
  Impact Analysis
362
362
  </h3>
363
- <pre style={{ background: "rgba(6, 3, 5, 0.8)", padding: "12px", borderRadius: "6px", color: "#fff0f2", fontSize: "12px", overflow: "auto" }}>
363
+ <pre style={{ background: "rgba(255, 255, 255, 0.8)", padding: "12px", borderRadius: "6px", color: "#2d1619", fontSize: "12px", overflow: "auto" }}>
364
364
  {JSON.stringify(proposal.impact_analysis, null, 2)}
365
365
  </pre>
366
366
  </div>
367
367
 
368
368
  <div style={{ marginTop: "16px" }}>
369
- <h3 style={{ margin: "0 0 12px", color: "#fff0f2", fontSize: "13px", fontWeight: "600" }}>
369
+ <h3 style={{ margin: "0 0 12px", color: "#2d1619", fontSize: "13px", fontWeight: "600" }}>
370
370
  SHACL Validation
371
371
  </h3>
372
- <pre style={{ background: "rgba(6, 3, 5, 0.8)", padding: "12px", borderRadius: "6px", color: "#fff0f2", fontSize: "12px", overflow: "auto" }}>
372
+ <pre style={{ background: "rgba(255, 255, 255, 0.8)", padding: "12px", borderRadius: "6px", color: "#2d1619", fontSize: "12px", overflow: "auto" }}>
373
373
  {JSON.stringify(proposal.shacl_validation, null, 2)}
374
374
  </pre>
375
375
  </div>
376
376
  </div>
377
377
 
378
378
  <div style={commentsPanelStyle}>
379
- <h2 style={{ margin: "0 0 16px", color: "#fff0f2", fontSize: "14px", fontWeight: "600" }}>
379
+ <h2 style={{ margin: "0 0 16px", color: "#2d1619", fontSize: "14px", fontWeight: "600" }}>
380
380
  <MessageSquare size={16} style={{ marginRight: "8px", verticalAlign: "middle" }} />
381
381
  Comments ({proposal.comments.length})
382
382
  </h2>
383
383
  <div style={{ flex: 1, overflow: "auto", marginBottom: "12px" }}>
384
384
  {proposal.comments.length === 0 ? (
385
- <div style={{ color: "#c99aa3", fontSize: "13px" }}>No comments yet</div>
385
+ <div style={{ color: "#aa485b", fontSize: "13px" }}>No comments yet</div>
386
386
  ) : (
387
387
  proposal.comments.map((comment) => (
388
388
  <div
389
389
  key={comment.id}
390
390
  style={{
391
391
  padding: "10px",
392
- background: "rgba(6, 3, 5, 0.6)",
392
+ background: "rgba(255, 255, 255, 0.6)",
393
393
  borderRadius: "6px",
394
394
  marginBottom: "8px",
395
395
  }}
396
396
  >
397
397
  <div style={{ display: "flex", alignItems: "center", gap: "6px", marginBottom: "4px" }}>
398
- <User size={12} color="#c99aa3" />
399
- <span style={{ color: "#fff0f2", fontSize: "12px", fontWeight: "600" }}>
398
+ <User size={12} color="#aa485b" />
399
+ <span style={{ color: "#2d1619", fontSize: "12px", fontWeight: "600" }}>
400
400
  {comment.author}
401
401
  </span>
402
402
  </div>
403
- <div style={{ color: "#c99aa3", fontSize: "12px", marginBottom: "4px" }}>{comment.text}</div>
403
+ <div style={{ color: "#aa485b", fontSize: "12px", marginBottom: "4px" }}>{comment.text}</div>
404
404
  <div style={{ color: "#8f6d75", fontSize: "10px" }}>
405
405
  {new Date(comment.created_at).toLocaleString()}
406
406
  </div>