feat: Initial revision
This commit is contained in:
70
src/App.vue
70
src/App.vue
@@ -1,19 +1,75 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="app">
|
<div>
|
||||||
<img alt="Vue logo" src="./assets/logo.png">
|
<div>Hot Liquid</div>
|
||||||
<HelloWorld msg="Welcome to Your Vue.js App"/>
|
<temperature-slider
|
||||||
|
:initialValue="mainTemperature"
|
||||||
|
@value-changed="mainTemperature = parseInt($event)"
|
||||||
|
></temperature-slider>
|
||||||
|
|
||||||
|
<div>Cool Liquid</div>
|
||||||
|
<temperature-slider
|
||||||
|
:initialValue="auxTemperature"
|
||||||
|
@value-changed="auxTemperature = parseInt($event)"
|
||||||
|
></temperature-slider>
|
||||||
|
|
||||||
|
<div>Target Volume</div>
|
||||||
|
<volume-selector
|
||||||
|
:initialValue="targetVolume"
|
||||||
|
@value-changed="targetVolume = parseInt($event)"
|
||||||
|
>
|
||||||
|
</volume-selector>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
Mix
|
||||||
|
<strong>{{ Number(mainVolume).toFixed(1) }} ml</strong> of hot liquid
|
||||||
|
with <strong>{{ Number(auxVolume).toFixed(1) }} ml</strong> of cool
|
||||||
|
liquid to achieve target temperature of {{ targetTemperature }} °C
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import HelloWorld from './components/HelloWorld.vue'
|
import TemperatureSlider from "./components/TemperatureSlider.vue";
|
||||||
|
import VolumeSelector from "./components/VolumeSelector.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: "App",
|
||||||
components: {
|
components: {
|
||||||
HelloWorld
|
TemperatureSlider,
|
||||||
|
VolumeSelector,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
mainTemperature: 60,
|
||||||
|
auxTemperature: 20,
|
||||||
|
targetTemperature: 40,
|
||||||
|
targetVolume: 75,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
errors() {
|
||||||
|
if (this.targetTemperature === this.auxTemperature) {
|
||||||
|
return ["Target temperature must be greater than cool liquid"];
|
||||||
}
|
}
|
||||||
}
|
if (this.mainTemperature < this.targetTemperature) {
|
||||||
|
return ["Hot liquid temperature must be greater than target"];
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
tempRatio() {
|
||||||
|
return (
|
||||||
|
(this.mainTemperature - this.targetTemperature) /
|
||||||
|
(this.targetTemperature - this.auxTemperature)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
mainVolume() {
|
||||||
|
return this.targetVolume / (1 + this.tempRatio);
|
||||||
|
},
|
||||||
|
auxVolume() {
|
||||||
|
return this.targetVolume - this.mainVolume;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.7 KiB |
@@ -1,58 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="hello">
|
|
||||||
<h1>{{ msg }}</h1>
|
|
||||||
<p>
|
|
||||||
For a guide and recipes on how to configure / customize this project,<br>
|
|
||||||
check out the
|
|
||||||
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
|
|
||||||
</p>
|
|
||||||
<h3>Installed CLI Plugins</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
|
|
||||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
|
|
||||||
</ul>
|
|
||||||
<h3>Essential Links</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
|
|
||||||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
|
|
||||||
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
|
|
||||||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
|
|
||||||
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
|
|
||||||
</ul>
|
|
||||||
<h3>Ecosystem</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
|
|
||||||
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
|
|
||||||
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
|
|
||||||
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
|
|
||||||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'HelloWorld',
|
|
||||||
props: {
|
|
||||||
msg: String
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
||||||
<style scoped>
|
|
||||||
h3 {
|
|
||||||
margin: 40px 0 0;
|
|
||||||
}
|
|
||||||
ul {
|
|
||||||
list-style-type: none;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
li {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0 10px;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #42b983;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
34
src/components/TemperatureSlider.vue
Normal file
34
src/components/TemperatureSlider.vue
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<div class="temperature-slider">
|
||||||
|
<input
|
||||||
|
type="range"
|
||||||
|
min="15"
|
||||||
|
max="80"
|
||||||
|
v-model="value"
|
||||||
|
@change="valueChanged"
|
||||||
|
/>
|
||||||
|
<span>{{ value }} °C</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
initialValue: Number,
|
||||||
|
},
|
||||||
|
emits: ["value-changed"],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
value: this.initialValue,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
valueChanged() {
|
||||||
|
this.$emit("value-changed", this.value);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
</style>
|
||||||
34
src/components/VolumeSelector.vue
Normal file
34
src/components/VolumeSelector.vue
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<div class="volume-selector">
|
||||||
|
<input
|
||||||
|
type="range"
|
||||||
|
min="0"
|
||||||
|
max="150"
|
||||||
|
v-model="value"
|
||||||
|
@change="valueChanged"
|
||||||
|
/>
|
||||||
|
<span>{{ value }} ml</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
initialValue: Number,
|
||||||
|
},
|
||||||
|
emits: ["value-changed"],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
value: this.initialValue,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
valueChanged() {
|
||||||
|
this.$emit("value-changed", this.value);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user