{{ row.rank }}
-
{{ row.teamName }}
+
+
+ {{ row.teamName }}
+
{{ row.gold }}
{{ row.silver }}
{{ row.bronze }}
@@ -85,6 +102,20 @@ const rowFont = computed(() => fitRowFont(rows.value.length, BOARD_AVAILABLE_PX)
color: #e0995e;
}
.name {
+ display: flex;
+ align-items: center;
+ gap: 0.28em;
+ min-width: 0;
+ overflow: hidden;
+}
+/* logo 尺寸用 em 跟着行字号走:既不会撑开行高,也不会挤动名次/奖牌列。 */
+.team-logo {
+ flex: none;
+ width: 1em;
+ height: 1em;
+ object-fit: contain;
+}
+.team-name {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
diff --git a/web/src/admin/components/system/imagePath.ts b/web/src/shared/asset.ts
similarity index 100%
rename from web/src/admin/components/system/imagePath.ts
rename to web/src/shared/asset.ts
diff --git a/web/src/shared/index.ts b/web/src/shared/index.ts
index b9c00af..43f548d 100644
--- a/web/src/shared/index.ts
+++ b/web/src/shared/index.ts
@@ -9,6 +9,7 @@ export * from './types'
export { ApiClient, ApiError, createApiClient } from './api'
export type { ApiClientOptions, QueryParams, QueryValue } from './api'
export { GUEST_ROLE, isGuestRole, isGuestUser } from './session'
+export { resolveAssetUrl } from './asset'
export { RealtimeClient } from './realtime'
export type {
RealtimeInfo,
diff --git a/web/src/admin/tests/image-path.test.ts b/web/src/shared/tests/asset.test.ts
similarity index 94%
rename from web/src/admin/tests/image-path.test.ts
rename to web/src/shared/tests/asset.test.ts
index f49a7eb..8bb4402 100644
--- a/web/src/admin/tests/image-path.test.ts
+++ b/web/src/shared/tests/asset.test.ts
@@ -1,6 +1,6 @@
import { test } from 'node:test'
import assert from 'node:assert/strict'
-import { resolveAssetUrl } from '../components/system/imagePath'
+import { resolveAssetUrl } from '@/shared'
// 服务端上传接口返回的路径已带 /uploads/ 前缀,这里主要保证手填的历史值也能加载。
test('resolveAssetUrl 原样保留已带前缀的路径与绝对地址', () => {