tg stickers v4
This commit is contained in:
@@ -5649,6 +5649,33 @@ body[type='login'] {
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Hold-to-preview sticker overlay */
|
||||||
|
.sticker-preview-overlay {
|
||||||
|
position: fixed;
|
||||||
|
inset: 0;
|
||||||
|
z-index: 99999;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: rgba(0, 0, 0, 0.8);
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.12s ease;
|
||||||
|
}
|
||||||
|
.sticker-preview-overlay.visible {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.sticker-preview-overlay img,
|
||||||
|
.sticker-preview-overlay video {
|
||||||
|
max-width: min(85vw, 420px);
|
||||||
|
max-height: min(85vh, 420px);
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
object-fit: contain;
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.6);
|
||||||
|
}
|
||||||
|
|
||||||
.emoji-picker img {
|
.emoji-picker img {
|
||||||
width: 60px;
|
width: 60px;
|
||||||
height: 60px;
|
height: 60px;
|
||||||
@@ -5690,7 +5717,6 @@ body[type='login'] {
|
|||||||
background: transparent;
|
background: transparent;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
opacity: 0.55;
|
opacity: 0.55;
|
||||||
border-radius: 6px;
|
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4014,6 +4014,30 @@ class CommentSystem {
|
|||||||
let picker = null;
|
let picker = null;
|
||||||
let closeHandler = null;
|
let closeHandler = null;
|
||||||
|
|
||||||
|
// ── Shared sticker hold-to-preview overlay ────────────────────────
|
||||||
|
if (!window.stickerPreview) {
|
||||||
|
const overlay = document.createElement('div');
|
||||||
|
overlay.className = 'sticker-preview-overlay';
|
||||||
|
document.body.appendChild(overlay);
|
||||||
|
let _hideTimer = null;
|
||||||
|
window.stickerPreview = {
|
||||||
|
show(src, isVideo) {
|
||||||
|
clearTimeout(_hideTimer);
|
||||||
|
overlay.innerHTML = '';
|
||||||
|
const el = isVideo ? document.createElement('video') : document.createElement('img');
|
||||||
|
el.src = src;
|
||||||
|
if (isVideo) { el.autoplay = true; el.loop = true; el.muted = true; el.playsInline = true; }
|
||||||
|
overlay.appendChild(el);
|
||||||
|
overlay.classList.add('visible');
|
||||||
|
if (isVideo) el.play().catch(() => {});
|
||||||
|
},
|
||||||
|
hide() {
|
||||||
|
overlay.classList.remove('visible');
|
||||||
|
_hideTimer = setTimeout(() => { overlay.innerHTML = ''; }, 200);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const buildPickerContent = () => {
|
const buildPickerContent = () => {
|
||||||
if (!picker) return;
|
if (!picker) return;
|
||||||
picker.innerHTML = '';
|
picker.innerHTML = '';
|
||||||
@@ -4028,8 +4052,9 @@ class CommentSystem {
|
|||||||
|
|
||||||
// Helper: create img or video element for a given emoji URL
|
// Helper: create img or video element for a given emoji URL
|
||||||
const makeEmojiEl = (url, name) => {
|
const makeEmojiEl = (url, name) => {
|
||||||
|
const isVideo = url && url.endsWith('.webm');
|
||||||
let el;
|
let el;
|
||||||
if (url && url.endsWith('.webm')) {
|
if (isVideo) {
|
||||||
el = document.createElement('video');
|
el = document.createElement('video');
|
||||||
el.src = url;
|
el.src = url;
|
||||||
el.autoplay = true;
|
el.autoplay = true;
|
||||||
@@ -4043,6 +4068,17 @@ class CommentSystem {
|
|||||||
}
|
}
|
||||||
el.title = `:${name}:`;
|
el.title = `:${name}:`;
|
||||||
el.onerror = () => { el.style.display = 'none'; };
|
el.onerror = () => { el.style.display = 'none'; };
|
||||||
|
// Hold-to-preview
|
||||||
|
let holdTimer = null;
|
||||||
|
const startHold = () => { holdTimer = setTimeout(() => window.stickerPreview?.show(url, isVideo), 400); };
|
||||||
|
const cancelHold = () => { clearTimeout(holdTimer); };
|
||||||
|
const endHold = () => { clearTimeout(holdTimer); window.stickerPreview?.hide(); };
|
||||||
|
el.addEventListener('mousedown', startHold);
|
||||||
|
el.addEventListener('mouseup', endHold);
|
||||||
|
el.addEventListener('mouseleave', cancelHold);
|
||||||
|
el.addEventListener('touchstart', startHold, { passive: true });
|
||||||
|
el.addEventListener('touchend', endHold);
|
||||||
|
el.addEventListener('touchcancel', endHold);
|
||||||
return el;
|
return el;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1768,8 +1768,9 @@ if (window.__dmLoaded) {
|
|||||||
|
|
||||||
// ── Helper: img or video element for a given emoji URL ────────────────
|
// ── Helper: img or video element for a given emoji URL ────────────────
|
||||||
function makeDmEmojiEl(url, name) {
|
function makeDmEmojiEl(url, name) {
|
||||||
|
const isVideo = url && url.endsWith('.webm');
|
||||||
let el;
|
let el;
|
||||||
if (url && url.endsWith('.webm')) {
|
if (isVideo) {
|
||||||
el = document.createElement('video');
|
el = document.createElement('video');
|
||||||
el.src = url;
|
el.src = url;
|
||||||
el.autoplay = true;
|
el.autoplay = true;
|
||||||
@@ -1783,6 +1784,17 @@ if (window.__dmLoaded) {
|
|||||||
}
|
}
|
||||||
el.title = `:${name}:`;
|
el.title = `:${name}:`;
|
||||||
el.onerror = () => { el.style.display = 'none'; };
|
el.onerror = () => { el.style.display = 'none'; };
|
||||||
|
// Hold-to-preview (uses shared window.stickerPreview from comments.js)
|
||||||
|
let holdTimer = null;
|
||||||
|
const startHold = () => { holdTimer = setTimeout(() => window.stickerPreview?.show(url, isVideo), 400); };
|
||||||
|
const cancelHold = () => { clearTimeout(holdTimer); };
|
||||||
|
const endHold = () => { clearTimeout(holdTimer); window.stickerPreview?.hide(); };
|
||||||
|
el.addEventListener('mousedown', startHold);
|
||||||
|
el.addEventListener('mouseup', endHold);
|
||||||
|
el.addEventListener('mouseleave', cancelHold);
|
||||||
|
el.addEventListener('touchstart', startHold, { passive: true });
|
||||||
|
el.addEventListener('touchend', endHold);
|
||||||
|
el.addEventListener('touchcancel', endHold);
|
||||||
return el;
|
return el;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user