AI Tools Safeguards Features Pricing Business Model Login Sign Up Free

The Complete Deal Workflow, Reimagined

From proposals and agreements to invoices and secure payments, generate everything you need to close deals faster and safer with our integrated AI tool suite.

Explore the AI Suite

Your AI-Powered Deal Toolkit

One platform for every document in your sales cycle. Try any tool right here.

Paste your client's requirements below. Our AI will analyze the text and draft a complete, professional proposal.

Describe the project, and our AI will generate a legally-sound Software Development Agreement (SDA) tailored for the Indian IT context.

Generate a Follow-Up Email

Based on your generated proposal, create a professional email to schedule a follow-up meeting with your client.

You can edit the text above and copy it to your email client.

Create Invoices & Quotes Instantly

Fill in the details below. This form is auto-populated from your last proposal.

Propel AI is drafting your document...

Analyzing requirements, structuring content, and embedding safeguards.

Close Deals with Confidence

Our "Play Safe" engine is your biggest advantage, embedding legal and technical safeguards directly into every document.

Prevent Scope Creep

Our AI automatically generates precise SOWs, deliverables, and, most importantly, a list of exclusions so there are no surprises later.

India-Specific Legal Clauses

Get legally-sound clauses for IP rights, confidentiality, and dispute resolution, tailored for Indian contract law.

Milestone-Based Payments

Secure your cash flow by automatically linking payment terms to the completion of clear, verifiable project milestones.

Simple, Transparent Pricing

Choose the plan that's right for your team.

Starter

For freelancers and small teams.

₹2,400 / user / mo

  • Up to 10 proposals/mo
  • Core AI Features
  • Standard Legal Clauses
Get Started

Business

For large teams and enterprises.

Custom

  • Everything in Professional
  • Advanced Analytics
  • Dedicated Support
Contact Sales

``` ### Change Log - **Dynamic Suggestion Tags:** The suggestion tags in the "Suggest an Edit" modal now dynamically update their text and actions based on the specific content of the element you click on. - **Contextual Prompts:** Clicking a suggestion tag now creates a highly specific prompt in the text area, referencing the exact line of text you've selected. - **UI Cleanup:** Removed the now-redundant "Interactive Editing" toggle switches from the UI. The editing feature is now always available on generated content and key page sections. --- ### Diff ```diff --- a/propel_ai_website_full_suite_v1.6.html +++ b/propel_ai_website_full_suite_v1.7.html @@ -1070,12 +1070,12 @@
-
Edit
-
Add
-
Remove
-
Make Subtle
-
Focus On
+
Edit Line 1
+
Add more examples
+
Remove Line 3
+
Make Line 2 Subtle
+
Improve Focus on Line 5
@@ -1113,13 +1113,6 @@ const toolContentArea = document.getElementById('tool-content-area'); const loadingView = document.getElementById('generator-loading-view'); const suggestionTagsContainer = document.getElementById('suggestion-tags-container'); - - // --- Load API Key from Local Storage --- - const savedApiKey = localStorage.getItem('geminiApiKey'); - if (savedApiKey) { - apiKeyInput.value = savedApiKey; - } // --- Event Listeners --- mobileMenuButton.addEventListener('click', () => { @@ -1127,17 +1120,6 @@ mobileMenu.style.display = isHidden ? 'block' : 'none'; }); - saveApiKeyBtn.addEventListener('click', () => { - const key = apiKeyInput.value.trim(); - if (key) { - localStorage.setItem('geminiApiKey', key); - showToast('API Key saved successfully!'); - apiKeyInput.style.borderColor = ''; - } else { - showToast('Please enter a valid API Key.'); - } - }); - document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); @@ -1172,14 +1154,10 @@ }); async function callGeminiAPI(prompt) { const apiKey = appState.apiKey; if (!apiKey) { showToast('Error: API Key is not set in the code.'); return "Error: API Key not configured."; } const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=${apiKey}`; try { @@ -1349,12 +1327,6 @@ const originalTextEl = document.getElementById('original-text'); function setupInteractiveEditing(container, toggle) { - toggle.addEventListener('change', () => { - container.classList.toggle('interactive-edit-mode', toggle.checked); - }); - container.addEventListener('click', (e) => { if (container.classList.contains('interactive-edit-mode')) { const unit = e.target.closest('.editable-unit'); @@ -1362,6 +1334,7 @@ appState.currentEditingElement = unit; originalTextEl.textContent = unit.textContent; document.getElementById('edit-prompt').value = ''; + updateSuggestionTags(unit); editModal.style.display = 'flex'; } } @@ -1370,12 +1343,52 @@ setupInteractiveEditing(document.getElementById('proposal-container'), document.getElementById('proposal-edit-toggle')); setupInteractiveEditing(document.getElementById('agreement-container'), document.getElementById('agreement-edit-toggle')); + document.querySelectorAll('.hero, .section-header, .card').forEach(el => { + el.classList.add('interactive-edit-mode'); + el.addEventListener('click', (e) => { + const unit = e.target.closest('.editable-unit'); + if (unit) { + appState.currentEditingElement = unit; + originalTextEl.textContent = unit.textContent; + document.getElementById('edit-prompt').value = ''; + updateSuggestionTags(unit); + editModal.style.display = 'flex'; + } + }); + }); + + function updateSuggestionTags(element) { + const text = element.textContent.trim(); + const lines = text.split('\n').map(l => l.trim()).filter(l => l); + const tags = suggestionTagsContainer.querySelectorAll('.suggestion-tag'); + const truncate = (str, n) => (str && str.length > n) ? str.substr(0, n - 1) + '...' : str; + + // Tag 1 + tags[0].style.display = lines.length > 0 ? 'inline-block' : 'none'; + if (lines.length > 0) { + tags[0].textContent = `Edit: "${truncate(lines[0], 20)}"`; + tags[0].dataset.action = `Edit the line: "${lines[0]}"`; + } + + // Tag 2 + tags[1].style.display = lines.length > 3 ? 'inline-block' : 'none'; + if (lines.length > 3) { + tags[1].textContent = `Add examples to line 4`; + tags[1].dataset.action = `Add more examples of things to the line: "${lines[3]}"`; + } + + // Tag 3 + tags[2].style.display = lines.length >= 3 ? 'inline-block' : 'none'; + if (lines.length >= 3) { + tags[2].textContent = `Remove: "${truncate(lines[2], 20)}"`; + tags[2].dataset.action = `Remove the line "${lines[2]}" from the paragraph: "${text}"`; + } + + // Tag 4 + tags[3].style.display = lines.length >= 2 ? 'inline-block' : 'none'; + if (lines.length >= 2) { + tags[3].textContent = `Make Subtle: "${truncate(lines[1], 20)}"`; + tags[3].dataset.action = `Make the following line more subtle: "${lines[1]}"`; + } + + // Tag 5 + tags[4].style.display = lines.length >= 5 ? 'inline-block' : 'none'; + if (lines.length >= 5) { + tags[4].textContent = `Improve Focus: "${truncate(lines[4], 20)}"`; + tags[4].dataset.action = `Improve the focus of the following line: "${lines[4]}"`; + } + } suggestionTagsContainer.addEventListener('click', (e) => { const tag = e.target.closest('.suggestion-tag'); if (tag && appState.currentEditingElement) { const action = tag.dataset.action; - const originalContent = appState.currentEditingElement.textContent.trim(); - document.getElementById('edit-prompt').value = `${action} the following text: "${originalContent}"`; + document.getElementById('edit-prompt').value = action; } }); @@ -1386,7 +1339,7 @@ document.getElementById('submit-edit-btn').addEventListener('click', async () => { const promptText = document.getElementById('edit-prompt').value.trim(); - const originalHTML = appState.currentEditingElement.innerHTML; + const originalHTML = appState.currentEditingElement.innerHTML; if (promptText && appState.currentEditingElement) { const fullPrompt = `You are an AI assistant that rewrites text. The user wants you to perform an action on a piece of text. The user's instruction is: "${promptText}". Execute this instruction and return ONLY the rewritten text, without any additional explanation or preamble.`; @@ -1416,11 +1369,11 @@ }, 3000); } - document.getElementById('export-proposal-gdocs-btn').addEventListener('click', () => { - showToast('Exporting proposal to Google Docs...'); - }); - document.getElementById('export-agreement-gdocs-btn').addEventListener('click', () => { - showToast('Exporting agreement to Google Docs...'); - }); + document.getElementById('download-proposal-pdf').addEventListener('click', () => showToast('Simulating PDF download...')); + document.getElementById('download-proposal-docx').addEventListener('click', () => showToast('Simulating DOCX download...')); + document.getElementById('download-agreement-pdf').addEventListener('click', () => showToast('Simulating PDF download...')); + document.getElementById('download-agreement-docx').addEventListener('click', () => showToast('Simulating DOCX download...')); });