Text Rewriter

 <!DOCTYPE html>

<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>TextMaster Ultra - Complete Browser-Based Rewriter</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <!-- PDF.js Library --> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.min.js"></script> <!-- Mammoth.js for DOCX --> <script src="https://cdnjs.cloudflare.com/ajax/libs/mammoth/1.5.0/mammoth.browser.min.js"></script> <style> :root { /* Claude.ai Exact Colors */ --claude-bg: #f8f9fa; /* Soft lotion white */ --claude-card: #ffffff; --claude-text: #1a1d21; /* Dark gray (not pure black) */ --claude-text-light: #5e6673; --claude-primary: #2a5cff; --claude-primary-light: #e6edff; --claude-primary-dark: #1a4ae5; --claude-secondary: #ff7b2c; --claude-border: #e1e4e8; --claude-success: #28a745; --claude-danger: #dc3545; --claude-warning: #ffc107; /* Spacing */ --radius: 8px; --shadow-sm: 0 1px 2px rgba(0,0,0,0.05); --shadow-md: 0 4px 8px rgba(0,0,0,0.05); --transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .dark-mode { --claude-bg: #1a1d21; --claude-card: #252a31; --claude-text: #f8f9fa; --claude-text-light: #a3a9b5; --claude-primary: #4d7aff; --claude-primary-light: #2a3a66; --claude-border: #3a3f48; } * { box-sizing: border-box; margin: 0; padding: 0; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; } body { background-color: var(--claude-bg); color: var(--claude-text); line-height: 1.5; margin: 0; padding: 0; transition: background-color 0.3s; } .container { max-width: 1200px; margin: 0 auto; padding: 20px; } /* Header - Claude style */ header { background-color: var(--claude-card); border-bottom: 1px solid var(--claude-border); padding: 16px 0; position: sticky; top: 0; z-index: 100; } .header-content { display: flex; justify-content: space-between; align-items: center; } .logo { font-weight: 600; color: var(--claude-primary); display: flex; align-items: center; gap: 10px; font-size: 18px; } .theme-toggle { background: none; border: none; color: var(--claude-text-light); cursor: pointer; font-size: 20px; padding: 5px; } /* Main Tool */ .tool-container { background-color: var(--claude-card); border-radius: var(--radius); box-shadow: var(--shadow-sm); padding: 24px; margin: 24px 0; border: 1px solid var(--claude-border); transition: var(--transition); } .tool-container:hover { box-shadow: var(--shadow-md); } .section-title { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; color: var(--claude-text); } /* File Handling */ .file-handler { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 20px; } @media (max-width: 768px) { .file-handler { grid-template-columns: 1fr; } } .file-zone { border: 2px dashed var(--claude-border); border-radius: var(--radius); padding: 24px; text-align: center; transition: var(--transition); position: relative; } .file-zone:hover { border-color: var(--claude-primary); background-color: var(--claude-primary-light); } .file-zone h3 { margin: 12px 0 6px; } .file-input { position: absolute; width: 100%; height: 100%; top: 0; left: 0; opacity: 0; cursor: pointer; } /* Export Options */ .export-options { display: flex; gap: 8px; justify-content: center; margin-top: 15px; flex-wrap: wrap; } .export-btn { padding: 6px 12px; background-color: var(--claude-bg); border: 1px solid var(--claude-border); border-radius: var(--radius); color: var(--claude-text); cursor: pointer; transition: var(--transition); font-size: 14px; } .export-btn:hover { background-color: var(--claude-primary-light); border-color: var(--claude-primary); color: var(--claude-primary); } .export-btn.active { background-color: var(--claude-primary); border-color: var(--claude-primary); color: white; } /* Template Library */ .templates-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; margin-top: 16px; } .template-card { border: 1px solid var(--claude-border); border-radius: var(--radius); padding: 16px; cursor: pointer; transition: var(--transition); position: relative; overflow: hidden; } .template-card:hover { border-color: var(--claude-primary); box-shadow: var(--shadow-sm); background-color: var(--claude-primary-light); } .template-category { position: absolute; top: 0; right: 0; background-color: var(--claude-primary); color: white; font-size: 12px; padding: 2px 8px; border-bottom-left-radius: var(--radius); } /* Text Editor */ .editor-container { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-top: 24px; } @media (max-width: 992px) { .editor-container { grid-template-columns: 1fr; } } .editor-box { border: 1px solid var(--claude-border); border-radius: var(--radius); overflow: hidden; display: flex; flex-direction: column; } .editor-header { background-color: var(--claude-bg); padding: 12px 16px; border-bottom: 1px solid var(--claude-border); display: flex; justify-content: space-between; align-items: center; } .editor-title { font-weight: 500; font-size: 15px; color: var(--claude-text); } .text-area { flex: 1; padding: 16px; font-size: 15px; line-height: 1.6; border: none; resize: none; height: 300px; background-color: var(--claude-card); color: var(--claude-text); transition: var(--transition); } .text-area:focus { outline: none; } /* Controls Section */ .controls-section { padding: 16px; background-color: var(--claude-bg); border-radius: var(--radius); margin: 24px 0; border: 1px solid var(--claude-border); } .control-row { display: flex; flex-wrap: wrap; gap: 16px; margin-bottom: 16px; } /* Mode Selector */ .mode-selector { display: flex; flex-wrap: wrap; gap: 10px; margin: 16px 0; } .mode-option { padding: 8px 16px; border-radius: var(--radius); background-color: var(--claude-bg); border: 1px solid var(--claude-border); cursor: pointer; transition: var(--transition); font-size: 14px; } .mode-option:hover { background-color: var(--claude-primary-light); border-color: var(--claude-primary); } .mode-option.active { background-color: var(--claude-primary); color: white; border-color: var(--claude-primary); } /* Readability Controls */ .readability-controls { display: flex; flex-wrap: wrap; gap: 20px; margin: 16px 0; } .readability-control { display: flex; flex-direction: column; gap: 5px; } .slider { width: 100%; -webkit-appearance: none; height: 6px; border-radius: 3px; background: var(--claude-border); outline: none; } .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 16px; height: 16px; border-radius: 50%; background: var(--claude-primary); cursor: pointer; } /* Main Button */ .main-button { background-color: var(--claude-primary); color: white; border: none; border-radius: var(--radius); padding: 12px 24px; font-weight: 500; cursor: pointer; transition: var(--transition); display: flex; align-items: center; gap: 8px; margin: 16px 0; } .main-button:hover { background-color: var(--claude-primary-dark); } /* Version History */ .history-list { margin-top: 16px; border: 1px solid var(--claude-border); border-radius: var(--radius); overflow: hidden; } .history-item { padding: 16px; border-bottom: 1px solid var(--claude-border); transition: var(--transition); } .history-item:last-child { border-bottom: none; } .history-item:hover { background-color: var(--claude-primary-light); } .history-header { display: flex; justify-content: space-between; margin-bottom: 8px; } .version-label { font-weight: 500; color: var(--claude-primary); } .history-timestamp { color: var(--claude-text-light); font-size: 14px; } .history-preview { color: var(--claude-text-light); font-size: 14px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; margin-bottom: 8px; } .history-buttons { display: flex; gap: 10px; } .history-btn { background: none; border: none; color: var(--claude-primary); cursor: pointer; font-size: 13px; padding: 0; display: flex; align-items: center; gap: 4px; } /* Processing Indicator */ .processing-indicator { display: flex; align-items: center; gap: 8px; color: var(--claude-primary); margin-bottom: 8px; animation: pulse 1.5s infinite; } @keyframes pulse { 0% { opacity: 0.6; } 50% { opacity: 1; } 100% { opacity: 0.6; } } /* File List */ .file-list { margin-top: 16px; text-align: left; } .file-item { display: flex; align-items: center; gap: 8px; padding: 8px 0; border-bottom: 1px solid var(--claude-border); } .file-item:last-child { border-bottom: none; } .file-name { font-size: 14px; flex: 1; } .file-size { font-size: 12px; color: var(--claude-text-light); } .file-status { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; } /* Comparison View */ .comparison-view { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); z-index: 1000; justify-content: center; align-items: center; } .comparison-container { background-color: var(--claude-card); border-radius: var(--radius); width: 90%; max-width: 1000px; max-height: 90vh; overflow: auto; padding: 24px; } .comparison-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } .comparison-close { background: none; border: none; color: var(--claude-text); font-size: 20px; cursor: pointer; } .diff-content { border: 1px solid var(--claude-border); border-radius: var(--radius); padding: 16px; font-family: monospace; line-height: 1.6; white-space: pre-wrap; overflow: auto; max-height: 60vh; } .diff-add { background-color: rgba(40, 167, 69, 0.1); color: var(--claude-success); } .diff-remove { background-color: rgba(220, 53, 69, 0.1); color: var(--claude-danger); text-decoration: line-through; } /* Loading Indicator */ .loading { display: inline-block; width: 20px; height: 20px; border: 3px solid rgba(42, 92, 255, 0.3); border-radius: 50%; border-top-color: var(--claude-primary); animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Cloud Sync Status */ .cloud-status { display: flex; align-items: center; gap: 5px; font-size: 13px; color: var(--claude-text-light); } /* Tooltip */ .tooltip { position: relative; display: inline-block; } .tooltip .tooltip-text { visibility: hidden; width: 200px; background-color: var(--claude-text); color: white; text-align: center; border-radius: var(--radius); padding: 8px; position: absolute; z-index: 1; bottom: 125%; left: 50%; transform: translateX(-50%); opacity: 0; transition: opacity 0.3s; font-size: 13px; } .tooltip:hover .tooltip-text { visibility: visible; opacity: 0.9; } /* Progress Bar */ .progress-container { height: 4px; width: 100%; background-color: var(--claude-border); border-radius: 2px; overflow: hidden; margin-top: 4px; } .progress-bar { height: 100%; background-color: var(--claude-primary); width: 0%; transition: width 0.3s ease; } /* Notification */ .notification { position: fixed; top: 20px; right: 20px; background-color: var(--claude-success); color: white; padding: 12px 16px; border-radius: var(--radius); box-shadow: var(--shadow-md); z-index: 1000; transform: translateY(-100px); opacity: 0; transition: all 0.3s ease; } .notification.show { transform: translateY(0); opacity: 1; } /* Badge */ .badge { display: inline-block; padding: 2px 6px; border-radius: 12px; font-size: 11px; font-weight: 500; } .badge-primary { background-color: var(--claude-primary-light); color: var(--claude-primary); } .badge-secondary { background-color: rgba(255, 123, 44, 0.1); color: var(--claude-secondary); } </style> </head> <body> <div id="notification" class="notification">Operation completed successfully!</div> <!-- Comparison modal for version history --> <div id="comparisonView" class="comparison-view"> <div class="comparison-container"> <div class="comparison-header"> <h2>Version Comparison</h2> <button id="closeComparison" class="comparison-close">&times;</button> </div> <div id="diffContent" class="diff-content"></div> </div> </div> <header> <div class="container"> <div class="header-content"> <div class="logo"> <i class="fas fa-magic"></i> <span>TextMaster Ultra</span> </div> <button id="themeToggle" class="theme-toggle"> <i class="fas fa-moon"></i> </button> </div> </div> </header> <main class="container"> <!-- File Handling Section --> <section class="tool-container"> <h2 class="section-title"><i class="fas fa-file-import"></i> Document Handling</h2> <div class="file-handler"> <!-- Upload --> <div class="file-zone"> <input type="file" id="fileInput" class="file-input" multiple accept=".txt,.docx,.pdf,.md"> <i class="fas fa-cloud-upload-alt fa-3x" style="color: var(--claude-primary);"></i> <h3>Upload Documents</h3> <p style="color: var(--claude-text-light);">Supports: TXT, DOCX, PDF, Markdown</p> <div id="fileList" class="file-list"></div> </div> <!-- Export --> <div class="file-zone"> <i class="fas fa-file-export fa-3x" style="color: var(--claude-primary);"></i> <h3>Export Results</h3> <div class="export-options"> <button data-format="txt" class="export-btn active">TXT</button> <button data-format="docx" class="export-btn">DOCX</button> <button data-format="html" class="export-btn">HTML</button> <button data-format="md" class="export-btn">Markdown</button> </div> <div id="cloudStatus" class="cloud-status" style="margin-top: 16px;"> <i class="fas fa-check-circle" style="color: var(--claude-success);"></i> <span>Auto-saved to browser</span> </div> </div> </div> </section> <!-- Template Library --> <section class="tool-container"> <h2 class="section-title"><i class="fas fa-clipboard-list"></i> Template Library</h2> <p style="color: var(--claude-text-light); margin-bottom: 16px;">Choose from professionally crafted templates to jumpstart your writing.</p> <div class="templates-grid" id="templatesGrid"> <!-- Templates will be injected via JS --> </div> </section> <!-- Text Editor Section --> <section class="tool-container"> <h2 class="section-title"><i class="fas fa-pen-fancy"></i> Text Editor</h2> <!-- Mode Selector --> <div class="mode-selector" id="modeSelector"> <div class="mode-option active" data-mode="professional">Professional</div> <div class="mode-option" data-mode="creative">Creative</div> <div class="mode-option" data-mode="concise">Concise</div> <div class="mode-option" data-mode="expand">Expand</div> <div class="mode-option" data-mode="simplify">Simplify</div> <div class="mode-option" data-mode="academic">Academic</div> </div> <!-- Readability Controls --> <div class="readability-controls"> <div class="readability-control"> <label>Readability Level</label> <input type="range" class="slider" id="readabilitySlider" min="1" max="5" value="3"> <div style="display: flex; justify-content: space-between; font-size: 12px; color: var(--claude-text-light);"> <span>Simple</span> <span>Complex</span> </div> </div> <div class="readability-control"> <label>Tone</label> <input type="range" class="slider" id="toneSlider" min="1" max="5" value="3"> <div style="display: flex; justify-content: space-between; font-size: 12px; color: var(--claude-text-light);"> <span>Casual</span> <span>Formal</span> </div> </div> </div> <!-- Text Areas --> <div class="editor-container"> <!-- Original Text --> <div class="editor-box"> <div class="editor-header"> <span class="editor-title">Original Text</span> <div class="tooltip"> <i class="fas fa-info-circle" style="color: var(--claude-text-light);"></i> <span class="tooltip-text">Paste your original text here or import a document</span> </div> </div> <textarea id="originalText" class="text-area" placeholder="Paste your text here or upload a document..."></textarea> </div> <!-- Rewritten Text --> <div class="editor-box"> <div class="editor-header"> <span class="editor-title">Rewritten Text</span> <div id="wordCount" style="font-size: 13px; color: var(--claude-text-light);">0 words</div> </div> <textarea id="rewrittenText" class="text-area" placeholder="Your rewritten text will appear here..." readonly></textarea> </div> </div> <!-- Process Button --> <button id="processBtn" class="main-button"> <i class="fas fa-sync-alt"></i> <span>Rewrite Text</span> </button> </section> <!-- Version History --> <section class="tool-container"> <h2 class="section-title"><i class="fas fa-history"></i> Version History</h2> <p style="color: var(--claude-text-light); margin-bottom: 16px;"> Access your previous versions with detailed comparison and restore capabilities. </p> <div id="historyList" class="history-list"> <!-- History items will be injected via JS --> <div style="padding: 24px; text-align: center; color: var(--claude-text-light);"> <i class="fas fa-history fa-2x" style="margin-bottom: 12px; opacity: 0.5;"></i> <p>Your version history will appear here after processing text.</p> </div> </div> </section> </main> <script> // ====================== // PDF.js Configuration // ====================== pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.worker.min.js'; // ====================== // Theme Toggle // ====================== const themeToggle = document.getElementById('themeToggle'); const prefersDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; if (localStorage.getItem('darkMode') === 'true' || (localStorage.getItem('darkMode') === null && prefersDarkMode)) { document.body.classList.add('dark-mode'); themeToggle.innerHTML = '<i class="fas fa-sun"></i>'; } themeToggle.addEventListener('click', () => { document.body.classList.toggle('dark-mode'); const isDarkMode = document.body.classList.contains('dark-mode'); localStorage.setItem('darkMode', isDarkMode); themeToggle.innerHTML = isDarkMode ? '<i class="fas fa-sun"></i>' : '<i class="fas fa-moon"></i>'; }); // ====================== // File Handling // ====================== const fileInput = document.getElementById('fileInput'); const fileList = document.getElementById('fileList'); const originalText = document.getElementById('originalText'); const rewrittenText = document.getElementById('rewrittenText'); let uploadedFiles = []; fileInput.addEventListener('change', handleFiles); async function handleFiles(e) { uploadedFiles = Array.from(e.target.files); fileList.innerHTML = ''; if (uploadedFiles.length === 0) return; for (let i = 0; i < uploadedFiles.length; i++) { const file = uploadedFiles[i]; const fileItem = document.createElement('div'); fileItem.className = 'file-item'; fileItem.innerHTML = ` <i class="${getFileIcon(file.name)}" style="color: var(--claude-primary);"></i> <div style="flex: 1;"> <div class="file-name">${file.name}</div> <div class="file-size">${formatFileSize(file.size)}</div> </div> <div class="file-status" data-index="${i}"> <div class="loading"></div> </div> `; fileList.appendChild(fileItem); // Process file with slight delay for UI setTimeout(() => processFile(file, i), i * 300); } } function getFileIcon(filename) { if (filename.endsWith('.pdf')) return 'fas fa-file-pdf'; if (filename.endsWith('.docx')) return 'fas fa-file-word'; if (filename.endsWith('.md')) return 'fas fa-file-alt'; return 'fas fa-file-alt'; } function formatFileSize(bytes) { if (bytes < 1024) return bytes + ' B'; if (bytes < 1048576) return (bytes / 1024).toFixed(1) + ' KB'; return (bytes / 1048576).toFixed(1) + ' MB'; } async function processFile(file, index) { try { let text; if (file.name.endsWith('.pdf')) { text = await extractTextFromPDF(file); } else if (file.name.endsWith('.docx')) { text = await extractTextFrom

Comments

Popular posts from this blog

Summarizer

Calculator