tester343 commited on
Commit
02dcf01
·
verified ·
1 Parent(s): 2f40fa0

Update app_enhanced.py

Browse files
Files changed (1) hide show
  1. 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 (ANIMATED RING) */
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
- .panel { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; background: #000; cursor: grab; }
 
368
  .panel:active { cursor: grabbing; }
369
- .panel img { width: 100%; height: 100%; object-fit: contain; transform-origin: center; transition: transform 0.1s ease-out; }
370
- .panel.selected { border: 3px solid var(--accent); z-index: 5; }
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
- if(currentTool==='add') return;
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
- } else {
585
- e.stopPropagation(); selectBubble(b);
586
- window.dragActive = { b: b, type: 'move' };
 
 
 
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
- const rect = d.b.parentElement.getBoundingClientRect();
602
- d.b.style.left = (e.clientX - rect.left - d.b.offsetWidth/2) + 'px';
603
- d.b.style.top = (e.clientY - rect.top - d.b.offsetHeight/2) + 'px';
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
- // Clean up drag states
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');