text-transformer / src /components /MorseCodeConverter.jsx
copilot-swe-agent[bot]
Enhanced UI CSS with modern interactive features and animations
40b33b6
import React, { useState } from 'react';
const morseCodeMap = {
'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.', 'H': '....',
'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.',
'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-',
'Y': '-.--', 'Z': '--..',
'1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...',
'8': '---..', '9': '----.', '0': '-----',
' ': '/'
};
// Create a reverse map for decoding
const reverseMorseCodeMap = Object.entries(morseCodeMap).reduce((acc, [key, value]) => {
acc[value] = key;
return acc;
}, {});
const MorseCodeConverter = ({ addToMessage }) => {
const [input, setInput] = useState('');
const [output, setOutput] = useState('');
const [copied, setCopied] = useState(false);
const [toMorse, setToMorse] = useState(true); // true for text to morse, false for morse to text
const convertToMorse = (text) => {
let morse = '';
for (let char of text.toUpperCase()) {
if (morseCodeMap[char]) {
morse += morseCodeMap[char] + ' ';
} else {
morse += '? '; // Represent unknown characters
}
}
setOutput(morse.trim());
};
const convertFromMorse = (morse) => {
let text = '';
const morseChars = morse.split(' ');
for (let morseChar of morseChars) {
if (reverseMorseCodeMap[morseChar]) {
text += reverseMorseCodeMap[morseChar];
} else if (morseChar === '/') {
text += ' ';
}
}
setOutput(text);
};
const handleInputChange = (e) => {
const newText = e.target.value;
setInput(newText);
if (toMorse) {
convertToMorse(newText);
} else {
convertFromMorse(newText);
}
};
const copyToClipboard = () => {
navigator.clipboard.writeText(output);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
};
const swapConversion = () => {
const oldInput = input;
setInput(output);
setOutput(oldInput);
setToMorse(!toMorse);
};
return (
<div className="p-6 bg-gradient-to-br from-gray-900 to-black rounded-lg border border-gray-800 hover-glow transition-all duration-300">
<h2 className="text-3xl font-bold mb-6 text-white flex items-center gap-2">
<span className="text-purple-500"></span>
Morse Code Converter
</h2>
<div className="grid grid-cols-1 md:grid-cols-[1fr_auto_1fr] gap-6 items-center">
<div className="space-y-2">
<label htmlFor="morse-input" className="block text-sm font-medium text-gray-300 mb-2">
{toMorse ? 'Text Input' : 'Morse Code Input'}
</label>
<textarea
id="morse-input"
className="w-full h-40 p-4 bg-gray-950 border-2 border-gray-700 rounded-lg text-white focus:ring-2 focus:ring-purple-500 focus:border-purple-500 transition-all duration-300 hover:border-gray-600 resize-none"
placeholder={toMorse ? 'Enter text...' : 'Enter Morse code...'}
value={input}
onChange={handleInputChange}
/>
</div>
<div className="flex justify-center">
<button
onClick={swapConversion}
className="p-3 bg-gradient-to-br from-purple-600 to-purple-800 text-white rounded-full hover:from-purple-500 hover:to-purple-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 transition-all duration-300 hover:scale-110 active:scale-95 shadow-lg hover:shadow-purple-500/50"
title="Swap conversion direction"
>
<svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 7h12m0 0l-4-4m4 4l-4 4m2 5H4m0 0l4 4m-4-4l4-4" />
</svg>
</button>
</div>
<div className="space-y-2">
<label htmlFor="morse-output" className="block text-sm font-medium text-gray-300 mb-2">
{toMorse ? 'Morse Code Output' : 'Text Output'}
</label>
<div id="morse-output" className="w-full h-40 p-4 bg-gray-950 border-2 border-gray-700 rounded-lg text-white relative overflow-auto hover:border-gray-600 transition-all duration-300">
<div className="break-words">{output || <span className="text-gray-500">Output will appear here...</span>}</div>
{output && (
<div className="absolute top-2 right-2 flex flex-col gap-2">
<button
onClick={copyToClipboard}
className="px-4 py-2 bg-gradient-to-r from-blue-600 to-blue-700 text-white rounded-md hover:from-blue-500 hover:to-blue-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-all duration-300 shadow-md hover:shadow-lg hover:scale-105 active:scale-95"
>
{copied ? '✓ Copied!' : '📋 Copy'}
</button>
<button
onClick={() => addToMessage(output)}
className="px-4 py-2 bg-gradient-to-r from-green-600 to-green-700 text-white rounded-md hover:from-green-500 hover:to-green-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 transition-all duration-300 shadow-md hover:shadow-lg hover:scale-105 active:scale-95"
>
➕ Add
</button>
</div>
)}
</div>
</div>
</div>
</div>
);
};
export default MorseCodeConverter;