vuematerial/vue-material

View on GitHub
src/components/MdEmptyState/MdEmptyState.vue

Summary

Maintainability
Test Coverage
C
71%
<template>
  <transition name="md-empty-state" appear>
    <div class="md-empty-state" :class="[emptyStateClasses, $mdActiveTheme]" :style="emptyStateStyles">
      <div class="md-empty-state-container">
        <template v-if="mdIcon">
          <md-icon class="md-empty-state-icon" v-if="isAssetIcon(mdIcon)" :md-src="mdIcon"></md-icon>
          <md-icon class="md-empty-state-icon" v-else>{{ mdIcon }}</md-icon>
        </template>
        <strong class="md-empty-state-label" v-if="mdLabel">{{ mdLabel }}</strong>
        <p class="md-empty-state-description" v-if="mdDescription">{{ mdDescription }}</p>

        <slot />
      </div>
    </div>
  </transition>
</template>

<script>
  import MdComponent from 'core/MdComponent'
  import MdEmptyStateProps from './MdEmptyStateProps'
  import MdAssetIcon from 'core/mixins/MdAssetIcon/MdAssetIcon'

  export default new MdComponent({
    name: 'MdEmptyState',
    mixins: [MdAssetIcon],
    props: MdEmptyStateProps,
    computed: {
      emptyStateClasses () {
        return {
          'md-rounded': this.mdRounded
        }
      },
      emptyStateStyles () {
        if (this.mdRounded) {
          const size = this.mdSize + 'px'

          return {
            width: size,
            height: size
          }
        }
      }
    }
  })
</script>

<style lang="scss">
  @import "~components/MdAnimation/variables";
  @import "~components/MdIcon/mixins";

  @mixin md-empty-state-base () {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
  }

  .md-empty-state {
    @include md-empty-state-base;
    max-width: 420px;
    padding: 36px;
    margin: 0 auto;
    position: relative;
    transition: opacity .15s $md-transition-enter-timing,
                transform .3s $md-transition-enter-timing;
    will-change: transform, opacity;

    &.md-rounded {
      max-width: auto;
      border-radius: 50%;

      .md-empty-state-container {
        padding: 40px;
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
      }
    }

    .md-button {
      margin: .5em 0 0;
    }
  }

  .md-empty-state-enter {
    opacity: 0;
    transform: scale(.87);

    .md-empty-state-container {
      opacity: 0;
    }
  }

  .md-empty-state-container {
    @include md-empty-state-base;
    transition: opacity .4s $md-transition-default-timing;
    will-change: opacity;
  }

  .md-empty-state-icon {
    @include md-icon-size(160px);
    margin: 0;
  }

  .md-empty-state-label {
    font-size: 26px;
    font-weight: 500;
    line-height: 40px;
  }

  .md-empty-state-description {
    margin: 1em 0;
    font-size: 16px;
    line-height: 24px;
  }
</style>