<template>
	<view class="uni-card" :class="{ 'uni-card--full': isFull, 'uni-card--shadow': isShadow,'uni-card--border':border}"
		:style="{'margin':isFull?0:margin,'padding':spacing,'box-shadow':isShadow?shadow:''}">
		<!-- 封面 -->
		<slot name="cover">
			<view v-if="cover" class="uni-card__cover">
				<image class="uni-card__cover-image" mode="widthFix" @click="onClick('cover')" :src="cover"></image>
			</view>
		</slot>
		<slot name="title">
			<view v-if="title || extra" class="uni-card__header">
				<!-- 卡片标题 -->
				<view class="uni-card__header-box" @click="onClick('title')">
					<view v-if="thumbnail" class="uni-card__header-avatar">
						<image class="uni-card__header-avatar-image" :src="thumbnail" mode="aspectFit" />
					</view>
					<view class="uni-card__header-content">
						<text class="uni-card__header-content-title uni-ellipsis">{{ title }}</text>
						<text v-if="title&&subTitle"
							class="uni-card__header-content-subtitle uni-ellipsis">{{ subTitle }}</text>
					</view>
				</view>
				<view class="uni-card__header-extra" @click="onClick('extra')">
					<slot name="extra">
						<text class="uni-card__header-extra-text">{{ extra }}</text>
					</slot>
				</view>
			</view>
		</slot>
		<!-- 卡片内容 -->
		<view class="uni-card__content" :style="{padding:padding}" @click="onClick('content')">
			<slot></slot>
		</view>
		<view class="uni-card__actions" @click="onClick('actions')">
			<slot name="actions"></slot>
		</view>
	</view>
</template>

<script>
	/**
	 * Card 卡片
	 * @description 卡片视图组件
	 * @tutorial https://ext.dcloud.net.cn/plugin?id=22
	 * @property {String} title 标题文字
	 * @property {String} subTitle 副标题
	 * @property {Number} padding 内容内边距
	 * @property {Number} margin 卡片外边距
	 * @property {Number} spacing 卡片内边距
	 * @property {String} extra 标题额外信息
	 * @property {String} cover 封面图(本地路径需要引入)
	 * @property {String} thumbnail 标题左侧缩略图
	 * @property {Boolean} is-full = [true | false] 卡片内容是否通栏,为 true 时将去除padding值
	 * @property {Boolean} is-shadow = [true | false] 卡片内容是否开启阴影
	 * @property {String} shadow 卡片阴影
	 * @property {Boolean} border 卡片边框
	 * @event {Function} click 点击 Card 触发事件
	 */
	export default {
		name: 'UniCard',
		emits: ['click'],
		props: {
			title: {
				type: String,
				default: ''
			},
			subTitle: {
				type: String,
				default: ''
			},
			padding: {
				type: String,
				default: '10px'
			},
			margin: {
				type: String,
				default: '15px'
			},
			spacing: {
				type: String,
				default: '0 10px'
			},
			extra: {
				type: String,
				default: ''
			},
			cover: {
				type: String,
				default: ''
			},
			thumbnail: {
				type: String,
				default: ''
			},
			isFull: {
				// 内容区域是否通栏
				type: Boolean,
				default: false
			},
			isShadow: {
				// 是否开启阴影
				type: Boolean,
				default: true
			},
			shadow: {
				type: String,
				default: '0px 0px 3px 1px rgba(0, 0, 0, 0.08)'
			},
			border: {
				type: Boolean,
				default: true
			}
		},
		methods: {
			onClick(type) {
				this.$emit('click', type)
			}
		}
	}
</script>

<style lang="scss">
	$uni-border-3: #EBEEF5 !default;
	$uni-shadow-base:0 0px 6px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
	$uni-main-color: #3a3a3a !default;
	$uni-base-color: #6a6a6a !default;
	$uni-secondary-color: #909399 !default;
	$uni-spacing-sm: 8px !default;
	$uni-border-color:$uni-border-3;
	$uni-shadow: $uni-shadow-base;
	$uni-card-title: 15px;
	$uni-cart-title-color:$uni-main-color;
	$uni-card-subtitle: 12px;
	$uni-cart-subtitle-color:$uni-secondary-color;
	$uni-card-spacing: 10px;
	$uni-card-content-color: $uni-base-color;

	.uni-card {
		margin: $uni-card-spacing;
		padding: 0 $uni-spacing-sm;
		border-radius: 4px;
		overflow: hidden;
		font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif;
		background-color: #fff;
		flex: 1;

		.uni-card__cover {
			position: relative;
			margin-top: $uni-card-spacing;
			flex-direction: row;
			overflow: hidden;
			border-radius: 4px;
			.uni-card__cover-image {
				flex: 1;
				// width: 100%;
				/* #ifndef APP-PLUS */
				vertical-align: middle;
				/* #endif */
			}
		}

		.uni-card__header {
			display: flex;
			border-bottom: 1px $uni-border-color solid;
			flex-direction: row;
			align-items: center;
			padding: $uni-card-spacing;
			overflow: hidden;

			.uni-card__header-box {
				/* #ifndef APP-NVUE */
				display: flex;
				/* #endif */
				flex: 1;
				flex-direction: row;
				align-items: center;
				overflow: hidden;
			}

			.uni-card__header-avatar {
				width: 40px;
				height: 40px;
				overflow: hidden;
				border-radius: 5px;
				margin-right: $uni-card-spacing;
				.uni-card__header-avatar-image {
					flex: 1;
					width: 40px;
					height: 40px;
				}
			}

			.uni-card__header-content {
				/* #ifndef APP-NVUE */
				display: flex;
				/* #endif */
				flex-direction: column;
				justify-content: center;
				flex: 1;
				// height: 40px;
				overflow: hidden;

				.uni-card__header-content-title {
					font-size: $uni-card-title;
					color: $uni-cart-title-color;
					// line-height: 22px;
				}

				.uni-card__header-content-subtitle {
					font-size: $uni-card-subtitle;
					margin-top: 5px;
					color: $uni-cart-subtitle-color;
				}
			}

			.uni-card__header-extra {
				line-height: 12px;

				.uni-card__header-extra-text {
					font-size: 12px;
					color: $uni-cart-subtitle-color;
				}
			}
		}

		.uni-card__content {
			padding: $uni-card-spacing;
			font-size: 14px;
			color: $uni-card-content-color;
			line-height: 22px;
		}

		.uni-card__actions {
			font-size: 12px;
		}
	}

	.uni-card--border {
		border: 1px solid $uni-border-color;
	}

	.uni-card--shadow {
		position: relative;
		/* #ifndef APP-NVUE */
		box-shadow: $uni-shadow;
		/* #endif */
	}

	.uni-card--full {
		margin: 0;
		border-left-width: 0;
		border-left-width: 0;
		border-radius: 0;
	}

	/* #ifndef APP-NVUE */
	.uni-card--full:after {
		border-radius: 0;
	}

	/* #endif */
	.uni-ellipsis {
		/* #ifndef APP-NVUE */
		overflow: hidden;
		white-space: nowrap;
		text-overflow: ellipsis;
		/* #endif */
		/* #ifdef APP-NVUE */
		lines: 1;
		/* #endif */
	}
</style>