# MatchScheduleArenaRank Arena Ranking
Arena match ranking component for displaying top three players in podium layout, supporting custom player information and interactive operations.
# Import
import PressMatchScheduleArenaRank from 'press-next/press-match-schedule-arena-rank/press-match-schedule-arena-rank.vue';
# Code Demo
# Basic Usage
Display top three players in podium layout, automatically arranged in 2nd-1st-3rd order.
<template>
<PressMatchScheduleArenaRank
:players="players"
@view-ranking-click="handleViewRankingClick"
/>
</template>
<script setup lang="ts">
import PressMatchScheduleArenaRank from 'press-next/press-match-schedule-arena-rank/press-match-schedule-arena-rank.vue';
interface Player {
id?: string | number;
rank: number;
nickname: string;
avatar: string;
killCount: number;
}
const players: Player[] = [
{
id: 1,
rank: 2,
nickname: 'Silver Player',
avatar: 'https://avatars.githubusercontent.com/u/1680273?v=4',
killCount: 12,
},
{
id: 2,
rank: 1,
nickname: 'Gold Player',
avatar: 'https://avatars.githubusercontent.com/u/499550?v=4',
killCount: 15,
},
{
id: 3,
rank: 3,
nickname: 'Bronze Player',
avatar: 'https://avatars.githubusercontent.com/u/9919?v=4',
killCount: 10,
},
];
const handleViewRankingClick = () => {
console.log('View full ranking');
};
</script>
# Custom Footer Button
Customize footer button content through slots.
<template>
<PressMatchScheduleArenaRank :players="players">
<template #foot-btn>
<PressButton
type="primary"
block
@click="handleCustomAction"
>
Custom Action
</PressButton>
</template>
</PressMatchScheduleArenaRank>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PressMatchScheduleArenaRank from 'press-next/press-match-schedule-arena-rank/press-match-schedule-arena-rank.vue';
import { PressButton } from 'press-ui';
const players = ref([
{ id: 1, rank: 1, nickname: 'Gold Player', avatar: 'https://avatars.githubusercontent.com/u/499550?v=4', killCount: 15 },
{ id: 2, rank: 2, nickname: 'Silver Player', avatar: 'https://avatars.githubusercontent.com/u/1680273?v=4', killCount: 12 },
{ id: 3, rank: 3, nickname: 'Bronze Player', avatar: 'https://avatars.githubusercontent.com/u/9919?v=4', killCount: 10 },
]);
const handleCustomAction = () => {
console.log('Custom action');
};
</script>
# Dynamic Data Update
Support dynamic update of player ranking data.
<template>
<div>
<PressMatchScheduleArenaRank :players="currentPlayers" />
<PressButton
type="primary"
block
style="margin-top: 16px;"
@click="updateRanking"
>
Update Ranking
</PressButton>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PressMatchScheduleArenaRank from 'press-next/press-match-schedule-arena-rank/press-match-schedule-arena-rank.vue';
import { PressButton } from 'press-ui';
const currentPlayers = ref([
{ id: 1, rank: 1, nickname: 'Player A', avatar: 'https://avatars.githubusercontent.com/u/499550?v=4', killCount: 20 },
{ id: 2, rank: 2, nickname: 'Player B', avatar: 'https://avatars.githubusercontent.com/u/1680273?v=4', killCount: 18 },
{ id: 3, rank: 3, nickname: 'Player C', avatar: 'https://avatars.githubusercontent.com/u/9919?v=4', killCount: 15 },
]);
const updateRanking = () => {
// Simulate ranking change
currentPlayers.value = [
{ id: 2, rank: 1, nickname: 'Player B', avatar: 'https://avatars.githubusercontent.com/u/1680273?v=4', killCount: 25 },
{ id: 1, rank: 2, nickname: 'Player A', avatar: 'https://avatars.githubusercontent.com/u/499550?v=4', killCount: 22 },
{ id: 3, rank: 3, nickname: 'Player C', avatar: 'https://avatars.githubusercontent.com/u/9919?v=4', killCount: 20 },
];
};
</script>
# API
# Props
| Attribute | Description | Type | Default |
|---|---|---|---|
| players | Player list data | Player[] | [] |
# Player Data Structure
| Property | Description | Type | Required |
|---|---|---|---|
| id | Player unique identifier | string | number | No |
| rank | Player ranking | number | Yes |
| nickname | Player nickname | string | Yes |
| avatar | Player avatar URL | string | Yes |
| killCount | Kill count | number | Yes |
# Events
| Event | Description | Callback Parameters |
|---|---|---|
| view-ranking-click | Emitted when view ranking button is clicked | - |
# Slots
| Name | Description |
|---|---|
| foot-btn | Custom footer button content |
# Theme Customization
The component provides the following CSS variables for custom styling. Please refer to the ConfigProvider component for usage.
# Style Variables
# Spacing System
| Name | Default Value | Description |
|---|---|---|
| --pmsar-list-mb | $spacing-xl | List bottom margin |
| --pmsar-list-gap | $spacing-sm | List item gap |
| --pmsar-stats-padding-lr | $spacing-sm | Stats left/right padding |
| --pmsar-container-padding-tb | .4rem | Container vertical padding |
| --pmsar-container-padding-lr | .28rem | Container horizontal padding |
| --pmsar-badge-offset-y | -.24rem | Badge bottom offset |
| --pmsar-nickname-first-mt | .56rem | First place nickname top margin |
| --pmsar-nickname-second-mt | .4rem | Second place nickname top margin |
| --pmsar-nickname-third-mt | .36rem | Third place nickname top margin |
| --pmsar-stats-mt | $spacing-xs | Stats top margin |
# Size System
| Name | Default Value | Description |
|---|---|---|
| --pmsar-avatar-size | 1rem | Avatar size |
| --pmsar-item-first-height | 3.2rem | First place height |
| --pmsar-item-second-height | 2.76rem | Second place height |
| --pmsar-item-third-height | 2.56rem | Third place height |
| --pmsar-badge-width-size | .44rem | Badge width |
| --pmsar-badge-height-size | .48rem | Badge height |
| --pmsar-nickname-width | 1.8rem | Nickname max width |
| --pmsar-stats-height | .36rem | Stats line height |
| --pmsar-stats-width | 1.6rem | Stats max width |
# Color System
| Name | Default Value | Description |
|---|---|---|
| --pmsar-container-bg | $color-surface-default | Container background |
| --pmsar-avatar-border-color | $color-border-brand | Avatar border color |
| --pmsar-badge-bg | red | Badge background |
| --pmsar-nickname-text-color | $color-text-primary | Nickname text color |
| --pmsar-stats-bg | rgba(54, 111, 244, .3) | Stats background |
| --pmsar-stats-color | $color-text-invert-light | Stats text color |
| --pmsar-item-bg | url(...) | Item background image |
| --pmsar-item-badge-bg1 | url(...) | First place badge image |
| --pmsar-item-badge-bg2 | url(...) | Second place badge image |
| --pmsar-item-badge-bg3 | url(...) | Third place badge image |
# Typography System
| Name | Default Value | Description |
|---|---|---|
| --pmsar-nickname-font-size | $font-size-md | Nickname font size |
| --pmsar-stats-font-size | $font-size-sm | Stats font size |
| --pmsar-nickname-font-weight | 500 | Nickname font weight |
# Border Radius System
| Name | Default Value | Description |
|---|---|---|
| --pmsar-container-border-radius | 0 | Container border radius |
| --pmsar-avatar-border-radius | 50% | Avatar border radius |
| --pmsar-stats-border-radius | .28rem | Stats border radius |
# Others
| Name | Default Value | Description |
|---|---|---|
| --pmsar-badge-text-indent | -999em | Hide badge text |
# FAQ
# How to customize ranking badge images?
You can customize the badge background images for top three players through CSS variables:
<template>
<PressMatchScheduleArenaRank
:players="players"
custom-class="custom-badge"
/>
</template>
<style>
.custom-badge {
--pmsar-item-badge-bg1: url('your-first-badge.png');
--pmsar-item-badge-bg2: url('your-second-badge.png');
--pmsar-item-badge-bg3: url('your-third-badge.png');
}
</style>
# How to handle avatar loading failures?
It's recommended to provide default avatars at the data layer:
const playersWithFallback = players.map(player => ({
...player,
avatar: player.avatar || 'https://example.com/default-avatar.png',
}));
# What is the podium arrangement order?
The component automatically arranges in podium layout: 2nd (left) - 1st (center) - 3rd (right), no need to manually adjust data order.
# How to customize heights for different rankings?
You can set heights for top three players separately through CSS variables:
.custom-height {
--pmsar-item-first-height: 3.5rem;
--pmsar-item-second-height: 3rem;
--pmsar-item-third-height: 2.8rem;
}