-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEUI__General_Options.lua
More file actions
7142 lines (6612 loc) · 384 KB
/
Copy pathEUI__General_Options.lua
File metadata and controls
7142 lines (6612 loc) · 384 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.4.7",
heroes = {
{
title = "Data Bars",
desc = "A brand new module for building your own info bars. Add widgets like the clock, FPS, gold, durability, XP/Rep bars, spec, professions, travel cooldowns, currencies and the micro menu. Create as many bars as you want, drag blocks into any order, and place them anywhere on screen.",
nav = { module = "EllesmereUIDataBars", page = "DataBars" },
},
{
module = "Cooldown Manager",
title = "Cooldown Tracking Bars",
desc = "Tracking Bars can now follow a spell's cooldown, not just a buff. Pick a spell from the new Cooldowns list in a bar's spell picker and the bar drains as the cooldown ticks, showing remaining time and a charge count that stay accurate through cooldown reduction and resets.",
nav = { module = "EllesmereUICooldownManager", page = "Tracking Bars" },
},
},
features = {
{
module = "Cooldown Manager",
title = "Smooth Bars",
desc = "Toggle fill easing on or off for buff and cooldown bars",
nav = { module = "EllesmereUICooldownManager", page = "Tracking Bars", section = "BAR LAYOUT", highlight = "Smooth Bars" },
},
{
module = "Inspect Sheet",
title = "Hide Item Text",
desc = "An eyeball button hides item level, upgrade and enchant text",
nav = { module = "EllesmereUIBlizzardSkin", page = "Blizzard Window Skins", section = "INSPECT SHEET" },
},
{
module = "Merchant",
title = "Item Level",
desc = "Show item level on weapons and armor a vendor sells",
nav = { module = "EllesmereUIBlizzardSkin", page = "Blizzard Window Skins" },
},
{
module = "Raid Frames",
title = "Combat Icon",
desc = "An icon marks group members who are still in combat",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "INDICATORS", highlight = "Combat Icon" },
},
},
fixes = {
{ module = "Action Bars", text = "The Pushed and Highlight border styles now draw an actual border outline instead of recoloring the whole icon." },
{ module = "Action Bars", text = "The Micro Menu and Bag Bar now hide correctly when entering a pet battle." },
{ module = "Action Bars", text = "Keybinds no longer trigger the wrong spell for Druids and Rogues when a shapeshift or stealth swap changes which ability is on a button." },
{ module = "Action Bars", text = "The extra action button (delves and other zone abilities) now shows its cooldown swipe and keybind the moment it appears, and a rare vehicle/override bar combat error is fixed." },
{ module = "Action Bars", text = "Action bar keybinds no longer override the House Editor's own hotkeys while decorating." },
{ module = "Aura & Buff Reminders", text = "Rogue poison reminders now respect the Show Consumes Below timer, warning shortly before a poison expires instead of only after." },
{ module = "Character Sheet", text = "The character and inspect sheets now share the same window border as other skinned windows, and the inspect sheet's panel and dressing-room button line up with the character sheet." },
{ module = "Character Sheet", text = "The better-item indicator no longer flags off-hands as upgrades while a two-handed weapon is equipped, and now works on non-English clients." },
{ module = "Character Sheet", text = "The character sheet now moves beside the inspect window and the Dungeons and Raids window instead of overlapping them." },
{ module = "Character Sheet", text = "Hovering an empty gem socket now glows the matching gear slot and opens the gem list so one click sockets it, and the socketing window no longer sticks after a gem is applied." },
{ module = "Cooldown Manager", text = "Moving a Tracking Bar in Unlock Mode on one spec no longer drags the same bar's anchor on your other specs." },
{ module = "Cooldown Manager", text = "Icon keybind text no longer shows the wrong key while shapeshifted, in a vehicle, or on a bonus bar page, and updates immediately instead of waiting for combat to end." },
{ module = "Cooldown Manager", text = "Transform spells (such as Rising Sun Kick becoming Rushing Wind Kick) and certain Demon Hunter sigils no longer show a stuck or missing cooldown swipe." },
{ module = "Cooldown Manager", text = "Blizzard's Assisted Combat Highlight glow now appears reliably on icons for talent-swapped or overridden spells." },
{ module = "Cooldown Manager", text = "Threshold Text's Apply to Bar and Apply to All Specs now reliably push a custom seconds value, even on a spell excluded from the bar." },
{ module = "Guild", text = "Achievement Points and Mythic+ Rating now show in the far-right stat column instead of under the Note column in the widened roster." },
{ module = "Mythic+ Timer", text = "The Blizzard Quest Tracker no longer stays visible over the timer during combat; it now hides the instant combat ends." },
{ module = "Nameplates", text = "The pandemic glow on debuff icons is no longer dimmed by the cooldown swipe animation." },
{ module = "Nameplates", text = "The target, focus, and hover health bar overlay now covers the full bar width on plates wider than 200 pixels." },
{ module = "Profiles & Presets", text = "Pasting or importing a very large profile or preset string now processes across frames with a progress percentage instead of freezing the game, with nothing cut off." },
{ module = "Profiles & Presets", text = "Importing a profile that references a bar texture you do not have now shows Texture Not Found on those bars instead of silently swapping in another texture." },
{ module = "Quality of Life", text = "Auto Open Containers now pauses at a vendor so newly bought bags are not sold or opened, and Exclude Warbound Containers now applies by default." },
{ module = "Quality of Life", text = "Fixed a Lua error from Hide Tutorial Pop-ups that could interrupt other windows such as the House Editor." },
{ module = "Quality of Life", text = "Window Shifter can now move the Quest Log, and the Achievement window can be dragged from anywhere on its body, not just the header." },
{ module = "Quality of Life", text = "Companion windows (map, professions, item upgrade and more) keep their alignment beside a moved or resized Character panel, and the Group Finder no longer redocks over other addons' panels." },
{ module = "Quest Tracker", text = "Fixed errors when clicking a tracked quest or hovering quest pins and tooltips on the map afterward." },
{ module = "Raid Frames", text = "The buff manager's simple grid gained an Own Only toggle to show only buffs you applied." },
{ module = "Raid Frames", text = "Frame and power bar borders no longer keep an old color or style on party frames after a profile or spec override swap." },
{ module = "Resource Bars", text = "Pressing an off-GCD ability like Hover during a cast or channel no longer makes the cast bar snap to full or empty for a frame." },
{ module = "Spec Overrides", text = "Tracking Bar unlock and anchor links no longer carry over from the wrong spec after a profile or spec swap." },
{ module = "Spec Overrides", text = "Importing a profile you exported yourself no longer creates duplicate Spec Override or Conditional Override groups." },
{ module = "Tooltips", text = "The tooltip peek modifier no longer fails to reveal a suppressed tooltip in combat, and suppressed tooltips no longer briefly flash under the Out of Combat modes." },
{ module = "Unit Frames", text = "The leader icon on player and target frames now shows the correct icon and also lights up for raid assistants." },
{ module = "Unit Frames", text = "Power bar text is no longer hidden behind the power bar's border in some border layouts." },
},
},
{
version = "8.4.5",
heroes = {
{
module = "Profiles & Presets",
title = "Settings Overrides",
desc = "Change any setting for a group of specs (all your tanks, your healers...) or based on a condition: Dungeon, Raid, Arena, Battleground, Solo, or an out-of-combat keybind toggle. Click the class glyph next to the search bar, pick who or when, and everything you change applies only there.",
nav = { module = "_EUIProfiles", page = "Spec Overrides" },
},
{
title = "Modular Visibility",
desc = "Every Visibility dropdown is now a checklist. Combine conditions - In Combat while In a Raid, only When Dragonriding, and more - and add Mouseover to reveal on hover only while they pass. Both Dragonriding options are now available for every module.",
nav = { module = "EllesmereUIActionBars", page = "Bar Display", section = "VISIBILITY", highlight = "Visibility" },
},
{
title = "PTR Ready - One Version for Both",
desc = "EllesmereUI now ships as a single version that runs on both live retail and the Midnight 12.1 PTR. Install once, play anywhere - the same addon loads on either client, with full support for the PTR's reworked aura system. No separate PTR build to download or keep in sync.",
},
{
module = "Character Sheet",
title = "Socket Panel",
desc = "Gem sockets from your equipped gear now line the bottom of the character sheet. Click a socket to see every socketable gem in your bags with its stats, and click a gem to socket it instantly - no Blizzard socketing window needed.",
nav = { module = "EllesmereUIBlizzardSkin", page = "Blizzard Window Skins", section = "CORE OPTIONS", highlight = "Socket Panel" },
},
{
module = "Unit Frames",
title = "Player Private Auras",
desc = "Boss-mechanic icons (private auras) can now show directly on your player frame. Opt-in per-slot icons with size and position controls, so you see your assignment the instant it lands - no more hunting Blizzard's floating icons mid-pull.",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "PRIVATE AURAS", highlight = "Enable Private Auras",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("player") end
EllesmereUI._pendingUnitSelect = "player"
end },
},
{
module = "Cooldown Manager",
title = "Global Tracking Bar Groups",
desc = "Tracking bar groups can now be Global: build the group once and its bars, layout and position follow you across every spec, instead of rebuilding the same setup thirteen times.",
nav = { module = "EllesmereUICooldownManager", page = "Tracking Bars" },
},
},
features = {
{
module = "Action Bars",
title = "Icon Order",
desc = "Start buttons from any corner, or reverse the order",
nav = { module = "EllesmereUIActionBars", page = "Bar Display", section = "LAYOUT", highlight = "Icon Order" },
},
{
module = "Aura & Buff Reminders",
title = "Text Anchor",
desc = "Place the label above, on, or beside the icon",
nav = { module = "EllesmereUIAuraBuffReminders", page = "Auras, Buffs & Consumables", section = "DISPLAY", highlight = "Show Text" },
},
{
module = "Aura & Buff Reminders",
title = "Mana Warning Settings",
desc = "Toggle, recolor, resize and preview the ready-check warning",
nav = { module = "EllesmereUIAuraBuffReminders", page = "Auras, Buffs & Consumables", section = "CONSUMABLES", highlight = "Ready Check Mana Warning" },
},
{
module = "Cooldown Manager",
title = "Threshold Text",
desc = "Per-spell decimal countdown and color below a threshold",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars" },
},
{
module = "General",
title = "Icon Zoom",
desc = "Crop icon borders: Bags, Character Sheet, Damage Meters, Unit Frames",
nav = { module = "EllesmereUIBags", page = "Bags", section = "DISPLAY", highlight = "Icon Zoom" },
},
{
module = "General",
title = "Tutorial Tips & Video Guides",
desc = "Help badges on key features open a video guide popup",
nav = { module = "_EUIGlobal", page = "General", section = "DISPLAY", highlight = "Enable Tutorial Tips" },
},
{
module = "General",
title = "New Patch Reminder Dot",
desc = "A dot on Patch Notes whenever your version increases",
},
{
module = "Minimap",
title = "Readout Scale Sliders",
desc = "Resize the Coordinates and FPS/MS text independently",
nav = { module = "EllesmereUIMinimap", page = "Minimap", section = "TEXT", highlight = "Show Coordinates" },
},
{
module = "Nameplates",
title = "Rare/Quest Icon In Instances",
desc = "New toggle lifts the open-world-only restriction",
nav = { module = "EllesmereUINameplates", page = "Display", section = "CORE POSITIONS" },
},
{
module = "Nameplates",
title = "Open World Basic Coloring",
desc = "One flat enemy color outside instances",
nav = { module = "EllesmereUINameplates", page = "Colors", section = "ENEMY COLORS", highlight = "Enemy Types" },
},
{
module = "Raid Frames",
title = "Buff Threshold Sounds",
desc = "Play a sound when a tracked buff hits its threshold",
nav = { module = "EllesmereUIRaidFrames", page = "Buff Manager" },
},
{
module = "Raid Frames",
title = "Incoming Resurrection Icon",
desc = "See queued rezzes on dead players",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "INDICATORS", highlight = "Ready Check / Summon / Rez" },
},
{
module = "Raid Frames",
title = "Buff Hover Tooltips",
desc = "Optional aura tooltips on Buff Manager icons",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "EXTRAS", highlight = "Show Raid Frames Tooltip" },
},
{
module = "Raid Frames",
title = "Show Text Above Icons",
desc = "Render name and health text above aura icons",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "TEXT DISPLAY", highlight = "Name Size" },
},
{
module = "Raid Frames",
title = "Dispellable Debuff Icon Size",
desc = "Independent size for split-location dispellables",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "DISPELS", highlight = "Dispellable Debuff Location" },
},
{
module = "Resource Bars",
title = "Buff Colors",
desc = "Recolor the Class Resource bar while chosen buffs are active",
nav = { module = "EllesmereUIResourceBars", page = "Class, Power and Health Bars", section = "CLASS RESOURCE BAR", highlight = "Threshold & Hash Lines" },
},
{
module = "Resource Bars",
title = "Per-Spec Setup Moved to Spec Overrides",
desc = "Advanced mode retired; setups migrate automatically",
nav = { module = "EllesmereUIResourceBars", page = "Class, Power and Health Bars", section = "BAR DISPLAY" },
},
{
module = "Resource Bars",
title = "Recolor Text Instead Of Bar",
desc = "Threshold colors can target the text",
nav = { module = "EllesmereUIResourceBars", page = "Class, Power and Health Bars", section = "HEALTH BAR", highlight = "Health Text" },
},
{
module = "Resource Bars",
title = "Bar Text Anchor",
desc = "Pin bar text left, center, or right",
nav = { module = "EllesmereUIResourceBars", page = "Class, Power and Health Bars", section = "HEALTH BAR", highlight = "Health Text" },
},
{
module = "Resource Bars",
title = "Stagger Full %",
desc = "Set where the Brewmaster bar reads as full",
nav = { module = "EllesmereUIResourceBars", page = "Class, Power and Health Bars", section = "CLASS RESOURCE BAR", highlight = "Threshold & Hash Lines" },
},
{
module = "Resource Bars",
title = "Hide Bar Text per Druid Form",
desc = "Independent text visibility per form",
nav = { module = "EllesmereUIResourceBars", page = "Class, Power and Health Bars", section = "HEALTH BAR", highlight = "Health Text" },
},
{
module = "Resource Bars",
title = "Hide when Dragonriding",
desc = "New visibility option",
nav = { module = "EllesmereUIResourceBars", page = "Class, Power and Health Bars", section = "BAR DISPLAY", highlight = "Visibility Options" },
},
{
module = "Unit & Resource Bars",
title = "Out of Combat Fade",
desc = "Fade frames and bars to a chosen alpha out of combat",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "DISPLAY", highlight = "Visibility",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("player") end
EllesmereUI._pendingUnitSelect = "player"
end },
},
{
module = "Unit Frames",
title = "Frame Source",
desc = "Render each frame as EllesmereUI or Blizzard's default",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "DISPLAY", highlight = "Visibility",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("player") end
EllesmereUI._pendingUnitSelect = "player"
end },
},
{
module = "Unit Frames",
title = "Apply All Settings To",
desc = "Copy one frame's settings to another in one click",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("player") end
EllesmereUI._pendingUnitSelect = "player"
end },
},
{
module = "Unit Frames",
title = "Target Combat Indicator",
desc = "The combat indicator can now show on the target frame",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "EXTRAS", highlight = "Combat Indicator",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("target") end
EllesmereUI._pendingUnitSelect = "target"
end },
},
{
module = "Unit Frames",
title = "Name Truncation",
desc = "Length limit and optional ellipsis on name text",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "HEALTH BAR", highlight = "Left Text",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("player") end
EllesmereUI._pendingUnitSelect = "player"
end },
},
{
module = "Unit Frames",
title = "Aura Duration Format",
desc = "New countdown styles for player buff text",
nav = { module = "EllesmereUIUnitFrames", page = "Blizzard Aura Frames", section = "PLAYER BUFFS & DEBUFFS", highlight = "Show Text" },
},
{
module = "Unit Frames",
title = "Dispel Type Borders",
desc = "Recolor debuff borders by dispel type",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "BUFFS AND DEBUFFS", highlight = "Debuff Display",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("target") end
EllesmereUI._pendingUnitSelect = "target"
end },
},
{
module = "Unit Frames",
title = "Boss Frame Absorbs",
desc = "Absorb shields on Boss frames",
nav = { module = "EllesmereUIUnitFrames", page = "Main Frames", section = "ABSORBS", highlight = "Absorb Style",
preSelect = function()
if EllesmereUI._setUnitFrameUnit then EllesmereUI._setUnitFrameUnit("target") end
EllesmereUI._pendingUnitSelect = "target"
end },
},
{
module = "Unlock Mode",
title = "Fallback Anchors",
desc = "Anchored elements land safely when their target is missing",
},
{
module = "Tooltips",
title = "Peek Modifier",
desc = "Hold Shift/Ctrl/Alt to reveal hidden tooltips on hover",
nav = { module = "EllesmereUIBlizzardSkin", page = "Tooltips, Menus & Popups", section = "BLIZZARD TOOLTIP", highlight = "Show Tooltips" },
},
},
fixes = {
{ module = "Action Bars", text = "Vehicle ability cooldowns now show their swipe and timer immediately, instead of only after mouseover or entering combat." },
{ module = "Action Bars", text = "The Stance Bar now stays hidden for classes with no shapeshift forms." },
{ module = "Action Bars", text = "Custom keybind text color no longer reverts to white after target or combat changes." },
{ module = "Action Bars & Cooldown Manager", text = "Item macros no longer trigger a false spell proc glow." },
{ module = "Aura & Buff Reminders", text = "Clicking preview elements now jumps to the right settings section." },
{ module = "Bags", text = "The currency footer now grows with your tracked currencies instead of clipping." },
{ module = "Bags", text = "Collapsing the sidebar no longer drifts a right-anchored bag window." },
{ module = "Character Sheet", text = "Collapsed stat sections now stay collapsed after switching specs, and spec-restricted stats no longer flash back when expanding a section." },
{ module = "Character Sheet", text = "The item level tooltip's better-items list no longer misses cloaks, weapons, caster off-hands or slow-loading items, and now checks the reagent bag too." },
{ module = "Cooldown Manager", text = "Fixed icons from another spec lingering on bars after spec swaps or shapeshifting." },
{ module = "Cooldown Manager", text = "Per-trinket settings now follow the equipped trinket across swaps." },
{ module = "Cooldown Manager", text = "The default Buff Bar's custom order survives respecs and \"Repopulate from Blizzard\"." },
{ module = "Cooldown Manager", text = "Essence of the Blood Queen and similar untracked procs now appear on buff bars." },
{ module = "Cooldown Manager", text = "Pandemic glow now wraps the whole tracking bar instead of clipping under borders." },
{ module = "Cooldown Manager", text = "Tracking bar icons now always match Blizzard's resolved icon (e.g. Roll the Bones)." },
{ module = "Cooldown Manager", text = "Demonic Healthstone is no longer treated as unusable in combat." },
{ module = "Cooldown Manager", text = "CD Ready sound no longer false-triggers on loading screens or bar rebuilds." },
{ module = "Cooldown Manager", text = "Swiftmend brightness now applies reliably and its toggle works without a reload." },
{ module = "Cooldown Manager", text = "FocusKick info text now matches the Show on Target setting." },
{ module = "Cooldown Manager", text = "Tracking bar previews no longer linger after closing the options." },
{ module = "Cooldown Manager", text = "Charge text on custom spells now follows the bar's font and position settings." },
{ module = "Cooldown Manager", text = "Border style and background color now apply consistently across every icon on the Essential and Utility bars." },
{ module = "Crafting Orders", text = "The Place Order / My Orders tabs now show which one is active." },
{ module = "Dragon Riding", text = "The bar's height can now be adjusted from the Unlock Mode cog, and its width is no longer stuck above 96px." },
{ module = "Dragon Riding", text = "Fixed extra spacing between the charge pips and the Whirling Surge icon at certain UI scales." },
{ module = "Dragon Riding", text = "The HUD no longer stays stuck on screen after exiting Unlock Mode while dismounted." },
{ module = "General", text = "11 new alert sounds (Cat Meow, Kaching, Wilhelm, Warning Siren and more) in every sound picker." },
{ module = "General", text = "Hide when Mounted now counts druid Travel, Flight and Aquatic forms." },
{ module = "Group Finder", text = "Fixed errors clicking role and filter checkboxes in Premade Groups." },
{ module = "Mail", text = "The Send Mail attachment slot now reliably shows the attached item's icon." },
{ module = "Nameplates", text = "Fixed the Rare/Quest indicator not anchoring in the Bottom slot." },
{ module = "Nameplates", text = "Fixed border edges flickering or vanishing when plates rescale." },
{ module = "Profiles & Presets", text = "Spec pickers gained Check Tanks / Healers / DPS quick-select links." },
{ module = "Quality of Life", text = "Fixed a multi-second freeze opening /keys in large guilds." },
{ module = "Quality of Life", text = "Quick Loot, Auto Open Containers, LFG Reminder, Low Durability Warning and Shifter now apply instantly without a reload." },
{ module = "Quality of Life", text = "Train All no longer skips still-affordable trainer skills." },
{ module = "Quality of Life", text = "The secondary-stats display now refreshes on gear changes." },
{ module = "Quality of Life", text = "FPS counter labels now resize with the Text Size slider." },
{ module = "Quality of Life", text = "Fixed the wrong icon on the Ursol's Vortex cursor macro." },
{ module = "Quality of Life", text = "Item Upgrade, Transmog, sockets, vendors and other companion windows now dock beside a Shifter-moved Character window instead of hiding underneath it." },
{ module = "Quest Tracker", text = "Fixed tracked quests overlapping after focusing a quest or changing fonts." },
{ module = "Quests", text = "Fixed dark, unreadable text in quest dialogue and reward descriptions." },
{ module = "Raid Frames", text = "Buff Manager Simple Setup now shows buff stack counts, with a new Show Stacks toggle plus color, size and offset controls." },
{ module = "Raid Frames", text = "Hover and target highlights no longer cover name text or icons." },
{ module = "Raid Frames", text = "Fixed frames sizing for a too-small raid right after zoning in." },
{ module = "Raid Frames", text = "Fixed custom size-tier layouts drifting from their saved position." },
{ module = "Resource Bars", text = "Soul Fragments now respect Surrender to the Void's higher fragment cap." },
{ module = "Tooltips", text = "Show Mount now marks whether you've collected the mount." },
{ module = "Unit & Raid Frames", text = "New Gradient Sharp dispel overlay style." },
{ module = "Unit Frames", text = "The pet frame's Class Colored fill now works." },
{ module = "Unit Frames", text = "Fixed blank name/health/power text after a cold login." },
{ module = "Unit Frames", text = "Fixed a detached power bar rendering behind the frame border." },
{ module = "Unit Frames", text = "Frames hidden by visibility conditions no longer absorb mouse clicks." },
{ module = "Unit Frames", text = "Fixed the 3D portrait staying visible on its own while the rest of the frame was hidden." },
{ module = "Unit Frames", text = "Pet, Target-of-Target and Focus Target now follow their parent frame's visibility." },
},
},
{
version = "8.4.1",
heroes = {
{
module = "Cooldown Manager",
title = "Dynamic CDM Icons",
desc = "New per-spell Cooldown State Effect options can hide an icon while it is on cooldown or once it is ready, and the bar collapses the gap so the remaining icons stay tight.",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("cooldowns") end
end },
},
{
module = "General",
title = "Raid Frames & Tracking Bars Anchoring",
desc = "Raid Frames, Party Frames, and Tracking Buff Bars can now be anchored to other elements in Unlock Mode, and other elements can anchor to them.",
},
{
module = "Resource Bars",
title = "Sweeping Strikes Bar",
desc = "Arms Warriors can now show Sweeping Strikes charges as pips on the Resource Bar, with a new color swatch under Fonts & Colors. Charges also track on the player unit frame and the personal nameplate class resource.",
nav = { module = "EllesmereUIResourceBars", page = "Class, Power and Health Bars", section = "CLASS RESOURCE BAR" },
},
{
module = "Cooldown Manager",
title = "Major CDM Bugfixes",
desc = "Hosted buffs no longer conflict with the same spell's cooldown icon, cooldown swipes no longer flicker or keep the wrong transparency/direction, and deleting a Tracking Buff Bar no longer breaks anchor links. Full list below.",
},
},
fixes = {
{ module = "Cooldown Manager", text = "Fixed a buff hosted on a Cooldown or Utility bar conflicting with the same spell's cooldown icon on that bar, which could duplicate icons, make them vanish, or bleed settings between the two." },
{ module = "Cooldown Manager", text = "Buffs hosted on a Cooldown or Utility bar now show a gold border so they stand out from cooldown icons." },
{ module = "Cooldown Manager", text = "Fixed a buff icon losing its cooldown swipe when a neighboring buff on the same bar expired." },
{ module = "Cooldown Manager", text = "Fixed the cooldown swipe sometimes keeping the wrong bar's transparency on a reused icon." },
{ module = "Cooldown Manager", text = "Deleting a Tracking Buff Bar no longer breaks anchor or size-match links pointing at the remaining bars, and switching specs no longer wipes Tracking Bar links." },
{ module = "General", text = "When Include Layout is unchecked during profile import or export, anchored modules can now be selected independently instead of being force-checked together." },
{ module = "Nameplates", text = "New cog on the No Aggro color swatch lets that color override the Mini-Boss and Caster colors." },
{ module = "Quality of Life", text = "Resetting multiple instances at once now posts a single reset announcement to your group instead of one message per dungeon." },
{ module = "Resource Bars", text = "The Class Resource Bar preview in Settings now shows the correct number of pips for specs with non-standard charge counts." },
{ module = "Unit Frames", text = "The pet frame's Class Colored Fill option now works, coloring the bar by the pet's own class (it previously stayed green regardless)." },
},
},
{
version = "8.4",
heroes = {
{
module = "Cooldown Manager",
title = "Host Buffs on CD/Utility Bars",
desc = "Add any buff as its own aura-driven icon on a Cooldown or Utility bar, tracked live off your auras, with a per-icon cooldown swipe color so it fits right alongside your abilities.",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("cooldowns") end
end },
},
{
module = "Quality of Life",
title = "Combat Alert",
desc = "Big customizable on-screen text that fires the moment you enter or leave combat, with your own message, size, colors, and screen position.",
nav = { module = "EllesmereUIQoL", page = "Quality of Life", section = "GENERAL", highlight = "Combat Alert" },
},
},
features = {
{
module = "Cooldown Manager",
title = "Out of Combat Bar Fade",
desc = "Dim a bar's icons to a chosen alpha while out of combat",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars", section = "BAR LAYOUT", highlight = "Bar Opacity",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("cooldowns") end
end },
},
{
module = "Cooldown Manager",
title = "Buff Bar Tooltips",
desc = "Show Tooltip on Hover now works on buff-family bars",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars", section = "EXTRAS", highlight = "Show Tooltip on Hover",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("buffs") end
end },
},
{
module = "General",
title = "Dark Mode Master Toggle",
desc = "One switch for the dark theme across frames and resources",
nav = { module = "_EUIGlobal", page = "Fonts & Colors", section = "DARK MODE", highlight = "Dark Mode" },
},
{
module = "Glows",
title = "Pixel Glow Backgrounds",
desc = "A solid background color behind glow effects on nameplates, raid frames, and cooldowns",
nav = { module = "EllesmereUINameplates", page = "General", section = "EXTRA AURA OPTIONS", highlight = "Pandemic Glow Style" },
},
{
module = "Mythic Timer",
title = "Custom Bar Borders",
desc = "Border style, size, offset, and color for the timer and forces bars",
nav = { module = "EllesmereUIMythicTimer", page = "Mythic+ Timer", section = "TIMER", highlight = "Bar Texture" },
},
{
module = "Nameplates",
title = "Name Raid Marker",
desc = "Show the target raid marker right before the enemy name",
nav = { module = "EllesmereUINameplates", page = "General", section = "EXTRAS", highlight = "Name Raid Marker" },
},
{
module = "Nameplates",
title = "Cast Icon Offset",
desc = "X and Y sliders to reposition the nameplate cast icon",
nav = { module = "EllesmereUINameplates", page = "Display", section = "BARS", highlight = "Spell Icon" },
},
{
module = "Nameplates",
title = "Cast Icon Target Border",
desc = "Match the full-size cast icon border to your target color",
nav = { module = "EllesmereUINameplates", page = "Display", section = "BARS", highlight = "Spell Icon" },
},
{
module = "Unit & Raid Frames",
title = "Icon Zoom",
desc = "New sliders crop tighter on aura icons across raid and unit frames",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "TARGETED SPELLS", highlight = "Icon Size" },
},
{
module = "Unit Frames",
title = "Boss Aura Text Colors",
desc = "Color pickers for boss buff and debuff duration and stack text",
nav = { module = "EllesmereUIUnitFrames", page = "Boss Frames", section = "Buffs and Debuffs", highlight = "Buff Text Size" },
},
},
fixes = {
{ module = "Action Bars", text = "Fixed the Hide without Target visibility condition sometimes missing mouseover, nameplate, and soft enemy or friend targets, so bars show and hide reliably." },
{ module = "Blizzard Skin", text = "Fixed profession window text (name, rank, and bar labels) sometimes jumping far out of place when reopening the Professions book after a UI scale change." },
{ module = "Cooldown Manager", text = "Tracking Bar name text can now wrap to two lines instead of always truncating, via a new Text Wrap toggle." },
{ module = "Cooldown Manager", text = "The Shape Glow effect (formerly Custom Shape Glow) now works on any icon instead of requiring a custom icon shape first." },
{ module = "Cooldown Manager", text = "Fixed icons staying desaturated after Desaturate When Not Active was turned off, instead of re-coloring right away." },
{ module = "Cooldown Manager", text = "Per-icon Apply to Bar overrides can now target or exclude a single spell, via new Apply to This Spell and Exclude This Spell options in an icon's right-click menu." },
{ module = "Cooldown Manager", text = "The Tracking Bar spell picker now also shows tracked but untalented spells (desaturated but still selectable), so you can arrange bars without swapping talents." },
{ module = "Mythic Timer", text = "Fixed the Forces (Enemy) bar's Bar Texture and Background Texture settings overwriting the main timer bar's textures instead of using their own." },
{ module = "Unit Frames", text = "Fixed custom Unit Frame fonts not applying on Korean, Chinese, and Cyrillic clients, so they now match the font choice used everywhere else." },
},
},
{
version = "8.3.9",
heroes = {
{
module = "Cooldown Manager",
title = "Mirror Key Presses",
desc = "Cooldown Manager icons now show the same pressed-down look as your action buttons the moment you tap an ability's keybind, even while it is on cooldown, matched to your action bar's push effect.",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars", section = "EXTRAS", highlight = "Mirror Key Presses",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("cooldowns") end
end },
},
{
module = "Character Sheet",
title = "Gear Flyout Item Levels",
desc = "Hovering an equipped slot on the character sheet now shows each item's level in the swap flyout, colored by quality so you can spot upgrades at a glance.",
nav = { module = "EllesmereUIBlizzardSkin", page = "Blizzard Window Skins", section = "CORE OPTIONS", highlight = "Gear Flyout Item Levels" },
},
},
features = {
{
module = "Cooldown Manager",
title = "Exclude This Spec from Bar Apply",
desc = "Opt your spec out of an Apply to Bar (All Specs) setting",
nav = { module = "EllesmereUICooldownManager", page = "CDM Bars",
preSelect = function()
if EllesmereUI._setCDMBar then EllesmereUI._setCDMBar("cooldowns") end
end },
},
{
module = "Damage Meters",
title = "Sync Segments Across Windows",
desc = "Share segment selection, auto-snap to Current in combat",
},
{
module = "Nameplates",
title = "Raise Strata for Core Positions",
desc = "Render a slot's icon above the rest of the nameplate",
nav = { module = "EllesmereUINameplates", page = "Display", section = "CORE POSITIONS", highlight = "Top" },
},
{
module = "Raid Frames",
title = "Vertical Absorb Bars",
desc = "Anchor the Absorb and Heal Absorb bars on the frame edge",
nav = { module = "EllesmereUIRaidFrames", page = "Frames", section = "ABSORBS", highlight = "Absorb Bar" },
},
{
module = "Unit Frames",
title = "Boss Cast Bar Width and Offset",
desc = "Resize boss cast bars and nudge them left or right",
nav = { module = "EllesmereUIUnitFrames", page = "Boss Frames", section = "CAST BAR", highlight = "Cast Bar Width" },
},
},
fixes = {
{ module = "Blizzard Skin", text = "Fixed the reskinned Reputation and Currency panel blanking currency column headers and blocking currency transfers between characters." },