diff --git a/src/lib/components/ActionSidebar.svelte b/src/lib/components/ActionSidebar.svelte index 03b7814..6405627 100644 --- a/src/lib/components/ActionSidebar.svelte +++ b/src/lib/components/ActionSidebar.svelte @@ -84,8 +84,9 @@ holdTimer = setTimeout(() => { holdFired = true; if (onreactionhold && saveBtnEl) { - const rect = saveBtnEl.getBoundingClientRect(); - onreactionhold(rect.left + rect.width / 2, rect.top); + const circle = saveBtnEl.querySelector('.icon-circle'); + const rect = (circle ?? saveBtnEl).getBoundingClientRect(); + onreactionhold(rect.left + rect.width / 2, rect.top + rect.height / 2); } }, 350); } diff --git a/src/lib/components/EmojiShower.svelte b/src/lib/components/EmojiShower.svelte index b21a967..fb655e9 100644 --- a/src/lib/components/EmojiShower.svelte +++ b/src/lib/components/EmojiShower.svelte @@ -29,22 +29,22 @@ let particles = $state([]); onMount(() => { - const count = 10 + Math.floor(Math.random() * 6); + const count = 8 + Math.floor(Math.random() * 5); // 8–12 particles let maxEnd = 0; particles = Array.from({ length: count }, (_, i) => { - const dur = 1.0 + Math.random() * 0.8; - const del = Math.random() * 250; + const dur = 0.8 + Math.random() * 0.6; // 0.8–1.4s (snappy) + const del = Math.random() * 200; // tight stagger maxEnd = Math.max(maxEnd, dur * 1000 + del); return { id: i, emoji, - x: x + (Math.random() - 0.5) * 30, - y: y + (Math.random() - 0.5) * 20, - scale: 0.5 + Math.random() * 0.9, - travel: 200 + Math.random() * 200, - wobble: 20 + Math.random() * 30, + x: x + (Math.random() - 0.5) * 80, // moderate spread + y: y + (Math.random() - 0.5) * 40, + scale: 0.6 + Math.random() * 0.8, // 0.6–1.4x + travel: 120 + Math.random() * 160, // 120–280px upward + wobble: 15 + Math.random() * 30, // gentle lateral drift rotation: (Math.random() - 0.5) * 30, duration: dur, delay: del @@ -95,32 +95,27 @@ @keyframes float-up { 0% { - opacity: 1; + opacity: 0.9; transform: translate(-50%, -50%) scale(0) rotate(0deg); } - 8% { - opacity: 1; + 10% { + opacity: 0.9; transform: translate(-50%, -50%) scale(var(--scale)) rotate(0deg); } - 25% { - opacity: 1; - transform: translate(calc(-50% + var(--wobble)), calc(-50% - var(--travel) * 0.25)) + 40% { + opacity: 0.7; + transform: translate(calc(-50% + var(--wobble)), calc(-50% - var(--travel) * 0.4)) scale(var(--scale)) rotate(var(--rotation)); } - 50% { - opacity: 1; - transform: translate(calc(-50% - var(--wobble) * 0.5), calc(-50% - var(--travel) * 0.5)) - scale(var(--scale)) rotate(calc(var(--rotation) * -0.5)); - } - 75% { - opacity: 0.7; - transform: translate(calc(-50% + var(--wobble) * 0.3), calc(-50% - var(--travel) * 0.75)) - scale(calc(var(--scale) * 0.8)) rotate(var(--rotation)); + 70% { + opacity: 0.3; + transform: translate(calc(-50% - var(--wobble) * 0.4), calc(-50% - var(--travel) * 0.7)) + scale(calc(var(--scale) * 0.85)) rotate(calc(var(--rotation) * -0.5)); } 100% { opacity: 0; - transform: translate(calc(-50% - var(--wobble) * 0.2), calc(-50% - var(--travel))) - scale(calc(var(--scale) * 0.5)) rotate(calc(var(--rotation) * -1)); + transform: translate(calc(-50% + var(--wobble) * 0.2), calc(-50% - var(--travel))) + scale(calc(var(--scale) * 0.6)) rotate(calc(var(--rotation) * -1)); } } diff --git a/src/lib/components/ReactionPicker.svelte b/src/lib/components/ReactionPicker.svelte index 2ab9e6a..490b6ee 100644 --- a/src/lib/components/ReactionPicker.svelte +++ b/src/lib/components/ReactionPicker.svelte @@ -1,9 +1,10 @@ + +
e.stopPropagation()} + ontouchmove={(e) => e.stopPropagation()} + ontouchend={(e) => e.stopPropagation()} + onpointerdown={(e) => e.stopPropagation()} > - {#each REACTIONS as emoji, i (emoji)} + {#each BAR_EMOJIS as emoji, i (emoji)} + {@const delayIndex = BAR_EMOJIS.length - 1 - i}