function ui::watch::fw_row() {
  local ts="${1:-}" client="${2:-}" dest_display="${3:-}" \
        w_client="${4:-20}" w_dest="${5:-18}"

  # "fw" is always 2 visible chars — no padding needed
  local src="${_UI_WATCH_FW_COLOR}fw\033[0m"

  local ts_pad client_pad dest_pad_n
  ts_pad=$(printf "%-11s" "$ts")
  client_pad=$(printf "%-${w_client}s" "$client")
  dest_pad_n=$(( w_dest - ${#dest_display} ))
  [[ $dest_pad_n -lt 0 ]] && dest_pad_n=0

  printf "  %s  %b  %s  \033[1;31m→\033[0m %s%*s  \033[1;31mdrop\033[0m\n" \
    "$ts_pad" "$src" "$client_pad" "$dest_display" "$dest_pad_n" ""
}
function ui::watch::fw_row_table() {
  local ts="${1:-}" client="${2:-}" dest="${3:-}" event="${4:-}" status="${5:-}"
  printf "  %-20s %-8s %-22s %-28s \033[1;31m%-14s\033[0m %s\n" \
    "$ts" "firewall" "$client" "$dest" "$event" "$status"
}
