## Version 2.1.3 (Released May 2026)

**Canvas tab reliability**
- Canvas now opens with your last-session decor list instantly, instead of "Loading..." while the housing catalog primes. The catalog is snapshotted to SavedVariables on every successful fetch and re-hydrated on /reload before the live searcher returns. First-ever Canvas open on a new install still waits for the live fetch; every session after that is instant.
- When the live catalog search fails to return data, VDS now auto-retries up to 3 times (5 seconds each) with a fresh searcher each attempt, instead of getting stuck on "Loading..." forever. Visible status during the retry: "Loading dyeable decor..." -> "Catalog stuck, retrying... (N/3)" -> "Catalog unavailable" if all attempts fail. Addresses the "stuck on Loading..." case reported on Reddit.
- After a hard "Catalog unavailable" failure, switching tabs and back into Canvas triggers a fresh retry attempt -- no need to /reload unless that also fails. Recovers transient failures (network blips, slow Blizzard backend, addon-priming races) automatically.
- Live catalog fetch is now deferred until you open VDS and view the Canvas tab (mirrors Blizzard's own Housing Dashboard, which lazy-loads its catalog when you click it). Previously VDS would kick the searcher at login for users whose saved view was Canvas -- that's the window where the housing backend is least likely to be ready on fresh chars / cold machines. Combined with snapshot rehydrate, the user-visible cost of the deferral is zero: you still see your last-session decor list the moment Canvas opens. Should make the retry / failure path much rarer in practice.

**Live Customize mode**
- New **Snapshot** button next to Cancel/Apply -- saves the currently-displayed dye scheme as a variant without applying. Useful for capturing a palette you've found on existing decor before experimenting. Dedup is automatic; identical palettes are bumped to the top of the variants list instead of duplicating.
- **Apply** button now greys out when there are no pending dye changes, instead of being clickable but a no-op.
- Footer layout tightened: "Auto-save applied" -> "Auto-save" so the action buttons (Snapshot/Cancel/Apply) fit without clipping at narrow widths.

**Config sidebar**
- New **Open Debug Log** button under the Debug Mode checkbox. Opens the same popup window as /vds log. Useful for grabbing logs for bug reports without remembering the slash command.

**Debug log window**
- Every line now has a `[HH:MM:SS]` timestamp prefix for correlating events to chat / Blizzard event timing.
- New Discord invite footer in the log popup -- one click to copy the invite URL when grabbing logs for a bug report.
- Hint text + footer message now use readable text colors (previously dim grey, easily missed).

**Internal**
- Every tooltip in VDS now lives in a central `VDS.TooltipRecipes` registry. Widget specs reference recipes by name (`tooltip = { recipe = "..." }`) instead of inline strings/tables/functions. Boot validator enforces declaration on every widget. Sets up the seam for future localization and consistent tooltip styling.
- Catalog hydration (snapshot rehydrate + live searcher Init) consolidated under a single `Hydrate()` entry point on the DecorInfoResolver. Previously the two phases ran at different lifecycle points (rehydrate at module-enable, Init at canvas-shown); now both fire from the same canvas-shown wake event in the correct snapshot-then-live order. Easier to reason about, easier to log, removes a class of "why did rehydrate fire but Init didn't" debugging puzzles.
- Herb item-name pre-warm moved out of `Init.lua` into `ItemNameResolver`'s own `onEnable`. Init.lua no longer pokes into module-specific bootstrap code; each module owns its own hydration lifecycle.

## Version 2.1.2 (Released May 2026)

**Canvas tab**
- Loadout chips now support right-click to rename and shift+right-click to delete. Previously the only way to remove a saved loadout was to enter Live Customize mode on the actual decor and use the gallery tile -- a Canvas-tab cleanup loop is now possible without leaving the tab.
- The "+" save tile pulses through a rainbow color cycle (the same spectrum used by the title bar) whenever the current channel colors are not saved as a loadout for the selected decor. It quiets the moment the combo matches a saved loadout or you save it. Tooltip switches to "Loadout not saved -- click to save" while pulsing.
- The "+" tile is now hidden when you're at the 10/10 cap for a decor instead of misleadingly inviting another save that would silently fail.
- The "+" tile is now a hollow bordered icon in keeping with the rest of the chip wall, instead of a brassy gold block.

**Fixes**
- Item names that read as "Loading..." on first paint of a cold session now resolve reliably. The async name resolver now uses Blizzard's canonical ItemEventListener primitive (the same one AllTheThings uses) which wraps the kick + listen wiring around C_Item.RequestLoadItemDataByID and ITEM_DATA_LOAD_RESULT. Replaces the previous interim fix which was listening for the wrong event. Affects herb names in Stock tab, Canvas decor picker, Warehouse rows, and anywhere else item names appear.

## Version 2.1.1 (Released May 2026)

**UX**
- ESC now closes the main window, matching the journal/collections/character panel behaviour. (Boggle, Discord)

**Fixes**
- Herb names that read as "Herb <itemID>" on first paint now resolve and re-paint when the item info arrives, instead of staying stuck for the rest of the session. The async name resolver was kicking C_Item.GetItemNameByID, which warms a name-only cache but does NOT fire GET_ITEM_INFO_RECEIVED -- so the re-paint trigger never arrived for cold items. Now also calls C_Item.RequestLoadItemDataByID in the miss path to force the full-info fetch that the event actually listens to.
- Canvas decor picker no longer renders empty on the first open of a cold session (especially noticeable on slower machines where the housing catalog populates after VDS's initial searcher pass). DecorInfoResolver now listens for HOUSING_CATALOG_CATEGORY_UPDATED / HOUSING_CATALOG_SUBCATEGORY_UPDATED and re-runs the catalog search if the prior pass returned zero. Previously the only fix was /reload. (Boggle, Discord)

## Version 2.1.0 (Released May 2026)

**Canvas tab**
- The Canvas decor picker now has a Category dropdown above the list to narrow decor by Housing category.
- A new Scope filter at the top of the Canvas tab narrows the available dyes to a curated theme or one of your custom palettes. Default is "All Dyes".
- Saved loadouts for the selected decor appear as color chips below the channel pickers in the preview panel. Click a chip to apply.
- Each row in the Canvas decor picker now shows droplet icons for the decor's dye channels, plus a count badge for how many saved loadouts you have for that decor.
- Picker lists every available dyeable decor, including decor you don't own.

**Fixes**
- Saving the same color combination twice for one decor no longer creates a duplicate entry.
- Clear button now resets all three channel pickers.
- Category dropdown no longer flashes "All Categories (0)" on first open.

## Version 2.0.0 (Released May 2026)

Complete rewrite. The colored vials look the same; everything underneath is new.

**New: Stock tab**
- Set per-color-group target counts (e.g. "3 of every red"), with per-dye
  overrides for the specific dyes you want more of.
- Deficit roll-up across bags, bank, reagent bank, and warband bank.
- One-click Restock-and-Send-to-AH: Buy mode ships missing dyes to an
  Auctionator shopping list; Craft mode ships the cheapest herbs needed to
  craft them. Auctionator is a soft dependency.
- Master +/- bumps every group target at once (shift-click for x10).
- Per-dye reset button reverts an override back to the group default.

**New defaults**
- "Replace Blizzard's dye picker" is on by default for new installs.
- Custom palette and Canvas loadout creation pre-fills "Palette N" /
  "Loadout N" with an auto-incrementing number; press Enter to accept.

**Live dye mode polish**
- Focused slot now has a gold border matching the Canvas channel picker.
- Cost preview tracks Blizzard's dye-bottle spend as you preview changes.

**Tabs:** Colors / Custom / Theme / Stock / Herbs / Canvas.

**Migration**
- Your custom palettes carry forward from v1.x.
- Other state (cart, loadouts, dyeable-item cache, minimap/panel position)
  resets to defaults on first launch.

**Slash commands:** `/vds` / `/dyes` (toggle), `/vds debug`, `/vds minimap`,
`/vds hardreset`.
