From e854f77bdc54218bc00681b12409f5b46a0d24e8 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Tue, 7 May 2024 14:08:21 +0200 Subject: [PATCH] add range sliders --- tank-frontend/src/ThemeChooser.css | 6 +++ tank-frontend/src/ThemeChooser.tsx | 72 +++++++++++++------------- tank-frontend/src/components/Input.css | 6 +++ tank-frontend/src/components/Input.tsx | 51 ++++++++++++++---- 4 files changed, 90 insertions(+), 45 deletions(-) create mode 100644 tank-frontend/src/ThemeChooser.css diff --git a/tank-frontend/src/ThemeChooser.css b/tank-frontend/src/ThemeChooser.css new file mode 100644 index 0000000..a77c83f --- /dev/null +++ b/tank-frontend/src/ThemeChooser.css @@ -0,0 +1,6 @@ +.HslEditor-Inputs { + display: grid; + column-gap: var(--padding-normal); + grid-template-columns: auto auto auto; + grid-template-rows: auto; +} diff --git a/tank-frontend/src/ThemeChooser.tsx b/tank-frontend/src/ThemeChooser.tsx index c320e04..9bae98d 100644 --- a/tank-frontend/src/ThemeChooser.tsx +++ b/tank-frontend/src/ThemeChooser.tsx @@ -2,40 +2,37 @@ import Button from './components/Button.tsx'; import {getRandomTheme, HSL, hslToString, useHslTheme} from './theme.tsx'; import Dialog from './components/Dialog.tsx'; import {useState} from 'react'; -import {NumberInput} from './components/Input.tsx'; +import {NumberInput, RangeInput} from './components/Input.tsx'; import Row from './components/Row.tsx'; import Column from './components/Column.tsx'; +import './ThemeChooser.css'; function HslEditor({name, value, setValue}: { name: string; value: HSL; setValue: (value: HSL) => void }) { + const setH = (h: number) => setValue({...value, h}); + const setS = (s: number) => setValue({...value, s}); + const setL = (l: number) => setValue({...value, l}); + return

{name}

-
+

Hue

- { - setValue({...value, h: parseInt(event.target.value)}); - }}/> + +

Saturation

- { - setValue({...value, s: parseInt(event.target.value)}); - }}/> + +

Lightness

- { - setValue({...value, l: parseInt(event.target.value)}); - }}/> + +
; } @@ -45,25 +42,30 @@ function ThemeChooserDialog({onClose}: { }) { const {hslTheme, setHslTheme} = useHslTheme(); return - ; } diff --git a/tank-frontend/src/components/Input.css b/tank-frontend/src/components/Input.css index 376a3f0..d2a505b 100644 --- a/tank-frontend/src/components/Input.css +++ b/tank-frontend/src/components/Input.css @@ -1,3 +1,9 @@ .Input { + background-color: var(--color-background); + color: var(--color-text); padding: var(--padding-normal); } + +.RangeInput { + appearance: auto; +} diff --git a/tank-frontend/src/components/Input.tsx b/tank-frontend/src/components/Input.tsx index 002da6b..f35525f 100644 --- a/tank-frontend/src/components/Input.tsx +++ b/tank-frontend/src/components/Input.tsx @@ -1,7 +1,7 @@ -import {ChangeEventHandler} from "react"; +import {ChangeEventHandler} from 'react'; import './Input.css'; -export function TextInput( {onChange, className, value, placeholder, onEnter }: { +export function TextInput({onChange, className, value, placeholder, onEnter}: { onChange?: ChangeEventHandler | undefined; className?: string; value: string; @@ -10,7 +10,7 @@ export function TextInput( {onChange, className, value, placeholder, onEnter }: }) { return ; } -export function NumberInput( {onChange, className, value, placeholder, onEnter }: { - onChange?: ChangeEventHandler | undefined; +export function NumberInput({onChange, className, value, placeholder, onEnter}: { + onChange?: (value: number) => void; className?: string; value: number; placeholder?: string; @@ -30,16 +30,47 @@ export function NumberInput( {onChange, className, value, placeholder, onEnter } }) { return { + if (!onChange) + return; + onChange(parseFloat(event.target.value)); + }} onKeyUp={event => { - if (onEnter && event.key === 'Enter') - onEnter(); + if (!onEnter || event.key !== 'Enter') + return; + onEnter(); + }} + />; +} + +export function RangeInput({onChange, className, value, placeholder, onEnter, min, max}: { + onChange?: (value: number) => void; + className?: string; + value: number; + min: number; + max: number; + placeholder?: string; + onEnter?: () => void; +}) { + return { + if (!onChange) + return; + onChange(parseFloat(event.target.value)); + }} + onKeyUp={event => { + if (!onEnter || event.key !== 'Enter') + return; + onEnter(); }} />; } -