<template>
	<view :class="[ 'uni-row', typeClass , justifyClass, alignClass, ]" :style="{
		marginLeft:`${Number(marginValue)}rpx`,
		marginRight:`${Number(marginValue)}rpx`,
	}">
		<slot></slot>
	</view>
</template>

<script>
	const ComponentClass = 'uni-row';
	const modifierSeparator = '--';
	/**
	 * Row	布局-行
	 * @description	流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。
	 * @tutorial	https://ext.dcloud.net.cn/plugin?id=3958
	 *
	 * @property	{gutter} type = Number 栅格间隔
	 * @property	{justify} type = String flex 布局下的水平排列方式
	 * 						可选	start/end/center/space-around/space-between	start
	 * 						默认值	start
	 * @property	{align} type = String flex 布局下的垂直排列方式
	 * 						可选	top/middle/bottom
	 * 						默认值	top
	 * @property	{width} type = String|Number nvue下需要自行配置宽度用于计算
	 * 						默认值 750
	 */


	export default {
		name: 'uniRow',
		componentName: 'uniRow',
		// #ifdef MP-WEIXIN
		options: {
			virtualHost: true // 在微信小程序中将组件节点渲染为虚拟节点,更加接近Vue组件的表现,可使用flex布局
		},
		// #endif
		props: {
			type: String,
			gutter: Number,
			justify: {
				type: String,
				default: 'start'
			},
			align: {
				type: String,
				default: 'top'
			},
			// nvue如果使用span等属性,需要配置宽度
			width: {
				type: [String, Number],
				default: 750
			}
		},
		created() {
			// #ifdef APP-NVUE
			this.type = 'flex';
			// #endif
		},
		computed: {
			marginValue() {
				// #ifndef APP-NVUE
				if (this.gutter) {
					return -(this.gutter / 2);
				}
				// #endif
				return 0;
			},
			typeClass() {
				return this.type === 'flex' ? `${ComponentClass + modifierSeparator}flex` : '';
			},
			justifyClass() {
				return this.justify !== 'start' ? `${ComponentClass + modifierSeparator}flex-justify-${this.justify}` : ''
			},
			alignClass() {
				return this.align !== 'top' ? `${ComponentClass + modifierSeparator}flex-align-${this.align}` : ''
			}
		}
	};
</script>

<style lang="scss">
	$layout-namespace: ".uni-";
	$row:$layout-namespace+"row";
	$modifier-separator: "--";

	@mixin utils-clearfix {
		$selector: &;

		@at-root {

			/* #ifndef APP-NVUE */
			#{$selector}::before,
			#{$selector}::after {
				display: table;
				content: "";
			}

			#{$selector}::after {
				clear: both;
			}

			/* #endif */
		}

	}

	@mixin utils-flex ($direction: row) {
		/* #ifndef APP-NVUE */
		display: flex;
		/* #endif */
		flex-direction: $direction;
	}

	@mixin set-flex($state) {
		@at-root &-#{$state} {
			@content
		}
	}

	#{$row} {
		position: relative;
		flex-direction: row;

		/* #ifdef APP-NVUE */
		flex: 1;
		/* #endif */

		/* #ifndef APP-NVUE */
		box-sizing: border-box;
		/* #endif */

		// 非nvue使用float布局
		@include utils-clearfix;

		// 在QQ、字节、百度小程序平台,编译后使用shadow dom,不可使用flex布局,使用float
		@at-root {

			/* #ifndef MP-QQ || MP-TOUTIAO || MP-BAIDU */
			&#{$modifier-separator}flex {
				@include utils-flex;
				flex-wrap: wrap;
				flex: 1;

				&:before,
				&:after {
					/* #ifndef APP-NVUE */
					display: none;
					/* #endif */
				}

				@include set-flex(justify-center) {
					justify-content: center;
				}

				@include set-flex(justify-end) {
					justify-content: flex-end;
				}

				@include set-flex(justify-space-between) {
					justify-content: space-between;
				}

				@include set-flex(justify-space-around) {
					justify-content: space-around;
				}

				@include set-flex(align-middle) {
					align-items: center;
				}

				@include set-flex(align-bottom) {
					align-items: flex-end;
				}
			}

			/* #endif */
		}

	}

	// 字节、QQ配置后不生效
	// 此处用法无法使用scoped
	/* #ifdef MP-WEIXIN || MP-TOUTIAO || MP-QQ */
	:host {
		display: block;
	}

	/* #endif */
</style>