ForcePilot/web/src/components/HeaderComponent.vue

89 lines
1.6 KiB
Vue
Raw Normal View History

2024-09-14 02:46:44 +08:00
<template>
<div class="header-container">
<div class="header-content">
<div class="header-actions" v-if="$slots.left">
<slot name="left"></slot>
</div>
2024-09-14 02:46:44 +08:00
<div class="header-title">
<div class="header-title-block">
<h1>{{ title }}</h1>
<slot name="behind-title"></slot>
</div>
2024-09-14 02:46:44 +08:00
<slot name="description">
<p v-if="description">{{ description }}</p>
</slot>
</div>
<div class="header-actions" v-if="$slots.actions">
<loading-outlined v-if="loading" />
2024-09-14 02:46:44 +08:00
<slot name="actions"></slot>
</div>
</div>
</div>
</template>
<script setup>
import { LoadingOutlined } from '@ant-design/icons-vue';
2024-09-14 02:46:44 +08:00
const props = defineProps({
title: {
type: String,
required: true
},
description: {
type: String,
default: ''
},
loading: {
type: Boolean,
default: false
2024-09-14 02:46:44 +08:00
}
});
</script>
<style scoped lang="less">
.header-container {
background-color: var(--bg-sider);
2024-09-14 02:46:44 +08:00
backdrop-filter: blur(10px);
padding: 10px 24px;
2024-09-14 02:46:44 +08:00
border-bottom: 1px solid #f0f0f0;
position: sticky;
top: 0;
z-index: 1000;
}
.header-content {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
2024-09-14 02:46:44 +08:00
}
.header-title {
flex: 1;
width: 100%;
2024-09-14 02:46:44 +08:00
font-size: 14px;
color: rgba(0, 0, 0, 0.45);
.header-title-block {
display: flex;
align-items: baseline;
gap: 10px;
}
2024-09-14 02:46:44 +08:00
h1 {
margin: 0;
font-size: 20px;
font-weight: 500;
color: rgba(0, 0, 0, 0.85);
}
p {
margin: 8px 0 0;
}
}
.header-actions {
display: flex;
gap: 8px;
}
</style>