style sliders

This commit is contained in:
Vikeo
2024-05-23 10:05:02 +02:00
parent 739048044c
commit 9bbe6cbb3b
2 changed files with 139 additions and 3 deletions

View File

@@ -12,10 +12,11 @@ import {
defaultInitialGameSettings, defaultInitialGameSettings,
} from '../../../Types/Settings'; } from '../../../Types/Settings';
import { LayoutOptions } from './LayoutOptions'; import { baseColors } from '../../../../tailwind.config';
import { InfoDialog } from '../../Dialogs/InfoDialog'; import { InfoDialog } from '../../Dialogs/InfoDialog';
import { SettingsDialog } from '../../Dialogs/SettingsDialog'; import { SettingsDialog } from '../../Dialogs/SettingsDialog';
import { ToggleButton } from '../../Misc/ToggleButton'; import { ToggleButton } from '../../Misc/ToggleButton';
import { LayoutOptions } from './LayoutOptions';
const commanderSettings: Pick< const commanderSettings: Pick<
InitialGameSettings, InitialGameSettings,
@@ -67,6 +68,8 @@ const Start = () => {
const infoDialogRef = useRef<HTMLDialogElement | null>(null); const infoDialogRef = useRef<HTMLDialogElement | null>(null);
const settingsDialogRef = useRef<HTMLDialogElement | null>(null); const settingsDialogRef = useRef<HTMLDialogElement | null>(null);
const playersSliderRef = useRef<HTMLInputElement | null>(null);
const healthSliderRef = useRef<HTMLInputElement | null>(null);
const [playerOptions, setPlayerOptions] = useState<InitialGameSettings>( const [playerOptions, setPlayerOptions] = useState<InitialGameSettings>(
initialGameSettings || defaultInitialGameSettings initialGameSettings || defaultInitialGameSettings
@@ -81,6 +84,68 @@ const Start = () => {
} }
}); });
useEffect(() => {
if (!playersSliderRef.current) {
return;
}
let progress = 0;
switch (playerOptions?.numberOfPlayers) {
case 1:
progress = 0;
break;
case 2:
progress = 20;
break;
case 3:
progress = 40;
break;
case 4:
progress = 60;
break;
case 5:
progress = 80;
break;
case 6:
progress = 100;
break;
default:
break;
}
playersSliderRef.current.style.background = `linear-gradient(to right, ${baseColors.secondary.main} ${progress}%, ${baseColors.secondary.dark} ${progress}%)`;
}, [playerOptions?.numberOfPlayers]);
useEffect(() => {
if (!healthSliderRef.current) {
return;
}
let progress = 0;
switch (playerOptions?.startingLifeTotal) {
case 20:
progress = 0;
break;
case 30:
progress = 25;
break;
case 40:
progress = 50;
break;
case 50:
progress = 75;
break;
case 60:
progress = 100;
break;
default:
break;
}
healthSliderRef.current.style.background = `linear-gradient(to right, ${baseColors.secondary.main} ${progress}%, ${baseColors.secondary.dark} ${progress}%)`;
}, [playerOptions?.startingLifeTotal]);
useEffect(() => { useEffect(() => {
setInitialGameSettings(playerOptions); setInitialGameSettings(playerOptions);
}, [playerOptions, setInitialGameSettings]); }, [playerOptions, setInitialGameSettings]);
@@ -250,6 +315,7 @@ const Start = () => {
<LabelText className="mt-4">Number of Players</LabelText> <LabelText className="mt-4">Number of Players</LabelText>
<SliderWrapper> <SliderWrapper>
<input <input
ref={playersSliderRef}
className="accent-primary-main text-primary-dark w-full h-3 rounded-lg cursor-pointer" className="accent-primary-main text-primary-dark w-full h-3 rounded-lg cursor-pointer"
title="Number of Players" title="Number of Players"
type="range" type="range"
@@ -264,7 +330,7 @@ const Start = () => {
}); });
}} }}
/> />
<div className="flex w-full justify-between px-1 text-text-primary pointer-events-none"> <div className="flex w-full justify-between px-[6px] text-text-primary pointer-events-none">
<div>1</div> <div>1</div>
<div>2</div> <div>2</div>
<div>3</div> <div>3</div>
@@ -277,6 +343,7 @@ const Start = () => {
<LabelText className="mt-4">Starting Health</LabelText> <LabelText className="mt-4">Starting Health</LabelText>
<SliderWrapper> <SliderWrapper>
<input <input
ref={healthSliderRef}
className="accent-primary-main text-primary-dark w-full h-3 rounded-lg cursor-pointer" className="accent-primary-main text-primary-dark w-full h-3 rounded-lg cursor-pointer"
title="Starting Health" title="Starting Health"
type="range" type="range"
@@ -293,7 +360,7 @@ const Start = () => {
}) })
} }
/> />
<div className="flex w-full justify-between px-1 text-text-primary pointer-events-none"> <div className="flex w-full justify-between text-text-primary pointer-events-none">
<div>20</div> <div>20</div>
<div>30</div> <div>30</div>
<div>40</div> <div>40</div>

View File

@@ -80,3 +80,72 @@ code {
-ms-overflow-style: auto; -ms-overflow-style: auto;
} }
} }
input[type='range'] {
-webkit-appearance: none;
transition: background 450ms ease-in;
margin: 10px 0;
width: 100%;
background: theme('colors.secondary.main');
}
input[type='range']:focus {
outline: none;
}
input[type='range']::-webkit-slider-runnable-track {
width: 100%;
height: 0.875rem;
cursor: pointer;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border-radius: 25px;
border: 0px solid #000101;
}
input[type='range']::-webkit-slider-thumb {
-webkit-appearance: none;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border: 0px solid #000000;
height: 20px;
width: 20px;
border-radius: 100px;
background: theme('colors.primary.main');
cursor: pointer;
margin-top: -3px;
}
input[type='range']::-moz-range-track {
width: 100%;
height: 0.875rem;
cursor: pointer;
animate: 0.2s;
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border-radius: 25px;
border: 0px solid #000101;
}
input[type='range']::-moz-range-thumb {
box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
border: 0px solid #000000;
height: 20px;
width: 20px;
border-radius: 100px;
background: theme('colors.primary.main');
cursor: pointer;
}
input[type='range']::-ms-track {
width: 100%;
height: 0.875rem;
cursor: pointer;
animate: 0.2s;
background: transparent;
border-color: transparent;
border-width: 39px 0;
color: transparent;
}
input[type='range']::-ms-thumb {
height: 20px;
width: 20px;
border-radius: 100px;
background: theme('colors.primary.main');
cursor: pointer;
margin-top: -3px;
}