|
import React from 'react'; |
|
import type { OutputType, CompressionOptions } from '../types'; |
|
|
|
interface CompressionOptionsProps { |
|
options: CompressionOptions; |
|
outputType: OutputType; |
|
onOptionsChange: (options: CompressionOptions) => void; |
|
onOutputTypeChange: (type: OutputType) => void; |
|
} |
|
|
|
export function CompressionOptions({ |
|
options, |
|
outputType, |
|
onOptionsChange, |
|
onOutputTypeChange, |
|
}: CompressionOptionsProps) { |
|
return ( |
|
<div className="space-y-6 bg-white p-6 rounded-lg shadow-sm"> |
|
<div> |
|
<label className="block text-sm font-medium text-gray-700 mb-2"> |
|
Output Format |
|
</label> |
|
<div className="grid grid-cols-2 sm:grid-cols-5 gap-2"> |
|
{(['avif', 'jpeg', 'jxl', 'png', 'webp'] as const).map((format) => ( |
|
<button |
|
key={format} |
|
className={`px-4 py-2 rounded-md text-sm font-medium uppercase ${ |
|
outputType === format |
|
? 'bg-blue-500 text-white' |
|
: 'bg-gray-100 text-gray-700 hover:bg-gray-200' |
|
}`} |
|
onClick={() => onOutputTypeChange(format)} |
|
> |
|
{format} |
|
</button> |
|
))} |
|
</div> |
|
</div> |
|
|
|
{outputType !== 'png' && ( |
|
<div> |
|
<label className="block text-sm font-medium text-gray-700 mb-2"> |
|
Quality: {options.quality}% |
|
</label> |
|
<input |
|
type="range" |
|
min="1" |
|
max="100" |
|
value={options.quality} |
|
onChange={(e) => |
|
onOptionsChange({ quality: Number(e.target.value) }) |
|
} |
|
className="w-full" |
|
/> |
|
</div> |
|
)} |
|
</div> |
|
); |
|
} |