UNPKG

@rytrox/quill-emoji-mart

Version:

Module Extension for [quill](https://github.com/slab/quill) that introduces [emoji-mart](https://github.com/missive/emoji-mart).

1 lines 5.97 kB
{"version":3,"file":"rytrox-quill-emoji-mart.mjs","sources":["../../../projects/quill-emoji-mart/src/lib/emoji-module.ts","../../../projects/quill-emoji-mart/src/public-api.ts","../../../projects/quill-emoji-mart/src/rytrox-quill-emoji-mart.ts"],"sourcesContent":["import Quill, {Module} from \"quill\";\nimport {EmojiOptions} from \"./model/emoji-options\";\nimport Toolbar from \"quill/modules/toolbar\";\nimport data, {EmojiMartData} from '@emoji-mart/data';\nimport {Picker} from \"emoji-mart\";\nimport {Emoji} from \"./model/emoji\";\n\nexport class EmojiModule extends Module<Partial<EmojiOptions>> {\n\n private readonly toolbar?: Toolbar;\n private readonly button?: HTMLButtonElement;\n\n private picker?: HTMLElement;\n\n public constructor(quill: Quill, options: Partial<EmojiOptions>) {\n super(quill, {\n ...options,\n theme: 'light',\n data: data as EmojiMartData\n });\n\n const toolbar = this.quill.getModule('toolbar');\n if (toolbar instanceof Toolbar) {\n this.toolbar = toolbar;\n this.button = this.toolbar.container?.querySelector('button.ql-emoji') ?? undefined;\n\n if (this.button) {\n this.button.innerHTML = '<svg viewbox=\"0 0 18 18\"><circle class=\"ql-fill\" cx=\"7\" cy=\"7\" r=\"1\"></circle><circle class=\"ql-fill\" cx=\"11\" cy=\"7\" r=\"1\"></circle><path class=\"ql-stroke\" d=\"M7,10a2,2,0,0,0,4,0H7Z\"></path><circle class=\"ql-stroke\" cx=\"9\" cy=\"9\" r=\"6\"></circle></svg>';\n\n this.button.addEventListener('click', () => {\n if (this.picker) {\n this.closeDialog();\n } else {\n this.openDialog();\n }\n });\n }\n }\n }\n\n public openDialog() {\n if (!this.picker) {\n this.picker = new Picker({\n onEmojiSelect: (emoji: Emoji) => this.selectEmoji(emoji),\n onClickOutside: (event: MouseEvent) => this.onClickOutside(event),\n ...this.options,\n }) as unknown as HTMLElement;\n\n document.body.appendChild(this.picker);\n\n const rect = this.button?.getBoundingClientRect();\n if (rect) {\n this.picker.style.top = `${rect.top + 25}px`;\n this.picker.style.left = `${rect.left}px`;\n }\n\n this.picker.style.boxShadow = '0 4px 4px 0 rgba(0, 0, 0, 0.25)';\n this.picker.style.position = 'absolute';\n this.picker.style.zIndex = '1';\n }\n }\n\n private selectEmoji(emoji: Emoji): void {\n const emojiDelta = this.quill.insertText(\n this.quill.getSelection(true).index,\n emoji.native,\n 'user'\n );\n\n this.closeDialog();\n\n // Set Input position after the emoji\n setTimeout(() => {\n this.quill.setSelection(this.quill.getSelection(true).index + emojiDelta.length());\n });\n }\n\n private onClickOutside(event: MouseEvent): void {\n // Only close if the Click did not happen on the Emoji-Button inside the Toolbar when it exists!\n if (!this.button || !(this.button === event.target ||\n (event.target instanceof Element && this.button.contains(event.target))\n )) {\n this.closeDialog();\n }\n }\n\n public closeDialog() {\n this.picker?.remove();\n this.picker = undefined;\n }\n}\n","/*\n * Public API Surface of quill-emoji-mart\n */\n\nexport * from './lib/emoji-module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}