From 6bbe5ad30db5a3aa2894f66e75bbce5495be0291 Mon Sep 17 00:00:00 2001 From: Syngnat Date: Sun, 14 Jun 2026 14:43:03 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(database-icons):=20=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E6=95=B0=E6=8D=AE=E6=BA=90=E5=AE=98=E6=96=B9=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E5=B9=B6=E4=BF=AE=E6=AD=A3=E9=80=8F=E6=98=8E=E5=BA=95?= =?UTF-8?q?=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为 OceanBase、GaussDB、GoldenDB、Kafka、RocketMQ 等数据源替换官方品牌资源 - 扩展 DatabaseIcons 对 svg/png/ico 的统一加载与底色边框控制 - 补充图标资源断言测试并移除未使用的字母块 fallback --- frontend/public/db-icons/chroma.svg | 8 +- frontend/public/db-icons/dameng.png | Bin 0 -> 5231 bytes frontend/public/db-icons/gaussdb.ico | Bin 0 -> 38078 bytes frontend/public/db-icons/gaussdb.svg | 7 - frontend/public/db-icons/goldendb.ico | Bin 0 -> 3126 bytes frontend/public/db-icons/goldendb.svg | 6 - frontend/public/db-icons/highgo.ico | Bin 0 -> 16958 bytes frontend/public/db-icons/iotdb.svg | 62 +++++- frontend/public/db-icons/iris.png | Bin 0 -> 6448 bytes frontend/public/db-icons/jvm.ico | Bin 0 -> 1150 bytes frontend/public/db-icons/kafka.png | Bin 0 -> 3233 bytes frontend/public/db-icons/kafka.svg | 11 -- frontend/public/db-icons/kingbase.ico | Bin 0 -> 9662 bytes frontend/public/db-icons/mqtt.svg | 42 +++- frontend/public/db-icons/oceanbase.png | Bin 0 -> 4362 bytes frontend/public/db-icons/opengauss.ico | Bin 0 -> 4286 bytes frontend/public/db-icons/oracle.ico | Bin 0 -> 15406 bytes frontend/public/db-icons/qdrant.svg | 42 +++- frontend/public/db-icons/rocketmq.png | Bin 0 -> 45203 bytes frontend/public/db-icons/rocketmq.svg | 6 - frontend/public/db-icons/starrocks.png | Bin 0 -> 1724 bytes frontend/public/db-icons/tdengine.ico | Bin 0 -> 15086 bytes frontend/public/db-icons/vastbase.svg | 72 +++++++ .../src/components/DatabaseIcons.test.tsx | 117 ++++------- frontend/src/components/DatabaseIcons.tsx | 187 ++++++++++-------- 25 files changed, 339 insertions(+), 221 deletions(-) create mode 100644 frontend/public/db-icons/dameng.png create mode 100644 frontend/public/db-icons/gaussdb.ico delete mode 100644 frontend/public/db-icons/gaussdb.svg create mode 100644 frontend/public/db-icons/goldendb.ico delete mode 100644 frontend/public/db-icons/goldendb.svg create mode 100644 frontend/public/db-icons/highgo.ico create mode 100644 frontend/public/db-icons/iris.png create mode 100644 frontend/public/db-icons/jvm.ico create mode 100644 frontend/public/db-icons/kafka.png delete mode 100644 frontend/public/db-icons/kafka.svg create mode 100644 frontend/public/db-icons/kingbase.ico create mode 100644 frontend/public/db-icons/oceanbase.png create mode 100644 frontend/public/db-icons/opengauss.ico create mode 100644 frontend/public/db-icons/oracle.ico create mode 100644 frontend/public/db-icons/rocketmq.png delete mode 100644 frontend/public/db-icons/rocketmq.svg create mode 100644 frontend/public/db-icons/starrocks.png create mode 100644 frontend/public/db-icons/tdengine.ico create mode 100644 frontend/public/db-icons/vastbase.svg diff --git a/frontend/public/db-icons/chroma.svg b/frontend/public/db-icons/chroma.svg index 1a22d29..0d190a4 100644 --- a/frontend/public/db-icons/chroma.svg +++ b/frontend/public/db-icons/chroma.svg @@ -1,7 +1 @@ - - Chroma - - - - - + diff --git a/frontend/public/db-icons/dameng.png b/frontend/public/db-icons/dameng.png new file mode 100644 index 0000000000000000000000000000000000000000..ba44acbcafa0c773a1d45b84b5f9937c4edd62f9 GIT binary patch literal 5231 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 - GaussDB - - - - - diff --git a/frontend/public/db-icons/goldendb.ico b/frontend/public/db-icons/goldendb.ico new file mode 100644 index 0000000000000000000000000000000000000000..74d3adba40e082e8e40aeb841c9104787ba09bf1 GIT binary patch literal 3126 zcmb`JJ8M)?6on_Xb~cul{(}4fd;f%>AQmHvWPZpbd9dTfWGlzZlW9_xqxp$In+s8L{)<5IyTlsGJ^BwDK#^OVK z(+0mfI%EBnuY1lv+;Qr`$QQ7JAG+4NI=eXX1+2_Z-hK1@<62{N-z_&h9GAa*|25!4 zv=M>uu$t_jm}!7`q%Tka)@bnC{PB=KIlt5x0i5anN}DRMw5H_SkDqA~d<;rJYlMPB z6*-ENhvE3`7x!L&P6>8ngo>{XH}gFP|3ddYwH|pSU;;QE7VSuuHa2&fjujtnL?ds- zSKA{u=ToTRP|Cs%H&u;9C+@tG189^ORfLKUThcOGTYr)j4f13<&IGep`RorVD7^BLk+L{NY1d`+g~>B(&8Z9G`!cVV`*1$9eF|EH=te)xZw| zh9U2w`mxnN+R~2hY6U*9$*=hMDamqPW{d~J(NYdis&di0&Q9&SG@U3$#fMdeYU87Z zQd9(O#-tYVdoMl$CkYilPK|%)!&6b2#OAT2#m>`Hhp*4+lq62j{)*rBGeQKR@IO}@ z2dQgqeSX3OS=#GH??VVH0!KzpRSas;+)0ywyxv0Iok|0nA1h>`3Y_3`_4y?Ue%lb! zVSxgt&7UeMHSo#zG0y7~VhE00%FZr-qTmdgBDEU4dMQUh7}j;`>5@&O65Pn=h+H*O z`^^2fENlpfk4*{uIffw~KIjHGtG<|qau*)6GoWt)uoa&K|CFQ!@{$0!`66)X6as=D z8|fg1ho! - GoldenDB - - - - diff --git a/frontend/public/db-icons/highgo.ico b/frontend/public/db-icons/highgo.ico new file mode 100644 index 0000000000000000000000000000000000000000..5a56dc04e9d231ee103d517d0ff01f7233e3fabe GIT binary patch literal 16958 zcmeHMX-rjD5Wa#DaIG~pwG_o2w`hz-ji3ZHn4(rt(Z(g(N)r`-XpM=r?)w%sQNe{K zqPTC=6}SGVFZpG~L56zz8h*is(cCZ$Kh+e=Sg0EKOhJ_|>ytET1T+E~0gZr0KqH_L&73Pr?EMk z^Y0iJ|KOuES7USLk0U#dcw* z?%lf`&Ix8tP7VbH1+g6blQwMFF!lj5*0qv2H*em|vhWKeeC}8tg88y#%UHfag9dc_ z_HC9xY*yP~_U_%ATC`|ku|Nd;;1~P^g@uJtlO|2*@ZrPEkB*LJe*5hX(DPo6v>cXxN{)vFiJArJWF=jTTa z8#d(q0lw%+oUyU7Y(-@y z{rb_UQKMKMIg*;1%HLzgjG;b#`cSJ@t(?X$xF;tkv+m59GkFf=8P*9TxpU{v9qx;c z#8R91VL~pUn>KACA0HoT)Tj~XJ910Tmu=g&u^#&4#*O1| zoRPC<&*pFJm7YC&y0rchOJ-&!ufP8%{-!VT(Wz4>LayfIJZF~p|2FZ94t&I!iM5T3 zi(|XEpFmkzSrio&#bX%98smHeJ$(3(`S1yZ{KwuzjzD(g$dSxP?zd^v=C$=tNJ!vu z;00fBM@mkQA3vULeDUREO1u3l{gRTZ?y1qt!(9M^jx^aHTefUr8E5-naD!gAZrxZ1 z{)5Da>({T7r>7^64GIpV@FAi6jo40|I>r9tERypdXEW{-0G$oM=PU97RQij#QY3`ww!?;+M5wym&FoBhHMB47MS)O6cIqcoX8| zDD4?h@>8M<=aX2zP20An57<9v&z|KopkBRtg!2z;ihY2F+`+jedrHoKoP)Rnab}|q z*{X6WGxLdQH)6Y;jG$Nw`+N$8Myfj_IF6$B6`SJ^9y}oAJ8};;_UzeXp1W^~U-As= zCb%M})6&xD;K74z|LN1GYOD?o85}~XD%Bdy$|K{eKj?={qM6Z^_c!Ek-n?nr5Lt+LB%V2)!(?6 zK(dzHsd~uXNB*L=Lfr!2P~XAMk|j$hJ3E`dCyWlKA5|G+Ow1x9GLsJ8C0g?B*E|ON zP(!X*v4U2uTE%bFJ(x2+J)Pjgnl)?qjdN1=+?g|HXu*O7Tq9vz8f@JE{Q-NKl3A|e ze@3Ifv#CDnLsds^vZ?r=)BWd_wQYL(Z?tmd%Gd0mzC^tMlC|cJL=n zr=hVb7sh5&Sd3k%RQ|qjq-*6ln@i3)tTk#otUYQhA>4o9xx2a3H?yK?`GVOh_V<~$ ze*JnD!|w)JSDdA?-w*@(;sfRo!o1KygM3YE^ho`T2;QvnU|K#I(fRc0wo=Nf;pl@6 zv59w0HpK_LC4S@p;>5j*oCZl8IM=#X-4BpKEx&VTWl|OwmvC(p930H`4l7paO5DHz z`GndL`yN!?H=LEI_j7GF{vC$1KPM-bitM>$&$rRlbQ>jSs5$w3_<`bi zG0)TMFPZxF>$7e61rpobdBa2E$2|?-P@m)80*PPN`WF~^DPJTOsehpZT*Qx7s?J5d zIAX*IQxjryqbIUpc_0@PSQ zfXD>$?}VhJB(^U$x#PkEzTmDrbm)+&FaF_P$JxGm^=dOd{7%MsEqKcmckkXM)cS%C z-uPR#5Jp`ms|!#B={ z>b^kVkqyXK$I?27d_%_Cz;~o4Jgcnm#MVFg7F?`({;vMigzdZ9t&P6m?TXI7X+2!= xSIcMwGy)m{jetf#BcKt`2xtT}0vZ90fJQ(gpb^jrXaxQX2&liwYx*A}@F%s*yJ-Lb literal 0 HcmV?d00001 diff --git a/frontend/public/db-icons/iotdb.svg b/frontend/public/db-icons/iotdb.svg index 4d1b940..d742630 100644 --- a/frontend/public/db-icons/iotdb.svg +++ b/frontend/public/db-icons/iotdb.svg @@ -1,7 +1,57 @@ - - Apache IoTDB - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/db-icons/iris.png b/frontend/public/db-icons/iris.png new file mode 100644 index 0000000000000000000000000000000000000000..048b3111bd5db0dee0154ac7bbe2e6ba28106346 GIT binary patch literal 6448 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

S+lx9t(Ru4Vro$u1tOB z{=|KuYy8_-?9asX^BYv84*ko>aMBM|8-?u~abCWZRt^!ql&VMX5-?zo$uE|U7*;YX-=jn6%?JA0HmxtBMz=|70 zETh{Ohv`&ft#C(M+C8+lxwIfYj=ZA!>9;Fj`466Ttgp&U>tdDc{yf;BLfV@M7p;oe z@?@O`A_s9PZbaJWus9JS*EUPx18>wq%%SeX^+rxbY|LaCc1&_v;X- zZ*`j)X#S@uin+xn8GyIKXVSpq2iwkT;xrvhpv^3DaaA|ZY-kWpbHE&vJ(t-0UKp^H zQr17ug!N#d)nhBm(9x>1& zPDS}^rJH^c=z81O$SSzKQkRiZ7PWP#c8Eo+1sapBY`yGGgDyD42|>eqT}#V93CnQI zXa^X}qM0)c6it3E7BaexcdEIto&DL$8;QW_wE3crUZ(W)eRyka5nzSi`Ke};o0nZZ zOM;0uX~8z}w7i^A=iXbXeFN2MF&`0gl9zlG4fLOb+qkhL5(8d0*%yHf=7iWfr$@!G zKTG1GlqI>WDqq-mu-ODmWwz9wL$~`htR^VX>VLCP6`CL})!apsHu@vbB%eR7MhH68 zK#@t>4rPH1ZPc>65)+FC!rjZmjgX9Xl~iP^P0iWDX&Ywy9N_7h3HZtecrk+NWD;hFQ*JCVE2cxU&KpxbXJKO$4JA^Ox6qa+?Hf6M_{q{)YCgPUVXQQt0Sk{%i z>bR3e8d_IKR0FSIA39fe-5|n}g9K6ih8Tk` zUxz2=%Y~mzSA?{f=+U-h1C^E5@|A1zngvrN~zRIh#KW)+d zXE?%`bSt7y<*3Y?uUavfAj>!m{UHmR#w&^TNgoP2QOQtwG8Txk7ABk zw37iSsPVbpC}sw0G{?9sMW2+D_SJM5PBpX;kY)A#vY!%1%pAph1&PR z@i%TZLQk&WNAb~a5D`YRi4hdC#oRv)p?9TgU`M+o)@4fBbYY#)UvZK% zZe5zWA?>iZZe2Ru6G=4FeA<2+U`{)91b%77Z>5<^82+qx@VT#3rxC_c9En!6ORN4w zvuflodTx{6N!GJ5B2yl1hg4%hN~5&WutZ`4f)q6?Lap-ov=bd)^yCSMO-=JgSI(wU z{PTSk)<{yRAvqiI!{R`P%6sFrXK`nCxpGj&U=K7jKSOr3kuE)e0tA zx88o$?YVj#4qJ0*I(w1#?yYppI{6cLo!$U8m^9+~^ScbE97B^M6;zqLy6|d?FdOQx z7b!Qu9ou+u{=l@KQDu&$z)?gB75Pu6Hr38iMY|ab%G!(F#;z zY8&ojV$}aF(;3Q9`j8p?+FYpz~SSe_AD~SF`|=IN_mdox-K&Suclz`=R@keL)IZ8 z^r!Z5_LXm>d)4cj7wD}Ixv~0}jEAJVh+!`;DUMuK+G~|+icjeGUeYIW?yi7gDI%Q_o>uea!t3NjhqDUhb(voZSa>JNSqJCf8uLwAfKW26aP{fR5T?1E8>8o>Y0L( z=^9P*w2tGu@rA42d>-S|rNli$%Pw>wgmPqj-f<`!ixnpL#)oYXi&}S$XQ_3qam0fY zGU@-HDZXy0#;np!nA@#2Tq6SkQ>crH zHvCkSW|Kis^T;06RHbcz?9bj(El;B}8F9wa3n!{{WIkEioR#nXuHzENGv?OQ zj;`Js3o39ycK>&Ms=5JhoobB$Swm|rCYe@__dUe-f_)=X7S$lJ0Va; zR1-?Y=4ghGY9Bcexw$7aei=pA>P?gFjhqz;V(~GYRUzN~{*+>wKZK1rb(+=oxhn zs%KmQz7)QZI9|D{pqcWrT4&?Lb%e-wFh*J#JS$t7Z^Kh~XuFZb%W8q97Bp z1$pMVaQ@z^l{4W4g0pcpR8AG<*H7T=u6)fZWOHjrnRD}5enJuxZK^(i$m|G1rw=V! z%huF&b**6b;4S*$>^Smq*Z4pU{nvcI_a*PAPCZVC59IMILG*wy;?H`hnjS9Q-DUs( zb{Nh!r}sV15q~hsZ>_$r63e#KaWD7G0t`th|C~F=wscuL{B9cON3DZldO#-NvC`%1 zg(k&NZ#lGcKF*~FE9I2;u3@0jWe#E5ZXPc&g4*KL#rn>V7gs&2H)|rz_iuI>eP~An)0o&|U}gf|yQPi_v-GHYQZ0U;O8K)< z`RAd1GL>oK^)kjG_5<)5!}ABv3>11xKw~uE;rD%fJc!c0(00X7?(l0jmIy%z*;ao~ zHaPiq&1xFeYj+$kHzL=-g%QS0)Xp%EaY(t1g9!S`K)Q3&Zppiv*j*(E{%o$(F#U}B z$UxhEjtC$Kw842GZF?exOWz`Ea3R61s!W#?>@BFL&`{1lND}kIjrEWeKAvWNsMgaN z(ADV_!uT$a(Z|{G<5Z963-FBlP(!D?CR5Ungyy9+fINm}!eD66Ig6k*)2dzoUe01S z$>asX22=~IeL0U`eg52!njV2k5-(mqvP7NLeNsF~I5-fIy;HQ@)I7$xO7c^%)Dqhg zrvNCAUGTFyh%^p%j6vH#*F%RXpIRb|8Au>>{Ov<5JWnArT4#HM5lb?B-2JC3t14}yi6zoGttany2z_^Vpc=DPI`Y4fcMJs(;O`aMP&`b zoEmzX>wn`36!5?9T2o7?-BBSBmlud2yc(a2CXB{ll{Fg_*#iB%& zGB#d&u_Vh2#*@ROFI4E8_{VmWcfNK7Bnl+F=JW*G8oVNFhP&dgl^~`5HZzle;HXem zvYmK|rBijhRh6%zHTS^ldv|<~ zx69uScFt?11XxqhFxvy`zyXtS5;0Stu%2kmh@=flp3^;gD7{r z>#2&=n#q{|@qOJ8mxRqre_oKaG#g`J$5~oJAs;IL=j>M;)f9a2VRDRO?_@Ho*J-Z;1HLy&2C{8z1s zm52ngR;&|IvhH?i3O>V(}E+Vvo@` PApk8kUDaCUS5f~1iF7l0 literal 0 HcmV?d00001 diff --git a/frontend/public/db-icons/jvm.ico b/frontend/public/db-icons/jvm.ico new file mode 100644 index 0000000000000000000000000000000000000000..c6b697983878b3cfad70d4fdd8564cd807460b85 GIT binary patch literal 1150 zcmb7^-D^^D7{^c0b&M`{6{EX?{*Xp5mvz-e5UUwf8!-cEMBBXBOJh(%tZ-XHR%0?o ztWjcw5QSnIzTsPXOjFbg6-9i3Z|D1nV&EXp;p^{rzR&OTJip&_4l2qC?H(CXwBNJJ z^FVA;7woUU`ot+#?WXPJ=9>Zb(h*T;CRaO5>nM_6)vL@pc zLZOiGHtQ=`R%c)`+&ETbv)QaLWY-t<@cDdFmwEhtKfGS=u}UNovX%^4^D_h7Za3ob zxF{SBV{!T#o=#lUG%h2b=`ZN6z`Q&obEnfO?Dq2~Qj2Gg#bTn*hworNd@K62zXhA7 zfX@Su#{=WttJqk11eePNvO6yqWY0WTGMU8O?Qs}&m$CftI_B?Ol4s8MUN80H8!LLr zMb>IwLNFLaE|)_(okk!K5YanxKZ<)>A&GNuFJ^DStksT2qf(RX`!{QdL?S2_i#@Tw z=k%)hr*0;t-}IP+d(7wa5+i%GW0Jm=N+oo~T&E{g$;Yufr{7(}ev`FZ*X4awt5tNx zHFNtaMs=O<>48PX*wk-fyKC5QvW|mIId{EYN55E0znjL`bQ*<10ejyvs8lMwHS87H zuOBROzGkzDel;2msb{cealz1G`{V2fS*LARdf#fb&~CT?5xsJ`j3aLm%-4<6=ldcX qa@mni#$<1`S`CB59Q{7eL56Jc&o4xNe8Er0!B8SYcHp1F5awS*t4eeL literal 0 HcmV?d00001 diff --git a/frontend/public/db-icons/kafka.png b/frontend/public/db-icons/kafka.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b5359b8666af60acb0b6c987eaf3a04de10c64 GIT binary patch literal 3233 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 - Kafka - - - - - - - - - diff --git a/frontend/public/db-icons/kingbase.ico b/frontend/public/db-icons/kingbase.ico new file mode 100644 index 0000000000000000000000000000000000000000..b1f280c83328cbc1a0643a61e7f2c418569b8202 GIT binary patch literal 9662 zcmdUzO{i5>6vy}VRgaf~k);IM(=rl+vUE^3a8x7}HE0k{w9tV#aiEO?A0Y@@L7+3q z!iX$v&<6ztUIGb&pr9HE)hi*&`~np;&Fk-f?pks^-FMDD=bruE>pgyVox9K4YyHLYNyuSOPSKb)fd_Z*d5B-`}O%5chfK?MDJ^giZu)d`2KH zcnvSbhMQq^On392QvIeux@W?Za1c&Ucl~ITW-$w%h0oy}WOHG<>PMgJzLn#(@FiT+ z&GEF@2TiW=T6f=vry$dvpQnR-C*}w|0S7?2%EmGF z{3&9+4UdAZ=^!#E>`Pp&@n<1cSDBygOWo@aLo(f75IH`CGf<{0_Pp!YK6w~CRT67C z9>cy1P0st%#Pj)+v<~vC??okt*P;FCtMCVu>5Dz@ z&(Eic+4ys)PaQ+#c>s37Z_woW^(pb5gIl1nb)dHf9b0VQKjaej%rQffW>NoL*0GTM zE$OK9S5d#7RbPOfm#$?Ht2&Ot4yg4WOus7Qe+d8EK{eszXvtwO5Lx%Hww9F2h9W}eHYg?>B@*9@LeUy(ZCl*Nv z41v?LW%*lWwv)42yZd=RkE5=u__&q_N6#C!b=$+JS=X8A_Bw{f2%&n%&3fHF4xO>? V`HmbkZgP;7gRF9A*2fufR{=3%YzzPZ literal 0 HcmV?d00001 diff --git a/frontend/public/db-icons/mqtt.svg b/frontend/public/db-icons/mqtt.svg index f82a854..20fe3d6 100644 --- a/frontend/public/db-icons/mqtt.svg +++ b/frontend/public/db-icons/mqtt.svg @@ -1,9 +1,35 @@ - - MQTT - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/db-icons/oceanbase.png b/frontend/public/db-icons/oceanbase.png new file mode 100644 index 0000000000000000000000000000000000000000..9d43ce829548a82dc65cc6fbde113d4cc9c3e071 GIT binary patch literal 4362 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 vxclp$?E#SZ>s)_5pZrf;P zMMNTkh#)qCh#(RX1VOZaLfz@bFy-^sc0;GO(vv}OmuF6$bKdiw>h8H3V+Q;$OQWCW zMq$i-#+b`M$yiW5{-bx#9XGjIFeZd>A>Mubwi1>Q5>zWM>bI-@`V*r99E2WxqbYXv z-9`7_lY0}WA?%2>lU=;~G#@-Q7()eN3+kQMzwkHt=xI~H0zw8)ZJOR&HBc`%Bd?vl z$&F{s6g-3sj#~5~T9`Fh-A6r;CO0e3TkhRH$0yH@EUY19sHnyFNSuPtXjF^-#1b^K z%`4uw-Tmov2MY)pYHIQKh-jh8Xwo@pqCas0@<=tx7ux^X^S4_F37*_F{etr{>8JW! zu9^6)KHigT&mLUwLJdiKk!_X;N;VhJk<8P?RI2eE)DxCWi$yCzzwA?G3Q zve~6s`_=sZqQMbE22U-%L(OrPPPJ64T6~U1H|x{UE5z3?UlMBw8J6nHk2rxkqe=u5IEXsp6g;S&vY-}qx@U`OpkAt1F0c4p#IDYM z|N7AwtbCetMGP5KkKd%-nTu#jIM)M>ZT)_D$TEC zNbuwiwmw^;*L(%z?mfs$SVHRG=8sAL+dB^}AY`biO}d`#nff}Tm&X!HaNr^5TT$P* z>+jbewopOHp!&u)AuqszhuloACZFEluRq>@WC|Wa21jk7Jpw7;01yU14RJ@296c0@FFYkYh zm%2F+E%zY>wT!=SXNS(tvEA)%+Yn}xFK_0(_nq&1 z-#flpL8ub?3qywrD656J0|a5bAPCjf_WPJ&g0KX2W5?#&FB63IBLra#`TzwOc0G!d z;Ad4Obbhf|w{uJo$ZFFif?!p76L+RDd|BrVV08gZ(%5{$vFTV<=>L(8!;Yc+ zQqtKnN#{%Rfi0spSvEe0jyLsGlB9r>h?>?zor(}!>W=}=2Y}QKsb`h72+vt=0ckWw>GKTtM0I>TK$XDr}SRrbKv!N zCqKsBa~*#8N9j~c!vOC;JNa|$tL=SruCBQ>YNhuEpB5MY!x;ZpYjP7T%YD-xPNp?UN}cl*h@BJyA`M0H2JT7p;-1 zy1YN?V2955gL$z|oVt^asTKK&4f}?|&(^zn;C(aB6xp+$luXmP$vrM)n;o)dOfP3X z60V#y>Ogx(K5yO;Pnwh5${{u_@bs~LLgQ^%OIF}K^#SH*QIPFRIQg;VgpbKu`f)dJ z=NV_UC*Y6&1h%9g_S%B_Ia78OL0HS*m7$N#a7KkhmSs=1N zw=IxJWCkU0zQDcD94UpnrIh&s&JZt_4H|zwo@8@n-4I2!ZE&{*^dQnXNmO^97foY~=Q;2tW&v~-CcL>g9_ba-&4rl57Go*)SPw156xt?So zSv;mK_)0ld$g~<~9M_#t=Q+G5KKCnV1=1jY#CdlO?w3_@M%ySw-*rJ^X6D?)wC&{qXb>&RrN@#iiI}#w zzc2-5w?n;`d@z-7?T&jU4x_ z=({_pKVmy<-gS=0p;f6erkXXrd-YEH?!x+$&Ben920`w300Dl(HpWzbd8K43l@9TS zT>jiscAnTdD^WE@p^y9S*zqCc*SJuJKP~Ewdm%ehabb^+J2q-qMX^K?y9+kB8wP>Sn z6PJsos1T?MJOQ%_AX04}5>()ePUPPH(vsvcCqtzBSjjG20MVjSJnFifY`9 zb5C%8jsFY0MvUVEMp58p)3EeD7O(E{C%v6tKzEVHABc?jpgdxK=By4+djxvq35%){YT@$wLK ze5Q6z@OO5OPKlX~gGfi)?<+1tfIk$)qaEKM%r0e5jCJig*qQbmJ$`2xHlB#<^j-M6 zSe-G!v2Q8m#OclF!zVEo> - Qdrant - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/db-icons/rocketmq.png b/frontend/public/db-icons/rocketmq.png new file mode 100644 index 0000000000000000000000000000000000000000..7a70ce718fa392e733b89baecbbdc9d6c7c57297 GIT binary patch literal 45203 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 R{{8>}002ovPDHLkV1g{=Bd!1d literal 0 HcmV?d00001 diff --git a/frontend/public/db-icons/rocketmq.svg b/frontend/public/db-icons/rocketmq.svg deleted file mode 100644 index a5dec65..0000000 --- a/frontend/public/db-icons/rocketmq.svg +++ /dev/null @@ -1,6 +0,0 @@ - - RocketMQ - - - - diff --git a/frontend/public/db-icons/starrocks.png b/frontend/public/db-icons/starrocks.png new file mode 100644 index 0000000000000000000000000000000000000000..a41cbb73a28be8d606d2e4f025eed55f042ab6c1 GIT binary patch literal 1724 zcmV;t21EIYP)1$~z$P!ReBck93K#Rz+LWq)_x1pi}A#$jJ1`t7{KL7| z!5+WFkI39t_pg)Zq8{`1tARN%@F1La+iR;2EW*rNOtdv$IhTlJ@ua zm5-Pr;B*77Ff%jbB~sno+@z+aDj%_fjjw=@*49>pEEH5IfRftUS`^Ub_V(5fXfc85 zD@Y-IeSOLs(6Yb39|cGNQaC$1iyBa+d_;jStauk!!iTaW65a!Pl#fX9sf<1H0Y4}z zDiTW2E7-R@CL|wDc+V?{Kg-L@EiEl~cXv((1s`o~ZSVs%6=?7!EH(;TsItSA_|hgEYhQke~1? z!a>|C+KaDIN?)zziKhvVrarn|7PFgG`6dl#oH5o}6m z5t=(#Q^~vjgM$MVCPJU&!*I5`1=B^C4vQG>b!3mp)y;6^(u>Q2 zrv~aH=-GOMtt7eDKy%ajEbGIfOxn2c*#I<+4yGGbhH_ z&CShAvhhNkc<}T!Mz7p&_sWt<>4sxv{ZvdU_gxr1bjL%ViINd50^JrK230h13ql z{=oZ51f!E)qZcF}5X=E|4j8wrV9>GCGV(G(PeL#O%CU#J=v$OM$1tbztz?eL|0s9AVfE0pwrL16!sI|VnesXfM zwzf7lHil;C*wN8}OmlyK|MK$k<^g|&d>>h8hKcbqdf4GIgb>6saoW%!l2CMs$1u%E z&Y-0v&4@l`13mq~aN!<+VrkPeFmrAvIV@tMJPvL2$v}F62@rz@Fc!QAG$>6OGmF4i zKnw~?OG{8(xw*NZDlswf;o$)%SUfHX3-2fSoU3gMynyZ~l5=W@ z;=GDmTiE=^g^>z+4kmU#t?Q&GcB zAs`UJW8~YaEs$&w==?wG5zWob#l^)cYJ|{jAO@e`k#d4J2TUREALoA>u*bv}M@5Z* z$9B3b_EU%xuzOEPNKjG3D=R*{00%0OZ5s{z2LJ&7|4B3&u>b%721!IgR09BAX3O9G SJ<3A>0000`4Rt~2Oeui3v* zZ*pbONVhM1=+Ug1Q7eC!6Lzxuh;5_3h9uK*{TXQ#y*_waXLw~)UaWKf!juuj@@t`$#hiJyg4PM$ky_*7aP+Q{%y8U0%HMU<{_9 z1#Xi*)Hrla(2ua&W~l#gTi-OVzQCt^9Fy04-QVIql%nmW{uH)+vSpxvZNbLjKX zJ5O_pLtf7}4LaAS+r&}lKo`(pduORf(6~+g;v9MpCNXC|d(fm*s?`FOWdELhph}W~!f!AG*?WkR=RG-FZ9B4o*Kh38xnjENqzE7@4yVu;bK8@L@26}d%=F%9Ap7oYa z9GIl~G)7Ya%^Ib-yTtS>!4!+qVP7A3?NV6|-;1+2w(uK!#oGJynOkTl zFaaxfMy#F2HZN#ao>etK_dNxLX}?Yzb{JzjP}*#KCoYQhS-B`Kl?SR_d3Mu$ot7P{ zuupAsM@Rw)(f7-*W%%ZSS|se4gQ3`~KVW@eKO@(*$_q|8G}sV7@q6 zHb0rq&-ho@{MnrUu#e{RdSUsyp%okWPmZoX6n{OK9m)Rj@bd2q`~20yJ~=yisrYGk zaAPkIWv_oS8~pSL`*C-0V_!X&oqhc77lQ%z`k*^nSo&fwF9);3<1D-C2D1a%v%%~{ z_W9w}s~1^zad3Rqoo3nJ2FF*kU$E=Zi`UnW_?xHs>BYR(-#&3-J3l`c|H;w$`SpkF zad>uedBmPCE>2(1v7cR>ekS|s;>B~>%d6u<+1b;V1KH~*pDvzv{`(&s3NWkTp4jgIIkEx0Z#rd2d!!sGqE{X+=bN!PCdr~@^j0}61T=-Jy`UM zHS2t|4RDsnSN~-!p11(^{h=^z$T`&*ho6Ji;!U6D|aLwIIQ++H*YC zJ>|QkrhwCq`dV(42R_!AA9Bm*Gu|wD%~{zw%K1>Q8JeY;nyni9IVD>I?NF|P>el7d zdtJ_vt3f0bHwGs<)V2 z1=PC(Hm_2iSUt7J;Htss(Ld&NQ3sx_WpACRQt7oW-)l+F!G8?H}v5`PAoN1SaxLkFVa!32nqHo`A7( z#^2S_s{&I{su#8noW~9WSK?2_E57eTUk4fx&nqb>~)&|w#52v!E7)aT)OOVfy2wg+0Xwq`1kvt z|MlvJzdOGA@%N6eUOqj(`1Hx?#j|Ip7bj<@=PzELe|6A(^yNoieK0*gfA{hEd1KG} z_~Nwr&DHUv*{}XIxPJQbX#QSt^Q(+6em0+99{v~lbp=QNKUoeOcobgY@*RQ=hkLKU z+V@R4Y5H2g+q*Nx_n=8IB34eHty|MWb(%3s^Ws9zr#Z#sa!^OQ3BC)EUxb`Ax|)>( z=Oc}J391t;9^n_juM`u&Ep`t1A$BZXfa=5*s>7~4A8~G+G+-)gGw@x^;j3RBRgG%ZV+6#NnxPZ8 z94jpEOB&$Cf#n^Ani{SSei3xi+V0D|G<^qc3C6$y%@E{^EBk6v4qXmv-~;66scus& zJ?H}Vs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/components/DatabaseIcons.test.tsx b/frontend/src/components/DatabaseIcons.test.tsx index d74a57a..ed9afbd 100644 --- a/frontend/src/components/DatabaseIcons.test.tsx +++ b/frontend/src/components/DatabaseIcons.test.tsx @@ -4,91 +4,40 @@ import { renderToStaticMarkup } from 'react-dom/server'; import { DB_ICON_TYPES, getDbIcon, getDbIconLabel } from './DatabaseIcons'; +const BRAND_ICON_CASES: Array<[string, string, string]> = [ + ['elasticsearch', 'Elasticsearch', 'elasticsearch.svg'], + ['oceanbase', 'OceanBase', 'oceanbase.png'], + ['oracle', 'Oracle', 'oracle.ico'], + ['starrocks', 'StarRocks', 'starrocks.png'], + ['kingbase', '金仓', 'kingbase.ico'], + ['dameng', '达梦', 'dameng.png'], + ['vastbase', 'VastBase', 'vastbase.svg'], + ['opengauss', 'OpenGauss', 'opengauss.ico'], + ['gaussdb', 'GaussDB', 'gaussdb.ico'], + ['goldendb', 'GoldenDB', 'goldendb.ico'], + ['highgo', '瀚高', 'highgo.ico'], + ['iris', 'InterSystems IRIS', 'iris.png'], + ['tdengine', 'TDengine', 'tdengine.ico'], + ['iotdb', 'Apache IoTDB', 'iotdb.svg'], + ['rocketmq', 'RocketMQ', 'rocketmq.png'], + ['mqtt', 'MQTT', 'mqtt.svg'], + ['kafka', 'Kafka', 'kafka.png'], + ['rabbitmq', 'RabbitMQ', 'rabbitmq.svg'], + ['chroma', 'Chroma', 'chroma.svg'], + ['qdrant', 'Qdrant', 'qdrant.svg'], + ['jvm', 'JVM', 'jvm.ico'], +]; + describe('DatabaseIcons', () => { - it('includes InterSystems IRIS in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('iris'); - expect(getDbIconLabel('iris')).toBe('InterSystems IRIS'); - }); - - it('includes Elasticsearch in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('elasticsearch'); - expect(getDbIconLabel('elasticsearch')).toBe('Elasticsearch'); - const markup = renderToStaticMarkup(<>{getDbIcon('elasticsearch', undefined, 22)}); - expect(markup).toContain('elasticsearch.svg'); - expect(markup).toContain('alt="elasticsearch"'); - }); - - it('includes Chroma in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('chroma'); - expect(getDbIconLabel('chroma')).toBe('Chroma'); - const markup = renderToStaticMarkup(<>{getDbIcon('chroma', undefined, 22)}); - expect(markup).toContain('chroma.svg'); - expect(markup).toContain('alt="chroma"'); - }); - - it('includes Qdrant in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('qdrant'); - expect(getDbIconLabel('qdrant')).toBe('Qdrant'); - const markup = renderToStaticMarkup(<>{getDbIcon('qdrant', undefined, 22)}); - expect(markup).toContain('qdrant.svg'); - expect(markup).toContain('alt="qdrant"'); - }); - - it('includes Apache IoTDB in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('iotdb'); - expect(getDbIconLabel('iotdb')).toBe('Apache IoTDB'); - const markup = renderToStaticMarkup(<>{getDbIcon('iotdb', undefined, 22)}); - expect(markup).toContain('iotdb.svg'); - expect(markup).toContain('alt="iotdb"'); - }); - - it('includes RocketMQ in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('rocketmq'); - expect(getDbIconLabel('rocketmq')).toBe('RocketMQ'); - const markup = renderToStaticMarkup(<>{getDbIcon('rocketmq', undefined, 22)}); - expect(markup).toContain('rocketmq.svg'); - expect(markup).toContain('alt="rocketmq"'); - }); - - it('includes MQTT in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('mqtt'); - expect(getDbIconLabel('mqtt')).toBe('MQTT'); - const markup = renderToStaticMarkup(<>{getDbIcon('mqtt', undefined, 22)}); - expect(markup).toContain('mqtt.svg'); - expect(markup).toContain('alt="mqtt"'); - }); - - it('includes Kafka in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('kafka'); - expect(getDbIconLabel('kafka')).toBe('Kafka'); - const markup = renderToStaticMarkup(<>{getDbIcon('kafka', undefined, 22)}); - expect(markup).toContain('kafka.svg'); - expect(markup).toContain('alt="kafka"'); - }); - - it('includes RabbitMQ in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('rabbitmq'); - expect(getDbIconLabel('rabbitmq')).toBe('RabbitMQ'); - const markup = renderToStaticMarkup(<>{getDbIcon('rabbitmq', undefined, 22)}); - expect(markup).toContain('rabbitmq.svg'); - expect(markup).toContain('alt="rabbitmq"'); - }); - - it('includes GaussDB in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('gaussdb'); - expect(getDbIconLabel('gaussdb')).toBe('GaussDB'); - const markup = renderToStaticMarkup(<>{getDbIcon('gaussdb', undefined, 22)}); - expect(markup).toContain('gaussdb.svg'); - expect(markup).toContain('alt="gaussdb"'); - }); - - it('includes GoldenDB in the selectable database icons', () => { - expect(DB_ICON_TYPES).toContain('goldendb'); - expect(getDbIconLabel('goldendb')).toBe('GoldenDB'); - const markup = renderToStaticMarkup(<>{getDbIcon('goldendb', undefined, 22)}); - expect(markup).toContain('goldendb.svg'); - expect(markup).toContain('alt="goldendb"'); - }); + for (const [type, label, asset] of BRAND_ICON_CASES) { + it(`includes ${label} in the selectable database icons`, () => { + expect(DB_ICON_TYPES).toContain(type); + expect(getDbIconLabel(type)).toBe(label); + const markup = renderToStaticMarkup(<>{getDbIcon(type, undefined, 22)}); + expect(markup).toContain(asset); + expect(markup).toContain(`alt="${type}"`); + }); + } it('wraps database icons in a consistent frame for sidebar sizing', () => { const mysqlMarkup = renderToStaticMarkup(<>{getDbIcon('mysql', undefined, 22)}); diff --git a/frontend/src/components/DatabaseIcons.tsx b/frontend/src/components/DatabaseIcons.tsx index 0cc8696..126a820 100644 --- a/frontend/src/components/DatabaseIcons.tsx +++ b/frontend/src/components/DatabaseIcons.tsx @@ -67,31 +67,90 @@ const DB_DEFAULT_COLORS: Record = { export const getDbDefaultColor = (type: string): string => DB_DEFAULT_COLORS[type?.toLowerCase()] || DB_DEFAULT_COLORS.custom; -// ─── 有品牌 SVG 文件的数据库类型(文件在 /db-icons/ 下) ──── +type BrandAssetConfig = { + background?: string; + borderColor?: string; + iconScale?: number; + src: string; +}; -const BRAND_SVG_TYPES = new Set([ - 'mysql', 'mariadb', 'postgres', 'redis', 'mongodb', 'clickhouse', 'sqlite', - 'diros', 'sphinx', 'duckdb', 'sqlserver', 'elasticsearch', - 'gaussdb', 'goldendb', 'iotdb', 'rocketmq', 'mqtt', 'kafka', 'rabbitmq', - 'chroma', 'qdrant', -]); +// ─── 官方品牌资源(文件在 /db-icons/ 下) ──────────────────── -/** 品牌 SVG 图标:用 加载 /db-icons/*.svg */ -const BrandSvgIcon: React.FC<{ type: string; size: number; color?: string }> = ({ type, size, color }) => { - const bgColor = color || getDbDefaultColor(type); +const BRAND_ASSET_CONFIGS: Record = { + mysql: { src: '/db-icons/mysql.svg' }, + mariadb: { src: '/db-icons/mariadb.svg' }, + oceanbase: { src: '/db-icons/oceanbase.png', iconScale: 0.72 }, + postgres: { src: '/db-icons/postgres.svg' }, + redis: { src: '/db-icons/redis.svg' }, + mongodb: { src: '/db-icons/mongodb.svg' }, + elasticsearch: { src: '/db-icons/elasticsearch.svg' }, + jvm: { src: '/db-icons/jvm.ico', iconScale: 0.72 }, + kingbase: { src: '/db-icons/kingbase.ico', iconScale: 0.72 }, + dameng: { src: '/db-icons/dameng.png', iconScale: 0.72 }, + oracle: { src: '/db-icons/oracle.ico', iconScale: 0.72 }, + sqlserver: { src: '/db-icons/sqlserver.svg' }, + clickhouse: { src: '/db-icons/clickhouse.svg' }, + sqlite: { src: '/db-icons/sqlite.svg' }, + duckdb: { src: '/db-icons/duckdb.svg' }, + vastbase: { src: '/db-icons/vastbase.svg', iconScale: 0.84 }, + opengauss: { src: '/db-icons/opengauss.ico', iconScale: 0.72 }, + gaussdb: { src: '/db-icons/gaussdb.ico', iconScale: 0.72 }, + goldendb: { src: '/db-icons/goldendb.ico', iconScale: 0.72 }, + highgo: { src: '/db-icons/highgo.ico', iconScale: 0.72 }, + iris: { src: '/db-icons/iris.png', iconScale: 0.72 }, + tdengine: { src: '/db-icons/tdengine.ico', iconScale: 0.72 }, + iotdb: { + src: '/db-icons/iotdb.svg', + background: '#0F766E', + borderColor: '#0F766E', + iconScale: 0.82, + }, + rocketmq: { + src: '/db-icons/rocketmq.png', + background: '#0F172A', + borderColor: '#EA580C', + iconScale: 0.84, + }, + mqtt: { + src: '/db-icons/mqtt.svg', + background: '#0F172A', + borderColor: '#0EA5A4', + iconScale: 0.84, + }, + kafka: { src: '/db-icons/kafka.png', iconScale: 0.8 }, + rabbitmq: { src: '/db-icons/rabbitmq.svg', iconScale: 0.74 }, + chroma: { src: '/db-icons/chroma.svg', iconScale: 0.9 }, + qdrant: { src: '/db-icons/qdrant.svg', iconScale: 0.74 }, + diros: { src: '/db-icons/diros.svg' }, + starrocks: { + src: '/db-icons/starrocks.png', + background: '#0B1021', + borderColor: '#00A6A6', + iconScale: 0.84, + }, + sphinx: { src: '/db-icons/sphinx.svg' }, +}; + +const BRAND_ASSET_TYPES = new Set(Object.keys(BRAND_ASSET_CONFIGS)); + +/** 品牌图标:用 加载官方 svg/png/ico 资源 */ +const BrandAssetIcon: React.FC<{ type: string; size: number; color?: string }> = ({ type, size, color }) => { + const config = BRAND_ASSET_CONFIGS[type.toLowerCase()]; + const bgColor = color || config?.borderColor || getDbDefaultColor(type); + const iconScale = config?.iconScale ?? 0.64; return ( {type} @@ -99,128 +158,105 @@ const BrandSvgIcon: React.FC<{ type: string; size: number; color?: string }> = ( ); }; -// ─── 彩色标签图标(fallback) ────────────────────────────── - -/** 通用彩色标签:填充背景 + 白色粗体缩写 */ -const ColorBadge: React.FC<{ size: number; color: string; label: string }> = ({ size, color, label }) => { - const textSize = label.length <= 2 ? size * 0.48 : size * 0.38; - return ( - - - - 2 ? -0.5 : 0} - > - {label} - - - - ); -}; - // ─── 各数据库图标 ─────────────────────────────────────────── -// 有品牌 SVG 的数据库 +// 有品牌官方资源的数据库 const MySQLIcon: React.FC = ({ size = 16, color }) => ( - + ); const MariaDBIcon: React.FC = ({ size = 16, color }) => ( - + ); const OceanBaseIcon: React.FC = ({ size = 16, color }) => ( - + ); const PostgresIcon: React.FC = ({ size = 16, color }) => ( - + ); const RedisIcon: React.FC = ({ size = 16, color }) => ( - + ); const MongoDBIcon: React.FC = ({ size = 16, color }) => ( - + ); const ClickHouseIcon: React.FC = ({ size = 16, color }) => ( - + ); const SQLiteIcon: React.FC = ({ size = 16, color }) => ( - + ); -// 无品牌 SVG → 彩色文字标签 const OracleIcon: React.FC = ({ size = 16, color }) => ( - + ); const SQLServerIcon: React.FC = ({ size = 16, color }) => ( - + ); const DorisIcon: React.FC = ({ size = 16, color }) => ( - + ); const StarRocksIcon: React.FC = ({ size = 16, color }) => ( - + ); const SphinxIcon: React.FC = ({ size = 16, color }) => ( - + ); const DuckDBIcon: React.FC = ({ size = 16, color }) => ( - + ); const KingBaseIcon: React.FC = ({ size = 16, color }) => ( - + ); const DamengIcon: React.FC = ({ size = 16, color }) => ( - + ); const VastBaseIcon: React.FC = ({ size = 16, color }) => ( - + ); const OpenGaussIcon: React.FC = ({ size = 16, color }) => ( - + ); const GaussDBIcon: React.FC = ({ size = 16, color }) => ( - + ); const GoldenDBIcon: React.FC = ({ size = 16, color }) => ( - + ); const HighGoIcon: React.FC = ({ size = 16, color }) => ( - + ); const IrisIcon: React.FC = ({ size = 16, color }) => ( - + ); const TDengineIcon: React.FC = ({ size = 16, color }) => ( - + ); const IoTDBIcon: React.FC = ({ size = 16, color }) => ( - + ); const RocketMQIcon: React.FC = ({ size = 16, color }) => ( - + ); const MQTTIcon: React.FC = ({ size = 16, color }) => ( - + ); const KafkaIcon: React.FC = ({ size = 16, color }) => ( - + ); const RabbitMQIcon: React.FC = ({ size = 16, color }) => ( - + ); const ChromaIcon: React.FC = ({ size = 16, color }) => ( - + ); const QdrantIcon: React.FC = ({ size = 16, color }) => ( - + ); const JVMIcon: React.FC = ({ size = 16, color }) => ( - + ); const ElasticsearchIcon: React.FC = ({ size = 16, color }) => ( - + ); /** Custom — 齿轮图标 */ @@ -239,13 +275,6 @@ const CustomIcon: React.FC = ({ size = 16, color }) => { // ─── 图标注册表 ───────────────────────────────────────────── -const DorisIconFallback: React.FC = ({ size = 16, color }) => ( - -); -const SphinxIconFallback: React.FC = ({ size = 16, color }) => ( - -); - const DB_ICON_MAP: Record> = { mysql: MySQLIcon, mariadb: MariaDBIcon, @@ -289,8 +318,8 @@ export const DB_ICON_TYPES: string[] = [ 'kingbase', 'dameng', 'vastbase', 'opengauss', 'gaussdb', 'goldendb', 'highgo', 'iris', 'tdengine', 'iotdb', 'rocketmq', 'mqtt', 'kafka', 'rabbitmq', 'chroma', 'qdrant', 'elasticsearch', 'custom', ]; -/** 该类型是否有品牌 SVG 文件 */ -export const hasBrandSvg = (type: string): boolean => BRAND_SVG_TYPES.has(type?.toLowerCase()); +/** 该类型是否有品牌图标资源 */ +export const hasBrandSvg = (type: string): boolean => BRAND_ASSET_TYPES.has(type?.toLowerCase()); /** 获取数据库图标 React 节点 */ export const getDbIcon = (type: string, color?: string, size?: number): React.ReactNode => {