forked from EllesmereGaming/EllesmereUI
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEUI__General_Options.lua
More file actions
7577 lines (7035 loc) · 416 KB
/
Copy pathEUI__General_Options.lua
File metadata and controls
7577 lines (7035 loc) · 416 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
-------------------------------------------------------------------------------
-- EUI__General_Options.lua
-- Registers the Global Settings module with EllesmereUI
-- CVar-based settings that apply to all EllesmereUI addons
--
-- Default-application policy:
-- We use C_CVar.GetCVarInfo(name) to get both the current value and
-- Blizzard's built-in default. Our preferred defaults are only applied
-- when the CVar is still sitting at Blizzard's default -- meaning
-- neither the player nor another addon has touched it. If the value
-- differs from the Blizzard default in any way, we leave it alone.
-- Widgets always read the live CVar value so they stay in sync
-- regardless of who set it.
-------------------------------------------------------------------------------
local ADDON_NAME = ...
-------------------------------------------------------------------------------
-- Page / section names
-------------------------------------------------------------------------------
local PAGE_GENERAL = "General"
local PAGE_COLORS = "Fonts & Colors"
local PAGE_PROFILES = "Profiles"
local PAGE_WHATSNEW = "Patch Notes"
-- Profiles and Patch Notes are their own sidebar pages (single-page modules),
-- not tabs under Global Settings. These keys match the sidebar buttons created
-- in EllesmereUI.lua.
local PROFILES_KEY = "_EUIProfiles"
local PATCHNOTES_KEY = "_EUIPatchNotes"
-- Standalone single-module builds rename the host addon to contain "Standalone".
-- The What's New tab is suite-only, so it is never added to the page list there.
local IS_STANDALONE = type(ADDON_NAME) == "string" and ADDON_NAME:find("Standalone") ~= nil
-------------------------------------------------------------------------------
-- Shared CDM spell-layout export flow
-- Used by BOTH the full-profile export and the per-addon export. Asks whether
-- to bundle the CDM spell layout (which spells sit on which bars + per-spell
-- settings); on Yes, opens the spec picker so the user chooses which specs.
-- Calls exportFn(includeCDM, cdmSpecs) with the result. An export string is
-- produced ONLY on an explicit "No" (without layout) or a completed picker
-- selection -- closing/escaping either popup produces NO export.
-------------------------------------------------------------------------------
function EllesmereUI.RunCDMSpellExportFlow(activeName, exportFn)
local function pickThenExport()
local specs = {}
local sp = EllesmereUIDB and EllesmereUIDB.spellAssignments
and EllesmereUIDB.spellAssignments.profiles
and EllesmereUIDB.spellAssignments.profiles[activeName]
and EllesmereUIDB.spellAssignments.profiles[activeName].specProfiles
local n = (GetNumSpecializations and GetNumSpecializations()) or 0
for i = 1, n do
local specID = GetSpecializationInfo and GetSpecializationInfo(i)
if specID then
local key = tostring(specID)
local d = sp and sp[key]
specs[#specs + 1] = {
key = key,
checked = (d and type(d.barSpells) == "table" and next(d.barSpells) ~= nil) and true or false,
}
end
end
EllesmereUI:ShowCDMSpecPickerPopup({
title = EllesmereUI.L("Export CDM Spells"),
subtitle = EllesmereUI.L("This can't change which spells the user tracks in Blizzard's CDM.\nIt's recommended to also share your Blizzard CDM layout for any spec you choose here."),
subtitleColor = { 1, 0.82, 0.2 },
subtitleAtBottom = true,
confirmText = EllesmereUI.L("Export"),
specs = specs,
onConfirm = function(selectedSpecs) exportFn(true, selectedSpecs) end,
onCancel = function() end, -- cancel / Esc / click-off: just close, NO export
})
end
EllesmereUI:ShowConfirmPopup({
title = EllesmereUI.L("Include CDM Spell Layout?"),
message = EllesmereUI.L("Include your Cooldown Manager spell layout (which spells sit on which bars) plus all per-spell settings for any specs you choose."),
confirmText = EllesmereUI.L("Yes"),
cancelText = EllesmereUI.L("No"),
onConfirm = function() pickThenExport() end,
onCancel = function() exportFn(false, nil) end, -- "No": export WITHOUT layout
onDismiss = function() end, -- Esc / click-off: just close, NO export
})
end
-------------------------------------------------------------------------------
-- What's New? page -- interactive patch notes in three tiers of importance:
-- 1) hero cards (two per row), 2) small clickable listings, 3) fix lines.
-- Content lives in EllesmereUI._WHATSNEW_PATCHES (newest patch first). A
-- hero/listing entry with a `nav` deep-links to the setting it changed via
-- EllesmereUI:NavigateToElementSettings (opens the page + green-pulses the
-- control); an entry with NO `nav` renders as a static, non-clickable card
-- (for automatic behavior that has no setting to open). Defined at file scope
-- (namespace function) so it adds no locals or upvalues to the deferred
-- options closure below.
-------------------------------------------------------------------------------
function EllesmereUI._BuildWhatsNewPage(pageName, parent, yOffset)
local PP = EllesmereUI.PanelPP
local EG = EllesmereUI.ELLESMERE_GREEN
local PAD = EllesmereUI.CONTENT_PAD
local W = EllesmereUI.Widgets
local MakeFont = EllesmereUI.MakeFont
local MakeBorder = EllesmereUI.MakeBorder
-- This page is a free-form feed, not a DualRow split layout.
parent._showRowDivider = nil
local y = yOffset
local totalW = parent:GetWidth() - PAD * 2
local CARD_GAP = 14
-- Display title: "Module: Title" -- the module name is prepended to every entry.
local function TitleOf(e)
return ((e.module and EllesmereUI.L(e.module) .. ": ") or "") .. (EllesmereUI.L(e.title) or "")
end
-- Stable sort by module display name so same-module entries group together
-- (preserves authored order within a module).
local function SortByModule(list)
local idx = {}
for i, e in ipairs(list) do idx[i] = { e, i } end
table.sort(idx, function(a, b)
local am, bm = a[1].module or "", b[1].module or ""
if am ~= bm then return am < bm end
return a[2] < b[2]
end)
local out = {}
for i = 1, #idx do out[i] = idx[i][1] end
return out
end
-- Deep-link to a setting (opens the page; highlights the control if mapped).
local function GoTo(nav)
if nav and nav.module then
EllesmereUI:NavigateToElementSettings(nav.module, nav.page, nav.section, nav.preSelect, nav.highlight)
end
end
-- Tier 1: a clickable hero card -- dark fill, faint border, green top accent,
-- title + wrapping description, uniform hover lift.
local function MakeHeroCard(x, cy, w, hgt, entry)
local card = CreateFrame("Button", nil, parent)
PP.Size(card, w, hgt)
PP.Point(card, "TOPLEFT", parent, "TOPLEFT", x, cy)
card:SetFrameLevel(parent:GetFrameLevel() + 2)
local bg = card:CreateTexture(nil, "BACKGROUND")
bg:SetAllPoints()
bg:SetColorTexture(0.06, 0.08, 0.10, 0.50)
local brd = MakeBorder(card, 1, 1, 1, 0.12, PP)
local accent = card:CreateTexture(nil, "ARTWORK", nil, 7)
accent:SetColorTexture(EG.r, EG.g, EG.b, 0.6)
PP.Point(accent, "TOPLEFT", card, "TOPLEFT", 1, -1)
PP.Point(accent, "TOPRIGHT", card, "TOPRIGHT", -1, -1)
accent:SetHeight(2)
if PP.DisablePixelSnap then PP.DisablePixelSnap(accent) end
local titleFs = MakeFont(card, 14, nil, EG.r, EG.g, EG.b, 0.9)
PP.Point(titleFs, "TOPLEFT", card, "TOPLEFT", 16, -14)
PP.Point(titleFs, "RIGHT", card, "RIGHT", -16, 0)
titleFs:SetJustifyH("LEFT"); titleFs:SetWordWrap(false)
titleFs:SetText(TitleOf(entry))
local descFs = MakeFont(card, 12, nil, 1, 1, 1, 0.45)
PP.Point(descFs, "TOPLEFT", titleFs, "BOTTOMLEFT", 0, -7)
PP.Point(descFs, "RIGHT", card, "RIGHT", -16, 0)
descFs:SetJustifyH("LEFT"); descFs:SetJustifyV("TOP"); descFs:SetWordWrap(true)
descFs:SetText(EllesmereUI.L(entry.desc) or "")
-- Clickable only when the entry has a nav target. An entry with no nav
-- (automatic behavior with no setting to open -- e.g. party frames in
-- arena) renders as a static card: no hover lift, no click, and mouse
-- disabled so nothing invites a click that would go nowhere.
if entry.nav and entry.nav.module then
card:SetScript("OnEnter", function()
bg:SetColorTexture(0.11, 0.13, 0.15, 0.50); brd:SetColor(1, 1, 1, 0.22)
titleFs:SetAlpha(1)
end)
card:SetScript("OnLeave", function()
bg:SetColorTexture(0.06, 0.08, 0.10, 0.50); brd:SetColor(1, 1, 1, 0.12)
titleFs:SetAlpha(0.9)
end)
card:SetScript("OnClick", function() GoTo(entry.nav) end)
else
card:EnableMouse(false)
end
end
-- Tier 2: a clickable small listing -- title + subtitle, no card chrome, a
-- faint row highlight on hover.
local function MakeListing(cy, w, entry)
local ROW_H = 48
local row = CreateFrame("Button", nil, parent)
PP.Size(row, w, ROW_H)
PP.Point(row, "TOPLEFT", parent, "TOPLEFT", PAD, cy)
local hov = row:CreateTexture(nil, "BACKGROUND")
hov:SetAllPoints()
hov:SetColorTexture(1, 1, 1, 0.07)
hov:SetAlpha(0)
local titleFs = MakeFont(row, 13, nil, 1, 1, 1, 0.9)
PP.Point(titleFs, "TOPLEFT", row, "TOPLEFT", 6, -5)
titleFs:SetJustifyH("LEFT"); titleFs:SetWordWrap(false)
titleFs:SetText(TitleOf(entry))
local subFs = MakeFont(row, 11, nil, 1, 1, 1, 0.4)
PP.Point(subFs, "TOPLEFT", titleFs, "BOTTOMLEFT", 0, -4)
PP.Point(subFs, "RIGHT", row, "RIGHT", -10, 0)
subFs:SetJustifyH("LEFT"); subFs:SetWordWrap(false)
subFs:SetText(EllesmereUI.L(entry.desc) or "")
-- Clickable only when the entry has a nav target (see MakeHeroCard); a
-- nav-less listing renders static with no hover or click.
if entry.nav and entry.nav.module then
row:SetScript("OnEnter", function()
hov:SetAlpha(1); titleFs:SetAlpha(1)
end)
row:SetScript("OnLeave", function()
hov:SetAlpha(0); titleFs:SetAlpha(0.9)
end)
row:SetScript("OnClick", function() GoTo(entry.nav) end)
else
row:EnableMouse(false)
end
return ROW_H
end
-- Tier 3: a plain bug-fix line (bullet + wrapping text, not clickable).
local function MakeFixLine(cy, text)
local dot = MakeFont(parent, 12, nil, EG.r, EG.g, EG.b, 0.55)
PP.Point(dot, "TOPLEFT", parent, "TOPLEFT", PAD + 2, cy - 1)
dot:SetText("\226\128\162") -- bullet glyph (ASCII-safe UTF-8 escape)
local fs = MakeFont(parent, 12, nil, 1, 1, 1, 0.5)
PP.Point(fs, "TOPLEFT", parent, "TOPLEFT", PAD + 18, cy)
PP.Point(fs, "RIGHT", parent, "RIGHT", -PAD, 0)
fs:SetJustifyH("LEFT"); fs:SetWordWrap(true)
fs:SetText(text or "")
local th = fs:GetStringHeight() or 14
return math.max(22, math.ceil(th) + 8)
end
local patches = EllesmereUI._WHATSNEW_PATCHES
if not patches or #patches == 0 then
local none = MakeFont(parent, 13, nil, 1, 1, 1, 0.5)
PP.Point(none, "TOPLEFT", parent, "TOPLEFT", PAD, y - 20)
none:SetText (EllesmereUI.L("No patch notes yet."))
return math.abs(y) + 60
end
-- Intro hint: centered, with 20px of breathing room above and below.
y = y - 20
local hint = MakeFont(parent, 14, nil, 1, 1, 1, 0.5)
PP.Point(hint, "TOP", parent, "TOP", 0, y)
hint:SetJustifyH("CENTER")
hint:SetText (EllesmereUI.L("Click any new feature to go directly to the setting"))
-- Top-left: "New Patch Reminder Dot" opt-out for the pulsing sidebar dot
-- that appears when the account's version increases (see the Patch Notes
-- button in EllesmereUI.lua). Small free-form checkbox on the hint line.
do
local BOX = 14
local row = CreateFrame("Button", nil, parent)
row:SetFrameLevel(parent:GetFrameLevel() + 2)
local box = CreateFrame("Frame", nil, row)
PP.Size(box, BOX, BOX)
PP.Point(box, "LEFT", row, "LEFT", 0, 0)
local boxBg = box:CreateTexture(nil, "BACKGROUND")
boxBg:SetAllPoints()
boxBg:SetColorTexture(0.075, 0.113, 0.141, 1)
local boxBrd = MakeBorder(box, 1, 1, 1, 0.25, PP)
local check = box:CreateTexture(nil, "ARTWORK")
PP.Point(check, "TOPLEFT", box, "TOPLEFT", 3, -3)
PP.Point(check, "BOTTOMRIGHT", box, "BOTTOMRIGHT", -3, 3)
check:SetColorTexture(EG.r, EG.g, EG.b, 1)
local lbl = MakeFont(row, 12, nil, 1, 1, 1, 0.5)
PP.Point(lbl, "LEFT", box, "RIGHT", 7, 0)
lbl:SetText(EllesmereUI.L("New Patch Reminder Dot"))
row:SetSize(BOX + 10 + (lbl:GetStringWidth() or 130), 20)
PP.Point(row, "TOPRIGHT", parent, "TOPRIGHT", -PAD, y + 2)
local function Paint()
local on = not (EllesmereUIDB and EllesmereUIDB.patchDotDisabled)
check:SetShown(on)
if on then
boxBrd:SetColor(EG.r, EG.g, EG.b, 0.85)
else
boxBrd:SetColor(1, 1, 1, 0.25)
end
end
Paint()
row:SetScript("OnClick", function()
if not EllesmereUIDB then EllesmereUIDB = {} end
EllesmereUIDB.patchDotDisabled = (not EllesmereUIDB.patchDotDisabled) and true or nil
Paint()
if EllesmereUI._UpdatePatchDot then EllesmereUI._UpdatePatchDot() end
end)
row:SetScript("OnEnter", function(self)
lbl:SetAlpha(0.85)
if EllesmereUI.ShowWidgetTooltip then
EllesmereUI.ShowWidgetTooltip(self, EllesmereUI.L("Show a pulsing dot on the Patch Notes button whenever EllesmereUI updates to a new version."))
end
end)
row:SetScript("OnLeave", function()
lbl:SetAlpha(0.5)
if EllesmereUI.HideWidgetTooltip then EllesmereUI.HideWidgetTooltip() end
end)
end
y = y - math.ceil(hint:GetStringHeight() or 14) - 20
-- Cap the page to the newest patches (max 10). Older entries may remain in
-- the data table but are not shown; trim them on ship to keep the file tidy.
local MAX_PATCHES = 10
local shown = math.min(#patches, MAX_PATCHES)
for pi = 1, shown do
local patch = patches[pi]
-- A "mini" patch is a bugfix-only release: it carries just a `fixes`
-- tier and renders in a lighter, more compact style so a small patch
-- does not take up as much room as a full feature release.
local isMini = patch.mini
-- Version header. Full patches: large 20px title + neutral divider.
-- Mini patches: compact 15px title with a green "MINI PATCH" tag and a
-- tighter divider.
if isMini then
local ver = MakeFont(parent, 15, nil, 1, 1, 1, 0.9)
PP.Point(ver, "TOPLEFT", parent, "TOPLEFT", PAD, y)
ver:SetText("EllesmereUI " .. (patch.version or ""))
local tag = MakeFont(parent, 10, nil, EG.r, EG.g, EG.b, 0.85)
PP.Point(tag, "LEFT", ver, "RIGHT", 10, -1)
tag:SetText("MINI PATCH")
local uline = parent:CreateTexture(nil, "ARTWORK")
uline:SetColorTexture(1, 1, 1, 0.10)
PP.Size(uline, totalW, 1)
PP.Point(uline, "TOPLEFT", parent, "TOPLEFT", PAD, y - 24)
if PP.DisablePixelSnap then PP.DisablePixelSnap(uline) end
y = y - 34
else
local ver = MakeFont(parent, 20, nil, 1, 1, 1, 0.95)
PP.Point(ver, "TOPLEFT", parent, "TOPLEFT", PAD, y)
ver:SetText("EllesmereUI " .. (patch.version or ""))
local uline = parent:CreateTexture(nil, "ARTWORK")
uline:SetColorTexture(1, 1, 1, 0.12)
PP.Size(uline, totalW, 1)
PP.Point(uline, "TOPLEFT", parent, "TOPLEFT", PAD, y - 32)
if PP.DisablePixelSnap then PP.DisablePixelSnap(uline) end
y = y - 48
end
-- Tier 1: hero cards, two per row. Heroes render in AUTHORED order (the
-- order they appear in the patch's `heroes` table) -- NOT module-sorted
-- like features/fixes -- so each patch can headline whatever matters most
-- first. Reorder the entries in _WHATSNEW_PATCHES to reorder the cards.
local heroes = patch.heroes or {}
if #heroes > 0 then
local cardW = math.floor((totalW - CARD_GAP) / 2)
local CARD_H = 96
local rows = math.ceil(#heroes / 2)
for i, hero in ipairs(heroes) do
local col = (i - 1) % 2
local rw = math.floor((i - 1) / 2)
local cx = PAD + col * (cardW + CARD_GAP)
local cy = y - rw * (CARD_H + CARD_GAP)
MakeHeroCard(cx, cy, cardW, CARD_H, hero)
end
local consumed = rows * CARD_H + (rows - 1) * CARD_GAP
y = y - consumed - 18
end
-- Tier 2: small listings.
local feats = SortByModule(patch.features or {})
if #feats > 0 then
local _, sh = W:SectionHeader(parent, "ADDITIONAL FEATURES", y); y = y - sh
y = y - 5 -- extra spacing below the divider
for _, f in ipairs(feats) do
local rh = MakeListing(y, totalW, f); y = y - rh
end
y = y - 6
end
-- Tier 3: bug-fix lines. Full patches label them under a "BUG FIXES"
-- header; a mini patch is entirely fixes, so the lines render directly
-- beneath the compact header with no redundant section label.
local fixes = SortByModule(patch.fixes or {})
if #fixes > 0 then
if not isMini then
local _, sh = W:SectionHeader(parent, "BUG FIXES", y); y = y - sh
y = y - 10 -- extra spacing below the divider
end
for _, fx in ipairs(fixes) do
local fh = MakeFixLine(y, ((fx.module and EllesmereUI.L(fx.module) .. ": ") or "") .. (EllesmereUI.L(fx.text) or "")); y = y - fh
end
end
if pi < shown then
local _, gap = W:Spacer(parent, y, 24); y = y - gap
end
end
return math.abs(y) + 20
end
-------------------------------------------------------------------------------
-- Patch-notes content for the What's New page (newest patch first). Each hero
-- and listing entry's `nav` deep-links to the setting it changed via
-- EllesmereUI:NavigateToElementSettings(module, page, section, preSelect, highlight).
-------------------------------------------------------------------------------
EllesmereUI._WHATSNEW_PATCHES = {
{
version = "8.5.7",
heroes = {
{
module = "Unit Frames",
title = "Boss Cast Bar Interrupt Tracking",
desc = "Boss cast bars now get the full interrupt toolkit: colors that shift as your kick comes off cooldown, a mid-cast ready tick and segment, a custom uninterruptible-cast color, a fill opacity slider, and an optional idle-hide toggle.",
nav = { module = "EllesmereUIUnitFrames", page = "Boss Frames", section = "CAST BAR", highlight = "Show Cast Bar" },
},
{
module = "PTR Nameplates",
title = "Debuff Filter Editor",
desc = "Choose exactly which debuffs and crowd control show on enemy nameplates: layer categories like Important, Crowd Control, Boss, and Dispellable By You, and exclude individual spells by ID. Replaces the old Show All Your Player Debuffs checkbox on the 12.1 client.",
nav = { module = "EllesmereUINameplates", page = "Display", section = "CORE POSITIONS", highlight = "Top" },
},
},
features = {
{
module = "Nameplates",
title = "Combine Spell Name and Target",
desc = "Merge cast text into one line",
nav = { module = "EllesmereUINameplates", page = "Display", section = "GENERAL TEXT", highlight = "Spell Name" },
},
{
module = "PTR Raid Frames",
title = "Grid Wrap for Tracked Auras",
desc = "Wrap icons into rows and cap how many show",
nav = { module = "EllesmereUIRaidFrames", page = "Buff Manager" },
},
{
module = "Raid Frames",
title = "Centered Party Growth",
desc = "Keep frames centered as the group grows",
nav = { module = "EllesmereUIRaidFrames", page = "Party", section = "FRAMES", highlight = "Frame Growth" },
},
},
fixes = {
{ module = "Nameplates", text = "Fixed a bug that could make it hard to click or target the correct enemy in overlapping packs." },
{ module = "Nameplates", text = "Aura icon spacing and class resource bar spacing sliders now go down to -5, letting icons and bars sit closer together or slightly overlap." },
{ module = "Nameplates", text = "Fixed the target arrows overlapping the raid marker when marking your current target; arrows now reposition the moment a marker is added or removed." },
{ module = "Unit Frames", text = "Boss frame power bars can now show a colored border with adjustable thickness, matching player, target, and focus." },
{ module = "Unit Frames", text = "Disabling Show Expand Button on the Blizzard-style player aura reskin no longer causes errors and lag in raid combat, and custom icon borders no longer revert to Blizzard's default on reload." },
{ module = "Cooldown Manager", text = "Hosting a buff that collides with a cooldown slot on a Cooldowns or Utility bar no longer throws an error on every refresh." },
{ module = "Cooldown Manager", text = "Toggling off a bar-wide custom color, border color, or threshold seconds value for a spell now restores that spell's own prior value instead of resetting it to default." },
{ module = "General", text = "Importing an exported profile during your very first login no longer risks the first-run setup silently overwriting the imported cooldown layout, positions, sizes, or custom colors." },
{ module = "General", text = "Added Traditional Chinese translations for option labels introduced in recent updates." },
{ module = "Chat", text = "Receiving a whisper while in a Mythic+ key or other restricted content no longer triggers error messages." },
{ module = "Quest Tracker", text = "The quest map pin icon no longer briefly flashes on tracked objectives when quest icons are turned off." },
{ module = "PTR Unit Frames & Nameplates", text = "Viewing a unit whose class is privacy-restricted no longer spams errors or causes stutter; affected frames now fall back to reaction coloring and default class icons." },
{ module = "PTR Unit Frames", text = "Right-click pinging over the Pet, Target of Target, and Focus Target frames now correctly marks the shown unit instead of falling through to a world ping." },
{ module = "PTR General", text = "Restored the colored dispel-type border and glow art on aura icons after a Blizzard interface change on newer 12.1 builds." },
{ module = "PTR General", text = "The Show Spell ID on Tooltip developer option now shows spell IDs on aura tooltips while in combat or restricted content." },
{ module = "PTR Nameplates", text = "Fixed the target-direction arrows causing errors on the newest 12.1 builds." },
{ module = "PTR Nameplates", text = "Debuff, buff, and crowd control icons no longer stop appearing during large Mythic+ or raid pulls." },
{ module = "PTR Raid Frames", text = "Enabling a buff tracker, adding a debuff tile, or first showing an aura display mid-combat now appears immediately instead of waiting until combat ends." },
{ module = "PTR Raid Frames", text = "The Buff Manager Enable Threshold and Text Color controls now actually recolor a buff's countdown text as it nears expiration." },
{ module = "PTR Raid Frames", text = "Spells can now be added to a custom Buff Manager filter by searching their name, instead of only by entering a numeric spell ID." },
{ module = "PTR Raid Frames", text = "The Edit Excluded Debuffs list under the Debuff Manager preview has been removed; built-in sated and always-hide debuffs are still filtered automatically." },
{ module = "PTR Cooldown Manager", text = "Tracking Bar decimal duration text no longer gets stuck on an old threshold when the update is briefly blocked; it now retries until it lands." },
},
},
{
version = "8.5.6",
mini = true,
fixes = {
{ module = "Action Bars", text = "Now appear correctly on a fresh installation." },
{ module = "Aura & Buff Reminders", text = "Fixed reminders appearing oversized when one was already on screen at login or /reload." },
{ module = "Cooldown Manager", text = "Now appears correctly on a fresh installation." },
{ module = "Quest Tracker", text = "Fixed Lua errors when opening the world map or hovering map pins during Mythic+ or raid combat." },
{ module = "General", text = "Fixed a wave of errors when reloading the UI during combat." },
{ module = "Click Casting", text = "Fixed right-click spell bindings reverting to the context menu after login or /reload." },
},
},
{
version = "8.5.5",
features = {
{
module = "Cooldown Manager",
title = "Row Growth Direction",
desc = "Choose which row stays put when a second row appears",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars", section = "BAR LAYOUT", highlight = "Number of Rows",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("cooldowns") end
end },
},
{
module = "PTR Raid Frames",
title = "Dispel-Type Debuff Rings",
desc = "Colored dispel-type rings on debuff icons, thickness adjustable",
},
},
fixes = {
{ module = "Action Bars & Cooldown Manager", text = "The Caps Lock keybind now shows as the shorter Caps on action buttons and ability icons instead of the full CAPSLOCK, matching the abbreviations for other long key names." },
{ module = "Action Bars", text = "Fixed holding a keybind on a Druid or Rogue form bar casting once and then stalling into auto-attack instead of repeat-casting, which also fixes Single Button Assistant and Assisted Combat on those bars." },
{ module = "Action Bars", text = "Fixed the main action bar showing one ability but casting a different one when a Druid or Rogue manually paged to another bar while in a form or stance." },
{ module = "Blizzard Skin", text = "Fixed the Achievement window's objectives progress text clipping when a taller custom font was set." },
{ module = "Blizzard Skin", text = "Fixed Set Note, Set Officer Note, Set Rank, and Whisper on the guild roster throwing an action blocked error while the Guild and Communities skin was on." },
{ module = "Blizzard Skin", text = "Fixed the quest greeting paragraph shown when an NPC offers multiple quests not picking up the skin's text color." },
{ module = "Cooldown Manager", text = "Lowered the Base Row Icons slider maximum from 50 to 15, since a base row that wide never worked well with the two-row split layout." },
{ module = "Cooldown Manager", text = "Reverse Swipe now also applies to Active State overlays, matching the direction used on the icon's normal cooldown swipe." },
{ module = "Cooldown Manager", text = "Fixed per-spell settings and custom icons for split-identity buffs, like the Evoker's Starweaver, sometimes applying to the wrong form or a slot vanishing once Mythic+ combat starts." },
{ module = "Cooldown Manager", text = "Fixed a custom spell icon occasionally staying visible after being turned off if the change happened right as bars rebuilt during login." },
{ module = "Data Bars", text = "Fixed Bar Opacity not working when a custom Bar Texture was set on the Modern background style." },
{ module = "Quality of Life", text = "Fixed the Movement Alert Show Decimal toggle not turning decimals off for profiles carrying an older saved value, so it now works immediately and stays off after a reload." },
{ module = "Quality of Life", text = "The Secondary Stats overlay now sizes its Unlock Mode outline to match the actual text, so it lines up whether or not tertiary stats are shown and at any UI scale." },
{ module = "Raid Frames", text = "The Targeted Spells icon on raid frames now sorts together with the other aura icons instead of sitting underneath the name and health text." },
{ module = "Unit Frames", text = "Fixed toggling Blizzard's Edit Mode spamming secret value errors in instances and sometimes leaving party frames broken for the rest of the session." },
{ module = "PTR Blizzard Skin", text = "Fixed a 12.1 forbidden-object error from the Window Skins tooltip skin when a spell tooltip was re-shown by Blizzard's own secure code." },
{ module = "PTR Cooldown Manager", text = "Fixed the Ebon Might active-state glow and swipe on its Cooldown Manager icon for Augmentation Evokers on the 12.1 client, where the aura's data is hidden from addons." },
{ module = "PTR Raid Frames", text = "Each Debuff Manager filter can now use its own icon size, independent of the base debuff icons." },
{ module = "PTR Raid Frames", text = "Fixed the Buff Manager's live preview so center-growth icon groups line up the same way they render on your raid frames." },
{ module = "PTR Raid Frames", text = "Spells removed from a filter's curated list no longer stick around as an undeletable leftover entry in the Filter Editor." },
{ module = "PTR Resource Bars", text = "Fixed the Ebon Might power bar so it fills and counts down correctly for Augmentation Evokers on the 12.1 client, where it previously stayed empty because the buff is hidden from addons." },
{ module = "PTR Unit Frames", text = "Fixed a 12.1 error that could hit Evoker, Monk, and Demon Hunter players from Blizzard's own hidden power bars still reacting to events behind the hidden default player frame." },
{ module = "PTR Unit Frames", text = "Fixed the Dispel Type Borders toggle on unit frames so it shows your chosen dispel colors instead of default ones on the 12.1 client." },
},
},
{
version = "8.5.3",
heroes = {
{
module = "Raid Frames",
title = "PTR 12.1 Advanced Aura Filtering",
desc = "Midnight's 12.1 client reworks how raid frame auras are filtered, and EllesmereUI is ready: the Buff and Debuff Managers are rebuilt to let you choose exactly which buffs and debuffs your frames show. Already testable on the 12.1 PTR client, with more coming before launch.",
},
{
module = "Quality of Life",
title = "Movement Alerts",
desc = "Watch your mobility cooldowns count down on screen as text, an icon, or a bar, enabled per class with a preset spell list covering every spec plus your own added spells.",
nav = { module = "EllesmereUIQoL", page = "Movement Alerts" },
},
{
module = "Chat",
title = "Tabs & Sidebar Customization",
desc = "Chat tabs get their own options page for layout, typography, and per-tab colors, and the whole panel can now wear a styled border. The old Extend Background Behind Tabs toggle becomes Tabs Inside Chat Panel and applies without a reload.",
nav = { module = "EllesmereUIChat", page = "Tabs", section = "LAYOUT", highlight = "Tabs Inside Chat Panel" },
},
},
features = {
{
module = "Action Bars",
title = "Bar Background Rework",
desc = "Spacing, color, opacity, and a border, tiling across bars",
nav = { module = "EllesmereUIActionBars", page = "Bar Display", section = "BAR BACKGROUND", highlight = "Enable Bar Background" },
},
{
module = "Aura Reminders & Cooldown Manager",
title = "Glow Class Color",
desc = "Reminder glows and CDM Pandemic Glow can now follow your class color",
nav = { module = "EllesmereUIAuraBuffReminders", page = "Auras, Buffs & Consumables", section = "DISPLAY", highlight = "Glow Type" },
},
{
module = "Blizzard Windows",
title = "Merchant List View",
desc = "Show the vendor window as a scrollable list with adjustable row height",
nav = { module = "EllesmereUIBlizzardSkin", page = "Blizzard Window Skins" },
},
{
module = "Chat",
title = "Guild Sidebar Icon",
desc = "Optional Guild icon in the sidebar with online count, opens on click",
nav = { module = "EllesmereUIChat", page = "Sidebar", section = "SIDEBAR", highlight = "Sidebar Icons" },
},
{
module = "Cooldown Manager",
title = "Equipment Slot Tracking",
desc = "Track on-use effects from any of 19 equipped gear slots",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("cooldowns") end
end },
},
{
module = "Cooldown Manager",
title = "Potion Presets Match Your Bags",
desc = "Presets show the exact pot variant you carry and swap when one runs out",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars", section = "EXTRAS", highlight = "Swap Light/Reckless Pots When Missing",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("cooldowns") end
end },
},
{
module = "Damage Meters",
title = "Combat Timer Out of Combat",
desc = "Keep the Combat Timer visible after a fight, now placeable in Unlock Mode",
nav = { module = "EllesmereUIDamageMeters", page = "Damage Meters", section = "STANDALONE COMBAT TIMER", highlight = "Show Out of Combat" },
},
{
module = "Quality of Life",
title = "Target Distance Text",
desc = "Movable yard readout for your target, off by default",
nav = { module = "EllesmereUIQoL", page = "Quality of Life", section = "EXTRAS", highlight = "Target Distance Text" },
},
{
module = "Raid Frames",
title = "Dashed & Sweep Border Indicators",
desc = "Buff Manager border indicators gain animated Dashed and Sweep styles",
nav = { module = "EllesmereUIRaidFrames", page = "Buff Manager", section = "DISPLAY", highlight = "Border Style" },
},
{
module = "Raid Frames",
title = "Missing Number Health Text",
desc = "New Health Text mode shows missing health, hidden at full health",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "TEXT DISPLAY", highlight = "Health Text" },
},
{
module = "Raid Frames",
title = "Per-Type Dispel Opacity",
desc = "Each dispel color gets its own opacity; set to 0 to opt a type out",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "DISPELS", highlight = "Dispel Colors" },
},
{
module = "Unit Frames",
title = "Aura Border Style Picker",
desc = "Aura icon borders can now use the full border style texture picker",
nav = { module = "EllesmereUIUnitFrames", page = "Blizzard Aura Frames", section = "PLAYER BUFFS & DEBUFFS", highlight = "Border Style" },
},
},
fixes = {
{ module = "Chat", text = "Fixed chat tabs occasionally flashing back to Blizzard's default unstyled color instead of staying styled." },
{ module = "Chat", text = "Idle fade can now be turned off entirely with a new Enable Idle Fade toggle; Fade Delay and Fade Strength gray out while it is off." },
{ module = "Chat", text = "Added a color and opacity swatch for the chat frame's inner border and divider lines, next to Hide Borders." },
{ module = "Cooldown Manager", text = "Demonic Art and Diabolic Ritual, which share one spell ID, can now each be assigned to a bar, hosted on a Cooldown or Utility bar, and dragged to reorder individually instead of collapsing into one fixed slot." },
{ module = "Data Bars", text = "Gold suffixes, the clock tooltip's date and reset countdowns, and the unconfigured Currency block's text now use your client's language instead of hardcoded English." },
{ module = "Data Bars", text = "Renamed or deleted characters can be dropped from the Gold tooltip's per-character list with Ctrl+Alt+Left-Click." },
{ module = "Data Bars", text = "Clickable Gold and Social or Guild tooltip rows now get the same full-row hover highlight as the Mythic+ teleport rows." },
{ module = "Data Bars", text = "New Coin Icons toggle on the Gold block renders amounts with Blizzard's coin textures instead of letter suffixes." },
{ module = "General", text = "Updated French, Simplified and Traditional Chinese, German, and Korean translations." },
{ module = "Quest Tracker", text = "Fixed a taint error from clicking a tracker section title to collapse it, and the tracker's top padding jumping or flickering during combat." },
{ module = "Raid Frames", text = "Name display now recognizes custom nicknames set with the RaidGaming Aliases addon, alongside the existing nickname sources." },
{ module = "Resource Bars", text = "Fixed the Custom Colored fill's transparency fighting the separate Fill Opacity control on health, power, class resource, and cast bar fills, and the empty-slot backdrop and pip spacing not matching a translucent fill on pip resources like Combo Points and Runes." },
{ module = "Spec Overrides", text = "New Promote Override to Profile tool bakes an override's settings into your profile, then clears all overrides." },
{ module = "Spec Overrides", text = "Data Bars settings captured in an override group now repaint the moment the override applies, instead of waiting for another refresh to poke them." },
{ module = "Unit Frames", text = "New Show Expand Button toggle can hide Blizzard's buff collapse and expand button and keep every buff visible instead." },
{ module = "Blizzard Windows", text = "Fixed guild rank reordering being blocked and a cascade of errors on guild roster refresh while the Guild window skin was enabled." },
{ module = "General", text = "\"In Party\" visibility now means party only across every module's visibility settings; check \"In Raid Group\" as well if something should also show in raids." },
{ module = "Nameplates", text = "Fixed the name raid marker erroring and landing in the wrong spot beside names Midnight protects; it now sits cleanly at the name's edge." },
{ module = "Profiles & Presets", text = "Export and import can now carry your Blizzard window and tooltip skins." },
{ module = "Quality of Life", text = "Fixed Target Distance Text triggering blocked-action errors on friendly targets in combat; the readout now pauses for friendlies in restricted situations instead." },
{ module = "Quality of Life", text = "The Keys, Logs & Brez tab merged into the bottom of the main Quality of Life page; the Battle Res and Bloodlust settings live there now." },
{ module = "Raid Frames", text = "Fixed an error that could spam when a dispellable debuff appeared while the dispel overlay was enabled." },
{ module = "Raid Frames", text = "Fixed party power bars freezing mid-combat when the Power Bar section was unsynced with power off for raid but on for party." },
{ module = "Resource Bars", text = "Fixed Anchor to Cursor turning itself off on reload; the bar now keeps following the cursor across sessions." },
},
},
{
version = "8.5.2",
heroes = {
{
module = "Unit Frames",
title = "External Defensives Frame",
desc = "External defensives cast on you, like Pain Suppression or Ironbark, now show in a new movable icon row you can size, color, and position.",
nav = { module = "EllesmereUIUnitFrames", page = "Blizzard Aura Frames", section = "EXTERNAL DEFENSIVES FRAME", highlight = "Enable External Defensives Frame" },
},
{
module = "Data Bars",
title = "New Blocks, Tooltips, and Textures",
desc = "A big Data Bars pass: new Great Vault and audio Volume blocks, clickable Social and Guild tooltips, a richer Travel tooltip, per-icon coloring, Modern style bar textures, and Micro Menu buttons that keep working in combat.",
nav = { module = "EllesmereUIDataBars", page = "DataBars" },
},
},
features = {
{
module = "Blizzard Windows",
title = "Movable Tooltip Position",
desc = "Drag the game tooltip anywhere in Unlock Mode",
nav = { module = "EllesmereUIBlizzardSkin", page = "Tooltips, Menus & Popups", section = "BLIZZARD TOOLTIP", highlight = "" },
},
{
module = "Blizzard Windows",
title = "Show Unit Target on Tooltip",
desc = "Who the hovered unit is targeting, in green when it's you",
nav = { module = "EllesmereUIBlizzardSkin", page = "Tooltips, Menus & Popups", section = "BLIZZARD TOOLTIP", highlight = "Reskin Tooltip" },
},
{
module = "Blizzard Windows",
title = "Resurrect Glow and Tooltip Growth",
desc = "Pulsing glow on resurrect Accept buttons, plus a tooltip Growth Direction",
nav = { module = "EllesmereUIBlizzardSkin", page = "Tooltips, Menus & Popups", section = "BLIZZARD POPUPS & GAME MENU", highlight = "Resurrect Accept Glow" },
},
{
module = "Blizzard Windows",
title = "Style Popups, Tooltips, and Menus",
desc = "Border styles and color modes for popups, tooltips, and the Game Menu",
nav = { module = "EllesmereUIBlizzardSkin", page = "Tooltips, Menus & Popups", section = "BLIZZARD POPUPS & GAME MENU", highlight = "Border Style" },
},
{
module = "Cooldown Manager",
title = "Drag to Reorder Custom Bars",
desc = "Reorder bars in the selector, plus higher size and threshold caps",
nav = { module = "EllesmereUICooldownManager", page = "Tracking Bars", section = "BAR LAYOUT", highlight = "Height" },
},
{
module = "Cooldown Manager",
title = "Multiple Stack Color Thresholds",
desc = "Color a Tracking Bar at up to five stack counts, plus tick mark colors",
nav = { module = "EllesmereUICooldownManager", page = "Tracking Bars", section = "EXTRAS", highlight = "Enable Stack Threshold" },
},
{
module = "Cooldown Manager",
title = "Only Numbers, Custom Icons, and Strata",
desc = "Number-only buff bars, custom spell icons, and wider Bar Strata",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars" },
},
{
module = "Damage Meters",
title = "Meter Window Borders",
desc = "Border style, size, and color for the window, plus a header divider",
nav = { module = "EllesmereUIDamageMeters", page = "Damage Meters", section = "DISPLAY", highlight = "Border Style" },
},
{
module = "Damage Meters",
title = "Spell History Fade-Out",
desc = "Icons fade after a set time, pausing during combat",
nav = { module = "EllesmereUIDamageMeters", page = "Spell History", section = "ICON HISTORY", highlight = "Fade-Out Time" },
},
{
module = "Nameplates",
title = "Debuffs + CC Slot",
desc = "Show crowd control icons alongside debuffs in one nameplate slot",
nav = { module = "EllesmereUINameplates", page = "Display", section = "CORE POSITIONS", highlight = "Top" },
},
{
module = "Nameplates",
title = "Distance to Target Text",
desc = "Show an approximate range bracket like 15+ on your target's nameplate",
nav = { module = "EllesmereUINameplates", page = "General", section = "TARGET AND FOCUS EFFECTS", highlight = "Distance to Target Text" },
},
{
module = "QoL",
title = "More Unlock Mode Movers",
desc = "Move the top-center event text and the alert toast banner",
nav = { module = "EllesmereUIQoL", page = "Shifter", section = "BLIZZARD TOP BAR EVENT TEXT", highlight = "Move Top Bar Event Text in Unlock Mode" },
},
{
module = "Raid Frames",
title = "Extend Health Bar Behind Power",
desc = "Health fills the frame behind the power bar, plus higher aura size caps",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "POWER BAR", highlight = "Power Height" },
},
{
module = "Unit & Resource Bars",
title = "Translucent Bar Fills",
desc = "Make bar fills translucent so the game world shows through",
nav = { module = "EllesmereUIResourceBars", page = "Cast Bar", section = "DISPLAY", highlight = "Fill Opacity" },
},
},
fixes = {
{ module = "Action Bars", text = "Crafted rank icons and button icon states now update instantly when a slot's contents change, without needing a hover first." },
{ module = "Action Bars", text = "The Icon Size slider now shows an explanatory tooltip when disabled by Blizzard Style bars or size matching, instead of showing nothing." },
{ module = "Action Bars", text = "Size matching an action bar while using Blizzard Style no longer silently changes your saved icon sizes; new matches are refused with an explanation instead." },
{ module = "Action Bars & Cooldown Manager", text = "Fixed the Assisted Combat highlight not lighting up action bar and cooldown bar buttons until you moused over them or reloaded, including spells shown in an override form." },
{ module = "Blizzard Windows", text = "Fixed setting a guild or officer note, or changing a member's rank, throwing an error while the Guild and Communities skin was enabled." },
{ module = "Chat", text = "Chat backgrounds can now use a texture instead of a flat color." },
{ module = "Cooldown Manager", text = "Fixed being unable to track both halves of a collided buff pair, such as Demonic Art and Diabolic Ritual, on one custom buff bar." },
{ module = "Cooldown Manager", text = "Fixed a saved Cooldown or Utility bar icon order sometimes reverting to the default on reload." },
{ module = "Cooldown Manager", text = "Fixed Stack Based Tracking Bars sometimes not updating their fill and stack count, including in fallback tracking mode." },
{ module = "Cooldown Manager", text = "The Tracking Bar spell picker now groups buffs under their own Buffs header, with the Missing Spells? shortcut moved there and always shown." },
{ module = "Cooldown Manager", text = "Imported profiles now keep your current spell layouts for any specs the import string does not carry, instead of leaving those specs empty." },
{ module = "General", text = "Options pages across the suite now hide settings that do not apply instead of graying them out." },
{ module = "General", text = "Fixed pixel sliders sometimes unable to select 1 pixel on scaled UI setups, and reduced-opacity borders briefly flashing to full opacity when reapplied." },
{ module = "General", text = "Profile exporting is now a single flow: choose your addons and use the new Include menu for Overrides, Unlock Mode Layout, and Global Settings; importing gained a matching Include Overrides option." },
{ module = "General", text = "Fixed broken override data in imported profiles erasing individual settings on some specs, including an error when opening the options on a new character." },
{ module = "General", text = "Fixed anchored elements, such as chained Damage Meters windows, snapping out of position after importing a profile and staying wrong on every login." },
{ module = "General", text = "Updated German, French, and Traditional Chinese translations." },
{ module = "Minimap", text = "Fixed a possible protected-frame error when hover or conditional visibility tried to show or hide the minimap in combat." },
{ module = "Mythic Timer", text = "Fixed the Unlock Mode drag anchor drifting from the timer's real position and size, and the timer now shows placeholder data while Unlock Mode is open." },
{ module = "Nameplates", text = "Fixed neutral mobs staying on the enemy in-combat color instead of showing the Tank Has Aggro color while you hold aggro on them." },
{ module = "QoL", text = "Auto Open Containers no longer strands slow-opening or bags-full containers in a stuck, unopenable state." },
{ module = "QoL", text = "Macro Factory now shows spec macros in your client's language on all clients, fixes blank combo-macro icons, and limits the Devourer macros to the Devourer spec." },
{ module = "Quest Tracker", text = "Auto Accept Quests can now be skipped by holding Shift while talking to an NPC, matching Auto Turn In." },
{ module = "Quest Tracker", text = "Fixed the tracker's top padding staying wide after combat, auto-hide failing or erroring on boss pulls and arenas, and a taint bug where font or focus changes could block world map clicks in combat." },
{ module = "Resource Bars", text = "Fixed the Sweeping Strikes charge tracker draining charges during Bladestorm, and it now resyncs against the Cooldown Manager's buff widget." },
{ module = "Resource Bars", text = "Fixed clicking the class resource count in Simple mode doing nothing, a thin gap beside the cast bar icon, and Expand Power Bar if No Resource conflicting with height matching." },
{ module = "Unit Frames", text = "Power bars attached to the health bar can now show a divider border along the seam, with an adjustable size." },
{ module = "Unit Frames", text = "Frame text can now show a unit's level, alone or combined with its name." },
{ module = "Unit Frames", text = "Added a Combine Spell Name and Target option for Target and Focus cast bars, and raised most on-frame text size slider caps to 100." },
},
},
{
version = "8.5.1",
heroes = {
{
module = "Cooldown Manager",
title = "Stack Based Tracking Bars",
desc = "Buff Tracking Bars can now fill by stack count instead of remaining time: turn on Stack Based Bar, set your Max Stacks, and the bar fills as your stacks build.",
nav = { module = "EllesmereUICooldownManager", page = "Tracking Bars", section = "EXTRAS", highlight = "Stack Based Bar" },
},
{
module = "Raid Frames",
title = "Show Your Buffs on All Specs",
desc = "Your own tracked buffs can now show on every spec of your class: flip one toggle in Simple Setup, or use the new cog on Own Only to opt in a single Custom Buff Display indicator.",
nav = { module = "EllesmereUIRaidFrames", page = "Buff Manager", section = "BUFF DISPLAY", highlight = "Show Own on All Specs" },
},
},
features = {
{
module = "Cooldown Manager",
title = "CD Tracking Bar Charge Lines",
desc = "Split multi-charge bars into per-charge segments with divider lines",
nav = { module = "EllesmereUICooldownManager", page = "Tracking Bars", section = "BAR LAYOUT", highlight = "Charge Hash Lines" },
},
{
module = "Unit Frames",
title = "More Combat Indicator Positions",
desc = "Anchor to any health bar corner, plus a wider offset range",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "EXTRAS", highlight = "Combat Indicator",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("player") end
end },
},
{
module = "Unit Frames",
title = "Independent Leader Indicator",
desc = "Player and Target set separately, with one-click sync",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "EXTRAS", highlight = "Leader Indicator",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("player") end
end },
},
},
fixes = {
{ module = "Action Bars", text = "Macro names and profession rank icons now update immediately after moving or swapping macros or switching loadouts." },
{ module = "Blizzard Windows", text = "Fixed the character stats scrollbar getting stuck after collapsing a section, and hidden stat categories reappearing after a reload." },
{ module = "Blizzard Windows", text = "Item quality, enchant, and socket borders no longer cover crafting order and catalyst slot highlights on the character sheet." },
{ module = "Cooldown Manager", text = "Fixed keybind text missing or wrong for abilities and items cast from a macro." },
{ module = "Cooldown Manager", text = "Fixed textured icon borders showing at different thicknesses on icons in the same bar." },
{ module = "Cooldown Manager", text = "Fixed charge and stack count text offsets not scaling with icon size." },
{ module = "Cooldown Manager", text = "Fixed custom colors being discarded when using Apply to Bar on an Active State color row." },
{ module = "Cooldown Manager", text = "Fixed Diabolist buffs that share a spell ID collapsing into one icon and sharing settings." },
{ module = "Cooldown Manager", text = "Raised the Tracking Bars Max Stacks slider cap from 50 to 100." },
{ module = "Cooldown Manager", text = "Fixed charge hash lines and stack tick marks not appearing on the Tracking Bars preview until settings were edited again." },
{ module = "Cooldown Manager", text = "Fixed stack tick marks never showing unless the Stack Threshold color was also enabled; they now only require Max Stacks." },
{ module = "General", text = "Spacing sliders across the whole suite now show and step in real screen pixels, so 1 always equals exactly one pixel on your monitor at any UI scale; saved layouts are unchanged." },
{ module = "General", text = "Fixed a rare rounding issue that could shave one pixel off some element sizes at certain UI scales." },
{ module = "General", text = "Fixed the French translation failing to load entirely, with all text falling back to English." },
{ module = "General", text = "Updated Korean, French, Simplified Chinese, and Traditional Chinese translations." },
{ module = "QoL", text = "The auto repair chat message is now translatable, with a new Coin Icons option to show the cost with coin icons instead of text." },
{ module = "Quest Tracker", text = "Removed the large empty gap at the top of the tracker and stopped it briefly dropping down when clicking a quest." },
{ module = "Raid Frames", text = "The Buff Manager's Editing Spec dropdown now opens on your class's tracked spec (or Holy Paladin) instead of blank when playing an untracked spec." },
{ module = "Resource Bars", text = "Fixed the Sweeping Strikes bar dropping to zero mid-combat and in Mythic+." },
{ module = "Resource Bars", text = "Restored Unlock Mode movers for bars still using an old Anchor To setting, keeping the bar's position." },
{ module = "Resource Bars", text = "Resource text no longer flips between value and percent when combat starts; a Show % option picks the display." },
},
},
{
version = "8.4.9",
heroes = {
{
module = "Data Bars",
title = "Smarter Tooltips",
desc = "New Mythic Plus teleports in the Travel tooltip can now be left-clicked to cast, and a new opt-in Character button tooltip shows your item level, primary stat, and Crit, Haste, Mastery, and Versatility.",
nav = { module = "EllesmereUIDataBars", page = "DataBars" },
},
},
features = {
{
module = "Blizz UI Enhanced",
title = "Disable Window Skins Switch",
desc = "Turn off all window skinning with one per profile switch",
nav = { module = "EllesmereUIBlizzardSkin", page = "Blizzard Window Skins" },
},
{
module = "Cooldown Manager",
title = "Tracking Bar Strata",
desc = "Choose the screen layer Tracking Bars sit on",
nav = { module = "EllesmereUICooldownManager", page = "Tracking Bars", section = "BAR LAYOUT", highlight = "Bar Strata" },
},
{
module = "Damage Meters",
title = "Unlock Mode Support",
desc = "Windows now move, anchor, and size match through Unlock Mode",
nav = { module = "EllesmereUIDamageMeters", page = "Damage Meters" },
},
{
module = "Resource Bars",
title = "Hide Bars per Druid Form",
desc = "Hide the whole Health, Power, or Class Resource bar per form",
nav = { module = "EllesmereUIResourceBars", page = "Class, Power and Health Bars", section = "HEALTH BAR", highlight = "Show Health Bar" },
},
},
fixes = {
{ module = "Character Sheet", text = "Fixed the diminishing returns breakdown no longer showing for Critical Strike after a Blizzard internal stat rename." },
{ module = "Chat", text = "Fixed Up and Down arrow message history recall breaking protected commands like /ping during Mythic Plus keys and boss encounters." },
{ module = "Cooldown Manager", text = "Fixed untouched spells on the base bars being left out of profile exports and then hidden for anyone importing that profile." },
{ module = "Data Bars", text = "On-cooldown Hearthstone and teleport rows now dim to gray, with the remaining cooldown shown in the tooltip instead of under the icon." },
{ module = "General", text = "Fixed the settings search box and per-spec overrides icon appearing on pages where they do not apply." },
{ module = "General", text = "Updated koKR, zhTW, and deDE translations across several option pages." },
{ module = "Mail", text = "Fixed auction house invoice and crafting order mail text showing unreadable dark brown instead of themed white." },
{ module = "Nameplates", text = "Renamed Open World Basic Coloring to Full Coloring M+ Only; when enabled, full enemy type colors now show only in 5-man dungeons." },
{ module = "Profiles & Presets", text = "Fixed profile sync (mirror groups) overwriting per-profile window positions and settings owned by a spec or conditional override." },
{ module = "Profiles & Presets", text = "Fixed unchecking Include Layout on profile export or import still letting override-group layout layers overwrite the recipient's own layouts." },
{ module = "Profiles & Presets", text = "Fixed importing a profile while viewing an override group's layout leaking that group's positions into the imported profile." },
{ module = "Profiles & Presets", text = "Profiles now include their UI scale and users will be prompted during import if their UI scale doesn't match." },
{ module = "Profiles & Presets", text = "Removed the extra Cooldown Manager spec-assignment popup during profile import; spells now import directly before the reload." },
{ module = "Quest Tracker", text = "Fixed world quest map pin errors and quest icons briefly flashing visible while Show Quest Icons is turned off." },
{ module = "Raid Frames", text = "Fixed the raid frame container staying at its previous spec's or profile's position until manually moved." },
{ module = "Raid Frames", text = "Real Preview now shows your active spec's true effective override settings, with a gold marker on the Preview Mode control when an override is being previewed." },
{ module = "Raid Frames", text = "Friendly Boss Frames now show their debuff, defensive, and Buff Manager indicator icons, which previously never appeared." },
{ module = "Resource Bars", text = "Fixed resource percent text and class resource pips failing to update during Mythic Plus combat." },
{ module = "Resource Bars", text = "Fixed leftover highlight overlays sometimes staying visible on pips after a combat-hidden value became readable again." },
{ module = "Resource Bars", text = "Fixed a hidden bar briefly reappearing when its maximum value changed mid-fight, such as from a talent swap." },
{ module = "Resource Bars", text = "Fixed the Sweeping Strikes charge indicator drifting out of sync with your real charges." },
{ module = "Spec Overrides", text = "Fixed another case of width and height matched bars reverting to a stale size, this time shared across every spec in the group." },
{ module = "Spec Overrides", text = "Fixed cooldown and action bars created after an override layout group already existed ignoring the group's saved layout." },
{ module = "Spec Overrides", text = "Fixed adding a spec to an override group copying a stale matched bar width from another member onto the new spec." },
{ module = "Spec Overrides", text = "Fixed a remaining case where opening Unlock Mode while editing an override group could corrupt shared defaults like Show Power Bar and Resource Text." },
},
},
{
version = "8.4.8",
heroes = {
{
module = "Cooldown Manager",
title = "Bar Icon Overflow",
desc = "Cap how many icons a Cooldown or Utility bar shows with the new Max Icons slider. Extra icons overflow onto another bar of your choice, keeping your main rotation row clean.",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars", section = "BAR LAYOUT", highlight = "Max Icons (0 = Off)",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("cooldowns") end
end },
},
{
module = "Spec Overrides",
title = "Stability Hotfixes",
desc = "A thorough pass at hardening the override system: override values can no longer corrupt your shared defaults or bleed onto specs outside their group, and settings controlled by an applied Conditional Override now show an Override overlay.",
nav = { module = "_EUIProfiles", page = "Spec Overrides" },
},
},
features = {
{
module = "Nameplates",
title = "Non-Target Opacity",
desc = "Fade every enemy nameplate except your target and focus",
nav = { module = "EllesmereUINameplates", page = "General", section = "EXTRAS", highlight = "Non-Target Opacity" },
},
{
module = "Profiles & Presets",
title = "Import UI Scale Control",
desc = "Choose whether an imported profile applies its UI scale",
nav = { module = "_EUIProfiles", page = "Profiles" },
},
{
module = "Profiles & Presets",
title = "Export Without Global Look",
desc = "Per-addon exports can leave fonts and colors out",
nav = { module = "_EUIProfiles", page = "Profiles" },
},
{
module = "Raid Frames",
title = "Extra Frames, Up to 20",
desc = "Up to 20 duplicate frames with grid wrap controls",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "EXTRA FRAMES", highlight = "Position" },
},
{
module = "Raid Frames",
title = "Icons Ignore Power Bar",
desc = "Align icons and text as if no power bar existed",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "POWER BAR", highlight = "Power Height" },
},
{
module = "Unit Frames",
title = "Custom Name > Target Separator",
desc = "Type your own separator and color it",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "HEALTH BAR", highlight = "Left Text",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("player") end
end },
},
{
module = "Unit Frames",
title = "Only Dispellable by You",
desc = "Show the dispel overlay only for debuffs you can dispel",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "BUFFS AND DEBUFFS", highlight = "Dispel Overlay",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("player") end
end },
},
},
fixes = {
{ module = "Action Bars", text = "Fixed icons with Desaturate on Cooldown or Alpha when on CD returning to full color too early for charge spells and items, and staying dimmed after a charge regenerated." },
{ module = "Action Bars", text = "Fixed the Show Item Rank icon not updating right away when a different rank item replaces the item in an action bar slot." },
{ module = "Bags", text = "OneBag Sort now reorganizes items in the reagent bag along with your other bags." },
{ module = "Bags", text = "Depositing into One or All Warband Bank views now stacks onto matching items in any warband tab instead of only the first tab with an empty slot." },
{ module = "Bags", text = "Rapidly transferring items no longer causes clicks to fall through onto your action bars underneath." },
{ module = "Bags", text = "Right-clicking the Miscellaneous category and choosing Rename now actually renames it." },
{ module = "Character Sheet", text = "Secondary Stats now say Critical Strike instead of Crit, matching Blizzard's naming." },
{ module = "Character Sheet", text = "The gem socket panel now reliably closes after socketing, instead of occasionally staying open and blocking clicks." },
{ module = "Cooldown Manager", text = "The Pixel Glow and Button Glow CD Ready effects on trinkets, racials, potions, and custom spells now correctly turn off while the ability is on cooldown." },
{ module = "Cooldown Manager", text = "Buff bar countdown timers now round seconds up to match Blizzard's own aura timers instead of reading one second low." },
{ module = "Cooldown Manager", text = "Bars no longer disappear after entering or leaving an arena or battleground." },
{ module = "Cooldown Manager", text = "Trinket icons no longer disappear while browsing a crafting order vendor." },
{ module = "Cooldown Manager", text = "Buff icons shown for configuration no longer stay visible on screen after closing the options window." },
{ module = "General", text = "The module on/off icon in the sidebar stays dimmed for disabled modules instead of brightening on mouseover." },