Update app_enhanced.py
Browse files- app_enhanced.py +17 -17
app_enhanced.py
CHANGED
|
@@ -329,7 +329,7 @@ INDEX_HTML = r'''
|
|
| 329 |
.splash-btn { padding: 20px 60px; font-size: 24px; background: var(--accent); color: #000; border: none; border-radius: 50px; cursor: pointer; font-family: 'Bangers'; letter-spacing: 2px; text-transform: uppercase; animation: pulse 2s infinite; transition: 0.2s; z-index: 2; }
|
| 330 |
.splash-btn:hover { transform: scale(1.1) rotate(-2deg); background: #fff; }
|
| 331 |
|
| 332 |
-
/* LOADING SCREEN
|
| 333 |
#loading-screen { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #000; z-index: 4000; flex-direction: column; align-items: center; justify-content: center; color: var(--accent); }
|
| 334 |
.spinner { width: 80px; height: 80px; border: 8px solid rgba(255,255,255,0.1); border-top: 8px solid var(--accent); border-radius: 50%; animation: spin 1s linear infinite; margin-bottom: 20px; box-shadow: var(--neon-glow); }
|
| 335 |
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
|
|
@@ -364,12 +364,13 @@ INDEX_HTML = r'''
|
|
| 364 |
.comic-page { width: 1080px; height: 1080px; background: white; box-shadow: 0 0 30px rgba(0,0,0,0.5); position: relative; overflow: hidden; border: 5px solid #fff; flex-shrink: 0; }
|
| 365 |
.comic-grid { width: 100%; height: 100%; position: relative; background: #fff; --y: 50%; --t1: 100%; --t2: 100%; --b1: 100%; --b2: 100%; --gap: 5px; }
|
| 366 |
.placement-mode { cursor: crosshair !important; }
|
| 367 |
-
|
|
|
|
| 368 |
.panel:active { cursor: grabbing; }
|
| 369 |
-
.panel img { width: 100%; height: 100%; object-fit: contain;
|
| 370 |
-
.panel.selected { border:
|
| 371 |
|
| 372 |
-
/* CLIP PATHS */
|
| 373 |
.panel:nth-child(1) { clip-path: polygon(0 0, calc(var(--t1) - var(--gap)) 0, calc(var(--t2) - var(--gap)) calc(var(--y) - var(--gap)), 0 calc(var(--y) - var(--gap))); }
|
| 374 |
.panel:nth-child(2) { clip-path: polygon(calc(var(--t1) + var(--gap)) 0, 100% 0, 100% calc(var(--y) - var(--gap)), calc(var(--t2) + var(--gap)) calc(var(--y) - var(--gap))); }
|
| 375 |
.panel:nth-child(3) { clip-path: polygon(0 calc(var(--y) + var(--gap)), calc(var(--b1) - var(--gap)) calc(var(--y) + var(--gap)), calc(var(--b2) - var(--gap)) 100%, 0 100%); }
|
|
@@ -578,12 +579,15 @@ INDEX_HTML = r'''
|
|
| 578 |
b.innerHTML = `<span class="bubble-text">${d.text}</span><div class="resize-handle"></div>`;
|
| 579 |
|
| 580 |
b.onmousedown = (e) => {
|
| 581 |
-
|
| 582 |
if(e.target.classList.contains('resize-handle')) {
|
| 583 |
window.dragActive = { b: b, startW: b.offsetWidth, startH: b.offsetHeight, mx: e.clientX, my: e.clientY, type: 'resize' };
|
| 584 |
-
|
| 585 |
-
|
| 586 |
-
|
|
|
|
|
|
|
|
|
|
| 587 |
}
|
| 588 |
};
|
| 589 |
b.ondblclick = (e) => { e.stopPropagation(); const t=prompt("Edit:", b.innerText); if(t) b.querySelector('.bubble-text').innerText=t; };
|
|
@@ -598,10 +602,9 @@ INDEX_HTML = r'''
|
|
| 598 |
d.b.style.width = (d.startW + (e.clientX - d.mx)) + 'px';
|
| 599 |
d.b.style.height = (d.startH + (e.clientY - d.my)) + 'px';
|
| 600 |
} else if(d.type === 'move') {
|
| 601 |
-
|
| 602 |
-
d.b.style.
|
| 603 |
-
|
| 604 |
-
} else if(d.type === 'pan_image') { // FIXED IMAGE PANNING
|
| 605 |
const dx = e.clientX - d.startX;
|
| 606 |
const dy = e.clientY - d.startY;
|
| 607 |
d.img.dataset.translateX = d.tx + dx;
|
|
@@ -611,10 +614,7 @@ INDEX_HTML = r'''
|
|
| 611 |
}
|
| 612 |
});
|
| 613 |
|
| 614 |
-
|
| 615 |
-
document.addEventListener('mouseup', () => {
|
| 616 |
-
window.dragActive = null;
|
| 617 |
-
});
|
| 618 |
|
| 619 |
function selectBubble(b) {
|
| 620 |
if(selectedBubble) selectedBubble.classList.remove('selected');
|
|
|
|
| 329 |
.splash-btn { padding: 20px 60px; font-size: 24px; background: var(--accent); color: #000; border: none; border-radius: 50px; cursor: pointer; font-family: 'Bangers'; letter-spacing: 2px; text-transform: uppercase; animation: pulse 2s infinite; transition: 0.2s; z-index: 2; }
|
| 330 |
.splash-btn:hover { transform: scale(1.1) rotate(-2deg); background: #fff; }
|
| 331 |
|
| 332 |
+
/* LOADING SCREEN */
|
| 333 |
#loading-screen { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #000; z-index: 4000; flex-direction: column; align-items: center; justify-content: center; color: var(--accent); }
|
| 334 |
.spinner { width: 80px; height: 80px; border: 8px solid rgba(255,255,255,0.1); border-top: 8px solid var(--accent); border-radius: 50%; animation: spin 1s linear infinite; margin-bottom: 20px; box-shadow: var(--neon-glow); }
|
| 335 |
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
|
|
|
|
| 364 |
.comic-page { width: 1080px; height: 1080px; background: white; box-shadow: 0 0 30px rgba(0,0,0,0.5); position: relative; overflow: hidden; border: 5px solid #fff; flex-shrink: 0; }
|
| 365 |
.comic-grid { width: 100%; height: 100%; position: relative; background: #fff; --y: 50%; --t1: 100%; --t2: 100%; --b1: 100%; --b2: 100%; --gap: 5px; }
|
| 366 |
.placement-mode { cursor: crosshair !important; }
|
| 367 |
+
|
| 368 |
+
.panel { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; background: #000; cursor: grab; z-index:1; }
|
| 369 |
.panel:active { cursor: grabbing; }
|
| 370 |
+
.panel img { width: 100%; height: 100%; object-fit: contain; }
|
| 371 |
+
.panel.selected { border: 4px solid var(--accent); z-index: 5; }
|
| 372 |
|
| 373 |
+
/* CLIP PATHS - ADDED GAPS FOR "LINES" */
|
| 374 |
.panel:nth-child(1) { clip-path: polygon(0 0, calc(var(--t1) - var(--gap)) 0, calc(var(--t2) - var(--gap)) calc(var(--y) - var(--gap)), 0 calc(var(--y) - var(--gap))); }
|
| 375 |
.panel:nth-child(2) { clip-path: polygon(calc(var(--t1) + var(--gap)) 0, 100% 0, 100% calc(var(--y) - var(--gap)), calc(var(--t2) + var(--gap)) calc(var(--y) - var(--gap))); }
|
| 376 |
.panel:nth-child(3) { clip-path: polygon(0 calc(var(--y) + var(--gap)), calc(var(--b1) - var(--gap)) calc(var(--y) + var(--gap)), calc(var(--b2) - var(--gap)) 100%, 0 100%); }
|
|
|
|
| 579 |
b.innerHTML = `<span class="bubble-text">${d.text}</span><div class="resize-handle"></div>`;
|
| 580 |
|
| 581 |
b.onmousedown = (e) => {
|
| 582 |
+
// If resizing, ignore move
|
| 583 |
if(e.target.classList.contains('resize-handle')) {
|
| 584 |
window.dragActive = { b: b, startW: b.offsetWidth, startH: b.offsetHeight, mx: e.clientX, my: e.clientY, type: 'resize' };
|
| 585 |
+
e.stopPropagation(); // prevent panel dragging
|
| 586 |
+
} else if(currentTool !== 'add') {
|
| 587 |
+
// Bubble dragging
|
| 588 |
+
window.dragActive = { b: b, type: 'move', offsetX: e.clientX - b.offsetLeft, offsetY: e.clientY - b.offsetTop };
|
| 589 |
+
selectBubble(b);
|
| 590 |
+
e.stopPropagation(); // prevent panel dragging
|
| 591 |
}
|
| 592 |
};
|
| 593 |
b.ondblclick = (e) => { e.stopPropagation(); const t=prompt("Edit:", b.innerText); if(t) b.querySelector('.bubble-text').innerText=t; };
|
|
|
|
| 602 |
d.b.style.width = (d.startW + (e.clientX - d.mx)) + 'px';
|
| 603 |
d.b.style.height = (d.startH + (e.clientY - d.my)) + 'px';
|
| 604 |
} else if(d.type === 'move') {
|
| 605 |
+
d.b.style.left = (e.clientX - d.offsetX) + 'px';
|
| 606 |
+
d.b.style.top = (e.clientY - d.offsetY) + 'px';
|
| 607 |
+
} else if(d.type === 'pan_image') { // IMAGE PANNING
|
|
|
|
| 608 |
const dx = e.clientX - d.startX;
|
| 609 |
const dy = e.clientY - d.startY;
|
| 610 |
d.img.dataset.translateX = d.tx + dx;
|
|
|
|
| 614 |
}
|
| 615 |
});
|
| 616 |
|
| 617 |
+
document.addEventListener('mouseup', () => { window.dragActive = null; });
|
|
|
|
|
|
|
|
|
|
| 618 |
|
| 619 |
function selectBubble(b) {
|
| 620 |
if(selectedBubble) selectedBubble.classList.remove('selected');
|