Skip to content

feat: add @emoji-mart/vue wrapper package - #1026

Open
4A2RfF5Q5x wants to merge 14 commits into
missive:mainfrom
4A2RfF5Q5x:main
Open

feat: add @emoji-mart/vue wrapper package#1026
4A2RfF5Q5x wants to merge 14 commits into
missive:mainfrom
4A2RfF5Q5x:main

Conversation

@4A2RfF5Q5x

@4A2RfF5Q5x 4A2RfF5Q5x commented Jun 15, 2026

Copy link
Copy Markdown

Summary

Adds @emoji-mart/vue — a thin Vue 3 wrapper for emoji-mart, mirroring the existing @emoji-mart/react package in structure and API.

What's included

  • packages/emoji-mart-vue/vue.tsEmojiPicker component built with Vue 3's Composition API (defineComponent + setup). Mounts the core Picker imperatively into a <div> ref, watches reactive attrs for live updates, and calls disconnectedCallback on unmount to prevent listener leaks.
  • packages/emoji-mart-vue/utils.tsnormalizeAttrs helper that converts kebab-case Vue HTML attributes (e.g. emoji-select) to camelCase props expected by the core Picker.
  • packages/emoji-mart-vue/package.json — workspace package wired up with emoji-mart as a peer dependency.
  • packages/emoji-mart-vue/README.md — basic install + usage example.
  • README.md — Vue usage example added alongside the existing React one.
  • package.json@emoji-mart/vue registered as a Yarn workspace.

Usage

npm install --save emoji-mart @emoji-mart/data @emoji-mart/vue

Notes

  • Reactive prop updates are forwarded to the core Picker via picker.update(), which calls componentWillReceiveProps internally.
  • categories and custom props trigger a full grid reset when changed.
  • skin and theme props re-render without a grid reset.
  • Other props (e.g. locale, set, data) are not reactive after mount — they are applied at initialization only. This is a limitation of the core Picker, not the Vue wrapper.

Missive conversation: https://mail.missiveapp.com/#inbox/conversations/e35e5c44-9333-43a4-bd61-a9cd47defb14

4A2RfF5Q5x and others added 14 commits June 14, 2026 20:00
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vue passes HTML attribute names as kebab-case (e.g. `on-emoji-click`),
but the Picker expects camelCase props. This adds a `normalizeAttrs`
helper applied on both mount and watch so all attrs are correctly
forwarded.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant