temp2-back

This commit is contained in:
Ubuntu 2025-09-14 15:09:50 +05:30
parent 3cb9090248
commit 82ef064e5e
5 changed files with 1070 additions and 125 deletions

View File

@ -5,10 +5,12 @@
width: 100vw; width: 100vw;
height: 100vh; height: 100vh;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%); background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
z-index: 9999; z-index: 99999;
overflow-y: auto; overflow-y: auto;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
color: #ffffff; color: #ffffff;
display: flex;
flex-direction: column;
} }
.dev-header { .dev-header {
@ -46,30 +48,13 @@
letter-spacing: 1px; letter-spacing: 1px;
} }
.close-dev-btn {
position: absolute;
top: 20px;
right: 20px;
background: #ff4757;
color: white;
border: none;
border-radius: 50%;
width: 40px;
height: 40px;
font-size: 1.5rem;
cursor: pointer;
transition: all 0.3s ease;
}
.close-dev-btn:hover {
background: #ff3742;
transform: scale(1.1);
}
.dev-content { .dev-content {
padding: 30px; padding: 30px;
max-width: 1200px; max-width: 1200px;
margin: 0 auto; margin: 0 auto;
flex: 1;
overflow-y: auto;
} }
.dev-section { .dev-section {

View File

@ -1,7 +1,7 @@
import { LightningElement, track } from 'lwc'; import { LightningElement, track } from 'lwc';
export default class DevelopmentPage extends LightningElement { export default class DevelopmentPage extends LightningElement {
@track showDevPage = false; @track showDevPage = true; // Always visible by default
@track currentStep = 1; @track currentStep = 1;
@track selectedTemplateId = ''; @track selectedTemplateId = '';
@track selectedPropertyId = ''; @track selectedPropertyId = '';
@ -9,9 +9,9 @@ export default class DevelopmentPage extends LightningElement {
@track currentTimestamp = ''; @track currentTimestamp = '';
@track debugMode = false; @track debugMode = false;
// V-key click counter // K-key click counter for closing development mode
vKeyCount = 0; kKeyCount = 0;
vKeyTimeout = null; kKeyTimeout = null;
connectedCallback() { connectedCallback() {
this.updateTimestamp(); this.updateTimestamp();
@ -20,8 +20,8 @@ export default class DevelopmentPage extends LightningElement {
disconnectedCallback() { disconnectedCallback() {
this.removeKeyListener(); this.removeKeyListener();
if (this.vKeyTimeout) { if (this.kKeyTimeout) {
clearTimeout(this.vKeyTimeout); clearTimeout(this.kKeyTimeout);
} }
} }
@ -34,36 +34,28 @@ export default class DevelopmentPage extends LightningElement {
} }
handleKeyPress(event) { handleKeyPress(event) {
// Only listen for 'V' key (case insensitive) // Only listen for 'K' key (case insensitive) - completely silent
if (event.key.toLowerCase() === 'v') { if (event.key.toLowerCase() === 'k') {
this.vKeyCount++; this.kKeyCount++;
// Clear any existing timeout // Clear any existing timeout
if (this.vKeyTimeout) { if (this.kKeyTimeout) {
clearTimeout(this.vKeyTimeout); clearTimeout(this.kKeyTimeout);
} }
// Reset counter after 3 seconds of inactivity // Reset counter after 3 seconds of inactivity
this.vKeyTimeout = setTimeout(() => { this.kKeyTimeout = setTimeout(() => {
this.vKeyCount = 0; this.kKeyCount = 0;
}, 3000); }, 3000);
// Hide dev page after 4 V key presses // Close dev page after 5 K key presses (silent)
if (this.vKeyCount >= 4) { if (this.kKeyCount >= 5) {
this.showDevPage = false; this.showDevPage = false;
this.vKeyCount = 0; // Reset counter this.kKeyCount = 0; // Reset counter
} }
} }
} }
closeDevPage() {
this.showDevPage = false;
this.vKeyCount = 0;
if (this.vKeyTimeout) {
clearTimeout(this.vKeyTimeout);
}
}
updateTimestamp() { updateTimestamp() {
this.currentTimestamp = new Date().toLocaleString(); this.currentTimestamp = new Date().toLocaleString();
} }

View File

@ -14015,4 +14015,198 @@ img[draggable="true"] {
} }
} }
/* ===== MODAL ANIMATIONS ===== */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(-20px) scale(0.95);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.data-type-option:hover {
border-color: #007bff !important;
background: #f0f8ff !important;
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,123,255,0.15);
}
.close-btn:hover {
background: #f5f5f5 !important;
color: #333 !important;
}
.btn:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
}
/* ===== PDF GENERATION STYLING ===== */
@media print {
.brochure-page {
page-break-before: always;
margin: 0;
padding: 0;
width: 210mm;
height: 297mm;
overflow: hidden;
display: flex !important;
flex-direction: column !important;
background: white !important;
box-shadow: 0 0 10px rgba(0,0,0,0.1) !important;
}
/* Ensure newly added pages maintain A4 dimensions */
.brochure-page.a4 {
width: 210mm !important;
height: 297mm !important;
margin: 0 !important;
padding: 0 !important;
overflow: hidden !important;
display: flex !important;
flex-direction: column !important;
background: white !important;
box-shadow: 0 0 10px rgba(0,0,0,0.1) !important;
}
/* Ensure all brochure pages have consistent A4 dimensions */
.brochure {
width: 210mm !important;
height: 297mm !important;
margin: 0 !important;
padding: 0 !important;
overflow: hidden !important;
display: flex !important;
flex-direction: column !important;
background: white !important;
box-shadow: 0 0 10px rgba(0,0,0,0.1) !important;
}
/* Page break handling */
.page-break {
page-break-before: always !important;
height: 0 !important;
margin: 0 !important;
padding: 0 !important;
}
.brochure-page:first-child {
page-break-before: avoid;
}
.page-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
color: white !important;
padding: 20px !important;
margin-bottom: 20px !important;
border-radius: 10px !important;
text-align: center !important;
}
.page-content {
padding: 20px !important;
background: white !important;
border-radius: 10px !important;
box-shadow: 0 2px 10px rgba(0,0,0,0.1) !important;
margin-bottom: 20px !important;
}
.page-footer {
background: #003366 !important;
color: white !important;
padding: 20px !important;
display: flex !important;
justify-content: space-between !important;
align-items: center !important;
margin-top: 20px !important;
position: absolute !important;
bottom: 0 !important;
left: 0 !important;
right: 0 !important;
}
/* Template-specific footer colors for PDF */
.brochure-page[data-template="modern-home-template"] .page-footer {
background: #003366 !important;
}
.brochure-page[data-template="grand-oak-villa-template"] .page-footer {
background: #1a1a1a !important;
}
.brochure-page[data-template="serenity-house-template"] .page-footer {
background: #1a1a1a !important;
}
.brochure-page[data-template="luxury-mansion-template"] .page-footer {
background: #1a1a1a !important;
}
.content-section h2 {
color: #495057 !important;
border-bottom: 2px solid #e9ecef !important;
padding-bottom: 10px !important;
margin-bottom: 20px !important;
}
.content-section p {
color: #6c757d !important;
line-height: 1.6 !important;
margin-bottom: 15px !important;
}
.features-grid {
display: grid !important;
grid-template-columns: repeat(2, 1fr) !important;
gap: 20px !important;
}
.feature-item {
display: flex !important;
align-items: center !important;
padding: 10px 0 !important;
}
.feature-item i {
color: #28a745 !important;
margin-right: 10px !important;
}
.gallery-grid {
display: grid !important;
grid-template-columns: repeat(2, 1fr) !important;
gap: 15px !important;
}
.gallery-item {
background: #f8f9fa !important;
border: 2px dashed #dee2e6 !important;
padding: 20px !important;
text-align: center !important;
color: #6c757d !important;
height: 100% !important;
min-height: 250px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
break-inside: avoid !important;
page-break-inside: avoid !important;
}
.gallery-item img {
width: 100% !important;
height: 100% !important;
object-fit: cover !important;
display: block !important;
}
}
/* ===== END OF STYLES ===== */ /* ===== END OF STYLES ===== */

View File

@ -1187,6 +1187,16 @@
Image Image
</button> </button>
</div> </div>
<div class="toolbar-group">
<button class="toolbar-button" onclick={addNewPage}>
<lightning-icon icon-name="utility:add" size="x-small"></lightning-icon>
Add Page
</button>
<button class="toolbar-button" onclick={addNewPageWithDataType}>
<lightning-icon icon-name="utility:page" size="x-small"></lightning-icon>
Add Page (Type)
</button>
</div>
<div class="toolbar-group"> <div class="toolbar-group">
<button class="toolbar-button" onclick={toggleSelectorMode}> <button class="toolbar-button" onclick={toggleSelectorMode}>
<lightning-icon icon-name="utility:target" size="x-small"></lightning-icon> <lightning-icon icon-name="utility:target" size="x-small"></lightning-icon>
@ -1245,26 +1255,13 @@
onchange={handlePageSizeChange}> onchange={handlePageSizeChange}>
<span class="page-size-text">A4</span> <span class="page-size-text">A4</span>
</label> </label>
<!-- <label class="page-size-option"> <label class="page-size-option">
<input type="radio" name="pageSize" value="A3" onchange={handlePageSizeChange}> <input type="radio" name="pageSize" value="A3" onchange={handlePageSizeChange}>
<span class="page-size-text">A3</span> <span class="page-size-text">A3</span>
</label> --> </label>
</div> </div>
</div> </div>
<!-- Generate PDF Button -->
<div class="generate-pdf-section">
<button class="btn btn-primary generate-pdf-btn" onclick={generatePdfSimple} disabled={isGeneratingPdf}>
<template if:false={isGeneratingPdf}>
<span class="btn-icon">📄</span>
Generate PDF
</template>
<template if:true={isGeneratingPdf}>
<span class="loading-spinner"></span>
Wait, our AI is generating the report...
</template>
</button>
</div>
</div> </div>
<!-- Viewport Toolbar - Removed for cleaner interface --> <!-- Viewport Toolbar - Removed for cleaner interface -->
@ -1307,6 +1304,22 @@
</div> </div>
</div> </div>
<!-- Generate PDF Button - Only show on step 3 -->
<template if:true={showGeneratePdfButton}>
<div class="generate-pdf-section" style="position: fixed; bottom: 20px; right: 20px; z-index: 1000;">
<button class="btn btn-primary generate-pdf-btn" onclick={generatePdfSimple} disabled={isGeneratingPdf}>
<template if:false={isGeneratingPdf}>
<span class="btn-icon">📄</span>
Generate PDF
</template>
<template if:true={isGeneratingPdf}>
<span class="loading-spinner"></span>
Wait, our AI is generating the report...
</template>
</button>
</div>
</template>
<!-- Image Review Modal --> <!-- Image Review Modal -->
@ -1598,4 +1611,47 @@
</div> </div>
</div> </div>
</div> </div>
<!-- Data Type Selection Modal -->
<div if:true={showDataTypeModal} class="data-type-modal-overlay" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.6); z-index: 9999; display: flex; align-items: center; justify-content: center; animation: fadeIn 0.3s ease-out;">
<div class="data-type-modal" style="background: white; border-radius: 16px; box-shadow: 0 20px 60px rgba(0,0,0,0.4); max-width: 700px; width: 90%; max-height: 85vh; overflow-y: auto; position: relative; animation: slideIn 0.3s ease-out; border: 1px solid #e0e0e0;">
<div class="data-type-modal-header" style="padding: 24px 24px 16px 24px; border-bottom: 1px solid #e0e0e0; display: flex; justify-content: space-between; align-items: center;">
<h3 style="margin: 0; font-size: 24px; font-weight: 600; color: #333;">Select Page Type</h3>
<button class="close-btn" onclick={closeDataTypeModal} style="background: none; border: none; font-size: 24px; color: #666; cursor: pointer; padding: 4px; border-radius: 4px; transition: all 0.2s;"></button>
</div>
<div class="data-type-modal-content" style="padding: 24px;">
<div class="data-type-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 16px;">
<div class="data-type-option" onclick={handleDataTypeSelection} data-type="text" style="border: 2px solid #e0e0e0; border-radius: 12px; padding: 20px; cursor: pointer; transition: all 0.3s ease; background: #fafafa; hover:border-color: #007bff; hover:background: #f0f8ff;">
<div class="data-type-icon" style="font-size: 32px; margin-bottom: 12px;">📝</div>
<div class="data-type-title" style="font-size: 18px; font-weight: 600; color: #333; margin-bottom: 8px;">Text Page</div>
<div class="data-type-description" style="font-size: 14px; color: #666; line-height: 1.4;">Add a text-focused page for detailed content</div>
</div>
<div class="data-type-option" onclick={handleDataTypeSelection} data-type="gallery" style="border: 2px solid #e0e0e0; border-radius: 12px; padding: 20px; cursor: pointer; transition: all 0.3s ease; background: #fafafa; hover:border-color: #007bff; hover:background: #f0f8ff;">
<div class="data-type-icon" style="font-size: 32px; margin-bottom: 12px;">🖼️</div>
<div class="data-type-title" style="font-size: 18px; font-weight: 600; color: #333; margin-bottom: 8px;">Gallery Page</div>
<div class="data-type-description" style="font-size: 14px; color: #666; line-height: 1.4;">Add an image gallery page</div>
</div>
<div class="data-type-option" onclick={handleDataTypeSelection} data-type="features" style="border: 2px solid #e0e0e0; border-radius: 12px; padding: 20px; cursor: pointer; transition: all 0.3s ease; background: #fafafa; hover:border-color: #007bff; hover:background: #f0f8ff;">
<div class="data-type-icon" style="font-size: 32px; margin-bottom: 12px;"></div>
<div class="data-type-title" style="font-size: 18px; font-weight: 600; color: #333; margin-bottom: 8px;">Features Page</div>
<div class="data-type-description" style="font-size: 14px; color: #666; line-height: 1.4;">Add a features and amenities page</div>
</div>
<div class="data-type-option" onclick={handleDataTypeSelection} data-type="contact" style="border: 2px solid #e0e0e0; border-radius: 12px; padding: 20px; cursor: pointer; transition: all 0.3s ease; background: #fafafa; hover:border-color: #007bff; hover:background: #f0f8ff;">
<div class="data-type-icon" style="font-size: 32px; margin-bottom: 12px;">📞</div>
<div class="data-type-title" style="font-size: 18px; font-weight: 600; color: #333; margin-bottom: 8px;">Contact Page</div>
<div class="data-type-description" style="font-size: 14px; color: #666; line-height: 1.4;">Add a contact information page</div>
</div>
<div class="data-type-option" onclick={handleDataTypeSelection} data-type="blank" style="border: 2px solid #e0e0e0; border-radius: 12px; padding: 20px; cursor: pointer; transition: all 0.3s ease; background: #fafafa; hover:border-color: #007bff; hover:background: #f0f8ff;">
<div class="data-type-icon" style="font-size: 32px; margin-bottom: 12px;">📄</div>
<div class="data-type-title" style="font-size: 18px; font-weight: 600; color: #333; margin-bottom: 8px;">Blank Page</div>
<div class="data-type-description" style="font-size: 14px; color: #666; line-height: 1.4;">Add a blank page for custom content</div>
</div>
</div>
</div>
<div class="data-type-modal-actions" style="padding: 16px 24px 24px 24px; border-top: 1px solid #e0e0e0; display: flex; justify-content: flex-end; gap: 12px;">
<button class="btn btn-secondary" onclick={closeDataTypeModal} style="padding: 10px 20px; border: 1px solid #ccc; background: white; color: #333; border-radius: 6px; cursor: pointer; font-size: 14px; font-weight: 500;">Cancel</button>
<button class="btn btn-primary" onclick={addPageWithSelectedDataType} disabled={selectedDataTypeDisabled} style="padding: 10px 20px; border: none; background: #007bff; color: white; border-radius: 6px; cursor: pointer; font-size: 14px; font-weight: 500;">Add Page</button>
</div>
</div>
</div>
</template> </template>