11.0.5
What's new
KkthnxUI
11.0.5 (2026-09-07)
Full Changelog Previous Releases
- docs(release): correct the tag suffix note, releases are no longer beta
- feat(config): expose range and mana tints and the chat font
Audited every default against the schema. Three live settings had no control:
the out of range and out of mana tints, which the Out of Range dropdown
already used, and the chat font, which is read separately from the interface
font in the chat frame setup. - fix(gcdbar): guard non-retail, skip idle cooldown reads, size the mover
The duration object and the engine driven status bar timer are retail only, so
the module now bails on the older flavours instead of erroring on load.
Cooldown updates fire constantly and almost none concern a bar that is not up,
so the shown check runs before anything is read.
The mover excluded the spell icon, leaving the edit mode handle narrower than
the thing it moves. - fix(gcdbar): only open the bar from a cast, keep the last icon
SPELL_UPDATE_COOLDOWN fires on any cooldown change and carries no spell, so
letting it open the bar showed a run with an empty icon box. It can now only
refresh a bar that is already up.
GetSpellTexture returns nothing for an unknown spell, and passing that through
blanked the icon rather than leaving the last one in place. The icon also
starts hidden until a cast names a spell. - fix(gcdbar): hide between cooldowns, size the spell icon separately
The bar sat on screen permanently, which was a shortcut to avoid needing an
end of cooldown signal. It now hides when the cooldown ends, scheduled once at
the exact time the duration object reports rather than polled for, with the
handle cancelled on re-arm so a finished cooldown cannot hide the one that
replaced it.
Remaining time can come back secret, so that read is guarded and
SPELL_UPDATE_COOLDOWN is the fallback that closes the bar.
The icon was sized to the bar, so a thin bar produced an unreadable icon. It
now carries its own size setting. - chore(pkgmeta): drop the stale move-folders entry
The addon has not lived in a nested KkthnxUI/KkthnxUI directory for a while,
so the move was a no-op. package-as already puts everything under KkthnxUI in
the packaged zip, which the 11.0.4-beta archive confirms. - feat(misc): add GCD bar with spell icon (#117)
Tracks the global cooldown off spell 61304, with the icon of the spell that
started it beside the bar. Off by default, movable, with width, height, drain
or fill, separate combat and resting opacity, and class or custom colour.
The duration object from C_Spell.GetSpellCooldownDuration is handed straight to
StatusBar:SetTimerDuration, so the engine renders the fill in C. No ticker, no
OnUpdate, and the value is never read, so a secret cooldown cannot break it.
The bar stays on screen and sits empty between casts, which leaves no
end of cooldown signal to chase. - refactor(cursortrail): emit dots along the path instead of dragging them
Dots were chasing the pointer, so the whole tail was permanently catching up
and read as lag whatever the easing. They are now dropped along the path,
anchored once, and aged out over a lifetime.
Spacing accumulates from the last dropped dot rather than the last frame, or a
slow drag never covers enough ground in one frame to place anything. Fast
flicks are filled with intermediate dots so the line has no gaps, capped so one
jump cannot place hundreds.
The per frame pass only touches size, colour and alpha. It sleeps to a 20Hz
watcher once the pointer stops and the last dot has faded, and motion while
suppressed cannot hold it open.
Adds shape choice, spacing, lifetime, shrink, and hide while turning, the last
driven by the started and stopped looking and turning events. - feat(cursortrail): chase the pointer with an eased tail and curved falloff
Clamping each dot to a fixed gap behind its leader drew a rigid string of
beads. Each dot now eases toward the one ahead, so the tail flows and bends
with the stroke.
The chase step is raised to the frame time, so it covers the same ground per
second whatever the framerate, instead of whipping at 200 fps and crawling
at 30. Alpha falls on a curve rather than a straight line, keeping the head
bright and letting the tail disappear before it ends.
Replaces the spacing slider with smoothing, which is what now controls tail
length and weight. - fix(cursortrail): round dot texture, fixed spacing tail, idle fade
The trail drew as vertical bars because it used our Glow texture, which is a
gradient strip meant for status bars. Swapped for a soft round glow.
Dots now chase the one ahead and halt a fixed gap short of it, so the tail
holds an even length instead of bunching when the pointer slows and stretching
when it is flicked. Sizes taper toward the tail.
Adds idle fade out, which also covers mouselook since GetCursorPosition freezes
there, plus opacity, spacing, and a combat only mode that runs no sample at all
outside combat. - feat(misc): add cursor trail (#149)
Fading dots following the mouse pointer, class coloured by default, with
length, size and colour options on a new Misc config page. Off by default.
Cursor position raises no event so the sample is per frame, but an unmoved
pointer exits after two comparisons, which also covers mouselook. Positions
live in a fixed ring written in place, so the hot path allocates nothing.
Nothing is created unless the option is on. - perf(skins): gate the character frame resize watcher on panel visibility
The watcher ran at 10Hz for the whole session to catch a CharacterFrame
resize. Parenting it to CharacterFrame stops it while the panel is closed,
since a frame under a hidden parent receives no OnUpdate, and it keeps our
code out of the show path that taints the secret health value.
Drops the now dead IsShown branch inside the tick. - fix(autorepair): report from confirmed durability, register watch per attempt
Success was printed immediately after RepairAllItems, before anything
confirmed it. The server can refuse a repair without raising an error, so a
failed attempt still logged a spend that never happened.
Reporting now runs off UPDATE_INVENTORY_DURABILITY, which fires only when gear
actually mends, and the amount is read from the change in carried coin rather
than assumed from the quoted cost. A refused guild repair is detected by the
remaining cost and retried against player funds.
UPDATE_INVENTORY_DURABILITY and MERCHANT_CLOSED are registered only while a
repair is in flight instead of for the whole session, so an idle character
stops paying for an event that ticks constantly in combat.
chore(repo): restore .gitattributes removed by a bad mirror sync - refactor(dialog): add K.Prompt, migrate all internal popups off StaticPopup
Adds a text-entry mode to the shared dialog and moves the six remaining
KkthnxUI-owned StaticPopup entries onto K.Confirm and K.Prompt: bag group and
category naming, cheapest-junk delete, and group disband. Removes three
StaticPopupDialogs registrations and four unused StaticPopup_Show upvalues.
Blizzard-owned dialogs (bank money, duel, loot) are untouched.
fix(bugreport): clear the form on close (#151)
The window is built once and reused, so the previous report stayed in the
fields and the next one was filed carrying the last bug's text. OnHide now
resets the fields, the clean-install check, the output box and its label. - feat(core): add native confirmation dialog, drop StaticPopup from config
Config section reset used Blizzard's StaticPopup, which ships its own art and
breaks visual consistency with the rest of the interface.
K.Confirm builds a single shared dialog on first call and reuses it, so a
session that never confirms anything allocates nothing. Registered in
UISpecialFrames for escape handling. - Fix the chat and tooltip anchors at the source, drop the timers
Chat. The pass that moved the window is EditModeManagerFrame:UpdateLayoutInfo,
which runs on EDIT_MODE_LAYOUTS_UPDATED and whenever the game swaps to an
override layout, which is what a teleport into an instance does. Inside it,
InitSystemAnchors resets every system with ClearAllPoints followed by
SetPoint on UIParent TOPLEFT, and UpdateSystems then calls ApplySystemAnchor.
ChatFrame1 is an Edit Mode system frame, so it is caught by both. Hooking
UpdateLayoutInfo re-pins once after the whole pass, which replaces the three
speculative timers I had added.
Tooltip. The mover was created behind a one second timer because the bag bar
module is enabled after the tooltip module. PLAYER_ENTERING_WORLD fires after
every module has been enabled, so the frame is known to exist by then. - Restore the repo-only files the sync had deleted
The deployed AddOns folder holds only what the game loads, so mirroring it
into the repo removed everything that lives here and nowhere else: the
workflows, the issue templates, .pkgmeta, .gitignore and the readme. Losing
the release workflow is why the last tag published nothing.
The sync now excludes these directories and files by name. - Fix group role icons, stale aura swipes, and chat drifting on load
Group role icon never showed. oUF hands PostUpdate an Enum.LFGRole number
from UnitGroupRolesAssignedEnum, not the old TANK and HEALER strings, so the
test matched nothing and the icon stayed hidden for every role. Now compares
against the enum and uses the icons_16x16_tank and icons_16x16_heal atlases.
Aura buttons kept a stale cooldown swipe. Blizzard drives the aura cooldown
with clearIfZero false, so a pooled button that held a timed aura and then
took a permanent one carried the old swipe across the icon. Our cooldowns now
clear themselves when the duration comes through as zero.
Chat still walked off on a teleport. Re-anchoring only on PLAYER_ENTERING_WORLD
loses the race, because ApplySystemAnchor ends in UpdateActionBarLayout and the
managed frame containers lay out on a later frame. The corner is now re-asserted
on the next frame and twice more while the loading screen settles.
Also adds a Reset Section button to each config page, walking flyout pages too,
and exposes the possess bar toggle and the tooltip item level line in the GUI. - Minimap: optional fade for the landing page button
Off by default. When on, the faction symbol rests at 0.4 and comes up to
full on hover, with the resting alpha configurable. It uses its own OnEnter
and OnLeave rather than the map's hover check, since the button sits
outside the map bounds. - Minimap: put a faction symbol on the landing page button
The expansion landing page button wears whatever art the current expansion
ships, so it never matched the square map. It now uses the HordeSymbol and
AllianceSymbol game atlases.
Blizzard repaints and re-anchors that button constantly. SetLandingPageIconOffset
re-points it on every icon update, and UpdateIcon reassigns the normal, pushed
and highlight atlases plus the button size through either UpdateIconForGarrison
or SetLandingPageIconFromAtlases. So the restyle is a secure hook on all of
those plus OnShow rather than a one shot at login. - Config: search settings by name, not just category
The config search only matched category titles, so typing a setting name
like castbar or bubble found nothing. The nav entries now carry a haystack
built from the category title plus every control label, including the
labels inside action bar and unit frame flyout pages. - Group frames: stop building threat twice, fix an inverted secret guard
Build.Indicators already sets threat up, and party and raid each asked for
it again straight after, so every group frame carried a second orphaned
proxy texture. In a full raid that is forty wasted textures. The duplicate
calls are gone and Build.Threat now returns the existing proxy rather than
making another, so this cannot come back.
The raid mana only power check read "ptype == 0 and not IsSecret(ptype)",
which compares first and guards second, so a secret would have thrown on
the comparison it was meant to be protected from. Reordered to match the
nameplate caster test. UnitPowerType carries no secret return marker today,
so this was latent rather than live. - Minimap: align the collector bracket, and size the collected buttons
The bracket was centred on the border corner, but the art draws its elbow
at the texture corner rather than the middle, so centring threw it off by
half its size. Corner to corner now.
Collected addon buttons were a fixed 26 and read too large. They are 22 by
default and adjustable, with a Collected Button Size slider under Minimap. - Minimap: sit the collector bracket on the border itself
It was anchored to the map corner, but the border is drawn at an offset
from the map edge, so the bracket sat adrift of the line it is meant to be
on. It is centred on the border corner piece now, which keeps the two
together whatever that offset is set to, and falls back to the map corner
when the border is turned off.
Also clearing the texture slice after setting the atlas. SetAtlas pulls
whatever nine slice margins the atlas carries in the DB, which stretches
the middle of a piece meant to be drawn whole. - Minimap: sit the button collector on the corner as a bracket
The collector was a gold dot dropped on the map, which covered a piece of
it and crowded the other minimap buttons. It is the edit mode corner
bracket now, sat on the map corner so it reads as part of the border
instead of something placed on top of the map.
Blizzard builds all four corners of a nine slice from a single top left
asset and mirrors it, so the piece is flipped to suit whichever corner the
collector is set to. The texture coordinates are applied before the atlas,
which is the order NineSlice itself uses, otherwise the atlas overwrites
them. Clients without the edit mode art keep the old dot. - Guard four more secret reads on Midnight
Audited every unit API we drive a condition from against the generated
docs, looking for the ones that actually carry a secret return marker
rather than assuming. Three do: UnitIsUnit is secret while unit comparison
is restricted, UnitGroupRolesAssigned and UnitIsGroupLeader while that
unit identity is restricted. The rest of what the scan flagged, UnitIsPlayer
and UnitIsConnected among them, carry no such marker and were left alone.
Four real sites were unguarded. The group tools role tally and the tooltip
role icon both read UnitGroupRolesAssigned straight into a comparison or a
table key, which throws once a member is restricted, so an unreadable
member is now skipped instead. The inspect and mount source tooltips drove
a branch straight off UnitIsUnit against the player. - Paint the group frame hover and target highlights ourselves
These were the last two game atlases we leaned on for colour. Their tint
was baked into the art, so alone in the whole UI they could not be retuned
from the palette, and they sat slightly apart from everything around them.
Both are a flat additive tint now, the accent for the cursor and gold for
your target, with their strength in the shared alpha steps. Additive keeps
them lifting the bar underneath rather than covering it, which is what the
atlas glows did, so a member still reads out of a raid grid the same way. - Fix the pkgmeta indentation
The file used tabs, which the packager rejects outright: YAML wants spaces.
It has always been that way, it only surfaced now that anything actually
reads the file. - Release: retail only for now
The packager reads every TOC in the folder, so it would have published the
Vanilla, TBC, Cata and Mists builds alongside retail. Pinned to retail
until those are actually supported.
Release type is deliberately not set in the workflow. The packager takes it
from the tag, so a tag containing beta uploads as a beta and CurseForge
marks the file accordingly, which is what we want while KkthnxUI is in
beta. - Add an automated release build to GitHub, CurseForge and Wago
Pushing an annotated tag now packages the addon and publishes it. The
packager reads .pkgmeta for the layout and each TOC for the game versions
and the project ids, so none of that is repeated in the workflow.
Two faults in .pkgmeta had to go first. It moved a KkthnxUI_Config folder
that does not exist, and it pointed manual-changelog at a CHANGELOG.md that
is neither in the repo nor packaged, so the changelog is generated from the
commits since the previous tag instead. Also excluded the code of conduct
and the pages config, which were being packaged into the addon folder. - Give the muted text one scale so the whole UI reads as one thing
Secondary text was picking from six near identical greys chosen a line at a
time, 0.5 through 0.9, which is exactly what stops a UI feeling like one
piece. They collapse into two palette tiers, muted for hints and secondary
lines and disabled for greyed out ones, with silver and off white taking
the two lightest. Both new tiers carry a little of the theme blue rather
than being flat grey, so a hint sits in the same family as what surrounds
it instead of reading as plain grey text.
Twenty eight places across the bags, chat, minimap, tooltip, nameplates,
world map, movers and the whole config GUI now read those tiers. - Add an off white to the palette, and refresh the tooltip on shift
Off white: pure white is harsh against the dark panels, so the palette
gains K.Colors.offWhite and every piece of white text we draw ourselves
now reads it, the skinned button labels included. Blizzard supplied values
are left alone.
Tooltip: shift now updates the item level while you are still hovering,
rather than only counting if it was held before. There is no refresh call
on a tooltip, so the unit is set again, which re-runs the data provider.
The mouseover token is used rather than the one GetUnit hands back, since
that one can be a secret.
Also pulled four more colours into the palette: the close button X and its
hover were our gold spelled out by hand, the bug report success line is
jade, the button preview header is gold, and the unread chat tab is ember. - Tooltip colours from the palette, readable friend count, shift item level
Tooltip: the informational blue, the item level gold, the guild gold and
the red on your own name were all loose numbers rather than palette
entries, so nothing retuned with the theme. That blue turned up in eight
places across the tooltip, the clock and the performance readout, so it is
now K.Colors.info and everything reads it.
Social button: the online count kept the stock small unoutlined font and
sat on top of the icon art, which made it near unreadable. It gets our
outlined font in gold on the overlay layer.
Tooltip item level can now be put behind shift. Inspecting is the costly
part of that tooltip, so holding it back until you ask for it is worth
having. Shift has to be down before you hover, since the lookup runs while
the tooltip is built. - Chat bubbles: name the speaker above the bubble
A bubble carries only the words, never who said them, so the sender is
stashed against the message text as the chat event arrives and looked up
again when the bubble turns up a frame later. The name sits above the
bubble in the speaker class colour, falling back to our accent when the
class cannot be resolved.
Both the message and the sender can be secret on Midnight, and a secret
cannot key a table, so an unreadable message simply goes unnamed rather
than erroring. The caches are dropped on a loading screen so they cannot
grow for a whole session, and the name refreshes on every show because the
client pools and reuses bubbles.
New Bubble Speaker Name toggle under Chat, on by default. - Chat bubbles: scale our art to the UI
Bubbles live in the WorldFrame, which does not inherit the UI scale. Our
border is sized in pixel perfect units derived from UIParent, so drawn
straight onto the bubble it came out at the wrong thickness against the
rest of the UI.
The background and border now sit on their own frame inside the holder,
scaled back to the UI effective scale. Scaling the holder itself was never
an option, it would take the bubble text with it. - Throttle the character frame watcher and use our own gold
The character panel layout watcher ran every single frame for the whole
session, closed panel included. It cannot be gated on the panel showing,
because putting our code back in that path is the taint it was built to
avoid, so it is throttled instead. A resize only needs catching within a
fraction of a second.
Five places painted the stock Blizzard gold rather than the warmer gold in
our palette, so the bug report headings, the group tools hover border, the
loot hover border and the game menu headers all drifted off theme. They
read K.Colors.gold now. - Stop a one shot combat handler from unregistering its siblings
Unregistering an event by name drops every handler the module has for it,
and four files share the ActionBars module while all listening for combat
ending. The stance bar deferred its update to combat end and then cleared
the event by name, which silently killed the keybind reassign in Core, the
deferred bar updates in Bars, and the extra button re-pin in Extras for the
rest of the session.
Both that handler and the UI scale one in API now hand back themselves
instead of the event name, so the siblings keep running. - Hide a detached castbar with its frame, and drop two dead settings
Castbar: dropping a target mid cast sends no stop event, and oUF gives up
once the unit stops existing, so its OnUpdate kept running with the cast
still flagged in progress and a detached bar sat on UIParent ticking
forever. Hiding the bar stops that update dead and the next cast shows it
again. Only the bar is touched this time, never the holder.
Aura Filters: the panel wrote a whitelist and a blacklist that nothing has
read since auras moved to the CustomAuraContainer on 12.1, which filters by
its own strings instead. Adding a spell there did nothing at all, so the
panel, its lists and its file are gone.
Cooldown Count under Action Bars was the same story, a checkbox no code
read. Cooldown numbers come from the Cooldown section. - Group Tools: show battle rez charges
Every class that can combat res draws from one shared pool, so Rebirth
charges are the group charges whatever you play. The panel now shows how
many are left and how long until the next one.
The charge fields are secret when cooldowns are restricted, so the count
goes out through SetFormattedText, the colour is only applied when the
value can actually be compared, and the recharge time is drawn by a real
Cooldown frame instead of us subtracting timestamps. The row hides itself
where there is no charge pool, which is anywhere outside a raid. - Castbar: stop the timer text when a cast is interrupted
The countdown is not written by us. oUF hands the time font string to a
client side duration binding, which kept counting the original cast down
after it was interrupted, straight over anything we set. Clearing the text
and guarding our own time callback could never stop it, because neither is
what paints the number.
The binding is switched off in the fail callback and back on at the next
cast start, which is oUF own mechanism, the same call it makes when the
element is disabled. The bar is also filled on a stop so it reads as
stopped rather than frozen part way through. - Revert the detached castbar visibility hooks
Hiding the holder alongside the unit frame stopped the target castbar
showing at all. No other UI drives a detached bar that way, so the hooks
are gone and the bar is back to how it was. - oUF: take three upstream fixes that matter on Midnight
raidroleindicator: GetPartyAssignment returns a secret while tainted, and
the old code fed it straight into an if, which errors on 12.1. Upstream
caches the last readable value and falls back to it. We do use this
element, so this was a live bug.
health: heal prediction widgets were never shown again once hidden, and
bar sizes carried floating point error. We run heal prediction, so the
first one was biting us.
power: same size normalization, plus the element now shows itself again
after being hidden.
Left alone on purpose: additionalpower carries our own nil guard for
ALT_POWER_BAR_PAIR_DISPLAY_INFO, which does not exist off retail, and
init, events and ouf carry our flavour shims and unit re-derivation. Taking
upstream wholesale would undo all of those. - Talk to the real LibSharedMedia, and list the bars we already ship
We only ever looked up our own embedded copy of the library, which is
registered under a suffixed name so it cannot clash. A private copy shares
nothing though: every other addon publishes into and reads from the real
LibSharedMedia-3.0, so none of our media reached them and none of theirs
reached us. We now prefer the real library when another addon brings it and
fall back to our own when running alone.
Our fonts, bar textures and sounds are published to it, and whatever other
addons have registered is merged back into our own lists so it shows up in
the config dropdowns. Late loading addons are picked up through the
librarys registered callback rather than a login snapshot.
Borders stay out of both directions on purpose. Ours are one strip holding
all eight edge pieces, not the edgeFile a shared border is, so trading them
either way would render wrong.
Also listed the bar textures we ship. Seventeen of the twenty one sat in
Media/Statusbars unlisted, so they were on disk but impossible to pick.
That list was harvested from Media/Media.lua, a stale second copy of this
file that nothing loaded, now removed. - Castbar: hide a detached bar when its unit goes away
A detached castbar lives in a holder parented to UIParent so the mover can
grab it, which means hiding the unit frame did not hide the bar. Dropping a
target mid cast sends no stop event either, because the unit is simply
gone, so the bar ran down to zero and then sat there empty.
The holder now follows the frames own visibility, and the bar goes down
with it so a stale one cannot show up again on the next target. Covers the
target, focus and player bars. - Group Tools: place the ground flare that matches the icon shown
The ground flares are not numbered the same way as the raid target icons,
so a button showing the star was dropping a different coloured flare. Each
world marker button now translates its icon through Blizzards own
WORLD_RAID_MARKER_ORDER, the same table its raid manager runs every click
through, with a local copy only as a fallback. The target icon row was
already correct, since those really are indexed by icon. - Group Tools: defer the tab visibility change out of combat
The panel carries secure world marker buttons, which makes showing or
hiding anything above them protected, the tab included. Only the panel
hide was guarded, so a roster change mid fight ran Tab:Show and the client
blocked it. GROUP_ROSTER_UPDATE fires plenty during a fight, which is why
it looked like it came from nowhere.
Any visibility change now waits for combat to drop. The leader greying and
the role counts touch plain buttons and font strings, so those stay live. - Place the minimap indicators where they belong
Landing page button moves to the bottom left and the queue eye to the
bottom right, swapping the two corners they used to sit in. The queue
status popup follows its button to the right.
The difficulty flag and the mail indicator were never handled. Both hang
off MinimapCluster, most of which we hide, so they sat against the stock
border rather than our square map. The flag goes to the top right and mail
sits just above the clock, falling back to the bottom of the map when the
clock is off.
Blizzard re-anchors those two from two places, SetHeaderUnderneath when the
header flips and the global MiniMapIndicatorFrame_UpdatePosition when the
tracking button shows or hides, so both paths are hooked rather than
pinning once. The indicator matters especially because its stock anchor is
the border we banish. - Span the minimap readout strips to the map width
The coordinates, the clock and the performance readout hugged their text
while the zone name spanned the map, so the band around the map did not
line up. All four span the map width now.
The clock strip moved onto the map rather than its button so it can reach
wider than the click area, and the performance readout is sized to the map
width with a height that follows its text size, so its mover matches what
is drawn. - Put the shared strip behind the zone name too
The location label is already clamped to the map width, so a 4px pad each
side lands the strip flush with the map edges without bleeding past them,
however long the zone name is. It hides itself where there is no zone name
to sit on. - Put the shared strip behind the minimap readouts
The coordinates, the clock and the performance readout now sit on the same
gradient strip as the unit frame names, so everything around the map reads
as one family. Each strip hugs its own text, so it grows and shrinks with
the numbers rather than spanning a fixed click area.
The clock and the performance text were filling their whole button, which
would have stretched the strip well past the text, so both are centred now.
Performance text also goes up one size. - Tone down the name strip tint
The accent blue read far too bright behind a class coloured name. The
strips now use a dark, only faintly blue tint at a higher alpha, which
sits much closer to what the old atlas looked like while staying ours to
set. The tint lives in K.StripColor so the unit frames and the group
tools bar cannot drift apart. - Draw the name and role strips ourselves instead of a game atlas
The unit frame name strip and the group tools role bar both used the
AftLevelup-ToastBG atlas. Its violet was baked into the art, so it matched
nothing else we draw and neither the colour nor the alpha could be set.
Both now use our own two part gradient with the accent colour and a shared
strip alpha, so they match each other and retune in one place.
The shade grew an invisible holder frame that the two halves follow. The
upward aura stack anchors to the name strip by its corners, and a pair of
loose textures cannot serve as one anchor, so the holder is what gets
handed over now.
Marked the two party and raid highlight atlases in Indicators as the last
baked colour left, with why they need a different shape of fix. - Draw the nameplate name shades ourselves instead of using game atlases
The hover, target and name only shades behind a plate name were Blizzard
search and reward atlases. Their violet was baked into the art, so they
matched nothing else we draw and neither the colour nor the alpha could be
touched. The Rewards-Shadow one also had a fixed size that did not track
how long the name was.
Added K.CreateTextShade, a shade that is strongest behind the text and
fades out to both edges. A texture gradient only runs one way, so it is two
mirrored halves sharing one switch, and it frames whatever region you hand
it. All three plate shades now use it with colours from the shared palette
and alphas from the shared gradient steps. - Config: honest bar labels, grouped units, tooltips, reset to default
Bar labels were wrong. Bar 3 is the top row of the bottom stack, not a
right bar, and Bar 5 is the inner right bar, not a left one. Every bar now
says where it sits and which key group it is bound to.
Unit frames were one long undifferentiated list with Toggle Test Frames
sitting between Raid and Boss as though it were another unit. They are now
grouped into your frames, target frames, group frames, and shared, with
Boss back among the group frames and the test toggle down in shared where
it belongs. Every entry carries a tooltip saying what it is.
Tooltips used to work on checkboxes only. They now work on sliders,
dropdowns, text boxes, buttons and the subpage buttons through one shared
helper.
Right clicking any setting puts it back to its default, and the tooltip
says what that default is. Checkboxes swallow the right click rather than
toggling as well. - Group Tools: nudge the default position down to -26
- Movers update live while dragging, and size the zone ability mover
Live readout: dragging or nudging a frame now feeds the open popup, so the
coordinates and the anchor line track the frame in real time instead of
only refreshing when it is reopened. The label above a dragged mover also
reports the offset in the point the frame is actually pinned by, so what
you read while dragging matches what gets saved.
Zone ability mover: the template is 256 by 128 because that is the
footprint of the Style art, which we hide, so measuring the frame gave a
mover far larger than anything visible. Movers can now take an explicit
size, and the zone row measures its buttons on every update so it also
tracks the number of abilities on offer. - Movers keep an anchor point, and strip the zone ability chrome
Movers: a dragged frame was saved as a plain offset from the UIParent
centre, so the anchor point was thrown away the moment you moved anything
and an edge pinned bar quietly became centre relative. Positions now store
the point they are pinned by, dragging keeps it, and the nudge popup shows
it and lets you cycle it. Changing the point measures the new offsets from
where the frame already sits, so nothing jumps. Old saved pairs still load
and are read as centre anchored.
Zone ability: the button template carries its own NormalTexture anchored
well outside the button, so the stock frame sat around ours. The shared
styling clears it but runs once per button, and these come from a pool, so
a reused button came back wearing its art. Clear the art, the oversized
highlight and the frame style on every update instead. - Skin the zone ability buttons and the load on demand tooltips
Zone ability: the buttons stopped being a fixed frame SpellButton and now
come out of a pool on SpellButtonContainer, rebuilt whenever the displayed
abilities change, so styling once at login skinned nothing. Walk the active
buttons and restyle after every update instead.
Tooltips: FrameStackTooltip is a GameTooltip in Blizzard_DebugTools, which
is load on demand, so it does not exist at login and the skin list never
saw it. Added a small map of load on demand tooltips, applied for anything
already loaded and again on ADDON_LOADED. EventTraceTooltip rides along. - Nameplates: clear the name-only glows on a recycled plate
The hover and target glows live on every plate but are only ever shown by
the name-only paths, and nothing hid them again. A pooled plate that was a
hovered or targeted friendly kept its glow once the frame came back round
for a hostile unit, so bars showed a stray highlight behind the name.
UpdateNameOnly now clears both and drops the hover watcher whenever a plate
is not name-only, and the target highlight hides the glow on the bar path
as well, since target changes do not run UpdateNameOnly. - Chat: stop the window moving after a loading screen
Edit Mode owns the default chat frame on retail. While it still counts the
window as being in its default position, ApplySystemAnchor hands it back to
the managed frame container on every world enter and the container then
places it, so the chat shifted after a loading screen or a teleport. The
SetPoint hook lost that race because the container positions the frame
afterwards.
Break the frame out of the container the way Blizzard does for a system
that should not be managed, which also sets ignoreFramePositionManager, and
re-pin right after Edit Mode applies its anchor. - Centralise the gradient recipes
Every gradient was already tinted onto a plain texture rather than drawn
from art, but the recipes were loose numbers repeated across five files,
so retuning the theme meant hunting literals and two surfaces could drift
apart.
The named recipes now live beside the palette in Core Skins as K.Gradients,
with K.ApplyGradient for the vertical fills and K.FadeGradient plus
K.ShadeGradient for the horizontal washes and hairlines. The alpha steps
those fades share are named in K.GradientAlpha. All eighteen call sites in
the skins and the chat now go through them. No visual change, the values
are the same ones as before. - Movers: rebuild the frame list each time the panel is shown
The individual frame list was a single snapshot taken when the config
window was first built, so any mover registered after that never showed
up, the new performance datatext included. Rows are now rebuilt on show
and pooled so reopening the panel costs nothing. - Add framerate and latency datatext
A new Performance datatext under the minimap, reading like 100fps - 10ms.
Both numbers are graded against the shared palette so a glance tells you
whether things are healthy, and the fps and ms labels take white, class,
or a custom colour. The separator is configurable.
Hovering shows framerate, home and world latency, bandwidth, UI memory,
and the addons costing the most time per frame, read from the game addon
profiler with a memory listing as the fallback when the profiler is off.
Left click runs a garbage collect and reports what it freed. The readout
is movable like any other piece of the UI.
Added an ember tone to the palette for the step between gold and crimson. - Nameplates: gate private auras to retail, drop dead bag setting
Private auras are a retail feature and the classic clients take a
different argument set on the anchor call, so building the element there
threw on every plate. Gate it on the client and on the API being present.
Also removed the leftover Bags AutoSellJunk default. Auto sell junk moved
under Automation, so that key was no longer read anywhere. - Fix auto repair, bug report overflow, tracker taint, use game icons
Engine: a module stored one handler per event, so two files sharing a
module could not both listen. Automation owns AutoRepair and SellJunk and
both want MERCHANT_SHOW, so SellJunk silently replaced the repair handler
and auto repair never ran (#145). Handlers are now a list per module,
registering the same one twice is a no op, and a one shot handler removes
only itself.
Bug report: the multiline fields anchored an EditBox straight to a fixed
height frame. An EditBox does not clip its text, so a pasted Lua error
drew over the rest of the window (#144). Each one now scrolls inside a
scroll frame using the shared ScrollingEdit helpers, and the hint text
moved onto the scroll frame so it is not covered.
Objective tracker: stop styling ObjectiveTrackerFrame.Header. It belongs
to the shared container that drives every module, so rewriting its
textures from our hook tainted the container and the scenario module Maw
buff aura read failed downstream (#143). Only sub trackers are touched.
GUI icons: drop the custom atlas and its grid maths in favour of the
game icon library, so there is no art of ours to keep current. - Nameplates and GUI icons: guard threat read, rebuild icon atlas
Nameplates: CustomHealthColor read UnitThreatSituation into a boolean
without the secret guard the rest of the file uses, so an enemy plate
recolouring with Role Colors and Threat Health Color both on could error
on Midnight. Guarded it the same way as the threat fill.
GUI: the category and bag toolbar icon sheet was an uneven grid whose
tiles nearly touched, so the cell crop plus inset clipped icon edges.
Rebuilt it as a clean uniform 1024x512 grid with each tile centred and
padded, and dropped the crop inset to zero. Cell order is unchanged. - Bags: fix Warband right-click deposit, align bank top band
- Right-clicking a bag item on the Warband tab was depositing to the personal
bank. Blizzard routes the deposit to BankFrame:GetActiveBankType(), which reads
the stock bank panel and only while it reports shown. We hide that panel, so it
returned nil and everything fell back to the character bank. Now on tab switch
and on open we flip the panel's shown flag on (still invisible under our hidden
parent) and call SetBankType, so the active type matches the selected tab. - Line the close and toolbar buttons up with the search box, and give the bank
tabs an even 8px gap below the search. Build 2026.09.01.5.
- Right-clicking a bag item on the Warband tab was depositing to the personal
- GUI and bags: cohesive icon atlas for category list and bag toolbar
Adds a single icon sheet (Media/Textures/GUI/CategoryIcons, 8x4 grid of 128px
cells) and a SetGUIIcon helper that crops each cell with a small inset so the gap
between tiles never bleeds in. Every config category and the bag toolbar buttons
now read from the sheet. Build 2026.09.01.4. - Bags: scrappable-item marker on gear the Scrapping Machine accepts
A small top-centre marker (clear of the four corner overlays) on gear that can be
scrapped, using C_Item.CanScrapItem. Toggle in the bag options. Build 2026.09.01.3. - Tooltip: fix stuck quality border, colour unit border, drop mount line by default
- Reset the border on every tooltip show via a SetOwner secure hook, so a
previous item quality colour no longer sticks to the next tooltip. SetOwner is
a plain function, so hooking it is taint free and runs before any widget build,
unlike an OnTooltipCleared script hook which taints the map POI widgets. - Colour the unit tooltip border to match the unit (class or reaction), matching
the frames and the header comment that already claimed it. - Default the always-on 'mount a player is riding' line off, since it is clutter
on every player tooltip. The shift-hover mount source stays available.
- Reset the border on every tooltip show via a SetOwner secure hook, so a
- Update castbar defaults: player and target size, target position
Player castbar 242x28, target castbar 242x40, and the target castbar now
defaults to centre 0, -358. - Minimap: move coordinates to centered below the map, 6px down
- Fix minimap coords error: drive OnUpdate from a frame, not the FontString
A FontString does not support SetScript("OnUpdate"), which errored on login.
Moved the throttled poll onto a small driver frame that writes the coordinate
text instead. - Minimap: player coordinates and auto zoom reset
- Coordinate readout in the bottom-left of the minimap, throttled and hidden
wherever the map has no player position (most instances). Secret-guarded before
any arithmetic. Toggle in the minimap options. - Auto zoom reset: after a set number of seconds with no scrolling, the minimap
zooms back out. Off by default, configurable 0 to 30 seconds.
Both are gaps found auditing against the EllesmereUI minimap. Build 2026.09.01.2.
- Coordinate readout in the bottom-left of the minimap, throttled and hidden
- Chat: history persistence and idle fade
- Remember recent player chat across a reload or relog and replay it under a
quiet divider on login. Taint safe: never stores a secret line, only keeps real
player chat (lines carrying a player link), replays through AddMessage only, and
skips restore where the client forces addon chat restrictions. Stored per
character in KkthnxUIDB.chatHistory, capped and aged out after three days. - Idle fade option: dim the whole chat to a resting alpha when the mouse is away
and lift it on hover or edit box focus, as an alternative to dropping old lines.
Only our own frames are faded, never the tab dock (writing tab alpha taints the
dock update on 12.1).
- Remember recent player chat across a reload or relog and replay it under a
- Also exclude UIWidgetObjectiveTracker from tracker skinning
UIWidgetObjectiveTracker renders its blocks through the same shared UI-widget
pool as ScenarioObjectiveTracker and the AreaPOI tooltips, so touching its bars
taints that pool and can surface as the secret-value Maw buff aura error too.
Skin only the plain quest trackers and leave both widget-pool trackers alone. - Fix objective tracker taint causing Maw buff aura errors
The tracker skin ran from a repeating OnUpdate that rewrote the shared tracker
frames every tick. Those writes kept the frames tainted, so Blizzard's own secure
container update then ran tainted and the scenario module's Maw buff aura read
(GetAuraDataByIndex, a secret value on 12.1) errored on events like the Coiled
Isle curse surge, the Stormarian assault, and the temple (GitHub #134, #138, #141).
Reworked to react through secure hooks instead (SetCollapsed, GetProgressBar,
GetTimerBar) with a one time header pass, so styling stays in an isolated taint
context and never rewrites the shared frames on a timer. The scenario tracker and
its Maw buff aura path are left untouched.
Bumped build to 2026.09.01.1. - Chat skin overhaul, loot window, bug report tool, build tag
Chat:- Gradient skin unified across the chat window, channel bar, edit box, and side buttons
- Fix copy button opening an empty window (wrong frame plus zero width edit box)
- Fix combat log tab showing a light gap (anchor gradient to the background region)
- Colour the edit box hairlines to the channel you type in
- Keyword highlighting with an unread mention badge
- Spam filter no longer drops your own messages
- Restore the unread tab flash the stripped skin removed
New: - Compact loot window replacing the stock pick up list (Misc/Loot.lua)
- In game bug report form that generates a ready to paste GitHub report matching our template (Misc/BugReport.lua)
- Chat keyword highlighting module (Chat/Keywords.lua)
Misc: - Minimap visibility options (border, mouseover fade, datatext font sizes)
- Build tag K.Build for tracking day to day changes while the version stays put
- Add role-colored nameplates for casters and melee
- New Role Colors option colours hostile plates by caster or melee so casters stand out for interrupts. A unit that runs on mana is read as a caster, the one caster signal the nameplate API gives for an NPC, read live each update so a recycled plate never keeps a stale role and guarded for secret power types. Sits above reaction colour, below the custom and threat colours. Config has the toggle plus caster and melee colour pickers
- Fix tooltip and map POI taint, tracking revert, and move auto sell junk
- Fix map POI taint (issues 137 and 138): the insecure GameTooltip OnShow and OnTooltipCleared script hooks ran inside the execution that built a POI tooltip, so its secret widget arithmetic and the protected SetPassThroughButtons on the pin were blocked. Removed the redundant OnShow re-skin and moved the border reset to the taint-safe anchor hooksecurefunc
- Fix tracking toggle revert (issue 135): some trackings are backed by a saved setting, so a plain SetTracking is re-asserted. Toggle through MinimapUtil.SetTrackingFilterByFilterIndex, which syncs the setting
- Move auto sell junk to Automation (issue 136) so it works with the KkthnxUI bags disabled
- Add group tools panel and real config mode, plus boss and castbar polish
- Group tools: a movable in-group panel with ready check, role check, pull timer and presets, secure world markers and target icons, convert to raid and disband, plus a role summary bar under the tab on the unit-frame gradient
- Config mode (/kk test): force-show the real frames with the player's data instead of mock frames
- oUF: default a header child with no guessable unit to player, so config mode's phantom frames never index a nil unit
- Raid-style party option: five compact raid frames for the party
- Boss frames: right-side portrait, party-style top castbar, and the missing health text
- Castbar: side-aware top castbar with the icon in its own slot, party spacing that clears the bar
- Add bank tab bar, rework bank gold, fix scenario-tracker taint and castbars
- Fix GitHub #134: stop touching ScenarioObjectiveTracker so its MawBuffs aura read no longer taints
- Bank/Warband tab bar: purchased-tab icons, secure buy button, right-click name and icon editor
- Rework bank gold: clickable Warband balance (left deposit, right withdraw via Blizzard popups), remove the top controls
- Money readout spacing, 6px from the bottom, clear of the right border
- Fix the bag-bar toggle so it folds the bank tab bar too
- Castbar: freeze the timer on interrupt, palette-red latency zone, larger lock, target castbar between the frames, player castbar lower
- Chat: skin the social button on an overlay so a toast cannot hide it, flash the taskbar on a whisper
- Add party role icons and top castbar, fix bag bar toggle, lint clean
- Fix the group role icons using the correct 12.1 atlases (the old names did not exist)
- Add a party castbar as a bar above the frame spanning the portrait and health
- Fix the Show Bag Bar option, which referenced an out-of-scope local and never applied
- Small cleanups: weapon enchant upvalue and loop, castbar icon inset, clearer group name local
- Add the remaining live WoW globals to the luacheck config so the whole addon is warning clean
- Add loot and toast skins, weapon enchants, nameplate private auras, and fixes
- Skin the loot window with border, gradient, and quality-tinted item borders
- Skin and reposition the Battle.net toast (clear the backdrop, skin the close button)
- Skin and reposition the social button above the chat
- Show temporary weapon enchants beside the player buffs, with a /kk auras preview
- Add nameplate private auras plus flat-alpha and stacking cvars
- Add the crafting quality tier overlay to bag and bank slots
- Reposition and scale the queue status eye into the minimap corner
- Dispel-type corner badge on player, target, and nameplate debuffs
- Move and enlarge the player debuff block, add a target debuff test
- Game menu button spacing, hover, and font-size fixes
- Strengthen the shared button hover
- Scale the castbar lock and use the palette red for the latency zone
- Comment cleanup for the writing rules
- Guard Midnight secret values across oUF, chat, and tooltips
Add a secrets API to the oUF core (IsSecretValue, IsSecretUnit, and friends)
and rewrite the portrait element to use the frame unit directly instead of a
UnitIsUnit call that returns a secret boolean on restricted units. Make the
shared unitIsUnit helper never return a secret so its other callers are safe
too.
Guard the chat url and channel shortening against secret message strings, skip
forbidden widget tooltips in the tooltip backdrop hook and the border resize,
so none of these error while tainted on 12.1. - Keep another UI name out of a code comment
Reword the aura cancel comment so it explains the behaviour on its own without
naming another interface. - Fix buff cancel, tracker taint, and a global reassignment
Right-click cancel on the aura buttons never ran because the cancel flag was
read at the top level but only passed on the slot. Pass it at the top level,
enable mouse clicks, cancel on the down edge so the press is not lost to
world mouselook, and re-assert after each display update.
Stop the objective tracker skin tainting Blizzard secret aura reads by moving
its recolour off the secure layout hooks and onto a throttled watcher. Guard
the mount source tooltips bare aura read. Stop reassigning the Blizzard
StaticPopupDialogs table, which tainted the popup system, and only register
our own entries. - Expand the bags and fix taint and status bar bugs
Bags gain account gold tracking with Warband deposit and withdraw, stack
merging, custom categories with drag and middle-click assignment, category
groups with a manager panel, delete-cheapest-junk, custom junk flagging, a
fade-junk option, gear-by-slot shelves, a detachable reagent bag, and a bag
slot strip that sits below the frame. Reset paths cover per item, per
category, and per group.
Fix the experience bar showing at max level on retail, which lost its check
when the client dropped IsLevelAtEffectiveMaxLevel. Stop the character frame
skin tainting Blizzard's secret health status bar text by re-applying layout
from a decoupled watcher. Persist the bag bar toggle through the profile. - Add stack merging and custom item categories to the bags
Merge duplicate stackable items into one button with the combined count, off
by default. Middle-click an item to pin it to any category or a new one you
name, and manage those custom categories from the header menu. Assignments and
custom categories persist in the profile and override the automatic sorting. - Add category groups to the bags
Right-click any category header to start a new group, add the category to an
existing group, or take it back out. Grouped categories fold their items
together under one named header that can be renamed, deleted, and collapsed.
Everything persists in the profile. - Add a fade junk items option to the bags
Optionally desaturate vendor trash icons so the grey items sink back and the
gear and consumables lead the eye. Off by default, toggled in the bag options. - Add account gold tracking and Warband transfers to the bags
Record each character gold on the account and show the running total, per
character and the Warband balance, in a tooltip on the bag and bank money
text. The bank window gains a deposit and withdraw box for moving gold in and
out of the Warband bank when the account supports it. - Carry the bag on a holder frame so item use works
Writing the bag onto the secure item button, even as a plain field, taints the
click and the client then forbids the protected UseContainerItem, so
right-click use never fired. Wrap each button in its own holder frame that
carries the bag id, and let the template read the bag through the parent, so
nothing touches the button. Right-click use, pickup, and split work again. - Pre-warm bag buttons so item use survives delves
A secure item button created in combat is tainted for good, so the client
forbids UseContainerItem on it and right-click use dies in delves and M plus.
Build the button pools up front out of combat, refuse to create any while
locked down, and top them up again when combat ends. - Fix forbidden item use in the bags and drop the unused cargBags lib
SetBagID writes the secure bagid attribute, and setting it from our own code
tainted every item interaction, so the client forbade the protected
UseContainerItem and right-click use failed. The item template already reads
the bag as a plain field with a parent fallback, so drop the attribute write.
Also remove the bundled cargBags library, which nothing loads or references. - Fix nameplate debuff border and secret reputation bars
Draw the nameplate dispel cue as four solid tinted edges instead of a single
stretched glow, which rendered as ragged vertical bars around the icon.
Guard the reputation readout against secret standing values, which Midnight
now hands back. Comparing or subtracting them errored the whole update and
left the bar blank, so pass the raw numbers to the bar and drop the percent. - Stop the map reveal hook tainting area POI tooltips
The exploration overlay hook ran on every map refresh even with reveal off,
which tainted the refresh and broke Blizzard secret sized widget tooltips on
world quest area points of interest. Only take the hook and draw while reveal
is on, so an off setting leaves the map untouched. - Fix using items from the bags
The favourite alt-click replaced the item button OnClick, which shut off the
templates secure use and pickup path until a reload. Hook the alt-click
alongside the native handler instead, so right-click use works right away. - Match bag strip spacing to the item grid
Drive the strip gap from the same spacing setting the grid uses so the slots
line up with the rest of the window instead of sitting too far apart. - Widen the bag slot strip spacing
The border draws outside each slot, so the old gap left them touching. Give
the slots enough room to read as separate buttons. - Give the bag window its own bag slot strip
Build a dedicated row of equipped bag slots that folds out from the toolbar
toggle and sits on the bag window, with icons, free counts, quality borders,
and drag to swap a bag in out of combat. No longer leans on the separate bar. - Rework the bag window toolbar
Drop the title text, pin the search box to the top-left, and turn Sort into a
square icon button matching the close button with a cleanup glyph. Add a bag
bar toggle button beside it, with a saved state and a matching config option. - Show free reagent slots under the reagent shelf
The reagent bag empties were folded into the general free-slot count, so the
reagent section never showed room to drop into. Pool them apart and give the
shelf its own trailing free-slot button with the count. - Drop redundant 100% from the health value text
At full health the percent adds nothing, so show just the value. When both
are shown below full, separate them with a dash for readability. The percent
stays guarded so it never compares a secret value. - Keep class colour on restricted unit frame borders
When a unit hands back a secret class token, ask the client for the class
colour instead of dropping to the plain border, matching how the nameplates
already handle it. The token stays opaque and the values feed the setter. - Guard secret class and reaction lookups in delves
Some units in delves return a secret class token or reaction, and a secret
can never be used as a table key. Skip the palette lookup when either is
secret so the unit frame border and the tooltip stop erroring on those mobs. - Add chat side button strip and polish frames
Add a fading vertical icon strip on the chat for channels, copy, jump to
newest, a quick roll, and the config panel. Icons desaturate to a uniform
grey and lift to the class colour on hover. Refine threat health colouring
for nameplates and unit frames, share the cooldown swipe helper, brighten
the config sliders, and rebuild the classic character frame in Lua. - Add issue chooser config and refresh contributing and pull request docs
- Add question and compatibility issue templates
- Add an example bug report for users
- Refresh license, readme, and bug report template
- Rebuild for 12.1 Midnight
- Various fixes for bug reports from discord.
- Port ExpRep from NexEnhance.
- World Map Auto Quest checkbox called SetEventsActive before that local existed
- Starting porting NexEnhance stuff to KkthnxUI
- Monk works again!
- Fix warband bank and missing config text
- Pretty big update.
- Start reworking things for midnight. Expect bugs.
Idk a lot. - Optimize cooldowns, format caching, and perf fixes
Multiple performance and safety improvements across UI modules:- ActionBars: Add IsActionCooldown to avoid styling non-actionbar cooldown widgets; UpdateCooldownFont/OnCooldownSizeChanged now accept size args and early-return for non-action cooldowns; hook signature adjusted.
- PulseCD / QueueTimer / Auras: Localize frequently used globals (select, GetTime, PVPReadyDialog_Showing) to reduce global lookups.
- Auras: Cache formatted day/hour/min/sec strings to avoid repeated concatenation in FormatAuraTime; use cached GetTime.
- Castbar: Cache composed time format strings on the bar to avoid per-frame string concatenation.
- Tags: Localize string.format and replace several concatenations with formatted calls for fewer allocations.
- oUF_AuraTrack: Cache C_UnitAuras.GetAuraDataByIndex and AuraUtil.UnpackAuraData and use them in the UnitAura fallback to reduce repeated table lookups.
- Nameplates: Cache derived "<unit>target" tokens to avoid allocating strings on frequent threat checks.
These changes reduce allocations and string operations and avoid touching protected or unrelated cooldowns, improving runtime performance and stability.
- Add secret-safe guards and native cooldown styling
Prevent crashes from Midnight (12.0) secret/tainted values and switch to Blizzard-native cooldown rendering. Key changes:- Core: add K.UnitIsUnit shim and make UnitColor secret-safe (fail-closed when reads are secret). Add helper wrappers for running AuraWatch mover commands.
- Cooldowns: remove custom per-frame timer logic and instead style Blizzard's native countdown text (hook SetCooldown -> StyleCooldown), set relevant countdown CVars, and handle font/positioning safely. Hide numbers via SetHideCountdownNumbers when appropriate.
- Auras/PulseCD/BadBuffs/Announcements/HealthAlert/AFKCam: add K.IsSecret / K.NotSecret guards to avoid using secret values as table keys, doing arithmetic, or performing unsafe comparisons; drop or skip entries when values are restricted.
- Tooltip: add many guards around GUIDs, line text, unit state APIs, item links and other reads; use pcall when refreshing data to swallow secret-value errors; improve unit/target formatting to be secret-safe.
- Movers/Config: centralize AuraWatch mover invocation to a safe wrapper function and use it from UI unlock/console toggles.
- Skins/DeathRecap: robustly locate the frame and defensively hide elements, skin event entries only once.
- Auras Core: prefer SetCooldownFromDurationObject when Blizzard provides a DurationObject and style native cooldown text for aura icons.
Overall: adopt a fail-closed strategy for restricted/secret values, rely on the engine for restricted countdown data, and harden numerous modules to avoid taint/secret-related runtime errors.
- Use growthX/growthY, fix headers & friends tooltip
Replace legacy frame property keys (['growth-x']/['growth-y']) with camelCase growthX/growthY across UnitFrames (Party, Arena, Boss, Focus, Pet, Player, Target, TargetOfTarget, Nameplates) and fix a typo (initialAnchor). Clean up oUF:SpawnHeader calls by removing an extra nil argument. Improve Friends datatext by adding helper functions (getClassHex, getBattleNetRealmSuffix) to centralize class color formatting and Battle.net realm suffix handling (handles Cataclysm presence cases) and use them in menu/tooltip output. Expand Loading.lua comment to clarify temporary module disables and how to restore them. - Refactor GUI fader, add changelog & misc fixes
Key changes: introduce GUI fader helpers and update flow for action bars (SetABFaderState / UpdateABFaderState), split and add several GUI service files, and tidy GUI initialization message. Simplify and compact string concatenation and option creation in AuraWatchGUI, tighten input validation, and collapse repeated UI construction calls. Fix module variable binding in UnitframeAuras (local _, C), comment out/trim some MapReveal data entries and add a locale comment for map 1923, and apply numerous small style/robustness updates across core modules and libraries. These edits are primarily maintenance, safety guards, and UX consistency improvements. - Tooltip: refactor conditionals and re-enable mount source
Update KkthnxUI/Modules/Tooltip/Core.lua: add local reference to C_Secrets.ShouldUnitIdentityBeSecret, expand several single-line if statements into multi-line blocks in GetUnit and UnitExists for readability/safety, and re-enable the CreateMountSource tooltip module in OnEnable. These changes are minor cleanup and restore the mount source tooltip feature. - Use WOW_PROJECT_ID for retail check
Replace the oUF.isRetail conditional with a direct WOW_PROJECT_ID == WOW_PROJECT_MAINLINE check in the range Update function. This ensures the code uses the official Blizzard project ID constant to detect Retail vs Classic when setting alpha based on unit range. - Guard against secret/taint values and cache sizes
Add defensive checks and fallbacks across oUF and tooltip code to avoid taint/secret-value issues and improve robustness. Changes include: caching element widths/heights for aura and castbar positioning, guarding calls that may return secret values (using issecretvalue / K.IsSecretValue / K.NotSecretValue) in portrait, range, private/unit helpers, BadBuffs, MountSource, Tooltip modules and AuraTrack wrapper. Adjust Range logic to handle UNIT_IN_RANGE behavior and retail vs non-retail checks, use securecall for GameTooltip.RefreshData, and make UnitAura handle table-based aura data from C_UnitAuras_GetAuraDataByIndex. Miscellaneous local optimizations and safer return values added to prevent errors in combat/secure environments. - Fix tooltip border coloring and time datatext issues
Reset tooltip border on clear and apply item-quality coloring after data is populated; guard against nil and crashes. In Tooltip/Core: reset border to default in OnTooltipCleared, add UpdateTooltipBorderColor (uses pcall for GetDisplayedItem and falls back to default color), register it as an Item post-call so quality coloring isn't wiped, adjust ReskinTooltip checks, and normalize tooltip table entries to global names. In DataText/Elements/Time: fix mapAreaPoiIDs entry ([895] = 5896), add a guard in getInvasionInfo to return nil for unknown mapIDs to prevent crashes, provide fallback titles for missing localizations, and remove several unused local variables. Overall improves stability and prevents visual glitches. - Add cooldown format option & cleanup
Add a cooldown number format dropdown to the ActionBar GUI and expose a callback to update the formatter (ActionBar.CDFormat). Include default setting CDFormat in Settings.lua (1..5, where 5 disables the custom formatter). The dropdown includes descriptions and an UpdateCooldownFormat callback that calls ActionBar:UpdateCooldownFormat.
Also perform multiple code cleanups and small fixes across libraries: remove unused unpack(ns) locals, tighten nil checks and early returns in cargBags tooltip parsing, rename bag tab globals to KKUI_BagTab_ID, fix tag event string for 'status', and normalize Lua style in oUF (consistent quoting, parentheses, argcheck string literals, event/register/unregister calls and other whitespace/formatting improvements). These changes improve consistency and fix a few correctness issues in unit/nameplate/stagger handling. - Fix datatext menus, tooltip and misc issues
Rename DataText icon assets, remove obsolete .tga files, and apply multiple code fixes across modules to prevent runtime errors and clean up calls. Key changes: use K.LibEasyMenu.Create with K.EasyMenu, replace deprecated Width with SetWidth, standardize K.HideTooltip / K.Print usages (remove _G.K), fix hooksecurefunc and string.format references in QueueTimer, simplify and inline many string_format calls, adjust tooltip logic to use TooltipUtil.GetDisplayedItem and C_Item.GetItemQualityByID, and comment out large MissingStats injections/scrolling changes. These edits address nil/global reference issues and tidy formatting/feature toggles. - Add SmoothBar API and enable smoothing
Introduce Module:SmoothBar and Module.smoothbars to centralize statusbar smoothing (uses Enum.StatusBarInterpolation). Wire up smoothing for player and target health/power when C.Unitframe.Smooth is enabled. Comment out the castbar spark positioning logic in CustomTimeText and disable the AdditionalPower block in the player unit (code commented out), effectively removing those features for now. - Enhance Friends tooltip and unitframe timers
Refactor Friends tooltip data handling to use explicit game account fields and self.data, improving display accuracy and readability (character/realm/class/faction/zone/level/richPresence/wowProjectID). Add TimerunningUtil icon support, better TBC realm parsing from richPresence, faction client icons, async client texture handling, and unified grey color for inactive lines. Also normalize note and broadcast icon/formatting.
UnitFrames: adjust button cooldown behavior for raid frames (hide countdown numbers only for raid), expose cooldown text region and set font/size to match UI font. Add isRaid detection from element.__owner.mystyle.
Castbar: update spark position during casts based on elapsed/total and show/hide spark appropriately. These changes fix tooltip inconsistencies, improve cross-project realm handling, and make cast/cooldown visuals more accurate for raid and non-raid frames. - Refactor tags, actionbars, auras, chat, unitframes
Multiple small refactors and fixes across the UI:- Libraries/cargBags: fix tagDisplay logic (handle BAG_UPDATE_DELAYED), correct bag/bank/account free slot calculations, improve currency tag to accept either watched index or currencyID, consolidate currency list build, and replace atlas coins with formatted colored money strings.
- ActionBars: ensure AutoCastOverlay and lossOfControlCooldown are sized/anchored, expose UpdateCastVFX to adjust VFX masks when button size/font changes, set cooldown text font and wire up spell cast animation textures.
- Auras: tidy header/mover calls, comment out unused GetSpellStat, tweak timer/cooldown font and settings, minor formatting/whitespace cleanups.
- Chat: use K.LibEasyMenu create call, compact tooltip line creation, preserve whisper reply behavior and flash/tab logic on received whispers.
- Load_Modules.xml: disable oUF_DebuffHighlight script include.
- Tooltip: show full unit name including server for caster in tooltip.
- UnitFrames: remove a debug print and comment out DebuffHighlight creation for several unit templates (party, party pet, raid, simple party, focus, pet, player, target) to avoid creating overlay textures by default.
Overall these changes improve robustness, visual consistency, and formatting while removing noisy debug and unused highlight layers.
- Fix unitframes, range, tags, tooltip, loot
Multiple fixes and small refactors across unitframes, tooltip, loot and tags:- Libraries/oUF/ouf.lua: Guard initObject against nil objectUnit and reorganize registration/creation flow to avoid nil-related issues.
- Modules/Loot/Core.lua: Replace SetWidth with :Width and simplify sizing logic for the loot frame.
- Modules/Tooltip/Elements/MountSource.lua: Prevent nil text comparisons and sanitize text using K.NotSecretValue before comparing.
- Modules/UnitFrames/Core.lua: Remove redundant nil arguments from oUF:SpawnHeader calls and add a debug print in OnUnitInventoryChanged.
- Modules/UnitFrames/Elements/Range.lua: Respect global range setting, handle nil unit, use MinAlpha/MaxAlpha fallbacks, and invoke PostUpdate with an in-range boolean; improve range alpha selection logic.
- Modules/UnitFrames/Elements/Tags.lua: Add CheckUnitStatus helper to filter secret/invalid values and apply it to AFK/DND tag checks.
These changes fix potential nil/value issues, make alpha behavior more robust, and sanitize text/status checks to avoid incorrect displays.
- Add AutoKeystoneStart and modernize APIs
Introduce a new AutoKeystoneStart feature (moveable countdown button with optional announcements and ready-check integration) and wire it into the module loader and settings. Add locale strings and new settings flags (AutoKeystoneStart, AutoKeystoneStartAnnouncements). Commented-out GUI switches added for the new feature.
Also modernize and harden several APIs and tooltip handling:- Update chat setup in Core/Install.lua to use ChatFrame_RemoveAllMessageGroups/ChatFrame_RemoveChannel/ChatFrame_AddMessageGroup instead of deprecated AddChatWindow*/RemoveChatWindow* functions.
- Add Automation/Elements/AutoKeystoneStart.lua implementing the countdown, announcements, ready-check display and start action using C_ChallengeMode.StartChallengeMode.
- Update tooltip modules to use modern Blizzard APIs (C_Item.GetItemCount, C_Item.GetItemInfo, C_SpellBook.IsSpellKnown) and TooltipDataProcessor for currency/item/toy handling. Refactor aura handling to be more robust and show caster info safely; improve string handling (strmatch/format) and skip secret values.
- Minor UI/text tweaks and safety checks throughout.
These changes add the Mythic+ start utility and bring code up-to-date with current WoW API practices while improving tooltip reliability.
- Add decor filter; tidy ExtraGUI formatting
Inventory: add new FilterDecor default (true), remove FilterKeystone option and deduplicate/move FilterLegacy. ExtraGUI: add corresponding "Filter Decor Items" switch in the inventory extra config and perform extensive code cleanup/formatting — collapse multi-line function calls and string concatenations into single-line calls, compress tooltip AddLine/setText calls, and tidy layout of CreateSlider/CreateSwitch/CreateTextInput/CreateDropdown usages. Changes are primarily stylistic with the functional addition of the decor filter and removal of the keystone filter. - Refactor chat rename & add channel abbreviation option https://github.com/Kkthnx-Wow/KkthnxUI/issues/106
Add ChannelAbbr dropdown to chat GUI and set new Chat defaults (ChannelAbbreviation, TimestampFormat) in settings; add localization strings for channel abbreviations and modes. Large refactor of Modules/Chat/Elements/Rename.lua: replace the old AddMessage hook with a non-tainting ChatMsgFilter, add timestamp handling, URL highlighting, dedup cache, author logo injection, colon removal logic (CN/en), and flexible channel abbreviation (letter vs locale modes) with localized mappings. Minor fixes: use K.SendChatMessage and secret-value filtering in ItemAlert to avoid tainting/redundant alerts; handle AuraUtil.UnpackAuraData in BadBuffs to safely extract aura name/spellId; guard range check with K.NotSecretValue in Range.lua. Overall this cleans up chat rewriting, improves safety against taint/duplicate processing, and exposes the channel abbreviation option to users. - UnitFrames: refactor range, portraits, & cleanup
Refactor and clean up unitframe code:- Range: move UpdateRangeSpells to Module and wire PLAYER_ENTERING_WORLD and UNIT_INVENTORY_CHANGED (equipment change) to refresh spell lists; improved UnitSpellRange/FriendlyInRange/Update logic and return semantics to avoid ghosting and better handle phase/secret values.
- Core: add GetInventorySlotInfo/GetInventoryItemLink usage and inventory-change handler to trigger range updates.
- Removed castbar latency/lag string logic and the ToggleCastBarLatency helper.
- UI elements: normalize aura growth keys from "growth-x"/"growth-y" to "growthX"/"growthY" across units; collapse multi-line SetSize/SetFont calls to single-line for consistency; inline minor boolean/expr simplifications.
- Misc: remove commented-out dead code and small style/format fixes in nameplates, portraits, and various unit files.
Overall this cleans up legacy code paths, fixes range spell update triggers, and standardizes formatting and growth key names.
- Add combat animation and refactor castbar colors
Introduce a new CombatAnimation miscellaneous module (with animations, config and registration) and accompanying GUI switch, default setting, and locale strings. Add related media assets and load the script via Load_Modules.xml. Refactor UnitFrames color handling: add a GetColor helper, make SetStatusBarColor more robust, update PostUpdateClassPower to use GetColor, and rework castbar color logic to use CreateColor/SetRGB from K.Colors.castbar, simplify failed/interrupted coloring, and use C_ClassColor for interrupted source formatting. - Refactor config/UI code and colors MIDNIGHT RAWR
General cleanup and refactor across the UI: formatting and multiline wrapping for readability, improved input validation in Border:GetTileCount, replaced the manual SetIgnoreParentAlpha implementation with a proxy method, and tightened tooltip/tooltip text formatting. Colors.lua was reworked to attach custom colors directly onto oUF.colors (including a clearer oUF-not-found message and a fallback color) to ensure consistent color usage across oUF elements. Config changes: removed the Announcements.HealthAlert option and commented out the SmoothAmount setting and its slider in the GUI. Minor behavior/UX tweaks in AuraWatch/ExtraGUI (string concatenation, chat output formatting, toggle logic). Also removed KkthnxUI/Libraries/cargBags/mixins-add/itemkeys/equipSets.lua. These changes improve safety, maintainability, and consistency with oUF and existing proxy patterns. - Various updates and fix castbars. Castbars are not finished but they work?
- Disable various modules broken in 12.0
- Start Midnight updates and fixes
A lot of things were done here. Still a lot to go. This is not a release. Expect bugs and issues. - Refactor and enhance UI config, borders, and changelog
Refactored core API, border, and changelog modules for improved maintainability and documentation. Enhanced BadBuffs filter logic, added new auto quest IDs, and updated unitframe aura tracking. Added support for custom mute sound IDs in the GUI and settings. Adjusted default simple party frame sizes. Improved code comments, structure, and error handling throughout core files. - Optimize Friends DataText panel updates and sizing
Refactored the Friends DataText module to improve update efficiency and UI responsiveness. Added dirty flag logic to rebuild friend tables only when necessary, ensured proper panel resizing, and prevented redundant SetSize calls. Enhanced scroll handling and initialization to avoid UI glitches and maintain accurate display of online friends. - Refactor rare alert and friends modules
Renamed Announcements config key from AlertInWild to AlertOnlyInWorld for clarity and updated all references. Refactored RareAlert logic for better cache management, event handling, and code readability. Improved Goodbye automation channel selection and message handling. Enhanced Friends data text module with more robust sorting, display, and tooltip logic, and fixed various edge cases. Minor improvements to Gold data text for class icon handling and bag slot formatting. - Refactor AddOns handling and improve GUI utilities
Modularizes AddOns profiles into dedicated files and XML, adds Hekili skin support, and refactors AddOns logic for maintainability. Improves ExtraGUI and widget creation by using a unified widget factory, optimizes table recycling and path utilities to reduce GC churn, and updates command and function APIs for modern WoW compatibility. Also includes minor .gitignore and config updates. - Refactor chat frame function usage in installer
Replaced global chat frame functions with ChatFrame1-specific methods for adding/removing channels and message groups. This improves clarity and ensures operations are performed on the intended chat frame instance. - Bump version to 10.6.7 in TOC files
Updated the version number in KkthnxUI.toc and KkthnxUI_Mainline.toc to 10.6.7 for the latest release. - Update for 10.2.7 API and improve chat/actionbar handling
Bump Interface version to 110207 for 10.2.7 compatibility. Replace deprecated ChatFrame_SendTell and ChatFrame_SendBNetTell with ChatFrameUtil equivalents throughout the codebase. Add housing mode handling to action bar bindings and register for HOUSE_EDITOR_MODE_CHANGED. Adjust micro menu bar width and update chat event hooks for new API. - Optimize UI performance and add Hekili skin support
Improves memory management by using weak tables and singleton frames, throttles aura timer updates, and reuses UI elements for better efficiency. Adds new skin support for the Hekili addon and updates module loading accordingly. Fixes minor bugs, enhances grid layout logic, and improves tooltip reliability and item level cache management. - Update for new patch compatibility and bug fixes
Adapted MainMenuBar assignment for patch changes, added HousingMicroButton to micro menu, improved AuraWatch event handling for target changes, removed outdated guild news fix, commented out problematic chat hooks, and refactored inventory bank purchase button logic for better compatibility with new bank panel structure. - Refactor grid layout logic for button arrangement
Simplified the grid layout function by removing the visibility-based counter and related logic, and using a more straightforward approach to calculate button positions and total dimensions. This refactor improves readability and maintainability while preserving the layout's functionality. - Add keystone filter and enhance developer tools
Introduces a Mythic Keystone filter to inventory with configuration, GUI, and bag logic. Refactors and expands developer slash commands for easier debugging and frame inspection. Improves automation goodbye logic, chat friend status formatting, and minimap menu button handling. Also fixes bag container ordering and minor UI consistency issues. - Add new options and anti-spam improvements
Introduces new configuration options for SimpleParty frames and WorldMap waypoint auto-open. Improves anti-spam logic for quest progress and rare alerts, refines chat prefix rewriting, and enhances inventory custom item/junk handling. Also adds throttled OnUpdate for GUI panels and various bug fixes and code cleanups. - Clean up unused variables and simplify item button logic
Removed unused local variables and functions from several files to improve code clarity and maintainability. Simplified the ItemButton:New method by removing special handling for bank and reagent bank buttons, and updated filter logic to use pairs instead of ipairs. Also removed redundant initialization call in Inventory/Core.lua. - Add Perks Theme overlay helper and integrate with UI
Introduced a reusable Perks Theme overlay helper in Functions.lua, allowing themed overlays to be attached to frames. Integrated this overlay into the Changelog and GUI main frame. Improved the inventory module's upgrade arrow logic for better compatibility and responsiveness, including fallback to Blizzard's API and throttled updates when upgrade data is not immediately available. - Add Legion raid and dungeon debuffs to PvE tracking
Expanded the C.DebuffsTracking_PvE table to include debuffs from Legion raids (Antorus, Tomb of Sargeras, Nighthold, Trial of Valor, Emerald Nightmare) and Legion dungeons, including Mythic+ affixes. This update improves aura tracking for Legion content. - Remove extraneous 'end' in Filters.lua
Deleted an unnecessary 'end' statement in the GetFilters function to fix syntax and prevent potential errors. - Update debuff tracking lists for PvE and PvP
Expanded and updated the PvE and PvP debuff tracking lists in UnitframeAuras.lua with new dungeon, raid, and affix debuffs for The War Within and previous expansions. Adjusted priority values, removed redundant spell entries, and improved function signatures for better stack threshold handling. Also replaced K.ClearTable with table.wipe in AuraWatchSpells.lua for consistency. - Update README.md
- Add option to hide player level at max level
Introduces a new setting to automatically hide the player level text when reaching maximum level. Updates configuration, GUI, localization, and player unit frame logic to support this feature. Also adds an option for enhanced unit popup menus and refactors character/inspect frame skinning for improved performance and maintainability. - Update to version 10.6.6 with new features and fixes
Added changelog entry for version 10.6.6, introducing compact party frames, chat buttons, improved phase indicators, and various performance and bug fixes. Updated TOC files to reflect the new version. - Refactor installer and improve tutorial UX
Optimizes installer logic with local caching, reusable tables, and improved memory management. Refactors tutorial and welcome screens for better readability and localization, adds color-coded tutorial pages, and streamlines social/community buttons. Updates automation duel decline logic to handle PvP and pet duels separately. Improves GUI config to trigger duel decline updates on option change. - Add SimpleParty compact party frames
Introduces a new SimpleParty (raid-style compact party frames) option with configuration, GUI, and implementation. Updates party frame logic to support both traditional and compact layouts, adds related settings, and improves phase indicator and range logic for better handling of phased units. Also refines UI skinning and tag icon sizes. - Add chat buttons for copy, config, and roll features
Introduces new chat frame buttons for copying chat, quick config access, and rolling a random number. Updates configuration and localization files to support these features, and refactors button creation and positioning logic for dynamic enable/disable based on settings. Also updates slash command registration and enhances LibActionButton with spell cast VFX event handling. - Update LibActionButton-1.0.lua
- Update SlotItemLevel.lua
- Update Gold.lua
- Push toc
- New Changelog and more updates.
- Update Guild.lua
- Update GUI.lua
- Fix scrappingUI error.
- Various updates.
- Update TOC
- Update implementation.lua
- Fix bank/warband bank not updating.
- Can move datatext now.
- Fix raid/party vis
Couple of fixes from discord reports here. Working on fixing bags next. - add 2 ISNEW tags
- Revert back to unfit lib
The tooltip scan was causing a lot of issues. We revert from that back to how we used to handle it. Only difference is we directly change the icon now instead of an overlay texture. - KkthnxUI: Epic loot drop!
KkthnxUI just got a mythic raid upgrade! 103 files, thousands of lines, turbo-charged performance, and shiny new features. Your UI’s now strutting through Azeroth like it looted a legendary from the Lich King himself—faster, flashier, and ready to crit! - Update WowHeadLink.lua
- Updates.
- Update MicroMenu.lua
- Updates.
- Update GUI.lua
- Various updates and revamps in GUI
- More config update and fixes.
- More fixes.
- Merge more config options. Fix install issue.
- Update bank and map reveal
- Convert more options/settings to new config.
- MAJOR UPDATE/CHANGES
Nothing is promised... - Improve stability and taint safety across modules
Added developer for TWW Beta. Error logging in Init.lua is now debug-only to reduce spam. LibActionButton overlay handling now checks for ActionButtonSpellAlertManager. Chat rename strings are applied immediately. Inventory filter functions now safely access the database. Loot tooltip code is protected to avoid taint. CharacterFrame item level font styling is now hooked more safely to avoid taint. Nameplate quest indicator logic is simplified and optimized, removing cache/throttle and improving tag updates. - UI: MicroMenu, Collect Buttons, and GUI Scrollbar Improvements & Bugfixes
- Improved MicroMenu: Replaced OnUpdate mouse detection with efficient timer-based fade logic, added proper cleanup, and enhanced mouseover handling for better performance and UX.
- Collect Buttons: Added auto-close functionality (timeout and mouse leave), improved table management, and ensured proper cleanup when toggling the feature.
- GUI: Fixed main window scrollbar being unclickable by raising its frame level above widgets; reviewed for widget overlap and sizing issues.
- General: Code cleanup, improved resource management, and added more robust enable/disable logic for UI modules.
- No taint or performance issues found; code reviewed for maintainability and future extensibility.
- Performance
- Fix badbuffs and skipcinematic
Improve the border logic.
Try to improve memory performance with AW - Bump toc.
- These do not need to be there!
- Getting back on track. You can delete profiles now!
Refactored range for frames.
Added delete profiles
Fixed profile always being blank.
Cleaned up. - Various updates.
Some things might have been reverted that is okay. I have a ton of work todo. - Spring BREAK!
- More updates.
- Things work again 🐶
- Sure, this is not a good idea 🐶
- Updates and fixes.
- 😵
This mod has no additional files

