feat: ui changes

This commit is contained in:
Ibrahima G. Coulibaly
2025-02-25 06:17:10 +00:00
parent 8917c3c2ec
commit d4c544609a
35 changed files with 190 additions and 68 deletions

65
.idea/workspace.xml generated
View File

@@ -4,8 +4,43 @@
<option name="autoReloadType" value="SELECTIVE" /> <option name="autoReloadType" value="SELECTIVE" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="fix: docs"> <list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="feat: funding">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/package-lock.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/scripts/create-tool.mjs" beforeDir="false" afterPath="$PROJECT_DIR$/scripts/create-tool.mjs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/Hero.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Hero.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/Navbar/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Navbar/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/ToolHeader.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/ToolHeader.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/ToolLayout.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/ToolLayout.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/input/ToolFileInput.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/input/ToolFileInput.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/input/ToolTextInput.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/input/ToolTextInput.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/result/ToolFileResult.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/result/ToolFileResult.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/components/result/ToolTextResult.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/result/ToolTextResult.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/config/uiConfig.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/config/uiConfig.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/home/Categories.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/home/Categories.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/home/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/home/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools-by-category/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools-by-category/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/png/change-colors-in-png/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/png/change-colors-in-png/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/png/compress-png/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/png/compress-png/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/png/convert-jgp-to-png/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/png/convert-jgp-to-png/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/png/create-transparent/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/png/create-transparent/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/find-most-popular/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/find-most-popular/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/find-unique/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/find-unique/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/group/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/group/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/reverse/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/reverse/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/rotate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/rotate/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/shuffle/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/shuffle/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/sort/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/sort/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/list/unwrap/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/list/unwrap/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/generate/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/generate/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/sum/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/sum/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/join/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/join/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/split/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/split/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/string/to-morse/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/to-morse/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/gif/change-speed/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/gif/change-speed/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/tools/defineTool.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/tools/defineTool.tsx" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -76,7 +111,7 @@
&quot;git-widget-placeholder&quot;: &quot;main&quot;, &quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;, &quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;, &quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;last_opened_file_path&quot;: &quot;C:/Users/Ibrahima/IdeaProjects/omni-tools/src/assets&quot;, &quot;last_opened_file_path&quot;: &quot;C:/Users/Ibrahima/IdeaProjects/omni-tools/.github&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;, &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;, &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;, &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
@@ -109,11 +144,11 @@
</component> </component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\.github" />
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\assets" /> <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\assets" />
<recent name="C:\Users\HP\IdeaProjects\omni-tools\src\components\options" /> <recent name="C:\Users\HP\IdeaProjects\omni-tools\src\components\options" />
<recent name="C:\Users\HP\IdeaProjects\omni-tools\src\assets" /> <recent name="C:\Users\HP\IdeaProjects\omni-tools\src\assets" />
<recent name="C:\Users\HP\IdeaProjects\omni-tools\src\pages\string" /> <recent name="C:\Users\HP\IdeaProjects\omni-tools\src\pages\string" />
<recent name="C:\Users\HP\IdeaProjects\omni-tools\src\pages\string\split" />
</key> </key>
<key name="MoveFile.RECENT_KEYS"> <key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\pages\tools" /> <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\pages\tools" />
@@ -255,14 +290,8 @@
<workItem from="1740318886545" duration="856000" /> <workItem from="1740318886545" duration="856000" />
<workItem from="1740348963270" duration="388000" /> <workItem from="1740348963270" duration="388000" />
<workItem from="1740399426653" duration="627000" /> <workItem from="1740399426653" duration="627000" />
</task> <workItem from="1740459961271" duration="66000" />
<task id="LOCAL-00061" summary="feat: make responsive"> <workItem from="1740460036909" duration="4124000" />
<option name="closed" value="true" />
<created>1719358195260</created>
<option name="number" value="00061" />
<option name="presentableId" value="LOCAL-00061" />
<option name="project" value="LOCAL" />
<updated>1719358195260</updated>
</task> </task>
<task id="LOCAL-00062" summary="feat: make tool responsive"> <task id="LOCAL-00062" summary="feat: make tool responsive">
<option name="closed" value="true" /> <option name="closed" value="true" />
@@ -648,7 +677,15 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1740324274955</updated> <updated>1740324274955</updated>
</task> </task>
<option name="localTasksCounter" value="110" /> <task id="LOCAL-00110" summary="feat: funding">
<option name="closed" value="true" />
<created>1740460017596</created>
<option name="number" value="00110" />
<option name="presentableId" value="LOCAL-00110" />
<option name="project" value="LOCAL" />
<updated>1740460017596</updated>
</task>
<option name="localTasksCounter" value="111" />
<servers /> <servers />
</component> </component>
<component name="TypeScriptGeneratedFilesManager"> <component name="TypeScriptGeneratedFilesManager">
@@ -680,7 +717,6 @@
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" /> <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
<option name="CHECK_NEW_TODO" value="false" /> <option name="CHECK_NEW_TODO" value="false" />
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" /> <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
<MESSAGE value="ci: run e2e tests" />
<MESSAGE value="fix: ci" /> <MESSAGE value="fix: ci" />
<MESSAGE value="chore: jimp types" /> <MESSAGE value="chore: jimp types" />
<MESSAGE value="fix: package.json" /> <MESSAGE value="fix: package.json" />
@@ -705,7 +741,8 @@
<MESSAGE value="feat: compress png" /> <MESSAGE value="feat: compress png" />
<MESSAGE value="fix: compress png" /> <MESSAGE value="fix: compress png" />
<MESSAGE value="fix: docs" /> <MESSAGE value="fix: docs" />
<option name="LAST_COMMIT_MESSAGE" value="fix: docs" /> <MESSAGE value="feat: funding" />
<option name="LAST_COMMIT_MESSAGE" value="feat: funding" />
</component> </component>
<component name="XSLT-Support.FileAssociations.UIState"> <component name="XSLT-Support.FileAssociations.UIState">
<expand /> <expand />

View File

@@ -1,5 +1,4 @@
<p align="center"><img src="src/assets/logo.png" width="80"></p> <p align="center"><img src="src/assets/logo.png" width="150"></p>
<h1 align="center">OmniTools</h1>
[//]: # ([![Docker Pulls]&#40;https://img.shields.io/docker/pulls/iib0011/omni-tools&#41;]&#40;https://hub.docker.com/r/iib0011/omni-tools&#41;) [//]: # ([![Docker Pulls]&#40;https://img.shields.io/docker/pulls/iib0011/omni-tools&#41;]&#40;https://hub.docker.com/r/iib0011/omni-tools&#41;)
@@ -100,7 +99,7 @@ npm run test
npm run test:e2e npm run test:e2e
``` ```
[//]: # (<img src="https://api.star-history.com/svg?repos=iib0011/omni-tools&type=Date">) <img src="https://api.star-history.com/svg?repos=iib0011/omni-tools&type=Date">
## 🤝 Looking to contribute? ## 🤝 Looking to contribute?

24
package-lock.json generated
View File

@@ -37,6 +37,7 @@
"devDependencies": { "devDependencies": {
"@commitlint/cli": "^19.3.0", "@commitlint/cli": "^19.3.0",
"@commitlint/config-conventional": "^19.2.2", "@commitlint/config-conventional": "^19.2.2",
"@iconify/react": "^5.2.0",
"@testing-library/jest-dom": "^6.4.5", "@testing-library/jest-dom": "^6.4.5",
"@testing-library/react": "^14.3.1", "@testing-library/react": "^14.3.1",
"@types/color": "^3.0.6", "@types/color": "^3.0.6",
@@ -1472,6 +1473,29 @@
"deprecated": "Use @eslint/object-schema instead", "deprecated": "Use @eslint/object-schema instead",
"dev": true "dev": true
}, },
"node_modules/@iconify/react": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@iconify/react/-/react-5.2.0.tgz",
"integrity": "sha512-7Sdjrqq3fkkQNks9SY3adGC37NQTHsBJL2PRKlQd455PoDi9s+Es9AUTY+vGLFOYs5yO9w9yCE42pmxCwG26WA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@iconify/types": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/cyberalien"
},
"peerDependencies": {
"react": ">=16"
}
},
"node_modules/@iconify/types": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
"dev": true,
"license": "MIT"
},
"node_modules/@isaacs/cliui": { "node_modules/@isaacs/cliui": {
"version": "8.0.2", "version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",

View File

@@ -54,6 +54,7 @@
"devDependencies": { "devDependencies": {
"@commitlint/cli": "^19.3.0", "@commitlint/cli": "^19.3.0",
"@commitlint/config-conventional": "^19.2.2", "@commitlint/config-conventional": "^19.2.2",
"@iconify/react": "^5.2.0",
"@testing-library/jest-dom": "^6.4.5", "@testing-library/jest-dom": "^6.4.5",
"@testing-library/react": "^14.3.1", "@testing-library/react": "^14.3.1",
"@types/color": "^3.0.6", "@types/color": "^3.0.6",

View File

@@ -92,12 +92,11 @@ createToolFile(
` `
import { defineTool } from '@tools/defineTool'; import { defineTool } from '@tools/defineTool';
import { lazy } from 'react'; import { lazy } from 'react';
// import image from '@assets/text.png';
export const tool = defineTool('${type}', { export const tool = defineTool('${type}', {
name: '${toolNameTitleCase}', name: '${toolNameTitleCase}',
path: '${toolName}', path: '${toolName}',
// image, icon: '',
description: '', description: '',
shortDescription: '', shortDescription: '',
keywords: ['${toolName.split('-').join("', '")}'], keywords: ['${toolName.split('-').join("', '")}'],

View File

@@ -75,7 +75,8 @@ export default function Hero() {
...params.InputProps, ...params.InputProps,
endAdornment: <SearchIcon />, endAdornment: <SearchIcon />,
sx: { sx: {
borderRadius: 4 borderRadius: 4,
backgroundColor: 'white'
} }
}} }}
onChange={(event) => handleInputChange(event, event.target.value)} onChange={(event) => handleInputChange(event, event.target.value)}
@@ -114,6 +115,7 @@ export default function Hero() {
borderRadius: 3, borderRadius: 3,
borderColor: 'grey', borderColor: 'grey',
borderStyle: 'solid', borderStyle: 'solid',
backgroundColor: 'white',
cursor: 'pointer', cursor: 'pointer',
'&:hover': { backgroundColor: '#FAFAFD' } '&:hover': { backgroundColor: '#FAFAFD' }
}} }}

View File

@@ -50,9 +50,18 @@ const Navbar: React.FC = () => {
return ( return (
<AppBar <AppBar
position="static" position="static"
style={{ backgroundColor: 'white', color: 'black' }} style={{
backgroundColor: 'white',
color: 'black'
}}
> >
<Toolbar sx={{ justifyContent: 'space-between', alignItems: 'center' }}> <Toolbar
sx={{
justifyContent: 'space-between',
alignItems: 'center',
boxShadow: '0px 2px 2px #C8C9CE'
}}
>
<img <img
onClick={() => navigate('/')} onClick={() => navigate('/')}
style={{ cursor: 'pointer' }} style={{ cursor: 'pointer' }}

View File

@@ -3,11 +3,13 @@ import Typography from '@mui/material/Typography';
import ToolBreadcrumb from './ToolBreadcrumb'; import ToolBreadcrumb from './ToolBreadcrumb';
import { capitalizeFirstLetter } from '../utils/string'; import { capitalizeFirstLetter } from '../utils/string';
import Grid from '@mui/material/Grid'; import Grid from '@mui/material/Grid';
import { Icon, IconifyIcon } from '@iconify/react';
import { categoriesColors } from '../config/uiConfig';
interface ToolHeaderProps { interface ToolHeaderProps {
title: string; title: string;
description: string; description: string;
image?: string; icon?: IconifyIcon;
type: string; type: string;
} }
@@ -15,17 +17,32 @@ function ToolLinks() {
return ( return (
<Grid container spacing={2} mt={1}> <Grid container spacing={2} mt={1}>
<Grid item md={12} lg={4}> <Grid item md={12} lg={4}>
<Button fullWidth variant="outlined" href="#tool"> <Button
sx={{ backgroundColor: 'white' }}
fullWidth
variant="outlined"
href="#tool"
>
Use This Tool Use This Tool
</Button> </Button>
</Grid> </Grid>
<Grid item md={12} lg={4}> <Grid item md={12} lg={4}>
<Button fullWidth variant="outlined" href="#examples"> <Button
sx={{ backgroundColor: 'white' }}
fullWidth
variant="outlined"
href="#examples"
>
See Examples See Examples
</Button> </Button>
</Grid> </Grid>
<Grid item md={12} lg={4}> <Grid item md={12} lg={4}>
<Button fullWidth variant="outlined" href="#tour"> <Button
sx={{ backgroundColor: 'white' }}
fullWidth
variant="outlined"
href="#tour"
>
Learn How to Use Learn How to Use
</Button> </Button>
</Grid> </Grid>
@@ -34,7 +51,7 @@ function ToolLinks() {
} }
export default function ToolHeader({ export default function ToolHeader({
image, icon,
title, title,
description, description,
type type
@@ -60,10 +77,18 @@ export default function ToolHeader({
<ToolLinks /> <ToolLinks />
</Grid> </Grid>
{image && ( {icon && (
<Grid item xs={12} md={4}> <Grid item xs={12} md={4}>
<Box sx={{ display: 'flex', justifyContent: 'center' }}> <Box sx={{ display: 'flex', justifyContent: 'center' }}>
<img width={'250'} src={image} /> <Icon
icon={icon}
fontSize={'250'}
color={
categoriesColors[
Math.floor(Math.random() * categoriesColors.length)
]
}
/>
</Box> </Box>
</Grid> </Grid>
)} )}

View File

@@ -6,17 +6,18 @@ import Separator from './Separator';
import AllTools from './allTools/AllTools'; import AllTools from './allTools/AllTools';
import { getToolsByCategory } from '@tools/index'; import { getToolsByCategory } from '@tools/index';
import { capitalizeFirstLetter } from '../utils/string'; import { capitalizeFirstLetter } from '../utils/string';
import { IconifyIcon } from '@iconify/react';
export default function ToolLayout({ export default function ToolLayout({
children, children,
title, title,
description, description,
image, icon,
type type
}: { }: {
title: string; title: string;
description: string; description: string;
image?: string; icon?: IconifyIcon | string;
type: string; type: string;
children: ReactNode; children: ReactNode;
}) { }) {
@@ -36,6 +37,7 @@ export default function ToolLayout({
display={'flex'} display={'flex'}
flexDirection={'column'} flexDirection={'column'}
alignItems={'center'} alignItems={'center'}
sx={{ backgroundColor: '#F5F5FA' }}
> >
<Helmet> <Helmet>
<title>{`${title} - Omni Tools`}</title> <title>{`${title} - Omni Tools`}</title>
@@ -44,7 +46,7 @@ export default function ToolLayout({
<ToolHeader <ToolHeader
title={title} title={title}
description={description} description={description}
image={image} icon={icon}
type={type} type={type}
/> />
{children} {children}

View File

@@ -83,7 +83,8 @@ export default function ToolFileInput({
height: globalInputHeight, height: globalInputHeight,
border: preview ? 0 : 1, border: preview ? 0 : 1,
borderRadius: 2, borderRadius: 2,
boxShadow: '5' boxShadow: '5',
bgcolor: 'white'
}} }}
> >
{preview ? ( {preview ? (

View File

@@ -50,7 +50,14 @@ export default function ToolTextInput({
fullWidth fullWidth
multiline multiline
rows={10} rows={10}
inputProps={{ 'data-testid': 'text-input' }} sx={{
'&.MuiTextField-root': {
backgroundColor: 'white'
}
}}
inputProps={{
'data-testid': 'text-input'
}}
/> />
<InputFooter handleCopy={handleCopy} handleImport={handleImportClick} /> <InputFooter handleCopy={handleCopy} handleImport={handleImportClick} />
<input <input

View File

@@ -67,7 +67,8 @@ export default function ToolFileResult({
height: globalInputHeight, height: globalInputHeight,
border: preview ? 0 : 1, border: preview ? 0 : 1,
borderRadius: 2, borderRadius: 2,
boxShadow: '5' boxShadow: '5',
bgcolor: 'white'
}} }}
> >
{preview && ( {preview && (

View File

@@ -41,6 +41,11 @@ export default function ToolTextResult({
value={replaceSpecialCharacters(value)} value={replaceSpecialCharacters(value)}
fullWidth fullWidth
multiline multiline
sx={{
'&.MuiTextField-root': {
backgroundColor: 'white'
}
}}
rows={10} rows={10}
inputProps={{ 'data-testid': 'text-result' }} inputProps={{ 'data-testid': 'text-result' }}
/> />

View File

@@ -1,2 +1,8 @@
export const globalInputHeight = 300; export const globalInputHeight = 300;
export const globalDescriptionFontSize = 12; export const globalDescriptionFontSize = 12;
export const categoriesColors: string[] = [
'#8FBC5D',
'#3CB6E2',
'#FFD400',
'#AB6993'
];

View File

@@ -5,7 +5,7 @@ import Categories from './Categories';
export default function Home() { export default function Home() {
return ( return (
<Box <Box
padding={{ xs: 1, md: 3, lg: 5 }} padding={{ xs: 1, md: 3, lg: 5, backgroundColor: '#F5F5FA' }}
display={'flex'} display={'flex'}
flexDirection={'column'} flexDirection={'column'}
alignItems={'center'} alignItems={'center'}

View File

@@ -5,14 +5,15 @@ import { Link, useNavigate, useParams } from 'react-router-dom';
import { getToolsByCategory } from '../../tools'; import { getToolsByCategory } from '../../tools';
import Hero from 'components/Hero'; import Hero from 'components/Hero';
import { capitalizeFirstLetter } from '../../utils/string'; import { capitalizeFirstLetter } from '../../utils/string';
import toolsPng from '@assets/tools.png'; import { Icon } from '@iconify/react';
import { categoriesColors } from 'config/uiConfig';
export default function Home() { export default function Home() {
const navigate = useNavigate(); const navigate = useNavigate();
const theme = useTheme(); const theme = useTheme();
const { categoryName } = useParams(); const { categoryName } = useParams();
return ( return (
<Box> <Box sx={{ backgroundColor: '#F5F5FA' }}>
<Box <Box
padding={{ xs: 1, md: 3, lg: 5 }} padding={{ xs: 1, md: 3, lg: 5 }}
display={'flex'} display={'flex'}
@@ -32,10 +33,12 @@ export default function Home() {
<Grid container spacing={2} mt={2}> <Grid container spacing={2} mt={2}>
{getToolsByCategory() {getToolsByCategory()
.find(({ type }) => type === categoryName) .find(({ type }) => type === categoryName)
?.tools?.map((tool) => ( ?.tools?.map((tool, index) => (
<Grid item xs={12} md={6} lg={4} key={tool.path}> <Grid item xs={12} md={6} lg={4} key={tool.path}>
<Stack <Stack
sx={{ sx={{
backgroundColor: 'white',
boxShadow: '5px 4px 2px #E9E9ED',
cursor: 'pointer', cursor: 'pointer',
'&:hover': { '&:hover': {
backgroundColor: theme.palette.background.default // Change this to your desired hover color backgroundColor: theme.palette.background.default // Change this to your desired hover color
@@ -45,10 +48,14 @@ export default function Home() {
direction={'row'} direction={'row'}
spacing={2} spacing={2}
padding={2} padding={2}
border={1} border={`1px solid ${theme.palette.background.default}`}
borderRadius={2} borderRadius={2}
> >
<img width={100} src={tool.image ?? toolsPng} /> <Icon
icon={tool.icon ?? 'ph:compass-tool-thin'}
fontSize={'100px'}
color={categoriesColors[index % categoriesColors.length]}
/>
<Box> <Box>
<Link to={'/' + tool.path}>{tool.name}</Link> <Link to={'/' + tool.path}>{tool.name}</Link>
<Typography sx={{ mt: 2 }}> <Typography sx={{ mt: 2 }}>

View File

@@ -1,11 +1,10 @@
import { defineTool } from '@tools/defineTool'; import { defineTool } from '@tools/defineTool';
import { lazy } from 'react'; import { lazy } from 'react';
import image from '@assets/image.png';
export const tool = defineTool('png', { export const tool = defineTool('png', {
name: 'Change colors in png', name: 'Change colors in png',
path: 'change-colors-in-png', path: 'change-colors-in-png',
image, icon: 'cil:color-fill',
description: description:
"World's simplest online Portable Network Graphics (PNG) color changer. Just import your PNG image in the editor on the left, select which colors to change, and you'll instantly get a new PNG with the new colors on the right. Free, quick, and very powerful. Import a PNG replace its colors.", "World's simplest online Portable Network Graphics (PNG) color changer. Just import your PNG image in the editor on the left, select which colors to change, and you'll instantly get a new PNG with the new colors on the right. Free, quick, and very powerful. Import a PNG replace its colors.",
shortDescription: 'Quickly swap colors in a PNG image', shortDescription: 'Quickly swap colors in a PNG image',

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('png', { export const tool = defineTool('png', {
name: 'Compress png', name: 'Compress png',
path: 'compress-png', path: 'compress-png',
// image, icon: 'material-symbols-light:compress',
description: description:
'This is a program that compresses PNG pictures. As soon as you paste your PNG picture in the input area, the program will compress it and show the result in the output area. In the options, you can adjust the compression level, as well as find the old and new picture file sizes.', 'This is a program that compresses PNG pictures. As soon as you paste your PNG picture in the input area, the program will compress it and show the result in the output area. In the options, you can adjust the compression level, as well as find the old and new picture file sizes.',
shortDescription: 'Quicly compress a PNG', shortDescription: 'Quicly compress a PNG',

View File

@@ -1,11 +1,10 @@
import { defineTool } from '@tools/defineTool'; import { defineTool } from '@tools/defineTool';
import { lazy } from 'react'; import { lazy } from 'react';
import image from '@assets/image.png';
export const tool = defineTool('png', { export const tool = defineTool('png', {
name: 'Convert JPG to PNG', name: 'Convert JPG to PNG',
path: 'convert-jgp-to-png', path: 'convert-jgp-to-png',
image, icon: 'ph:file-jpg-thin',
description: description:
'Quickly convert your JPG images to PNG. Just import your PNG image in the editor on the left', 'Quickly convert your JPG images to PNG. Just import your PNG image in the editor on the left',
shortDescription: 'Quickly convert your JPG images to PNG', shortDescription: 'Quickly convert your JPG images to PNG',

View File

@@ -1,11 +1,10 @@
import { defineTool } from '@tools/defineTool'; import { defineTool } from '@tools/defineTool';
import { lazy } from 'react'; import { lazy } from 'react';
import image from '@assets/image.png';
export const tool = defineTool('png', { export const tool = defineTool('png', {
name: 'Create transparent PNG', name: 'Create transparent PNG',
path: 'create-transparent', path: 'create-transparent',
image, icon: 'mdi:circle-transparent',
shortDescription: 'Quickly make a PNG image transparent', shortDescription: 'Quickly make a PNG image transparent',
description: description:
"World's simplest online Portable Network Graphics transparency maker. Just import your PNG image in the editor on the left and you will instantly get a transparent PNG on the right. Free, quick, and very powerful. Import a PNG get a transparent PNG.", "World's simplest online Portable Network Graphics transparency maker. Just import your PNG image in the editor on the left and you will instantly get a transparent PNG on the right. Free, quick, and very powerful. Import a PNG get a transparent PNG.",

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('list', { export const tool = defineTool('list', {
name: 'Find most popular', name: 'Find most popular',
path: 'find-most-popular', path: 'find-most-popular',
// image, icon: 'material-symbols-light:query-stats',
description: '', description: '',
shortDescription: '', shortDescription: '',
keywords: ['find', 'most', 'popular'], keywords: ['find', 'most', 'popular'],

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('list', { export const tool = defineTool('list', {
name: 'Find unique', name: 'Find unique',
path: 'find-unique', path: 'find-unique',
// image, icon: 'mynaui:one',
description: '', description: '',
shortDescription: '', shortDescription: '',
keywords: ['find', 'unique'], keywords: ['find', 'unique'],

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('list', { export const tool = defineTool('list', {
name: 'Group', name: 'Group',
path: 'group', path: 'group',
// image, icon: 'pajamas:group',
description: '', description: '',
shortDescription: '', shortDescription: '',
keywords: ['group'], keywords: ['group'],

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('list', { export const tool = defineTool('list', {
name: 'Reverse', name: 'Reverse',
path: 'reverse', path: 'reverse',
// image, icon: 'proicons:reverse',
description: '', description: '',
shortDescription: '', shortDescription: '',
keywords: ['reverse'], keywords: ['reverse'],

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('list', { export const tool = defineTool('list', {
name: 'Rotate', name: 'Rotate',
path: 'rotate', path: 'rotate',
// image, icon: 'material-symbols-light:rotate-right',
description: '', description: '',
shortDescription: '', shortDescription: '',
keywords: ['rotate'], keywords: ['rotate'],

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('list', { export const tool = defineTool('list', {
name: 'Shuffle', name: 'Shuffle',
path: 'shuffle', path: 'shuffle',
// image, icon: 'material-symbols-light:shuffle',
description: '', description: '',
shortDescription: '', shortDescription: '',
keywords: ['shuffle'], keywords: ['shuffle'],

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('list', { export const tool = defineTool('list', {
name: 'Sort', name: 'Sort',
path: 'sort', path: 'sort',
// image, icon: 'basil:sort-outline',
description: description:
'This is a super simple browser-based application that sorts items in a list and arranges them in increasing or decreasing order. You can sort the items alphabetically, numerically, or by their length. You can also remove duplicate and empty items, as well as trim individual items that have whitespace around them. You can use any separator character to separate the input list items or alternatively use a regular expression to separate them. Additionally, you can create a new delimiter for the sorted output list.', 'This is a super simple browser-based application that sorts items in a list and arranges them in increasing or decreasing order. You can sort the items alphabetically, numerically, or by their length. You can also remove duplicate and empty items, as well as trim individual items that have whitespace around them. You can use any separator character to separate the input list items or alternatively use a regular expression to separate them. Additionally, you can create a new delimiter for the sorted output list.',
shortDescription: 'Quickly sort a list', shortDescription: 'Quickly sort a list',

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('list', { export const tool = defineTool('list', {
name: 'Unwrap', name: 'Unwrap',
path: 'unwrap', path: 'unwrap',
// image, icon: 'mdi:unwrap',
description: '', description: '',
shortDescription: '', shortDescription: '',
keywords: ['unwrap'], keywords: ['unwrap'],

View File

@@ -6,7 +6,7 @@ export const tool = defineTool('number', {
name: 'Generate numbers', name: 'Generate numbers',
path: 'generate', path: 'generate',
shortDescription: 'Quickly calculate a list of integers in your browser', shortDescription: 'Quickly calculate a list of integers in your browser',
// image, icon: 'lsicon:number-filled',
description: description:
'Quickly calculate a list of integers in your browser. To get your list, just specify the first integer, change value and total count in the options below, and this utility will generate that many integers', 'Quickly calculate a list of integers in your browser. To get your list, just specify the first integer, change value and total count in the options below, and this utility will generate that many integers',
keywords: ['generate'], keywords: ['generate'],

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('number', { export const tool = defineTool('number', {
name: 'Number Sum Calculator', name: 'Number Sum Calculator',
path: 'sum', path: 'sum',
// image, icon: 'fluent:autosum-20-regular',
description: description:
'Quickly calculate the sum of numbers in your browser. To get your sum, just enter your list of numbers in the input field, adjust the separator between the numbers in the options below, and this utility will add up all these numbers.', 'Quickly calculate the sum of numbers in your browser. To get your sum, just enter your list of numbers in the input field, adjust the separator between the numbers in the options below, and this utility will add up all these numbers.',
shortDescription: 'Quickly sum numbers', shortDescription: 'Quickly sum numbers',

View File

@@ -1,11 +1,10 @@
import { defineTool } from '@tools/defineTool'; import { defineTool } from '@tools/defineTool';
import { lazy } from 'react'; import { lazy } from 'react';
import image from '@assets/text.png';
export const tool = defineTool('string', { export const tool = defineTool('string', {
path: 'join', path: 'join',
name: 'Text Joiner', name: 'Text Joiner',
image, icon: 'tabler:arrows-join',
description: description:
"World's Simplest Text Tool World's simplest browser-based utility for joining text. Load your text in the input form on the left and you'll automatically get merged text on the right. Powerful, free, and fast. Load text get joined lines", "World's Simplest Text Tool World's simplest browser-based utility for joining text. Load your text in the input form on the left and you'll automatically get merged text on the right. Powerful, free, and fast. Load text get joined lines",
shortDescription: 'Quickly merge texts', shortDescription: 'Quickly merge texts',

View File

@@ -5,7 +5,7 @@ import image from '@assets/text.png';
export const tool = defineTool('string', { export const tool = defineTool('string', {
path: 'split', path: 'split',
name: 'Text splitter', name: 'Text splitter',
image, icon: 'material-symbols-light:arrow-split',
description: description:
"World's simplest browser-based utility for splitting text. Load your text in the input form on the left and you'll automatically get pieces of this text on the right. Powerful, free, and fast. Load text get chunks.", "World's simplest browser-based utility for splitting text. Load your text in the input form on the left and you'll automatically get pieces of this text on the right. Powerful, free, and fast. Load text get chunks.",
shortDescription: 'Quickly split a text', shortDescription: 'Quickly split a text',

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('string', { export const tool = defineTool('string', {
name: 'String To morse', name: 'String To morse',
path: 'to-morse', path: 'to-morse',
// image, icon: 'arcticons:morse',
description: description:
"World's simplest browser-based utility for converting text to Morse code. Load your text in the input form on the left and you'll instantly get Morse code in the output area. Powerful, free, and fast. Load text get Morse code.", "World's simplest browser-based utility for converting text to Morse code. Load your text in the input form on the left and you'll instantly get Morse code in the output area. Powerful, free, and fast. Load text get Morse code.",
shortDescription: 'Quickly encode text to morse', shortDescription: 'Quickly encode text to morse',

View File

@@ -5,7 +5,7 @@ import { lazy } from 'react';
export const tool = defineTool('gif', { export const tool = defineTool('gif', {
name: 'Change speed', name: 'Change speed',
path: 'change-speed', path: 'change-speed',
// image, icon: 'material-symbols-light:speed-outline',
description: description:
'This online utility lets you change the speed of a GIF animation. You can speed it up or slow it down. You can set the same constant delay between all frames or change the delays of individual frames. You can also play both the input and output GIFs at the same time and compare their speeds', 'This online utility lets you change the speed of a GIF animation. You can speed it up or slow it down. You can set the same constant delay between all frames or change the delays of individual frames. You can also play both the input and output GIFs at the same time and compare their speeds',
shortDescription: 'Quickly change GIF speed', shortDescription: 'Quickly change GIF speed',

View File

@@ -1,11 +1,12 @@
import ToolLayout from '../components/ToolLayout'; import ToolLayout from '../components/ToolLayout';
import React, { JSXElementConstructor, LazyExoticComponent } from 'react'; import React, { JSXElementConstructor, LazyExoticComponent } from 'react';
import { IconifyIcon } from '@iconify/react';
interface ToolOptions { interface ToolOptions {
path: string; path: string;
component: LazyExoticComponent<JSXElementConstructor<NonNullable<unknown>>>; component: LazyExoticComponent<JSXElementConstructor<NonNullable<unknown>>>;
keywords: string[]; keywords: string[];
image?: string; icon?: IconifyIcon | string;
name: string; name: string;
description: string; description: string;
shortDescription: string; shortDescription: string;
@@ -19,7 +20,7 @@ export interface DefinedTool {
name: string; name: string;
description: string; description: string;
shortDescription: string; shortDescription: string;
image?: string; icon?: IconifyIcon | string;
keywords: string[]; keywords: string[];
component: () => JSX.Element; component: () => JSX.Element;
} }
@@ -29,7 +30,7 @@ export const defineTool = (
options: ToolOptions options: ToolOptions
): DefinedTool => { ): DefinedTool => {
const { const {
image, icon,
path, path,
name, name,
description, description,
@@ -42,7 +43,7 @@ export const defineTool = (
type: basePath, type: basePath,
path: `${basePath}/${path}`, path: `${basePath}/${path}`,
name, name,
image, icon,
description, description,
shortDescription, shortDescription,
keywords, keywords,
@@ -51,7 +52,7 @@ export const defineTool = (
<ToolLayout <ToolLayout
title={name} title={name}
description={description} description={description}
image={image} icon={icon}
type={basePath} type={basePath}
> >
<Component /> <Component />