-
+
[](https://github.com/Xurkon/Questie-X/releases)
[](https://xurkon.github.io/Questie-X/)
[](https://www.patreon.com/Xurkon)
@@ -188,6 +188,23 @@ If your server uses non-standard map data, enable **Options → Advanced → Use
---
+## Arrow Styles
+
+Questie-X includes a configurable arrow style picker with preview swatches, plus independent controls for arrow scale, transparency, font size, and objective attachment.
+
+Bundled arrow assets are detected automatically as either sprite sheets or regular textures, and custom `.tga` files can be dropped into `Icons/Arrows` for use in the dropdown.
+
+### Arrow Redesign
+
+- `Arrow1` through `Arrow4` are the bundled image styles, while `arrowold` remains the only bundled sprite sheet.
+- The dropdown now uses generated preview swatches from `Icons/Arrows`, so each bundled style shows a live thumbnail instead of a text-only entry.
+- Image arrows rotate as a single texture and keep their native art, while sprite sheets only use sheet-cell logic when the style is explicitly `arrowold` or a custom sheet is marked as such.
+- The arrow and objective text can be detached or reattached independently, locked separately, and reset with one-click actions.
+- The attached gap, objective transparency, arrow transparency, font size, and distance unit are all configurable directly from the Arrow tab.
+- Custom `.tga` files can still be dropped into `Icons/Arrows` and picked from the same dropdown without editing core files.
+
+---
+
## Fixes & Compatibility
### Quest Log & Tracker
diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md
deleted file mode 100644
index 3544be4..0000000
--- a/docs/PROGRESS.md
+++ /dev/null
@@ -1,140 +0,0 @@
-# QuestieLearner Phases — Progress Log
-
-## Overview
-
-QuestieLearner is being hardened in phases. Each phase is committed and pushed separately. This log tracks status, file changes, commits, and revert notes.
-
----
-
-## Phase 1: Lua 5.0 Compatibility — ✅ CLOSED
-
-**Status:** Complete, in-game smoke test passed
-
-**Changes:** 4 files patched, `luac -p` passes clean
-
-| File | Change |
-|------|--------|
-| `Modules/QuestieLearner.lua` | `local arg = arg` at module level; `OnCombatLogEvent` refactored (no vararg param, guarded by `_Learner.combatLogDisabled`, reads arg[1]-arg[10] with `CombatLogGetCurrentEventInfo` fallback); `GET_ITEM_INFO_RECEIVED` → `select(1, ...)`; `QUEST_REMOVED` → `select(1, ...)` |
-| `Modules/Quest/AvailableQuests.lua:98` | `UnloadUndoable()` guard: `and not QuestiePlayer.currentQuestlog[questId]` |
-| `Modules/Quest/QuestieQuest.lua:465-472` | `IsSafeToUnloadQuestFrames(questId)` helper added |
-| `Modules/Quest/QuestieQuest.lua:458-461` | `HideQuest()` guard: `and not QuestiePlayer.currentQuestlog[questId]` |
-| `Modules/Quest/DailyQuests.lua:114` | `HandleDailyQuests()` guard added |
-| `Modules/Tracker/TrackerUtils.lua:791` | Fallback `IsComplete` gated by `QuestiePlayer.currentQuestlog[questId]` |
-| `Modules/Tooltips/TooltipHandler.lua:11,117` | Questie import + `currentQuestlog` guard |
-
-**Commits:** `77746a7` (Arrow debug), `3b31ba5` (Felendren fix), `11a3b47` (Sunstrider map pins), `f394a3b` (quest spawns), `096b4cc` (learned spawns)
-
-**Revert per file:** `git checkout HEAD~5 -- Complete history of changes, fixes, and additions.
v1.6.3, then tightened the release filters so handoff notes, local dev settings, and other workspace-only artifacts stay out of the exported release archive.Arrow1 through Arrow4) plus one legacy sheet arrow (arrowold). The old default arrow.tga cache path was retired in favor of the new image-specific asset names, and a regression test now asserts that only arrowold remains a bundled sprite sheet.
+ Icons\\Arrows, with matching generated preview TGAs so the dropdown can show a visible swatch for each style.arrowold and explicitly custom sheet uploads only.Tests\\QuestieArrowAssets_spec.lua now checks the manifest labels, texture paths, sheet guard, and folder contents so a future asset rename cannot silently reintroduce sheet mode for every style.Icons\\Arrows\\*_preview.tga files so users can see the artwork at a glance instead of guessing from the name.arrowold.mapRadius for both the radius and the pixel multiplier, which crashed on 3.3.5a because the live API fallback was not wired in yet.GetWidth() * GetScale() / 2 directly and fixed low zoom levels, but higher zooms still drifted because the map radius source was still wrong.Minimap:GetViewRadius() API with the correct pixel half-width formula, which aligned the world-yard math with the on-screen pixel math.Compat/HBD.lua was reading mapRadius from a hardcoded minimap_size lookup table calibrated for stock WoW zoom levels. The API check C_Minimap and C_Minimap.GetViewRadius evaluated to nil on 3.3.5a (and Ascension), so the broken lookup table was always used. The lookup value minimap_size.outdoor[5] = 250 produced mapRadius = 125, but the actual live minimap view radius at zoom 5 is 116.67 yards (from Minimap:GetViewRadius()). This 6.7% error compounded across all pin offsets.minimapWidth was computed as (GetWidth() * mapRadius / 155.52) / 2, mixing pixel-half-width with a yards-based scale factor. The / 155.52 constant was a hardcoded normalization that did not match the live API value. The math was self-inconsistent: ratio minimapWidth / mapRadius was 0.56 (off by ~7% from the correct 0.6).minimapWidth was based on GetWidth() alone, ignoring GetScale(). When UI scale changed, the pixel dimensions reported by GetWidth() would diverge from the actual on-screen size, while mapRadius (in yards) stayed fixed. This caused drift to worsen at higher zoom levels where the ratio was most sensitive.