Choose your favorite library and challenge this one :-)
This is an upgraded version of MVU (v2.0.3)
See how easy it is to handle SVG elements...thanks to htl
You can test it here ColorChooser
const { html, dom, udom, render, svg } = mvu.MVU;
const target = document.getElementById("app")
let state = {
init: true,
red: 255,
green: 128,
blue: 125
}
function Circle(state) {
const strcolor = (state) => `rgb(${state.red},${state.green},${state.blue})`;
let node = (
svg`<svg width="100px" height="100px" fill=${strcolor(state)}>
${svg`<circle cx=50 cy=50 r=50></circle>`}
</svg>`
)
return node
}
function Slider(color, state) {
let slider = dom();
let input = html`
<div>
<div style="display:flex;align-items:center">
<div style="width:50px;text-align:right;margin-right:10px;">
${color.charAt(0).toUpperCase()}
</div>
<div>
<input type="range" min="0" max="255" value=${state[color]}>
</div>
${state[color]}
</div>
</div>`
udom();
input.oninput = function (e) {
let value = e.target.value
state[color] = value;
update(state)
}
return slider
}
function Title () {
let title = html`<h1>A Simple Colors Chooser</h1>`
return title
}
function App(state) {
let app = dom();
html`
${Title()}
<div class='color-chooser'>
<div>${Circle(state)}</div>
<div class="color-slider">
<div>
<div>${Slider("red", state)}</div>
<div>${Slider("green", state)}</div>
<div>${Slider("blue", state)}</div>
</div>
</div>
</div>`
udom();
return app
}
function update(state) {
render(target, App(state))
}
update(state);