<template> <div class="m-message" v-show="visible"> <div class="m-message-icons" v-if="iconImg || $slots.icon"> <img :src="iconImg" v-if="iconImg" class="m-message--icon"/> <slot name="icon" v-else></slot> </div> <div class="m-message-content"> <div class="m-message--title" v-if="title || $slots.title"><slot name="title">{{ title }}</slot></div> <template v-if="supportHTML"> <div class="m-message--description" v-if="!collapsed" v-html="content"><slot></slot></div> </template> <template v-else> <div class="m-message--description" v-if="!collapsed"><slot>{{ content }}</slot></div> </template> </div> <div class="m-message--control"> <slot name="button"></slot> <button class="m-message--button m-message--arrow-down" v-if="collapsable && (title || $slots.title)" :class="{ 'is-collapsed': collapsed }" @click="triggerCollapse"> <svg viewBox="0 0 35 35" width="20" height="20" version="1.1" fill="currentColor"> <path class="st0" d="M9.4,13.9c-0.2,0.2-0.2,0.6,0,0.8l8.1,8.1l0,0l0,0l8.1-8.1c0.2-0.2,0.2-0.6,0-0.8l-1.3-1.3 c-0.2-0.2-0.6-0.2-0.8,0l-5.5,5.5c-0.2,0.2-0.6,0.2-0.8,0l-5.5-5.5c-0.2-0.2-0.6-0.2-0.8,0L9.4,13.9z"/> </svg> </button> <button class="m-message--button m-message--close" v-if="closable" @click="handleClose"> <svg viewBox="0 0 35 35" width="20" height="20" version="1.1" fill="currentColor"> <path d="M19.5,17.5l5.1,5.1l-2,2l-5.1-5.1l-5.1,5.1l-2-2l5.1-5.1l-5.1-5.1l2-2l5.1,5.1l5.1-5.1l2,2L19.5,17.5z"></path> </svg> </button> </div> </div> </template> <script> export default { name: 'm-message', props: { iconImg: String, closable: Boolean, closeHandler: Function, title: String, content: String, supportHTML: Boolean, // content support html isCollapsed: { type: Boolean, default: true }, collapsable: { type: Boolean, default: true } }, data () { return { visible: true, collapsed: this.isCollapsed } }, methods: { triggerCollapse () { this.collapsed = !this.collapsed }, close () { this.visible = false }, handleClose () { if (typeof this.closeHandler === 'function') this.closeHandler(this.close) else this.close() } } } </script>