|
52 | 52 | .screen{position:relative;outline:1px solid var(--line);background:#111;box-shadow:0 20px 60px rgba(13,18,28,.15);} |
53 | 53 | .screen .blind{position:absolute;background:rgba(214,69,69,.16);border:1px dashed rgba(214,69,69,.6)} |
54 | 54 | .screen .safe{position:absolute;background:rgba(20,164,77,.08);border:1px solid rgba(20,164,77,.6);outline:2px solid rgba(20,164,77,.25);} |
55 | | - .screen .inner{position:absolute;background:rgba(34,102,238,.06);border:1px solid rgba(34,102,238,.55);outline:2px solid rgba(34,102,238,.22)} |
| 55 | + .screen .inner{position:absolute;background:rgba(34,102,238,.06);border:1px solid rgba(34,102,238,.55);outline:2px solid rgba(34,102,238,.22);display:flex;align-items:center;justify-content:center;text-align:center} |
| 56 | + .screen .inner-label{pointer-events:none;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:8px 12px;border-radius:10px;background:rgba(255,255,255,.92);box-shadow:0 4px 18px rgba(20,36,66,.14);color:rgba(34,102,238,.95);font-weight:600;line-height:1.2} |
| 57 | + .screen .inner-label__px{letter-spacing:.01em} |
| 58 | + .screen .inner-label__percent{font-size:.85em;font-weight:500;color:rgba(34,102,238,.9)} |
56 | 59 |
|
57 | 60 | .rotate-btn{position:absolute;top:16px;right:16px;width:42px;height:42px;border-radius:50%;border:0;background:rgba(14,17,22,.78);color:#fff;display:flex;align-items:center;justify-content:center;font-size:18px;cursor:pointer;box-shadow:0 8px 20px rgba(13,18,28,.16);transition:background .2s ease,transform .2s ease} |
58 | 61 | .rotate-btn:hover{background:rgba(34,102,238,.88)} |
@@ -470,12 +473,50 @@ <h2>Популярні пресети (таблиця)</h2> |
470 | 473 | height:Math.round((safe.B - safe.T) * scale) + 'px' |
471 | 474 | }); |
472 | 475 |
|
473 | | - createLayer('inner', { |
| 476 | + const innerLayer = createLayer('inner', { |
474 | 477 | left:Math.round(inner.L * scale) + 'px', |
475 | 478 | top:Math.round(inner.T * scale) + 'px', |
476 | 479 | width:Math.round((inner.R - inner.L) * scale) + 'px', |
477 | 480 | height:Math.round((inner.B - inner.T) * scale) + 'px' |
478 | 481 | }); |
| 482 | + |
| 483 | + this.renderInnerLabel(innerLayer, ctx, scale); |
| 484 | + } |
| 485 | + |
| 486 | + renderInnerLabel(layer, ctx, scale){ |
| 487 | + if(!layer){ |
| 488 | + return; |
| 489 | + } |
| 490 | + |
| 491 | + const innerWidthPx = Math.max(0, Math.round(ctx.inner.R - ctx.inner.L)); |
| 492 | + const innerHeightPx = Math.max(0, Math.round(ctx.inner.B - ctx.inner.T)); |
| 493 | + if(innerWidthPx === 0 || innerHeightPx === 0){ |
| 494 | + return; |
| 495 | + } |
| 496 | + |
| 497 | + const label = document.createElement('div'); |
| 498 | + label.className = 'inner-label'; |
| 499 | + label.style.fontSize = Math.max(10, Math.min(20, Math.round(14 * scale))) + 'px'; |
| 500 | + |
| 501 | + const pxLine = document.createElement('div'); |
| 502 | + pxLine.className = 'inner-label__px'; |
| 503 | + pxLine.textContent = `${innerWidthPx} × ${innerHeightPx} px`; |
| 504 | + |
| 505 | + const percentLine = document.createElement('div'); |
| 506 | + percentLine.className = 'inner-label__percent'; |
| 507 | + const widthPercent = this.formatPercent(ctx.W ? (innerWidthPx / ctx.W) * 100 : 0); |
| 508 | + const heightPercent = this.formatPercent(ctx.H ? (innerHeightPx / ctx.H) * 100 : 0); |
| 509 | + percentLine.textContent = `${widthPercent} × ${heightPercent}`; |
| 510 | + |
| 511 | + label.append(pxLine, percentLine); |
| 512 | + layer.appendChild(label); |
| 513 | + } |
| 514 | + |
| 515 | + formatPercent(value){ |
| 516 | + if(!Number.isFinite(value)){ |
| 517 | + return '0.0%'; |
| 518 | + } |
| 519 | + return `${value.toFixed(1)}%`; |
479 | 520 | } |
480 | 521 | } |
481 | 522 |
|
|
0 commit comments