feat(#28): reorder new game steps and remove step labels

- Order: player1 → player2 → player3 → game type → race to → break type → first break
- Removed all step title labels from forms; kept progress dots only
- Adjusted navigation and back behavior accordingly

Refs #28
This commit is contained in:
Frank Schwenk
2025-10-30 12:01:39 +01:00
parent dc1d9a23a9
commit 81c7c9579b
2 changed files with 24 additions and 14 deletions

View File

@@ -127,7 +127,6 @@ const Player1Step = ({ playerNameHistory, onNext, onCancel, initialValue = '' }:
return ( return (
<form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Spieler 1 Eingabe" autoComplete="off"> <form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Spieler 1 Eingabe" autoComplete="off">
<div className={styles['screen-title']}>Neues Spiel Schritt {WIZARD_STEPS.PLAYER1}/{UI_CONSTANTS.TOTAL_WIZARD_STEPS}</div>
<div className={styles['progress-indicator']} style={{ marginBottom: UI_CONSTANTS.MARGIN_BOTTOM_MEDIUM }}> <div className={styles['progress-indicator']} style={{ marginBottom: UI_CONSTANTS.MARGIN_BOTTOM_MEDIUM }}>
<span className={styles['progress-dot'] + ' ' + styles['active']} /> <span className={styles['progress-dot'] + ' ' + styles['active']} />
<span className={styles['progress-dot']} /> <span className={styles['progress-dot']} />
@@ -354,7 +353,6 @@ const Player2Step = ({ playerNameHistory, onNext, onCancel, initialValue = '' }:
return ( return (
<form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Spieler 2 Eingabe" autoComplete="off"> <form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Spieler 2 Eingabe" autoComplete="off">
<div className={styles['screen-title']}>Neues Spiel Schritt 2/5</div>
<div className={styles['progress-indicator']} style={{ marginBottom: 24 }}> <div className={styles['progress-indicator']} style={{ marginBottom: 24 }}>
<span className={styles['progress-dot']} /> <span className={styles['progress-dot']} />
<span className={styles['progress-dot'] + ' ' + styles['active']} /> <span className={styles['progress-dot'] + ' ' + styles['active']} />
@@ -498,7 +496,6 @@ const Player3Step = ({ playerNameHistory, onNext, onCancel, initialValue = '' }:
return ( return (
<form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Spieler 3 Eingabe" autoComplete="off"> <form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Spieler 3 Eingabe" autoComplete="off">
<div className={styles['screen-title']}>Neues Spiel Schritt 3/5</div>
<div className={styles['progress-indicator']} style={{ marginBottom: 24 }}> <div className={styles['progress-indicator']} style={{ marginBottom: 24 }}>
<span className={styles['progress-dot']} /> <span className={styles['progress-dot']} />
<span className={styles['progress-dot']} /> <span className={styles['progress-dot']} />
@@ -626,7 +623,6 @@ const GameTypeStep = ({ onNext, onCancel, initialValue = '' }: GameTypeStepProps
return ( return (
<form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Spielart auswählen"> <form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Spielart auswählen">
<div className={styles['screen-title']}>Neues Spiel Schritt 4/5</div>
<div className={styles['progress-indicator']} style={{ marginBottom: 24 }}> <div className={styles['progress-indicator']} style={{ marginBottom: 24 }}>
<span className={styles['progress-dot']} /> <span className={styles['progress-dot']} />
<span className={styles['progress-dot']} /> <span className={styles['progress-dot']} />
@@ -730,7 +726,6 @@ const RaceToStep = ({ onNext, onCancel, initialValue = '', gameType }: RaceToSte
return ( return (
<form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Race To auswählen"> <form className={styles['new-game-form']} onSubmit={handleSubmit} aria-label="Race To auswählen">
<div className={styles['screen-title']}>Neues Spiel Schritt 5/5</div>
<div className={styles['progress-indicator']} style={{ marginBottom: 24 }}> <div className={styles['progress-indicator']} style={{ marginBottom: 24 }}>
<span className={styles['progress-dot']} /> <span className={styles['progress-dot']} />
<span className={styles['progress-dot']} /> <span className={styles['progress-dot']} />
@@ -805,7 +800,6 @@ const BreakRuleStep = ({ onNext, onCancel, initialValue = 'winnerbreak' }: Break
return ( return (
<form className={styles['new-game-form']} aria-label="Break-Regel wählen"> <form className={styles['new-game-form']} aria-label="Break-Regel wählen">
<div className={styles['screen-title']}>Neues Spiel Schritt 4/6</div>
<div style={{ display: 'flex', gap: 12, marginTop: 12 }}> <div style={{ display: 'flex', gap: 12, marginTop: 12 }}>
{[ {[
{ key: 'winnerbreak', label: 'Winnerbreak' }, { key: 'winnerbreak', label: 'Winnerbreak' },
@@ -858,7 +852,6 @@ const BreakOrderStep = ({ players, rule, onNext, onCancel }: BreakOrderStepProps
return ( return (
<form className={styles['new-game-form']} aria-label="Break-Reihenfolge wählen"> <form className={styles['new-game-form']} aria-label="Break-Reihenfolge wählen">
<div className={styles['screen-title']}>Neues Spiel Schritt 5/6</div>
<div style={{ marginBottom: 16, fontWeight: 600 }}>Wer bricht zuerst?</div> <div style={{ marginBottom: 16, fontWeight: 600 }}>Wer bricht zuerst?</div>
<div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}> <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>
{players.filter(Boolean).map((name, idx) => ( {players.filter(Boolean).map((name, idx) => (

View File

@@ -44,7 +44,7 @@ export default function NewGameScreen({
gameType: type as any, // Type assertion for now, could be improved with proper validation gameType: type as any, // Type assertion for now, could be improved with proper validation
raceTo: '8' raceTo: '8'
}); });
onStepChange('breakRule'); onStepChange('raceTo');
}; };
const handleBreakRuleNext = (rule: 'winnerbreak' | 'wechselbreak') => { const handleBreakRuleNext = (rule: 'winnerbreak' | 'wechselbreak') => {
@@ -54,12 +54,15 @@ export default function NewGameScreen({
const handleBreakOrderNext = (first: number, second?: number) => { const handleBreakOrderNext = (first: number, second?: number) => {
onDataChange({ breakFirst: first, breakSecond: second ?? '' }); onDataChange({ breakFirst: first, breakSecond: second ?? '' });
onStepChange('raceTo'); // Final step completes via RaceTo already
onStepChange(null);
}; };
const handleRaceToNext = (raceTo: string) => { const handleRaceToNext = (raceTo: string) => {
const finalData = { ...data, raceTo }; const finalData = { ...data, raceTo };
onCreateGame(finalData); // After race to, go to break rule selection
onDataChange({ raceTo });
onStepChange('breakRule');
}; };
const handleStepBack = () => { const handleStepBack = () => {
@@ -73,15 +76,12 @@ export default function NewGameScreen({
case 'gameType': case 'gameType':
onStepChange('player3'); onStepChange('player3');
break; break;
case 'breakRule': case 'raceTo':
onStepChange('gameType'); onStepChange('gameType');
break; break;
case 'breakOrder': case 'breakOrder':
onStepChange('breakRule'); onStepChange('breakRule');
break; break;
case 'raceTo':
onStepChange('breakOrder');
break;
default: default:
onCancel(); onCancel();
} }
@@ -149,6 +149,23 @@ export default function NewGameScreen({
gameType={data.gameType} gameType={data.gameType}
/> />
)} )}
{step === 'breakRule' && (
<BreakRuleStep
onNext={handleBreakRuleNext}
onCancel={handleStepBack}
initialValue={(data.breakRule as any) || 'winnerbreak'}
/>
)}
{step === 'breakOrder' && (
<BreakOrderStep
players={[data.player1, data.player2, data.player3]}
rule={(data.breakRule as any) || 'winnerbreak'}
onNext={handleBreakOrderNext}
onCancel={handleStepBack}
/>
)}
</Screen> </Screen>
); );
} }