[
  {
    "path": "1-instalacion-data-binding/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <h1>{{ mensaje }}</h1>\n        <input type=\"text\" v-model=\"mensaje\">\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "1-instalacion-data-binding/js/main.js",
    "content": "// Vanilla JavaScript\n// const input = document.querySelector('input');\n// const h1 = document.querySelector('h1');\n// input.addEventListener('keyup', () => h1.innerHTML = input.value);\n\n// Vue.js\nnew Vue({\n    el: 'main',\n    data: {\n        mensaje: 'Hola mundo!',\n    }\n});"
  },
  {
    "path": "10-transiciones/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"https://unpkg.com/animate.css@3.5.1/animate.min.css\" rel=\"stylesheet\" type=\"text/css\">\n    <style>\n        /* Transition */\n        .aparecer-enter {\n            opacity: 0;\n        }\n        \n        .aparecer-enter-active {\n            transition: opacity 1s;\n        }\n        \n        .aparecer-leave-to {\n            opacity: 0;\n        }\n        \n        .aparecer-leave-active {\n            transition: opacity 1s;\n        }\n        /* Animation */\n        .bote-enter-active {\n            animation: bounce-in .5s;\n        }\n        \n        .bote-leave-active {\n            animation: bounce-out .5s;\n        }\n        \n        @keyframes bounce-in {\n            0% {\n                transform: scale(0);\n            }\n            50% {\n                transform: scale(1.5);\n            }\n            100% {\n                transform: scale(1);\n            }\n        }\n        \n        @keyframes bounce-out {\n            0% {\n                transform: scale(1);\n            }\n            50% {\n                transform: scale(1.5);\n            }\n            100% {\n                transform: scale(0);\n            }\n        }\n    </style>\n</head>\n\n<body>\n    <main>\n        <button @click=\"mostrar = !mostrar\">Mostrar/Ocultar</button>\n        <!-- Transition -->\n        <transition name=\"aparecer\" appear>\n            <h1 v-if=\"mostrar\" v-text=\"mensajes.transicion\"></h1>\n        </transition>\n\n        <!-- Animation -->\n        <transition name=\"bote\">\n            <h1 v-if=\"mostrar\" v-text=\"mensajes.animacion\"></h1>\n        </transition>\n\n        <!-- Animate.css -->\n        <transition\n            name=\"animate.css\"\n            enter-active-class=\"animated rotateInUpLeft\"\n            leave-active-class=\"animated zoomOutUp\">\n            <h1 v-if=\"mostrar\" v-text=\"mensajes.animationCustom\"></h1>\n        </transition>\n\n        <!-- Transición entre diferentes elementos -->\n       <transition name=\"aparecer\" mode=\"out-in\">\n            <h1 v-if=\"mostrar\" v-text=\"mensajes.entreElementos\" key=\"aparecer\"></h1>\n            <h1 v-else key=\"ocultar\">No hay mensaje</h1>\n        </transition>\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "10-transiciones/main.js",
    "content": "new Vue({\n    el: 'main',\n    data: {\n        mostrar: true,\n        mensajes: {\n            transicion: 'Transiciones CSS con Vue.js',\n            animacion: 'Animaciones CSS con Vue.js',\n            animationCustom: 'Animaciones custom CSS con Vue.js',\n            entreElementos: 'Transiciones entre elementos con Vue.js'\n        }\n    },\n});"
  },
  {
    "path": "11-ajax-vue-resource/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <img \n            v-for=\"persona in personas\" \n            :src=\"persona.picture.thumbnail\" \n            :alt=\"persona.name.first\">\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"https://cdn.jsdelivr.net/vue.resource/1.0.3/vue-resource.min.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "11-ajax-vue-resource/js/main.js",
    "content": "new Vue({\n    el: 'main',\n    mounted() {\n        this.cargarPersonas();\n    },\n    data: {\n        personas: []\n    },\n    methods: {\n        cargarPersonas() {\n            this.$http.get('https://randomuser.me/api/?results=500')\n                .then((respuesta) => {\n                    this.personas = respuesta.body.results;\n                });\n        }\n    }\n});"
  },
  {
    "path": "12-ajax-axios/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <img \n            v-for=\"persona in personas\" \n            :src=\"persona.picture.thumbnail\" \n            :alt=\"persona.name.first\">\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"https://unpkg.com/axios/dist/axios.min.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "12-ajax-axios/js/main.js",
    "content": "Vue.prototype.$http = axios;\n\nnew Vue({\n    el: 'main',\n    mounted() {\n        this.cargarPersonas();\n    },\n    data: {\n        personas: []\n    },\n    methods: {\n        cargarPersonas() {\n            this.$http.get('https://randomuser.me/api/?results=500')\n                .then((respuesta) => {\n                    this.personas = respuesta.data.results;\n                });\n            // axios.get('https://randomuser.me/api/?results=500')\n            //     .then((respuesta) => {\n            //         this.personas = respuesta.data.results;\n            //     });\n        }\n    }\n});"
  },
  {
    "path": "13-components-intro/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <!--<ul>\n            <li v-for=\"tarea in tareasAjax\" v-text=\"tarea.title\"></li>\n        </ul>-->\n\n<!--        <h1>Tareas Ajax</h1>\n        <mis-tareas :tareas=\"tareasAjax\"></mis-tareas>\n\n        <hr>\n        <h1>Tareas locales</h1>\n        <mis-tareas :tareas=\"tareasLocales\"></mis-tareas>-->\n\n        <h1>Las tareas</h1>\n        <mis-tareas></mis-tareas>\n\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"https://unpkg.com/axios/dist/axios.min.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "13-components-intro/js/main.js",
    "content": "Vue.component('mis-tareas', {\n    template: `<ul><li v-for=\"tarea in tareas\">{{ tarea.title }}</li></ul>`,\n    mounted() {\n        axios.get('https://jsonplaceholder.typicode.com/todos')\n            .then((respuesta) => {\n                this.tareas = respuesta.data;\n            });\n    },\n    data()  {\n        return {\n            tareas: [],\n        }\n    }\n});\n\nnew Vue({\n    el: 'main',\n});"
  },
  {
    "path": "14-components-templates/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n<main>\n    <elegir-ganador :listado=\"personas\" inline-template>\n        <div>\n            <h1 v-if=\"ganador\">El ganador es: {{ ganador }}</h1>\n            <template v-else>\n                <h1>Participantes</h1>\n                <ul>\n                    <li v-for=\"persona in listado\">{{ persona }}</li>\n                </ul>\n            </template>\n            <button @click=\"elegirGanador\">Elegir ganador</button>\n        </div>\n    </elegir-ganador>\n    <pre>{{ $data }}</pre>\n</main>\n\n<!-- Con tag template :) -->\n<!--<template id=\"elegir-ganador-template\">\n    <div>\n        <h1 v-if=\"ganador\">El ganador es: {{ ganador }}</h1>\n        <template v-else>\n            <h1>Participantes</h1>\n            <ul>\n                <li v-for=\"persona in listado\">{{ persona }}</li>\n            </ul>\n        </template>\n        <button @click=\"elegirGanador\">Elegir ganador</button>\n    </div>\n</template>-->\n<!-- Con script :( -->\n<!--<script type=\"text/template\" id=\"elegir-ganador-template\">\n    <div>\n        <h1 v-if=\"ganador\">El ganador es: {{ ganador }}</h1>\n        <template v-else>\n            <h1>Participantes</h1>\n            <ul>\n                <li v-for=\"persona in listado\">{{ persona }}</li>\n            </ul>\n        </template>\n        <button @click=\"elegirGanador\">Elegir ganador</button>\n    </div>\n</script>-->\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"js/main.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "14-components-templates/js/main.js",
    "content": "Vue.component('elegir-ganador', {\n    props: ['listado'],\n    //template: '#elegir-ganador-template',\n/*    template: `<div>\n                    <h1 v-if=\"ganador\">El ganador es: {{ ganador }}</h1>\n                    <template v-else>\n                        <h1>Participantes</h1>\n                        <ul>\n                            <li v-for=\"persona in listado\">{{ persona }}</li>\n                        </ul>\n                    </template>\n                    <button @click=\"elegirGanador\">Elegir ganador</button>\n                </div>\n               `,*/\n    methods: {\n        elegirGanador() {\n            let cantidad = this.participantes.length;\n            let indice = Math.floor((Math.random() * cantidad));\n            this.ganador = this.participantes[indice - 1];\n        }\n    },\n    data() {\n        return {\n            ganador: false,\n            participantes: this.listado\n        }\n    },\n});\n\nnew Vue({\n    el: 'main',\n    data: {\n        personas: [\n            'Juan', 'Alicia', 'Pedro', 'Javier', 'Marcos'\n        ]\n    },\n});"
  },
  {
    "path": "15-components-props/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n<main>\n    <autor :nombre=\"autor\" :edad=\"99\"></autor>\n    <pre>{{ $data }}</pre>\n</main>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"js/main.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "15-components-props/js/main.js",
    "content": "Vue.component('autor', {\n    props: ['nombre', 'edad'],\n    mounted() {\n        // Las props son accesibles desde this (proxy)\n        //console.log(this.nombre);\n        console.log(typeof this.edad);\n    },\n    template: `<div><h1> {{ nombre }} </h1><button @click=\"cambiarProp\">Cambiar Prop</button></div>`,\n    methods: {\n        cambiarProp() {\n            this.nombre = this.nombre.toUpperCase();\n        }\n    }\n});\n\nnew Vue({\n    el: 'main',\n    data: {\n        autor: 'Juan Andrés',\n    },\n});"
  },
  {
    "path": "16-prop-validation/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n\n<main>\n    <candidato v-for=\"candidato in candidatos\"\n               :nombre=\"candidato.name.first\"\n               :correoe=\"candidato.email\"\n               :imagen=\"candidato.picture.thumbnail\"\n               >\n    </candidato>\n    <pre>{{ $data }}</pre>\n</main>\n\n<template id=\"candidato-template\">\n    <blockquote>\n        <img :src=\"imagen\" align=\"right\">\n        <h1> {{ nombre }} </h1>\n        <h2> {{ correoe }}</h2>\n        <ul>\n            <li v-for=\"(value, key, index) in location\">\n                {{ value }}\n            </li>\n        </ul>\n        <hr>\n    </blockquote>\n</template>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"https://unpkg.com/axios/dist/axios.min.js\"></script>\n<script src=\"js/main.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "16-prop-validation/js/main.js",
    "content": "Vue.component('candidato', {\n    /*props: ['nombre', 'correoe', 'imagen'],*/\n    props: {\n        nombre: {\n            type: [String, Array], // null = *\n            required: true,\n        },\n        correoe: {\n            type: String,\n            default: 'juan@wmedia.es'\n        },\n        imagen: String,\n        location: {\n            type: Object,\n            default() {\n                return {\n                    ciudad: 'Valencia',\n                }\n            }\n        },\n    },\n    template: '#candidato-template',\n});\n\nnew Vue({\n    el: 'main',\n    mounted() {\n        this.obtenerCandidatos();\n    },\n    data: {\n        candidatos: [],\n    },\n    methods: {\n        obtenerCandidatos() {\n            axios.get('https://randomuser.me/api/?results=100')\n                .then((respuesta) => {\n                    this.candidatos = respuesta.data.results;\n                });\n        }\n    }\n});"
  },
  {
    "path": "17-slots-named-slots/css/main.css",
    "content": "/* Bloques */\n.alerta {\n    width: 300px;\n    border-radius: 15px;\n    background-color: lightgray;\n    border: 1px solid white;\n    box-shadow: 1px 1px 2px gray;\n    font-family: sans-serif;\n    position: absolute;\n}\n\n/* Elementos */\n.alerta__header {\n    border-bottom: 1px solid white;\n    padding: 10px;\n    text-align: center;\n    font-weight: bold;\n}\n\n.alerta__contenido {\n    font-size: 14px;\n    padding: 20px;\n}\n\n.alerta__footer {\n    border-top: 1px solid white;\n    text-align: center;\n    padding: 10px;\n    font-size: 12px;\n}\n\n/* Modificadores */\n/* Estilo */\n.alerta--error {\n    background-color: indianred;\n}\n.alerta--advertencia {\n    background-color: lightgoldenrodyellow;\n}\n.alerta--exito {\n    background-color: lightgreen;\n}\n\n/* Posición */\n.alerta--arriba-izquierda {\n    left: 0;\n    top: 0;\n}\n.alerta--abajo-izquierda {\n    left: 0;\n    bottom: 0;\n}\n.alerta--arriba-derecha {\n    right: 0;\n    top: 0;\n}\n.alerta--abajo-derecha {\n    right: 0;\n    bottom: 0;\n}"
  },
  {
    "path": "17-slots-named-slots/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/main.css\">\n</head>\n<body>\n\n<main>\n    <alerta tipo=\"alerta--exito\" posicion=\"alerta--arriba-derecha\">\n        <template slot=\"header\">Todo ok :)</template>\n        <template>Este es el nuevo contenido del alerta :)</template>\n        <template slot=\"footer\">Puedes continuar con normalidad</template>\n    </alerta>\n\n    <alerta tipo=\"alerta--error\" posicion=\"alerta--arriba-izquierda\">\n        <template slot=\"header\">Error fatal</template>\n        <template>El mundo está a punto de implosionar</template>\n        <template slot=\"footer\">RIP</template>\n    </alerta>\n\n    <alerta tipo=\"alerta--advertencia\" posicion=\"alerta--abajo-izquierda\">\n        <template slot=\"header\">Atención</template>\n        <template>Este es el nuevo contenido del alerta :)</template>\n        <template slot=\"footer\">Puedes continuar con normalidad</template>\n    </alerta>\n\n    <pre>{{ $data }}</pre>\n</main>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "17-slots-named-slots/js/main.js",
    "content": "Vue.component('alerta', {\n    props: ['tipo', 'posicion'],\n    template: `\n            <section class=\"alerta\" :class=\"[tipo, posicion]\">\n                <header class=\"alerta__header\">\n                        <slot name=\"header\">Hola</slot>\n                </header>\n                <div class=\"alerta__contenido\">\n                        <slot>\n                            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dictum dui justo, at molestie orci dapibus\n                            vitae.\n                        </slot>\n                </div>\n                <footer class=\"alerta__footer\">\n                        <slot name=\"footer\">Este es el texto del footer</slot>\n                </footer>\n            </section>`,\n});\n\nnew Vue({\n    el: 'main',\n});"
  },
  {
    "path": "18-scoped-slots/css/main.css",
    "content": "/* Bloques */\n.alerta {\n    width: 300px;\n    border-radius: 15px;\n    background-color: lightgray;\n    border: 1px solid white;\n    box-shadow: 1px 1px 2px gray;\n    font-family: sans-serif;\n    position: absolute;\n}\n\n/* Elementos */\n.alerta__header {\n    border-bottom: 1px solid white;\n    padding: 10px;\n    text-align: center;\n    font-weight: bold;\n}\n\n.alerta__contenido {\n    font-size: 14px;\n    padding: 20px;\n}\n\n.alerta__footer {\n    border-top: 1px solid white;\n    text-align: center;\n    padding: 10px;\n    font-size: 12px;\n}\n\n/* Modificadores */\n/* Estilo */\n.alerta--error {\n    background-color: indianred;\n}\n.alerta--advertencia {\n    background-color: lightgoldenrodyellow;\n}\n.alerta--exito {\n    background-color: lightgreen;\n}\n\n/* Posición */\n.alerta--arriba-izquierda {\n    left: 0;\n    top: 0;\n}\n.alerta--abajo-izquierda {\n    left: 0;\n    bottom: 0;\n}\n.alerta--arriba-derecha {\n    right: 0;\n    top: 0;\n}\n.alerta--abajo-derecha {\n    right: 0;\n    bottom: 0;\n}"
  },
  {
    "path": "18-scoped-slots/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/main.css\">\n</head>\n<body>\n\n<main>\n    <mis-tareas :listado=\"tareas\">\n        <template slot=\"tarea\" scope=\"datos\">\n            <li> <h1>{{ datos.title }}</h1></li>\n        </template>\n    </mis-tareas>\n\n    <mis-tareas :listado=\"tareas\">\n        <template slot=\"tarea\" scope=\"datos\">\n            <li>{{ datos.title }}</li>\n        </template>\n    </mis-tareas>\n\n    <mis-tareas :listado=\"tareas\">\n        <template slot=\"tarea\" scope=\"datos\">\n            <li>🐱{{ datos.title }}</li>\n        </template>\n    </mis-tareas>\n\n    <pre>{{ $data }}</pre>\n</main>\n\n<!-- Template -->\n<template id=\"mis-tareas-template\">\n    <ul>\n        <slot name=\"tarea\" v-for=\"tarea in listado\" :title=\"tarea.titulo\"></slot>\n<!--        <li v-for=\"tarea in listado\">\n            {{ tarea.titulo }}\n        </li>-->\n    </ul>\n</template>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "18-scoped-slots/js/main.js",
    "content": "Vue.component('mis-tareas', {\n    props: ['listado'],\n    template: '#mis-tareas-template'\n});\n\nnew Vue({\n    el: 'main',\n    data: {\n        tareas: [\n            { titulo: 'Salir a correr'},\n            { titulo: 'Recoger la casa'},\n            { titulo: 'Aprender Vue.js'},\n            { titulo: 'Ir al gimnasio'},\n            { titulo: 'Leer cada día'},\n        ]\n    }\n});"
  },
  {
    "path": "19-custom-events/css/main.css",
    "content": "html, body {\n    width: 100%;\n    height: 100%;\n}\n\nbody {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n}\n\nbutton {\n    font-size: 16px;\n}\n\n/* Bloques */\n.alerta {\n    width: 300px;\n    border-radius: 15px;\n    background-color: lightgray;\n    border: 1px solid white;\n    box-shadow: 1px 1px 2px gray;\n    font-family: sans-serif;\n    position: absolute;\n}\n\n/* Elementos */\n.alerta__header {\n    border-bottom: 1px solid white;\n    padding: 10px;\n    text-align: center;\n    font-weight: bold;\n}\n\n.alerta__header a {\n    float: right;\n    font-size: 10px;\n    text-decoration: none;\n    color: black;\n}\n\n.alerta__contenido {\n    font-size: 14px;\n    padding: 20px;\n}\n\n.alerta__footer {\n    border-top: 1px solid white;\n    text-align: center;\n    padding: 10px;\n    font-size: 12px;\n}\n\n/* Modificadores */\n/* Estilo */\n.alerta--error {\n    background-color: indianred;\n}\n.alerta--advertencia {\n    background-color: lightgoldenrodyellow;\n}\n.alerta--exito {\n    background-color: lightgreen;\n}\n\n/* Posición */\n.alerta--arriba-izquierda {\n    left: 0;\n    top: 0;\n}\n.alerta--abajo-izquierda {\n    left: 0;\n    bottom: 0;\n}\n.alerta--arriba-derecha {\n    right: 0;\n    top: 0;\n}\n.alerta--abajo-derecha {\n    right: 0;\n    bottom: 0;\n}"
  },
  {
    "path": "19-custom-events/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/main.css\">\n</head>\n<body>\n\n<main>\n    <button @click=\"mostrarExito = true\">Exito</button>\n    <button @click=\"mostrarError = true\">Error</button>\n    <button @click=\"mostrarAdvertencia = true\">Advertencia</button>\n\n    <alerta @ocultar=\"mostrarExito = false\" v-show=\"mostrarExito\" tipo=\"alerta--exito\" posicion=\"alerta--arriba-derecha\">\n        <template slot=\"header\">Todo ok :)</template>\n        <template>Este es el nuevo contenido del alerta :)</template>\n        <template slot=\"footer\">Puedes continuar con normalidad</template>\n    </alerta>\n\n    <alerta @ocultar=\"mostrarError = false\" v-show=\"mostrarError\" tipo=\"alerta--error\" posicion=\"alerta--arriba-izquierda\">\n        <template slot=\"header\">Error fatal</template>\n        <template>El mundo está a punto de implosionar</template>\n        <template slot=\"footer\">RIP</template>\n    </alerta>\n\n    <alerta @ocultar=\"mostrarAdvertencia = false\" v-show=\"mostrarAdvertencia\" tipo=\"alerta--advertencia\" posicion=\"alerta--abajo-izquierda\">\n        <template slot=\"header\">Atención</template>\n        <template>Este es el nuevo contenido del alerta :)</template>\n        <template slot=\"footer\">Puedes continuar con normalidad</template>\n    </alerta>\n\n    <pre>{{ $data }}</pre>\n</main>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "19-custom-events/js/main.js",
    "content": "Vue.component('alerta', {\n    props: ['tipo', 'posicion'],\n    template: `\n            <section class=\"alerta\" :class=\"[tipo, posicion]\">\n                <header class=\"alerta__header\">\n                        <a href=\"#\" @click=\"ocultarWidget\">Cerrar</a>\n                        <slot name=\"header\">Hola</slot>\n                </header>\n                <div class=\"alerta__contenido\">\n                        <slot>\n                            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dictum dui justo, at molestie orci dapibus\n                            vitae.\n                        </slot>\n                </div>\n                <footer class=\"alerta__footer\">\n                        <slot name=\"footer\">Este es el texto del footer</slot>\n                </footer>\n            </section>`,\n    methods: {\n        ocultarWidget() {\n            this.$emit('ocultar');\n        }\n    }\n});\n\nnew Vue({\n    el: 'main',\n    data: {\n        mostrarExito: false,\n        mostrarError: false,\n        mostrarAdvertencia: false,\n    }\n});"
  },
  {
    "path": "2-directivas-incluidas/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <h1 v-if=\"conectado\">Estoy conectado</h1>\n\n        <h2 v-if=\"edad < 18\">No puedes entrar.</h2>\n        <h2 v-else-if=\"edad > 200\">Eres inmortal.</h2>\n        <h2 v-else>Puedes entrar.</h2>\n\n        <template v-if=\"conectado\">\n            <h3>Bienvenido Juan</h3>\n            <ul>\n                <li>\n                    <a href=\"#\">Mis datos</a>\n                    <a href=\"#\">Mensajes</a>\n                    <a href=\"#\">Salir</a>\n                </li>\n            </ul>\n        </template>\n        <h4 v-else>No estás conectado :(</h4>\n\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "2-directivas-incluidas/js/main.js",
    "content": "const vm = new Vue({\n    el: 'main',\n    data:  {\n        conectado: false,\n        edad: 44,\n    },\n});"
  },
  {
    "path": "20-component-communication/css/main.css",
    "content": "html {\n    box-sizing: border-box;\n}\n*, *:before, *:after {\n    box-sizing: inherit;\n}\n\nhtml, body {\n    width: 100%;\n    height: 100%;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n}\n\nmain {\n    display: flex;\n    flex-wrap: wrap;\n    width: 700px;\n    justify-content: space-between;\n    align-items: center;\n}\n\nhr, pre {\n    flex-basis: 100%;\n}"
  },
  {
    "path": "20-component-communication/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/main.css\">\n</head>\n<body>\n\n<main>\n    <listado-productos :productos=\"productos\"></listado-productos>\n    <carrito-compra></carrito-compra>\n    <hr>\n    <pre>{{ $data }}</pre>\n</main>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "20-component-communication/js/main.js",
    "content": "const eventBus = new Vue();\n\nVue.component('listado-productos', {\n    props: ['productos'],\n    template: `\n        <section>\n            <ul>\n                <li v-for=\"producto in productos\">\n                    {{ producto.nombre }} - \n                    <small>{{ producto.precio.toFixed(2) }} €</small>\n                    <button @click=\"eliminarProducto(producto.precio)\">-</button>\n                    <button @click=\"anadirProducto(producto.precio)\">+</button>\n                </li>\n            </ul>\n        </section>`,\n    methods: {\n        anadirProducto(precio){\n            eventBus.$emit('anadir', precio);\n        },\n        eliminarProducto(precio) {\n            eventBus.$emit('eliminar', precio);\n        },\n    }\n});\n\nVue.component('carrito-compra', {\n    template: `\n        <section>\n            <h1> {{ total.toFixed(2) }} € </h1>\n            <h3> {{ cantidadProductos }} productos </h3>\n        </section>`,\n    data() {\n        return {\n            cantidadProductos: 0,\n            total: 0,\n        }\n    },\n    created() {\n        eventBus.$on('anadir', (precio) => {\n            if (this.total >= 0) {\n                this.total += precio;\n                this.cantidadProductos++;\n            }\n        });\n        eventBus.$on('eliminar', (precio) => {\n            if (this.total > 0) {\n                this.total -= precio;\n                this.cantidadProductos--;\n            }\n        });\n    }\n});\n\nnew Vue({\n    el: 'main',\n    data: {\n        productos: [\n            {nombre: 'Libro ES6', precio: 39},\n            {nombre: 'Portátil', precio: 1300},\n            {nombre: 'Café', precio: 2},\n            {nombre: 'Auriculares', precio: 80},\n            {nombre: 'Moleskine', precio: 19},\n        ]\n    }\n});"
  },
  {
    "path": "21-components-inside-components/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n<body>\n\n<main>\n    <lista-tareas :tareas=\"tareas\">\n        Tareas que necesito finalizar ya!\n    </lista-tareas>\n    <pre>{{ $data }}</pre>\n</main>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "21-components-inside-components/js/main.js",
    "content": "Vue.component('lista-tareas', {\n    props: ['tareas'],\n    template: `<div>\n                <h1><slot></slot></h1>\n                <ul>\n                    <tarea v-for=\"tarea in tareas\" :tarea=\"tarea\"></tarea>\n                </ul>\n            </div>`,\n});\n\nVue.component('tarea', {\n    props: ['tarea'],\n    template: `<li> {{ tarea }}</li>`\n});\n\nnew Vue({\n    el: 'main',\n    data: {\n        tareas: [\n            'Finalizar sección Componentes',\n            'Iniciar workflow con Vue CLI y Webpack',\n            'Terminar de estudiar la documentación de Vuex',\n            'Seguir jugando con Vue Router y grabar el primer vídeo',\n        ]\n    }\n});"
  },
  {
    "path": "22-dynamic-components/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n<body>\n\n<main>\n    <button @click=\"seleccionado = 'lista-tareas'\">Tareas</button>\n    <button @click=\"seleccionado = 'contacto'\">Contacto</button>\n    <button @click=\"seleccionado = 'bio'\">BIO</button>\n\n    <component :is=\"seleccionado\"></component>\n\n<!--    <lista-tareas></lista-tareas>\n    <contacto></contacto>\n    <bio></bio>-->\n    <pre>{{ $data }}</pre>\n</main>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "22-dynamic-components/js/main.js",
    "content": "Vue.component('lista-tareas', {\n    template: `<div>\n                <h1><slot></slot></h1>\n                <ul>\n                    <tarea v-for=\"tarea in tareas\" :tarea=\"tarea\"></tarea>\n                </ul>\n                <hr>\n            </div>`,\n    data() {\n        return {\n            tareas:[\n                'Finalizar sección Componentes',\n                'Iniciar workflow con Vue CLI y Webpack',\n                'Terminar de estudiar la documentación de Vuex',\n                'Seguir jugando con Vue Router y grabar el primer vídeo',\n            ],\n        }\n    }\n});\n\nVue.component('tarea', {\n    props: ['tarea'],\n    template: `<li> {{ tarea }}</li>`\n});\n\nVue.component('contacto', {\n   template: `<div><a href=\"mailto:juan@wmedia.es\">juan@wmedia.es</a> <hr></div>`,\n});\n\nVue.component('bio', {\n    template: `<div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer lacinia sit amet magna quis maximus. Vivamus eget consectetur tellus. Sed diam ante, dictum sit amet tincidunt ac, facilisis eget dui. </p><hr></div>`,\n});\n\nnew Vue({\n    el: 'main',\n    data: {\n        seleccionado: 'lista-tareas'\n    }\n});"
  },
  {
    "path": "23-custom-input-components/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n<body>\n\n<main>\n    <!--<input type=\"text\" v-model=\"contrasena\">-->\n    <!--<input type=\"text\" :value=\"contrasena\" @input=\"contrasena = $event.target.value\">-->\n    <contrasena v-model=\"contrasena\"></contrasena>\n    <pre>{{ $data }}</pre>\n</main>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "23-custom-input-components/js/main.js",
    "content": "Vue.component('contrasena', {\n    props: ['contrasena'],\n    template: `<input :value=\"contrasena\" @input=\"comprobarContrasena($event.target.value)\" ref=\"pass\">`,\n    methods: {\n        comprobarContrasena(contrasena) {\n            if (this.noValidas.includes(contrasena)) {\n                this.$refs.pass.value = contrasena = '';\n            }\n            this.$emit('input', contrasena);\n        }\n    },\n    data() {\n        return {\n            noValidas: ['abc', 'admin', '123456', 'root'],\n        }\n    }\n});\n\nnew Vue({\n    el: 'main',\n    data: {\n        contrasena: 'es3Es653!*&__',\n    },\n});"
  },
  {
    "path": "24-ejercicio-components/finalizado/css/main.css",
    "content": "html {\n    box-sizing: border-box;\n}\n*, *:before, *:after {\n    box-sizing: inherit;\n}\n\nhtml, body {\n    width: 100%;\n    height: 100%;\n}\n\nbody {\n    display: flex;\n    justify-content: center;\n    align-items: flex-start;\n}\n\n.cabecera {\n    display: flex;\n    justify-content: space-around;\n    align-items: center;\n}\n\n.cabecera slot {\n    flex-basis: 40%;\n}\n\n.cabecera input {\n    flex-basis: 60%;\n}\n\n.usuarios {\n    margin: 20px;\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-between;\n    align-items: flex-start;\n}\n\n.usuario {\n    padding: 10px;\n    flex-basis: 33%;\n    border: 1px solid gray;\n    border-radius: 10px;\n    display: flex;\n}\n\n.usuario img {\n    flex-basis: 33%;\n}\n\n.usuario section {\n    flex-basis: 66%;\n}\n\npre {\n    flex-basis: 100%;\n}"
  },
  {
    "path": "24-ejercicio-components/finalizado/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/main.css\">\n</head>\n<body>\n\n<main>\n    <usuarios>\n        <h1>Usuarios de la empresa</h1>\n    </usuarios>\n</main>\n\n<template id=\"usuarios-template\">\n    <div>\n        <section class=\"cabecera\">\n            <slot></slot>\n            <input type=\"search\" placeholder=\"Filtrar usuario\" v-model=\"busqueda\">\n        </section>\n        <hr>\n        <section class=\"usuarios\">\n            <usuario :datos=\"usuario\" v-for=\"usuario in filtrarUsuarios\"></usuario>\n        </section>\n    </div>\n</template>\n<template id=\"usuario-template\">\n    <div class=\"usuario\">\n        <img align=\"left\" :src=\"datos.foto\" :alt=\"datos.nombre\">\n        <section>\n            <h1>{{ datos.nombre }}</h1>\n            <small>{{ datos.correoe}}</small>\n        </section>\n    </div>\n</template>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"https://unpkg.com/axios/dist/axios.min.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "24-ejercicio-components/finalizado/js/main.js",
    "content": "Vue.component('usuarios', {\n    props: ['fuente'],\n    template: '#usuarios-template',\n    mounted() {\n        axios.get('https://randomuser.me/api/?results=500')\n            .then((datos) => {\n                const listado = datos.data.results.map((usuario) => {\n                    return {\n                        nombre: `${usuario.name.title}  ${usuario.name.first} ${usuario.name.last}`,\n                        correoe: usuario.email,\n                        foto: usuario.picture.medium,\n                    };\n                });\n                this.usuarios = listado;\n            });\n    },\n    data() {\n        return {\n            usuarios: [],\n            busqueda: '',\n        }\n    },\n    computed: {\n        filtrarUsuarios() {\n            return this.usuarios.filter((usuario) => {\n                return usuario.nombre.includes(this.busqueda)\n            });\n        }\n    }\n});\n\nVue.component('usuario', {\n    props: ['datos'],\n    template: '#usuario-template',\n});\n\nnew Vue({\n    el: 'main',\n});"
  },
  {
    "path": "24-ejercicio-components/inicio/css/main.css",
    "content": "html {\n    box-sizing: border-box;\n}\n*, *:before, *:after {\n    box-sizing: inherit;\n}\n\nhtml, body {\n    width: 100%;\n    height: 100%;\n}\n\nbody {\n    display: flex;\n    justify-content: center;\n    align-items: flex-start;\n}\n\n.cabecera {\n    display: flex;\n    justify-content: space-around;\n    align-items: center;\n}\n\n.cabecera slot {\n    flex-basis: 40%;\n}\n\n.cabecera input {\n    flex-basis: 60%;\n}\n\n.usuarios {\n    margin: 20px;\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-between;\n    align-items: flex-start;\n}\n\n.usuario {\n    padding: 10px;\n    flex-basis: 33%;\n    border: 1px solid gray;\n    border-radius: 10px;\n    display: flex;\n}\n\n.usuario img {\n    flex-basis: 33%;\n}\n\n.usuario section {\n    flex-basis: 66%;\n}\n\npre {\n    flex-basis: 100%;\n}"
  },
  {
    "path": "24-ejercicio-components/inicio/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/main.css\">\n</head>\n<body>\n\n<main>\n    <usuarios>\n        <h1>Usuarios de mi startup</h1>\n    </usuarios>\n</main>\n\n<template id=\"usuarios-template\">\n    <div>\n        <section class=\"cabecera\">\n            <slot></slot>\n            <input type=\"search\" placeholder=\"Filtrar usuarios\" v-model=\"busqueda\">\n        </section>\n        <hr>\n        <section class=\"usuarios\">\n            <usuario :datos=\"usuario\" v-for=\"usuario in filtrarUsuarios\"></usuario>\n        </section>\n    </div>\n</template>\n\n<template id=\"usuario-template\">\n    <div class=\"usuario\">\n        <img align=\"left\" :src=\"datos.foto\" :alt=\"datos.nombre\">\n        <section>\n            <h1>{{ datos.nombre }}</h1>\n            <small>{{ datos.correoe }}</small>\n        </section>\n    </div>\n</template>\n<script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n<script src=\"https://unpkg.com/axios/dist/axios.min.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "24-ejercicio-components/inicio/js/main.js",
    "content": "Vue.component('usuarios', {\n    template: '#usuarios-template',\n    mounted() {\n        axios.get('https://randomuser.me/api/?results=500')\n            .then((datos) => {\n                const listado = datos.data.results.map((usuario) => {\n                    return {\n                        nombre: `${usuario.name.title} ${usuario.name.first} ${usuario.name.last}`,\n                        correoe: usuario.email,\n                        foto: usuario.picture.medium,\n                    }\n                });\n                this.usuarios = listado;\n            });\n    },\n    data() {\n        return {\n            usuarios: [],\n            busqueda: '',\n        }\n    },\n    computed: {\n        filtrarUsuarios() {\n            return this.usuarios.filter((usuario) => {\n                return usuario.nombre.includes(this.busqueda);\n            });\n        }\n    }\n});\n\nVue.component('usuario', {\n    props: ['datos'],\n    template: '#usuario-template',\n});\n\nnew Vue({\n    el: 'main',\n});"
  },
  {
    "path": "25-vue-cli/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"es2015\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "25-vue-cli/README.md",
    "content": "# 25-vue-cli\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "25-vue-cli/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>25-vue-cli</title>\n  </head>\n  <body>\n    <div id=\"app\">\n\n    </div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "25-vue-cli/package.json",
    "content": "{\n  \"name\": \"25-vue-cli\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.1.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-es2015\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^10.0.0\",\n    \"vue-template-compiler\": \"^2.1.0\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "25-vue-cli/src/App.vue",
    "content": "<template>\n  <div id=\"app\">\n    <img src=\"./assets/logo.png\">\n    <h1 v-text=\"mensaje\"></h1>\n    <h2>Enlaces esenciales</h2>\n    <ul>\n      <li><a href=\"https://vuejs.org\" target=\"_blank\">Core Docs</a></li>\n      <li><a href=\"https://forum.vuejs.org\" target=\"_blank\">Forum</a></li>\n      <li><a href=\"https://gitter.im/vuejs/vue\" target=\"_blank\">Gitter Chat</a></li>\n      <li><a href=\"https://twitter.com/vuejs\" target=\"_blank\">Twitter</a></li>\n    </ul>\n    <h2>Ecosystem</h2>\n    <ul>\n      <li><a href=\"http://router.vuejs.org/\" target=\"_blank\">vue-router</a></li>\n      <li><a href=\"http://vuex.vuejs.org/\" target=\"_blank\">vuex</a></li>\n      <li><a href=\"http://vue-loader.vuejs.org/\" target=\"_blank\">vue-loader</a></li>\n      <li><a href=\"https://github.com/vuejs/awesome-vue\" target=\"_blank\">awesome-vue</a></li>\n    </ul>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'app',\n  data () {\n    return {\n      mensaje: 'Hola desde el Curso de Vue & Firebase'\n    }\n  }\n}\n</script>\n\n<style>\n#app {\n  font-family: 'Avenir', Helvetica, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  text-align: center;\n  color: #2c3e50;\n  margin-top: 60px;\n}\n\nh1, h2 {\n  font-weight: normal;\n}\n\nul {\n  list-style-type: none;\n  padding: 0;\n}\n\nli {\n  display: inline-block;\n  margin: 0 10px;\n}\n\na {\n  color: #42b983;\n}\n</style>\n"
  },
  {
    "path": "25-vue-cli/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n  el: '#app',\n  render: h => h(App)\n})\n"
  },
  {
    "path": "25-vue-cli/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.common.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "26-single-file-components/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"es2015\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "26-single-file-components/README.md",
    "content": "# 26-single-file-components\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "26-single-file-components/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>26-single-file-components</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "26-single-file-components/package.json",
    "content": "{\n  \"name\": \"26-single-file-components\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"axios\": \"^0.15.3\",\n    \"vue\": \"^2.1.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-es2015\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^10.0.0\",\n    \"vue-template-compiler\": \"^2.1.0\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "26-single-file-components/src/App.vue",
    "content": "<template>\n    <div>\n        <persona></persona>\n        <persona></persona>\n        <persona></persona>\n        <persona></persona>\n        <persona></persona>\n        <persona></persona>\n        <persona></persona>\n    </div>\n</template>\n\n<script>\n    import persona from './components/Persona.vue';\n    export default {\n        components: { persona },\n        data () {\n            return {}\n        }\n    }\n</script>\n\n<style>\n\n</style>\n"
  },
  {
    "path": "26-single-file-components/src/components/Persona.vue",
    "content": "<template>\n    <div>\n        <template v-if=\"persona\">\n            <h1 v-text=\"datosPersona.nombre\"></h1>\n            <h2 v-text=\"datosPersona.correoe\"></h2>\n            <img :src=\"datosPersona.foto\">\n        </template>\n        <span v-else>Cargando persona...</span>\n    </div>\n</template>\n\n<script>\n    import axios from 'axios';\n    export default {\n        mounted() {\n            axios.get('https://randomuser.me/api/')\n                .then((respuesta) => {\n                    this.persona = respuesta.data.results[0];\n                })\n        },\n        data() {\n            return {\n                persona: null,\n            }\n        },\n        computed: {\n            datosPersona() {\n                return {\n                    nombre: `${this.persona.name.first} ${this.persona.name.last}`,\n                    foto: this.persona.picture.large,\n                    correoe: this.persona.email,\n                }\n            }\n        }\n    }\n</script>\n\n<style></style>"
  },
  {
    "path": "26-single-file-components/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n  el: '#app',\n  render: h => h(App)\n})\n"
  },
  {
    "path": "26-single-file-components/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.common.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "27-render-function/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"es2015\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "27-render-function/README.md",
    "content": "# 27-render-function\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "27-render-function/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>27-render-function</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "27-render-function/package.json",
    "content": "{\n  \"name\": \"27-render-function\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.1.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-es2015\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^10.0.0\",\n    \"vue-template-compiler\": \"^2.1.0\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "27-render-function/src/App.vue",
    "content": "<template>\n    <div>\n        <elemento tipo=\"footer\">Hola footer</elemento>\n        <elemento tipo=\"header\">Hola header</elemento>\n        <elemento tipo=\"aside\">Hola aside</elemento>\n        <elemento tipo=\"nav\">Hola nav</elemento>\n        <elemento tipo=\"main\">Hola main</elemento>\n    </div>\n\n</template>\n\n<script>\n    import elemento from './components/Elemento.vue';\n    export default {\n        components: { elemento }\n    }\n</script>\n\n<style>\n\n</style>"
  },
  {
    "path": "27-render-function/src/components/Elemento.vue",
    "content": "<!--<template>\n    <div>\n        <article v-if=\"tipo === 'article'\">\n            <slot></slot>\n        </article>\n        <section v-if=\"tipo === 'section'\">\n            <slot></slot>\n        </section>\n        <aside v-if=\"tipo === 'aside'\">\n            <slot></slot>\n        </aside>\n        <nav v-if=\"tipo === 'nav'\">\n            <slot></slot>\n        </nav>\n        <header v-if=\"tipo === 'header'\">\n            <slot></slot>\n        </header>\n        <footer v-if=\"tipo === 'footer'\">\n            <slot></slot>\n        </footer>\n    </div>\n</template>-->\n<script>\n    export default {\n        props: ['tipo'],\n        render(createElement) {\n            return createElement(\n                this.tipo,\n                this.$slots.default,\n            )\n        }\n    }\n</script>\n<style>\n</style>c"
  },
  {
    "path": "27-render-function/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n  el: '#app',\n  render: h => h(App)\n})"
  },
  {
    "path": "27-render-function/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.common.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "28-hot-reloading/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"es2015\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "28-hot-reloading/README.md",
    "content": "# 28-hot-reloading\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "28-hot-reloading/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>28-hot-reloading</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "28-hot-reloading/package.json",
    "content": "{\n  \"name\": \"28-hot-reloading\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.1.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-es2015\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^10.0.0\",\n    \"vue-template-compiler\": \"^2.1.0\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "28-hot-reloading/src/App.vue",
    "content": "<template>\n    <tareas></tareas>\n</template>\n\n<script>\n    import Tareas from './components/Tareas.vue';\n    export default {\n        components: {Tareas},\n    }\n</script>\n"
  },
  {
    "path": "28-hot-reloading/src/components/Tareas.vue",
    "content": "<template>\n    <div>\n        <h2>Las Tareas por hacer</h2>\n        <ul>\n            <li v-for=\"tarea in tareasPendientes\">\n                <a href=\"#\" @click=\"actualizarTarea(tarea)\" v-text=\"tarea.nombre\"></a>\n            </li>\n        </ul>\n        <h2>Tareas finalizadas</h2>\n        <li v-for=\"tarea in tareasFinalizadas\">\n            <a href=\"#\" @click=\"actualizarTarea(tarea)\" v-text=\"tarea.nombre\"></a>\n        </li>\n    </div>\n</template>\n<script>\n    export default {\n        data(){\n            return {\n                tareas: [\n                    {nombre: 'Aprender Vue.js', completado: false},\n                    {nombre: 'Grabar el módulo de Vuex', completado: false},\n                    {nombre: 'Responder comentarios (de una vez)', completado: false},\n                    {nombre: 'Salir a correr para despejarme', completado: false},\n                    {nombre: 'Diseñar el módulo de Firebase', completado: false},\n                    {nombre: 'Diseñar el ejercicio final', completado: false},\n                    {nombre: 'Tomarme unas vacaciones', completado: false},\n                ],\n                finalizadas: []\n            }\n        },\n        methods: {\n            actualizarTarea(tarea) {\n                tarea.completado = !tarea.completado;\n            }\n        },\n        computed: {\n            tareasPendientes() {\n                return this.tareas.filter((tarea) => !tarea.completado);\n            },\n            tareasFinalizadas() {\n                return this.tareas.filter((tarea) => tarea.completado);\n            }\n        }\n    }\n</script>\n<style>\n    li a {\n        color: darkgoldenrod;\n        font-weight: bold;\n        text-decoration: none;\n    }\n</style>"
  },
  {
    "path": "28-hot-reloading/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n  el: '#app',\n  render: h => h(App)\n})\n"
  },
  {
    "path": "28-hot-reloading/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.common.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "29-scoped-css/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"es2015\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "29-scoped-css/README.md",
    "content": "# 29-scoped-css\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "29-scoped-css/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>29-scoped-css</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "29-scoped-css/package.json",
    "content": "{\n  \"name\": \"29-scoped-css\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.1.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-es2015\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^10.0.0\",\n    \"vue-template-compiler\": \"^2.1.0\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "29-scoped-css/src/App.vue",
    "content": "<template>\n    <div>\n        <h1>Menú principal</h1>\n        <input type=\"range\">\n        <ul>\n            <li><a href=\"\">Enlace 1</a></li>\n            <li><a href=\"\">Enlace 2</a></li>\n            <li><a href=\"\">Enlace 3</a></li>\n            <li><a href=\"\">Enlace 4</a></li>\n            <li><a href=\"\">Enlace 5</a></li>\n            <li><a href=\"\">Enlace 6</a></li>\n        </ul>\n        <tareas></tareas>\n    </div>\n</template>\n\n<script>\n    import Tareas from './components/Tareas.vue';\n    export default {\n        components: {Tareas}\n    }\n</script>"
  },
  {
    "path": "29-scoped-css/src/components/Tareas.vue",
    "content": "<template>\n    <div>\n        <h2>Las Tareas por hacer</h2>\n        <ul>\n            <li v-for=\"tarea in tareasPendientes\">\n                <a href=\"#\" @click=\"actualizarTarea(tarea)\" v-text=\"tarea.nombre\"></a>\n            </li>\n        </ul>\n        <h2>Tareas finalizadas</h2>\n        <li v-for=\"tarea in tareasFinalizadas\">\n            <a href=\"#\" @click=\"actualizarTarea(tarea)\" v-text=\"tarea.nombre\"></a>\n        </li>\n    </div>\n</template>\n<script>\n    export default {\n        data(){\n            return {\n                tareas: [\n                    {nombre: 'Aprender Vue.js', completado: false},\n                    {nombre: 'Grabar el módulo de Vuex', completado: false},\n                    {nombre: 'Responder comentarios (de una vez)', completado: false},\n                    {nombre: 'Salir a correr para despejarme', completado: false},\n                    {nombre: 'Diseñar el módulo de Firebase', completado: false},\n                    {nombre: 'Diseñar el ejercicio final', completado: false},\n                    {nombre: 'Tomarme unas vacaciones', completado: false},\n                ],\n                finalizadas: []\n            }\n        },\n        methods: {\n            actualizarTarea(tarea) {\n                tarea.completado = !tarea.completado;\n            }\n        },\n        computed: {\n            tareasPendientes() {\n                return this.tareas.filter((tarea) => !tarea.completado);\n            },\n            tareasFinalizadas() {\n                return this.tareas.filter((tarea) => tarea.completado);\n            }\n        }\n    }\n</script>\n<style scoped>\n    li a {\n        color: red;\n    }\n</style>"
  },
  {
    "path": "29-scoped-css/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n  el: '#app',\n  render: h => h(App)\n})\n"
  },
  {
    "path": "29-scoped-css/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.common.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "3-renderizado-de-listas/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <!-- Matriz -->\n        <!--<ul>\n            <li v-for=\"dia in laborales\">{{ dia }}</li>\n        </ul>-->\n\n        <!-- Matriz de objetos (collection) -->\n        <!--<ul>\n            <li v-for=\"(tarea, index) in tareas\">\n                {{ index}} - {{ tarea.nombre }} \n                <small>({{ tarea.prioridad}})</small>\n            </li>\n        </ul>-->\n\n        <!-- Objeto -->\n        <ul>\n            <li v-for=\"(value, key, index) in persona\">\n               {{ index }} - {{ key }}: {{value}} \n            </li>\n        </ul>\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "3-renderizado-de-listas/js/main.js",
    "content": "const vm = new Vue({\n    el: 'main',\n    data:  {\n        laborales: ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes'],\n        tareas: [\n            {nombre: 'Hacer la compra', prioridad: 'baja'},\n            {nombre: 'Aprender Vue y Firebase', prioridad: 'alta'},\n            {nombre: 'Ir al gimnasio', prioridad: 'alta'},\n        ],\n        persona: {\n            nombre: 'Juan',\n            profesion: 'dev',\n            ciudad: 'Valencia'\n        }\n    },\n});"
  },
  {
    "path": "30-css-modules/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"es2015\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "30-css-modules/README.md",
    "content": "# 30-css-modules\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "30-css-modules/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>30-css-modules</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "30-css-modules/package.json",
    "content": "{\n  \"name\": \"30-css-modules\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.1.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-es2015\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^10.0.0\",\n    \"vue-template-compiler\": \"^2.1.0\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "30-css-modules/src/App.vue",
    "content": "<template>\n    <!--<h1 :class=\"[$style.rojo]\">Hola CSS Modules</h1>-->\n    <h1 :class=\"{[$style.subrayado] : subrayado}\">Hola CSS Modules</h1>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                subrayado: false\n            }\n        }\n    }\n</script>\n\n<style module>\n    .subrayado {\n        text-decoration: underline;\n    }\n    .rojo {\n        color: red;\n    }\n</style>\n"
  },
  {
    "path": "30-css-modules/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n  el: '#app',\n  render: h => h(App)\n})\n"
  },
  {
    "path": "30-css-modules/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.common.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "31-shared-state/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <div id=\"app1\"><h1>{{ usuario.nombre }}</h1></div>\n    <div id=\"app2\"><h1>{{ usuario.nombre }}</h1></div>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "31-shared-state/js/main.js",
    "content": "const compartido =  {\n    usuario: {\n        nombre: 'Juan Andrés',\n    }\n};\n\nnew Vue({\n    el: '#app1',\n    data: compartido,\n});\n\nnew Vue({\n    el: '#app2',\n    data: compartido,\n});"
  },
  {
    "path": "32-vuex-central-store/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"es2015\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "32-vuex-central-store/README.md",
    "content": "# 32-vuex-central-store\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "32-vuex-central-store/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>32-vuex-central-store</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "32-vuex-central-store/package.json",
    "content": "{\n  \"name\": \"32-vuex-central-store\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.1.0\",\n    \"vuex\": \"^2.1.2\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-es2015\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^10.0.0\",\n    \"vue-template-compiler\": \"^2.1.0\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "32-vuex-central-store/src/App.vue",
    "content": "<template>\n<!--    <contador :cantidad=\"cantidad\"\n              @aumentar=\"cantidad++\"\n              @reducir=\"cantidad&#45;&#45;\">\n    </contador>-->\n    <contador></contador>\n</template>\n\n<script>\n    import Contador from './components/Contador.vue';\n    export default {\n        components: {Contador},\n    }\n</script>\n"
  },
  {
    "path": "32-vuex-central-store/src/components/Contador.vue",
    "content": "<template>\n    <div>\n        <h1>Contador: {{ cantidad }}</h1>\n        <button @click=\"aumentar\">Aumentar</button>\n        <button @click=\"reducir\">Reducir</button>\n    </div>\n</template>\n<script>\n    export default {\n        //props: ['cantidad'],\n        methods: {\n            aumentar() {\n                //this.$emit('aumentar');\n                this.$store.state.cantidad++;\n            },\n            reducir() {\n                //this.$emit('reducir');\n                this.$store.state.cantidad--;\n            }\n        },\n        computed: {\n            cantidad() {\n                return this.$store.state.cantidad;\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "32-vuex-central-store/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport {store} from './store/store';\n\nnew Vue({\n    el: '#app',\n    store,\n    render: h => h(App)\n});\n"
  },
  {
    "path": "32-vuex-central-store/src/store/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n   state: {\n       cantidad: 0,\n   }\n});"
  },
  {
    "path": "32-vuex-central-store/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.common.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "33-vuex-state/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "33-vuex-state/README.md",
    "content": "# 33-vuex-state\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "33-vuex-state/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>33-vuex-state</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "33-vuex-state/package.json",
    "content": "{\n  \"name\": \"33-vuex-state\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vuex\": \"^2.1.2\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.0.0\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "33-vuex-state/src/App.vue",
    "content": "<template>\n    <h1>Hola me llamo {{ nombre }} {{ apellidos}} y me dedico a {{profesion}}</h1>\n</template>\n<script>\n    import {mapState} from 'vuex';\n    export default {\n/*        computed: {\n            nombre() {\n                return this.$store.state.nombre;\n            }\n        }*/\n/*        computed: mapState({\n            nombre: (state) => state.nombre,\n            apellidos: (state) => state.apellidos,\n\n        })*/\n        computed: mapState(['nombre', 'apellidos', 'profesion']),\n    }\n</script>"
  },
  {
    "path": "33-vuex-state/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\nimport {store} from './store/store';\n\nnew Vue({\n    el: '#app',\n    store,\n    render: h => h(App)\n});"
  },
  {
    "path": "33-vuex-state/src/store/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n   state: {\n       nombre: 'Juan Andrés',\n       apellidos: 'Núñez Charro',\n       profesion: 'Developer',\n       ciudad: 'Valencia'\n   }\n});"
  },
  {
    "path": "33-vuex-state/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "34-vuex-getters/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "34-vuex-getters/README.md",
    "content": "# 34-vuex-getters\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "34-vuex-getters/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>34-vuex-getters</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "34-vuex-getters/package.json",
    "content": "{\n  \"name\": \"34-vuex-getters\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.0.0\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "34-vuex-getters/src/Tareas.vue",
    "content": "<template>\n    <main>\n        <tareas-restantes></tareas-restantes>\n        <ul>\n            <li v-for=\"tarea in tareas\">{{ tarea.nombre }}</li>\n        </ul>\n    </main>\n</template>\n\n<script>\n    import TareasRestantes from './components/TareasRestantes.vue';\n    import {mapState} from 'vuex';\n    export default {\n/*        computed: {\n            tareas() {\n                return this.$store.state.tareas;\n            }\n        }*/\n        components: {TareasRestantes},\n        computed: mapState(['tareas'])\n    }\n</script>\n"
  },
  {
    "path": "34-vuex-getters/src/components/TareasRestantes.vue",
    "content": "<template>\n    <h1>{{tareasCompletadas}} tareas completadas.</h1>\n</template>\n<script>\n    import {mapGetters} from 'vuex';\n    export default {\n/*        computed: {\n            tareasCompletadas() {\n/!*                return this.$store.state.tareas.filter((tarea) => {\n                    return tarea.completado;\n                }).length;*!/\n\n                return this.$store.getters.tareasCompletadas;\n            }\n        }*/\n        computed: mapGetters(['tareasCompletadas'])\n    }\n</script>"
  },
  {
    "path": "34-vuex-getters/src/main.js",
    "content": "import Vue from 'vue';\nimport Tareas from './Tareas.vue';\nimport {store} from './store/store';\n\nnew Vue({\n    el: '#app',\n    store,\n    render: h => h(Tareas)\n})\n"
  },
  {
    "path": "34-vuex-getters/src/store/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n    state: {\n        tareas: [\n            {nombre: 'Aprender Vue Routing', completado: false},\n            {nombre: 'Organizar lecciones restantes', completado: false},\n            {nombre: 'Grabar lecciones mini curso ES6', completado: false},\n            {nombre: 'Preparar landing page curso', completado: false},\n            {nombre: 'Diseñar acciones de marketing', completado: true},\n        ]\n    },\n    getters: {\n        tareasCompletadas: (state) => {\n            return state.tareas.filter((tarea) => tarea.completado).length;\n        }\n    }\n});"
  },
  {
    "path": "34-vuex-getters/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "35-vuex-mutations/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "35-vuex-mutations/README.md",
    "content": "# 35-vuex-mutations\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "35-vuex-mutations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>35-vuex-mutations</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "35-vuex-mutations/package.json",
    "content": "{\n  \"name\": \"35-vuex-mutations\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.0.0\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "35-vuex-mutations/src/App.vue",
    "content": "<template>\n    <contador></contador>\n</template>\n<script>\n    import contador from './components/Contador.vue';\n    export default {\n        components: {\n            contador,\n        }\n    }\n</script>"
  },
  {
    "path": "35-vuex-mutations/src/components/Contador.vue",
    "content": "<template>\n    <section>\n        <h1>Cantidad: {{ cantidad }}</h1>\n        <button @click=\"aumentar\">Aumentar</button>\n        <button @click=\"reducir\">Reducir</button>\n    </section>\n</template>\n<script>\n    import {mapState, mapMutations} from 'vuex';\n    export default {\n        computed: mapState(['cantidad']),\n        methods: mapMutations(['aumentar', 'reducir']),\n/*        methods: {\n            aumentar() {\n                //this.$store.state.cantidad++;\n                this.$store.commit('aumentar');\n            },\n            reducir() {\n                //this.$store.state.cantidad--;\n                this.$store.commit('reducir');\n            }\n        }*/\n    }\n</script>"
  },
  {
    "path": "35-vuex-mutations/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport {store} from './store/store';\n\nnew Vue({\n    el: '#app',\n    store: store,\n    render: h => h(App)\n})\n"
  },
  {
    "path": "35-vuex-mutations/src/store/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n    state: {\n        cantidad: 0,\n    },\n    mutations: {\n        aumentar: (state) => state.cantidad++,\n        reducir: (state) => state.cantidad--,\n    }\n});"
  },
  {
    "path": "35-vuex-mutations/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "36-vuex-actions/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "36-vuex-actions/README.md",
    "content": "# 35-vuex-mutations\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "36-vuex-actions/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>36-vuex-actions</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "36-vuex-actions/package.json",
    "content": "{\n  \"name\": \"35-vuex-mutations\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.0.0\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "36-vuex-actions/src/App.vue",
    "content": "<template>\n    <contador></contador>\n</template>\n<script>\n    import contador from './components/Contador.vue';\n    export default {\n        components: {\n            contador,\n        }\n    }\n</script>"
  },
  {
    "path": "36-vuex-actions/src/components/Contador.vue",
    "content": "<template>\n    <section>\n        <h1>Cantidad: {{ cantidad }}</h1>\n        <button @click=\"aumentarAsync(12)\">Aumentar</button>\n        <button @click=\"reducirAsync({cantidad: 15})\">Reducir</button>\n    </section>\n</template>\n<script>\n    import {mapState, mapActions} from 'vuex';\n    export default {\n        computed: mapState(['cantidad']),\n        methods: mapActions(['aumentarAsync', 'reducirAsync'])\n/*        methods: {\n            aumentar() {\n                //this.$store.state.cantidad++;\n                //this.$store.commit('aumentar');\n                this.$store.dispatch('aumentarAsync');\n            },\n            reducir() {\n                //this.$store.state.cantidad--;\n                //this.$store.commit('reducir');\n                this.$store.dispatch('reducirAsync');\n            }\n        }*/\n    }\n</script>"
  },
  {
    "path": "36-vuex-actions/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport {store} from './store/store';\n\nnew Vue({\n    el: '#app',\n    store: store,\n    render: h => h(App)\n})\n"
  },
  {
    "path": "36-vuex-actions/src/store/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n    state: {\n        cantidad: 0,\n    },\n    mutations: {\n        aumentar: (state, cantidad) => state.cantidad += cantidad,\n        reducir: (state, cantidad) => state.cantidad -=cantidad,\n    },\n    actions: {\n        aumentarAsync: (context, cantidad) => {\n            setTimeout(() => context.commit('aumentar', cantidad), 2000);\n        },\n        reducirAsync: ({commit}, {cantidad}) => {\n            setTimeout(() => commit('reducir', cantidad), 2000);\n        }\n    }\n});"
  },
  {
    "path": "36-vuex-actions/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "37-vuex-modules/.babelrc",
    "content": "// http://stefan.magnuson.co/articles/frontend/using-es7-spread-operator-with-webpack/\n{\n  \"presets\": [\n    \"stage-2\",\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "37-vuex-modules/README.md",
    "content": "# 37-vuex-modules\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "37-vuex-modules/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>37-vuex-modules</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "37-vuex-modules/package.json",
    "content": "{\n  \"name\": \"37-vuex-modules\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"babel-preset-stage-2\": \"^6.22.0\",\n    \"vue\": \"^2.2.1\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "37-vuex-modules/src/App.vue",
    "content": "<template>\n    <section>\n        <productos></productos>\n        <carro></carro>\n    </section>\n</template>\n<script>\n    import Productos from './components/Productos.vue';\n    import Carro from './components/Carro.vue';\n    export default {\n        components: {Productos, Carro}\n    }\n</script>\n"
  },
  {
    "path": "37-vuex-modules/src/components/Carro.vue",
    "content": "<template>\n    <section>\n        <h2>Carro de la compra</h2>\n        <h3>Total compra: {{ totalCompra.toFixed(2) }} € </h3>\n        <ul>\n            <li v-for=\"(producto, indice) in carro\">\n                {{ producto.nombre }}\n                <button @click=\"eliminarProducto(indice)\">X</button>\n            </li>\n        </ul>\n    </section>\n</template>\n<script>\n    import {mapState, mapGetters, mapMutations} from 'vuex';\n    export default {\n        computed: {\n            ...mapState(['carro']),\n            ...mapGetters(['totalCompra']),\n        },\n        methods: mapMutations(['eliminarProducto'])\n    }\n</script>"
  },
  {
    "path": "37-vuex-modules/src/components/Productos.vue",
    "content": "<template>\n    <section>\n        <h1>Añadir un producto</h1>\n        <form @submit.prevent=\"anadir\">\n            <input type=\"text\" placeholder=\"Nombre\" v-model=\"nombre\" required>\n            <input type=\"number\" placeholder=\"Precio\" v-model=\"precio\" required>\n            <input type=\"submit\" value=\"Añadir\">\n        </form>\n        <hr>\n        <ul>\n            <li v-for=\"(producto, indice) in productos\">\n                {{ producto.nombre }} - {{ producto.precio.toFixed(2) + ' €' }}\n                <button @click=\"comprarProducto(indice)\">+</button>\n            </li>\n        </ul>\n    </section>\n</template>\n<script>\n    import {mapState, mapMutations} from 'vuex';\n    export default {\n        data() {\n            return {\n                nombre: '',\n                precio: 0\n            }\n        },\n        computed: mapState(['productos']),\n        methods: {\n            ...mapMutations(['comprarProducto']),\n            anadir() {\n                this.$store.commit('anadirProducto', {\n                    nombre: this.nombre,\n                    precio: Number(this.precio),\n                });\n                this.nombre = '';\n                this.precio = 0;\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "37-vuex-modules/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport {store} from './store/store';\n\nnew Vue({\n    el: '#app',\n    store,\n    render: h => h(App)\n});"
  },
  {
    "path": "37-vuex-modules/src/store/modules/productos.js",
    "content": "const productos = [\n    {nombre: 'Steam Link', precio: 50},\n    {nombre: 'Steam Controller', precio: 59},\n    {nombre: 'Axiom Verge', precio: 17},\n];\n\nconst mutations = {\n    anadirProducto: (state, producto) => state.productos.unshift(producto),\n};\n\nexport default {\n    state: productos,\n    mutations,\n};"
  },
  {
    "path": "37-vuex-modules/src/store/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nimport productos from './modules/productos';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n    state: {\n/*        productos: [\n            {nombre: 'Steam Link', precio: 50},\n            {nombre: 'Steam Controller', precio: 59},\n            {nombre: 'Axiom Verge', precio: 17},\n        ],*/\n        carro: [],\n    },\n    getters: {\n        totalCompra: (state) => state.carro.reduce((total, producto) => total + producto.precio, 0),\n    },\n    mutations: {\n        /*anadirProducto: (state, producto) => state.productos.unshift(producto),*/\n        comprarProducto: (state, indice) => state.carro.unshift(state.productos[indice]),\n        eliminarProducto: (state, indice) => state.carro.splice(indice, 1),\n    },\n    modules: {\n        productos\n    }\n});\n"
  },
  {
    "path": "37-vuex-modules/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "38-vuex-structure/.babelrc",
    "content": "// http://stefan.magnuson.co/articles/frontend/using-es7-spread-operator-with-webpack/\n{\n  \"presets\": [\n    \"stage-2\",\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "38-vuex-structure/README.md",
    "content": "# 37-vuex-modules\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "38-vuex-structure/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>38-vuex-structure</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "38-vuex-structure/package.json",
    "content": "{\n  \"name\": \"37-vuex-modules\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"babel-preset-stage-2\": \"^6.22.0\",\n    \"vue\": \"^2.2.1\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "38-vuex-structure/src/App.vue",
    "content": "<template>\n    <section>\n        <productos></productos>\n        <carro></carro>\n    </section>\n</template>\n<script>\n    import Productos from './components/Productos.vue';\n    import Carro from './components/Carro.vue';\n    export default {\n        components: {Productos, Carro}\n    }\n</script>\n"
  },
  {
    "path": "38-vuex-structure/src/components/Carro.vue",
    "content": "<template>\n    <section>\n        <h2>Carro de la compra</h2>\n        <h3>Total compra: {{ totalCompra.toFixed(2) }} € </h3>\n        <ul>\n            <li v-for=\"(producto, indice) in carro\">\n                {{ producto.nombre }}\n                <button @click=\"eliminarProducto(indice)\">X</button>\n            </li>\n        </ul>\n    </section>\n</template>\n<script>\n    import {mapState, mapGetters, mapMutations} from 'vuex';\n    export default {\n        computed: {\n            ...mapState(['carro']),\n            ...mapGetters(['totalCompra']),\n        },\n        methods: mapMutations(['eliminarProducto'])\n    }\n</script>"
  },
  {
    "path": "38-vuex-structure/src/components/Productos.vue",
    "content": "<template>\n    <section>\n        <h1>Añadir un producto</h1>\n        <form @submit.prevent=\"anadir\">\n            <input type=\"text\" placeholder=\"Nombre\" v-model=\"nombre\" required>\n            <input type=\"number\" placeholder=\"Precio\" v-model=\"precio\" required>\n            <input type=\"submit\" value=\"Añadir\">\n        </form>\n        <hr>\n        <ul>\n            <li v-for=\"(producto, indice) in productos\">\n                {{ producto.nombre }} - {{ producto.precio.toFixed(2) + ' €' }}\n                <button @click=\"comprarProducto(indice)\">+</button>\n            </li>\n        </ul>\n    </section>\n</template>\n<script>\n    import {mapState, mapMutations} from 'vuex';\n    export default {\n        data() {\n            return {\n                nombre: '',\n                precio: 0\n            }\n        },\n        computed: mapState(['productos']),\n        methods: {\n            ...mapMutations(['comprarProducto']),\n            anadir() {\n                this.$store.commit('anadirProducto', {\n                    nombre: this.nombre,\n                    precio: Number(this.precio),\n                });\n                this.nombre = '';\n                this.precio = 0;\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "38-vuex-structure/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport {store} from './store/store';\n\nnew Vue({\n    el: '#app',\n    store,\n    render: h => h(App)\n});"
  },
  {
    "path": "38-vuex-structure/src/store/getters.js",
    "content": "export const getters = {\n    totalCompra: (state) => state.carro.reduce((total, producto) => total + producto.precio, 0),\n};"
  },
  {
    "path": "38-vuex-structure/src/store/modules/productos.js",
    "content": "const productos = [\n    {nombre: 'Steam Link', precio: 50},\n    {nombre: 'Steam Controller', precio: 59},\n    {nombre: 'Axiom Verge', precio: 17},\n];\n\nconst mutations = {\n    anadirProducto: (state, producto) => state.productos.unshift(producto),\n};\n\nexport default {\n    state: productos,\n    mutations,\n};"
  },
  {
    "path": "38-vuex-structure/src/store/mutations.js",
    "content": "export const mutations = {\n    comprarProducto: (state, indice) => state.carro.unshift(state.productos[indice]),\n    eliminarProducto: (state, indice) => state.carro.splice(indice, 1),\n};"
  },
  {
    "path": "38-vuex-structure/src/store/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nimport productos from './modules/productos';\nimport {getters} from './getters';\nimport {mutations} from './mutations';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n    state: {\n        carro: [],\n    },\n    getters: getters,\n    mutations:mutations,\n    modules: {\n        productos\n    }\n});\n"
  },
  {
    "path": "38-vuex-structure/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "4-vue-devtools/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <h1>{{ mensaje }}</h1>\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "4-vue-devtools/js/main.js",
    "content": "new Vue({\n    el: 'main',\n    data: {\n        mensaje: 'Aprendiendo Vue.js :)'\n    }\n});"
  },
  {
    "path": "40-vue-router-intro/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue Router</title>\n</head>\n<body>\n<main>\n    <h1>Aprendiendo Vue-Router</h1>\n    <router-link to=\"/\">Portada</router-link>\n    <router-link to=\"/contacto\">Contacto</router-link>\n    <hr>\n    <router-view></router-view>\n</main>\n<script src=\"https://unpkg.com/vue/dist/vue.js\"></script>\n<script src=\"https://unpkg.com/vue-router/dist/vue-router.js\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "40-vue-router-intro/js/main.js",
    "content": "// ¿Quién 'vive' en cada ruta?\nconst home = Vue.component('Home', {\n    template: '<h2>Portada</h2>',\n});\n\nconst contacto = Vue.component('Contacto', {\n    template: '<h2>Contacto</h2>',\n});\n\n// Plano de destinos con sus rutas\nconst routes = [\n    {path: '/', component: home},\n    {path: '/contacto', component: contacto},\n];\n\n// Instaciar el componente enrutador\nconst router = new VueRouter({\n   routes: routes,\n});\n\nnew Vue({\n    router: router,\n    el: 'main',\n});"
  },
  {
    "path": "41-vue-router-components/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "41-vue-router-components/README.md",
    "content": "# 41-vue-router-components\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "41-vue-router-components/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>41-vue-router-components</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "41-vue-router-components/package.json",
    "content": "{\n  \"name\": \"41-vue-router-components\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "41-vue-router-components/src/App.vue",
    "content": "<template>\n    <section>\n        <h1>Rutas con Vue Router</h1>\n        <router-link to=\"/\">Home</router-link>\n        <router-link to=\"/contacto\">Contacto</router-link>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>\n\n<script>\n    export default {\n    }\n</script>"
  },
  {
    "path": "41-vue-router-components/src/components/Contacto.vue",
    "content": "<template>\n    <h2>Contacto</h2>\n</template>"
  },
  {
    "path": "41-vue-router-components/src/components/Home.vue",
    "content": "<template>\n    <h2>Home</h2>\n</template>"
  },
  {
    "path": "41-vue-router-components/src/main.js",
    "content": "import Vue from 'vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport App from './App.vue';\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})"
  },
  {
    "path": "41-vue-router-components/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Contacto from './components/Contacto.vue';\n\nexport const routes = [\n    {path: '/', component: Home},\n    {path: '/contacto', component: Contacto},\n];"
  },
  {
    "path": "41-vue-router-components/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "42-vue-router-active-links/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "42-vue-router-active-links/README.md",
    "content": "# 41-vue-router-components\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "42-vue-router-active-links/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>42-vue-router-active-links</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "42-vue-router-active-links/package.json",
    "content": "{\n  \"name\": \"41-vue-router-components\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "42-vue-router-active-links/src/App.vue",
    "content": "<template>\n    <section>\n        <h1>Rutas con Vue Router</h1>\n        <router-link to=\"/\" active-class=\"activo\" tag=\"li\" exact>\n            <a>Home</a>\n        </router-link>\n        <router-link to=\"/contacto\" active-class=\"activo\" tag=\"li\" >\n            <a>Contacto</a>\n        </router-link>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>\n\n<script>\n    export default {\n    }\n</script>\n\n<style>\n    .activo a {\n        color: red;\n    }\n</style>"
  },
  {
    "path": "42-vue-router-active-links/src/components/Contacto.vue",
    "content": "<template>\n    <h2>Contacto</h2>\n</template>"
  },
  {
    "path": "42-vue-router-active-links/src/components/Home.vue",
    "content": "<template>\n    <h2>Home</h2>\n</template>"
  },
  {
    "path": "42-vue-router-active-links/src/main.js",
    "content": "import Vue from 'vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport App from './App.vue';\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})"
  },
  {
    "path": "42-vue-router-active-links/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Contacto from './components/Contacto.vue';\n\nexport const routes = [\n    {path: '/', component: Home},\n    {path: '/contacto', component: Contacto},\n];"
  },
  {
    "path": "42-vue-router-active-links/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "43-vue-programmatic-nav/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "43-vue-programmatic-nav/README.md",
    "content": "# 41-vue-router-components\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "43-vue-programmatic-nav/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>43-vue-router-prog-nav</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "43-vue-programmatic-nav/package.json",
    "content": "{\n  \"name\": \"41-vue-router-components\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "43-vue-programmatic-nav/src/App.vue",
    "content": "<template>\n    <section>\n        <h1>Rutas con Vue Router</h1>\n        <router-link to=\"/\" active-class=\"activo\" tag=\"li\" exact>\n            <a>Home</a>\n        </router-link>\n        <router-link to=\"/contacto\" active-class=\"activo\" tag=\"li\" >\n            <a>Contacto</a>\n        </router-link>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>\n\n<script>\n    export default {\n    }\n</script>\n\n<style>\n    .activo a {\n        color: red;\n    }\n</style>"
  },
  {
    "path": "43-vue-programmatic-nav/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Contacto</h2>\n        <button @click=\"volverHome()\">Volver a home</button>\n    </section>\n</template>\n\n<script>\n    export default {\n        created() {\n            setTimeout(() => this.$router.push('/'), 2000);\n        },\n        methods: {\n            volverHome() {\n                this.$router.push('/', ()=> console.log('Ruta cambiada')); // Home\n            }\n        }\n    }\n</script>\n"
  },
  {
    "path": "43-vue-programmatic-nav/src/components/Home.vue",
    "content": "<template>\n    <h2>Home</h2>\n</template>"
  },
  {
    "path": "43-vue-programmatic-nav/src/main.js",
    "content": "import Vue from 'vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport App from './App.vue';\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})"
  },
  {
    "path": "43-vue-programmatic-nav/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Contacto from './components/Contacto.vue';\n\nexport const routes = [\n    {path: '/', component: Home},\n    {path: '/contacto', component: Contacto},\n];"
  },
  {
    "path": "43-vue-programmatic-nav/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "44-vue-router-dynamic-routes/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "44-vue-router-dynamic-routes/README.md",
    "content": "# 41-vue-router-components\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "44-vue-router-dynamic-routes/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>44-vue-router-dynamic-routes</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "44-vue-router-dynamic-routes/package.json",
    "content": "{\n  \"name\": \"41-vue-router-components\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "44-vue-router-dynamic-routes/src/App.vue",
    "content": "<template>\n    <section>\n        <h1>Rutas con Vue Router</h1>\n        <router-link to=\"/\" active-class=\"activo\" tag=\"li\" exact>\n            <a>Home</a>\n        </router-link>\n        <router-link to=\"/contacto\" active-class=\"activo\" tag=\"li\" >\n            <a>Contacto</a>\n        </router-link>\n        <router-link to=\"/usuario/77\" active-class=\"activo\" tag=\"li\" >\n            <a>Usuario</a>\n        </router-link>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>\n\n<script>\n    export default {\n    }\n</script>\n\n<style>\n    .activo a {\n        color: red;\n    }\n</style>"
  },
  {
    "path": "44-vue-router-dynamic-routes/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Contacto</h2>\n        <button @click=\"volverHome()\">Volver a home</button>\n    </section>\n</template>\n\n<script>\n    export default {\n        created() {\n            setTimeout(() => this.$router.push('/'), 2000);\n        },\n        methods: {\n            volverHome() {\n                this.$router.push('/', ()=> console.log('Ruta cambiada')); // Home\n            }\n        }\n    }\n</script>\n"
  },
  {
    "path": "44-vue-router-dynamic-routes/src/components/Home.vue",
    "content": "<template>\n    <h2>Home</h2>\n</template>"
  },
  {
    "path": "44-vue-router-dynamic-routes/src/components/Usuario.vue",
    "content": "<template>\n    <h2>{{ id }}</h2>\n</template>\n<script>\n    export default {\n        data() {\n            return {\n                id: this.$route.params.id\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "44-vue-router-dynamic-routes/src/main.js",
    "content": "import Vue from 'vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport App from './App.vue';\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})"
  },
  {
    "path": "44-vue-router-dynamic-routes/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Contacto from './components/Contacto.vue';\nimport Usuario from './components/Usuario.vue';\n\nexport const routes = [\n    {path: '/', component: Home},\n    {path: '/contacto', component: Contacto},\n    {path: '/usuario/:id', component: Usuario},\n];"
  },
  {
    "path": "44-vue-router-dynamic-routes/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "45-vue-router-reacting/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "45-vue-router-reacting/README.md",
    "content": "# 41-vue-router-components\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "45-vue-router-reacting/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>45-vue-router-reacting</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "45-vue-router-reacting/package.json",
    "content": "{\n  \"name\": \"41-vue-router-components\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "45-vue-router-reacting/src/App.vue",
    "content": "<template>\n    <section>\n        <h1>Rutas con Vue Router</h1>\n        <router-link to=\"/\" active-class=\"activo\" tag=\"li\" exact>\n            <a>Home</a>\n        </router-link>\n        <router-link to=\"/contacto\" active-class=\"activo\" tag=\"li\" >\n            <a>Contacto</a>\n        </router-link>\n        <router-link to=\"/usuario/77\" active-class=\"activo\" tag=\"li\" >\n            <a>Usuario</a>\n        </router-link>\n        <router-link to=\"/usuario/99\" active-class=\"activo\" tag=\"li\" >\n            <a>Usuario</a>\n        </router-link>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>\n\n<script>\n    export default {\n    }\n</script>\n\n<style>\n    .activo a {\n        color: red;\n    }\n</style>"
  },
  {
    "path": "45-vue-router-reacting/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Contacto</h2>\n        <button @click=\"volverHome()\">Volver a home</button>\n    </section>\n</template>\n\n<script>\n    export default {\n        created() {\n            setTimeout(() => this.$router.push('/'), 2000);\n        },\n        methods: {\n            volverHome() {\n                this.$router.push('/', ()=> console.log('Ruta cambiada')); // Home\n            }\n        }\n    }\n</script>\n"
  },
  {
    "path": "45-vue-router-reacting/src/components/Home.vue",
    "content": "<template>\n    <h2>Home</h2>\n</template>"
  },
  {
    "path": "45-vue-router-reacting/src/components/Usuario.vue",
    "content": "<template>\n    <h2>{{ id }}</h2>\n</template>\n<script>\n    export default {\n        data() {\n            return {\n                id: this.$route.params.id\n            }\n        },\n        watch: {\n            '$route'(to) {\n                this.id = to.params.id;\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "45-vue-router-reacting/src/main.js",
    "content": "import Vue from 'vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport App from './App.vue';\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})"
  },
  {
    "path": "45-vue-router-reacting/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Contacto from './components/Contacto.vue';\nimport Usuario from './components/Usuario.vue';\n\nexport const routes = [\n    {path: '/', component: Home},\n    {path: '/contacto', component: Contacto},\n    {path: '/usuario/:id', component: Usuario},\n];"
  },
  {
    "path": "45-vue-router-reacting/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "46-vue-router-nested-routes/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "46-vue-router-nested-routes/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "46-vue-router-nested-routes/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>46-vue-router-nested-routes</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "46-vue-router-nested-routes/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "46-vue-router-nested-routes/src/App.vue",
    "content": "<template>\n    <router-view></router-view>\n</template>\n\n<script>\n    export default {}\n</script>"
  },
  {
    "path": "46-vue-router-nested-routes/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n    </main>\n</template>"
  },
  {
    "path": "46-vue-router-nested-routes/src/components/EquipoJuan.vue",
    "content": "<template>\n    <section>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n    </section>\n</template>"
  },
  {
    "path": "46-vue-router-nested-routes/src/components/Home.vue",
    "content": "<template>\n    <h1>Home</h1>\n</template>"
  },
  {
    "path": "46-vue-router-nested-routes/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})\n"
  },
  {
    "path": "46-vue-router-nested-routes/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport EquipoJuan from './components/EquipoJuan.vue';\n\nexport const routes = [\n    {path: '/', component: Home},\n    {path: '/equipo', component: Equipo, children: [\n        {path: 'juan', component: EquipoJuan},\n    ]},\n];"
  },
  {
    "path": "46-vue-router-nested-routes/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "47-vue-router-nested-nav/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "47-vue-router-nested-nav/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "47-vue-router-nested-nav/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>47-vue-router-nested-nav</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "47-vue-router-nested-nav/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "47-vue-router-nested-nav/src/App.vue",
    "content": "<template>\n    <router-view></router-view>\n</template>\n\n<script>\n    export default {}\n</script>"
  },
  {
    "path": "47-vue-router-nested-nav/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n    </main>\n</template>"
  },
  {
    "path": "47-vue-router-nested-nav/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <router-link :to=\"'/equipo/' + id\">Equipo</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "47-vue-router-nested-nav/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n        <router-link :to=\"'/equipo/' + $route.params.id + '/fotos'\">Fotos</router-link>\n        <router-link :to=\"'/equipo/' + $route.params.id + '/bio'\">Bio</router-link>\n        <router-view></router-view>\n    </section>\n</template>\n"
  },
  {
    "path": "47-vue-router-nested-nav/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "47-vue-router-nested-nav/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "47-vue-router-nested-nav/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})\n"
  },
  {
    "path": "47-vue-router-nested-nav/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\n\nexport const routes = [\n    {path: '/', component: Home},\n    {path: '/equipo/:id', component: Equipo, children: [\n        {path: '', component: Usuario, children: [\n            {path: 'fotos', component: UsuarioFotos},\n            {path: 'bio', component: UsuarioBio}\n        ]},\n    ]},\n];"
  },
  {
    "path": "47-vue-router-nested-nav/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "48-vue-router-named-routes/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "48-vue-router-named-routes/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "48-vue-router-named-routes/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>48-vue-router-named-routes</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "48-vue-router-named-routes/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "48-vue-router-named-routes/src/App.vue",
    "content": "<template>\n    <router-view></router-view>\n</template>\n\n<script>\n    export default {}\n</script>"
  },
  {
    "path": "48-vue-router-named-routes/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n    </main>\n</template>"
  },
  {
    "path": "48-vue-router-named-routes/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <!--<router-link :to=\"'/equipo/' + id\">Equipo</router-link>-->\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "48-vue-router-named-routes/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n<!--        <router-link :to=\"'/equipo/' + $route.params.id + '/fotos'\">Fotos</router-link>\n        <router-link :to=\"'/equipo/' + $route.params.id + '/bio'\">Bio</router-link>-->\n        <router-link :to=\"{ name:'fotos', params: {id: $route.params.id}}\">Fotos</router-link>\n        <router-link :to=\"{ name: 'bio', params: {id: $route.params.id}}\">Bio</router-link>\n        <router-view></router-view>\n    </section>\n</template>\n"
  },
  {
    "path": "48-vue-router-named-routes/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "48-vue-router-named-routes/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "48-vue-router-named-routes/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})\n"
  },
  {
    "path": "48-vue-router-named-routes/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\n\nexport const routes = [\n    {path: '/', component: Home},\n    {path: '/equipo/:id', component: Equipo, children: [\n        {path: '', component: Usuario, name:'equipo', children: [\n            {path: 'fotos', component: UsuarioFotos, name: 'fotos'},\n            {path: 'bio', component: UsuarioBio, name: 'bio'}\n        ]},\n    ]},\n];"
  },
  {
    "path": "48-vue-router-named-routes/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "49-vue-router-named-views/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "49-vue-router-named-views/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "49-vue-router-named-views/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>49-vue-router-named-views</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "49-vue-router-named-views/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "49-vue-router-named-views/src/App.vue",
    "content": "<template>\n    <router-view></router-view>\n</template>\n\n<script>\n    export default {}\n</script>"
  },
  {
    "path": "49-vue-router-named-views/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "49-vue-router-named-views/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <!--<router-link :to=\"'/equipo/' + id\">Equipo</router-link>-->\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "49-vue-router-named-views/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n<!--        <router-link :to=\"'/equipo/' + $route.params.id + '/fotos'\">Fotos</router-link>\n        <router-link :to=\"'/equipo/' + $route.params.id + '/bio'\">Bio</router-link>-->\n<!--        <router-link :to=\"{ name:'fotos', params: {id: $route.params.id}}\">Fotos</router-link>\n        <router-link :to=\"{ name: 'bio', params: {id: $route.params.id}}\">Bio</router-link>\n        <router-view></router-view>-->\n    </section>\n</template>\n"
  },
  {
    "path": "49-vue-router-named-views/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "49-vue-router-named-views/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "49-vue-router-named-views/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})\n"
  },
  {
    "path": "49-vue-router-named-views/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\n\nexport const routes = [\n    {path: '/', component: Home},\n    {path: '/equipo/:id', component: Equipo, children: [\n        {path: '', components: {\n            default: Usuario,\n            bio: UsuarioBio,\n            fotos: UsuarioFotos,\n        }, name:'equipo'},\n    ]},\n];"
  },
  {
    "path": "49-vue-router-named-views/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "5-eventos/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <ul>\n            <li v-for=\"tarea in tareas\">\n                {{ tarea }}\n            </li>\n        </ul>\n        <form v-on:submit.prevent=\"agregarTarea\">\n            <input type=\"text\" placeholder=\"Introduce tu tarea\" v-model=\"nuevaTarea\" >\n            <input type=\"submit\" value=\"Enviar tarea\" >\n        </form>\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "5-eventos/js/main.js",
    "content": "const vm = new Vue({\n    el: 'main',\n    data: {\n        nuevaTarea: null,\n        tareas: [\n            'Aprender Vue.js',\n            'Aprender ES6',\n            'Publicar algo todos los días'\n        ]\n    },\n    methods: {\n        agregarTarea() {\n            // this, hace referencia a la instancia Vue\n            this.tareas.unshift(this.nuevaTarea);\n            this.nuevaTarea = null;\n        }\n    }\n});\n\n// Vanilla JavaScript\n// function agregarTarea() {\n//     const input = document.querySelector('input[type=text]');\n//     vm.tareas.unshift(input.value);\n//     input.value = '';\n// }"
  },
  {
    "path": "50-vue-router-redirect/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "50-vue-router-redirect/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "50-vue-router-redirect/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>50-vue-router-redirection</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "50-vue-router-redirect/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "50-vue-router-redirect/src/App.vue",
    "content": "<template>\n    <router-view></router-view>\n</template>\n\n<script>\n    export default {}\n</script>"
  },
  {
    "path": "50-vue-router-redirect/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "50-vue-router-redirect/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <!--<router-link :to=\"'/equipo/' + id\">Equipo</router-link>-->\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "50-vue-router-redirect/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n<!--        <router-link :to=\"'/equipo/' + $route.params.id + '/fotos'\">Fotos</router-link>\n        <router-link :to=\"'/equipo/' + $route.params.id + '/bio'\">Bio</router-link>-->\n<!--        <router-link :to=\"{ name:'fotos', params: {id: $route.params.id}}\">Fotos</router-link>\n        <router-link :to=\"{ name: 'bio', params: {id: $route.params.id}}\">Bio</router-link>\n        <router-view></router-view>-->\n    </section>\n</template>\n"
  },
  {
    "path": "50-vue-router-redirect/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "50-vue-router-redirect/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "50-vue-router-redirect/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})\n"
  },
  {
    "path": "50-vue-router-redirect/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\n\nexport const routes = [\n    {path: '/', component: Home, name: 'home'},\n    {path: '/prueba', alias: '/otraprueba', redirect: {name: 'home'},  component: Home},\n    {path: '/equipo/:id', component: Equipo, children: [\n        {path: '', components: {\n            default: Usuario,\n            bio: UsuarioBio,\n            fotos: UsuarioFotos,\n        }, name:'equipo'},\n    ]},\n];"
  },
  {
    "path": "50-vue-router-redirect/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "51-vue-router-passing-props/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "51-vue-router-passing-props/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "51-vue-router-passing-props/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>51-vue-router-passing-props</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "51-vue-router-passing-props/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "51-vue-router-passing-props/src/App.vue",
    "content": "<template>\n    <router-view></router-view>\n</template>\n\n<script>\n    export default {}\n</script>"
  },
  {
    "path": "51-vue-router-passing-props/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Dónde encontrarme</h2>\n        <p>C/. Lo que sea, Valencia</p>\n       <!-- <h5>{{ $route.params.newsletter }}</h5>-->\n        <h5>{{ newsletter }}</h5>\n        <!--<template v-if=\"$route.params.newsletter === 'true'\">-->\n        <!--<template v-if=\"newsletter === 'true'\">-->\n        <template v-if=\"newsletter\">\n            <form action=\"\">\n                <h3>Newsletter</h3>\n                <label for=\"correoe\">Correo-e</label>\n                <input type=\"email\" placeholder=\"Tu correo-e\" id=\"correoe\">\n            </form>\n        </template>\n\n    </section>\n</template>\n\n<script>\n    export default {\n        props: ['newsletter']\n    }\n</script>"
  },
  {
    "path": "51-vue-router-passing-props/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "51-vue-router-passing-props/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n        <router-link :to=\"{name: 'contacto'}\">Contacto</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "51-vue-router-passing-props/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n<!--        <router-link :to=\"'/equipo/' + $route.params.id + '/fotos'\">Fotos</router-link>\n        <router-link :to=\"'/equipo/' + $route.params.id + '/bio'\">Bio</router-link>-->\n<!--        <router-link :to=\"{ name:'fotos', params: {id: $route.params.id}}\">Fotos</router-link>\n        <router-link :to=\"{ name: 'bio', params: {id: $route.params.id}}\">Bio</router-link>\n        <router-view></router-view>-->\n    </section>\n</template>\n"
  },
  {
    "path": "51-vue-router-passing-props/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "51-vue-router-passing-props/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "51-vue-router-passing-props/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})\n"
  },
  {
    "path": "51-vue-router-passing-props/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\nimport Contacto from './components/Contacto.vue';\n\nexport const routes = [\n    {path: '/', component: Home, name: 'home'},\n    {path: '/prueba', alias: '/otraprueba', redirect: {name: 'home'},  component: Home},\n    {path: '/equipo/:id', component: Equipo, children: [\n        {path: '', components: {\n            default: Usuario,\n            bio: UsuarioBio,\n            fotos: UsuarioFotos,\n        }, name:'equipo'},\n    ]},\n    {path: '/contacto', component: Contacto, name: 'contacto', props: {newsletter: false}}\n];"
  },
  {
    "path": "51-vue-router-passing-props/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "52-vue-router-history-mode/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "52-vue-router-history-mode/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "52-vue-router-history-mode/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>52-vue-router-history-mode</title>\n</head>\n<body>\n<h1>Bienvenid@ a mi super App</h1>\n<div id=\"app\"></div>\n<script src=\"/dist/build.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "52-vue-router-history-mode/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "52-vue-router-history-mode/src/App.vue",
    "content": "<template>\n    <router-view></router-view>\n</template>\n\n<script>\n    export default {}\n</script>"
  },
  {
    "path": "52-vue-router-history-mode/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Dónde encontrarme</h2>\n        <p>C/. Lo que sea, Valencia</p>\n       <!-- <h5>{{ $route.params.newsletter }}</h5>-->\n        <h5>{{ newsletter }}</h5>\n        <!--<template v-if=\"$route.params.newsletter === 'true'\">-->\n        <!--<template v-if=\"newsletter === 'true'\">-->\n        <template v-if=\"newsletter\">\n            <form action=\"\">\n                <h3>Newsletter</h3>\n                <label for=\"correoe\">Correo-e</label>\n                <input type=\"email\" placeholder=\"Tu correo-e\" id=\"correoe\">\n            </form>\n        </template>\n\n    </section>\n</template>\n\n<script>\n    export default {\n        props: ['newsletter']\n    }\n</script>"
  },
  {
    "path": "52-vue-router-history-mode/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "52-vue-router-history-mode/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n        <router-link :to=\"{name: 'contacto'}\">Contacto</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "52-vue-router-history-mode/src/components/NoEncontrado.vue",
    "content": "<template>\n    <h2>No encuentro: 404</h2>\n</template>"
  },
  {
    "path": "52-vue-router-history-mode/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n<!--        <router-link :to=\"'/equipo/' + $route.params.id + '/fotos'\">Fotos</router-link>\n        <router-link :to=\"'/equipo/' + $route.params.id + '/bio'\">Bio</router-link>-->\n<!--        <router-link :to=\"{ name:'fotos', params: {id: $route.params.id}}\">Fotos</router-link>\n        <router-link :to=\"{ name: 'bio', params: {id: $route.params.id}}\">Bio</router-link>\n        <router-view></router-view>-->\n    </section>\n</template>\n"
  },
  {
    "path": "52-vue-router-history-mode/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "52-vue-router-history-mode/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "52-vue-router-history-mode/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    mode: 'history',\n    routes,\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n})\n"
  },
  {
    "path": "52-vue-router-history-mode/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\nimport Contacto from './components/Contacto.vue';\nimport NoEncontrado from './components/NoEncontrado.vue';\n\nexport const routes = [\n    {path: '', component: Home, name: 'home'},\n    {path: '/prueba', alias: '/otraprueba', redirect: {name: 'home'},  component: Home},\n    {path: '/equipo/:id', component: Equipo, children: [\n        {path: '', components: {\n            default: Usuario,\n            bio: UsuarioBio,\n            fotos: UsuarioFotos,\n        }, name:'equipo'},\n    ]},\n    {path: '/contacto', component: Contacto, name: 'contacto', props: {newsletter: false}},\n    {path: '*', component: NoEncontrado}\n];"
  },
  {
    "path": "52-vue-router-history-mode/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "53-vue-router-global-guard/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "53-vue-router-global-guard/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "53-vue-router-global-guard/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>53-vue-router-global-guard</title>\n</head>\n<body>\n<h1>Bienvenid@ a mi super App</h1>\n<div id=\"app\"></div>\n<script src=\"/dist/build.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "53-vue-router-global-guard/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "53-vue-router-global-guard/src/App.vue",
    "content": "<template>\n    <section>\n        <button @click=\"cambiar\">Cambiar Auth</button>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>\n\n<script>\n    import {mapMutations} from 'vuex';\n    export default {\n        methods: mapMutations(['cambiar']),\n    }\n</script>"
  },
  {
    "path": "53-vue-router-global-guard/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Dónde encontrarme</h2>\n        <p>C/. Lo que sea, Valencia</p>\n       <!-- <h5>{{ $route.params.newsletter }}</h5>-->\n        <h5>{{ newsletter }}</h5>\n        <!--<template v-if=\"$route.params.newsletter === 'true'\">-->\n        <!--<template v-if=\"newsletter === 'true'\">-->\n        <template v-if=\"newsletter\">\n            <form action=\"\">\n                <h3>Newsletter</h3>\n                <label for=\"correoe\">Correo-e</label>\n                <input type=\"email\" placeholder=\"Tu correo-e\" id=\"correoe\">\n            </form>\n        </template>\n\n    </section>\n</template>\n\n<script>\n    export default {\n        props: ['newsletter']\n    }\n</script>"
  },
  {
    "path": "53-vue-router-global-guard/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "53-vue-router-global-guard/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n        <router-link :to=\"{name: 'contacto'}\">Contacto</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "53-vue-router-global-guard/src/components/NoEncontrado.vue",
    "content": "<template>\n    <h2>No encuentro: 404</h2>\n</template>"
  },
  {
    "path": "53-vue-router-global-guard/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n<!--        <router-link :to=\"'/equipo/' + $route.params.id + '/fotos'\">Fotos</router-link>\n        <router-link :to=\"'/equipo/' + $route.params.id + '/bio'\">Bio</router-link>-->\n<!--        <router-link :to=\"{ name:'fotos', params: {id: $route.params.id}}\">Fotos</router-link>\n        <router-link :to=\"{ name: 'bio', params: {id: $route.params.id}}\">Bio</router-link>\n        <router-view></router-view>-->\n    </section>\n</template>\n"
  },
  {
    "path": "53-vue-router-global-guard/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "53-vue-router-global-guard/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "53-vue-router-global-guard/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport {store} from './store';\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    mode: 'history',\n    routes,\n});\n\nrouter.beforeEach((to, from, next) => {\n   console.log('Acceso a ruta');\n   next(store.state.auth);\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    store,\n    render: h => h(App)\n});\n"
  },
  {
    "path": "53-vue-router-global-guard/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\nimport Contacto from './components/Contacto.vue';\nimport NoEncontrado from './components/NoEncontrado.vue';\n\nexport const routes = [\n    {path: '/', component: Home, name: 'home'},\n    {path: '/prueba', alias: '/otraprueba', redirect: {name: 'home'},  component: Home},\n    {path: '/equipo/:id', component: Equipo, children: [\n        {path: '', components: {\n            default: Usuario,\n            bio: UsuarioBio,\n            fotos: UsuarioFotos,\n        }, name:'equipo'},\n    ]},\n    {path: '/contacto', component: Contacto, name: 'contacto', props: {newsletter: false}},\n    {path: '*', component: NoEncontrado}\n];"
  },
  {
    "path": "53-vue-router-global-guard/src/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n   state: {\n       auth: true,\n   },\n    mutations: {\n       cambiar: (state) => state.auth = !state.auth,\n    }\n});"
  },
  {
    "path": "53-vue-router-global-guard/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "54-vue-router-route-guard/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "54-vue-router-route-guard/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "54-vue-router-route-guard/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>54-vue-router-route-guard</title>\n</head>\n<body>\n<h1>Bienvenid@ a mi super App</h1>\n<div id=\"app\"></div>\n<script src=\"/dist/build.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "54-vue-router-route-guard/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "54-vue-router-route-guard/src/App.vue",
    "content": "<template>\n    <section>\n        <button @click=\"cambiar\">Cambiar Auth</button>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>\n\n<script>\n    import {mapMutations} from 'vuex';\n    export default {\n        methods: mapMutations(['cambiar']),\n    }\n</script>"
  },
  {
    "path": "54-vue-router-route-guard/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Dónde encontrarme</h2>\n        <p>C/. Lo que sea, Valencia</p>\n       <!-- <h5>{{ $route.params.newsletter }}</h5>-->\n        <h5>{{ newsletter }}</h5>\n        <!--<template v-if=\"$route.params.newsletter === 'true'\">-->\n        <!--<template v-if=\"newsletter === 'true'\">-->\n        <template v-if=\"newsletter\">\n            <form action=\"\">\n                <h3>Newsletter</h3>\n                <label for=\"correoe\">Correo-e</label>\n                <input type=\"email\" placeholder=\"Tu correo-e\" id=\"correoe\">\n            </form>\n        </template>\n\n    </section>\n</template>\n\n<script>\n    export default {\n        props: ['newsletter']\n    }\n</script>"
  },
  {
    "path": "54-vue-router-route-guard/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "54-vue-router-route-guard/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n        <router-link :to=\"{name: 'contacto'}\">Contacto</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "54-vue-router-route-guard/src/components/NoEncontrado.vue",
    "content": "<template>\n    <h2>No encuentro: 404</h2>\n</template>"
  },
  {
    "path": "54-vue-router-route-guard/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n<!--        <router-link :to=\"'/equipo/' + $route.params.id + '/fotos'\">Fotos</router-link>\n        <router-link :to=\"'/equipo/' + $route.params.id + '/bio'\">Bio</router-link>-->\n<!--        <router-link :to=\"{ name:'fotos', params: {id: $route.params.id}}\">Fotos</router-link>\n        <router-link :to=\"{ name: 'bio', params: {id: $route.params.id}}\">Bio</router-link>\n        <router-view></router-view>-->\n    </section>\n</template>\n"
  },
  {
    "path": "54-vue-router-route-guard/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "54-vue-router-route-guard/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "54-vue-router-route-guard/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport {store} from './store';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    mode: 'history',\n    routes,\n});\n\nrouter.beforeEach((to, from, next) => {\n   console.log('Acceso global a ruta');\n   next();\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    store,\n    render: h => h(App)\n});\n"
  },
  {
    "path": "54-vue-router-route-guard/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\nimport Contacto from './components/Contacto.vue';\nimport NoEncontrado from './components/NoEncontrado.vue';\nimport {store} from './store';\n\nexport const routes = [\n    {path: '/', component: Home, name: 'home'},\n    {path: '/prueba', alias: '/otraprueba', redirect: {name: 'home'},  component: Home},\n    {path: '/equipo/:id', component: Equipo, children: [\n        {path: '', components: {\n            default: Usuario,\n            bio: UsuarioBio,\n            fotos: UsuarioFotos,\n        }, name:'equipo'},\n    ]},\n    {   beforeEnter: ((to, from, next) => {\n            console.log('Acceso a ruta contacto');\n            next(store.state.auth);\n        }),\n        path: '/contacto', component: Contacto, name: 'contacto', props: {newsletter: false}},\n    {path: '*', component: NoEncontrado}\n];"
  },
  {
    "path": "54-vue-router-route-guard/src/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n   state: {\n       auth: true,\n   },\n    mutations: {\n       cambiar: (state) => state.auth = !state.auth,\n    }\n});"
  },
  {
    "path": "54-vue-router-route-guard/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "55-vue-router-component-guard/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "55-vue-router-component-guard/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "55-vue-router-component-guard/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>55-vue-router-component-guard</title>\n</head>\n<body>\n<h1>Bienvenid@ a mi super App</h1>\n<div id=\"app\"></div>\n<script src=\"/dist/build.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "55-vue-router-component-guard/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "55-vue-router-component-guard/src/App.vue",
    "content": "<template>\n    <section>\n        <button @click=\"cambiar\">Cambiar Auth</button>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>\n\n<script>\n    import {mapMutations} from 'vuex';\n    export default {\n        methods: mapMutations(['cambiar']),\n    }\n</script>"
  },
  {
    "path": "55-vue-router-component-guard/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Dónde encontrarme</h2>\n        <p>C/. Lo que sea, Valencia</p>\n        <h5>{{ newsletter }}</h5>\n        <template v-if=\"newsletter\">\n            <form action=\"\">\n                <h3>Newsletter</h3>\n                <label for=\"correoe\">Correo-e</label>\n                <input type=\"email\" placeholder=\"Tu correo-e\" id=\"correoe\">\n            </form>\n        </template>\n\n    </section>\n</template>\n\n<script>\n    export default {\n        props: ['newsletter'],\n    }\n</script>"
  },
  {
    "path": "55-vue-router-component-guard/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "55-vue-router-component-guard/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n        <router-link :to=\"{name: 'contacto'}\">Contacto</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "55-vue-router-component-guard/src/components/NoEncontrado.vue",
    "content": "<template>\n    <h2>No encuentro: 404</h2>\n</template>"
  },
  {
    "path": "55-vue-router-component-guard/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n    </section>\n</template>\n\n<script>\n    export default {\n        beforeRouteEnter: ((to, from, next) => {\n            console.info('Antes de entrar');\n            next((vm) => console.log(vm));\n        }),\n        beforeRouteUpdate: ((to, from, next) => {\n           console.info('Antes de cambiar la ruta sobre el mismo componente');\n           next();\n        }),\n        beforeRouteLeave: ((to, from, next) => {\n           console.info('Antes de salir');\n           next();\n        }),\n    }\n</script>\n\n\n"
  },
  {
    "path": "55-vue-router-component-guard/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "55-vue-router-component-guard/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "55-vue-router-component-guard/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport {store} from './store';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes,\n});\n\nrouter.beforeEach((to, from, next) => {\n   console.log('Acceso global a ruta');\n   next();\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    store,\n    render: h => h(App)\n});\n"
  },
  {
    "path": "55-vue-router-component-guard/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\nimport Contacto from './components/Contacto.vue';\nimport NoEncontrado from './components/NoEncontrado.vue';\nimport {store} from './store';\n\nexport const routes = [\n    {path: '/', component: Home, name: 'home'},\n    {path: '/prueba', alias: '/otraprueba', redirect: {name: 'home'},  component: Home},\n    {path: '/equipo/:id', component: Equipo, children: [\n        {path: '', components: {\n            default: Usuario,\n            bio: UsuarioBio,\n            fotos: UsuarioFotos,\n        }, name:'equipo'},\n    ]},\n    {   beforeEnter: ((to, from, next) => {\n            console.log('Acceso a ruta contacto');\n            next(store.state.auth);\n        }),\n        path: '/contacto', component: Contacto, name: 'contacto', props: {newsletter: false}},\n    {path: '*', component: NoEncontrado}\n];"
  },
  {
    "path": "55-vue-router-component-guard/src/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n   state: {\n       auth: true,\n   },\n    mutations: {\n       cambiar: (state) => state.auth = !state.auth,\n    }\n});"
  },
  {
    "path": "55-vue-router-component-guard/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "56-vue-router-meta-field/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "56-vue-router-meta-field/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "56-vue-router-meta-field/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>55-vue-router-component-guard</title>\n</head>\n<body>\n<h1>Bienvenid@ a mi super App</h1>\n<div id=\"app\"></div>\n<script src=\"/dist/build.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "56-vue-router-meta-field/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "56-vue-router-meta-field/src/App.vue",
    "content": "<template>\n    <section>\n        <button @click=\"cambiar\">Cambiar Auth</button>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>\n\n<script>\n    import {mapMutations} from 'vuex';\n    export default {\n        methods: mapMutations(['cambiar']),\n    }\n</script>"
  },
  {
    "path": "56-vue-router-meta-field/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Dónde encontrarme</h2>\n        <p>C/. Lo que sea, Valencia</p>\n        <h5>{{ newsletter }}</h5>\n        <template v-if=\"newsletter\">\n            <form action=\"\">\n                <h3>Newsletter</h3>\n                <label for=\"correoe\">Correo-e</label>\n                <input type=\"email\" placeholder=\"Tu correo-e\" id=\"correoe\">\n            </form>\n        </template>\n\n    </section>\n</template>\n\n<script>\n    export default {\n        props: ['newsletter'],\n    }\n</script>"
  },
  {
    "path": "56-vue-router-meta-field/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "56-vue-router-meta-field/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n        <router-link :to=\"{name: 'contacto'}\">Contacto</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "56-vue-router-meta-field/src/components/NoEncontrado.vue",
    "content": "<template>\n    <h2>No encuentro: 404</h2>\n</template>"
  },
  {
    "path": "56-vue-router-meta-field/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n    </section>\n</template>\n\n<script>\n    export default {\n        beforeRouteEnter: ((to, from, next) => {\n            console.info('Antes de entrar');\n            next((vm) => console.log(vm));\n        }),\n        beforeRouteUpdate: ((to, from, next) => {\n           console.info('Antes de cambiar la ruta sobre el mismo componente');\n           next();\n        }),\n        beforeRouteLeave: ((to, from, next) => {\n           console.info('Antes de salir');\n           next();\n        }),\n    }\n</script>\n\n\n"
  },
  {
    "path": "56-vue-router-meta-field/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "56-vue-router-meta-field/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "56-vue-router-meta-field/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport {store} from './store';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes,\n});\n\nrouter.beforeEach((to, from, next) => {\n    console.log('Acceso global a ruta');\n\n    if (to.meta.privado)\n        next(store.state.auth);\n    else\n        next();\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    store,\n    render: h => h(App)\n});\n"
  },
  {
    "path": "56-vue-router-meta-field/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\nimport Contacto from './components/Contacto.vue';\nimport NoEncontrado from './components/NoEncontrado.vue';\n\nexport const routes = [\n    {path: '/', component: Home, name: 'home'},\n    {path: '/prueba', alias: '/otraprueba', redirect: {name: 'home'}, component: Home},\n    {\n        path: '/equipo/:id', component: Equipo, children: [\n        {\n            path: '', components: {\n            default: Usuario,\n            bio: UsuarioBio,\n            fotos: UsuarioFotos,\n        }, name: 'equipo'\n        },\n    ]\n    },\n    {path: '/contacto', meta: {privado: true}, component: Contacto, name: 'contacto', props: {newsletter: false}},\n    {path: '*', component: NoEncontrado}\n];"
  },
  {
    "path": "56-vue-router-meta-field/src/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n   state: {\n       auth: true,\n   },\n    mutations: {\n       cambiar: (state) => state.auth = !state.auth,\n    }\n});"
  },
  {
    "path": "56-vue-router-meta-field/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "57-vue-router-transitions/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "57-vue-router-transitions/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "57-vue-router-transitions/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>56-vue-router-transtions</title>\n</head>\n<body>\n<h1>Bienvenid@ a mi super App</h1>\n<div id=\"app\"></div>\n<script src=\"/dist/build.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "57-vue-router-transitions/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "57-vue-router-transitions/src/App.vue",
    "content": "<template>\n    <section>\n        <button @click=\"cambiar\">Cambiar Auth</button>\n        <hr>\n        <transition name=\"aparecer\" appear>\n            <router-view></router-view>\n        </transition>\n    </section>\n</template>\n\n<script>\n    import {mapMutations} from 'vuex';\n    export default {\n        methods: mapMutations(['cambiar']),\n    }\n</script>\n<style>\n    /* Transition */\n    .aparecer-enter {\n        opacity: 0;\n    }\n\n    .aparecer-enter-active {\n        transition: opacity 1s;\n    }\n\n    .aparecer-leave-to {\n        opacity: 0;\n    }\n\n    .aparecer-leave-active {\n        transition: opacity 1s;\n    }\n</style>"
  },
  {
    "path": "57-vue-router-transitions/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Dónde encontrarme</h2>\n        <p>C/. Lo que sea, Valencia</p>\n        <h5>{{ newsletter }}</h5>\n        <template v-if=\"newsletter\">\n            <form action=\"\">\n                <h3>Newsletter</h3>\n                <label for=\"correoe\">Correo-e</label>\n                <input type=\"email\" placeholder=\"Tu correo-e\" id=\"correoe\">\n            </form>\n        </template>\n\n    </section>\n</template>\n\n<script>\n    export default {\n        props: ['newsletter'],\n    }\n</script>"
  },
  {
    "path": "57-vue-router-transitions/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "57-vue-router-transitions/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n        <router-link :to=\"{name: 'contacto'}\">Contacto</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "57-vue-router-transitions/src/components/NoEncontrado.vue",
    "content": "<template>\n    <h2>No encuentro: 404</h2>\n</template>"
  },
  {
    "path": "57-vue-router-transitions/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n    </section>\n</template>\n\n<script>\n    export default {\n        beforeRouteEnter: ((to, from, next) => {\n            console.info('Antes de entrar');\n            next((vm) => console.log(vm));\n        }),\n        beforeRouteUpdate: ((to, from, next) => {\n           console.info('Antes de cambiar la ruta sobre el mismo componente');\n           next();\n        }),\n        beforeRouteLeave: ((to, from, next) => {\n           console.info('Antes de salir');\n           next();\n        }),\n    }\n</script>\n\n\n"
  },
  {
    "path": "57-vue-router-transitions/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "57-vue-router-transitions/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "57-vue-router-transitions/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport {store} from './store';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes,\n});\n\nrouter.beforeEach((to, from, next) => {\n    console.log('Acceso global a ruta');\n\n    if (to.meta.privado)\n        next(store.state.auth);\n    else\n        next();\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    store,\n    render: h => h(App)\n});\n"
  },
  {
    "path": "57-vue-router-transitions/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\nimport Contacto from './components/Contacto.vue';\nimport NoEncontrado from './components/NoEncontrado.vue';\n\nexport const routes = [\n    {path: '/', component: Home, name: 'home'},\n    {path: '/prueba', alias: '/otraprueba', redirect: {name: 'home'}, component: Home},\n    {\n        path: '/equipo/:id', component: Equipo, children: [\n        {\n            path: '', components: {\n            default: Usuario,\n            bio: UsuarioBio,\n            fotos: UsuarioFotos,\n        }, name: 'equipo'\n        },\n    ]\n    },\n    {path: '/contacto', meta: {privado: true}, component: Contacto, name: 'contacto', props: {newsletter: false}},\n    {path: '*', component: NoEncontrado}\n];"
  },
  {
    "path": "57-vue-router-transitions/src/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n   state: {\n       auth: true,\n   },\n    mutations: {\n       cambiar: (state) => state.auth = !state.auth,\n    }\n});"
  },
  {
    "path": "57-vue-router-transitions/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "58-vue-router-data-fetch/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "58-vue-router-data-fetch/README.md",
    "content": "# 46-vue-router-nested-routes\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "58-vue-router-data-fetch/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>58-vue-router-data-fetch</title>\n</head>\n<body>\n<h1>Bienvenid@ a mi super App</h1>\n<div id=\"app\"></div>\n<script src=\"/dist/build.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "58-vue-router-data-fetch/package.json",
    "content": "{\n  \"name\": \"46-vue-router-nested-routes\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.3.0\",\n    \"vuex\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "58-vue-router-data-fetch/src/App.vue",
    "content": "<template>\n    <section>\n        <button @click=\"cambiar\">Cambiar Auth</button>\n        <hr>\n        <transition name=\"aparecer\" appear>\n            <router-view></router-view>\n        </transition>\n    </section>\n</template>\n\n<script>\n    import {mapMutations} from 'vuex';\n    export default {\n        methods: mapMutations(['cambiar']),\n    }\n</script>\n<style>\n    /* Transition */\n    .aparecer-enter {\n        opacity: 0;\n    }\n\n    .aparecer-enter-active {\n        transition: opacity 1s;\n    }\n\n    .aparecer-leave-to {\n        opacity: 0;\n    }\n\n    .aparecer-leave-active {\n        transition: opacity 1s;\n    }\n</style>"
  },
  {
    "path": "58-vue-router-data-fetch/src/components/Contacto.vue",
    "content": "<template>\n    <section>\n        <h2>Dónde encontrarme</h2>\n        <p>C/. Lo que sea, Valencia</p>\n        <h5>{{ newsletter }}</h5>\n        <pre>{{ numero }}</pre>\n        <template v-if=\"newsletter\">\n            <form action=\"\">\n                <h3>Newsletter</h3>\n                <label for=\"correoe\">Correo-e</label>\n                <input type=\"email\" placeholder=\"Tu correo-e\" id=\"correoe\">\n            </form>\n        </template>\n\n    </section>\n</template>\n\n<script>\n    export default {\n        props: ['newsletter'],\n        data() {\n            return {\n                numero: null,\n            }\n        },\n        beforeRouteEnter: ((to, from, next) => {\n            console.info('Antes de entrar');\n            setTimeout(() => {\n                next((vm) => {\n                    vm.numero = Math.floor(Math.random() * 1000);\n                })\n            }, 2000);\n        }),\n    }\n</script>"
  },
  {
    "path": "58-vue-router-data-fetch/src/components/Equipo.vue",
    "content": "<template>\n    <main>\n        <h1>Nuestro equipo:</h1>\n        <router-view></router-view>\n        <router-view name=\"bio\"></router-view>\n        <router-view name=\"fotos\"></router-view>\n    </main>\n</template>"
  },
  {
    "path": "58-vue-router-data-fetch/src/components/Home.vue",
    "content": "<template>\n    <section>\n        <h1>Home</h1>\n        <router-link :to=\"{ name: 'equipo', params: {id: id}}\">Equipo</router-link>\n        <router-link :to=\"{name: 'contacto'}\">Contacto</router-link>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                id: 'juan'\n            }\n        }\n    }\n</script>"
  },
  {
    "path": "58-vue-router-data-fetch/src/components/NoEncontrado.vue",
    "content": "<template>\n    <h2>No encuentro: 404</h2>\n</template>"
  },
  {
    "path": "58-vue-router-data-fetch/src/components/Usuario.vue",
    "content": "<template>\n    <section>\n        <h1>El identificador es: {{ $route.params.id }}</h1>\n        <h2>Juan Andrés Núñez</h2>\n        <h5>juan@wmedia.es</h5>\n        <pre v-text=\"username\"></pre>\n    </section>\n</template>\n\n<script>\n    export default {\n        data() {\n            return {\n                username: null\n            }\n        },\n        created() {\n            this.obtenerUsername();\n        },\n        watch: {\n          '$route': 'obtenerUsername'\n        },\n        methods: {\n            obtenerUsername() {\n                setTimeout(() => {\n                    this.username = this.$route.params.id + Math.floor(Math.random() * 1000);\n                }, 2000);\n            }\n        },\n        beforeRouteEnter: ((to, from, next) => {\n            console.info('Antes de entrar');\n            next((vm) => console.log(vm));\n        }),\n        beforeRouteUpdate: ((to, from, next) => {\n            console.info('Antes de cambiar la ruta sobre el mismo componente');\n            next();\n        }),\n        beforeRouteLeave: ((to, from, next) => {\n            console.info('Antes de salir');\n            next();\n        }),\n    }\n</script>\n\n\n"
  },
  {
    "path": "58-vue-router-data-fetch/src/components/UsuarioBio.vue",
    "content": "<template>\n    <h5>Lorem ipsum...</h5>\n</template>"
  },
  {
    "path": "58-vue-router-data-fetch/src/components/UsuarioFotos.vue",
    "content": "<template>\n    <section>\n        <h2>Mi foto de perfil</h2>\n        <img src=\"https://ih1.redbubble.net/image.11748456.8987/sticker,375x360.png\" alt=\"\">\n    </section>\n</template>"
  },
  {
    "path": "58-vue-router-data-fetch/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport VueRouter from 'vue-router';\nimport {routes} from './routes';\nimport {store} from './store';\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n    routes,\n});\n\nrouter.beforeEach((to, from, next) => {\n    console.log('Acceso global a ruta');\n\n    if (to.meta.privado)\n        next(store.state.auth);\n    else\n        next();\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    store,\n    render: h => h(App)\n});\n"
  },
  {
    "path": "58-vue-router-data-fetch/src/routes.js",
    "content": "import Home from './components/Home.vue';\nimport Equipo from './components/Equipo.vue';\nimport Usuario from './components/Usuario.vue';\nimport UsuarioFotos from './components/UsuarioFotos.vue';\nimport UsuarioBio from './components/UsuarioBio.vue';\nimport Contacto from './components/Contacto.vue';\nimport NoEncontrado from './components/NoEncontrado.vue';\n\nexport const routes = [\n    {path: '/', component: Home, name: 'home'},\n    {path: '/prueba', alias: '/otraprueba', redirect: {name: 'home'}, component: Home},\n    {\n        path: '/equipo/:id', component: Equipo, children: [\n                {\n                    path: '', components: {\n                    default: Usuario,\n                    bio: UsuarioBio,\n                    fotos: UsuarioFotos,\n                }, name: 'equipo'\n            },\n        ]\n    },\n    {path: '/contacto', meta: {privado: true}, component: Contacto, name: 'contacto', props: {newsletter: false}},\n    {path: '*', component: NoEncontrado}\n];"
  },
  {
    "path": "58-vue-router-data-fetch/src/store.js",
    "content": "import Vue from 'vue';\nimport Vuex from 'vuex';\nVue.use(Vuex);\n\nexport const store = new Vuex.Store({\n   state: {\n       auth: true,\n   },\n    mutations: {\n       cambiar: (state) => state.auth = !state.auth,\n    }\n});"
  },
  {
    "path": "58-vue-router-data-fetch/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "59-vue-router-srcoll/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "59-vue-router-srcoll/README.md",
    "content": "# 59-vue-router-srcoll\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "59-vue-router-srcoll/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>59-vue-router-srcoll</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "59-vue-router-srcoll/package.json",
    "content": "{\n  \"name\": \"59-vue-router-srcoll\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.5.2\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "59-vue-router-srcoll/src/App.vue",
    "content": "<template>\n    <section>\n        <router-link to=\"/\">Info</router-link>\n        <router-link :to=\"{path: '/bio', hash: '#parrafo'}\">Bio</router-link>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>"
  },
  {
    "path": "59-vue-router-srcoll/src/components/Bio.vue",
    "content": "<template>\n    <article>\n        <h1>Loren ipsum</h1>\n        <p>\n            Lorem ipsum dolor sit amet, consectetur adipisicing elit. A ab amet aperiam dicta earum, eligendi est et itaque modi nesciunt nihil omnis possimus provident quaerat quasi quis repudiandae velit voluptatem.</p>\n        <p>\n            Accusamus aperiam dolores ea, earum esse, eum facere inventore iste itaque magni nihil nobis praesentium reiciendis repudiandae soluta unde veniam vero. Deleniti maiores minus neque voluptate! Inventore, iure voluptatibus. Quo?</p>\n        <p id=\"parrafo\">\n            Ab assumenda autem cumque dolor, impedit in ipsum itaque magni quisquam vero? Architecto fugit illo impedit nam nobis nostrum obcaecati sint tenetur vel, voluptates. Delectus id inventore sequi sint voluptatem.</p>\n        <p>\n            Distinctio dolores eius enim eveniet expedita facilis inventore magnam qui soluta vitae? Assumenda consequatur, eaque ex ipsum optio possimus provident quaerat! Incidunt iste repellendus suscipit. Asperiores iste perferendis sint velit.</p>\n        <p>\n            Adipisci, dolorum ea est illo itaque quas quidem rem rerum velit! Consectetur dicta dignissimos eaque harum itaque magnam perspiciatis, quaerat voluptatibus. Dolorum ducimus harum illum neque officia optio pariatur vel.</p>\n        <p>\n            A iusto, nihil nisi quaerat quidem quo quod reprehenderit suscipit! Amet asperiores, consequatur debitis, deleniti eligendi expedita maiores, natus nisi nulla provident recusandae sint tempore temporibus! Hic maxime neque reprehenderit.</p>\n        <p>\n            Cum ea enim facilis fugiat iure nisi pariatur reprehenderit ut. Ab amet asperiores beatae, eaque illo libero nemo nobis obcaecati officia officiis perspiciatis praesentium quaerat quasi quisquam repudiandae vitae, voluptate!</p>\n        <p>\n            Accusamus, animi aperiam aspernatur assumenda corporis cumque delectus deleniti distinctio dolores ducimus, ea eaque eligendi error explicabo iusto labore laborum magni nobis nostrum quasi quis reprehenderit similique sint temporibus vel!</p>\n        <p>\n            Amet autem cumque dolores in ipsum iure iusto non quas, qui quisquam reprehenderit similique sit. Ad aliquid architecto, blanditiis delectus dicta dignissimos enim ex explicabo fugiat, incidunt laudantium, officia suscipit.</p>\n        <p>\n            Aliquid at atque autem consectetur corporis delectus dolore enim est eum facere fugiat illo in ipsam iusto labore maiores natus nisi non, nostrum odit pariatur porro qui rem veritatis vitae!</p>\n    </article>\n</template>\n\n<style>\n    article {\n        width: 1000px;\n    }\n    p {\n        width: 400px;\n    }\n    #parrafo {\n        color: red;\n        font-weight:bold;\n    }\n</style>"
  },
  {
    "path": "59-vue-router-srcoll/src/components/Info.vue",
    "content": "<template>\n    <div id=\"app\">\n        <img src=\"../assets/logo.png\">\n        <h1></h1>\n        <h2>Essential Links</h2>\n        <ul>\n            <li><a href=\"https://vuejs.org\" target=\"_blank\">Core Docs</a></li>\n            <li><a href=\"https://forum.vuejs.org\" target=\"_blank\">Forum</a></li>\n            <li><a href=\"https://gitter.im/vuejs/vue\" target=\"_blank\">Gitter Chat</a></li>\n            <li><a href=\"https://twitter.com/vuejs\" target=\"_blank\">Twitter</a></li>\n        </ul>\n        <h2>Ecosystem</h2>\n        <ul>\n            <li><a href=\"http://router.vuejs.org/\" target=\"_blank\">vue-router</a></li>\n            <li><a href=\"http://vuex.vuejs.org/\" target=\"_blank\">vuex</a></li>\n            <li><a href=\"http://vue-loader.vuejs.org/\" target=\"_blank\">vue-loader</a></li>\n            <li><a href=\"https://github.com/vuejs/awesome-vue\" target=\"_blank\">awesome-vue</a></li>\n        </ul>\n    </div>\n\n</template>\n\n<script>\n    export default {\n        name: 'app',\n        data () {\n            return {\n                msg: 'Welcome to Your Vue.js App'\n            }\n        }\n    }\n</script>\n\n<style>\n    #app {\n        font-family: 'Avenir', Helvetica, Arial, sans-serif;\n        -webkit-font-smoothing: antialiased;\n        -moz-osx-font-smoothing: grayscale;\n        text-align: center;\n        color: #2c3e50;\n        margin-top: 60px;\n    }\n\n    h1, h2 {\n        font-weight: normal;\n    }\n\n    ul {\n        list-style-type: none;\n        padding: 0;\n    }\n\n    li {\n        display: inline-block;\n        margin: 0 10px;\n    }\n\n    a {\n        color: #42b983;\n    }\n</style>\n"
  },
  {
    "path": "59-vue-router-srcoll/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport Info from './components/Info.vue';\nimport Bio from './components/Bio.vue';\n\n/* Router */\nimport VueRouter from 'vue-router';\n\nVue.use(VueRouter);\n\nconst routes = [\n    {path: '/', component: Info},\n    {path: '/bio', component: Bio},\n];\n\nconst router = new VueRouter({\n    routes,\n    mode: 'history',\n    scrollBehavior(to, from, savedPosition) {\n        const position = {};\n        console.log(to);\n        if (to.hash) {\n            position.selector = to.hash;\n        } else {\n            position.x = 200;\n            position.y = 100;\n        }\n        return position;\n    }\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n});"
  },
  {
    "path": "59-vue-router-srcoll/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "6-propiedades-computadas/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <ul>\n            <li v-for=\"tarea in tareasConPrioridad\">\n                {{ tarea.titulo }}\n            </li>\n        </ul>\n        <form v-on:submit.prevent=\"agregarTarea\">\n            <input type=\"text\" placeholder=\"Introduce tu tarea\" v-model=\"nuevaTarea\" >\n            <input type=\"submit\" value=\"Enviar tarea\" >\n        </form>\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "6-propiedades-computadas/js/main.js",
    "content": "new Vue({\n    el: 'main',\n    data: {\n        mensaje: 'Hola Mundo :) !',\n        nuevaTarea: null,\n        tareas: [{\n                titulo: 'Aprender Vue.js',\n                prioridad: true,\n                antiguedad: 23\n            },\n            {\n                titulo: 'Aprender ES6',\n                prioridad: false,\n                antiguedad: 135\n            },\n            {\n                titulo: 'Publicar algo todos los días',\n                prioridad: true,\n                antiguedad: 378\n            },\n        ]\n    },\n    methods: {\n        agregarTarea() {\n            // this, hace referencia a la instancia Vue\n            this.tareas.unshift({\n                titulo: this.nuevaTarea,\n                prioridad: false,\n                antiguedad: 0,\n            });\n            this.nuevaTarea = null;\n        },\n    },\n    computed: {\n        tareasConPrioridad() {\n            return this.tareas.filter((tarea) => tarea.prioridad);\n        },\n        mensajeAlReves() {\n            return this.mensaje.split('').reverse().join('');\n        },\n        tareasPorAntiguedad() {\n            return this.tareas.sort((a, b) => b.antiguedad - a.antiguedad);\n        }\n    }\n});"
  },
  {
    "path": "60-vue-router-lazy-load/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "60-vue-router-lazy-load/README.md",
    "content": "# 59-vue-router-srcoll\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "60-vue-router-lazy-load/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>60-vue-router-lazy-load</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "60-vue-router-lazy-load/package.json",
    "content": "{\n  \"name\": \"59-vue-router-srcoll\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\",\n    \"vue-router\": \"^2.5.2\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "60-vue-router-lazy-load/src/App.vue",
    "content": "<template>\n    <section>\n        <router-link to=\"/\">Info</router-link>\n        <router-link :to=\"{path: '/bio', hash: '#parrafo'}\">Bio</router-link>\n        <hr>\n        <router-view></router-view>\n    </section>\n</template>"
  },
  {
    "path": "60-vue-router-lazy-load/src/components/Bio.vue",
    "content": "<template>\n    <article>\n        <h1>Loren ipsum</h1>\n        <p>\n            Lorem ipsum dolor sit amet, consectetur adipisicing elit. A ab amet aperiam dicta earum, eligendi est et itaque modi nesciunt nihil omnis possimus provident quaerat quasi quis repudiandae velit voluptatem.</p>\n        <p>\n            Accusamus aperiam dolores ea, earum esse, eum facere inventore iste itaque magni nihil nobis praesentium reiciendis repudiandae soluta unde veniam vero. Deleniti maiores minus neque voluptate! Inventore, iure voluptatibus. Quo?</p>\n        <p id=\"parrafo\">\n            Ab assumenda autem cumque dolor, impedit in ipsum itaque magni quisquam vero? Architecto fugit illo impedit nam nobis nostrum obcaecati sint tenetur vel, voluptates. Delectus id inventore sequi sint voluptatem.</p>\n        <p>\n            Distinctio dolores eius enim eveniet expedita facilis inventore magnam qui soluta vitae? Assumenda consequatur, eaque ex ipsum optio possimus provident quaerat! Incidunt iste repellendus suscipit. Asperiores iste perferendis sint velit.</p>\n        <p>\n            Adipisci, dolorum ea est illo itaque quas quidem rem rerum velit! Consectetur dicta dignissimos eaque harum itaque magnam perspiciatis, quaerat voluptatibus. Dolorum ducimus harum illum neque officia optio pariatur vel.</p>\n        <p>\n            A iusto, nihil nisi quaerat quidem quo quod reprehenderit suscipit! Amet asperiores, consequatur debitis, deleniti eligendi expedita maiores, natus nisi nulla provident recusandae sint tempore temporibus! Hic maxime neque reprehenderit.</p>\n        <p>\n            Cum ea enim facilis fugiat iure nisi pariatur reprehenderit ut. Ab amet asperiores beatae, eaque illo libero nemo nobis obcaecati officia officiis perspiciatis praesentium quaerat quasi quisquam repudiandae vitae, voluptate!</p>\n        <p>\n            Accusamus, animi aperiam aspernatur assumenda corporis cumque delectus deleniti distinctio dolores ducimus, ea eaque eligendi error explicabo iusto labore laborum magni nobis nostrum quasi quis reprehenderit similique sint temporibus vel!</p>\n        <p>\n            Amet autem cumque dolores in ipsum iure iusto non quas, qui quisquam reprehenderit similique sit. Ad aliquid architecto, blanditiis delectus dicta dignissimos enim ex explicabo fugiat, incidunt laudantium, officia suscipit.</p>\n        <p>\n            Aliquid at atque autem consectetur corporis delectus dolore enim est eum facere fugiat illo in ipsam iusto labore maiores natus nisi non, nostrum odit pariatur porro qui rem veritatis vitae!</p>\n    </article>\n</template>\n\n<style>\n    article {\n        width: 1000px;\n    }\n    p {\n        width: 400px;\n    }\n    #parrafo {\n        color: red;\n        font-weight:bold;\n    }\n</style>"
  },
  {
    "path": "60-vue-router-lazy-load/src/components/Info.vue",
    "content": "<template>\n    <div id=\"app\">\n        <img src=\"../assets/logo.png\">\n        <h1></h1>\n        <h2>Essential Links</h2>\n        <ul>\n            <li><a href=\"https://vuejs.org\" target=\"_blank\">Core Docs</a></li>\n            <li><a href=\"https://forum.vuejs.org\" target=\"_blank\">Forum</a></li>\n            <li><a href=\"https://gitter.im/vuejs/vue\" target=\"_blank\">Gitter Chat</a></li>\n            <li><a href=\"https://twitter.com/vuejs\" target=\"_blank\">Twitter</a></li>\n        </ul>\n        <h2>Ecosystem</h2>\n        <ul>\n            <li><a href=\"http://router.vuejs.org/\" target=\"_blank\">vue-router</a></li>\n            <li><a href=\"http://vuex.vuejs.org/\" target=\"_blank\">vuex</a></li>\n            <li><a href=\"http://vue-loader.vuejs.org/\" target=\"_blank\">vue-loader</a></li>\n            <li><a href=\"https://github.com/vuejs/awesome-vue\" target=\"_blank\">awesome-vue</a></li>\n        </ul>\n    </div>\n\n</template>\n\n<script>\n    export default {\n        name: 'app',\n        data () {\n            return {\n                msg: 'Welcome to Your Vue.js App'\n            }\n        }\n    }\n</script>\n\n<style>\n    #app {\n        font-family: 'Avenir', Helvetica, Arial, sans-serif;\n        -webkit-font-smoothing: antialiased;\n        -moz-osx-font-smoothing: grayscale;\n        text-align: center;\n        color: #2c3e50;\n        margin-top: 60px;\n    }\n\n    h1, h2 {\n        font-weight: normal;\n    }\n\n    ul {\n        list-style-type: none;\n        padding: 0;\n    }\n\n    li {\n        display: inline-block;\n        margin: 0 10px;\n    }\n\n    a {\n        color: #42b983;\n    }\n</style>\n"
  },
  {
    "path": "60-vue-router-lazy-load/src/main.js",
    "content": "import Vue from 'vue';\nimport App from './App.vue';\nimport Info from './components/Info.vue';\n//import Bio from './components/Bio.vue';\n\nconst Bio = resolve => {\n  require.ensure(['./components/Bio.vue'], () => {\n     resolve(require('./components/Bio.vue'));\n  });\n};\n\n/* Router */\nimport VueRouter from 'vue-router';\n\nVue.use(VueRouter);\n\nconst routes = [\n    {path: '/', component: Info},\n    {path: '/bio', component: Bio},\n];\n\nconst router = new VueRouter({\n    routes,\n    mode: 'history',\n    scrollBehavior(to, from, savedPosition) {\n        const position = {};\n        console.log(to);\n        if (to.hash) {\n            position.selector = to.hash;\n        } else {\n            position.x = 200;\n            position.y = 100;\n        }\n        return position;\n    }\n});\n\nnew Vue({\n    el: '#app',\n    router,\n    render: h => h(App)\n});"
  },
  {
    "path": "60-vue-router-lazy-load/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "61-vue-directive-hooks/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue Custom Directives</title>\n</head>\n<body>\n<div id=\"app\">\n    <h1 v-fijar>Hola desde el curso de Vue & Firebase</h1>\n    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquid consectetur consequuntur cumque dolorum earum\n        inventore ipsa laboriosam maxime nesciunt non quaerat, quas quia ratione veniam voluptatem. Magnam nostrum\n        repellat veritatis!</p>\n    <p>Ab animi commodi consequatur culpa deserunt eos, facilis ipsum itaque neque nisi, officia officiis pariatur\n        praesentium quis quos recusandae unde, vero voluptas. Adipisci enim fuga quod sed. Nesciunt, pariatur ullam!</p>\n    <p>Animi, et fuga id iste laudantium officia quae recusandae. Amet dolor dolore, dolorem eius eos fugit inventore\n        ipsa, laboriosam magnam, nam omnis quo reprehenderit sint tempore tenetur? Incidunt, iure sunt?</p>\n    <p>Aspernatur beatae dignissimos dolore dolores dolorum eveniet explicabo fugiat ipsa minus praesentium quibusdam\n        quis, reprehenderit sed, suscipit tempore ullam unde vero. Atque facere, iste. Assumenda earum ex incidunt\n        laudantium obcaecati?</p>\n    <p>A adipisci atque beatae distinctio dolor dolorem facilis harum, libero magni nemo odit possimus reiciendis\n        repudiandae soluta ut vel voluptatum. Amet delectus dolorum nemo obcaecati pariatur praesentium, tempore\n        voluptatem. Repudiandae?</p>\n    <p>Non odio tenetur ut. Ad beatae blanditiis, consequuntur corporis debitis dignissimos dolorum ea ex in inventore\n        ipsa iste iure laborum modi nam natus nostrum perferendis, quis, reiciendis repellendus ullam veniam!</p>\n    <p>Aspernatur, assumenda culpa cumque dolorem exercitationem fugiat iste molestiae neque nesciunt nisi placeat\n        repellendus, sequi vel velit voluptates? Dolor ea eos error esse eum impedit labore ratione, ullam unde\n        veniam!</p>\n    <p>Architecto at beatae consequatur debitis deserunt dolore explicabo illo, impedit ipsam iusto libero magni, nemo,\n        nesciunt nisi nulla odio quasi qui quo ratione tempora temporibus voluptates voluptatibus. Est, natus\n        similique!</p>\n    <p>A accusantium dolorem facilis illo in non perferendis quam totam unde voluptatibus. A asperiores dolore minus quo\n        vel, vero? Dolor dolorum inventore magni minus neque nesciunt nobis velit veritatis voluptas.</p>\n    <p>Numquam, qui, quo. Ipsam magni saepe velit? A libero nam quae quam! At aut dolore doloribus illum necessitatibus\n        nobis similique sint, velit. Fugiat natus nobis optio, quaerat quisquam ratione temporibus!</p>\n    <p>Aspernatur, dolores error esse nihil omnis rem veniam. Consequuntur, deleniti distinctio dolore dolorem et\n        laboriosam maxime nemo neque nobis officiis quidem reiciendis rem suscipit, tempora, vel. Cupiditate eum fugiat\n        laudantium!</p>\n    <p>Aliquam amet deleniti dicta dolor dolore dolorum ducimus eligendi error est eveniet excepturi impedit ipsam iste\n        itaque natus nobis nostrum omnis, repellat rerum saepe sunt suscipit veniam veritatis! Exercitationem,\n        quidem?</p>\n    <p>Aliquam consequuntur culpa cupiditate deleniti ea eos excepturi illum, itaque maxime natus nihil non pariatur\n        possimus quam, quibusdam quidem, sapiente tempora temporibus totam ut! Commodi harum illo praesentium reiciendis\n        repellat!</p>\n    <p>Dicta dolore esse et fugit id laboriosam necessitatibus, officiis quaerat quasi ratione reiciendis tempora\n        tempore voluptas. Facilis fugiat, quis. Esse iste maiores optio voluptas voluptatum? Aperiam deleniti quae\n        repellendus tenetur.</p>\n    <p>Ab ad assumenda consectetur consequuntur esse eum ex excepturi expedita explicabo hic maiores, obcaecati odio,\n        quasi quia quod, recusandae repellendus reprehenderit saepe similique temporibus velit vitae voluptas\n        voluptates! Consequatur, sit?</p>\n    <p>Cum debitis delectus doloremque labore laudantium natus nihil omnis quidem. Aliquid architecto aut, corporis\n        fugiat iure nobis quia repellendus sapiente soluta unde! Deserunt ducimus expedita impedit ipsam quisquam sed\n        veritatis!</p>\n    <p>Alias dolorem earum error expedita impedit ipsam iste, itaque magnam, minus molestiae officia quas qui quisquam\n        rerum sapiente sunt tempora tempore temporibus ullam voluptate! Accusamus aut fuga ipsam non sunt.</p>\n    <p>Consectetur exercitationem illo inventore iste nulla optio pariatur quae quasi recusandae tenetur? Atque cum\n        cupiditate earum iusto nulla obcaecati odio omnis praesentium, quidem, quis quo quod repellat tempore,\n        temporibus voluptate?</p>\n    <p>Amet at deleniti, distinctio dolor esse excepturi hic ipsum iusto nihil, officiis placeat provident quidem\n        repellat rerum saepe sequi soluta ullam voluptates? In nihil omnis quos rerum suscipit totam voluptate.</p>\n    <p>Accusantium amet aperiam debitis dolorem, eius eligendi error esse est excepturi exercitationem expedita facere\n        iure mollitia nisi possimus provident quibusdam quidem quis quod reiciendis sed suscipit tempore temporibus\n        totam vitae?</p>\n    <p>Accusamus animi aut cum cupiditate debitis, delectus earum exercitationem explicabo facere id illum, molestiae\n        nostrum numquam obcaecati odit officia optio porro qui quod ratione repellat, similique suscipit unde vel\n        vero.</p>\n    <p>Amet aperiam architecto asperiores aspernatur beatae commodi dolore, eligendi, et eum fuga harum illum iusto\n        neque nisi nulla obcaecati odio omnis perferendis perspiciatis reiciendis soluta totam velit. Dolor, fuga,\n        modi?</p>\n    <p>Asperiores aspernatur, at commodi cum dolore dolorem error expedita facilis fugiat inventore ipsam, mollitia nam\n        nisi non nulla possimus quis quod ratione repudiandae rerum saepe, similique tempora ut veritatis\n        voluptatibus.</p>\n    <p>Amet consequatur enim, esse eum facilis incidunt numquam porro quidem saepe, soluta sunt temporibus voluptates?\n        Amet aspernatur enim fuga minus mollitia odio perferendis quis quod sequi suscipit tempora totam, voluptas?</p>\n    <p>Itaque magni modi sint? Deleniti esse et facere hic iure iusto laborum magni nesciunt, nisi odit, provident quasi\n        sunt velit! Aliquid cumque debitis eos eveniet illum in placeat porro. Ea.</p>\n    <p>Ab amet atque aut, cupiditate eaque facere id ipsum iste magnam molestiae omnis quam quas quasi qui quos ratione\n        repellat repellendus sequi similique, sunt tenetur unde vel voluptatem! Quis, reiciendis.</p>\n    <p>A distinctio odit quisquam! Accusamus, accusantium aperiam atque aut cupiditate ex maxime non provident quibusdam\n        voluptatibus? Aliquid amet cupiditate ea error facere iste maiores maxime, nemo quisquam saepe similique ut.</p>\n    <p>Ab atque, enim magnam nihil obcaecati officia rem soluta. Adipisci alias cumque dolor, ea fugit illo, ipsum modi\n        mollitia natus officia provident quae quod reiciendis saepe sint vero voluptatibus. Iure!</p>\n    <p>Ab consequuntur laudantium maiores quasi quo, reprehenderit tempore? Accusamus assumenda ducimus ex expedita\n        ipsum necessitatibus, nihil, non nostrum quas recusandae repudiandae, temporibus vel! Inventore molestias, porro\n        praesentium quas unde voluptatibus.</p>\n    <p>Accusamus ad dolor, dolorem enim, facere hic non, quae ratione recusandae soluta tempora veritatis! Alias\n        assumenda deleniti enim fuga illo incidunt, laboriosam laudantium libero magnam modi nobis totam vero\n        voluptates.</p>\n    <p>Illo iusto nam nemo quisquam, quos sed temporibus? Ad adipisci assumenda blanditiis debitis, dicta, dolor,\n        dolores illo natus necessitatibus nihil praesentium quos suscipit! Cumque dolore eveniet, ex magni neque\n        obcaecati!</p>\n    <p>Cum laborum minus molestias obcaecati quae. Amet aspernatur error ipsum iure, minus nostrum odit totam vitae.\n        Aliquam aperiam, beatae cum est eveniet fugit incidunt inventore magni nemo quia, quo repellat.</p>\n    <p>Ad commodi dolore earum et molestias nisi quam sint voluptatibus. Id illum obcaecati quia quo voluptates. Alias\n        animi aperiam aut commodi delectus, earum eos neque odio, pariatur perspiciatis rem, tenetur?</p>\n    <p>Accusantium amet asperiores delectus dolorem error expedita impedit itaque laboriosam magni maiores natus\n        necessitatibus non, officia officiis provident quas quos reiciendis repellat sapiente, sed similique tempore\n        velit veniam veritatis voluptate.</p>\n    <p>Accusantium amet deserunt itaque molestiae sunt voluptates. Animi aut, consectetur deserunt ducimus ipsam natus\n        sunt. Consequuntur, cupiditate dicta eaque, esse inventore modi nam numquam odio quis sapiente sit totam\n        voluptas.</p>\n    <p>Ab fugit nostrum perspiciatis sunt! Accusantium assumenda dicta dolorem, et ex, expedita facilis fugit id itaque\n        laboriosam maxime nisi numquam obcaecati optio placeat possimus quaerat unde voluptatem. Amet, id mollitia.</p>\n    <p>Laboriosam, odit quod! Ab animi blanditiis culpa cumque distinctio dolorem earum harum illo in, maxime modi\n        molestiae nemo numquam odit rem saepe sapiente soluta unde, voluptatem voluptatibus! Accusamus nam, rerum?</p>\n    <p>Architecto blanditiis deleniti ducimus facilis illo modi officiis quaerat repellat vel, voluptatum. Alias,\n        aliquam amet cum cumque expedita odit quasi quis quod reprehenderit saepe sunt suscipit tempore ullam voluptates\n        voluptatibus?</p>\n    <p>Aliquam harum illo ipsum obcaecati praesentium quod tempora veniam. Adipisci aperiam cumque harum nemo rerum\n        tempora voluptate. Id mollitia nihil nisi veniam vitae? Dicta id nisi qui quia recusandae repellat.</p>\n    <p>Beatae dolorum explicabo impedit libero, magni minus necessitatibus quidem recusandae tempore? Atque, delectus\n        dolorem ea ex expedita harum ipsum itaque maxime nihil omnis perferendis quae, qui quisquam saepe temporibus\n        unde!</p>\n</div>\n<script src=\"https://unpkg.com/vue\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "61-vue-directive-hooks/js/main.js",
    "content": "Vue.directive('fijar', {\n    bind(el, binding) {\n        console.log(el,binding);\n        el.style.position = 'fixed';\n\n        if (binding.expression) {\n            el.style.top = binding.expression + 'px';\n        }\n\n        if (binding.arg) {\n            let color = 'goldenrod';\n            let modificadores = Object.keys(binding.modifiers);\n            if (modificadores.length > 0) {\n                color = modificadores[0];\n            }\n            el.style.backgroundColor = color;\n        }\n    }\n});\n\nnew Vue({\n   el: '#app',\n});"
  },
  {
    "path": "62-vue-directive-object-literals/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue Custom Directives</title>\n</head>\n<body>\n<div id=\"app\">\n    <h1 v-fijar=\"{ top: '100px', background: 'goldenrod'}\">Hola desde el curso de Vue & Firebase</h1>\n    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquid consectetur consequuntur cumque dolorum earum\n        inventore ipsa laboriosam maxime nesciunt non quaerat, quas quia ratione veniam voluptatem. Magnam nostrum\n        repellat veritatis!</p>\n    <p>Ab animi commodi consequatur culpa deserunt eos, facilis ipsum itaque neque nisi, officia officiis pariatur\n        praesentium quis quos recusandae unde, vero voluptas. Adipisci enim fuga quod sed. Nesciunt, pariatur ullam!</p>\n    <p>Animi, et fuga id iste laudantium officia quae recusandae. Amet dolor dolore, dolorem eius eos fugit inventore\n        ipsa, laboriosam magnam, nam omnis quo reprehenderit sint tempore tenetur? Incidunt, iure sunt?</p>\n    <p>Aspernatur beatae dignissimos dolore dolores dolorum eveniet explicabo fugiat ipsa minus praesentium quibusdam\n        quis, reprehenderit sed, suscipit tempore ullam unde vero. Atque facere, iste. Assumenda earum ex incidunt\n        laudantium obcaecati?</p>\n    <p>A adipisci atque beatae distinctio dolor dolorem facilis harum, libero magni nemo odit possimus reiciendis\n        repudiandae soluta ut vel voluptatum. Amet delectus dolorum nemo obcaecati pariatur praesentium, tempore\n        voluptatem. Repudiandae?</p>\n    <p>Non odio tenetur ut. Ad beatae blanditiis, consequuntur corporis debitis dignissimos dolorum ea ex in inventore\n        ipsa iste iure laborum modi nam natus nostrum perferendis, quis, reiciendis repellendus ullam veniam!</p>\n    <p>Aspernatur, assumenda culpa cumque dolorem exercitationem fugiat iste molestiae neque nesciunt nisi placeat\n        repellendus, sequi vel velit voluptates? Dolor ea eos error esse eum impedit labore ratione, ullam unde\n        veniam!</p>\n    <p>Architecto at beatae consequatur debitis deserunt dolore explicabo illo, impedit ipsam iusto libero magni, nemo,\n        nesciunt nisi nulla odio quasi qui quo ratione tempora temporibus voluptates voluptatibus. Est, natus\n        similique!</p>\n    <p>A accusantium dolorem facilis illo in non perferendis quam totam unde voluptatibus. A asperiores dolore minus quo\n        vel, vero? Dolor dolorum inventore magni minus neque nesciunt nobis velit veritatis voluptas.</p>\n    <p>Numquam, qui, quo. Ipsam magni saepe velit? A libero nam quae quam! At aut dolore doloribus illum necessitatibus\n        nobis similique sint, velit. Fugiat natus nobis optio, quaerat quisquam ratione temporibus!</p>\n    <p>Aspernatur, dolores error esse nihil omnis rem veniam. Consequuntur, deleniti distinctio dolore dolorem et\n        laboriosam maxime nemo neque nobis officiis quidem reiciendis rem suscipit, tempora, vel. Cupiditate eum fugiat\n        laudantium!</p>\n    <p>Aliquam amet deleniti dicta dolor dolore dolorum ducimus eligendi error est eveniet excepturi impedit ipsam iste\n        itaque natus nobis nostrum omnis, repellat rerum saepe sunt suscipit veniam veritatis! Exercitationem,\n        quidem?</p>\n    <p>Aliquam consequuntur culpa cupiditate deleniti ea eos excepturi illum, itaque maxime natus nihil non pariatur\n        possimus quam, quibusdam quidem, sapiente tempora temporibus totam ut! Commodi harum illo praesentium reiciendis\n        repellat!</p>\n    <p>Dicta dolore esse et fugit id laboriosam necessitatibus, officiis quaerat quasi ratione reiciendis tempora\n        tempore voluptas. Facilis fugiat, quis. Esse iste maiores optio voluptas voluptatum? Aperiam deleniti quae\n        repellendus tenetur.</p>\n    <p>Ab ad assumenda consectetur consequuntur esse eum ex excepturi expedita explicabo hic maiores, obcaecati odio,\n        quasi quia quod, recusandae repellendus reprehenderit saepe similique temporibus velit vitae voluptas\n        voluptates! Consequatur, sit?</p>\n    <p>Cum debitis delectus doloremque labore laudantium natus nihil omnis quidem. Aliquid architecto aut, corporis\n        fugiat iure nobis quia repellendus sapiente soluta unde! Deserunt ducimus expedita impedit ipsam quisquam sed\n        veritatis!</p>\n    <p>Alias dolorem earum error expedita impedit ipsam iste, itaque magnam, minus molestiae officia quas qui quisquam\n        rerum sapiente sunt tempora tempore temporibus ullam voluptate! Accusamus aut fuga ipsam non sunt.</p>\n    <p>Consectetur exercitationem illo inventore iste nulla optio pariatur quae quasi recusandae tenetur? Atque cum\n        cupiditate earum iusto nulla obcaecati odio omnis praesentium, quidem, quis quo quod repellat tempore,\n        temporibus voluptate?</p>\n    <p>Amet at deleniti, distinctio dolor esse excepturi hic ipsum iusto nihil, officiis placeat provident quidem\n        repellat rerum saepe sequi soluta ullam voluptates? In nihil omnis quos rerum suscipit totam voluptate.</p>\n    <p>Accusantium amet aperiam debitis dolorem, eius eligendi error esse est excepturi exercitationem expedita facere\n        iure mollitia nisi possimus provident quibusdam quidem quis quod reiciendis sed suscipit tempore temporibus\n        totam vitae?</p>\n    <p>Accusamus animi aut cum cupiditate debitis, delectus earum exercitationem explicabo facere id illum, molestiae\n        nostrum numquam obcaecati odit officia optio porro qui quod ratione repellat, similique suscipit unde vel\n        vero.</p>\n    <p>Amet aperiam architecto asperiores aspernatur beatae commodi dolore, eligendi, et eum fuga harum illum iusto\n        neque nisi nulla obcaecati odio omnis perferendis perspiciatis reiciendis soluta totam velit. Dolor, fuga,\n        modi?</p>\n    <p>Asperiores aspernatur, at commodi cum dolore dolorem error expedita facilis fugiat inventore ipsam, mollitia nam\n        nisi non nulla possimus quis quod ratione repudiandae rerum saepe, similique tempora ut veritatis\n        voluptatibus.</p>\n    <p>Amet consequatur enim, esse eum facilis incidunt numquam porro quidem saepe, soluta sunt temporibus voluptates?\n        Amet aspernatur enim fuga minus mollitia odio perferendis quis quod sequi suscipit tempora totam, voluptas?</p>\n    <p>Itaque magni modi sint? Deleniti esse et facere hic iure iusto laborum magni nesciunt, nisi odit, provident quasi\n        sunt velit! Aliquid cumque debitis eos eveniet illum in placeat porro. Ea.</p>\n    <p>Ab amet atque aut, cupiditate eaque facere id ipsum iste magnam molestiae omnis quam quas quasi qui quos ratione\n        repellat repellendus sequi similique, sunt tenetur unde vel voluptatem! Quis, reiciendis.</p>\n    <p>A distinctio odit quisquam! Accusamus, accusantium aperiam atque aut cupiditate ex maxime non provident quibusdam\n        voluptatibus? Aliquid amet cupiditate ea error facere iste maiores maxime, nemo quisquam saepe similique ut.</p>\n    <p>Ab atque, enim magnam nihil obcaecati officia rem soluta. Adipisci alias cumque dolor, ea fugit illo, ipsum modi\n        mollitia natus officia provident quae quod reiciendis saepe sint vero voluptatibus. Iure!</p>\n    <p>Ab consequuntur laudantium maiores quasi quo, reprehenderit tempore? Accusamus assumenda ducimus ex expedita\n        ipsum necessitatibus, nihil, non nostrum quas recusandae repudiandae, temporibus vel! Inventore molestias, porro\n        praesentium quas unde voluptatibus.</p>\n    <p>Accusamus ad dolor, dolorem enim, facere hic non, quae ratione recusandae soluta tempora veritatis! Alias\n        assumenda deleniti enim fuga illo incidunt, laboriosam laudantium libero magnam modi nobis totam vero\n        voluptates.</p>\n    <p>Illo iusto nam nemo quisquam, quos sed temporibus? Ad adipisci assumenda blanditiis debitis, dicta, dolor,\n        dolores illo natus necessitatibus nihil praesentium quos suscipit! Cumque dolore eveniet, ex magni neque\n        obcaecati!</p>\n    <p>Cum laborum minus molestias obcaecati quae. Amet aspernatur error ipsum iure, minus nostrum odit totam vitae.\n        Aliquam aperiam, beatae cum est eveniet fugit incidunt inventore magni nemo quia, quo repellat.</p>\n    <p>Ad commodi dolore earum et molestias nisi quam sint voluptatibus. Id illum obcaecati quia quo voluptates. Alias\n        animi aperiam aut commodi delectus, earum eos neque odio, pariatur perspiciatis rem, tenetur?</p>\n    <p>Accusantium amet asperiores delectus dolorem error expedita impedit itaque laboriosam magni maiores natus\n        necessitatibus non, officia officiis provident quas quos reiciendis repellat sapiente, sed similique tempore\n        velit veniam veritatis voluptate.</p>\n    <p>Accusantium amet deserunt itaque molestiae sunt voluptates. Animi aut, consectetur deserunt ducimus ipsam natus\n        sunt. Consequuntur, cupiditate dicta eaque, esse inventore modi nam numquam odio quis sapiente sit totam\n        voluptas.</p>\n    <p>Ab fugit nostrum perspiciatis sunt! Accusantium assumenda dicta dolorem, et ex, expedita facilis fugit id itaque\n        laboriosam maxime nisi numquam obcaecati optio placeat possimus quaerat unde voluptatem. Amet, id mollitia.</p>\n    <p>Laboriosam, odit quod! Ab animi blanditiis culpa cumque distinctio dolorem earum harum illo in, maxime modi\n        molestiae nemo numquam odit rem saepe sapiente soluta unde, voluptatem voluptatibus! Accusamus nam, rerum?</p>\n    <p>Architecto blanditiis deleniti ducimus facilis illo modi officiis quaerat repellat vel, voluptatum. Alias,\n        aliquam amet cum cumque expedita odit quasi quis quod reprehenderit saepe sunt suscipit tempore ullam voluptates\n        voluptatibus?</p>\n    <p>Aliquam harum illo ipsum obcaecati praesentium quod tempora veniam. Adipisci aperiam cumque harum nemo rerum\n        tempora voluptate. Id mollitia nihil nisi veniam vitae? Dicta id nisi qui quia recusandae repellat.</p>\n    <p>Beatae dolorum explicabo impedit libero, magni minus necessitatibus quidem recusandae tempore? Atque, delectus\n        dolorem ea ex expedita harum ipsum itaque maxime nihil omnis perferendis quae, qui quisquam saepe temporibus\n        unde!</p>\n</div>\n<script src=\"https://unpkg.com/vue\"></script>\n<script src=\"js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "62-vue-directive-object-literals/js/main.js",
    "content": "Vue.directive('fijar', {\n    bind(el, binding) {\n        console.log(binding.value);\n/*        el.style.position = 'fixed';\n\n        if (binding.expression) {\n            el.style.top = binding.expression + 'px';\n        }\n\n        if (binding.arg) {\n            let color = 'goldenrod';\n            let modificadores = Object.keys(binding.modifiers);\n            if (modificadores.length > 0) {\n                color = modificadores[0];\n            }\n            el.style.backgroundColor = color;\n        }*/\n    }\n});\n\nnew Vue({\n   el: '#app',\n});"
  },
  {
    "path": "64-mixins-intro/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "64-mixins-intro/README.md",
    "content": "# 63-mixins-intro\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "64-mixins-intro/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>63-mixins-intro</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "64-mixins-intro/package.json",
    "content": "{\n  \"name\": \"63-mixins-intro\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "64-mixins-intro/src/App.vue",
    "content": "<template>\n    <div id=\"app\">\n        <h1>Aprender en 2017-2018</h1>\n        <form @submit.prevent=\"agregarTecnologia\">\n            <input v-model=\"nuevaTecnologia\"\n                   type=\"text\" placeholder=\"Tecnología a aprender\">\n        </form>\n        <ul>\n            <li v-for=\"tecnologia in aprender\">\n                {{ tecnologia.nombre }}\n            </li>\n        </ul>\n    </div>\n</template>\n\n<script>\n    import {mixin} from './mixins';\n    export default {\n        mixins: [mixin],\n    }\n</script>\n\n<style>\n    #app {\n        font-family: 'Avenir', Helvetica, Arial, sans-serif;\n        -webkit-font-smoothing: antialiased;\n        -moz-osx-font-smoothing: grayscale;\n        text-align: center;\n        color: #2c3e50;\n        margin-top: 60px;\n    }\n\n    h1, h2 {\n        font-weight: normal;\n    }\n\n    ul {\n        list-style-type: none;\n        padding: 0;\n    }\n\n    li {\n        display: block;\n        margin: 0 10px;\n    }\n\n    a {\n        color: #42b983;\n    }\n</style>\n"
  },
  {
    "path": "64-mixins-intro/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n  el: '#app',\n  render: h => h(App)\n})\n"
  },
  {
    "path": "64-mixins-intro/src/mixins.js",
    "content": "export const mixin = {\n    data () {\n        return {\n            aprender: [\n                {nombre: 'Ionic 7'},\n                {nombre: 'Node'},\n                {nombre: 'MongoDB'},\n                {nombre: 'Angular 3'},\n                {nombre: 'Laravel'},\n            ],\n            nuevaTecnologia: null,\n        }\n    },\n    methods: {\n        agregarTecnologia() {\n            this.aprender.unshift({\n                nombre: this.nuevaTecnologia,\n            });\n            this.nuevaTecnologia = null;\n        }\n    }\n};"
  },
  {
    "path": "64-mixins-intro/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "65-mixins-merge/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "65-mixins-merge/README.md",
    "content": "# 63-mixins-intro\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "65-mixins-merge/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>65-mixins-merge</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "65-mixins-merge/package.json",
    "content": "{\n  \"name\": \"63-mixins-intro\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "65-mixins-merge/src/App.vue",
    "content": "<template>\n    <div id=\"app\">\n        <h1>Aprender en 2017-2018</h1>\n        <form @submit.prevent=\"agregarTecnologia\">\n            <input v-model=\"nuevaTecnologia\"\n                   type=\"text\" placeholder=\"Tecnología a aprender\">\n        </form>\n        <ul>\n            <li v-for=\"tecnologia in aprender\">\n                {{ tecnologia.nombre }}\n            </li>\n        </ul>\n    </div>\n</template>\n\n<script>\n    import {mixin} from './mixins';\n    export default {\n        created() {\n            console.log('Created desde el componente');\n            this.saludar();\n        },\n        mixins: [mixin],\n        methods: {\n            saludar() {\n                alert('Hola desde el component');\n            }\n        }\n    }\n</script>\n\n<style>\n    #app {\n        font-family: 'Avenir', Helvetica, Arial, sans-serif;\n        -webkit-font-smoothing: antialiased;\n        -moz-osx-font-smoothing: grayscale;\n        text-align: center;\n        color: #2c3e50;\n        margin-top: 60px;\n    }\n\n    h1, h2 {\n        font-weight: normal;\n    }\n\n    ul {\n        list-style-type: none;\n        padding: 0;\n    }\n\n    li {\n        display: block;\n        margin: 0 10px;\n    }\n\n    a {\n        color: #42b983;\n    }\n</style>\n"
  },
  {
    "path": "65-mixins-merge/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n  el: '#app',\n  render: h => h(App)\n})\n"
  },
  {
    "path": "65-mixins-merge/src/mixins.js",
    "content": "export const mixin = {\n    created() {\n        console.log('Created desde el mixin');\n        this.saludar();\n    },\n    data () {\n        return {\n            aprender: [\n                {nombre: 'Ionic 7'},\n                {nombre: 'Node'},\n                {nombre: 'MongoDB'},\n                {nombre: 'Angular 3'},\n                {nombre: 'Laravel'},\n            ],\n            nuevaTecnologia: null,\n        }\n    },\n    methods: {\n        agregarTecnologia() {\n            this.aprender.unshift({\n                nombre: this.nuevaTecnologia,\n            });\n            this.nuevaTecnologia = null;\n        },\n        saludar() {\n            alert('Hola desde el mixin');\n        }\n    }\n};"
  },
  {
    "path": "65-mixins-merge/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "66-global-mixins/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": { \"modules\": false }\n    }]\n  ]\n}\n"
  },
  {
    "path": "66-global-mixins/README.md",
    "content": "# 63-mixins-intro\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "66-global-mixins/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>66-global-mixins</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script src=\"/dist/build.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "66-global-mixins/package.json",
    "content": "{\n  \"name\": \"63-mixins-intro\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.2.1\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-latest\": \"^6.0.0\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^11.1.4\",\n    \"vue-template-compiler\": \"^2.2.1\",\n    \"webpack\": \"^2.2.0\",\n    \"webpack-dev-server\": \"^2.2.0\"\n  }\n}\n"
  },
  {
    "path": "66-global-mixins/src/App.vue",
    "content": "<template>\n    <div id=\"app\">\n        <h1>Aprender en 2017-2018</h1>\n        <form @submit.prevent=\"agregarTecnologia\">\n            <input v-model=\"nuevaTecnologia\"\n                   type=\"text\" placeholder=\"Tecnología a aprender\">\n        </form>\n        <ul>\n            <li v-for=\"tecnologia in aprender\">\n                {{ tecnologia.nombre }}\n            </li>\n        </ul>\n    </div>\n</template>\n\n<script>\n    import {mixin} from './mixins';\n    export default {\n        created() {\n            console.log('Created desde el componente');\n        },\n        mixins: [mixin],\n        nombre: 'App.vue',\n    }\n</script>\n\n<style>\n    #app {\n        font-family: 'Avenir', Helvetica, Arial, sans-serif;\n        -webkit-font-smoothing: antialiased;\n        -moz-osx-font-smoothing: grayscale;\n        text-align: center;\n        color: #2c3e50;\n        margin-top: 60px;\n    }\n\n    h1, h2 {\n        font-weight: normal;\n    }\n\n    ul {\n        list-style-type: none;\n        padding: 0;\n    }\n\n    li {\n        display: block;\n        margin: 0 10px;\n    }\n\n    a {\n        color: #42b983;\n    }\n</style>\n"
  },
  {
    "path": "66-global-mixins/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n    el: '#app',\n    render: h => h(App),\n    nombre: 'Instancia principal',\n});\n"
  },
  {
    "path": "66-global-mixins/src/mixins.js",
    "content": "// Global mixin\nimport Vue from 'vue';\nVue.mixin({\n    created() {\n        //console.info('Hola desde mixin global');\n        this.saludar(this.$options.nombre)\n    },\n    methods: {\n        saludar(nombre) {\n            alert(`Hola desde ${nombre}!`);\n        }\n    }\n});\n\n// Local mixin\nexport const mixin = {\n    created() {\n        console.log('Created desde el mixin');\n    },\n    data () {\n        return {\n            aprender: [\n                {nombre: 'Ionic 7'},\n                {nombre: 'Node'},\n                {nombre: 'MongoDB'},\n                {nombre: 'Angular 3'},\n                {nombre: 'Laravel'},\n            ],\n            nuevaTecnologia: null,\n        }\n    },\n    methods: {\n        agregarTecnologia() {\n            this.aprender.unshift({\n                nombre: this.nuevaTecnologia,\n            });\n            this.nuevaTecnologia = null;\n        },\n    }\n};"
  },
  {
    "path": "66-global-mixins/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "67-vue-filters/.babelrc",
    "content": "{\n  \"presets\": [\n    [\"env\", { \"modules\": false }]\n  ]\n}\n"
  },
  {
    "path": "67-vue-filters/README.md",
    "content": "# 67-vue-filters\n\n> A Vue.js project\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n\nFor detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).\n"
  },
  {
    "path": "67-vue-filters/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>67-vue-filters</title>\n</head>\n<body>\n    <div id=\"app\"></div>\n    <!-- Este es un buen lugar... -->\n    <script src=\"/dist/build.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "67-vue-filters/package.json",
    "content": "{\n  \"name\": \"67-vue-filters\",\n  \"description\": \"A Vue.js project\",\n  \"version\": \"1.0.0\",\n  \"author\": \"@juanwmedia <juan@wmedia.es>\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_ENV=development webpack-dev-server --open --hot\",\n    \"build\": \"cross-env NODE_ENV=production webpack --progress --hide-modules\"\n  },\n  \"dependencies\": {\n    \"vue\": \"^2.3.3\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.0.0\",\n    \"babel-loader\": \"^6.0.0\",\n    \"babel-preset-env\": \"^1.5.1\",\n    \"cross-env\": \"^3.0.0\",\n    \"css-loader\": \"^0.25.0\",\n    \"file-loader\": \"^0.9.0\",\n    \"vue-loader\": \"^12.1.0\",\n    \"vue-template-compiler\": \"^2.3.3\",\n    \"webpack\": \"^2.6.1\",\n    \"webpack-dev-server\": \"^2.4.5\"\n  }\n}\n"
  },
  {
    "path": "67-vue-filters/src/App.vue",
    "content": "<template>\n    <div id=\"app\">\n        <img src=\"./assets/logo.png\">\n        <h1>{{ msg | invertir | mayusculas }}</h1>\n        <h3>{{ saludo | mayusculas }}</h3>\n        <h2>Essential Links</h2>\n        <ul>\n            <li><a href=\"https://vuejs.org\" target=\"_blank\">Core Docs</a></li>\n            <li><a href=\"https://forum.vuejs.org\" target=\"_blank\">Forum</a></li>\n            <li><a href=\"https://gitter.im/vuejs/vue\" target=\"_blank\">Gitter Chat</a></li>\n            <li><a href=\"https://twitter.com/vuejs\" target=\"_blank\">Twitter</a></li>\n        </ul>\n        <h2>Ecosystem</h2>\n        <ul>\n            <li><a href=\"http://router.vuejs.org/\" target=\"_blank\">vue-router</a></li>\n            <li><a href=\"http://vuex.vuejs.org/\" target=\"_blank\">vuex</a></li>\n            <li><a href=\"http://vue-loader.vuejs.org/\" target=\"_blank\">vue-loader</a></li>\n            <li><a href=\"https://github.com/vuejs/awesome-vue\" target=\"_blank\">awesome-vue</a></li>\n        </ul>\n    </div>\n</template>\n\n<script>\n    export default {\n        name: 'app',\n        data () {\n            return {\n                msg: 'Welcome to Your Vue.js App',\n                saludo: 'Hola desde el Curso de Vue & Firebase'\n            }\n        },\n        filters: {\n            invertir(valor) {\n                return valor.split('').reverse().join('');\n            }\n        }\n    }\n</script>\n\n<style>\n    #app {\n        font-family: 'Avenir', Helvetica, Arial, sans-serif;\n        -webkit-font-smoothing: antialiased;\n        -moz-osx-font-smoothing: grayscale;\n        text-align: center;\n        color: #2c3e50;\n        margin-top: 60px;\n    }\n\n    h1, h2 {\n        font-weight: normal;\n    }\n\n    ul {\n        list-style-type: none;\n        padding: 0;\n    }\n\n    li {\n        display: inline-block;\n        margin: 0 10px;\n    }\n\n    a {\n        color: #42b983;\n    }\n</style>\n"
  },
  {
    "path": "67-vue-filters/src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nVue.filter('mayusculas', function(valor){\n    return valor.toUpperCase();\n});\n\nnew Vue({\n    el: '#app',\n    render: h => h(App)\n});\n"
  },
  {
    "path": "67-vue-filters/webpack.config.js",
    "content": "var path = require('path')\nvar webpack = require('webpack')\n\nmodule.exports = {\n  entry: './src/main.js',\n  output: {\n    path: path.resolve(__dirname, './dist'),\n    publicPath: '/dist/',\n    filename: 'build.js'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.vue$/,\n        loader: 'vue-loader',\n        options: {\n          loaders: {\n          }\n          // other vue-loader options go here\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.(png|jpg|gif|svg)$/,\n        loader: 'file-loader',\n        options: {\n          name: '[name].[ext]?[hash]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    alias: {\n      'vue$': 'vue/dist/vue.esm.js'\n    }\n  },\n  devServer: {\n    historyApiFallback: true,\n    noInfo: true\n  },\n  performance: {\n    hints: false\n  },\n  devtool: '#eval-source-map'\n}\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports.devtool = '#source-map'\n  // http://vue-loader.vuejs.org/en/workflow/production.html\n  module.exports.plugins = (module.exports.plugins || []).concat([\n    new webpack.DefinePlugin({\n      'process.env': {\n        NODE_ENV: '\"production\"'\n      }\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: true,\n      compress: {\n        warnings: false\n      }\n    }),\n    new webpack.LoaderOptionsPlugin({\n      minimize: true\n    })\n  ])\n}\n"
  },
  {
    "path": "68-form-input-basic/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n    <style>\n        html, body {\n            width: 100%;\n            height: 100%;\n            display: flex;\n            justify-content: center;\n            align-items: flex-start;\n        }\n\n        #app {\n            width: 40%;\n            font-family: sans-serif;\n        }\n\n        form > * {\n            display: block;\n            margin: .3em 0;\n            width: 100%;\n        }\n\n        input[type=checkbox], input[type=radio], input[type=radio] ~ label {\n            display: inline-block;\n            width: auto;\n        }\n    </style>\n</head>\n<body>\n<div id=\"app\">\n    <h1>Formulario</h1>\n    <hr>\n    <form @submit.prevent=\"enviar\">\n        <label for=\"nombre\">Nombre:</label>\n        <input required type=\"text\" id=\"nombre\" v-model=\"formulario.nombre\">\n        <label for=\"apellidos\">Apellidos:</label>\n        <input required type=\"text\" id=\"apellidos\" v-model=\"formulario.apellidos\">\n        <label for=\"consulta\">Consulta:</label>\n        <textarea rows=\"5\" id=\"consulta\" v-model=\"formulario.consulta\"></textarea>\n\n        <input type=\"radio\" id=\"si\" value=\"Si\" v-model=\"formulario.cliente\">\n        <label for=\"si\">Soy cliente</label>\n        <br>\n        <input type=\"radio\" id=\"no\" value=\"No\" v-model=\"formulario.cliente\">\n        <label for=\"no\">No soy cliente</label>\n        <br>\n\n        <label for=\"conocio\">¿Dónde nos conoció?</label>\n        <select id=\"conocio\" v-model=\"formulario.conocio\">\n            <option v-for=\"opcion in conocio\" :value=\"opcion\">\n                {{ opcion }}\n            </option>\n        </select>\n\n        <input type=\"checkbox\" id=\"acepto\" v-model=\"formulario.acepta\">\n\n        <label for=\"acepto\">Acepto las condiciones</label>\n        <input v-if=\"formulario.acepta\" type=\"submit\" value=\"Enviar\">\n    </form>\n    <hr>\n    <pre>{{ $data }}</pre>\n</div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script>\n    new Vue({\n        el: '#app',\n        data: {\n            formulario: {\n                nombre: null,\n                apellidos: null,\n                consulta: null,\n                cliente: null,\n                conocio: 'Internet',\n                acepta: null,\n            },\n            conocio: [\n                'Amigo o familiar',\n                'Internet',\n                'TV o radio',\n            ]\n        },\n        methods: {\n            enviar() {\n                for (let key in this.formulario) {\n                    console.info(`${key} : ${this.formulario[key]}`);\n                }\n            }\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "69-form-value-bindings/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<div id=\"app\">\n    <!-- Checkbox -->\n    <input type=\"checkbox\" v-model=\"checkbox\" :true-value=\"a\" :false-value=\"b\">\n\n    <!-- Radio -->\n    <!--<input type=\"radio\" v-model=\"radio\" :value=\"a\">-->\n    <input type=\"radio\" v-model=\"radio\" :value=\"[1, 2, 3, 4, 5]\">\n\n    <!-- Select -->\n    <select v-model=\"select\">\n        <option :value=\"b\">Juan</option>\n    </select>\n    <hr>\n    <pre>{{ $data }}</pre>\n</div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script>\n    new Vue({\n        el: '#app',\n        data: {\n            checkbox: null,\n            radio: null,\n            select: null,\n            a: {estado: 'checked'},\n            b: {estado: 'unchecked'},\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "7-filtros/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <input type=\"search\" v-model=\"busqueda\" placeholder=\"Buscar juego\">\n        <ul>\n            <li v-for=\"juego in buscarJuego\">\n                {{ juego.titulo | alReves }}\n            </li>\n        </ul>\n        <input type=\"range\" min=\"0\" max=\"10\" v-model=\"minimo\">\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "7-filtros/js/main.js",
    "content": "Vue.filter('alReves',(valor) => valor.split('').reverse().join(''));\n\nnew Vue({\n    el: 'main',\n    data: {\n        busqueda: '',\n        minimo: 5,\n        juegos: [{\n                titulo: 'Battlefield 1',\n                genero: 'FPS',\n                puntuacion: 9\n            },\n            {\n                titulo: 'Civilization VI',\n                genero: 'Estrategia',\n                puntuacion: 10\n            },\n            {\n                titulo: 'Resident Evil 7',\n                genero: 'Survival Horror',\n                puntuacion: 7,\n            },\n        ]\n    },\n    computed: {\n        mejoresJuegos() {\n            return this.juegos.filter((juego) => juego.puntuacion >= this.minimo);\n        },\n        buscarJuego() {\n            return this.juegos.filter((juego) => juego.titulo.includes(this.busqueda));\n        }\n    }\n});\n\n"
  },
  {
    "path": "70-form-input-modifiers/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n    <style>\n        html, body {\n            width: 100%;\n            height: 100%;\n            display: flex;\n            justify-content: center;\n            align-items: flex-start;\n        }\n\n        #app {\n            width: 40%;\n            font-family: sans-serif;\n        }\n\n        form > * {\n            display: block;\n            margin: .3em 0;\n            width: 100%;\n        }\n\n        input[type=checkbox], input[type=radio], input[type=radio] ~ label {\n            display: inline-block;\n            width: auto;\n        }\n    </style>\n</head>\n<body>\n<div id=\"app\">\n    <h1>Formulario</h1>\n    <hr>\n    <form @submit.prevent=\"enviar\">\n        <input type=\"text\" v-model.trim.lazy=\"formulario\">\n        <input type=\"submit\" value=\"Enviar\">\n    </form>\n    <hr>\n    <pre>{{ $data }}</pre>\n</div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script>\n    new Vue({\n        el: '#app',\n        data: {\n            formulario: null,\n        },\n        methods: {\n            enviar() {\n                console.info(typeof this.formulario);\n            }\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "71-firebase-agregar/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<form id=\"formulario\">\n    <textarea name=\"mensaje\" id=\"mensaje\" cols=\"30\" rows=\"10\"></textarea>\n    <br>\n    <input type=\"submit\" value=\"Enviar mensaje\">\n</form>\n\n<script src=\"https://www.gstatic.com/firebasejs/4.1.5/firebase.js\"></script>\n<script>\n    // Initialize Firebase\n    var config = {\n        apiKey: \"AIzaSyBbicItcm46rhJKSeOXvDNdU4mFF7_kRkw\",\n        authDomain: \"curso-vue-firebase.firebaseapp.com\",\n        databaseURL: \"https://curso-vue-firebase.firebaseio.com\",\n        projectId: \"curso-vue-firebase\",\n        storageBucket: \"curso-vue-firebase.appspot.com\",\n        messagingSenderId: \"620168406459\"\n    };\n    firebase.initializeApp(config);\n\n    // Guardar una referencia a la base de datos\n    var db = firebase.database();\n\n    // Guardar info de perfil\n/*    db.ref('/perfiles/juanwmedia').set({\n        username: 'juanwmedia',\n        password: '777',\n        ciudad: 'Valencia',\n        pais: 'España'\n    }).then(() => console.info('Datos añadidos'));*/\n\n    // Guardar nuevos datos anidados (lista)\n    document.getElementById('formulario').onsubmit= function(event) {\n        event.preventDefault();\n        let mensaje = document.getElementById('mensaje');\n        db.ref('chats').push({\n            username: 'juanwmedia',\n            mensaje: mensaje.value,\n        }).then(() => {\n            console.info('Mensaje enviado');\n            mensaje.value = '';\n        });\n    }\n</script>\n</body>\n</html>"
  },
  {
    "path": "72-firebase-leer/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<div id=\"app\">\n    <form @submit.prevent=\"enviarMensaje\">\n        <textarea v-model=\"mensaje\" cols=\"30\" rows=\"10\"></textarea>\n        <br>\n        <input type=\"submit\" value=\"Enviar mensaje\">\n    </form>\n    <hr>\n    <h1>Mensajes</h1>\n    <ul>\n        <li v-for=\"mensaje in mensajes\">\n            {{ mensaje.mensaje}}\n            <small><i>({{ mensaje.username }})</i></small>\n        </li>\n    </ul>\n</div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script src=\"https://www.gstatic.com/firebasejs/4.1.5/firebase.js\"></script>\n<script>\n    // Initialize Firebase\n    const config = {\n        apiKey: \"AIzaSyBbicItcm46rhJKSeOXvDNdU4mFF7_kRkw\",\n        authDomain: \"curso-vue-firebase.firebaseapp.com\",\n        databaseURL: \"https://curso-vue-firebase.firebaseio.com\",\n        projectId: \"curso-vue-firebase\",\n        storageBucket: \"curso-vue-firebase.appspot.com\",\n        messagingSenderId: \"620168406459\"\n    };\n    firebase.initializeApp(config);\n    const db = firebase.database();\n\n    // Vue stuff\n    new Vue({\n        el: '#app',\n        created() {\n            db.ref('/chats')\n                .on('value', snapshot => this.cargarMensajes(snapshot.val()))\n        },\n        data: {\n            mensaje: null,\n            username: 'juanwmedia',\n            mensajes: [],\n        },\n        methods: {\n            cargarMensajes(mensajes) {\n                this.mensajes = [];\n                for (let key in mensajes) {\n                    this.mensajes.push({\n                        mensaje: mensajes[key].mensaje,\n                        username: mensajes[key].username,\n                    });\n                }\n                this.mensajes.reverse();\n            },\n            enviarMensaje() {\n                db.ref('/chats')\n                    .push({\n                        mensaje: this.mensaje,\n                        username: this.username,\n                    })\n                    .then((data) => {\n                        this.mensaje = '';\n                        console.log(data.key);\n                    });\n            }\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "73-firebase-actualizar/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<div id=\"app\">\n    <form @submit.prevent=\"enviarMensaje\">\n        <textarea v-model=\"mensaje\" cols=\"30\" rows=\"10\"></textarea>\n        <br>\n        <input type=\"submit\" value=\"Enviar mensaje\">\n    </form>\n    <hr>\n    <h1>Mensajes</h1>\n    <ul>\n        <li v-for=\"mensaje in mensajes\">\n            <span contenteditable=\"true\" @blur=\"editarMensaje($event, mensaje.key)\">\n                {{ mensaje.mensaje}}\n            </span>\n            <small><i>({{ mensaje.username }})</i></small>\n        </li>\n    </ul>\n</div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script src=\"https://www.gstatic.com/firebasejs/4.1.5/firebase.js\"></script>\n<script>\n    // Initialize Firebase\n    const config = {\n        apiKey: \"AIzaSyBbicItcm46rhJKSeOXvDNdU4mFF7_kRkw\",\n        authDomain: \"curso-vue-firebase.firebaseapp.com\",\n        databaseURL: \"https://curso-vue-firebase.firebaseio.com\",\n        projectId: \"curso-vue-firebase\",\n        storageBucket: \"curso-vue-firebase.appspot.com\",\n        messagingSenderId: \"620168406459\"\n    };\n    firebase.initializeApp(config);\n    const db = firebase.database();\n\n    // Vue stuff\n    new Vue({\n        el: '#app',\n        created() {\n            db.ref('/chats')\n                .on('value', snapshot => this.cargarMensajes(snapshot.val()))\n        },\n        data: {\n            mensaje: null,\n            username: 'juanwmedia',\n            mensajes: [],\n        },\n        methods: {\n            cargarMensajes(mensajes) {\n                this.mensajes = [];\n                for (let key in mensajes) {\n                    this.mensajes.push({\n                        mensaje: mensajes[key].mensaje,\n                        username: mensajes[key].username,\n                        key: key,\n                    });\n                }\n                this.mensajes.reverse();\n            },\n            enviarMensaje() {\n                db.ref('/chats')\n                    .push({\n                        mensaje: this.mensaje,\n                        username: this.username,\n                    })\n                    .then((data) => {\n                        this.mensaje = '';\n                        console.log(data.key);\n                    });\n            },\n            editarMensaje(mensaje, key) {\n                db.ref('/chats/' + key).update({\n                    mensaje: mensaje.target.innerHTML\n                });\n            }\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "74-firebase-eliminar/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<div id=\"app\">\n    <form @submit.prevent=\"enviarMensaje\">\n        <textarea v-model=\"mensaje\" cols=\"30\" rows=\"10\"></textarea>\n        <br>\n        <input type=\"submit\" value=\"Enviar mensaje\">\n    </form>\n    <hr>\n    <h1>Mensajes</h1>\n    <ul>\n        <li v-for=\"mensaje in mensajes\">\n            <span contenteditable=\"true\" @blur=\"editarMensaje($event, mensaje.key)\">\n                {{ mensaje.mensaje}}\n            </span>\n            <small><i>({{ mensaje.username }})</i></small>\n            <button @click=\"eliminarMensaje(mensaje.key)\">X</button>\n        </li>\n    </ul>\n</div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script src=\"https://www.gstatic.com/firebasejs/4.1.5/firebase.js\"></script>\n<script>\n    // Initialize Firebase\n    const config = {\n        apiKey: \"AIzaSyBbicItcm46rhJKSeOXvDNdU4mFF7_kRkw\",\n        authDomain: \"curso-vue-firebase.firebaseapp.com\",\n        databaseURL: \"https://curso-vue-firebase.firebaseio.com\",\n        projectId: \"curso-vue-firebase\",\n        storageBucket: \"curso-vue-firebase.appspot.com\",\n        messagingSenderId: \"620168406459\"\n    };\n    firebase.initializeApp(config);\n    const db = firebase.database();\n\n    // Vue stuff\n    new Vue({\n        el: '#app',\n        created() {\n            db.ref('/chats')\n                .on('value', snapshot => this.cargarMensajes(snapshot.val()))\n        },\n        data: {\n            mensaje: null,\n            username: 'juanwmedia',\n            mensajes: [],\n        },\n        methods: {\n            cargarMensajes(mensajes) {\n                this.mensajes = [];\n                for (let key in mensajes) {\n                    this.mensajes.push({\n                        mensaje: mensajes[key].mensaje,\n                        username: mensajes[key].username,\n                        key: key,\n                    });\n                }\n                this.mensajes.reverse();\n            },\n            enviarMensaje() {\n                db.ref('/chats')\n                    .push({\n                        mensaje: this.mensaje,\n                        username: this.username,\n                    })\n                    .then((data) => {\n                        this.mensaje = '';\n                        console.log(data.key);\n                    });\n            },\n            editarMensaje(mensaje, key) {\n                db.ref('/chats/' + key).update({\n                    mensaje: mensaje.target.innerHTML\n                });\n            },\n            eliminarMensaje(key) {\n                if (confirm('¿Seguro?'))\n                    db.ref('/chats/' + key).remove();\n            }\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "75-firebase-transactions/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<div id=\"app\">\n    <h1>Datos del usuario</h1>\n    <dl>\n        <dt><i>Username:</i></dt>\n        <dd>{{ datosPerfil.username }}</dd>\n        <dt><i>Ciudad:</i></dt>\n        <dd>{{ datosPerfil.ciudad }}</dd>\n        <dt><i>País:</i></dt>\n        <dd>{{ datosPerfil.pais }}</dd>\n        <dt><i>Likes:</i></dt>\n        <dd>{{ datosPerfil.likes }}</dd>\n        <button @click=\"actualizarLikes\">Añadir like</button>\n    </dl>\n</div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script src=\"https://www.gstatic.com/firebasejs/4.1.5/firebase.js\"></script>\n<script>\n    // Initialize Firebase\n    const config = {\n        apiKey: \"AIzaSyBbicItcm46rhJKSeOXvDNdU4mFF7_kRkw\",\n        authDomain: \"curso-vue-firebase.firebaseapp.com\",\n        databaseURL: \"https://curso-vue-firebase.firebaseio.com\",\n        projectId: \"curso-vue-firebase\",\n        storageBucket: \"curso-vue-firebase.appspot.com\",\n        messagingSenderId: \"620168406459\"\n    };\n    firebase.initializeApp(config);\n    const db = firebase.database();\n\n    // Vue stuff\n    new Vue({\n        el: '#app',\n        created() {\n            db.ref('/perfiles').child('juanwmedia')\n                .on('value', snapshot => this.datosPerfil = snapshot.val());\n        },\n        data: {\n            datosPerfil: {},\n        },\n        methods: {\n            actualizarLikes() {\n                db.ref('/perfiles').child('juanwmedia').child('likes')\n                /*.update({\n                    'likes': this.datosPerfil.likes + 1\n                })*/\n                    .transaction(function (likesActuales) {\n                        return likesActuales + 1;\n                    }, function (error, commited, snapshot) {\n                        if (error) {\n                            console.error(error);\n                        } else if (!commited) {\n                            console.warn('Transacción no realizada');\n                        } else {\n                            console.info('Transacción realizada');\n                            console.log(snapshot.val());\n                        }\n                    });\n            }\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "76-firebase-push-agregar/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<div id=\"app\"></div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script src=\"https://www.gstatic.com/firebasejs/4.1.5/firebase.js\"></script>\n<script>\n    // Initialize Firebase\n    const config = {\n        apiKey: \"AIzaSyBbicItcm46rhJKSeOXvDNdU4mFF7_kRkw\",\n        authDomain: \"curso-vue-firebase.firebaseapp.com\",\n        databaseURL: \"https://curso-vue-firebase.firebaseio.com\",\n        projectId: \"curso-vue-firebase\",\n        storageBucket: \"curso-vue-firebase.appspot.com\",\n        messagingSenderId: \"620168406459\"\n    };\n    firebase.initializeApp(config);\n    const db = firebase.database();\n\n    // Vue stuff\n    new Vue({\n        el: '#app',\n        created() {\n            /*db.ref('chats').push({\n                mensaje: 'Hola, mundo',\n                username: 'juanwmedia',\n            });*/\n            const key = db.ref('chats').push().key;\n            console.log(key);\n            db.ref('chats').child(key).set({\n                mensaje: 'Hola, mundo, desde SET',\n                username: 'juanwmedia',\n            });\n\n            db.ref('/perfiles')\n                .child('juanwmedia').child('chats').child(key)\n                .set(true);\n        },\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "77-firebase-listas-eventos/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<div id=\"app\"></div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script src=\"https://www.gstatic.com/firebasejs/4.1.5/firebase.js\"></script>\n<script>\n    // Initialize Firebase\n    const config = {\n        apiKey: \"AIzaSyBbicItcm46rhJKSeOXvDNdU4mFF7_kRkw\",\n        authDomain: \"curso-vue-firebase.firebaseapp.com\",\n        databaseURL: \"https://curso-vue-firebase.firebaseio.com\",\n        projectId: \"curso-vue-firebase\",\n        storageBucket: \"curso-vue-firebase.appspot.com\",\n        messagingSenderId: \"620168406459\"\n    };\n    firebase.initializeApp(config);\n    const db = firebase.database();\n\n    // Vue stuff\n    new Vue({\n        el: '#app',\n        created() {\n            const chats = db.ref('chats');\n\n            // Child Added\n           //chats.on('child_added', (data) => console.log(data.val()));\n\n            // Child Changed\n            //chats.on('child_changed', (data) => console.log(data.key));\n\n            // Child Removed\n            chats.on('child_removed', (data) => console.log(data.key));\n        },\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "78-firebase-ordenar/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<div id=\"app\">\n    <button @click=\"ordenarPorKeySecundaria('color')\">Por Color</button>\n    <button @click=\"ordenarPorKeySecundaria('edad')\">Por Edad</button>\n    <button @click=\"ordenarPorKey\">Por Key del nodo</button>\n    <button @click=\"ordenarPorValor\">Por Valor</button>\n</div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script src=\"https://www.gstatic.com/firebasejs/4.1.5/firebase.js\"></script>\n<script>\n    // Initialize Firebase\n    const config = {\n        apiKey: \"AIzaSyBbicItcm46rhJKSeOXvDNdU4mFF7_kRkw\",\n        authDomain: \"curso-vue-firebase.firebaseapp.com\",\n        databaseURL: \"https://curso-vue-firebase.firebaseio.com\",\n        projectId: \"curso-vue-firebase\",\n        storageBucket: \"curso-vue-firebase.appspot.com\",\n        messagingSenderId: \"620168406459\"\n    };\n    firebase.initializeApp(config);\n    const db = firebase.database();\n    const gatosRef = db.ref('gatos');\n\n    // Datos iniciales\n    const gatos = [\n        {nombre: 'Rouco', edad: 5, color: 'blanco y negro'},\n        {nombre: 'Moma', edad: 3, color: 'atrigrado'},\n        {nombre: 'Nino', edad: 1, color: 'negro'},\n        {nombre: 'Guizmo', color: 'negro'},\n    ];\n\n    // Vue stuff\n    new Vue({\n        el: '#app',\n        created() {\n            gatos.forEach(gato => {\n                gatosRef.child(gato.nombre).set({\n                    edad: gato.edad || null,\n                    color: gato.color\n                });\n            });\n\n            this.gatos.orderByChild('edad')\n                .on('child_moved', snapshot => {\n                   console.warn(snapshot.val());\n                });\n        },\n        data: {\n            gatos: gatosRef,\n        },\n        methods: {\n            ordenarPorKeySecundaria(key) {\n                this.gatos.orderByChild(key).on('child_added', snapshot => {\n                    console.log(snapshot.key, snapshot.val());\n                });\n            },\n            ordenarPorKey() {\n                this.gatos.orderByKey().on('child_added', snapshot => {\n                    console.log(snapshot.key, snapshot.val());\n                });\n            },\n            ordenarPorValor() {\n                db.ref('votos').orderByValue().on('child_added', snapshot => {\n                    console.log(snapshot.key, snapshot.val());\n                });\n            }\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "79-firebase-filtrar/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Vue</title>\n</head>\n<body>\n<div id=\"app\"></div>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js\"></script>\n<script src=\"https://www.gstatic.com/firebasejs/4.1.5/firebase.js\"></script>\n<script>\n    // Initialize Firebase\n    const config = {\n        apiKey: \"AIzaSyBbicItcm46rhJKSeOXvDNdU4mFF7_kRkw\",\n        authDomain: \"curso-vue-firebase.firebaseapp.com\",\n        databaseURL: \"https://curso-vue-firebase.firebaseio.com\",\n        projectId: \"curso-vue-firebase\",\n        storageBucket: \"curso-vue-firebase.appspot.com\",\n        messagingSenderId: \"620168406459\"\n    };\n    firebase.initializeApp(config);\n    const gatosRef = firebase.database().ref('gatos');\n\n    // Vue stuff\n    new Vue({\n        el: '#app',\n        created() {\n            this.ordenarPorKeySecundaria('edad');\n        },\n        data: {\n            gatos: gatosRef,\n        },\n        methods: {\n            ordenarPorKeySecundaria(key) {\n                this.gatos\n                    .orderByChild(key)\n                    //.limitToLast(2)\n                    //.startAt(1)\n                    //.endAt(998)\n                    .equalTo(999)\n                    .on('child_added', snapshot => {\n                        console.log(snapshot.key, snapshot.val());\n                    });\n            },\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "8-instancia-vue/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <main>\n        <h1 v-text=\"mensaje\"></h1>\n        <button @click=\"alReves\">Al revés</button>\n        <pre>{{ $data }}</pre>\n    </main>\n    <div id=\"app\">\n        <h1>{{ mensaje }}</h1>\n    </div>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "8-instancia-vue/js/main.js",
    "content": "const vm1 = new Vue({\n    el: 'main',\n    data: {\n        mensaje: 'Instancia Vue 1',\n    },\n    beforeUpdate() {\n        console.log('BeforeUpdate: ', this.mensaje);\n    },\n    updated() {\n        console.log('Update: ', this.mensaje);\n    },\n    methods: {\n        alReves(){\n             this.mensaje = this.mensaje.split('').reverse().join('');\n        }\n    },\n    computed: {\n        mensajeMayusculas(){\n            return this.mensaje.toUpperCase();\n        }\n    }\n});\n\nconst vm2 = new Vue({\n    el: '#app',\n    data: {\n        mensaje: 'Instancia Vue 2',\n    }\n});"
  },
  {
    "path": "9-data-binding-atributos-clases/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n    <title>Vue.js</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style>\n        li {\n            cursor: pointer;\n        }\n        .completado {\n            text-decoration: line-through;\n        }\n    </style>\n</head>\n\n<body>\n    <main>\n        <h1>Tareas</h1>\n        <h2>{{ tareasCompletadas.length }} completadas</h2>\n        <ul>\n            <li :class=\"{completado: tarea.completado}\"\n                @click=\"completarTarea(tarea)\"\n                v-for=\"tarea in tareas\">\n                {{ tarea.titulo }}\n            </li>\n        </ul>\n        <pre>{{ $data }}</pre>\n    </main>\n    <script src=\"https://unpkg.com/vue@2.1.10/dist/vue.js\"></script>\n    <script src=\"js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "9-data-binding-atributos-clases/js/main.js",
    "content": "new Vue({\n    el: 'main',\n    data: {\n        tareas: [\n            {titulo: 'Hacer la compra', completado: false},\n            {titulo: 'Aprender Vue.js', completado: false},\n            {titulo: 'Aprender Firebase', completado: false},\n            {titulo: 'Dominar ES6', completado: false},\n            {titulo: 'Salir a correr', completado: false},\n        ]\n    },\n    methods: {\n        completarTarea(tarea) {\n            tarea.completado = !tarea.completado;\n        }\n    },\n    computed: {\n        tareasCompletadas() {\n            return this.tareas.filter((tarea) => tarea.completado);\n        }\n    }\n});"
  },
  {
    "path": "README.md",
    "content": "# Aprende Vue2 y Firebase paso a paso\n\nCurso 100% gratuito. La mejor forma de dar el salto a JavaScript moderno.\n\n## Repositorio del curso\n\nEste es el repositorio del curso. En el encontrarás todos los documentos y archivos que uso en cada una de las lecciones. Puedes clonarlo o descargarlo para utilizarlo en tu entorno de desarollo.\n\n### Más información\n\n* [vue.wmedia.es](http://vue.wmedia.es/) - Landing page del curso.\n* [Curso](http://wmedia.teachable.com/) - Apúntate al curso"
  }
]