<%!-- Top bar: title, status, actions. Compact so the map can dominate. --%>
<.breadcrumb items={[ %{label: t("Dashboard"), navigate: ~p"/dashboard"}, %{label: t("Coverage"), navigate: ~p"/coverage"}, %{label: @coverage.name} ]} />

{@coverage.name}

<.icon name="hero-map-pin" class="h-4 w-4 inline" /> <.link navigate={~p"/sites/#{@coverage.site_id}"} class="hover:underline"> {@coverage.site && @coverage.site.name}

{@coverage.status} <.link navigate={~p"/coverage/#{@coverage.id}/edit"} class="btn text-sm !py-1 !px-3 border border-gray-300 bg-transparent dark:border-gray-600 gap-1.5" > <.icon name="hero-pencil-square" class="h-4 w-4" /> {t("Edit")} <.button phx-click="recompute" variant="primary"> <.icon name="hero-arrow-path" class="h-4 w-4" /> {t("Recompute")}
<%!-- Status banners (queued / computing / failed). --%> <%= if @coverage.status == "computing" do %>
<.icon name="hero-arrow-path" class="h-5 w-5 text-yellow-700 dark:text-yellow-400 animate-spin shrink-0" />

{t("Computing coverage…")}

{@coverage.progress_pct}%
<% end %> <%= if @coverage.status == "failed" do %>
<.icon name="hero-exclamation-triangle" class="h-5 w-5 text-red-700 dark:text-red-400 flex-shrink-0 mt-0.5" />

{t("Compute failed")}

{@coverage.error_message}

<% end %> <%= if @coverage.status == "queued" do %>

<.icon name="hero-clock" class="h-4 w-4 inline" /> {t("Coverage is queued. Compute will start shortly.")}

<% end %> <%!-- Map area. cnHeat-style: full-bleed, controls float above as panels. --%> <%= cond do %> <% @coverage.png_path && @coverage.status == "ready" -> %>
<%!-- LOS / NLOS toggle + SM install-height slider (left) --%>
{t("Height above clutter")} 10 ft
<%!-- Parameters / actions panel (right). Toggleable via header button. --%> <%= if @show_params do %>

{t("Parameters")}

<.param_row label={t("Antenna")} value={(@antenna && @antenna.model) || @coverage.antenna_slug} /> <.param_row :if={ not is_nil(@coverage.device_id) and Ecto.assoc_loaded?(@coverage.device) and not is_nil(@coverage.device) } label={t("Device")} value={@coverage.device.name || @coverage.device.ip_address} /> <.param_row :if={@antenna} label={t("Manufacturer")} value={@antenna.manufacturer} /> <.param_row :if={@antenna} label={t("Antenna gain")} value={"#{@antenna.gain_dbi} dBi"} /> <.param_row label={t("Frequency")} value={format_ghz(@coverage.frequency_mhz)} /> <.param_row label={t("TX power")} value={"#{@coverage.tx_power_dbm} dBm"} /> <.param_row label={t("EIRP")} value={"#{Float.round(@eirp_dbm, 1)} dBm"} /> <.param_row label={t("Height above ground")} value={format_ft(@coverage.height_agl_m)} /> <.param_row label={t("Azimuth")} value={"#{@coverage.azimuth_deg}°"} /> <.param_row label={t("Tilt")} value={"#{@coverage.downtilt_deg}°"} /> <.param_row label={t("Range")} value={format_mi(@coverage.radius_m)} /> <.param_row :if={@coverage.foliage_tuning && @coverage.foliage_tuning > 0} label={t("Foliage tuning")} value={"#{@coverage.foliage_tuning}"} /> <.param_row :if={@coverage.computed_at} label={t("Computed at")} value={Calendar.strftime(@coverage.computed_at, "%Y-%m-%d %H:%M UTC")} />
<% end %> <%!-- Opacity + RSSI filter + legend (bottom-center). --%>
70%
-100 dBm
≥-50 -65 -75 -85 ≤-95 dBm
<%!-- Distance Tool side panel — opens on map click. --%> <%= if @probe do %>
<.icon name="hero-map-pin" class="h-4 w-4 text-blue-500" /> {:erlang.float_to_binary(@probe.lat * 1.0, decimals: 5)}, {:erlang.float_to_binary( @probe.lon * 1.0, decimals: 5 )}
{t("Units:")}
<%= for row <- @probe.rows do %> <% end %>
{t("Tower")} {t("Distance")} RSSI
{row.coverage.name} {fmt_distance(row.distance_m, @probe_units)} "text-gray-400" is_number(row.rssi) and row.rssi >= -75 -> "text-green-600 dark:text-green-400 font-bold" is_number(row.rssi) and row.rssi >= -85 -> "text-yellow-600 dark:text-yellow-400" is_number(row.rssi) -> "text-red-600 dark:text-red-400" true -> "text-gray-400" end ]}> {fmt_rssi(row.rssi)}
<% end %> <% true -> %>
<.icon name="hero-signal-slash" class="h-12 w-12 mx-auto text-gray-400 mb-2" />

{t("No heatmap available yet. Run compute to generate the coverage prediction.")}

<% end %>