# `PhoenixKitProjects.Web.Components.SmartLink`
[🔗](https://github.com/BeamLabEU/phoenix_kit_projects/blob/v0.14.0/lib/phoenix_kit_projects/web/components/smart_link.ex#L1)

Embed-mode aware link.

In **navigate mode** renders a plain `<.link navigate={...}>` — the
browser sees a real `<a href>`, right-click-open-new-tab works, screen
readers see a link, prefetch works.

In **emit mode** renders a `<button phx-click="open_embed">` that
fires the shared `open_embed` event (intercepted by the hook attached
via `PhoenixKitProjects.Web.Helpers.attach_open_embed_hook/1` in each
LV's `mount/3`). The hook validates the target LV against
`Helpers.embeddable_lvs/0` and broadcasts `{:projects, :opened, %{lv,
session, frame_ref}}` on the host topic.

Use everywhere this module currently uses `<.link navigate={...}>` to
another module LV.

## Example

    <.smart_link
      navigate={Paths.project(project.uuid)}
      emit={{PhoenixKitProjects.Web.ProjectShowLive, %{"id" => project.uuid}}}
      embed_mode={@embed_mode}
      class="link link-hover"
    >
      {Project.localized_name(project, lang)}
    </.smart_link>

## Why both attrs are required

Even in emit mode, `navigate` is required as a fallback — if the
whitelist rejects the target, the hook returns `{:cont, socket}` and
the LV's own handler can fire, but most call sites simply have no
handler, so the click is a no-op. A future tweak could make the hook
fall back to `push_navigate(navigate)` in that case; for now,
whitelist mismatches are surfaced via `Logger.warning` from the
hook itself.

# `smart_link`

## Attributes

* `navigate` (`:string`) (required)
* `emit` (`:any`) (required) - {TargetLV :: module(), session_overrides :: map()}.
* `embed_mode` (`:atom`) - Socket's :embed_mode assign. Defaults to :navigate so LVs that haven't been converted yet (or that forget to pass it) get safe browser-navigation behaviour. Defaults to `:navigate`. Must be one of `:navigate`, or `:emit`.
* `class` (`:any`) - Defaults to `nil`.
* Global attributes are accepted. Supports all globals plus: `["title", "aria-label", "data-id"]`.
## Slots

* `inner_block` (required)

---

*Consult [api-reference.md](api-reference.md) for complete listing*
