## [Unreleased]

## [1.6.2] - 2026-06-07 (June 2026)

### Changed
- Updated for WoW 12.0.7. Dropped 12.0.1 from the supported game versions.

### Fixed
- Chat tab no longer breaks (string-conversion + arithmetic-on-startAlpha
  errors during tab fade animation) after a failed Visit House or House
  Finder action. The HOUSE_RESERVATION_RESPONSE_RECIEVED,
  HOUSE_FINDER_NEIGHBORHOOD_DATA_RECIEVED, and UI_ERROR_MESSAGE event
  handlers can fire in tainted server-response context; their inline
  print() calls were tainting any chat tab that displayed the message
  (most visibly ChatFrame11's flash animation). Chat output from those
  three handlers now defers to the next frame via C_Timer.After(0) and
  re-reads the message text in clean context so no secret string ever
  enters the chat pipeline. Reported by pxspin 2026-05-12.

## [1.6.1] - 2026-04-20 (April 2026)

### Added
- Friends search matches Battle.net tag as well as character name and
  neighborhood; Guild search picks it up too for guildies with a BNet link.
- Localization (deDE / esES / esMX / frFR / itIT / koKR / ptBR / ruRU /
  zhCN / zhTW) for the most-visible new v1.6.0 strings: Groups, Favourites,
  Favourite / Unfavourite, Alliance / Horde / All, Manage groups tooltip,
  and the default group name.

### Changed
- The default auto-group is now named "Empty plots" (was "Empty") and
  renders at the very bottom of the Neighborhood sub-tab, beneath real
  plots. Existing users with the old "Empty" name are migrated
  automatically on the next login.
- "Empty plots" no longer appears in the Groups popup or the right-click
  context menu. It's an auto-managed container, not a user group.
- Custom groups are now exclusive: adding a house to group B automatically
  removes it from any other group it was in. No more duplicates across
  groups; follows folder-like semantics.
- Favourites section now renders above Groups (was below). The star stays
  the most prominent pin.
- Context-menu entries have consistent spacing; no variable-size separators
  between Favourite, groups, and Manage groups items.

### Fixed
- Renaming a custom group works. The dialog's edit box field was renamed
  `EditBox` in retail 12.0 (we were reading the old `editBox`), and Enter
  in the edit box didn't commit -- both now handled.
- `/reload` no longer momentarily shows "House keys expired" when there is
  no prior sessionFresh marker (e.g. fresh install); scan is scheduled
  correctly instead.
- BNet cache no longer keeps stale entries for a friend whose plot
  ownership changed. After each friend's scan, entries still attributed to
  them that weren't in the response are pruned. (thanks Vamoose for the
  catch: Agaluga's tag previously showing the prior owner.)
- Cache scan debounce widened from 0.15s to 0.3s so a second house whose
  response packet lags slightly isn't dropped.
- Context-menu pool no longer leaks an icon-mode anchor onto later
  favourite/group items when reused across menu opens.
- Group rows no longer double-toggle when clicking the checkbox directly
  (the row-level mouse handler no longer re-runs the toggle that the
  checkbox already fires).
- Neighborhood-manager-mode extra row pool now opens the unified context
  menu with groups + tags like the base pool, instead of showing only the
  tag menu.
- Friends sub-tab's "House keys current/expired" label no longer shifts
  right when the sort bar is visible; it's pinned to the panel's left
  edge.
- BattleTag display preserves the last known tag when a friend goes
  offline; it only clears when the friend is removed from BNet entirely.
  Offline friends in `RefreshBNetLookup` now also populate the tag map.
- `GetSessionTime()` fallback no longer returns 0, which could have
  produced a false `sameClient = true` for cold client starts.

## [1.6.0] - 2026-04-20 (April 2026)

### Added
- Favourites: click the star icon on any owned plot, friend house, or guild
  house to pin it to the top of its list. Favourited rows render in a
  collapsible "Favourites" section above regular results, persisted across
  reloads per account.
- Custom groups: named buckets for organising houses. Right-click any row (or
  its star) and pick a group from the context menu to add/remove, or use the
  "Groups" header button on Friends/Guild to create, rename, and delete groups.
  Grouped houses render in their own collapsible sections above Favourites.
- Default "Empty" group (config option, default on): a renamable,
  non-deletable starter group that doubles as an auto-container for empty
  plots on the Neighborhood sub-tab. Renames stick; empty plots follow the
  bucket wherever you rename it to. Toggle in Config > "Keep a default group"
  to disable or delete it entirely.
- Faction sorting: header icon button on Friends and Guild sub-tabs splits the
  list into Alliance and Horde sections (persisted in config, default off).
  Faction split is hidden on Neighborhood since neighborhoods are single-
  faction -- instead, the neighborhood name now displays the faction atlas
  inline (Alliance/Horde icon next to the zone name).
- BattleTag display on BNet friend houses: friend rows show
  "CharName (User#1234)" so it's easier to tell whose alt is whose. Guild
  members who are also BNet friends pick up the tag too; same-realm neighbours
  match when the char name is unambiguous. (thanks Happymoon)
- Combined right-click context menu: one tidy popup with the Favourite
  toggle, per-group checkmarks (accent swatch when a member), a Manage-groups
  shortcut, and -- on the Neighborhood sub-tab with Manager mode on -- the tag
  picker inline below a divider.

### Changed
- House row layout gained a small star affordance on the left edge of each
  owned plot. Empty plots are unchanged.
- Close buttons now use atlas icons (`common-icon-redx`) on both the main
  panel and the Groups popup; delete/rename per group row use
  `common-icon-delete` and `UI-RefreshButton` with tooltips; "New group" uses
  `communities-icon-addgroupplus`.
- Section header rows (groups, favourites, faction) paint with a lighter
  scrim so they read clearly above regular rows on every theme.

### Fixed
- Endeavor progress bar no longer resets to "Loading endeavor..." shortly
  after login. The BNet/guild initiative scan was triggering a nil
  `NEIGHBORHOOD_INITIATIVE_UPDATED` payload right after restoring the viewing
  neighborhood; that no longer clobbers the last-known initiative. The player
  leaving a neighborhood still clears it via the existing RefreshPlots path.
- `/reload` and character relog no longer wrongly report "House keys expired"
  or trigger a full re-scan. VN now persists `GetSessionTime()` at scan
  completion and compares it on the next load; since GetSessionTime resets
  only on a full WoW client restart, we can distinguish cold-launch
  (houseGUIDs invalidated, re-scan needed) from any in-client reload/relog
  (houseGUIDs still valid, reuse cache).

## [1.5.0] - 2026-04-18 (April 2026)

### Added
- "My Homes" section in the Directory > Neighborhood sub-tab: persistent rows
  (one per owned house) showing faction icon, neighborhood name, house name,
  cooldown remaining, and a labelled Teleport button for each. Each button is
  its own SecureActionButton bound to that specific house's GUIDs, so you can
  teleport directly to any of your homes without relying on a "default" slot
  (thanks Mr. Fluffy).
- Return to Previous Location button: header slot with the returnhome secure
  action, letting you return to where you were before a housing teleport
  without opening the housing dashboard.
- Teleport cooldown sweep on each My Homes row button (native Blizzard widget
  via C_Housing.GetVisitCooldownInfo), plus a remaining-time label beside the
  button that shows minutes (e.g. "13m") above 60s and seconds ("45s") below.
- Loading indicator for endeavor data: when initiative info hasn't arrived from
  the server yet, the row shows "Loading endeavor..." instead of a blank space,
  and the progress bar reads "Loading..." until the update fires.
- Plot Markers header tooltip now refreshes in place on each click so the label
  matches the newly-active mode without needing to re-hover.

### Changed
- Moved Teleport Home actions out of the cramped header into the new My Homes
  rows in the Directory tab. Header now has only Close / Plot Markers / Return.
  Rows give each house room for its full neighborhood + house name plus the
  shared visit/teleport cooldown.
- Friends and Guild sub-tabs now lay out compactly directly under the sub-tab
  bar instead of reserving vertical space for the Neighborhood-only initiative
  bar and My Homes rows. The scroll area follows the search box so the full
  list is visible without scrolling past empty whitespace.

### Fixed
- Teleport Home button no longer locked to a single house: previously the addon
  hardcoded houses[1] from PLAYER_HOUSE_LIST_UPDATED, so there was no way to
  teleport to a non-default home.
- Endeavor progress no longer flashes blank on panel open. Data:RefreshInitiative
  was clearing `initiative = nil` before every async refetch, destroying
  already-arrived data during the server round-trip. Now it trusts
  NEIGHBORHOOD_INITIATIVE_UPDATED to keep state fresh in the background
  (matches VE's pattern) and only clears when the player leaves all
  neighborhoods.
- Map drawer waypoint pin now clears when the map toggle button is used to
  close the drawer, and can also be cleared by right-clicking the pin itself.
  Previously the pin persisted on both the drawer and the world map until
  /reload. Clear calls C_Map.ClearUserWaypoint and releases supertracking.

## [1.4.0] - 2026-04-17 (April 2026)

### Added
- Friendly messages for more housing visit failure codes on the reservation path
  (ActionLockedByCombat, HouseEditLockFailed, LockedByOtherPlayer,
  LockOperationFailed, MissingExpansionAccess, TimerunningNotAllowed,
  UnlockOperationFailed); previously these fell through to silent or generic
  failure text

### Fixed
- Eliminated root cause of ADDON_ACTION_BLOCKED Button:Hide() taints during
  combat refreshes in Browse and Directory tabs. Previously each row carried its
  own SecureActionButtonTemplate child, which permanently promoted the row's
  parent Button to "protected" and caused the scrollbox pool's Release/Hide to
  be blocked in combat. Now a single floating secure visit button lives at
  UIParent scope and repositions over the hovered row; no protected frames
  exist inside the scrollbox row pool anymore, so pool churn during combat
  (BNet/guild scanner completing mid-fight, neighborhood list updates,
  scrolling) is fully safe. The visit action appears on hover for friend/guild
  houses and recent visits; player-owned plots and vacant plots retain their
  existing non-secure buttons unchanged.
- Fixed guild house scan crashing inside houses, delves, dungeons, raids, and
  arenas with "bad argument #1 to 'ipairs' (table expected, got secret)".
  C_Club.GetSubscribedClubs returns opaque secret values in protected contexts;
  FetchGuildHouses now defers until the player steps outdoors and retries
  automatically on ZONE_CHANGED_INDOORS / ZONE_CHANGED_NEW_AREA.

### Changed
- Replaced the "Last full scan: Xh ago" label on the Friends/Guild subtabs with
  a session-accurate status: "House keys current" (dim) when a full scan has
  completed in the current WoW client process, or "House keys expired"
  (orange) when it hasn't. houseGUIDs are server-issued session tokens that
  reset every time the client restarts, so a timestamp from a prior session is
  misleading -- the cached data is stale regardless of how recent it looks.
  The new label tells you exactly what matters: can you click Visit right now
  and expect it to work.

## [1.3.0] - 2026-04-06 (April 2026)

### Added
- Plot marker overlay toggle button in the header bar (between home teleport and
  close button); cycles through 4 modes: off, empty (dark circles on vacant
  plots), taken (green circles on occupied plots), both (all plots marked)
- Each marker displays the plot number inside the circle (Arial Narrow 48pt,
  black on green, white on dark); uses WhiteCircle-RaidBlips atlas for
  consistent circular rendering
- Overlay state is session-only and resets to off on reload

### Fixed
- Fixed ADDON_ACTION_BLOCKED taint when Browse/Directory tabs refresh during
  combat (SecureVisitButton Hide/Show now guarded by InCombatLockdown; deferred
  to PLAYER_REGEN_ENABLED)

## [1.2.2] - 2026-03-02 (March 2026)

### Fixed
- Fixed "Permission denied" on friend/guild visits after restarting WoW.
  Blizzard's opaque houseGUIDs are tied to the WoW client process and become
  invalid after a full game exit. VN now detects cold launches vs reloads
  (via PLAYER_ENTERING_WORLD isInitialLogin) and automatically re-scans
  friends and guild houses on the first panel open after a fresh login.
- Fixed guild scan never re-running after the first session: cached guild data
  set guildScanComplete=true on load, blocking the chain condition. Now reset
  when a login re-scan is queued.
- Fixed BNet/guild scan progress counter freezing when scanning friends without
  houses (timeout handler now triggers UI refresh so progress updates smoothly)
- Friend/guild scan timestamps now track separately (Friends tab shows BNet
  scan time, Guild tab shows guild scan time)
- "Last full scan" label now updates after every completed scan
- Minimap button no longer overlaps the minimap on non-default minimap sizes
  (now uses dynamic radius based on actual minimap dimensions)

## [1.2.1] - 2026-02-28 (February 2026)

### Fixed
- Guild house scan: hardened taint protection with pcall wrapper around
  C_Club.GetClubMembers (previous type() guard failed on WoW "secret" values)

## [1.2.0] - 2026-02-25 (February 2026)

### Added
- Sort by Plot or Name on the Neighborhood subtab (toggle buttons with ascending/descending)
- Clear Tags button in Config tab to reset all neighbor tags at once (with confirmation)
- Row pool expanded from 60 to 250 for Friends and Guild lists
- Footer shows "(max 250)" when results exceed display cap

### Fixed
- Initiative scan now restores the viewing neighborhood to its pre-scan state,
  preventing VE endeavor tracker from receiving stale data after browse tab cycling
- Removed visit cooldown from friend/guild Visit buttons (Blizzard rate-limits
  natively); visiting friends no longer falsely blocks other visits
- Guild house scan no longer crashes in combat/BGs (C_Club.GetClubMembers returns
  tainted values during combat; scan now safely aborts and retries later)
- Friends and Guild scans now use fully isolated state variables (no cross-tab
  contamination of timers, pending flags, or cache data)
- Force Refresh Friends no longer resets Guild "last full scan" timestamp
- Force Refresh Friends correctly triggers full scan path (was incorrectly taking
  delta path and reporting all friends as "new")
- "Loading initiatives" overlay only appears when a tab has no rows yet (no longer
  flashes on Guild tab during unrelated Friends refresh)
- Tags set on Neighborhood tab (with realm suffix) now correctly display on Guild
  tab (fallback lookup strips realm)
- Sort comparator strict weak ordering fix (prevented crash when sorting equal values)

## [1.1.0] - 2026-02-23 (February 2026)

### Fixed
- Visit history now records friend/guild house visits (secure visithouse button)
- Directory tab no longer shows "Not in a neighborhood" after visiting via friend/guild button
- Recent visit entries preserve houseGUID when overwritten by reservation event
- BNet house scan undercounting: Blizzard fires duplicate VIEW_HOUSES events; debounce prevents data loss
- ForceRescan now cancels all in-flight fetches to prevent cross-cache data contamination
- UI_ERROR_MESSAGE handler only acts on known housing errors (no false cooldowns from unrelated game errors)
- RecordVisit nil-guards VN_DB access
- Fixed scheme.text_muted crash (replaced with text_dim in loading/scan labels)
- Fixed operator precedence in tag menu auto-close (right-click now works correctly)
- Friends tab loading indicator race condition after reload

### Changed
- Extracted shared UI helpers: CreateFlatBg, WireButtonHover, SecureVisitButton factory
- Extracted VN.SetConfig, VN.FormatTimeSince, PruneCache/DebugCacheLoad helpers
- Extracted PopulateNoPinRows, QueueInitiativeForList/Cache, SwitchSubTab helpers
- Localized all time format strings (TIME_JUST_NOW, TIME_MIN_AGO, etc.)
- Refresh button now scoped per tab: Friends only rescans BNet, Guild only rescans guild
- Reduced recent visits storage from 100 to 20 (matches display row pool)
- Visit cooldown timer displays as M:SS instead of seconds

### Added
- Visit error messages for permission denied, private neighborhoods, wrong faction, and other failures
- Failed visits apply 5-minute cooldown with friendly error message and owner name
- PreClick blocks secure visit button when destination is on cooldown (prevents Blizzard error spam)
- `/vn wipe` command to clear all caches and trigger full rescan (troubleshooting)
- VN icon button on Blizzard Housing Dashboard (next to "Open House Finder") to toggle panel
- Friends/Guild rows show Alliance or Horde faction icon
- Browse tab: Recent subtab with persistent history of visited neighborhoods
- Browse tab: Recent visits show relative timestamp and cached initiative progress
- Browse tab: Recent entries from friend/guild visits use secure revisit (no vacant plot needed)
- Browse tab: Clear History button to reset recent visit list
- Browse tab: Successful visits (reservation result 0) auto-recorded with initiative snapshot
- Teleport Home tooltip shows destination neighborhood name
- Neighborhood Manager: tag categories replace binary inactive toggle
- Right-click a neighbor row to assign a tag: Active, New, Inactive, Away, Problematic
- Each tag shows a colored accent bar and label on the row
- "None" clears the tag and reverts to the default owner-type color
- Existing inactive member data auto-migrates to the new tag system

## [1.0.0] - 2026-02-22 (February 2026)

### Added
- Directory tab: view all plots/owners in current neighborhood
- Directory tab: Friends sub-tab showing all BNet friend houses across all neighborhoods
- Directory tab: Guild sub-tab showing guild member houses with search, visit buttons, and gold accent
- Directory tab: FilterChip pills to switch between Neighborhood, Friends, and Guild views
- Directory tab: Friends/Guild search filters by name or neighborhood name
- Directory tab: Friends rows show owner name, neighborhood (dim), and blue Visit button
- Initiative progress bar with title and percentage
- Pin button: set native waypoint to any plot
- Visit button: teleport to a neighbor's house
- Search box to filter neighbors by name or plot
- Browse tab: discoverable neighborhoods via House Finder
- Browse tab: player's own houses pinned at top with teal accent bar
- Browse tab: auto-refresh on FORCE_REFRESH_HOUSE_FINDER (charter accept/decline)
- Browse tab: click any neighborhood row to show its plots on the world map
- Inline initiative fetching per neighborhood (async queue)
- Initiative cache persists across sessions (7-day TTL, ~40-day endeavor cycles)
- Canary invalidation: detects endeavor cycle resets via player's own neighborhood and wipes stale cache
- Initiative queue pauses while Blizzard Housing Dashboard is open (prevents neighborhood flashing)
- Initiative queue throttled at 0.1s between fetches to reduce API churn
- Force Refresh button on Friends/Guild sub-tabs to clear initiative cache and re-fetch
- Tooltip on Browse tab Refresh button warning about dashboard flashing
- Config: toggle to show/hide endeavor progress in Blizzard's House Finder
- Battle.net friend neighborhood search
- Guild house scanning: async per-member scan using C_Club API, 7-day cache, BNet dedup
- Guild scan starts automatically after BNet friend scan completes
- Visit tooltip shows neighborhood endeavor name and progress percentage
- Lazy incremental BNet/guild house scan: only scans NEW friends/guild members on login, prunes removed ones; full re-scan weekly or via Force Refresh
- Guild change detection: automatically wipes guild cache and re-scans when player switches guilds
- "Last full scan" label on Friends/Guild sub-tabs showing time since last full scan
- Remote pins: click a remote pin to reserve and teleport to that plot
- Remote pins: shift-click to share map link in chat
- Teleport Home button in header (SecureActionButton, combat-safe)
- Embedded neighborhood map drawer that slides out from the left side of the panel
- Animated tile loading with column-by-column fade-in effect
- Color-coded plot pins on the embedded map (teal=self, blue=friend, gray=stranger, dim=empty)
- Pin tooltips with owner name, plot name, and action hints
- Click pin to set waypoint with super-track arrow
- Shift+click pin to share map link in chat
- Map toggle button in the panel header
- "Auto-show neighborhood map" config checkbox
- Map drawer auto-shows when neighborhood data is available, auto-hides on Friends/Config tabs
- Neighborhood name displayed at top of map canvas in large themed header font
- Config: "Animated map effect" toggle to disable tile fade-in animation
- Localization: 10 languages (deDE, esES, esMX, frFR, itIT, koKR, ptBR, ruRU, zhCN, zhTW) with runtime locale switching
- Config tab: Language override dropdown to switch language (auto-detects client locale by default, reloads UI on change)
- Visit button text color matches owner type: blue for BNet friends, gold for guild members, default for strangers
- Neighborhood Manager mode: config toggle (off by default) enabling shift-click to mark members as inactive (red accent bar)
- Vertical resize: drag bottom edge to resize panel height (520-800px), persists across sessions
- UI Scale stepper: discrete +/- buttons at 0.1 increments (0.5x-2.0x range)
- Config tab: 8 themes (Solarized, Gruvbox, Everforest, Kanagawa, HC, Housing, Colorblind Safe)
- Config tab: Discord link with copyable URL
- Minimap button with drag positioning
- Custom minimap and addon icons
- Addon compartment support
- LibDataBroker launcher
- Slash commands: /vn (toggle), /vn minimap, /vn theme
