A visual repaint of the map pins, urgency styling, clusters, and tap popups — judged by eye. Each panel shows today next to the proposed treatment. Emoji glyphs stay (founder is fine with them); category colors stay (good map legibility). The scope is to harmonize the clashes, make sizes consistent, unify the popup card, and add one urgency system — not to brand-ify the markers. Everything here is adjustable on review; nothing is locked.
Markers use emoji (🚨 📅 🏪 🔑 etc). They render fine and read clearly at a glance — the founder is happy keeping them. Developments already use an inlined lucide HardHat as precedent.
Verdict: keep emoji as the default. The DESIGN_STANDARDS "lucide-only, no emoji" rule is relaxed for map markers per founder direction. The only question is whether any individual glyph reads better as a clean lucide line-icon.
NOT a sweep. We swap a glyph to a clean inlined lucide icon only where it's a clear upgrade. Below: emoji on the left of each pair, the lucide candidate on the right — you choose which (if any) to swap.
Lucide icons are inlined as raw SVG strings (the HardHat precedent), stroke="currentColor" on a white-stroke wrapper — no React inside the Leaflet DivIcon. Default = keep emoji; swap only the glyphs you prefer in lucide.
Colors are category-coded (good for legibility), but three pairs use an identical hex for unrelated categories — so two different things look the same on the map.
⚠ 3 collisions: orange Package = orange Contractor · red Safety = red Fitness · crimson For-sale = crimson Expired-permit.
Keep the dominant meaning on its color; nudge the colliding sibling to an adjacent, still-sensible hue. Colors remain category-coded, not brand colors — map legibility wins here.
Reasoning: Safety/emergency reds stay loud and reserved for urgency; commerce (contractor) shifts to a warm amber-brown; an expired permit reads as a muted, "dead" stone-gray (it's history, not an alert). Final hues are adjustable on review.
MARKER_STYLES table + the matching legend swatches. No structural change.Hotspot emergency pins pulse correctly (a real @keyframes hotspot-pulse-ring). But urgent content pins reference animation: pulse — and there is no @keyframes pulse defined anywhere, so it silently does nothing. Urgency loudness is uneven across the map.
Latent bug to fix here: add a shared keyframe (or reuse hotspot-pulse-ring) so content urgency actually animates, and apply the SAME tier logic to both builders.
One tier system applied to BOTH getMapContentIcon (urgent posts) and getHotspotIcon. The emergency pulse below is live CSS so you can judge the loudness.
One consistent system means a safety post and an emergency hotspot read with the same loudness — no more "the hotspot screams but the content pin whispers." Pulse speed/size adjustable on review.
Five different pin treatments with no shared scale: standard 30px, development & property 32px, photo-post 44px rounded-square, permit 18px square with a floating label, plus price-tag labels.
No visual rhythm — pins jump in size for no user-facing reason, and the 18px permit square reads as a different language from the round bubbles.
One round-bubble family on a tidy scale. Photo-thumbnail and price-label survive only where they genuinely add value. Permit square becomes a small round bubble so it speaks the same language. Teardrop map-pins were considered and rejected — they fight our rounded card/chip look.
Keep round/mixed, make consistent. Two sizes do almost all the work — 30px baseline, ~36px for items that deserve emphasis (developments, emergencies). Thumbnail + price are the only "special" shapes, and they earn it.
markerStyles.ts + reconcile the two cluster size-tiers into one scale.Content/development, permit, and hotspot each have their own inline-styled markup. CTAs use different colors — content uses a hardcoded purple (#7c3aed), hotspot uses the per-category color. No shared card language.
42-unit residential · expected Q3 2027
Facade work · filed 3d ago
Avoid the block, crews on site…
Three different headers, badge styles, and CTA colors. The hardcoded #7c3aed doesn't match our actual brand gradient.
All popups fold into a single card: brand-gradient header/CTA (the real gradient, not the old hardcoded purple), category color as a small accent dot/label only, badge sizing per DESIGN_STANDARDS, image thumb, line-clamped description, footer meta. A light variant (no CTA) and a rich variant (with CTA) cover the B4 hybrid tap behavior.
42-unit residential with ground-floor retail. Expected completion Q3 2027 along the waterfront.
Facade restoration — filed at 88 Berry St. Tap-outside to dismiss.
Rich (listings, developments, businesses) = full card with a brand-gradient CTA. Light (stories, permits) = preview only, no CTA. The interactive CTA keeps the Leaflet ref-based click handler; the gradient header is a static div so a className gradient works fine.
--grad-brand-r / BRAND_GRADIENT — never the old hardcoded purple.Content clusters are a flat semi-transparent dark navy rgba(26,26,46,.7); hotspot clusters are a red tint rgba(220,38,38,.75). They also use different size tiers (content <10/<30, hotspot <5/<15) so the same count looks different.
Flat, slightly muddy, and the two cluster types don't feel like they belong to the same map.
Content clusters pick up the brand gradient (they're the "everything here" bubble — a frame surface, so gradient is on-brand). Hotspot clusters keep a strong red so live activity still reads as urgent, with a soft glow ring. Both share one size scale and a crisp white border.
One reconciled size scale for both cluster builders, consistent white border + shadow. The hotspot glow keeps "live activity here" legible without the muddy flat fill.
L.divIcon cluster factories (MapMarkers + HotspotMarkers) and merge their divergent size tiers.markerStyles.ts + clusters; 54-08 builds the unified popup card). The hybrid tap behavior (B4) — light items show a preview, rich items tap straight to the drawer — is behavioral and best judged on the live build during UAT, not from this static page. Brand tokens (grad-brand, grad-brand-r, warm-card) match the chip mockup verbatim so both review pages share one language.