11import type { SolveStep } from '../engine/types' ;
2- import { Play , Pause , SkipForward , SkipBack , RotateCcw } from 'lucide-react' ;
2+ import { Pause , SkipForward , SkipBack , RotateCcw , Wand2 , Turtle , Rabbit , Zap } from 'lucide-react' ;
3+
4+ const SPEED_PRESETS = [
5+ { label : 'Slow' , value : 1000 , icon : Turtle , color : 'from-emerald-600 to-green-600 hover:from-emerald-500 hover:to-green-500' } ,
6+ { label : 'Medium' , value : 400 , icon : Rabbit , color : 'from-violet-600 to-purple-600 hover:from-violet-500 hover:to-purple-500' } ,
7+ { label : 'Fast' , value : 120 , icon : Zap , color : 'from-amber-600 to-orange-600 hover:from-amber-500 hover:to-orange-500' } ,
8+ ] as const ;
39
410interface SolvePanelProps {
511 steps : SolveStep [ ] ;
612 currentStep : number ;
713 isPlaying : boolean ;
814 onStepForward : ( ) => void ;
915 onStepBackward : ( ) => void ;
10- onPlay : ( ) => void ;
1116 onPause : ( ) => void ;
1217 onReset : ( ) => void ;
18+ onAutoSolve ?: ( speed : number ) => void ;
1319 speed : number ;
14- onSpeedChange : ( speed : number ) => void ;
1520 guidedPhase : string ;
1621}
1722
1823const PHASE_COLORS : Record < string , string > = {
19- 'White Cross' : 'text-white' ,
20- 'White Corners' : 'text-slate-200' ,
21- 'Middle Layer' : 'text-blue-400' ,
22- 'Yellow Cross' : 'text-yellow-400' ,
23- 'Last Layer' : 'text-yellow-300' ,
24+ 'Undo Last Moves' : 'text-amber-400' ,
25+ 'Restoring Middle' : 'text-blue-400' ,
26+ 'Final Restoration' : 'text-emerald-400' ,
2427} ;
2528
2629export default function SolvePanel ( {
2730 steps, currentStep, isPlaying, onStepForward, onStepBackward,
28- onPlay , onPause, onReset, speed , onSpeedChange , guidedPhase,
31+ onPause, onReset, onAutoSolve , speed , guidedPhase,
2932} : SolvePanelProps ) {
3033 const progress = steps . length > 0 ? ( ( currentStep + 1 ) / steps . length ) * 100 : 0 ;
3134 const currentDesc = currentStep >= 0 && currentStep < steps . length
@@ -76,7 +79,47 @@ export default function SolvePanel({
7679 ) }
7780 </ div >
7881
79- { /* Controls */ }
82+ { /* Auto Solve with speed presets */ }
83+ { onAutoSolve && currentStep < steps . length - 1 && ! isPlaying && (
84+ < div className = "space-y-1.5" >
85+ < div className = "flex items-center gap-1.5 text-[10px] text-slate-500 uppercase font-semibold" >
86+ < Wand2 size = { 10 } /> Auto Solve
87+ </ div >
88+ < div className = "grid grid-cols-3 gap-1.5" >
89+ { SPEED_PRESETS . map ( ( { label, value, icon : Icon , color } ) => (
90+ < button
91+ key = { label }
92+ onClick = { ( ) => onAutoSolve ( value ) }
93+ className = { `flex flex-col items-center gap-0.5 py-2 rounded-lg
94+ bg-gradient-to-r ${ color }
95+ text-white text-[10px] font-semibold transition-all` }
96+ >
97+ < Icon size = { 14 } />
98+ { label }
99+ </ button >
100+ ) ) }
101+ </ div >
102+ </ div >
103+ ) }
104+
105+ { /* During auto-solve, show pause */ }
106+ { isPlaying && (
107+ < div className = "flex items-center gap-2" >
108+ < button
109+ onClick = { onPause }
110+ className = "flex-1 flex items-center justify-center gap-1.5 py-2 rounded-lg
111+ bg-gradient-to-r from-red-600 to-rose-600 hover:from-red-500 hover:to-rose-500
112+ text-white text-xs font-semibold transition-all"
113+ >
114+ < Pause size = { 14 } /> Pause
115+ </ button >
116+ < div className = "text-[10px] text-slate-500" >
117+ { speed <= 150 ? '⚡ Fast' : speed <= 500 ? '🐇 Medium' : '🐢 Slow' }
118+ </ div >
119+ </ div >
120+ ) }
121+
122+ { /* Step controls */ }
80123 < div className = "flex items-center gap-1.5" >
81124 < button
82125 onClick = { onReset }
@@ -87,50 +130,22 @@ export default function SolvePanel({
87130 </ button >
88131 < button
89132 onClick = { onStepBackward }
90- disabled = { currentStep < 0 }
133+ disabled = { currentStep < 0 || isPlaying }
91134 className = "p-2 rounded-lg bg-slate-800 hover:bg-slate-700 text-slate-400 hover:text-white
92135 disabled:opacity-30 disabled:cursor-not-allowed transition-colors"
93136 title = "Step Back"
94137 >
95138 < SkipBack size = { 14 } />
96139 </ button >
97140 < button
98- onClick = { isPlaying ? onPause : onPlay }
99- disabled = { steps . length === 0 || currentStep >= steps . length - 1 }
141+ onClick = { onStepForward }
142+ disabled = { currentStep >= steps . length - 1 || isPlaying }
100143 className = "flex-1 flex items-center justify-center gap-1.5 py-2 rounded-lg
101144 bg-gradient-to-r from-cyan-600 to-teal-600 hover:from-cyan-500 hover:to-teal-500
102145 text-white text-xs font-semibold disabled:opacity-30 disabled:cursor-not-allowed transition-all"
103146 >
104- { isPlaying ? < > < Pause size = { 14 } /> Pause </ > : < > < Play size = { 14 } /> Play </ > }
147+ < SkipForward size = { 14 } /> Next Step
105148 </ button >
106- < button
107- onClick = { onStepForward }
108- disabled = { currentStep >= steps . length - 1 }
109- className = "p-2 rounded-lg bg-slate-800 hover:bg-slate-700 text-slate-400 hover:text-white
110- disabled:opacity-30 disabled:cursor-not-allowed transition-colors"
111- title = "Step Forward"
112- >
113- < SkipForward size = { 14 } />
114- </ button >
115- </ div >
116-
117- { /* Speed control */ }
118- < div className = "space-y-1" >
119- < div className = "flex justify-between text-[10px] text-slate-500" >
120- < span > Speed</ span >
121- < span > { speed } ms</ span >
122- </ div >
123- < input
124- type = "range"
125- min = { 100 }
126- max = { 2000 }
127- step = { 100 }
128- value = { speed }
129- onChange = { e => onSpeedChange ( Number ( e . target . value ) ) }
130- className = "w-full h-1 bg-slate-700 rounded-lg appearance-none cursor-pointer
131- [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3
132- [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-cyan-500"
133- />
134149 </ div >
135150
136151 { /* Steps list */ }
0 commit comments