diff --git a/src/components/sound/range/index.ts b/src/components/sound/range/index.ts new file mode 100644 index 0000000..2d4a0df --- /dev/null +++ b/src/components/sound/range/index.ts @@ -0,0 +1 @@ +export { Range } from './range'; diff --git a/src/components/sound/range/range.module.css b/src/components/sound/range/range.module.css new file mode 100644 index 0000000..44f3fab --- /dev/null +++ b/src/components/sound/range/range.module.css @@ -0,0 +1,72 @@ +.range { + width: 100%; + max-width: 120px; + margin-top: 10px; + + /********** Range Input Styles **********/ + + /* Range Reset */ + appearance: none; + background: transparent; + cursor: pointer; + + /* Removes default focus */ + &:focus { + outline: none; + } + + &:disabled { + cursor: default; + opacity: 0.5; + pointer-events: none; + } + + /***** Chrome, Safari, Opera and Edge Chromium styles *****/ + + &::-webkit-slider-runnable-track { + height: 0.5rem; + border-radius: 0.5rem; + background-color: #27272a; + } + + &::-webkit-slider-thumb { + width: 14px; + height: 14px; + border: 1px solid #52525b; + border-radius: 50%; + margin-top: -3px; + appearance: none; + background-color: #3f3f46; + } + + &:not(:disabled):focus::-webkit-slider-thumb { + border: 1px solid #053a5f; + outline: 3px solid #053a5f; + outline-offset: 0.125rem; + } + + /******** Firefox styles ********/ + + &::-moz-range-track { + height: 0.5rem; + border-radius: 0.5rem; + background-color: #27272a; + } + + &::-moz-range-thumb { + width: 14px; + height: 14px; + border: none; + border: 1px solid #52525b; + border-radius: 0; + border-radius: 50%; + margin-top: -3px; + background-color: #3f3f46; + } + + &:not(:disabled):focus::-moz-range-thumb { + border: 1px solid #053a5f; + outline: 3px solid #053a5f; + outline-offset: 0.125rem; + } +} diff --git a/src/components/sound/range/range.tsx b/src/components/sound/range/range.tsx new file mode 100644 index 0000000..e96d09b --- /dev/null +++ b/src/components/sound/range/range.tsx @@ -0,0 +1,29 @@ +import { useSoundStore } from '@/store'; + +import styles from './range.module.css'; + +interface RangeProps { + id: string; + label: string; +} + +export function Range({ id, label }: RangeProps) { + const setVolume = useSoundStore(state => state.setVolume); + const volume = useSoundStore(state => state.sounds[id].volume); + const isSelected = useSoundStore(state => state.sounds[id].isSelected); + + return ( + isSelected && setVolume(id, Number(e.target.value) / 100)} + onClick={e => e.stopPropagation()} + /> + ); +} diff --git a/src/components/sound/sound.tsx b/src/components/sound/sound.tsx index c4445c7..7b9ca9d 100644 --- a/src/components/sound/sound.tsx +++ b/src/components/sound/sound.tsx @@ -1,5 +1,7 @@ import { useCallback, useEffect } from 'react'; +import { Range } from './range'; + import { useSound } from '@/hooks/use-sound'; import { useSoundStore } from '@/store'; import { usePlay } from '@/contexts/play'; @@ -27,11 +29,6 @@ export function Sound({ unselectHidden, }: SoundProps) { const { isPlaying, play } = usePlay(); - // const [isSelected, setIsSelected] = useLocalStorage( - // `${label}-is-selected`, - // false, - // ); - // const [volume, setVolume] = useLocalStorage(`${label}-volume`, 0.5); const select = useSoundStore(state => state.select); const unselect = useSoundStore(state => state.unselect); @@ -81,21 +78,8 @@ export function Sound({ onKeyDown={toggle} >