From 8ce1d7ff9d23765c379b9fb8853e0dbf251eb826 Mon Sep 17 00:00:00 2001 From: s-ol Date: Mon, 21 Mar 2022 21:36:45 +0100 Subject: toolbar, focus, editable size --- app/app.js | 167 ++++++++++++++++++++++++++++++++++++++++++++--------------- app/style.js | 19 +++---- 2 files changed, 134 insertions(+), 52 deletions(-) diff --git a/app/app.js b/app/app.js index 4a00707..98831c8 100644 --- a/app/app.js +++ b/app/app.js @@ -1,5 +1,5 @@ import React from 'react'; -import { pos, width, height } from './style'; +import { css, pos, width, height } from './style'; import * as notes from './notes'; const statbyte = (stat, chan) => (stat << 4) | chan; @@ -156,22 +156,78 @@ const ChordView = ({ chord }) => { ); }; +css(` +nav { + display: flex; + flex-wrap: wrap; + justfiy-content: space-between; +} + +nav > .group, nav > .spacer { + display: flex; + align-items: baseline; + padding: 0.25em 1em; + gap: 1em; + + border: 0 solid #363636; + border-width: 1px 0 1px 0; +} + +nav > .group:nth-child(2n) { + background: #363636; +} + +nav > .spacer { flex: 1; } +`); + +css(` +main { + position: relative; + padding: 0.5em; + margin: 1em 0; + + display: flex; + justify-content: space-evenly; +} + +main .focus-msg { + position: absolute; + inset: 0; + + display: flex; + font-size: 5em; + justify-content: space-around; + align-items: center; + text-align: center; + + border: 4px solid white; + background: #212121; + pointer-events: none; + + opacity: 0.8; + transition: opacity 0.4s; +} + +main:focus-within .focus-msg { + opacity: 0; +} +`); + export default class App extends React.Component { state = { layout: 'wicki_hayden', scale: 'major', offset: 60, state: {}, + w: 12, + h: 4, }; - componentDidMount() { - document.addEventListener("keydown", this.onkeydown); - document.addEventListener("keyup", this.onkeyup); - } + ref = React.createRef(); - componentWillUnmount() { - document.removeEventListener("keydown", this.onkeydown); - document.removeEventListener("keyup", this.onkeyup); + componentDidMount() { + this.ref.current.addEventListener("keydown", this.onkeydown); + this.ref.current.addEventListener("keyup", this.onkeyup); } componentDidUpdate(prevProps) { @@ -214,10 +270,15 @@ export default class App extends React.Component { this.send(NOTE_OFF, note); } - onlayout = (e) => this.setState({ layout: e.target.value }) - onscale = (e) => this.setState({ scale: e.target.value }) + set(key) { + return (e) => { + let value = e.target.value; + if (key === 'w' || key === 'h') value = +value; + this.setState({ [key]: value }); + }; + } - onoffset = (e) => this.setState({ offset: null }); + onoffset = (offset) => (e) => this.setState({ offset }); onmessage = (e) => { const message = parse(e); @@ -259,41 +320,60 @@ export default class App extends React.Component { render() { const { configure, showMidi } = this.props; - const { scale, offset, layout, state } = this.state; + const { w, h, scale, offset, layout, state } = this.state; const chord = Object.entries(state).filter(([note, on]) => on).map(([k, _]) => k); chord.sort(); return (
- -
- - -
-
- - - -
- -
+ + +
- -
+ +
+ click here to activate
keyboard input
+
+
); } diff --git a/app/style.js b/app/style.js index 0897b16..5e84f5c 100644 --- a/app/style.js +++ b/app/style.js @@ -57,23 +57,24 @@ button, input, select { border: 1px solid #eeeeee; color: #eeeeee; padding: 0.25em; - margin: 0.125em 0; border-radius: 0.5em; } -.app, .keyboard, .chord { - position: relative; +input.small { + width: 4em; } -.main { - display: flex; - justify-content: space-evenly; +button { + padding: 0.25em 0.5em; } -.option label { +label { display: inline-block; - width: 4em; - margin-right: 1em; + font-weight: bold; +} + +.app, .keyboard, .chord { + position: relative; } .hexagon { -- cgit v1.2.3