Spaces:
Running
Running
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<title>AI RFP Response Generator</title> | |
<script src="https://cdn.tailwindcss.com"></script> | |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
<script> | |
tailwind.config = { | |
theme: { | |
extend: { | |
colors: { | |
primary: '#3b82f6', | |
secondary: '#1e40af', | |
accent: '#10b981', | |
dark: '#1f2937', | |
light: '#f9fafb' | |
} | |
} | |
} | |
} | |
</script> | |
<style> | |
.gradient-bg { | |
background: linear-gradient(135deg, #3b82f6 0%, #10b981 100%); | |
} | |
.code-block { | |
background-color: #1e293b; | |
color: #f8fafc; | |
border-radius: 0.5rem; | |
padding: 1.25rem; | |
font-family: 'Fira Code', monospace; | |
font-size: 0.9rem; | |
line-height: 1.5; | |
overflow-x: auto; | |
position: relative; | |
} | |
.code-block::before { | |
content: ''; | |
position: absolute; | |
top: 0; | |
left: 0; | |
right: 0; | |
height: 2.5rem; | |
background-color: #334155; | |
border-top-left-radius: 0.5rem; | |
border-top-right-radius: 0.5rem; | |
} | |
.code-block::after { | |
content: '•••'; | |
position: absolute; | |
top: 0.75rem; | |
left: 1rem; | |
color: #94a3b8; | |
letter-spacing: 0.2em; | |
} | |
.feature-card:hover { | |
transform: translateY(-5px); | |
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1); | |
} | |
.section-divider { | |
width: 100px; | |
height: 4px; | |
background: linear-gradient(90deg, #3b82f6 0%, #10b981 100%); | |
margin: 1.5rem auto; | |
border-radius: 2px; | |
} | |
.tab-active { | |
border-bottom: 3px solid #3b82f6; | |
color: #3b82f6; | |
font-weight: 600; | |
} | |
.copy-btn { | |
position: absolute; | |
right: 0.5rem; | |
top: 0.5rem; | |
background-color: #334155; | |
color: #f8fafc; | |
border: none; | |
border-radius: 0.25rem; | |
padding: 0.25rem 0.5rem; | |
font-size: 0.75rem; | |
cursor: pointer; | |
opacity: 0; | |
transition: opacity 0.2s; | |
} | |
.code-block:hover .copy-btn { | |
opacity: 1; | |
} | |
.copy-btn:hover { | |
background-color: #3b82f6; | |
} | |
.animate-pulse { | |
animation: pulse 2s infinite; | |
} | |
@keyframes pulse { | |
0% { opacity: 1; } | |
50% { opacity: 0.5; } | |
100% { opacity: 1; } | |
} | |
.file-upload { | |
border: 2px dashed #cbd5e0; | |
border-radius: 0.5rem; | |
padding: 2rem; | |
text-align: center; | |
transition: all 0.3s; | |
} | |
.file-upload:hover { | |
border-color: #3b82f6; | |
background-color: #f8fafc; | |
} | |
.file-upload.dragover { | |
border-color: #10b981; | |
background-color: #f0fdf4; | |
} | |
#preview-container { | |
max-height: 300px; | |
overflow-y: auto; | |
} | |
.prompt-template { | |
background-color: #f0fdf4; | |
border-left: 4px solid #10b981; | |
padding: 1rem; | |
margin: 1rem 0; | |
font-family: monospace; | |
white-space: pre-wrap; | |
} | |
</style> | |
</head> | |
<body class="bg-gray-50"> | |
<!-- Header --> | |
<header class="gradient-bg text-white"> | |
<div class="container mx-auto px-6 py-16"> | |
<div class="flex flex-col md:flex-row items-center justify-between"> | |
<div class="md:w-1/2 mb-10 md:mb-0"> | |
<h1 class="text-4xl md:text-5xl font-bold mb-4">AI-Powered RFP Response Generator</h1> | |
<p class="text-xl mb-8 opacity-90">Automate your proposal process with our intelligent solution that analyzes RFPs and generates compliant responses in minutes.</p> | |
<div class="flex flex-col sm:flex-row gap-4"> | |
<a href="#demo" class="bg-white text-primary font-semibold px-6 py-3 rounded-lg hover:bg-gray-100 transition duration-300 shadow-lg"> | |
<i class="fas fa-play mr-2"></i> Try Demo | |
</a> | |
<button class="bg-transparent border-2 border-white text-white font-semibold px-6 py-3 rounded-lg hover:bg-white hover:text-primary transition duration-300"> | |
<i class="fas fa-book mr-2"></i> Documentation | |
</button> | |
</div> | |
</div> | |
<div class="md:w-1/2"> | |
<div class="bg-white/20 backdrop-blur-sm rounded-xl p-6 shadow-2xl border border-white/10"> | |
<div class="flex mb-4"> | |
<div class="w-3 h-3 rounded-full bg-red-500 mr-2"></div> | |
<div class="w-3 h-3 rounded-full bg-yellow-500 mr-2"></div> | |
<div class="w-3 h-3 rounded-full bg-green-500"></div> | |
</div> | |
<div class="code-block"> | |
<button class="copy-btn" onclick="copyCode(this)"> | |
<i class="fas fa-copy mr-1"></i> Copy | |
</button> | |
<span class="text-green-400">$</span> pip install rfp-generator<br> | |
<span class="text-green-400">$</span> rfp-generator --input rfp.pdf<br> | |
<span class="text-gray-400">Analyzing RFP document...</span><br> | |
<span class="text-gray-400">Identified 12 sections and 5 deadlines</span><br> | |
<span class="text-green-400">$</span> Generating responses...<br> | |
<span class="text-green-400">✔</span> Success! Response saved to rfp_response.docx | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
</header> | |
<!-- Features --> | |
<section class="py-16 bg-white"> | |
<div class="container mx-auto px-6"> | |
<div class="text-center mb-16"> | |
<h2 class="text-3xl font-bold text-dark mb-4">Powerful Features</h2> | |
<p class="text-gray-600 max-w-2xl mx-auto">Our solution combines advanced NLP with AI content generation to streamline your RFP response process.</p> | |
<div class="section-divider"></div> | |
</div> | |
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8"> | |
<div class="feature-card bg-light rounded-xl p-6 transition duration-300 shadow-md hover:shadow-lg"> | |
<div class="w-14 h-14 bg-primary/10 rounded-full flex items-center justify-center mb-4 text-primary"> | |
<i class="fas fa-file-pdf text-2xl"></i> | |
</div> | |
<h3 class="text-xl font-semibold mb-2 text-dark">PDF Parsing</h3> | |
<p class="text-gray-600">Extracts text from uploaded RFP PDFs with support for complex layouts and tables.</p> | |
</div> | |
<div class="feature-card bg-light rounded-xl p-6 transition duration-300 shadow-md hover:shadow-lg"> | |
<div class="w-14 h-14 bg-accent/10 rounded-full flex items-center justify-center mb-4 text-accent"> | |
<i class="fas fa-brain text-2xl"></i> | |
</div> | |
<h3 class="text-xl font-semibold mb-2 text-dark">AI Analysis</h3> | |
<p class="text-gray-600">Identifies key sections, deadlines, and mandatory requirements using NLP.</p> | |
</div> | |
<div class="feature-card bg-light rounded-xl p-6 transition duration-300 shadow-md hover:shadow-lg"> | |
<div class="w-14 h-14 bg-purple-500/10 rounded-full flex items-center justify-center mb-4 text-purple-500"> | |
<i class="fas fa-robot text-2xl"></i> | |
</div> | |
<h3 class="text-xl font-semibold mb-2 text-dark">Content Generation</h3> | |
<p class="text-gray-600">Generates compliant responses tailored to each RFP section.</p> | |
</div> | |
<div class="feature-card bg-light rounded-xl p-6 transition duration-300 shadow-md hover:shadow-lg"> | |
<div class="w-14 h-14 bg-yellow-500/10 rounded-full flex items-center justify-center mb-4 text-yellow-500"> | |
<i class="fas fa-file-word text-2xl"></i> | |
</div> | |
<h3 class="text-xl font-semibold mb-2 text-dark">Word Export</h3> | |
<p class="text-gray-600">Formats responses into professional Word documents with proper headings.</p> | |
</div> | |
</div> | |
</div> | |
</section> | |
<!-- Demo Section with Upload/Download --> | |
<section id="demo" class="py-16 bg-gray-50"> | |
<div class="container mx-auto px-6"> | |
<div class="text-center mb-16"> | |
<h2 class="text-3xl font-bold text-dark mb-4">Try It Yourself</h2> | |
<p class="text-gray-600 max-w-2xl mx-auto">Upload an RFP document and download the generated response.</p> | |
<div class="section-divider"></div> | |
</div> | |
<div class="max-w-4xl mx-auto bg-white rounded-xl shadow-lg overflow-hidden"> | |
<div class="p-8"> | |
<div id="upload-section"> | |
<div class="file-upload mb-6" id="dropzone"> | |
<div class="flex flex-col items-center justify-center"> | |
<i class="fas fa-file-upload text-4xl text-primary mb-4"></i> | |
<h3 class="text-xl font-semibold mb-2">Drag & Drop your RFP document here</h3> | |
<p class="text-gray-500 mb-4">or</p> | |
<label for="file-input" class="cursor-pointer bg-primary text-white font-medium px-6 py-2 rounded-lg hover:bg-secondary transition duration-300"> | |
<i class="fas fa-folder-open mr-2"></i> Browse Files | |
</label> | |
<input type="file" id="file-input" class="hidden" accept=".pdf,.doc,.docx,.txt"> | |
<p class="text-gray-500 text-sm mt-4">Supports PDF, Word, and text documents</p> | |
</div> | |
</div> | |
<div id="preview-container" class="hidden mb-6"> | |
<h3 class="text-lg font-semibold mb-3">Document Preview</h3> | |
<div class="code-block"> | |
<button class="copy-btn" onclick="copyCode(this)"> | |
<i class="fas fa-copy mr-1"></i> Copy | |
</button> | |
<div id="file-preview"></div> | |
</div> | |
</div> | |
<div class="flex justify-between items-center"> | |
<div> | |
<p id="file-info" class="text-gray-600 hidden"> | |
<span id="file-name" class="font-medium"></span> | |
<span id="file-size" class="text-sm text-gray-500 ml-2"></span> | |
</p> | |
</div> | |
<button id="generate-btn" class="hidden bg-accent text-white font-semibold px-6 py-2 rounded-lg hover:bg-green-700 transition duration-300"> | |
<i class="fas fa-magic mr-2"></i> Generate Response | |
</button> | |
</div> | |
</div> | |
<div id="processing-section" class="hidden text-center py-8"> | |
<div class="animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-primary mx-auto mb-4"></div> | |
<h3 class="text-xl font-semibold mb-2">Analyzing your RFP document</h3> | |
<p class="text-gray-600 mb-6">This may take a few moments...</p> | |
<div class="w-full bg-gray-200 rounded-full h-2.5"> | |
<div id="progress-bar" class="bg-primary h-2.5 rounded-full" style="width: 0%"></div> | |
</div> | |
</div> | |
<div id="results-section" class="hidden"> | |
<div class="mb-6"> | |
<h3 class="text-xl font-semibold mb-4">Generated Response</h3> | |
<div class="prompt-template mb-4"> | |
<strong>Prompt Template Used:</strong><br> | |
Generate RFP response for "{section_title}" adhering to:<br> | |
- Requirements: {requirements_list}<br> | |
- Tone: Professional/technical<br> | |
- Include placeholders for [Company], [Budget], [Dates]<br> | |
- Format: Markdown with bullet points | |
</div> | |
<div class="code-block mb-4"> | |
<button class="copy-btn" onclick="copyCode(this)"> | |
<i class="fas fa-copy mr-1"></i> Copy | |
</button> | |
<div id="generated-response"></div> | |
</div> | |
</div> | |
<div class="flex justify-between items-center"> | |
<div> | |
<h4 class="font-semibold mb-2">Identified Sections</h4> | |
<ul id="sections-list" class="list-disc pl-5 text-gray-700"></ul> | |
</div> | |
<button id="download-btn" class="bg-primary text-white font-semibold px-6 py-2 rounded-lg hover:bg-secondary transition duration-300"> | |
<i class="fas fa-download mr-2"></i> Download Response | |
</button> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
</section> | |
<!-- Example Usage --> | |
<section class="py-16 bg-white"> | |
<div class="container mx-auto px-6"> | |
<div class="text-center mb-16"> | |
<h2 class="text-3xl font-bold text-dark mb-4">Example Usage</h2> | |
<p class="text-gray-600 max-w-2xl mx-auto">See how the system transforms an RFP section into a compliant response.</p> | |
<div class="section-divider"></div> | |
</div> | |
<div class="grid grid-cols-1 md:grid-cols-2 gap-8"> | |
<div> | |
<h3 class="text-xl font-semibold mb-4 text-dark">Input RFP Section</h3> | |
<div class="code-block"> | |
<button class="copy-btn" onclick="copyCode(this)"> | |
<i class="fas fa-copy mr-1"></i> Copy | |
</button> | |
"Section 3.2: Describe your cybersecurity protocols. Include certifications." | |
</div> | |
</div> | |
<div> | |
<h3 class="text-xl font-semibold mb-4 text-dark">Generated Response</h3> | |
<div class="prompt-template mb-4"> | |
<strong>Prompt Template Used:</strong><br> | |
Generate RFP response for "Section 3.2: Cybersecurity Protocols" adhering to:<br> | |
- Requirements: Describe protocols, include certifications<br> | |
- Tone: Professional/technical<br> | |
- Include placeholders for [Company], [Budget], [Dates]<br> | |
- Format: Markdown with bullet points | |
</div> | |
<div class="code-block"> | |
<button class="copy-btn" onclick="copyCode(this)"> | |
<i class="fas fa-copy mr-1"></i> Copy | |
</button> | |
**Section 3.2: Cybersecurity Protocols** | |
[Company] implements comprehensive cybersecurity measures: | |
- **Encryption Standards**: | |
- AES-256 encryption for data at rest and in transit | |
- TLS 1.3 for all external communications | |
- **Access Controls**: | |
- Role-based access with MFA enforcement | |
- Quarterly access reviews | |
- **Monitoring & Detection**: | |
- 24/7 SIEM monitoring | |
- Automated threat detection | |
**Certifications**: | |
- SOC 2 Type II compliant | |
- ISO 27001 certified | |
- [Additional relevant certifications] | |
**Implementation Timeline**: | |
- Initial setup: [Dates] | |
- Ongoing maintenance: [Dates] | |
**Budget Allocation**: | |
- Security infrastructure: [Budget] | |
- Compliance audits: [Budget] | |
Contact: security@[Company].com for detailed security documentation. | |
</div> | |
</div> | |
</div> | |
</div> | |
</section> | |
<!-- Footer --> | |
<footer class="bg-dark text-white py-12"> | |
<div class="container mx-auto px-6"> | |
<div class="grid grid-cols-1 md:grid-cols-4 gap-8"> | |
<div> | |
<h3 class="text-xl font-semibold mb-4">RFP Generator</h3> | |
<p class="text-gray-400">AI-powered solution to automate and streamline your RFP response process.</p> | |
</div> | |
<div> | |
<h3 class="text-lg font-semibold mb-4">Resources</h3> | |
<ul class="space-y-2"> | |
<li><a href="#" class="text-gray-400 hover:text-white transition">Documentation</a></li> | |
<li><a href="#" class="text-gray-400 hover:text-white transition">API Reference</a></li> | |
<li><a href="#" class="text-gray-400 hover:text-white transition">GitHub Repository</a></li> | |
</ul> | |
</div> | |
<div> | |
<h3 class="text-lg font-semibold mb-4">Community</h3> | |
<ul class="space-y-2"> | |
<li><a href="#" class="text-gray-400 hover:text-white transition">GitHub Issues</a></li> | |
<li><a href="#" class="text-gray-400 hover:text-white transition">Stack Overflow</a></li> | |
<li><a href="#" class="text-gray-400 hover:text-white transition">Discord</a></li> | |
</ul> | |
</div> | |
<div> | |
<h3 class="text-lg font-semibold mb-4">Connect</h3> | |
<div class="flex space-x-4"> | |
<a href="#" class="text-gray-400 hover:text-white transition text-xl"><i class="fab fa-twitter"></i></a> | |
<a href="#" class="text-gray-400 hover:text-white transition text-xl"><i class="fab fa-github"></i></a> | |
<a href="#" class="text-gray-400 hover:text-white transition text-xl"><i class="fab fa-linkedin"></i></a> | |
<a href="#" class="text-gray-400 hover:text-white transition text-xl"><i class="fab fa-discord"></i></a> | |
</div> | |
</div> | |
</div> | |
<div class="border-t border-gray-800 mt-12 pt-8 text-center text-gray-400"> | |
<p>© 2024 RFP Generator. All rights reserved.</p> | |
</div> | |
</div> | |
</footer> | |
<script> | |
// Tab functionality | |
function showTab(tabId) { | |
// Hide all tab contents | |
document.querySelectorAll('.tab-content').forEach(tab => { | |
tab.classList.add('hidden'); | |
}); | |
// Remove active class from all tab buttons | |
document.querySelectorAll('.tab-btn').forEach(btn => { | |
btn.classList.remove('tab-active'); | |
}); | |
// Show selected tab content | |
document.getElementById(tabId).classList.remove('hidden'); | |
// Add active class to clicked button | |
event.currentTarget.classList.add('tab-active'); | |
} | |
// Copy code functionality | |
function copyCode(button) { | |
const codeBlock = button.parentElement; | |
const code = codeBlock.innerText.replace('Copy', '').trim(); | |
navigator.clipboard.writeText(code).then(() => { | |
// Change button text temporarily | |
const originalHtml = button.innerHTML; | |
button.innerHTML = '<i class="fas fa-check mr-1"></i> Copied!'; | |
setTimeout(() => { | |
button.innerHTML = originalHtml; | |
}, 2000); | |
}); | |
} | |
// Initialize first tab as active | |
document.addEventListener('DOMContentLoaded', function() { | |
// Initialize drag and drop functionality | |
const dropzone = document.getElementById('dropzone'); | |
const fileInput = document.getElementById('file-input'); | |
// Highlight dropzone when dragging over | |
['dragenter', 'dragover'].forEach(eventName => { | |
dropzone.addEventListener(eventName, (e) => { | |
e.preventDefault(); | |
dropzone.classList.add('dragover'); | |
}); | |
}); | |
// Remove highlight when leaving | |
['dragleave', 'dragend'].forEach(eventName => { | |
dropzone.addEventListener(eventName, () => { | |
dropzone.classList.remove('dragover'); | |
}); | |
}); | |
// Handle file drop | |
dropzone.addEventListener('drop', (e) => { | |
e.preventDefault(); | |
dropzone.classList.remove('dragover'); | |
if (e.dataTransfer.files.length) { | |
fileInput.files = e.dataTransfer.files; | |
handleFileUpload(e.dataTransfer.files[0]); | |
} | |
}); | |
// Handle file selection via button | |
fileInput.addEventListener('change', () => { | |
if (fileInput.files.length) { | |
handleFileUpload(fileInput.files[0]); | |
} | |
}); | |
// Generate button click handler | |
document.getElementById('generate-btn').addEventListener('click', processRFP); | |
// Download button click handler | |
document.getElementById('download-btn').addEventListener('click', downloadResponse); | |
}); | |
// Handle file upload | |
function handleFileUpload(file) { | |
const validTypes = ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'text/plain']; | |
if (!validTypes.includes(file.type) && !file.name.endsWith('.pdf') && !file.name.endsWith('.doc') && !file.name.endsWith('.docx') && !file.name.endsWith('.txt')) { | |
alert('Please upload a valid PDF, Word, or text document.'); | |
return; | |
} | |
// Show file info | |
document.getElementById('file-info').classList.remove('hidden'); | |
document.getElementById('file-name').textContent = file.name; | |
document.getElementById('file-size').textContent = formatFileSize(file.size); | |
// Show preview button | |
document.getElementById('generate-btn').classList.remove('hidden'); | |
// Preview text content (simplified for demo) | |
if (file.type === 'text/plain' || file.name.endsWith('.txt')) { | |
const reader = new FileReader(); | |
reader.onload = function(e) { | |
document.getElementById('file-preview').textContent = e.target.result.substring(0, 1000) + (e.target.result.length > 1000 ? '...' : ''); | |
document.getElementById('preview-container').classList.remove('hidden'); | |
}; | |
reader.readAsText(file); | |
} else { | |
// For PDF/DOC files, just show a message in the demo | |
document.getElementById('file-preview').textContent = `[Preview not available in demo - ${file.type} file detected]`; | |
document.getElementById('preview-container').classList.remove('hidden'); | |
} | |
} | |
// Format file size | |
function formatFileSize(bytes) { | |
if (bytes === 0) return '0 Bytes'; | |
const k = 1024; | |
const sizes = ['Bytes', 'KB', 'MB', 'GB']; | |
const i = Math.floor(Math.log(bytes) / Math.log(k)); | |
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; | |
} | |
// Process RFP (simulated for demo) | |
function processRFP() { | |
const uploadSection = document.getElementById('upload-section'); | |
const processingSection = document.getElementById('processing-section'); | |
const resultsSection = document.getElementById('results-section'); | |
// Show processing section | |
uploadSection.classList.add('hidden'); | |
processingSection.classList.remove('hidden'); | |
// Simulate processing with progress bar | |
let progress = 0; | |
const progressInterval = setInterval(() => { | |
progress += Math.random() * 10; | |
if (progress > 100) progress = 100; | |
document.getElementById('progress-bar').style.width = `${progress}%`; | |
if (progress === 100) { | |
clearInterval(progressInterval); | |
setTimeout(() => { | |
// Show results | |
processingSection.classList.add('hidden'); | |
resultsSection.classList.remove('hidden'); | |
// Generate sample response (in a real app, this would come from your backend) | |
generateSampleResponse(); | |
}, 500); | |
} | |
}, 300); | |
} | |
// Generate sample response (for demo purposes) | |
function generateSampleResponse() { | |
const responseContainer = document.getElementById('generated-response'); | |
const sectionsList = document.getElementById('sections-list'); | |
// Sample generated response using the prompt template | |
const sampleResponse = `**Section 1.1: Executive Summary** | |
[Company] is pleased to submit this proposal in response to [RFP Title]. Our solution delivers: | |
- **Key Benefits**: | |
- [Benefit 1] | |
- [Benefit 2] | |
- [Benefit 3] | |
- **Implementation Timeline**: [Dates] | |
- **Budget**: [Budget] | |
**Section 2.3: Technical Approach** | |
Our methodology includes: | |
1. **Phase 1: Discovery** ([Dates]) | |
- Requirements analysis | |
- Stakeholder interviews | |
2. **Phase 2: Implementation** ([Dates]) | |
- System configuration | |
- Integration testing | |
3. **Phase 3: Deployment** ([Dates]) | |
- User training | |
- Go-live support | |
**Budget Allocation**: | |
- Development: [Budget] | |
- Training: [Budget] | |
**Section 3.2: Security Protocols** | |
[Company] maintains: | |
- **Certifications**: | |
- ISO 27001 | |
- SOC 2 Type II | |
- **Protocols**: | |
- Encryption at rest and in transit | |
- Quarterly penetration testing | |
**Security Budget**: [Budget] | |
**Next Audit Date**: [Dates] | |
Contact: [[email protected]] for additional details.`; | |
responseContainer.innerHTML = sampleResponse; | |
// Sample sections identified | |
const sampleSections = [ | |
"1.1 Executive Summary", | |
"2.3 Technical Approach", | |
"3.2 Security Protocols", | |
"4.1 Project Timeline", | |
"5.2 Pricing Structure" | |
]; | |
sectionsList.innerHTML = ''; | |
sampleSections.forEach(section => { | |
const li = document.createElement('li'); | |
li.textContent = section; | |
sectionsList.appendChild(li); | |
}); | |
} | |
// Download generated response | |
function downloadResponse() { | |
const responseText = document.getElementById('generated-response').textContent; | |
const blob = new Blob([responseText], { type: 'text/plain' }); | |
const url = URL.createObjectURL(blob); | |
const a = document.createElement('a'); | |
a.href = url; | |
a.download = 'RFP_Response.md'; | |
document.body.appendChild(a); | |
a.click(); | |
// Clean up | |
setTimeout(() => { | |
document.body.removeChild(a); | |
URL.revokeObjectURL(url); | |
}, 100); | |
} | |
</script> | |
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=aiwhisperer33/rfp" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> | |
</html> |