# Objective Make images nested inside markdown links (e.g., README badges) clickable, so they behave like normal markdown links. Previously, linked images rendered correctly but were not interactive in markdown previews: they did not show a pointer cursor, could not be clicked to open their target URL, and did not expose link actions through the context menu. ## Solution Changed the `MarkdownElement` to detect when an `<img>` tag is inside a `<a>` tag during rendering. When a linked image is rendered: - The wrapper `div` gets a `cursor_pointer` style and an `on_click` handler that opens the link URL (or delegates to the `on_url_click` callback if set). - The wrapper also captures right-click events to populate the context menu with "Copy Link" via `capture_for_context_menu`. - The `on_url_click` closure type was changed from `Box<dyn Fn>` to `Rc<dyn Fn>` to allow cloning across multiple handlers. - When a linked image fails to load, the fallback element's `on_click` now calls `cx.stop_propagation()` to prevent the event from bubbling to the parent link wrapper and opening the URL twice. The feature is gated behind `!self.style.prevent_mouse_interaction` so it respects existing interaction-prevention settings. ## Testing - `cargo test -p markdown`: 95 tests passed. - Manually verified in markdown preview that badge/image links open correctly and right-click shows "Copy Link". - Verified existing markdown tests continue to pass. ## Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [ ] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable --- Release Notes: - Fixed images inside markdown links not being clickable. https://github.com/user-attachments/assets/df2a8d8f-b002-47f9-b139-815ee713700b --------- Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
55 lines
1.3 KiB
TOML
55 lines
1.3 KiB
TOML
[package]
|
|
name = "markdown"
|
|
version = "0.1.0"
|
|
edition.workspace = true
|
|
publish.workspace = true
|
|
license = "GPL-3.0-or-later"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[lib]
|
|
path = "src/markdown.rs"
|
|
doctest = false
|
|
|
|
[features]
|
|
test-support = [
|
|
"gpui/test-support",
|
|
"util/test-support"
|
|
]
|
|
|
|
[dependencies]
|
|
anyhow.workspace = true
|
|
base64.workspace = true
|
|
collections.workspace = true
|
|
futures.workspace = true
|
|
gpui.workspace = true
|
|
html5ever.workspace = true
|
|
language.workspace = true
|
|
linkify.workspace = true
|
|
log.workspace = true
|
|
markup5ever_rcdom.workspace = true
|
|
mermaid_render = { path = "../mermaid_render" }
|
|
pulldown-cmark.workspace = true
|
|
settings.workspace = true
|
|
smallvec.workspace = true
|
|
stacksafe.workspace = true
|
|
sum_tree.workspace = true
|
|
theme.workspace = true
|
|
theme_settings.workspace = true
|
|
ui.workspace = true
|
|
util.workspace = true
|
|
|
|
[dev-dependencies]
|
|
assets.workspace = true
|
|
env_logger.workspace = true
|
|
fs = {workspace = true, features = ["test-support"]}
|
|
gpui = { workspace = true, features = ["test-support"] }
|
|
gpui_platform = { workspace = true, features = ["wayland", "x11"] }
|
|
image.workspace = true
|
|
language = { workspace = true, features = ["test-support"] }
|
|
languages = { workspace = true, features = ["load-grammars"] }
|
|
node_runtime.workspace = true
|
|
settings = { workspace = true, features = ["test-support"] }
|
|
util = { workspace = true, features = ["test-support"] }
|