promotional bannermobile promotional banner

KkthnxUI

KkthnxUI is a simplistic user interface that holds onto the information and functionality.
Back to Files

11.0.5

File nameKkthnxUI-11.0.5.zip
Uploader
KkthnxKkthnx
Uploaded
Sep 7, 2026
Downloads
120
Size
7.0 MB
Flavors
Retail
File ID
8827270
Type
R
Release
Supported game versions
  • 12.1.0

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.
  • 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.
  • 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.
  • 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).
  • 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