Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
ac293f1
Targeted Spells: base border -> DF.Border (Stage 1)
Krathe82 Jun 15, 2026
4a5e98e
Targeted Spells: highlight border -> DF.Border overlay (Stage 2)
Krathe82 Jun 15, 2026
723c3f7
Targeted Spells: migrate TestMode preview + teardown off bespoke help…
Krathe82 Jun 15, 2026
99a3515
Targeted Spells: full DF.Border GUI toolkit (Stage 1.5)
Krathe82 Jun 15, 2026
b19eef9
Targeted Spells: migrate Targeted List bar highlight glow to DF.Borde…
Krathe82 Jun 15, 2026
6ceb1f7
Targeted Spells: delete the dead bespoke border helpers (Stage 3c)
Krathe82 Jun 15, 2026
2809a70
Targeted Spells: seed the new border defaults (fix nil dropdowns)
Krathe82 Jun 15, 2026
5f2e579
Targeted Spells: add Important Spell Border defaults (foundation)
Krathe82 Jun 15, 2026
b2a2988
Targeted Spells: migrate old highlight settings -> Important Spell Bo…
Krathe82 Jun 15, 2026
1a324fd
Targeted Spells: group important-spell highlight onto its own DF.Bord…
Krathe82 Jun 15, 2026
10cdde6
Targeted Spells: fix test-mode border render + redundant highlight to…
Krathe82 Jun 15, 2026
383a263
Targeted List: make the important highlight a static border, not a PR…
Krathe82 Jun 15, 2026
ae4d6e0
Targeted List: add alpha to the highlight colour
Krathe82 Jun 15, 2026
7741b31
Targeted Spells: fix important-highlight inset not staying centred
Krathe82 Jun 15, 2026
579efe9
Targeted Spells: allow important highlight thickness 0 (matches base …
Krathe82 Jun 15, 2026
e2da95b
Targeted/Personal Targeted Spells: move Alpha + Cooldown Swipe out of…
Krathe82 Jun 15, 2026
65a7a43
Border: hide solid/gradient edges at thickness 0
Krathe82 Jun 15, 2026
8031065
Border: hide textured backdrop at thickness 0 (parity with solid)
Krathe82 Jun 15, 2026
786fd75
Personal Targeted Spell: important highlight onto its own DF.Border s…
Krathe82 Jun 15, 2026
e65b4c1
Borders: allow thickness 0 on the two animation-capable outliers
Krathe82 Jun 15, 2026
90ec37f
Border: always defer LCG glow start so it never sizes to a stale frame
Krathe82 Jun 16, 2026
95a8c8f
Border: fix doubled PROC glow on re-apply; start in loop state
Krathe82 Jun 16, 2026
895eb10
Border: make PROC start flash an opt-in option
Krathe82 Jun 16, 2026
f736a2b
Border: temporary PROC glow diagnostics (gated on /df debug)
Krathe82 Jun 16, 2026
d37caa0
Border: reset ProcGlow textures before pool release (fix double glow)
Krathe82 Jun 16, 2026
a73532e
Border: remove temporary PROC glow diagnostics
Krathe82 Jun 16, 2026
cad0e56
Test mode: add Targeted Spells + Personal Targeted toggles
Krathe82 Jun 16, 2026
d38fab7
Targeted/Personal Targeted Spells: group Alpha with Size/Scale, Swipe…
Krathe82 Jun 16, 2026
38bf01e
Changelog: Targeted Spells border rework + border-engine fixes
Krathe82 Jun 16, 2026
c6e2baa
Targeted Spells: fix Important Spell Border migration dropping old se…
Krathe82 Jun 16, 2026
d351bb3
Changelog: add #164 entries to CHANGELOG.md (the build's source)
Krathe82 Jun 16, 2026
959b007
Export: include targeted-spell border + Important Spell Border keys
Krathe82 Jun 16, 2026
24a92a1
Changelog: drop Changelog.lua edit (generated from CHANGELOG.md at bu…
Krathe82 Jun 16, 2026
89c8d7f
Targeted Spells: re-anchor Important-border migration to merge cleanl…
Krathe82 Jun 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
### Improvements

* (Pinned Frames) Pinned frame settings are now **global per party/raid mode** and no longer saved into auto layouts — a raid auto layout only controls whether each pinned set is **shown** for that layout. This removes the stale/blank pinned data and editor mismatches that came from pinned settings being stored per-layout, and pinned edits now take effect live. (by Krathe)
* (Targeted Spells) The party and personal targeted-spell icons now use the **full border toolkit** — style, colour, alpha, inset, blend mode, shadow and animation — the same controls as the rest of the addon, and the important-spell highlight is now its **own border** you can style separately. Existing highlight settings carry over. (by Krathe)

### Bug Fixes

Expand All @@ -29,6 +30,8 @@
* (Aura Designer) Text-only icons no longer draw a leftover border (static or expiring). (by Krathe)
* (Aura Designer) Aura icon and square borders from older profiles keep their original look after the border rework, instead of appearing thinner or floating in a gap. (by Krathe)
* (Buff/Debuff) Icon borders from older profiles no longer float in a gap after the border rework — they hug the icon as before. (by Krathe)
* (Borders) A border set to thickness **0** now hides cleanly across every style, while any border animation keeps running. (by Krathe)
* (Borders) Fixed a doubled glow that could appear on the **PROC** border animation when it re-triggered; the PROC start-flash is now an opt-in option. (by Krathe)

## [4.4.1]

Expand Down
166 changes: 163 additions & 3 deletions Config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1706,6 +1706,33 @@ DF.PartyDefaults = {
personalTargetedSpellHighlightInset = 3,
personalTargetedSpellHighlightSize = 3,
personalTargetedSpellHighlightStyle = "glow",
personalTargetedSpellImportantBorderAnimationColor = {r = 1, g = 0.8, b = 0, a = 1},
personalTargetedSpellImportantBorderAnimationCornerLength = 10,
personalTargetedSpellImportantBorderAnimationFrequency = 0.25,
personalTargetedSpellImportantBorderAnimationInset = 0,
personalTargetedSpellImportantBorderAnimationLength = 8,
personalTargetedSpellImportantBorderAnimationMask = false,
personalTargetedSpellImportantBorderAnimationOffsetX = 0,
personalTargetedSpellImportantBorderAnimationOffsetY = 0,
personalTargetedSpellImportantBorderAnimationParticles = 8,
personalTargetedSpellImportantBorderAnimationScale = 1,
personalTargetedSpellImportantBorderAnimationSidesAxis = "HORIZONTAL",
personalTargetedSpellImportantBorderAnimationThickness = 3,
personalTargetedSpellImportantBorderAnimationType = "PROC",
personalTargetedSpellImportantBorderBlendMode = "BLEND",
personalTargetedSpellImportantBorderColor = {r = 1, g = 0.8, b = 0, a = 1},
personalTargetedSpellImportantBorderGradientDirection = "HORIZONTAL",
personalTargetedSpellImportantBorderGradientEndColor = {r = 0.5, g = 0.5, b = 0.5, a = 1},
personalTargetedSpellImportantBorderGradientStartColor = {r = 0, g = 0, b = 0, a = 1},
personalTargetedSpellImportantBorderInset = 3,
personalTargetedSpellImportantBorderShadowColor = {r = 0, g = 0, b = 0, a = 0.8},
personalTargetedSpellImportantBorderShadowEnabled = false,
personalTargetedSpellImportantBorderShadowOffsetX = 1,
personalTargetedSpellImportantBorderShadowOffsetY = -1,
personalTargetedSpellImportantBorderShadowSize = 1,
personalTargetedSpellImportantBorderSize = 3,
personalTargetedSpellImportantBorderStyle = "SOLID",
personalTargetedSpellImportantBorderTexture = "SOLID",
personalTargetedSpellImportantOnly = false,
personalTargetedSpellInArena = true,
personalTargetedSpellInBattlegrounds = true,
Expand Down Expand Up @@ -2069,8 +2096,60 @@ DF.PartyDefaults = {
-- Targeted Spells (on-frame)
targetedSpellAlpha = 1,
targetedSpellAnchor = "BOTTOM",
targetedSpellBorderAnimationColor = {r = 0.95, g = 0.95, b = 0.32, a = 1},
targetedSpellBorderAnimationCornerLength = 10,
targetedSpellBorderAnimationFrequency = 0.25,
targetedSpellBorderAnimationInset = 0,
targetedSpellBorderAnimationLength = 8,
targetedSpellBorderAnimationMask = false,
targetedSpellBorderAnimationOffsetX = 0,
targetedSpellBorderAnimationOffsetY = 0,
targetedSpellBorderAnimationParticles = 8,
targetedSpellBorderAnimationScale = 1,
targetedSpellBorderAnimationSidesAxis = "HORIZONTAL",
targetedSpellBorderAnimationThickness = 3,
targetedSpellBorderAnimationType = "NONE",
targetedSpellBorderBlendMode = "BLEND",
targetedSpellBorderColor = {r = 1, g = 0.3, b = 0},
targetedSpellBorderGradientDirection = "HORIZONTAL",
targetedSpellBorderGradientEndColor = {r = 0.5, g = 0.5, b = 0.5, a = 1},
targetedSpellBorderGradientStartColor = {r = 0, g = 0, b = 0, a = 1},
targetedSpellBorderInset = 0,
targetedSpellBorderShadowColor = {r = 0, g = 0, b = 0, a = 0.8},
targetedSpellBorderShadowEnabled = false,
targetedSpellBorderShadowOffsetX = 1,
targetedSpellBorderShadowOffsetY = -1,
targetedSpellBorderShadowSize = 1,
targetedSpellBorderSize = 2,
targetedSpellBorderStyle = "SOLID",
targetedSpellBorderTexture = "SOLID",
targetedSpellImportantBorderAnimationColor = {r = 1, g = 0.8, b = 0, a = 1},
targetedSpellImportantBorderAnimationCornerLength = 10,
targetedSpellImportantBorderAnimationFrequency = 0.25,
targetedSpellImportantBorderAnimationInset = 0,
targetedSpellImportantBorderAnimationLength = 8,
targetedSpellImportantBorderAnimationMask = false,
targetedSpellImportantBorderAnimationOffsetX = 0,
targetedSpellImportantBorderAnimationOffsetY = 0,
targetedSpellImportantBorderAnimationParticles = 8,
targetedSpellImportantBorderAnimationScale = 1,
targetedSpellImportantBorderAnimationSidesAxis = "HORIZONTAL",
targetedSpellImportantBorderAnimationThickness = 3,
targetedSpellImportantBorderAnimationType = "PROC",
targetedSpellImportantBorderBlendMode = "BLEND",
targetedSpellImportantBorderColor = {r = 1, g = 0.8, b = 0, a = 1},
targetedSpellImportantBorderGradientDirection = "HORIZONTAL",
targetedSpellImportantBorderGradientEndColor = {r = 0.5, g = 0.5, b = 0.5, a = 1},
targetedSpellImportantBorderGradientStartColor = {r = 0, g = 0, b = 0, a = 1},
targetedSpellImportantBorderInset = 2,
targetedSpellImportantBorderShadowColor = {r = 0, g = 0, b = 0, a = 0.8},
targetedSpellImportantBorderShadowEnabled = false,
targetedSpellImportantBorderShadowOffsetX = 1,
targetedSpellImportantBorderShadowOffsetY = -1,
targetedSpellImportantBorderShadowSize = 1,
targetedSpellImportantBorderSize = 3,
targetedSpellImportantBorderStyle = "SOLID",
targetedSpellImportantBorderTexture = "SOLID",
targetedSpellDisableMouse = false,
targetedSpellDurationColor = {r = 1, g = 1, b = 1},
targetedSpellDurationColorByTime = false,
Expand Down Expand Up @@ -2148,7 +2227,7 @@ DF.PartyDefaults = {
targetedListHideOwnCasts = false,
targetedListHideOutOfCombat = true,
targetedListHighlightImportant = true,
targetedListHighlightColor = {r = 1, g = 0.8, b = 0},
targetedListHighlightColor = {r = 1, g = 0.8, b = 0, a = 1},
targetedListIconPosition = "LEFT",
targetedListImportantOnly = false,
targetedListInArena = true,
Expand Down Expand Up @@ -2231,7 +2310,8 @@ DF.PartyDefaults = {
testShowReducedMaxHealth = true,
testShowSelection = false,
testShowStatusIcons = true,
testShowTargetedSpell = false,
testShowTargetedSpell = true,
testShowPersonalTargeted = true,
testShowClassPower = true,
testShowAuraDesigner = false,
testShowTextDesigner = true,
Expand Down Expand Up @@ -3306,6 +3386,33 @@ DF.RaidDefaults = {
personalTargetedSpellHighlightInset = 3,
personalTargetedSpellHighlightSize = 3,
personalTargetedSpellHighlightStyle = "glow",
personalTargetedSpellImportantBorderAnimationColor = {r = 1, g = 0.8, b = 0, a = 1},
personalTargetedSpellImportantBorderAnimationCornerLength = 10,
personalTargetedSpellImportantBorderAnimationFrequency = 0.25,
personalTargetedSpellImportantBorderAnimationInset = 0,
personalTargetedSpellImportantBorderAnimationLength = 8,
personalTargetedSpellImportantBorderAnimationMask = false,
personalTargetedSpellImportantBorderAnimationOffsetX = 0,
personalTargetedSpellImportantBorderAnimationOffsetY = 0,
personalTargetedSpellImportantBorderAnimationParticles = 8,
personalTargetedSpellImportantBorderAnimationScale = 1,
personalTargetedSpellImportantBorderAnimationSidesAxis = "HORIZONTAL",
personalTargetedSpellImportantBorderAnimationThickness = 3,
personalTargetedSpellImportantBorderAnimationType = "PROC",
personalTargetedSpellImportantBorderBlendMode = "BLEND",
personalTargetedSpellImportantBorderColor = {r = 1, g = 0.8, b = 0, a = 1},
personalTargetedSpellImportantBorderGradientDirection = "HORIZONTAL",
personalTargetedSpellImportantBorderGradientEndColor = {r = 0.5, g = 0.5, b = 0.5, a = 1},
personalTargetedSpellImportantBorderGradientStartColor = {r = 0, g = 0, b = 0, a = 1},
personalTargetedSpellImportantBorderInset = 3,
personalTargetedSpellImportantBorderShadowColor = {r = 0, g = 0, b = 0, a = 0.8},
personalTargetedSpellImportantBorderShadowEnabled = false,
personalTargetedSpellImportantBorderShadowOffsetX = 1,
personalTargetedSpellImportantBorderShadowOffsetY = -1,
personalTargetedSpellImportantBorderShadowSize = 1,
personalTargetedSpellImportantBorderSize = 3,
personalTargetedSpellImportantBorderStyle = "SOLID",
personalTargetedSpellImportantBorderTexture = "SOLID",
personalTargetedSpellImportantOnly = false,
personalTargetedSpellInArena = true,
personalTargetedSpellInBattlegrounds = true,
Expand Down Expand Up @@ -3669,8 +3776,60 @@ DF.RaidDefaults = {
-- Targeted Spells (on-frame)
targetedSpellAlpha = 1,
targetedSpellAnchor = "BOTTOM",
targetedSpellBorderAnimationColor = {r = 0.95, g = 0.95, b = 0.32, a = 1},
targetedSpellBorderAnimationCornerLength = 10,
targetedSpellBorderAnimationFrequency = 0.25,
targetedSpellBorderAnimationInset = 0,
targetedSpellBorderAnimationLength = 8,
targetedSpellBorderAnimationMask = false,
targetedSpellBorderAnimationOffsetX = 0,
targetedSpellBorderAnimationOffsetY = 0,
targetedSpellBorderAnimationParticles = 8,
targetedSpellBorderAnimationScale = 1,
targetedSpellBorderAnimationSidesAxis = "HORIZONTAL",
targetedSpellBorderAnimationThickness = 3,
targetedSpellBorderAnimationType = "NONE",
targetedSpellBorderBlendMode = "BLEND",
targetedSpellBorderColor = {r = 1, g = 0.3, b = 0},
targetedSpellBorderGradientDirection = "HORIZONTAL",
targetedSpellBorderGradientEndColor = {r = 0.5, g = 0.5, b = 0.5, a = 1},
targetedSpellBorderGradientStartColor = {r = 0, g = 0, b = 0, a = 1},
targetedSpellBorderInset = 0,
targetedSpellBorderShadowColor = {r = 0, g = 0, b = 0, a = 0.8},
targetedSpellBorderShadowEnabled = false,
targetedSpellBorderShadowOffsetX = 1,
targetedSpellBorderShadowOffsetY = -1,
targetedSpellBorderShadowSize = 1,
targetedSpellBorderSize = 2,
targetedSpellBorderStyle = "SOLID",
targetedSpellBorderTexture = "SOLID",
targetedSpellImportantBorderAnimationColor = {r = 1, g = 0.8, b = 0, a = 1},
targetedSpellImportantBorderAnimationCornerLength = 10,
targetedSpellImportantBorderAnimationFrequency = 0.25,
targetedSpellImportantBorderAnimationInset = 0,
targetedSpellImportantBorderAnimationLength = 8,
targetedSpellImportantBorderAnimationMask = false,
targetedSpellImportantBorderAnimationOffsetX = 0,
targetedSpellImportantBorderAnimationOffsetY = 0,
targetedSpellImportantBorderAnimationParticles = 8,
targetedSpellImportantBorderAnimationScale = 1,
targetedSpellImportantBorderAnimationSidesAxis = "HORIZONTAL",
targetedSpellImportantBorderAnimationThickness = 3,
targetedSpellImportantBorderAnimationType = "PROC",
targetedSpellImportantBorderBlendMode = "BLEND",
targetedSpellImportantBorderColor = {r = 1, g = 0.8, b = 0, a = 1},
targetedSpellImportantBorderGradientDirection = "HORIZONTAL",
targetedSpellImportantBorderGradientEndColor = {r = 0.5, g = 0.5, b = 0.5, a = 1},
targetedSpellImportantBorderGradientStartColor = {r = 0, g = 0, b = 0, a = 1},
targetedSpellImportantBorderInset = 2,
targetedSpellImportantBorderShadowColor = {r = 0, g = 0, b = 0, a = 0.8},
targetedSpellImportantBorderShadowEnabled = false,
targetedSpellImportantBorderShadowOffsetX = 1,
targetedSpellImportantBorderShadowOffsetY = -1,
targetedSpellImportantBorderShadowSize = 1,
targetedSpellImportantBorderSize = 3,
targetedSpellImportantBorderStyle = "SOLID",
targetedSpellImportantBorderTexture = "SOLID",
targetedSpellDisableMouse = false,
targetedSpellDurationColor = {r = 1, g = 1, b = 1},
targetedSpellDurationColorByTime = false,
Expand Down Expand Up @@ -3736,7 +3895,8 @@ DF.RaidDefaults = {
testShowReducedMaxHealth = true,
testShowSelection = false,
testShowStatusIcons = true,
testShowTargetedSpell = false,
testShowTargetedSpell = true,
testShowPersonalTargeted = true,
testShowClassPower = true,
testShowAuraDesigner = false,
testShowTextDesigner = true,
Expand Down
63 changes: 63 additions & 0 deletions Core.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3543,6 +3543,63 @@ function DF:MigrateBorderInsetFold()
end
end

-- One-time: carry the old bespoke important-spell highlight settings
-- (targetedSpellHighlightStyle/Color/Size/Inset) into the new Important Spell
-- Border key set (targetedSpellImportantBorder*), which is a second DF.Border
-- gated by the Highlight-Important toggle. Defaults already match the old
-- defaults, so untouched profiles need nothing; this only preserves customised
-- highlights. Per-profile guarded. Style maps onto a DF.Border animation type.
function DF:MigrateTargetedSpellImportantBorder()
if not DandersFramesDB_v2 or not DandersFramesDB_v2.profiles then return end
local styleToAnim = { glow = "PROC", marchingAnts = "DF_DASH", pulse = "DF_PULSATE",
solidBorder = "NONE", none = "NONE" }
-- Copy a feature's old <prefix>Highlight* keys into its new
-- <prefix>ImportantBorder* set. Gated ONLY by the per-profile _…V1 flag in the
-- caller (so it runs exactly once); do NOT also guard on the new key being nil —
-- the ADDON_LOADED default-merge fills the new …ImportantBorder* keys before this
-- runs, so a nil-guard would never fire and the old highlight settings would be
-- lost. At first run the user can't have set the new keys yet, so overwriting the
-- just-merged defaults with their old highlight values is exactly the intent.
-- Mirrors MigrateBorderInsetFold. Shared by the group (targetedSpell) and personal
-- (personalTargetedSpell) sets.
local function mapHighlight(m, p)
if m[p.."HighlightColor"] ~= nil then
m[p.."ImportantBorderColor"] = m[p.."HighlightColor"]
m[p.."ImportantBorderAnimationColor"] = m[p.."HighlightColor"]
end
if m[p.."HighlightSize"] ~= nil then
m[p.."ImportantBorderSize"] = m[p.."HighlightSize"]
end
if m[p.."HighlightInset"] ~= nil then
m[p.."ImportantBorderInset"] = m[p.."HighlightInset"]
end
if m[p.."HighlightStyle"] ~= nil then
m[p.."ImportantBorderAnimationType"] = styleToAnim[m[p.."HighlightStyle"]] or "PROC"
end
end
for _, profile in pairs(DandersFramesDB_v2.profiles) do
if type(profile) == "table" then
-- Group/party Targeted Spells. Guarded independently from personal so a
-- profile already through this step still receives the personal one.
if not profile._tsImportantBorderV1 then
for _, modeKey in ipairs({ "party", "raid" }) do
local m = profile[modeKey]
if type(m) == "table" then mapHighlight(m, "targetedSpell") end
end
profile._tsImportantBorderV1 = true
end
-- Personal Targeted Spell.
if not profile._personalTsImportantBorderV1 then
for _, modeKey in ipairs({ "party", "raid" }) do
local m = profile[modeKey]
if type(m) == "table" then mapHighlight(m, "personalTargetedSpell") end
end
profile._personalTsImportantBorderV1 = true
end
end
end
end

-- The handler body is stored on DF as _MainEventDispatcher so the profiler
-- can swap it for an instrumented version at runtime. The frame's actual
-- script is a thin trampoline that calls through DF — re-binding takes
Expand Down Expand Up @@ -5286,6 +5343,12 @@ DF._MainEventDispatcher = function(self, event, arg1)
DF:MigrateDesignerPresets()
end

-- Carry old important-spell highlight settings into the new
-- Important Spell Border key set (per-profile guarded, no-op once run).
if DF.MigrateTargetedSpellImportantBorder then
DF:MigrateTargetedSpellImportantBorder()
end

if DF.MigrateTextDesignerFromLegacy then
DF:MigrateTextDesignerFromLegacy()
end
Expand Down
Loading