1import './emoji-picker-element.mjs'; 2 3$(document).ready(function () { 4 let $emojiPicker = $('#emoji-picker'); 5 let $activeElement = null; 6 if ($emojiPicker.length === 0) { 7 $('body').append('<emoji-picker id="emoji-picker" class="light"></emoji-picker>'); 8 $emojiPicker = $('#emoji-picker'); 9 } 10 11 // Event delegation for .emoji-trigger elements 12 $(document).on('click', '.emoji-trigger', function (event) { 13 $activeElement = $(this).siblings('textarea.message-input'); 14 if ($activeElement.length === 0 && $('#payer-message').length > 0) { 15 $activeElement = $('#payer-message'); 16 } 17 let $wrap = $(this).siblings('div.emoji-picker-wrap'); 18 let $gifPicker = $('#gif-picker-div'); 19 if ($gifPicker.length >= 0 && $gifPicker.is(':visible')) { 20 $gifPicker.fadeOut(); 21 $gifPicker.parent().fadeOut(); 22 } 23 24 // Toggle the emoji picker 25 if ($emojiPicker.is(':visible')) { 26 $emojiPicker.fadeOut(); 27 } else { 28 // Append only if it's not already inside $wrap 29 if (!$wrap.find($emojiPicker).length) { 30 $emojiPicker.detach().appendTo($wrap); 31 } 32 $emojiPicker.fadeIn(); 33 } 34 event.stopPropagation(); // Prevent click from propagating to hide logic 35 }); 36 37 // Handle emoji selection 38 $emojiPicker.on('emoji-click', function (event) { 39 const emoji = event.originalEvent.detail.unicode; 40 let wysiwygSelector = $emojiPicker.parent().data('wysiwyg'); 41 let isWysiwyg = wysiwygSelector !== null; 42 if (isWysiwyg && $FR.isModuleRunning(wysiwygSelector)) { 43 $FR.getModule(wysiwygSelector).insertContent(emoji); 44 } else if ($activeElement && $activeElement.is('input, textarea')) { 45 $activeElement.val($activeElement.val() + emoji).trigger('input'); 46 } 47 }); 48 49 // Hide picker when clicking outside 50 $(document).on('click', function (event) { 51 // Check if click is inside the picker or the emoji button 52 if ($(event.target).closest('.emoji-picker, .emoji-trigger, i.mce-ico.mce-i-emoticons').length) ; 53 setTimeout(function () { 54 $emojiPicker.fadeOut(); 55 }, 100); // Short delay to ensure TinyMCE UI updates properly 56 }); 57 58 // Prevent hiding when clicking on the picker itself or its trigger 59 $emojiPicker.on('click', function (event) { 60 event.stopPropagation(); 61 }); 62});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.