JSFiddle - React, Tailwind, and code Playground

by Christian Gambardella

HTML

<script src="https://unpkg.com/[email protected]"></script>
<script src="https://unpkg.com/[email protected]"></script>
<script src="https://unpkg.com/vue@latest/dist/vue.js"></script>
<div id="app">
  <toasts :toasts="toasts" />
</div>

CSS

html, body, #editor {
  margin: 0;
  height: 100%;
  font-family: 'Helvetica Neue', Arial, sans-serif;
  color: #333;
}

textarea, #editor div {
  display: inline-block;
  width: 49%;
  height: 100%;
  vertical-align: top;
  box-sizing: border-box;
  padding: 0 20px;
}

textarea {
  border: none;
  border-right: 1px solid #ccc;
  resize: none;
  outline: none;
  background-color: #f6f6f6;
  font-size: 14px;
  font-family: 'Monaco', courier, monospace;
  padding: 20px;
}

code {
  color: #f66;
}

JavaScript

const Toasts = {
  name: 'Toasts',
  template: `
    <div class="toasts">
      <component
      	v-for="toast in toasts"
        :is="toast.component"
        @input="emitInput"
      />
    </div>
  `
  props: {
    toasts: {
    	type: Array,
      required: true
    }
  },
  methods: {
    emitInput (value) {
      this.$emit('input', value)
    }
  }
}

const Notification = {
  template: `<p>{{options.message}}</p>`,
  props: {
    options: {
      type: Object,
      required: true
    }
  }
}

new Vue({
  el: '#app',
  data () {
    return {
    	newMessage: '',
      toasts: [
        {
          component: Notification,
          options: { message: 'Here is the notification' }
        }
      ]
    }
  },
  methods: {
    notify (message) {
      this.toasts.push({
        {
          component: Notification,
          options: { message: message }
        }
      })
    },
    handleMessageClick () {
      const { notify, newMessage } = this
      notify(newMessage)
    }
  }
})