Releases: pip-install-python/dash-emoji-mart
Release list
v0.2.1
Two things: a picker bug that made whole custom categories invisible, and this
site joining the 2plot network properly. Only the first affects
pip install dash-emoji-mart.
This is the first 0.2.x anyone can install. 0.2.0 below was written, dated
and never shipped — no v0.2.0 tag was ever pushed and nothing was uploaded, so
the newest thing pip install dash-emoji-mart has ever returned is still
0.0.3 from 2024. Read the two sections together: 0.2.0 is what changed in the
repository, 0.2.1 is what changed since, and a single v0.2.1 tag publishes
both at once.
Fixed — the component
-
Custom emojis whose
srcis a dimensionless SVG rendered as nothing.
emoji-mart sizes a custom emoji's image withmax-width/max-heightand
nothing else. A raster source has intrinsic dimensions and scales down to
fit; an SVG carrying only aviewBoxhas no intrinsic size, sowidth: auto
under a baremax-widthresolves to zero. The emoji was in the DOM,
focusable and clickable — and 0×0.It looked arbitrary rather than systematic, because it depended only on what
the author happened to link. Iconify's API SVGs shipwidth="1em"and were
always fine; SVGs straight off a repo were not. On the docs site's own
custom-emoji demo that meant one category rendered and the next two were
blank strips under their headings.The component now adopts a stylesheet into the picker's shadow root giving
custom-emoji imageswidth: 1em; height: 1em; object-fit: contain.1emis
the size emoji-mart already intends — it sets font-size toemojiSizeon
each grid button and to the larger preview size in the footer — so one rule
is right in both places, non-square artwork is not distorted, and raster
sources render exactly as before. -
theme="auto"follows the APP, then the OS — in that order. emoji-mart's
"auto" readsprefers-color-schemeand nothing else, which is the wrong
signal in a Dash app: almost every one ships a theme toggle, and a toggle
does not touch the OS. On a machine set to dark, flipping a Dash Mantine app
to light left every picker dark against a white page — and it looked like the
component ignoring its ownthemeprop.The component now prefers
data-mantine-color-schemeon<html>when the
document advertises one, and falls back to the media query otherwise. Reading
an attribute adds no dependency on DMC: an app that does not set it behaves
exactly as before. An explicittheme="light"/"dark"is still passed
straight through, and the resolution re-runs on a toggle without a remount.This is why the docs site had the bug on six of its pages: only
/themingwired the clientside callback its own prose recommends. That
callback still works and is still the right answer for a non-Mantine toggle —
it is just no longer needed for the common case. -
dynamicWidthmade the picker collapse instead of fill. emoji-mart
implements the option by settingwidth: 100%on a<section>inside its
shadow root and never touches the<em-emoji-picker>host. A custom element
has no author width, so it sizes to its content — and its content is that
section asking for 100% of the host. The constraint is circular and resolves
at min-content: measured, turning the switch on took the picker from 532px to
216px inside a 482px parent, and the grid reflowed under the pointer,
which reads as the component glitching on hover.The component now sizes the host itself when
dynamicWidthis on, and clears
the width when it is off. It has to happen outside the shadow root: the host
is in the light DOM, so no shadow stylesheet reaches it, andclassName/
styleapply to our wrapper rather than to it. Measured after: 352px → 482px
(the full container), 9 → 13 emoji per row, and it reverts cleanly.The container still needs a width of its own for "100%" to mean anything —
a shrink-to-fit flex item gives 100% of nothing — so
docs/configuration/example.pynow gives the mountflex: 1; minWidth: 0
and says why.
Fixed — the documentation site
- The popover example never opened.
dmc.Popovertogglesopeneditself
when its target is clicked, so the example's extratogglecallback read the
already-flipped value asStateand returnednot True— closing the
popover in the same round trip that opened it. The symptom was a trigger that
appeared to do nothing. Down to one callback, and the page now documents the
trap rather than demonstrating it. - Inline
**bold**and*italic*put a<p>inside a<p>.
markdown2dash renders paragraphs and inline emphasis with the same
dmc.Text.lib/markdown_inline.pyrebinds the three inline formatters to
span=True. Five invalid nestings across the site, now none.
Added — a visual identity of its own
The site's mark was noto:grinning-face-with-smiling-eyes — the generic yellow
smiley, which is every emoji library's placeholder and named nothing about this
one. It is now 🤠 U+1F920, and the same drawing reaches every surface.
- Header, favicon and share card are one glyph.
assets/brand/cowboy-hat-face.png
(Noto Emoji, Apache-2.0) is committed as the single source; the header renders
noto:cowboy-hat-facethrough Iconify, so the tab icon, the navigation mark
and an unfurl are the same drawing rather than three vendors' idea of it. scripts/make_brand_assets.pyderives the favicon set and the web app
manifest from that source:favicon.ico(16/32/48), 192 and 512 PNGs, an
apple-touch-icon flattened onto the dark surface because iOS backs a
transparent icon with white, andsite.webmanifestwhose name, short name
and theme colour are read fromlib/constants.pyrather than retyped.
--checkre-derives and compares, so a hand-edit or a stale run fails.- The manifest tests are no longer stubbed. 0.2.1 shipped this file with a
block explaining that the donor's seven installable-app assertions had no
surface to test here. They do now: the manifest is linked and served, names
this site, is installable, every icon it declares resolves, the
apple-touch-icon resolves and is opaque, and the theme colour agrees. Suite
is 92 → 99. - The social card exists. 1200x630, the fleet layout — accent rule, brand,
three-line tagline, mono domain — with the cowboy on the right, matching how
email.2plot.devframes its artwork.make_social_card.pynow WARNS when a
tagline overflows its three-line budget instead of silently slicing it; the
first render of this card read "...custom image and SVG categories, and" and
stopped mid-clause, which is precisely the kind of thing nobody catches on an
asset they never see. github_assets/is gone. The 2.9 MB README demo GIF now comes from
cdn.2plot.ai/github_assets/github-demo.gif, so cloning the repo no longer
drags it along.
Changed — the 2plot network standard
Brings this host onto the standard proven on 2plot.ai, 2plot.dev, boilerplate,
leaflet, email, flexlayout and llms. Nothing here changes the package.
- One brand, every surface.
SITE_BRAND = "dash-emoji-mart — emoji picker for Dash"now reachesDash(title=), the/llms.txtH1 and viewer chip
(via dimll 2.3.4'sresolve_site_title), the template's fallback<title>,
the README and the home page's own heading. The package name leads, because
for a component library the package is what a reader came to find; "Pip
Install Python" is the byline and lives in the description. - One short app id.
AD_APP_IDdefaulted todash-emoji-mart— the PyPI
name — while the traffic reporter already saidemojimart, so the same app
would have reached the hub under two ids and its ad rows would never have
lined up with its traffic rows. Everything now folds tolib.constants.APP_KEY. - The internal-traffic contract, both halves. Requests carrying
2plot-internalare dropped at WRITE time, before bot classification, so the
hub's health sweep and CI batteries cannot land inbot_hits;/healthzis
never a visit. Outbound, the ad client and the traffic reporter now identify
themselves — the ad fetch runs once per page view and was arriving at
2plot.dev aspython-requests, which its tracker counts as a bot, so this
site's readers were inflating the hub's crawler numbers. - The social card. An OG block in
lib/constants.py,image_url=and
description=at everyregister_page, and the auxiliary tags Dash never
emits in the template. One missingimage_url=makes Dash emit
content="", and an empty tag late in the document beats a good one earlier. lib/bulletin.py, wired throughNETWORK_BULLETIN_URLwith a boot line
that says which state the process is in — an unwired bulletin has no failure
mode, only an announcement that never appears.gunicorn>=23. The floor was>=21.2,<22, a ceiling inherited wholesale
from markdown2dash's dependency block, holding this image on a gunicorn
affected by CVE-2024-6827 and CVE-2024-1135. markdown2dash now installs
--no-depsat every install site and CI asserts the resolved version inside
the built image.- dash-improve-my-llms
>=2.3.4, the floor that deliversresolve_site_title. - CI/CD.
cd.ymlownsmainand callsci.ymlviauses:so merges stop
running everything twice; actionlint runs first; a container job builds the
real image, boots it, asserts dependency fingerprints inside it and runs the
network battery against it; the deploy waits for five consecutive/healthz
successes rather than one, because Render swaps instances and the old one
answers throughout.
Measured, not fixed — three upstream findings
All verified on this host and recorded so the next pass does not rediscover
them.
- Removing a category is one-way for the lifetime of the page. Setting
maxFrequentRowsto0drops the Frequently-...