From 5978c32125c0eca102102eb9e37bd7e3ed4364f5 Mon Sep 17 00:00:00 2001
From: Cristiano Magro <cristiano.magro@vola.it>
Date: Fri, 27 Dec 2024 21:28:41 +0100
Subject: [PATCH] lesson 05 all step

---
 05 - behind the scenes/behind-scenes-04-understanding-templates/styles.css    |   82 +++++
 05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/index.html   |   30 +
 05 - behind the scenes/behind-scenes-05-working-with-refs/app.js              |   55 +++
 05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/index.html |   30 +
 05 - behind the scenes/behind-scenes-05-working-with-refs/styles.css          |   82 +++++
 05 - behind the scenes/behind-scenes-01-starting-setup/app.js                 |   18 +
 05 - behind the scenes/behind-scenes-01-starting-setup/styles.css             |   78 ++++
 05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/index.html   |   26 +
 05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/styles.css   |   82 +++++
 05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/app.js       |   40 ++
 05 - behind the scenes/behind-scenes-04-understanding-templates/index.html    |   30 +
 05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/app.js     |   83 +++++
 05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/app.js       |   50 +++
 05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/styles.css |   82 +++++
 05 - behind the scenes/behind-scenes-05-working-with-refs/index.html          |   30 +
 05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/styles.css   |   78 ++++
 05 - behind the scenes/behind-scenes-01-starting-setup/index.html             |   26 +
 05 - behind the scenes/behind-scenes-04-understanding-templates/app.js        |   53 +++
 18 files changed, 955 insertions(+), 0 deletions(-)

diff --git a/05 - behind the scenes/behind-scenes-01-starting-setup/app.js b/05 - behind the scenes/behind-scenes-01-starting-setup/app.js
new file mode 100644
index 0000000..82167ad
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-01-starting-setup/app.js
@@ -0,0 +1,18 @@
+const app = Vue.createApp({
+  data() {
+    return {
+      currentUserInput: '',
+      message: 'Vue is great!',
+    };
+  },
+  methods: {
+    saveInput(event) {
+      this.currentUserInput = event.target.value;
+    },
+    setText() {
+      this.message = this.currentUserInput;
+    },
+  },
+});
+
+app.mount('#app');
diff --git a/05 - behind the scenes/behind-scenes-01-starting-setup/index.html b/05 - behind the scenes/behind-scenes-01-starting-setup/index.html
new file mode 100644
index 0000000..76619bb
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-01-starting-setup/index.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vue Basics</title>
+    <link
+      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
+      rel="stylesheet"
+    />
+    <link rel="stylesheet" href="styles.css" />
+    <script src="https://unpkg.com/vue@next" defer></script>
+    <script src="app.js" defer></script>
+  </head>
+  <body>
+    <header>
+      <h1>Vue Behind The Scenes</h1>
+    </header>
+    <section id="app">
+      <h2>How Vue Works</h2>
+      <input type="text" @input="saveInput">
+      <button @click="setText">Set Text</button>
+      <p>{{ message }}</p>
+    </section>
+  </body>
+</html>
diff --git a/05 - behind the scenes/behind-scenes-01-starting-setup/styles.css b/05 - behind the scenes/behind-scenes-01-starting-setup/styles.css
new file mode 100644
index 0000000..936d76f
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-01-starting-setup/styles.css
@@ -0,0 +1,78 @@
+* {
+  box-sizing: border-box;
+}
+
+html {
+  font-family: 'Jost', sans-serif;
+}
+
+body {
+  margin: 0;
+}
+
+header {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  background-color: #4fc08d;
+  color: white;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app h2 {
+  font-size: 2rem;
+  border-bottom: 4px solid #ccc;
+  color: #4fc08d;
+  margin: 0 0 1rem 0;
+}
+
+#app p {
+  font-size: 1.25rem;
+  font-weight: bold;
+  border: 1px solid #4fc08d;
+  background-color: #4fc08d;
+  color: white;
+  padding: 0.5rem;
+  border-radius: 25px;
+}
+
+#app input {
+  font: inherit;
+  border: 1px solid #ccc;
+}
+
+#app input:focus {
+  outline: none;
+  border-color: #1b995e;
+  background-color: #d7fdeb;
+}
+
+#app button {
+  font: inherit;
+  cursor: pointer;
+  border: 1px solid #ff0077;
+  background-color: #ff0077;
+  color: white;
+  padding: 0.05rem 1rem;
+  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.26);
+}
+
+#app button:hover,
+#app button:active {
+  background-color: #ec3169;
+  border-color: #ec3169;
+  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.26);
+}
diff --git a/05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/app.js b/05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/app.js
new file mode 100644
index 0000000..1b373af
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/app.js
@@ -0,0 +1,40 @@
+const app = Vue.createApp({
+  data() {
+    return {
+      currentUserInput: '',
+      message: 'Vue is great!',
+    };
+  },
+  methods: {
+    saveInput(event) {
+      this.currentUserInput = event.target.value;
+    },
+    setText() {
+      this.message = this.currentUserInput;
+    },
+  },
+});
+
+app.mount('#app');
+
+// ....
+
+const data = {
+  message: 'Hello!',
+  longMessage: 'Hello! World!'
+};
+
+const handler = {
+  set(target, key, value) {
+    if (key === 'message') {
+      target.longMessage = value + ' World!';
+    }
+    target.message = value;
+  }
+};
+
+const proxy = new Proxy(data, handler);
+
+proxy.message = 'Hello!!!!';
+
+console.log(proxy.longMessage);
\ No newline at end of file
diff --git a/05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/index.html b/05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/index.html
new file mode 100644
index 0000000..76619bb
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/index.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vue Basics</title>
+    <link
+      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
+      rel="stylesheet"
+    />
+    <link rel="stylesheet" href="styles.css" />
+    <script src="https://unpkg.com/vue@next" defer></script>
+    <script src="app.js" defer></script>
+  </head>
+  <body>
+    <header>
+      <h1>Vue Behind The Scenes</h1>
+    </header>
+    <section id="app">
+      <h2>How Vue Works</h2>
+      <input type="text" @input="saveInput">
+      <button @click="setText">Set Text</button>
+      <p>{{ message }}</p>
+    </section>
+  </body>
+</html>
diff --git a/05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/styles.css b/05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/styles.css
new file mode 100644
index 0000000..936d76f
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-02-vue-reactivity-deep-dive/styles.css
@@ -0,0 +1,78 @@
+* {
+  box-sizing: border-box;
+}
+
+html {
+  font-family: 'Jost', sans-serif;
+}
+
+body {
+  margin: 0;
+}
+
+header {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  background-color: #4fc08d;
+  color: white;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app h2 {
+  font-size: 2rem;
+  border-bottom: 4px solid #ccc;
+  color: #4fc08d;
+  margin: 0 0 1rem 0;
+}
+
+#app p {
+  font-size: 1.25rem;
+  font-weight: bold;
+  border: 1px solid #4fc08d;
+  background-color: #4fc08d;
+  color: white;
+  padding: 0.5rem;
+  border-radius: 25px;
+}
+
+#app input {
+  font: inherit;
+  border: 1px solid #ccc;
+}
+
+#app input:focus {
+  outline: none;
+  border-color: #1b995e;
+  background-color: #d7fdeb;
+}
+
+#app button {
+  font: inherit;
+  cursor: pointer;
+  border: 1px solid #ff0077;
+  background-color: #ff0077;
+  color: white;
+  padding: 0.05rem 1rem;
+  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.26);
+}
+
+#app button:hover,
+#app button:active {
+  background-color: #ec3169;
+  border-color: #ec3169;
+  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.26);
+}
diff --git a/05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/app.js b/05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/app.js
new file mode 100644
index 0000000..241ef6d
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/app.js
@@ -0,0 +1,50 @@
+const app = Vue.createApp({
+  data() {
+    return {
+      currentUserInput: '',
+      message: 'Vue is great!',
+    };
+  },
+  methods: {
+    saveInput(event) {
+      this.currentUserInput = event.target.value;
+    },
+    setText() {
+      this.message = this.currentUserInput;
+    },
+  },
+});
+
+app.mount('#app');
+
+const app2 = Vue.createApp({
+  data() {
+    return {
+      favoriteMeal: 'Pizza'
+    };
+  }
+});
+
+app2.mount('#app2');
+
+// ....
+
+const data = {
+  message: 'Hello!',
+  longMessage: 'Hello! World!'
+};
+
+const handler = {
+  set(target, key, value) {
+    if (key === 'message') {
+      target.longMessage = value + ' World!';
+    }
+    target.message = value;
+  }
+};
+
+const proxy = new Proxy(data, handler);
+
+proxy.message = 'Hello!!!!';
+
+console.log(proxy.longMessage);
\ No newline at end of file
diff --git a/05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/index.html b/05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/index.html
new file mode 100644
index 0000000..f3f52ed
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/index.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vue Basics</title>
+    <link
+      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
+      rel="stylesheet"
+    />
+    <link rel="stylesheet" href="styles.css" />
+    <script src="https://unpkg.com/vue@next" defer></script>
+    <script src="app.js" defer></script>
+  </head>
+  <body>
+    <header>
+      <h1>Vue Behind The Scenes</h1>
+    </header>
+    <section id="app">
+      <h2>How Vue Works</h2>
+      <input type="text" @input="saveInput">
+      <button @click="setText">Set Text</button>
+      <p>{{ message }}</p>
+    </section>
+    <section id="app2">
+      <!-- DOES NOT WORK: <p>{{ message }}</p> -->
+      <p>{{ favoriteMeal }}</p>
+    </section>
+  </body>
+</html>
diff --git a/05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/styles.css b/05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/styles.css
new file mode 100644
index 0000000..03cd91f
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-03-one-app-vs-multiple-apps/styles.css
@@ -0,0 +1,82 @@
+* {
+  box-sizing: border-box;
+}
+
+html {
+  font-family: 'Jost', sans-serif;
+}
+
+body {
+  margin: 0;
+}
+
+header {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  background-color: #4fc08d;
+  color: white;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app,
+#app2 {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app h2,
+#app2 h2 {
+  font-size: 2rem;
+  border-bottom: 4px solid #ccc;
+  color: #4fc08d;
+  margin: 0 0 1rem 0;
+}
+
+#app p,
+#app2 p {
+  font-size: 1.25rem;
+  font-weight: bold;
+  border: 1px solid #4fc08d;
+  background-color: #4fc08d;
+  color: white;
+  padding: 0.5rem;
+  border-radius: 25px;
+}
+
+#app input,
+#app2 input {
+  font: inherit;
+  border: 1px solid #ccc;
+}
+
+#app input:focus {
+  outline: none;
+  border-color: #1b995e;
+  background-color: #d7fdeb;
+}
+
+#app button {
+  font: inherit;
+  cursor: pointer;
+  border: 1px solid #ff0077;
+  background-color: #ff0077;
+  color: white;
+  padding: 0.05rem 1rem;
+  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.26);
+}
+
+#app button:hover,
+#app button:active {
+  background-color: #ec3169;
+  border-color: #ec3169;
+  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.26);
+}
diff --git a/05 - behind the scenes/behind-scenes-04-understanding-templates/app.js b/05 - behind the scenes/behind-scenes-04-understanding-templates/app.js
new file mode 100644
index 0000000..3d80911
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-04-understanding-templates/app.js
@@ -0,0 +1,53 @@
+const app = Vue.createApp({
+  data() {
+    return {
+      currentUserInput: '',
+      message: 'Vue is great!',
+    };
+  },
+  methods: {
+    saveInput(event) {
+      this.currentUserInput = event.target.value;
+    },
+    setText() {
+      this.message = this.currentUserInput;
+    },
+  },
+});
+
+app.mount('#app');
+
+const app2 = Vue.createApp({
+  template: `
+    <p>{{ favoriteMeal }}</p>
+  `,
+  data() {
+    return {
+      favoriteMeal: 'Pizza'
+    };
+  }
+});
+
+app2.mount('#app2');
+
+// ....
+
+const data = {
+  message: 'Hello!',
+  longMessage: 'Hello! World!'
+};
+
+const handler = {
+  set(target, key, value) {
+    if (key === 'message') {
+      target.longMessage = value + ' World!';
+    }
+    target.message = value;
+  }
+};
+
+const proxy = new Proxy(data, handler);
+
+proxy.message = 'Hello!!!!';
+
+console.log(proxy.longMessage);
\ No newline at end of file
diff --git a/05 - behind the scenes/behind-scenes-04-understanding-templates/index.html b/05 - behind the scenes/behind-scenes-04-understanding-templates/index.html
new file mode 100644
index 0000000..f7017ac
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-04-understanding-templates/index.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vue Basics</title>
+    <link
+      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
+      rel="stylesheet"
+    />
+    <link rel="stylesheet" href="styles.css" />
+    <script src="https://unpkg.com/vue@next" defer></script>
+    <script src="app.js" defer></script>
+  </head>
+  <body>
+    <header>
+      <h1>Vue Behind The Scenes</h1>
+    </header>
+    <section id="app">
+      <h2>How Vue Works</h2>
+      <input type="text" @input="saveInput">
+      <button @click="setText">Set Text</button>
+      <p>{{ message }}</p>
+    </section>
+    <section id="app2">
+      <!-- DOES NOT WORK: <p>{{ message }}</p> -->
+      
+    </section>
+  </body>
+</html>
diff --git a/05 - behind the scenes/behind-scenes-04-understanding-templates/styles.css b/05 - behind the scenes/behind-scenes-04-understanding-templates/styles.css
new file mode 100644
index 0000000..03cd91f
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-04-understanding-templates/styles.css
@@ -0,0 +1,82 @@
+* {
+  box-sizing: border-box;
+}
+
+html {
+  font-family: 'Jost', sans-serif;
+}
+
+body {
+  margin: 0;
+}
+
+header {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  background-color: #4fc08d;
+  color: white;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app,
+#app2 {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app h2,
+#app2 h2 {
+  font-size: 2rem;
+  border-bottom: 4px solid #ccc;
+  color: #4fc08d;
+  margin: 0 0 1rem 0;
+}
+
+#app p,
+#app2 p {
+  font-size: 1.25rem;
+  font-weight: bold;
+  border: 1px solid #4fc08d;
+  background-color: #4fc08d;
+  color: white;
+  padding: 0.5rem;
+  border-radius: 25px;
+}
+
+#app input,
+#app2 input {
+  font: inherit;
+  border: 1px solid #ccc;
+}
+
+#app input:focus {
+  outline: none;
+  border-color: #1b995e;
+  background-color: #d7fdeb;
+}
+
+#app button {
+  font: inherit;
+  cursor: pointer;
+  border: 1px solid #ff0077;
+  background-color: #ff0077;
+  color: white;
+  padding: 0.05rem 1rem;
+  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.26);
+}
+
+#app button:hover,
+#app button:active {
+  background-color: #ec3169;
+  border-color: #ec3169;
+  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.26);
+}
diff --git a/05 - behind the scenes/behind-scenes-05-working-with-refs/app.js b/05 - behind the scenes/behind-scenes-05-working-with-refs/app.js
new file mode 100644
index 0000000..2a42078
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-05-working-with-refs/app.js
@@ -0,0 +1,55 @@
+const app = Vue.createApp({
+  data() {
+    return {
+      currentUserInput: '',
+      message: 'Vue is great!',
+    };
+  },
+  methods: {
+    saveInput(event) {
+      this.currentUserInput = event.target.value;
+    },
+    setText() {
+      // this.message = this.currentUserInput;
+      this.message = this.$refs.userText.value;
+      // console.dir(this.$refs.userText);
+    },
+  },
+});
+
+app.mount('#app');
+
+const app2 = Vue.createApp({
+  template: `
+    <p>{{ favoriteMeal }}</p>
+  `,
+  data() {
+    return {
+      favoriteMeal: 'Pizza'
+    };
+  }
+});
+
+app2.mount('#app2');
+
+// ....
+
+const data = {
+  message: 'Hello!',
+  longMessage: 'Hello! World!'
+};
+
+const handler = {
+  set(target, key, value) {
+    if (key === 'message') {
+      target.longMessage = value + ' World!';
+    }
+    target.message = value;
+  }
+};
+
+const proxy = new Proxy(data, handler);
+
+proxy.message = 'Hello!!!!';
+
+console.log(proxy.longMessage);
\ No newline at end of file
diff --git a/05 - behind the scenes/behind-scenes-05-working-with-refs/index.html b/05 - behind the scenes/behind-scenes-05-working-with-refs/index.html
new file mode 100644
index 0000000..8973aca
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-05-working-with-refs/index.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vue Basics</title>
+    <link
+      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
+      rel="stylesheet"
+    />
+    <link rel="stylesheet" href="styles.css" />
+    <script src="https://unpkg.com/vue@next" defer></script>
+    <script src="app.js" defer></script>
+  </head>
+  <body>
+    <header>
+      <h1>Vue Behind The Scenes</h1>
+    </header>
+    <section id="app">
+      <h2>How Vue Works</h2>
+      <input type="text" ref="userText">
+      <button @click="setText">Set Text</button>
+      <p>{{ message }}</p>
+    </section>
+    <section id="app2">
+      <!-- DOES NOT WORK: <p>{{ message }}</p> -->
+      
+    </section>
+  </body>
+</html>
diff --git a/05 - behind the scenes/behind-scenes-05-working-with-refs/styles.css b/05 - behind the scenes/behind-scenes-05-working-with-refs/styles.css
new file mode 100644
index 0000000..03cd91f
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-05-working-with-refs/styles.css
@@ -0,0 +1,82 @@
+* {
+  box-sizing: border-box;
+}
+
+html {
+  font-family: 'Jost', sans-serif;
+}
+
+body {
+  margin: 0;
+}
+
+header {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  background-color: #4fc08d;
+  color: white;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app,
+#app2 {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app h2,
+#app2 h2 {
+  font-size: 2rem;
+  border-bottom: 4px solid #ccc;
+  color: #4fc08d;
+  margin: 0 0 1rem 0;
+}
+
+#app p,
+#app2 p {
+  font-size: 1.25rem;
+  font-weight: bold;
+  border: 1px solid #4fc08d;
+  background-color: #4fc08d;
+  color: white;
+  padding: 0.5rem;
+  border-radius: 25px;
+}
+
+#app input,
+#app2 input {
+  font: inherit;
+  border: 1px solid #ccc;
+}
+
+#app input:focus {
+  outline: none;
+  border-color: #1b995e;
+  background-color: #d7fdeb;
+}
+
+#app button {
+  font: inherit;
+  cursor: pointer;
+  border: 1px solid #ff0077;
+  background-color: #ff0077;
+  color: white;
+  padding: 0.05rem 1rem;
+  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.26);
+}
+
+#app button:hover,
+#app button:active {
+  background-color: #ec3169;
+  border-color: #ec3169;
+  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.26);
+}
diff --git a/05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/app.js b/05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/app.js
new file mode 100644
index 0000000..ed0b20b
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/app.js
@@ -0,0 +1,83 @@
+const app = Vue.createApp({
+  data() {
+    return {
+      currentUserInput: '',
+      message: 'Vue is great!',
+    };
+  },
+  methods: {
+    saveInput(event) {
+      this.currentUserInput = event.target.value;
+    },
+    setText() {
+      // this.message = this.currentUserInput;
+      this.message = this.$refs.userText.value;
+      // console.dir(this.$refs.userText);
+    },
+  },
+  beforeCreate() {
+    console.log('beforeCreate()');
+  },
+  created() {
+    console.log('created()');
+  },
+  beforeMount() {
+    console.log('beforeMount()');
+  },
+  mounted() {
+    console.log('mounted()');
+  },
+  beforeUpdate() {
+    console.log('beforeUpdate()');
+  },
+  updated() {
+    console.log('updated()');
+  },
+  beforeUnmount() {
+    console.log('beforeUnmount()');
+  },
+  unmounted() {
+    console.log('unmounted()');
+  },
+});
+
+app.mount('#app');
+
+setTimeout(function () {
+  app.unmount();
+}, 3000);
+
+const app2 = Vue.createApp({
+  template: `
+    <p>{{ favoriteMeal }}</p>
+  `,
+  data() {
+    return {
+      favoriteMeal: 'Pizza',
+    };
+  },
+});
+
+app2.mount('#app2');
+
+// ....
+
+const data = {
+  message: 'Hello!',
+  longMessage: 'Hello! World!',
+};
+
+const handler = {
+  set(target, key, value) {
+    if (key === 'message') {
+      target.longMessage = value + ' World!';
+    }
+    target.message = value;
+  },
+};
+
+const proxy = new Proxy(data, handler);
+
+proxy.message = 'Hello!!!!';
+
+// console.log(proxy.longMessage);
diff --git a/05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/index.html b/05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/index.html
new file mode 100644
index 0000000..8973aca
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/index.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vue Basics</title>
+    <link
+      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
+      rel="stylesheet"
+    />
+    <link rel="stylesheet" href="styles.css" />
+    <script src="https://unpkg.com/vue@next" defer></script>
+    <script src="app.js" defer></script>
+  </head>
+  <body>
+    <header>
+      <h1>Vue Behind The Scenes</h1>
+    </header>
+    <section id="app">
+      <h2>How Vue Works</h2>
+      <input type="text" ref="userText">
+      <button @click="setText">Set Text</button>
+      <p>{{ message }}</p>
+    </section>
+    <section id="app2">
+      <!-- DOES NOT WORK: <p>{{ message }}</p> -->
+      
+    </section>
+  </body>
+</html>
diff --git a/05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/styles.css b/05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/styles.css
new file mode 100644
index 0000000..03cd91f
--- /dev/null
+++ b/05 - behind the scenes/behind-scenes-06-vue-app-lifecycle-practice/styles.css
@@ -0,0 +1,82 @@
+* {
+  box-sizing: border-box;
+}
+
+html {
+  font-family: 'Jost', sans-serif;
+}
+
+body {
+  margin: 0;
+}
+
+header {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  background-color: #4fc08d;
+  color: white;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app,
+#app2 {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
+  margin: 3rem auto;
+  border-radius: 10px;
+  padding: 1rem;
+  text-align: center;
+  width: 90%;
+  max-width: 40rem;
+}
+
+#app h2,
+#app2 h2 {
+  font-size: 2rem;
+  border-bottom: 4px solid #ccc;
+  color: #4fc08d;
+  margin: 0 0 1rem 0;
+}
+
+#app p,
+#app2 p {
+  font-size: 1.25rem;
+  font-weight: bold;
+  border: 1px solid #4fc08d;
+  background-color: #4fc08d;
+  color: white;
+  padding: 0.5rem;
+  border-radius: 25px;
+}
+
+#app input,
+#app2 input {
+  font: inherit;
+  border: 1px solid #ccc;
+}
+
+#app input:focus {
+  outline: none;
+  border-color: #1b995e;
+  background-color: #d7fdeb;
+}
+
+#app button {
+  font: inherit;
+  cursor: pointer;
+  border: 1px solid #ff0077;
+  background-color: #ff0077;
+  color: white;
+  padding: 0.05rem 1rem;
+  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.26);
+}
+
+#app button:hover,
+#app button:active {
+  background-color: #ec3169;
+  border-color: #ec3169;
+  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.26);
+}

--
Gitblit v1.8.0