memorix 1.0.4 → 1.0.6

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.
@@ -164,6 +164,10 @@
164
164
  <div id="page-team" class="page"></div>
165
165
  </main>
166
166
 
167
+ <!-- Cytoscape.js + Dagre layout for topology graph -->
168
+ <script src="https://unpkg.com/cytoscape@3.30.4/dist/cytoscape.min.js"></script>
169
+ <script src="https://unpkg.com/dagre@0.8.5/dist/dagre.min.js"></script>
170
+ <script src="https://unpkg.com/cytoscape-dagre@2.5.0/cytoscape-dagre.js"></script>
167
171
  <script src="/app.js"></script>
168
172
  </body>
169
173
 
@@ -618,47 +618,519 @@ body {
618
618
  }
619
619
 
620
620
  /* ============================================================
621
- * Knowledge Graph - Cosmic Theme (zditor-inspired)
621
+ * Knowledge Graph Enterprise Topology Explorer
622
+ * 3-column layout: Filter | Canvas | Inspector
622
623
  * ============================================================ */
623
624
 
624
625
  .graph-layout {
625
626
  display: flex;
626
627
  gap: 0;
627
628
  height: calc(100vh - 140px);
629
+ border: 1px solid var(--border-subtle);
630
+ border-radius: var(--radius-lg);
631
+ overflow: hidden;
632
+ }
633
+
634
+ /* ── Left: Filter / View Panel ────────────────────────────── */
635
+ .graph-filter-panel {
636
+ width: 220px;
637
+ flex-shrink: 0;
638
+ background: var(--bg-card);
639
+ border-right: 1px solid var(--border-subtle);
640
+ overflow-y: auto;
641
+ display: flex;
642
+ flex-direction: column;
643
+ }
644
+
645
+ .gfp-section {
646
+ padding: 14px 16px;
647
+ border-bottom: 1px solid var(--border-subtle);
648
+ }
649
+
650
+ .gfp-section:last-child {
651
+ border-bottom: none;
652
+ }
653
+
654
+ .gfp-label {
655
+ font-size: 10px;
656
+ font-weight: 600;
657
+ color: var(--text-muted);
658
+ text-transform: uppercase;
659
+ letter-spacing: 0.8px;
660
+ margin-bottom: 10px;
661
+ }
662
+
663
+ .gfp-radio-group {
664
+ display: flex;
665
+ flex-direction: column;
666
+ gap: 2px;
667
+ }
668
+
669
+ .gfp-radio {
670
+ display: flex;
671
+ align-items: center;
672
+ gap: 8px;
673
+ padding: 6px 8px;
674
+ border-radius: var(--radius-sm);
675
+ cursor: pointer;
676
+ font-size: 12px;
677
+ color: var(--text-secondary);
678
+ transition: background var(--transition-fast);
679
+ border: none;
680
+ background: none;
681
+ width: 100%;
682
+ font-family: var(--font-sans);
683
+ text-align: left;
684
+ }
685
+
686
+ .gfp-radio:hover {
687
+ background: rgba(255,255,255,0.04);
688
+ }
689
+
690
+ .gfp-radio.active {
691
+ background: rgba(208, 188, 255, 0.08);
692
+ color: var(--text-primary);
693
+ font-weight: 500;
694
+ }
695
+
696
+ .gfp-radio-dot {
697
+ width: 14px;
698
+ height: 14px;
699
+ border-radius: 50%;
700
+ border: 2px solid var(--border-medium);
701
+ flex-shrink: 0;
702
+ display: flex;
703
+ align-items: center;
704
+ justify-content: center;
705
+ }
706
+
707
+ .gfp-radio.active .gfp-radio-dot {
708
+ border-color: var(--accent-purple);
709
+ }
710
+
711
+ .gfp-radio.active .gfp-radio-dot::after {
712
+ content: '';
713
+ width: 6px;
714
+ height: 6px;
715
+ border-radius: 50%;
716
+ background: var(--accent-purple);
717
+ }
718
+
719
+ .gfp-check {
720
+ display: flex;
721
+ align-items: center;
722
+ gap: 8px;
723
+ padding: 4px 8px;
724
+ border-radius: var(--radius-sm);
725
+ cursor: pointer;
726
+ font-size: 12px;
727
+ color: var(--text-secondary);
728
+ transition: background var(--transition-fast);
729
+ border: none;
730
+ background: none;
731
+ width: 100%;
732
+ font-family: var(--font-sans);
733
+ text-align: left;
734
+ }
735
+
736
+ .gfp-check:hover {
737
+ background: rgba(255,255,255,0.04);
628
738
  }
629
739
 
740
+ .gfp-check-box {
741
+ width: 14px;
742
+ height: 14px;
743
+ border-radius: 3px;
744
+ border: 2px solid var(--border-medium);
745
+ flex-shrink: 0;
746
+ display: flex;
747
+ align-items: center;
748
+ justify-content: center;
749
+ font-size: 9px;
750
+ color: transparent;
751
+ }
752
+
753
+ .gfp-check.active .gfp-check-box {
754
+ background: var(--accent-purple);
755
+ border-color: var(--accent-purple);
756
+ color: #0B0B14;
757
+ }
758
+
759
+ .gfp-check-count {
760
+ margin-left: auto;
761
+ font-size: 10px;
762
+ font-family: var(--font-mono);
763
+ color: var(--text-muted);
764
+ }
765
+
766
+ .gfp-type-dot {
767
+ width: 8px;
768
+ height: 8px;
769
+ border-radius: 50%;
770
+ flex-shrink: 0;
771
+ }
772
+
773
+ .gfp-depth-row {
774
+ display: flex;
775
+ gap: 4px;
776
+ }
777
+
778
+ .gfp-depth-btn {
779
+ flex: 1;
780
+ padding: 6px 0;
781
+ border: 1px solid var(--border-medium);
782
+ border-radius: var(--radius-sm);
783
+ background: transparent;
784
+ color: var(--text-secondary);
785
+ font-size: 11px;
786
+ font-weight: 500;
787
+ font-family: var(--font-sans);
788
+ cursor: pointer;
789
+ transition: all var(--transition-fast);
790
+ }
791
+
792
+ .gfp-depth-btn:hover {
793
+ border-color: var(--text-muted);
794
+ }
795
+
796
+ .gfp-depth-btn.active {
797
+ background: var(--accent-purple);
798
+ border-color: var(--accent-purple);
799
+ color: #0B0B14;
800
+ font-weight: 600;
801
+ }
802
+
803
+ .gfp-search {
804
+ width: 100%;
805
+ padding: 7px 10px;
806
+ background: var(--bg-surface);
807
+ border: 1px solid var(--border-subtle);
808
+ border-radius: var(--radius-sm);
809
+ color: var(--text-primary);
810
+ font-family: var(--font-sans);
811
+ font-size: 12px;
812
+ outline: none;
813
+ transition: border-color var(--transition-fast);
814
+ }
815
+
816
+ .gfp-search:focus {
817
+ border-color: var(--accent-purple);
818
+ }
819
+
820
+ .gfp-search::placeholder {
821
+ color: var(--text-muted);
822
+ }
823
+
824
+ /* ── Center: Graph Container (Cytoscape.js) ───────────────── */
630
825
  #graph-container {
631
826
  flex: 1;
632
827
  min-width: 0;
633
- background: radial-gradient(ellipse at 50% 120%, #1a1040 0%, #0B0B14 60%, #06060C 100%);
634
- border: 1px solid var(--border-subtle);
635
- border-radius: var(--radius-lg);
828
+ background: var(--bg-base);
636
829
  overflow: hidden;
637
830
  position: relative;
831
+ display: flex;
832
+ flex-direction: column;
638
833
  }
639
834
 
640
- #graph-canvas {
641
- width: 100%;
835
+ #cytoscape-mount {
836
+ flex: 1;
837
+ min-height: 0;
838
+ }
839
+
840
+ .graph-status-bar {
841
+ height: 28px;
842
+ flex-shrink: 0;
843
+ background: var(--bg-card);
844
+ border-top: 1px solid var(--border-subtle);
845
+ display: flex;
846
+ align-items: center;
847
+ padding: 0 12px;
848
+ gap: 16px;
849
+ font-size: 11px;
850
+ color: var(--text-muted);
851
+ }
852
+
853
+ .graph-status-item {
854
+ display: flex;
855
+ align-items: center;
856
+ gap: 4px;
857
+ }
858
+
859
+ .graph-zoom-controls {
860
+ margin-left: auto;
861
+ display: flex;
862
+ gap: 2px;
863
+ }
864
+
865
+ .graph-zoom-btn {
866
+ width: 24px;
867
+ height: 22px;
868
+ border: 1px solid var(--border-subtle);
869
+ background: transparent;
870
+ color: var(--text-muted);
871
+ border-radius: 3px;
872
+ cursor: pointer;
873
+ font-size: 12px;
874
+ font-weight: 600;
875
+ transition: all var(--transition-fast);
876
+ display: flex;
877
+ align-items: center;
878
+ justify-content: center;
879
+ }
880
+
881
+ .graph-zoom-btn:hover {
882
+ background: var(--bg-card-hover);
883
+ color: var(--text-primary);
884
+ }
885
+
886
+ /* ── Right: Inspector Panel ───────────────────────────────── */
887
+ .graph-inspector {
888
+ width: 280px;
889
+ flex-shrink: 0;
890
+ background: var(--bg-card);
891
+ border-left: 1px solid var(--border-subtle);
892
+ overflow-y: auto;
893
+ display: flex;
894
+ flex-direction: column;
895
+ }
896
+
897
+ .gi-empty {
898
+ display: flex;
899
+ flex-direction: column;
900
+ align-items: center;
901
+ justify-content: center;
642
902
  height: 100%;
903
+ color: var(--text-muted);
904
+ font-size: 12px;
905
+ text-align: center;
906
+ padding: 20px;
907
+ }
908
+
909
+ .gi-empty-icon {
910
+ font-size: 28px;
911
+ margin-bottom: 8px;
912
+ opacity: 0.3;
913
+ }
914
+
915
+ .gi-header {
916
+ padding: 16px;
917
+ border-bottom: 1px solid var(--border-subtle);
918
+ }
919
+
920
+ .gi-name {
921
+ font-size: 15px;
922
+ font-weight: 600;
923
+ color: var(--text-primary);
924
+ margin-bottom: 4px;
925
+ word-break: break-word;
926
+ }
927
+
928
+ .gi-type {
929
+ font-size: 11px;
930
+ font-family: var(--font-mono);
931
+ color: var(--text-muted);
932
+ }
933
+
934
+ .gi-stats {
935
+ display: grid;
936
+ grid-template-columns: 1fr 1fr;
937
+ gap: 1px;
938
+ background: var(--border-subtle);
939
+ border-bottom: 1px solid var(--border-subtle);
940
+ }
941
+
942
+ .gi-stat {
943
+ background: var(--bg-card);
944
+ padding: 10px 16px;
945
+ text-align: center;
946
+ }
947
+
948
+ .gi-stat-value {
949
+ font-size: 16px;
950
+ font-weight: 600;
951
+ font-family: var(--font-mono);
952
+ color: var(--text-primary);
953
+ }
954
+
955
+ .gi-stat-label {
956
+ font-size: 10px;
957
+ color: var(--text-muted);
958
+ text-transform: uppercase;
959
+ letter-spacing: 0.5px;
960
+ }
961
+
962
+ .gi-section {
963
+ padding: 14px 16px;
964
+ border-bottom: 1px solid var(--border-subtle);
965
+ }
966
+
967
+ .gi-section:last-child {
968
+ border-bottom: none;
969
+ }
970
+
971
+ .gi-section-title {
972
+ font-size: 10px;
973
+ font-weight: 600;
974
+ color: var(--text-muted);
975
+ text-transform: uppercase;
976
+ letter-spacing: 0.8px;
977
+ margin-bottom: 8px;
978
+ display: flex;
979
+ align-items: center;
980
+ gap: 6px;
981
+ }
982
+
983
+ .gi-section-count {
984
+ font-size: 10px;
985
+ font-weight: 500;
986
+ padding: 1px 6px;
987
+ border-radius: var(--radius-sm);
988
+ background: rgba(208, 188, 255, 0.1);
989
+ color: var(--accent-purple);
990
+ }
991
+
992
+ .gi-obs-item {
993
+ font-size: 12px;
994
+ color: var(--text-secondary);
995
+ line-height: 1.5;
996
+ padding: 6px 10px;
997
+ margin-bottom: 4px;
998
+ border-radius: var(--radius-sm);
999
+ background: var(--bg-surface);
1000
+ border-left: 2px solid var(--accent-purple);
1001
+ word-break: break-word;
1002
+ }
1003
+
1004
+ .gi-rel-item {
1005
+ font-size: 12px;
1006
+ color: var(--text-secondary);
1007
+ padding: 4px 0;
1008
+ display: flex;
1009
+ align-items: center;
1010
+ gap: 6px;
643
1011
  }
644
1012
 
645
- /* Floating graph control panel (zditor-style) */
646
- .graph-panel {
1013
+ .gi-rel-arrow {
1014
+ color: var(--accent-purple);
1015
+ font-weight: 600;
1016
+ flex-shrink: 0;
1017
+ }
1018
+
1019
+ .gi-rel-type {
1020
+ font-family: var(--font-mono);
1021
+ font-size: 10px;
1022
+ color: var(--accent-purple);
1023
+ padding: 1px 6px;
1024
+ background: rgba(208, 188, 255, 0.06);
1025
+ border-radius: var(--radius-sm);
1026
+ flex-shrink: 0;
1027
+ }
1028
+
1029
+ .gi-rel-target {
1030
+ font-weight: 500;
1031
+ color: var(--text-primary);
1032
+ cursor: pointer;
1033
+ transition: color var(--transition-fast);
1034
+ }
1035
+
1036
+ .gi-rel-target:hover {
1037
+ color: var(--accent-purple);
1038
+ }
1039
+
1040
+ /* ── Graph Tooltip ────────────────────────────────────────── */
1041
+ .graph-tooltip {
647
1042
  position: absolute;
648
- top: 16px;
649
- right: 16px;
650
- width: 260px;
651
- background: rgba(14, 14, 26, 0.85);
652
- backdrop-filter: blur(20px);
653
- -webkit-backdrop-filter: blur(20px);
654
- border: 1px solid rgba(255, 255, 255, 0.08);
655
- border-radius: var(--radius-lg);
656
- z-index: 20;
657
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
658
- overflow: hidden;
659
- transition: opacity var(--transition-normal);
1043
+ background: var(--bg-card);
1044
+ border: 1px solid var(--border-medium);
1045
+ border-radius: var(--radius-sm);
1046
+ padding: 8px 12px;
1047
+ font-size: 12px;
1048
+ pointer-events: none;
1049
+ opacity: 0;
1050
+ transition: opacity var(--transition-fast);
1051
+ z-index: 100;
1052
+ max-width: 260px;
1053
+ box-shadow: var(--elevation-2);
660
1054
  }
661
1055
 
1056
+ .graph-tooltip.visible {
1057
+ opacity: 1;
1058
+ }
1059
+
1060
+ .graph-tooltip-name {
1061
+ font-weight: 600;
1062
+ color: var(--text-primary);
1063
+ margin-bottom: 2px;
1064
+ }
1065
+
1066
+ .graph-tooltip-type {
1067
+ font-size: 11px;
1068
+ color: var(--text-muted);
1069
+ }
1070
+
1071
+ /* ── Table View ───────────────────────────────────────────── */
1072
+ .graph-table-container {
1073
+ flex: 1;
1074
+ overflow: auto;
1075
+ background: var(--bg-base);
1076
+ }
1077
+
1078
+ .graph-table {
1079
+ width: 100%;
1080
+ border-collapse: collapse;
1081
+ font-size: 12px;
1082
+ }
1083
+
1084
+ .graph-table th {
1085
+ text-align: left;
1086
+ font-size: 10px;
1087
+ font-weight: 600;
1088
+ color: var(--text-muted);
1089
+ text-transform: uppercase;
1090
+ letter-spacing: 0.5px;
1091
+ padding: 10px 14px;
1092
+ border-bottom: 1px solid var(--border-subtle);
1093
+ background: var(--bg-card);
1094
+ position: sticky;
1095
+ top: 0;
1096
+ z-index: 2;
1097
+ }
1098
+
1099
+ .graph-table td {
1100
+ padding: 8px 14px;
1101
+ border-bottom: 1px solid var(--border-subtle);
1102
+ color: var(--text-secondary);
1103
+ }
1104
+
1105
+ .graph-table tr:hover td {
1106
+ background: rgba(208, 188, 255, 0.02);
1107
+ }
1108
+
1109
+ .graph-table tr {
1110
+ cursor: pointer;
1111
+ transition: background var(--transition-fast);
1112
+ }
1113
+
1114
+ .graph-table .entity-name {
1115
+ font-weight: 500;
1116
+ color: var(--text-primary);
1117
+ }
1118
+
1119
+ .graph-table .entity-type-dot {
1120
+ display: inline-block;
1121
+ width: 8px;
1122
+ height: 8px;
1123
+ border-radius: 50%;
1124
+ margin-right: 6px;
1125
+ vertical-align: middle;
1126
+ }
1127
+
1128
+ /* Hide old graph elements */
1129
+ .graph-panel { display: none; }
1130
+ .graph-detail-drawer { display: none; }
1131
+ .graph-detail { display: none; }
1132
+ .graph-detail-empty { display: none; }
1133
+
662
1134
  .graph-panel-tabs {
663
1135
  display: flex;
664
1136
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);