import React, { useState } from 'react'; import ToolImageInput from '@components/input/ToolImageInput'; import ToolFileResult from '@components/result/ToolFileResult'; import { changeOpacity } from './service'; import ToolContent from '@components/ToolContent'; import TextFieldWithDesc from '@components/options/TextFieldWithDesc'; import { CardExampleType } from '@components/examples/ToolExamples'; import { ToolComponentProps } from '@tools/defineTool'; import { updateNumberField } from '@utils/string'; import { Box } from '@mui/material'; import SimpleRadio from '@components/options/SimpleRadio'; type InitialValuesType = { opacity: number; mode: 'solid' | 'gradient'; gradientType: 'linear' | 'radial'; gradientDirection: 'left-to-right' | 'inside-out'; areaLeft: number; areaTop: number; areaWidth: number; areaHeight: number; }; const initialValues: InitialValuesType = { opacity: 0.5, mode: 'solid', gradientType: 'linear', gradientDirection: 'left-to-right', areaLeft: 0, areaTop: 0, areaWidth: 100, areaHeight: 100 }; const exampleCards: CardExampleType[] = [ { title: 'Semi-transparent PNG', description: 'Make an image 50% transparent', sampleOptions: { opacity: 0.5, mode: 'solid', gradientType: 'linear', gradientDirection: 'left-to-right', areaLeft: 0, areaTop: 0, areaWidth: 100, areaHeight: 100 }, sampleResult: '' }, { title: 'Slightly Faded PNG', description: 'Create a subtle transparency effect', sampleOptions: { opacity: 0.8, mode: 'solid', gradientType: 'linear', gradientDirection: 'left-to-right', areaLeft: 0, areaTop: 0, areaWidth: 100, areaHeight: 100 }, sampleResult: '' }, { title: 'Radial Gradient Opacity', description: 'Apply a radial gradient opacity effect', sampleOptions: { opacity: 0.8, mode: 'gradient', gradientType: 'radial', gradientDirection: 'inside-out', areaLeft: 25, areaTop: 25, areaWidth: 50, areaHeight: 50 }, sampleResult: '' } ]; export default function ChangeOpacity({ title }: ToolComponentProps) { const [input, setInput] = useState(null); const [result, setResult] = useState(null); const compute = (values: InitialValuesType, input: any) => { if (input) { changeOpacity(input, values).then(setResult); } }; return ( } resultComponent={ } initialValues={initialValues} // exampleCards={exampleCards} getGroups={({ values, updateField }) => [ { title: 'Opacity Settings', component: ( updateNumberField(val, 'opacity', updateField) } type="number" inputProps={{ step: 0.1, min: 0, max: 1 }} /> updateField('mode', 'solid')} checked={values.mode === 'solid'} description={'Set the same opacity level for all pixels'} title={'Apply Solid Opacity'} /> updateField('mode', 'gradient')} checked={values.mode === 'gradient'} description={'Change opacity in a gradient'} title={'Apply Gradient Opacity'} /> ) }, { title: 'Gradient Options', component: ( updateField('gradientType', 'linear')} checked={values.gradientType === 'linear'} description={'Linear opacity direction'} title={'Linear Gradient'} /> updateField('gradientType', 'radial')} checked={values.gradientType === 'radial'} description={'Radial opacity direction'} title={'Radial Gradient'} /> ) }, { title: 'Opacity Area', component: ( updateNumberField(val, 'areaLeft', updateField) } type="number" /> updateNumberField(val, 'areaTop', updateField) } type="number" /> updateNumberField(val, 'areaWidth', updateField) } type="number" /> updateNumberField(val, 'areaHeight', updateField) } type="number" /> ) } ]} compute={compute} /> ); }