Nesting a full ThemeProvider spun up its own font-scale state, freezing
the SubscribeButton subtree from runtime parent updates. Reuse the
parent alf value and only swap the themes map.
Move the publisher list and host detection into a single publishers.ts
module so both PublicationMetaRow and the Subscribe button consult the
same source. Match exact hosts and proper subdomains only, rejecting
lookalikes like evilleaflet.pub.
Hoist the publication avatar style to a module-level const so its
identity is stable across renders, and remove two empty Fragment
wrappers that served no purpose.
Reject malformed hex strings instead of producing garbled output, drop
the alpha channel from 8-digit hex, and wrap the public entrypoints in
try/catch so callers always get a usable color string back.
Move isStandardSiteEmbed alongside a new isStandardSitePublicationEmbed
helper. The publication check now requires at least one publication ref
and zero document refs, replacing a tautological condition that also
returned true for empty associatedRefs arrays.
- PublicationFooter: profile-resolve error was logged during render, causing
duplicate Sentry events on every re-render of an errored card. Move to
useEffect keyed on the error transition.
- MetaRow: render reading-time chip only when readingTime > 0. Guards against
pathological appview responses where the field is 0 or negative.
Previously the divider's own py_md wrapper plus the footer's py_sm
double-counted the spacing and pushed the footer further from the
divider than Figma. Make the divider flush against the article block
and the footer, and bump the footer to py_md so the 12px gap below
the divider line is owned by the footer itself.
PublicationFooter:
- Avatar to text gap: 10
- Title to author gap: 2
- Title weight medium (500) instead of semi-bold (600)
PublicationEmbed content block:
- Description to meta-row gap: 6 (was 8)
- Divider gets 12px vertical padding wrapper
The inner View inside the article-region Link was missing `a.w_full`, so on
web (where Link renders as an inline <a>) it shrink-wrapped to the Image's
intrinsic width. Images with small intrinsic dimensions (Leaflet thumbnails)
rendered tiny, while large ones (PCKT) rendered correctly by accident.
The legacy ExternalEmbed sets `a.w_full` on the equivalent View directly
inside the Link wrapper; matching that pattern here.