feat: Initial revision
This commit is contained in:
70
src/App.vue
70
src/App.vue
@@ -1,19 +1,75 @@
|
||||
<template>
|
||||
<div id="app">
|
||||
<img alt="Vue logo" src="./assets/logo.png">
|
||||
<HelloWorld msg="Welcome to Your Vue.js App"/>
|
||||
<div>
|
||||
<div>Hot Liquid</div>
|
||||
<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>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import HelloWorld from './components/HelloWorld.vue'
|
||||
import TemperatureSlider from "./components/TemperatureSlider.vue";
|
||||
import VolumeSelector from "./components/VolumeSelector.vue";
|
||||
|
||||
export default {
|
||||
name: 'App',
|
||||
name: "App",
|
||||
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>
|
||||
|
||||
<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