@mx-sose-front/mx-sose-graph 1.1.8 → 1.2.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 (180) hide show
  1. package/dist/assets/edgeWorker-b57ca007.js +2 -0
  2. package/dist/assets/edgeWorker-b57ca007.js.map +1 -0
  3. package/dist/index.d.ts +994 -31
  4. package/dist/index.esm.js +9541 -5145
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/index.umd.js +1 -1
  7. package/dist/index.umd.js.map +1 -1
  8. package/dist/style.css +1 -1
  9. package/package.json +1 -1
  10. package/src/components/Common/Tree.vue +451 -0
  11. package/src/components/Common/index.ts +2 -0
  12. package/src/components/DiagramListTooltip/DiagramListTooltip.vue +1 -2
  13. package/src/components/Edge/Edge.vue +172 -169
  14. package/src/components/Gantt/Gantt.vue +1544 -0
  15. package/src/components/GanttContextMenu/GanttContextMenu.vue +304 -0
  16. package/src/components/InteractionLayer.vue +343 -147
  17. package/src/components/Matrix/Matrix.vue +808 -0
  18. package/src/components/Matrix/index.ts +168 -0
  19. package/src/components/Shape/ConceptualRole.vue +2 -34
  20. package/src/components/Table/Table.vue +1193 -0
  21. package/src/constants/edgeShapeKeys.ts +8 -5
  22. package/src/constants/index.ts +279 -51
  23. package/src/hooks/index.ts +2 -0
  24. package/src/hooks/useChartRowSelection.ts +456 -0
  25. package/src/hooks/useResize.ts +2 -2
  26. package/src/hooks/useVirtualScroll.ts +258 -0
  27. package/src/index.ts +1 -1
  28. package/src/render/shape-renderer.ts +62 -2
  29. package/src/statics/icons/childIcons/AV-1/346/246/202/350/277/260/344/270/216/346/221/230/350/246/201/344/277/241/346/201/257/345/214/205@3x.png +0 -0
  30. package/src/statics/icons/childIcons/AV-1/346/246/202/350/277/260/346/221/230/350/246/201/345/233/276@3x.png +0 -0
  31. package/src/statics/icons/childIcons/AV-2/351/233/206/346/210/220/345/255/227/345/205/270/345/214/205@3x.png +0 -0
  32. package/src/statics/icons/childIcons/AV-2/351/233/206/346/210/220/345/255/227/345/205/270/350/241/250@3x.png +0 -0
  33. package/src/statics/icons/childIcons/CV-1/346/204/277/346/231/257/345/214/205@3x.png +0 -0
  34. package/src/statics/icons/childIcons/CV-1/346/204/277/346/231/257/345/233/276@3x.png +0 -0
  35. package/src/statics/icons/childIcons/CV-2/350/203/275/345/212/233/345/210/206/347/261/273/345/214/205@3x.png +0 -0
  36. package/src/statics/icons/childIcons/CV-2/350/203/275/345/212/233/345/210/206/347/261/273/345/233/276@3x-2.png +0 -0
  37. package/src/statics/icons/childIcons/CV-2/350/203/275/345/212/233/345/210/206/347/261/273/345/233/276@3x-3.png +0 -0
  38. package/src/statics/icons/childIcons/CV-2/350/203/275/345/212/233/345/210/206/347/261/273/345/233/276@3x.png +0 -0
  39. package/src/statics/icons/childIcons/CV-3/350/203/275/345/212/233/345/210/206/346/256/265/345/214/205@3x.png +0 -0
  40. package/src/statics/icons/childIcons/CV-3/350/203/275/345/212/233/351/230/266/346/256/265/347/224/230/347/211/271/345/233/276@3x.png +0 -0
  41. package/src/statics/icons/childIcons/CV-4/350/203/275/345/212/233/344/276/235/350/265/226/345/214/205@3x.png +0 -0
  42. package/src/statics/icons/childIcons/CV-4/350/203/275/345/212/233/344/276/235/350/265/226/345/233/276@3x.png +0 -0
  43. package/src/statics/icons/childIcons/CV-5/350/203/275/345/212/233/345/210/260/347/273/204/347/273/207/347/232/204/345/274/200/345/217/221/346/230/240/345/260/204/345/214/205@3x.png +0 -0
  44. package/src/statics/icons/childIcons/CV-5/350/203/275/345/212/233/345/210/260/347/273/204/347/273/207/347/232/204/346/230/240/345/260/204/347/237/251/351/230/265@3x.png +0 -0
  45. package/src/statics/icons/childIcons/CV-6/350/203/275/345/212/233/345/210/260/344/270/232/345/212/241/346/264/273/345/212/250/346/230/240/345/260/204/347/237/251/351/230/265@3x.png +0 -0
  46. package/src/statics/icons/childIcons/CV-6/350/203/275/345/212/233/345/210/260/344/275/234/346/210/230/346/264/273/345/212/250/347/232/204/346/230/240/345/260/204/345/214/205@3x.png +0 -0
  47. package/src/statics/icons/childIcons/CV-7/350/203/275/345/212/233/345/210/260/346/234/215/345/212/241/346/230/240/345/260/204/347/237/251/351/230/265@3x.png +0 -0
  48. package/src/statics/icons/childIcons/CV-7/350/203/275/345/212/233/345/210/260/346/234/215/345/212/241/347/232/204/346/230/240/345/260/204/345/214/205@3x.png +0 -0
  49. package/src/statics/icons/childIcons/DIV-1/346/246/202/345/277/265/346/225/260/346/215/256/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  50. package/src/statics/icons/childIcons/DIV-1/346/246/202/345/277/265/346/225/260/346/215/256/346/250/241/345/236/213/345/233/276@3x.png +0 -0
  51. package/src/statics/icons/childIcons/DIV-2/351/200/273/350/276/221/346/225/260/346/215/256/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  52. package/src/statics/icons/childIcons/DIV-2/351/200/273/350/276/221/346/225/260/346/215/256/346/250/241/345/236/213/345/233/276@3x.png +0 -0
  53. package/src/statics/icons/childIcons/DIV-3/347/211/251/347/220/206/346/225/260/346/215/256/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  54. package/src/statics/icons/childIcons/OV-1/350/207/252/347/224/261/345/210/206/347/261/273/345/233/276@3x.png +0 -0
  55. package/src/statics/icons/childIcons/OV-1/351/253/230/347/272/247/344/275/234/346/210/230/346/246/202/345/277/265/345/233/276@3x.png +0 -0
  56. package/src/statics/icons/childIcons/OV-1/351/253/230/347/272/247/344/275/234/346/210/230/346/246/202/345/277/265/345/233/276/345/214/205@3x.png +0 -0
  57. package/src/statics/icons/childIcons/OV-2/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/345/206/205/351/203/250/346/217/217/350/277/260/345/233/276@3x-2.png +0 -0
  58. package/src/statics/icons/childIcons/OV-2/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/345/206/205/351/203/250/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  59. package/src/statics/icons/childIcons/OV-2/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  60. package/src/statics/icons/childIcons/OV-2/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  61. package/src/statics/icons/childIcons/OV-3/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265@3x.png +0 -0
  62. package/src/statics/icons/childIcons/OV-3/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  63. package/src/statics/icons/childIcons/OV-3/345/237/272/347/241/200/350/247/222/350/211/262/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265@3x.png +0 -0
  64. package/src/statics/icons/childIcons/OV-4/347/273/204/347/273/207/345/205/263/347/263/273/345/233/276@3x.png +0 -0
  65. package/src/statics/icons/childIcons/OV-4/347/273/204/347/273/207/345/205/263/347/263/273/345/233/276/345/214/205@3x.png +0 -0
  66. package/src/statics/icons/childIcons/OV-5a/344/275/234/346/210/230/346/264/273/345/212/250/345/210/206/350/247/243/346/240/221/345/214/205@3x.png +0 -0
  67. package/src/statics/icons/childIcons/OV-5a/344/275/234/346/210/230/346/264/273/345/212/250/345/210/206/350/247/243/346/240/221/345/233/276@3x.png +0 -0
  68. package/src/statics/icons/childIcons/OV-5b/344/275/234/346/210/230/346/264/273/345/212/250/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  69. package/src/statics/icons/childIcons/OV-5b/344/275/234/346/210/230/346/264/273/345/212/250/346/250/241/345/236/213/345/233/276@3x.png +0 -0
  70. package/src/statics/icons/childIcons/OV-6a/344/275/234/346/210/230/350/247/204/345/210/231/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  71. package/src/statics/icons/childIcons/OV-6a/344/275/234/346/210/230/350/265/204/346/272/220/345/217/202/346/225/260/345/233/276@3x.png +0 -0
  72. package/src/statics/icons/childIcons/OV-6b/347/212/266/346/200/201/350/275/254/346/215/242/345/233/276@3x.png +0 -0
  73. package/src/statics/icons/childIcons/OV-6b/347/212/266/346/200/201/350/275/254/346/215/242/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  74. package/src/statics/icons/childIcons/OV-6c/344/272/213/344/273/266/350/277/275/350/270/252/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  75. package/src/statics/icons/childIcons/OV-6c/344/275/234/346/210/230/344/272/213/344/273/266/350/267/237/350/270/252/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  76. package/src/statics/icons/childIcons/PV-1/351/241/271/347/233/256/347/273/204/345/220/210/345/205/263/347/263/273/345/214/205@3x.png +0 -0
  77. package/src/statics/icons/childIcons/PV-1/351/241/271/347/233/256/347/273/204/345/220/210/345/205/263/347/263/273/345/233/276@3x.png +0 -0
  78. package/src/statics/icons/childIcons/PV-2/351/241/271/347/233/256/346/227/266/351/227/264/350/277/233/345/272/246/345/214/205@3x.png +0 -0
  79. package/src/statics/icons/childIcons/PV-2/351/241/271/347/233/256/346/227/266/351/227/264/350/277/233/345/272/246/347/224/230/347/211/271/345/233/276@3x.png +0 -0
  80. package/src/statics/icons/childIcons/PV-3/351/241/271/347/233/256/344/270/216/350/203/275/345/212/233/346/230/240/345/260/204/347/237/251/351/230/265@3x.png +0 -0
  81. package/src/statics/icons/childIcons/PV-3/351/241/271/347/233/256/344/270/216/350/203/275/345/212/233/347/232/204/346/230/240/345/260/204/345/214/205@3x.png +0 -0
  82. package/src/statics/icons/childIcons/SV-1 /347/263/273/347/273/237/346/216/245/345/217/243/345/206/205/351/203/250/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  83. package/src/statics/icons/childIcons/SV-1 /347/263/273/347/273/237/346/216/245/345/217/243/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  84. package/src/statics/icons/childIcons/SV-10a /347/263/273/347/273/237/345/217/202/346/225/260/345/233/276@3x.png +0 -0
  85. package/src/statics/icons/childIcons/SV-10a /347/263/273/347/273/237/350/247/204/345/210/231/346/250/241/345/236/213/350/241/250@3x.png +0 -0
  86. package/src/statics/icons/childIcons/SV-10a/347/263/273/347/273/237/350/247/204/345/210/231/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  87. package/src/statics/icons/childIcons/SV-10b /347/263/273/347/273/237/347/212/266/346/200/201/350/275/254/346/215/242/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  88. package/src/statics/icons/childIcons/SV-10b/347/263/273/347/273/237/347/212/266/346/200/201/350/275/254/346/215/242/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  89. package/src/statics/icons/childIcons/SV-10c /347/263/273/347/273/237/344/272/213/344/273/266/350/267/237/350/270/252/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  90. package/src/statics/icons/childIcons/SV-10c/347/263/273/347/273/237/344/272/213/344/273/266-/350/277/275/350/270/252/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  91. package/src/statics/icons/childIcons/SV-1/347/263/273/347/273/237/346/216/245/345/217/243/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  92. package/src/statics/icons/childIcons/SV-2 /347/263/273/347/273/237/345/206/205/351/203/250/350/265/204/346/272/220/346/265/201/345/212/250/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  93. package/src/statics/icons/childIcons/SV-2 /347/263/273/347/273/237/350/265/204/346/272/220/346/265/201/345/212/250/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  94. package/src/statics/icons/childIcons/SV-2/347/263/273/347/273/237/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  95. package/src/statics/icons/childIcons/SV-3 /347/263/273/347/273/237 - /347/263/273/347/273/237/347/237/251/351/230/265@3x.png +0 -0
  96. package/src/statics/icons/childIcons/SV-3/347/263/273/347/273/237-/347/263/273/347/273/237/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  97. package/src/statics/icons/childIcons/SV-4 /347/263/273/347/273/237/345/212/237/350/203/275/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  98. package/src/statics/icons/childIcons/SV-4 /347/263/273/347/273/237/345/212/237/350/203/275/346/265/201/347/250/213/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  99. package/src/statics/icons/childIcons/SV-4/347/263/273/347/273/237/345/212/237/350/203/275/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  100. package/src/statics/icons/childIcons/SV-5a /344/270/232/345/212/241/346/264/273/345/212/250/345/210/260/347/263/273/347/273/237/345/212/237/350/203/275/347/232/204/345/217/257/350/277/275/346/272/257/346/200/247/347/237/251/351/230/265@3x.png +0 -0
  101. package/src/statics/icons/childIcons/SV-5a/344/275/234/346/210/230/346/264/273/345/212/250/345/210/260/347/263/273/347/273/237/345/212/237/350/203/275/345/217/257/350/277/275/350/270/252/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  102. package/src/statics/icons/childIcons/SV-5b /344/270/232/345/212/241/346/264/273/345/212/250/345/210/260/347/263/273/347/273/237/347/232/204/345/217/257/350/277/275/346/272/257/346/200/247/347/237/251/351/230/265@3x.png +0 -0
  103. package/src/statics/icons/childIcons/SV-5b/344/275/234/346/210/230/346/264/273/345/212/250/345/210/260/347/263/273/347/273/237/345/217/257/350/277/275/350/270/252/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  104. package/src/statics/icons/childIcons/SV-6 /347/263/273/347/273/237/350/265/204/346/272/220/346/265/201/345/212/250/347/237/251/351/230/265@3x.png +0 -0
  105. package/src/statics/icons/childIcons/SV-6/347/263/273/347/273/237/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  106. package/src/statics/icons/childIcons/SV-7 /347/263/273/347/273/237/345/256/236/351/231/205/345/272/246/351/207/217/347/237/251/351/230/265@3x.png +0 -0
  107. package/src/statics/icons/childIcons/SV-7/347/263/273/347/273/237/345/272/246/351/207/217/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  108. package/src/statics/icons/childIcons/SV-8 /347/263/273/347/273/237/346/274/224/350/277/233/346/217/217/350/277/260/347/224/230/347/211/271/345/233/276@3x.png +0 -0
  109. package/src/statics/icons/childIcons/SV-8/347/263/273/347/273/237/346/274/224/350/277/233/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  110. package/src/statics/icons/childIcons/SV-9 /347/263/273/347/273/237/346/212/200/346/234/257/344/270/216/346/212/200/350/203/275/351/242/204/346/265/213/350/241/250@3x.png +0 -0
  111. package/src/statics/icons/childIcons/SV-9/347/263/273/347/273/237/346/212/200/346/234/257/344/270/216/346/212/200/350/203/275/351/242/204/346/265/213/345/214/205@3x.png +0 -0
  112. package/src/statics/icons/childIcons/StdV-1 /346/240/207/345/207/206/351/205/215/347/275/256/350/241/250@3x.png +0 -0
  113. package/src/statics/icons/childIcons/StdV-1/346/240/207/345/207/206/351/205/215/347/275/256/346/226/207/344/273/266/345/214/205@3x.png +0 -0
  114. package/src/statics/icons/childIcons/StdV-2 /346/240/207/345/207/206/351/242/204/346/265/213/350/241/250@3x.png +0 -0
  115. package/src/statics/icons/childIcons/StdV-2/346/240/207/345/207/206/351/242/204/346/265/213/345/214/205@3x.png +0 -0
  116. package/src/statics/icons/childIcons/SvcV-10a /346/234/215/345/212/241/345/217/202/346/225/260/345/233/276@3x.png +0 -0
  117. package/src/statics/icons/childIcons/SvcV-10a/346/234/215/345/212/241/350/247/204/345/210/231/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  118. package/src/statics/icons/childIcons/SvcV-10b /346/234/215/345/212/241/347/212/266/346/200/201/350/275/254/346/215/242/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  119. package/src/statics/icons/childIcons/SvcV-10b/346/234/215/345/212/241/347/212/266/346/200/201/350/275/254/346/215/242/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  120. package/src/statics/icons/childIcons/SvcV-10c /346/234/215/345/212/241/344/272/213/344/273/266/350/267/237/350/270/252/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  121. package/src/statics/icons/childIcons/SvcV-10c/346/234/215/345/212/241/344/272/213/344/273/266-/350/277/275/350/270/252/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  122. package/src/statics/icons/childIcons/SvcV-1/346/234/215/345/212/241/344/270/212/344/270/213/346/226/207/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  123. package/src/statics/icons/childIcons/SvcV-1/346/234/215/345/212/241/350/203/214/346/231/257/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  124. package/src/statics/icons/childIcons/SvcV-2 /346/234/215/345/212/241/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  125. package/src/statics/icons/childIcons/SvcV-2/346/234/215/345/212/241/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  126. package/src/statics/icons/childIcons/SvcV-3a /347/263/273/347/273/237 -/346/234/215/345/212/241/347/237/251/351/230/265@3x-2.png +0 -0
  127. package/src/statics/icons/childIcons/SvcV-3a /347/263/273/347/273/237 -/346/234/215/345/212/241/347/237/251/351/230/265@3x.png +0 -0
  128. package/src/statics/icons/childIcons/SvcV-3a/347/263/273/347/273/237-/346/234/215/345/212/241/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  129. package/src/statics/icons/childIcons/SvcV-3b/346/234/215/345/212/241-/346/234/215/345/212/241/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  130. package/src/statics/icons/childIcons/SvcV-4 /346/234/215/345/212/241/345/212/237/350/203/275/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  131. package/src/statics/icons/childIcons/SvcV-4 /346/234/215/345/212/241/345/212/237/350/203/275/346/265/201/345/233/276@3x.png +0 -0
  132. package/src/statics/icons/childIcons/SvcV-4/346/234/215/345/212/241/345/212/237/350/203/275/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  133. package/src/statics/icons/childIcons/SvcV-5/344/275/234/346/210/230/346/264/273/345/212/250/345/210/260/346/234/215/345/212/241/345/217/257/350/277/275/350/270/252/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  134. package/src/statics/icons/childIcons/SvcV-6 /346/234/215/345/212/241/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265@3x.png +0 -0
  135. package/src/statics/icons/childIcons/SvcV-6/346/234/215/345/212/241/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  136. package/src/statics/icons/childIcons/SvcV-7 /346/234/215/345/212/241/345/205/270/345/236/213/345/272/246/351/207/217/347/237/251/351/230/265@3x.png +0 -0
  137. package/src/statics/icons/childIcons/SvcV-7/346/234/215/345/212/241/345/272/246/351/207/217/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  138. package/src/statics/icons/childIcons/SvcV-8 /346/234/215/345/212/241/346/274/224/350/277/233/347/224/230/347/211/271/345/233/276@3x.png +0 -0
  139. package/src/statics/icons/childIcons/SvcV-8/346/234/215/345/212/241/346/274/224/350/277/233/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  140. package/src/statics/icons/childIcons/SvcV-9 /346/234/215/345/212/241/346/212/200/346/234/257/344/270/216/346/212/200/350/203/275/351/242/204/346/265/213/350/241/250@3x.png +0 -0
  141. package/src/statics/icons/childIcons/SvcV-9/346/234/215/345/212/241/346/212/200/346/234/257/344/270/216/346/212/200/350/203/275/351/242/204/346/265/213/345/214/205@3x.png +0 -0
  142. package/src/statics/icons/childIcons//344/275/223/347/263/273/346/236/266/346/236/204@3x.png +0 -0
  143. package/src/statics/icons/childIcons//344/275/234/346/210/230/350/247/206/350/247/222@3x.png +0 -0
  144. package/src/statics/icons/childIcons//345/205/250/346/231/257/350/247/206/350/247/222@3x.png +0 -0
  145. package/src/statics/icons/childIcons//345/205/254/345/217/270@3x.png +0 -0
  146. package/src/statics/icons/childIcons//345/215/217/350/256/256@3x.png +0 -0
  147. package/src/statics/icons/childIcons//345/215/217/350/256/256/345/261/202@3x.png +0 -0
  148. package/src/statics/icons/childIcons//345/215/217/350/256/256/346/240/210@3x.png +0 -0
  149. package/src/statics/icons/childIcons//345/221/275/344/273/244@3x.png +0 -0
  150. package/src/statics/icons/childIcons//346/210/230/347/225/245/346/246/202/345/277/265/350/241/250@3x.png +0 -0
  151. package/src/statics/icons/childIcons//346/216/247/345/210/266@3x.png +0 -0
  152. package/src/statics/icons/childIcons//346/224/257/346/214/201@3x.png +0 -0
  153. package/src/statics/icons/childIcons//346/225/260/346/215/256/344/277/241/346/201/257/350/247/206/350/247/222@3x.png +0 -0
  154. package/src/statics/icons/childIcons//346/234/215/345/212/241/350/247/206/350/247/222@3x.png +0 -0
  155. package/src/statics/icons/childIcons//346/240/207/345/207/206@3x.png +0 -0
  156. package/src/statics/icons/childIcons//346/240/207/345/207/206/350/247/206/350/247/222@3x.png +0 -0
  157. package/src/statics/icons/childIcons//347/263/273/347/273/237/350/247/206/350/247/222@3x.png +0 -0
  158. package/src/statics/icons/childIcons//350/203/275/345/212/233/350/247/206/350/247/222@3x.png +0 -0
  159. package/src/statics/icons/childIcons//351/241/271/347/233/256/350/247/206/350/247/222@3x.png +0 -0
  160. package/src/statics/icons/createMenu/down.png +0 -0
  161. package/src/statics/icons/createMenu/remove.png +0 -0
  162. package/src/statics/icons/createMenu/up.png +0 -0
  163. package/src/store/graphStore.ts +238 -45
  164. package/src/types/index.ts +87 -4
  165. package/src/utils/batchAutoExpand.ts +9 -10
  166. package/src/utils/containers.ts +72 -17
  167. package/src/utils/contextMenuUtils.ts +7 -7
  168. package/src/utils/dateUtils.ts +160 -0
  169. package/src/utils/diagram.ts +10 -8
  170. package/src/utils/drag.ts +6 -5
  171. package/src/utils/edgeUtils.ts +344 -427
  172. package/src/utils/edgeWorker.ts +471 -0
  173. package/src/utils/hittest.ts +37 -38
  174. package/src/utils/index.ts +3 -0
  175. package/src/utils/keyboardUtils.ts +5 -5
  176. package/src/utils/packageOutline.ts +96 -0
  177. package/src/utils/rafThrottle.ts +162 -0
  178. package/src/utils/workerManager.ts +335 -0
  179. package/src/view/graph.vue +47 -33
  180. /package/src/statics/icons/childIcons//346/210/230/347/225/{245@3x.png" → 245/345/261/202@3x.png"} +0 -0
@@ -0,0 +1,808 @@
1
+ <template>
2
+ <div class="matrix">
3
+
4
+ <!-- 矩阵表格:左侧行树(文件夹+方框 / 橙圆C+三角),表头仅 1-7,虚线层级 -->
5
+ <div class="matrix-table-wrap">
6
+ <table class="matrix-table">
7
+ <thead>
8
+ <tr v-for="(row, rowIndex) in columnHeaderRows" :key="rowIndex">
9
+ <!-- 表头角格:显示 relationModelIcon + relationModelName -->
10
+ <th
11
+ v-if="rowIndex === 0"
12
+ class="matrix-corner"
13
+ :rowspan="columnHeaderRows.length"
14
+ >
15
+ <div class="matrix-corner__header">
16
+ <template v-if="relationModelIcon">
17
+ <img
18
+ v-if="getIcon('childIcons', relationModelIcon)"
19
+ :src="getIcon('childIcons', relationModelIcon)"
20
+ alt=""
21
+ class="matrix-corner__icon-img"
22
+ />
23
+ <span v-else class="matrix-corner__icon">{{ relationModelIcon }}</span>
24
+ </template>
25
+ <span v-if="relationModelName" class="matrix-corner__name">{{ relationModelName }}</span>
26
+ </div>
27
+ </th>
28
+ <th
29
+ v-for="cell in row"
30
+ :key="cell.node.id"
31
+ :colspan="cell.colspan"
32
+ :rowspan="cell.rowspan"
33
+ class="matrix-col-header"
34
+ :class="{
35
+ 'matrix-col-header--parent': hasColumnChildren(cell.node) && cell.rowspan <= 1,
36
+ 'matrix-col-header--leaf': !hasColumnChildren(cell.node) && cell.rowspan <= 1,
37
+ 'matrix-col-header--spanning': cell.rowspan > 1,
38
+ 'matrix-col-header--root-vline': isRootSpanningCell(cell),
39
+ 'matrix-col-header--selected': selectedColumnId === cell.node.id,
40
+ }"
41
+ @click="onColumnHeaderClick(cell.node)"
42
+ >
43
+ <div v-if="!isRootSpanningCell(cell)" class="matrix-col-header__inner">
44
+ <!-- 有子节点:绿色文件夹 + 方框 −/+,可点击折叠 -->
45
+ <template v-if="hasColumnChildren(cell.node)">
46
+ <span
47
+ class="col-expand col-expand--square"
48
+ @click.stop="toggleColumn(cell.node)"
49
+ >
50
+ {{ columnExpandedIds.has(cell.node.id) ? '−' : '+' }}
51
+ </span>
52
+ <template v-if="cell.node.icon && getIcon('childIcons', cell.node.icon)">
53
+ <img :src="getIcon('childIcons', cell.node.icon)" alt="" class="col-node-icon col-node-icon--img" />
54
+ </template>
55
+ <span v-else class="col-node-icon col-node-icon--folder">
56
+ {{ columnExpandedIds.has(cell.node.id) ? '📂' : '📁' }}
57
+ </span>
58
+ <span class="col-node-label">{{ cell.node.nodeName }}</span>
59
+ </template>
60
+ <!-- 叶子:图标或黄圆 C -->
61
+ <template v-else>
62
+ <template v-if="cell.node.icon && getIcon('childIcons', cell.node.icon)">
63
+ <img :src="getIcon('childIcons', cell.node.icon)" alt="" class="col-node-icon col-node-icon--img" />
64
+ </template>
65
+ <span v-else class="col-node-icon col-node-icon--circle">C</span>
66
+ <span class="col-node-label">{{ cell.node.nodeName }}</span>
67
+ </template>
68
+ </div>
69
+ </th>
70
+ </tr>
71
+ </thead>
72
+ <tbody>
73
+ <tr
74
+ v-for="(item, rowIdx) in flatRowsWithConnectors"
75
+ :key="item.node.id"
76
+ :class="{ 'matrix-row--selected': selectedRowId === item.node.id }"
77
+ >
78
+ <td
79
+ class="matrix-row-header"
80
+ :class="{ 'matrix-row-header--selected': selectedRowId === item.node.id }"
81
+ @click="onRowHeaderClick(item.node)"
82
+ >
83
+ <div
84
+ class="row-tree-cell"
85
+ :style="{ paddingLeft: 8 + item.depth * 20 + 'px' }"
86
+ >
87
+ <!-- 树形连接线 -->
88
+ <template v-if="item.depth > 0">
89
+ <!-- 祖先层级的垂直虚线(depth 0 .. depth-2) -->
90
+ <template v-for="d in item.depth - 1" :key="'vl-' + d">
91
+ <div
92
+ v-if="item.connectors[d - 1]"
93
+ class="row-conn-vline"
94
+ :style="{ left: (16 + (d - 1) * 20) + 'px' }"
95
+ />
96
+ </template>
97
+ <!-- 父级分支连接:垂直线 + 水平线 -->
98
+ <div
99
+ class="row-conn-branch"
100
+ :class="{ 'row-conn-branch--last': !item.connectors[item.depth - 1] }"
101
+ :style="{ left: (16 + (item.depth - 1) * 20) + 'px', width: '12px' }"
102
+ />
103
+ </template>
104
+ <!-- 有子节点:方框展开 + 图标/文件夹 + 文字 -->
105
+ <template v-if="hasRowChildren(item.node)">
106
+ <span class="row-expand row-expand--square" @click.stop="toggleRow(item.node)">
107
+ {{ rowExpandedIds.has(item.node.id) ? '−' : '+' }}
108
+ </span>
109
+ <template v-if="item.node.icon && getIcon('childIcons', item.node.icon)">
110
+ <img :src="getIcon('childIcons', item.node.icon)" alt="" class="row-node-icon row-node-icon--img" />
111
+ </template>
112
+ <span v-else class="row-node-icon row-node-icon--folder">
113
+ {{ rowExpandedIds.has(item.node.id) ? '📂' : '📁' }}
114
+ </span>
115
+ <span class="row-node-label">{{ item.node.nodeName }}</span>
116
+ </template>
117
+ <!-- 叶子:占位 + 图标或橙圆 C + 文字 -->
118
+ <template v-else>
119
+ <span class="row-expand-placeholder" />
120
+ <template v-if="item.node.icon && getIcon('childIcons', item.node.icon)">
121
+ <img :src="getIcon('childIcons', item.node.icon)" alt="" class="row-node-icon row-node-icon--img" />
122
+ </template>
123
+ <span v-else class="row-node-icon row-node-icon--circle">C</span>
124
+ <span class="row-node-label">{{ item.node.nodeName }}</span>
125
+ </template>
126
+ </div>
127
+ </td>
128
+ <td
129
+ v-for="col in columnLeaves"
130
+ :key="col.id"
131
+ class="matrix-cell"
132
+ :class="{
133
+ 'matrix-cell--has-value': isLeafRow(item.node) && !!getCell(item.node.id, col.id) && shouldShowCell(item.node.id, col.id),
134
+ 'matrix-cell--disabled': getCell(item.node.id, col.id)?.operable === false,
135
+ 'matrix-cell--selected': selectedRowId === item.node.id && selectedColumnId === col.id,
136
+ }"
137
+ @click="onCellClick(item.node, col)"
138
+ @dblclick="onCellDblClick(item.node, col, getCell(item.node.id, col.id))"
139
+ >
140
+ <template v-if="isLeafRow(item.node) && getCell(item.node.id, col.id)">
141
+ <span v-if="hasDependencyRelation(getCell(item.node.id, col.id)!) && showDependency" class="cell-dependency" :class="{ 'cell-arrow--up': getCellArrowType(getCell(item.node.id, col.id)!) === 'ARROW_UP', 'cell-arrow--down': getCellArrowType(getCell(item.node.id, col.id)!) === 'ARROW_DOWN' }">{{ getCellDependencySymbol(getCell(item.node.id, col.id)!) }}</span>
142
+ <span v-else-if="!hasDependencyRelation(getCell(item.node.id, col.id)!) && getCell(item.node.id, col.id)?.value" class="cell-value">{{ getCell(item.node.id, col.id)?.value }}</span>
143
+ </template>
144
+ </td>
145
+ </tr>
146
+ </tbody>
147
+ </table>
148
+ </div>
149
+ </div>
150
+ </template>
151
+
152
+ <script setup lang="ts">
153
+ import { ref, computed, onMounted, onUnmounted } from 'vue'
154
+ import type { TreeNode, ColumnHeaderCell } from '../../types'
155
+ import type { Matrix } from '../../types'
156
+ import {
157
+ flattenRowTree,
158
+ getVisibleColumnNodesWithRoot,
159
+ getColumnHeaderRows,
160
+ getAllExpandableIds,
161
+ } from './index'
162
+ import type { ColHeaderCell } from './index'
163
+ import { eventBus } from '../../store/eventBus'
164
+ import { useGraphStore } from '../../store/graphStore'
165
+ import { getIcon } from '../../utils/iconLoader'
166
+
167
+ /** 当前选中的行 id、列 id(点击行头/列头/单元格时更新并通过 eventBus 发出) */
168
+ const selectedRowId = ref<string | null>(null)
169
+ const selectedColumnId = ref<string | null>(null)
170
+
171
+
172
+ const rowScope = ref('Model')
173
+ const columnScope = ref('Strategy')
174
+ const findText = ref('')
175
+ const showDependency = ref(true)
176
+
177
+ const graphStore = useGraphStore()
178
+ const emptyMatrix: Matrix = { rowTree: [], columnTree: [], crossData: [], relationModelIcon: '', relationModelName: '' }
179
+ const matrixData = ref<Matrix>({ ...emptyMatrix })
180
+
181
+ const relationModelIcon = computed(() => matrixData.value.relationModelIcon ?? '')
182
+ const relationModelName = computed(() => matrixData.value.relationModelName ?? '')
183
+
184
+ /** 数据更新后默认全部展开 */
185
+ function applyDataAndExpand(payload: Matrix): void {
186
+ matrixData.value = payload
187
+ rowExpandedIds.value = getAllExpandableIds(payload.rowTree)
188
+ columnExpandedIds.value = getAllExpandableIds(payload.columnTree)
189
+ }
190
+
191
+ /** 主项目通过 eventBus "matrix-data-change" 下发数据,payload 为 Matrix 类型 */
192
+ function onMatrixDataChange(payload: Matrix): void {
193
+ if (payload && Array.isArray(payload.rowTree) && Array.isArray(payload.columnTree) && Array.isArray(payload.crossData)) {
194
+ graphStore.setMatrixData(payload)
195
+ applyDataAndExpand(payload)
196
+ }
197
+ }
198
+
199
+ const handleMatrixDataChange = (payload: Matrix) => onMatrixDataChange(payload)
200
+ onMounted(() => {
201
+ eventBus.on('matrix-data-change', handleMatrixDataChange)
202
+ })
203
+ onUnmounted(() => {
204
+ eventBus.off('matrix-data-change', handleMatrixDataChange)
205
+ })
206
+ const rowTreeNodes = computed(() => matrixData.value.rowTree)
207
+ const columnTreeNodes = computed(() => matrixData.value.columnTree)
208
+ const matrixNodes = computed(() => matrixData.value.crossData)
209
+
210
+ // 展开状态:收到数据后默认全部展开,由 applyDataAndExpand 填充
211
+ const rowExpandedIds = ref(new Set<string>())
212
+ const columnExpandedIds = ref(new Set<string>())
213
+
214
+ const flattenedRows = computed(() =>
215
+ flattenRowTree(rowTreeNodes.value, rowExpandedIds.value)
216
+ )
217
+ /** 列数据列:单根展开时第一列为根(战略层),后续列为叶子(能力),与行侧对齐 */
218
+ const treeColumnNodes = computed(() =>
219
+ getVisibleColumnNodesWithRoot(columnTreeNodes.value, columnExpandedIds.value)
220
+ )
221
+ /** 实际数据列 = 列树中可见的列节点 */
222
+ const columnLeaves = computed(() => treeColumnNodes.value)
223
+ /** 列头多行:getColumnHeaderRows 自动处理任意层级树 */
224
+ const columnHeaderRowsBase = computed(() =>
225
+ getColumnHeaderRows(columnTreeNodes.value, columnExpandedIds.value)
226
+ )
227
+ const columnHeaderRows = computed((): ColHeaderCell[][] => {
228
+ const base = columnHeaderRowsBase.value
229
+
230
+ const nodes = columnTreeNodes.value
231
+ const rootIncluded = nodes.length === 1
232
+ && !!(nodes[0].children?.length)
233
+ && columnExpandedIds.value.has(nodes[0].id)
234
+
235
+ if (!rootIncluded || base.length <= 1) return base
236
+
237
+ const rootNode = nodes[0]
238
+ return base.map((row, ri) => {
239
+ if (ri === 0) {
240
+ return row.map((cell, ci) =>
241
+ ci === 0 ? { ...cell, colspan: cell.colspan + 1 } : cell
242
+ )
243
+ } else if (ri === 1) {
244
+ const rootCell: ColHeaderCell = {
245
+ node: rootNode,
246
+ colspan: 1,
247
+ rowspan: base.length - 1,
248
+ }
249
+ return [rootCell, ...row]
250
+ }
251
+ return row
252
+ })
253
+ })
254
+
255
+ /** 行树连接器:计算每行在每个祖先深度是否还有后续兄弟(用于画 │ 或 └) */
256
+ const flatRowsWithConnectors = computed(() => {
257
+ const items = flattenedRows.value
258
+ return items.map((item, i) => {
259
+ const { depth } = item
260
+ const connectors: boolean[] = []
261
+ for (let d = 0; d < depth; d++) {
262
+ let hasNext = false
263
+ for (let j = i + 1; j < items.length; j++) {
264
+ if (items[j].depth <= d) break
265
+ if (items[j].depth === d + 1) { hasNext = true; break }
266
+ }
267
+ connectors.push(hasNext)
268
+ }
269
+ return { ...item, connectors }
270
+ })
271
+ })
272
+
273
+ function getRowId(n: ColumnHeaderCell): string {
274
+ return n.rowNodeId ?? ''
275
+ }
276
+ function getColumnId(n: ColumnHeaderCell): string {
277
+ return n.columnNodeId ?? ''
278
+ }
279
+
280
+ const cellMap = computed(() => {
281
+ const map: Record<string, Record<string, ColumnHeaderCell>> = {}
282
+ for (const n of matrixNodes.value) {
283
+ const rowId = getRowId(n)
284
+ const colId = getColumnId(n)
285
+ if (!rowId || !colId) continue
286
+ if (!map[rowId]) map[rowId] = {}
287
+ map[rowId][colId] = n
288
+ }
289
+ return map
290
+ })
291
+
292
+ function getCell(rowId: string, colId: string): ColumnHeaderCell | undefined {
293
+ return cellMap.value[rowId]?.[colId]
294
+ }
295
+
296
+ function hasDependencyRelation(cell: ColumnHeaderCell): boolean {
297
+ return cell.relations?.some((r) => r.type === 'Dependency' || r.relationType === 'Dependency') ?? false
298
+ }
299
+
300
+ /** 取单元格依赖关系的箭头类型:ARROW_UP → 斜向上 ↗,ARROW_DOWN → 斜向下 ↘ */
301
+ function getCellArrowType(cell: ColumnHeaderCell): 'ARROW_UP' | 'ARROW_DOWN' | null {
302
+ const r = cell.relations?.[0]
303
+ if (!r || (r.relationType !== 'ARROW_UP' && r.relationType !== 'ARROW_DOWN')) return null
304
+ return r.relationType as 'ARROW_UP' | 'ARROW_DOWN'
305
+ }
306
+
307
+ /** 依赖单元格显示符号:ARROW_UP ↗,ARROW_DOWN ↘,否则 √ */
308
+ function getCellDependencySymbol(cell: ColumnHeaderCell): string {
309
+ const arrow = getCellArrowType(cell)
310
+ if (arrow === 'ARROW_UP') return '↗'
311
+ if (arrow === 'ARROW_DOWN') return '↘'
312
+ return '√'
313
+ }
314
+
315
+ function shouldShowCell(rowId: string, colId: string): boolean {
316
+ const cell = getCell(rowId, colId)
317
+ if (!cell) return false
318
+ if (hasDependencyRelation(cell)) return showDependency.value
319
+ return !!cell.value
320
+ }
321
+
322
+ function hasRowChildren(node: TreeNode): boolean {
323
+ return !!(node.children && node.children.length > 0)
324
+ }
325
+
326
+ function isLeafRow(node: TreeNode): boolean {
327
+ return !!node.isLeaf || !node.children?.length
328
+ }
329
+
330
+ function toggleRow(node: TreeNode): void {
331
+ const next = new Set(rowExpandedIds.value)
332
+ if (next.has(node.id)) next.delete(node.id)
333
+ else next.add(node.id)
334
+ rowExpandedIds.value = next
335
+ }
336
+
337
+ function hasColumnChildren(node: TreeNode): boolean {
338
+ return !!(node.children && node.children.length > 0)
339
+ }
340
+
341
+ function isRootSpanningCell(cell: ColHeaderCell): boolean {
342
+ const nodes = columnTreeNodes.value
343
+ if (nodes.length !== 1) return false
344
+ return cell.node.id === nodes[0].id && cell.colspan === 1
345
+ }
346
+
347
+ function toggleColumn(node: TreeNode): void {
348
+ const next = new Set(columnExpandedIds.value)
349
+ if (next.has(node.id)) next.delete(node.id)
350
+ else next.add(node.id)
351
+ columnExpandedIds.value = next
352
+ }
353
+
354
+ /** 点击行头:选中行,eventBus row-selected */
355
+ function onRowHeaderClick(node: TreeNode): void {
356
+ selectedRowId.value = node.id
357
+ selectedColumnId.value = null
358
+ eventBus.emit('row-selected', node.id)
359
+ }
360
+
361
+ /** 点击列头:选中列,eventBus column-selected(角格不绑此逻辑,由上面 v-if 排除) */
362
+ function onColumnHeaderClick(node: TreeNode): void {
363
+ selectedRowId.value = null
364
+ selectedColumnId.value = node.id
365
+ eventBus.emit('column-selected', node.id)
366
+ }
367
+
368
+ /** 点击单元格:选中该行+该列,eventBus cell-selected(relationId 取自 cell.relations) */
369
+ function onCellClick(rowNode: TreeNode, colNode: TreeNode): void {
370
+ const cell = getCell(rowNode.id, colNode.id)
371
+ const relationId = cell?.relations?.[0]?.relationId ?? ''
372
+ selectedRowId.value = rowNode.id
373
+ selectedColumnId.value = colNode.id
374
+ eventBus.emit('cell-selected', { rowId: rowNode.id, columnId: colNode.id, relationId })
375
+ }
376
+
377
+ function onCellDblClick(rowNode: TreeNode, colNode: TreeNode, cell: ColumnHeaderCell | undefined): void {
378
+ if (!cell || cell.operable === false) return
379
+ const hasRelations = cell.relations && cell.relations.length > 0
380
+ eventBus.emit('cell-db-click', {
381
+ columnNodeId: getColumnId(cell),
382
+ rowNodeId: getRowId(cell),
383
+ relationId: cell.relations?.[0]?.relationId ?? '',
384
+ operateType: hasRelations ? 'OPERATE_TYPE_DELETE' : 'OPERATE_TYPE_ADD',
385
+ })
386
+ }
387
+
388
+ /** 供主项目通过 ref 调用:直接设置矩阵数据 */
389
+ function setMatrixData(data: Matrix): void {
390
+ if (data?.rowTree && data?.columnTree && data?.crossData) {
391
+ applyDataAndExpand(data)
392
+ }
393
+ }
394
+
395
+ defineExpose({ setMatrixData })
396
+ </script>
397
+
398
+ <style scoped lang="scss">
399
+ .matrix {
400
+ width: 100%;
401
+ height: 100%;
402
+ display: flex;
403
+ flex-direction: column;
404
+ overflow: hidden;
405
+ background: #fff;
406
+ }
407
+
408
+ .matrix-header {
409
+ padding: 8px 12px;
410
+ border-bottom: 1px solid #e8e8e8;
411
+ display: flex;
412
+ align-items: center;
413
+ gap: 8px;
414
+
415
+ .matrix-header-left {
416
+ display: flex;
417
+ align-items: center;
418
+ gap: 6px;
419
+ }
420
+
421
+ .matrix-header-title {
422
+ font-weight: 600;
423
+ font-size: 14px;
424
+ }
425
+
426
+ .matrix-header-icon {
427
+ display: inline-flex;
428
+ align-items: center;
429
+ cursor: pointer;
430
+ color: #606266;
431
+ font-size: 14px;
432
+ padding: 2px 4px;
433
+ border: 1px solid #dcdfe6;
434
+ border-radius: 4px;
435
+
436
+ .icon-grids {
437
+ margin-right: 2px;
438
+ }
439
+ .icon-arrow {
440
+ font-size: 10px;
441
+ opacity: 0.8;
442
+ }
443
+ }
444
+ }
445
+
446
+ .matrix-toolbar {
447
+ display: flex;
448
+ align-items: center;
449
+ justify-content: space-between;
450
+ padding: 8px 12px;
451
+ border-bottom: 1px solid #e8e8e8;
452
+ flex-shrink: 0;
453
+ }
454
+
455
+ .matrix-criteria {
456
+ display: flex;
457
+ align-items: center;
458
+ gap: 8px;
459
+
460
+ .criteria-label {
461
+ font-size: 12px;
462
+ color: #666;
463
+ }
464
+
465
+ .criteria-select {
466
+ width: 120px;
467
+ }
468
+
469
+ .find-input {
470
+ width: 160px;
471
+ }
472
+
473
+ .criteria-checkbox {
474
+ font-size: 12px;
475
+ color: #606266;
476
+ }
477
+ }
478
+
479
+ .matrix-table-wrap {
480
+ flex: 1;
481
+ overflow: auto;
482
+ padding: 12px;
483
+ }
484
+
485
+ .matrix-table {
486
+ border-collapse: collapse;
487
+ min-width: 100%;
488
+ font-size: 12px;
489
+
490
+ th,
491
+ td {
492
+ border: none;
493
+ padding: 6px 8px;
494
+ vertical-align: middle;
495
+ }
496
+
497
+ .matrix-corner {
498
+ min-width: 140px;
499
+ width: 140px;
500
+ background: #fff;
501
+ border-right: 1px solid #d0d0d0;
502
+ border-bottom: 1px solid #d0d0d0;
503
+ vertical-align: middle;
504
+
505
+ .matrix-corner__header {
506
+ display: inline-flex;
507
+ align-items: center;
508
+ gap: 6px;
509
+ padding: 4px 0;
510
+ }
511
+ .matrix-corner__icon-img {
512
+ width: 16px;
513
+ height: 16px;
514
+ display: block;
515
+ flex-shrink: 0;
516
+ }
517
+ .matrix-corner__icon {
518
+ width: 18px;
519
+ height: 18px;
520
+ border-radius: 50%;
521
+ background: #f0c000;
522
+ color: #333;
523
+ display: inline-flex;
524
+ align-items: center;
525
+ justify-content: center;
526
+ font-size: 10px;
527
+ font-weight: bold;
528
+ flex-shrink: 0;
529
+ }
530
+ .matrix-corner__name {
531
+ font-size: 12px;
532
+ color: #303133;
533
+ overflow: hidden;
534
+ text-overflow: ellipsis;
535
+ white-space: nowrap;
536
+ }
537
+ }
538
+
539
+ .matrix-col-header {
540
+ min-width: 48px;
541
+ text-align: left;
542
+ background: #fff;
543
+ font-weight: 500;
544
+ font-size: 12px;
545
+ color: #303133;
546
+ vertical-align: middle;
547
+ cursor: pointer;
548
+
549
+ .matrix-col-header__inner {
550
+ display: inline-flex;
551
+ align-items: center;
552
+ gap: 6px;
553
+ min-height: 28px;
554
+ }
555
+
556
+ &.matrix-col-header--parent {
557
+ border-bottom: 1px dashed #999;
558
+ .col-expand--square {
559
+ width: 16px;
560
+ height: 16px;
561
+ border: 1px solid #c0c4cc;
562
+ border-radius: 2px;
563
+ display: inline-flex;
564
+ align-items: center;
565
+ justify-content: center;
566
+ cursor: pointer;
567
+ font-size: 12px;
568
+ color: #606266;
569
+ flex-shrink: 0;
570
+ }
571
+ .col-node-icon--folder {
572
+ flex-shrink: 0;
573
+ font-size: 14px;
574
+ }
575
+ }
576
+
577
+ .col-node-icon--img {
578
+ width: 16px;
579
+ height: 16px;
580
+ display: block;
581
+ flex-shrink: 0;
582
+ }
583
+ .col-node-icon--circle {
584
+ width: 18px;
585
+ height: 18px;
586
+ border-radius: 50%;
587
+ background: #f0c000;
588
+ color: #333;
589
+ display: inline-flex;
590
+ align-items: center;
591
+ justify-content: center;
592
+ font-size: 10px;
593
+ font-weight: bold;
594
+ flex-shrink: 0;
595
+ }
596
+
597
+ &.matrix-col-header--leaf {
598
+ text-align: center;
599
+ position: relative;
600
+ padding-top: 14px;
601
+ border-bottom: 1px solid #d0d0d0;
602
+ /* 第二列等叶子列:列名(能力)在单元格正中间,对齐红框位置 */
603
+ .matrix-col-header__inner {
604
+ justify-content: center;
605
+ margin: 0 auto;
606
+ }
607
+ &::before {
608
+ content: '';
609
+ position: absolute;
610
+ left: 50%;
611
+ top: 0;
612
+ height: 14px;
613
+ width: 0;
614
+ border-left: 1px dashed #333;
615
+ }
616
+ }
617
+
618
+ &.matrix-col-header--spanning {
619
+ vertical-align: bottom;
620
+ text-align: center;
621
+ position: relative;
622
+ padding-top: 14px;
623
+ border-bottom: 1px solid #d0d0d0;
624
+ &::before {
625
+ content: '';
626
+ position: absolute;
627
+ left: 50%;
628
+ top: 0;
629
+ height: calc(100% - 30px);
630
+ width: 0;
631
+ border-left: 1px dashed #333;
632
+ }
633
+ }
634
+
635
+ &.matrix-col-header--root-vline {
636
+ padding: 0;
637
+ border-bottom: 1px solid #d0d0d0;
638
+ position: relative;
639
+ &::before {
640
+ content: '';
641
+ position: absolute;
642
+ left: 50%;
643
+ top: 0;
644
+ bottom: 0;
645
+ width: 0;
646
+ border-left: 1px dashed #333;
647
+ }
648
+ }
649
+
650
+ .col-node-label {
651
+ color: #303133;
652
+ }
653
+ }
654
+
655
+ .matrix-row-header {
656
+ min-width: 200px;
657
+ background: #fff;
658
+ padding: 0px 10px;
659
+ vertical-align: middle;
660
+ border-right: 1px solid #d0d0d0;
661
+ cursor: pointer;
662
+
663
+ &.matrix-row-header--selected {
664
+ background: #e6f7ff;
665
+ }
666
+ }
667
+
668
+ tr.matrix-row--selected .matrix-cell {
669
+ background: #e6f7ff;
670
+ }
671
+
672
+ .matrix-col-header.matrix-col-header--selected {
673
+ background: #e6f7ff;
674
+ }
675
+
676
+ .matrix-cell.matrix-cell--selected {
677
+ background: #bae7ff;
678
+ }
679
+
680
+ .matrix-row-header .row-tree-cell {
681
+ position: relative;
682
+ display: flex;
683
+ align-items: center;
684
+ min-height: 28px;
685
+ font-size: 12px;
686
+ gap: 6px;
687
+ }
688
+
689
+ /* 祖先层级的垂直虚线(贯穿整行高度) */
690
+ .row-conn-vline {
691
+ position: absolute;
692
+ top: 0;
693
+ bottom: 0;
694
+ width: 0;
695
+ border-left: 1px dashed #999;
696
+ pointer-events: none;
697
+ }
698
+
699
+ /* 父级分支连接:垂直线 + 水平线 */
700
+ .row-conn-branch {
701
+ position: absolute;
702
+ top: 0;
703
+ bottom: 0;
704
+ pointer-events: none;
705
+ &::before {
706
+ content: '';
707
+ position: absolute;
708
+ left: 0;
709
+ top: 0;
710
+ bottom: 0;
711
+ border-left: 1px dashed #999;
712
+ }
713
+ &::after {
714
+ content: '';
715
+ position: absolute;
716
+ left: 0;
717
+ top: 50%;
718
+ right: 0;
719
+ border-top: 1px dashed #999;
720
+ }
721
+ &.row-conn-branch--last::before {
722
+ bottom: 50%;
723
+ }
724
+ }
725
+ .row-expand {
726
+ width: 16px;
727
+ height: 16px;
728
+ flex-shrink: 0;
729
+ display: inline-flex;
730
+ align-items: center;
731
+ justify-content: center;
732
+ cursor: pointer;
733
+ line-height: 1;
734
+ &.row-expand--square {
735
+ border: 1px solid #c0c4cc;
736
+ border-radius: 2px;
737
+ font-size: 12px;
738
+ color: #606266;
739
+ background: #fff;
740
+ }
741
+ }
742
+ .row-expand-placeholder {
743
+ width: 16px;
744
+ flex-shrink: 0;
745
+ }
746
+ .row-node-icon--folder {
747
+ flex-shrink: 0;
748
+ font-size: 14px;
749
+ }
750
+ .row-node-icon--img {
751
+ width: 16px;
752
+ height: 16px;
753
+ display: block;
754
+ flex-shrink: 0;
755
+ }
756
+ .row-node-icon--circle {
757
+ width: 18px;
758
+ height: 18px;
759
+ border-radius: 50%;
760
+ background: #e6a23c;
761
+ color: #fff;
762
+ display: inline-flex;
763
+ align-items: center;
764
+ justify-content: center;
765
+ font-size: 10px;
766
+ font-weight: bold;
767
+ flex-shrink: 0;
768
+ }
769
+ .row-node-label {
770
+ color: #303133;
771
+ }
772
+
773
+ .matrix-cell {
774
+ min-width: 48px;
775
+ text-align: center;
776
+ color: #303133;
777
+ background: #fff;
778
+ border: 1px solid #d0d0d0;
779
+ cursor: pointer;
780
+
781
+ &.matrix-cell--has-value {
782
+ background: #e6f7ff;
783
+ }
784
+
785
+ &.matrix-cell--disabled {
786
+ background: #f5f5f5;
787
+ color: #c0c4cc;
788
+ cursor: not-allowed;
789
+ }
790
+
791
+ .cell-dependency {
792
+ color: #1890ff;
793
+ font-weight: bold;
794
+ font-size: 14px;
795
+
796
+ &.cell-arrow--up,
797
+ &.cell-arrow--down {
798
+ font-size: 16px;
799
+ font-weight: bold;
800
+ }
801
+ }
802
+
803
+ .cell-value {
804
+ font-weight: 500;
805
+ }
806
+ }
807
+ }
808
+ </style>