dash-emoji-mart — emoji picker for Dash

dash-emoji-mart — an emoji picker for Plotly Dash 4. Wraps emoji-mart as a single Dash component: search, six skin tones, a frequently-used row, 22 locales, custom image/GIF/SVG categories and any of Iconify's 150+ icon sets. The emoji data set ships inside the bundle, so the picker works offline and makes no requests of its own. By Pip Install Python.

Overview

dash-emoji-mart wraps emoji-mart — the picker behind Missive, and the one most React apps reach for — as a single Dash component.

One import, one component, no clientside setup:

from dash import Dash, callback, html, Input, Output
from dash_emoji_mart import DashEmojiMart

app = Dash(__name__)
app.layout = html.Div([
    DashEmojiMart(id="picker"),
    html.Div(id="out", style={"fontSize": 48}),
])

@callback(Output("out", "children"), Input("picker", "value"))
def show(value):
    return value or "Pick one"

if __name__ == "__main__":
    app.run(debug=True)

The full emoji data set is bundled inside the component, so the picker works offline and makes no requests of its own.

Install

pip install dash-emoji-mart

Iconify icon-set support is an optional extra — see Iconify icon sets:

pip install "dash-emoji-mart[iconify]"

Live demo

What you get

Everything emoji-mart does out of the box: fuzzy search across names, keywords and shortcodes, six skin tones, a per-browser "frequently used" row, and 10 UI locales.

Add categories of your own images, GIFs or SVGs with custom=, and give each one a nav icon with categoryIcons=. See Custom emojis.

dash_emoji_mart.iconify converts any Iconify set — twemoji, openmoji, Fluent Emoji, or a non-emoji set like Tabler — into pickable categories. See Iconify icon sets.

Where to go next

Source

# File: docs/home/example.py

"""The smallest useful DashEmojiMart: a picker and a readout of what was picked.

`value` is a plain string — the native glyph for a standard emoji. `selectedEmoji`
carries the whole emoji-mart object alongside it, which is where the name and shortcode
below come from.
"""

import dash_mantine_components as dmc
from dash import Input, Output, callback, html

from dash_emoji_mart import DashEmojiMart

component = dmc.Group(
    [
        DashEmojiMart(
            id="home-picker",
            perLine=9,
            emojiSize=24,
            maxFrequentRows=2,
            previewPosition="none",
        ),
        dmc.Paper(
            [
                dmc.Text("Selected", size="sm", c="dimmed"),
                html.Div(
                    id="home-picker-glyph",
                    style={"fontSize": 56, "minHeight": 70, "lineHeight": 1.2},
                ),
                dmc.Text(id="home-picker-name", size="sm", fw=500),
                dmc.Text(id="home-picker-shortcode", size="xs", c="dimmed"),
            ],
            withBorder=True,
            p="lg",
            radius="md",
            style={"minWidth": 200, "textAlign": "center"},
        ),
    ],
    align="flex-start",
    gap="xl",
)


@callback(
    Output("home-picker-glyph", "children"),
    Output("home-picker-name", "children"),
    Output("home-picker-shortcode", "children"),
    Input("home-picker", "selectedEmoji"),
)
def show(emoji):
    if not emoji:
        return dmc.Text("Nothing yet", c="dimmed", size="lg"), "", ""
    shortcodes = emoji.get("shortcodes") or ""
    return emoji.get("native", ""), emoji.get("name", ""), shortcodes

Note for AI agents: This is the static, prerendered view of an interactive Dash application served because we detected a non-JS user agent. Full prose docs: