commit a42500f48d90e1e74972e1d2887b64d277087586
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 12 10:26:29 2026 +0800

    chore: bump to v12.0.5-b1.0.0 and update REFERENCES.md
    
    Add missing module references: Automation (ShestakUI), Bags (NDui),
    Loot, Tooltip, Blizzard, Announcement, Chat, Misc sections.

commit 98ed9fad102b28f78809738373e44f3f9371076d
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 12 09:56:11 2026 +0800

    fix: [Core] defer C.general.style reads from file top-level to OnInit
    
    Primitive values cached at file top-level are frozen before
    DB:Initialize merges SavedConfig overrides into C. Move media table
    construction and bar_border/arrow path concatenation into OnInit where
    C.general.style is guaranteed to reflect user overrides.
    
    Also fixes MirrorBar.lua referencing an undefined bar_border variable.

commit 62a3b0423be65578bd319b9f677d014050bd0ff1
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 12 07:26:38 2026 +0800

    fix: [Core] adjust default standard_font size to 14

commit 0740f64439a1bdeaf5b9970de0f5eae9591c491f
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 12 07:24:52 2026 +0800

    refactor: [Core] add DB:GetStats/SetStats and migrate all modules
    
    Encapsulate SavedStats/SavedStatsPerChar access behind DB API so
    modules no longer reference the global variables directly. This
    decouples naming and allows future extension.

commit ee5056013ce765f394e0b190b97dd3a0c806e372
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 12 07:17:10 2026 +0800

    refactor: [Core] remove E:SetVariable, use DB:Set directly

commit 9382e90d5fa449a6fd1995213318eb1dbbf1bbdf
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 12 06:58:41 2026 +0800

    chore: [Core] centralize SavedStats/SavedStatsPerChar nil guard in DB:Initialize

commit a7e171a586e521b38b2b5c7763742e805e1b96b0
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 12 00:03:13 2026 +0800

    fix: [Map] rename removeFog to revealMap and fix toggle logic
    
    The overlay textures reveal unexplored areas (not fog themselves).
    Invert semantics: revealMap=true means show reveal textures.
    Always set DrawLayer and add to textureLoadGroup regardless of state.
    Trigger full RefreshOverlays on checkbox toggle instead of SetShown.

commit 1eabf96be9dffcec3e891728de75492aae2ffd3e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 23:33:08 2026 +0800

    fix: [Core] guard SavedStatsPerChar nil on first login

commit cc3e2bddc292a1068fe422e1f5303a33e97f462b
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 23:23:10 2026 +0800

    fix: [Options] restore old GUI layout and complete ruRU locale
    
    Adjust panel to 1024x600, tabs to 200x28, content area at x=240.
    Restore slider EditBox input, dropdown gear button, Apply/Close
    bottom buttons, and backdrop-color tab highlighting. Add full
    Russian translation for all option keys.

commit deeb063ac47e0edf4bc4bf596a378326f864e9c2
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 22:55:03 2026 +0800

    refactor: [Options] split into per-module files with widget interaction logic
    
    Replace monolithic Options.lua with 14 module files under Modules/.
    Add widget registry and hook system to Core.lua for inter-widget
    enable/disable control (master switches, conditional visibility).

commit 1351ffce94269ec042c05df60e19c962bd2ce056
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 22:22:30 2026 +0800

    chore: rename SavedVariables and bump Interface to 120005
    
    - DarkUI_DB → SavedConfig, DarkUI_CharDB → SavedConfigPerChar
    - Bump Interface version to 120005
    - Use DB:Set for WorldMap fog persistence instead of SavedStatsPerChar

commit cf993958ba8c65464c4bf36c3d81d94e32d133eb
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 22:06:45 2026 +0800

    fix: [Unitframe] remove kick-on-CD castbar color due to secret value
    
    C_Spell.GetSpellCooldown always returns secret values for startTime
    in 12.0, making the kick CD detection permanently true. Remove
    CastbarKickOnCDColor and related logic, always use interruptible blue.

commit d2fa80bc70d03f4f87a66658cd63091914d14edf
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 21:50:58 2026 +0800

    fix: [Map] restore WorldMapFog checkbox and fix fog texture display
    
    - Rename WorldMapData.lua to WorldMapFog.lua
    - Add FogCheckBox to toggle fog removal on world map
    - Fix fog show/hide logic: removeFog=true hides fog textures
    - Persist removeFog state to SavedStatsPerChar
    - Default removeFog to false (fog visible by default)

commit 40db48ecaedfc8a62fe5ec8fb72f5e87e7d7e8b0
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 20:42:11 2026 +0800

    fix: [Options] use coordinate-based GameMenu button positioning above ADDONS

commit f8e2c342615c25d149650fbde43d0d1640f1de93
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 16:44:01 2026 +0800

    fix: [Options] defer DarkUI namespace access to runtime, add GameMenu button
    
    - Core.lua/Options.lua no longer access _G["DarkUI"] at file load time
    - ensureNamespace() lazily resolves E/C/L/DB on first Toggle()
    - Options.lua only uses self-contained locale globals at file scope
    - Add DarkUI button to GameMenuFrame as config entry point
    - Remove LoadOnDemand (was causing load order issues)

commit 6cec9eecb1217abbc3f897c92bcfd2b6b39eb80c
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 16:03:12 2026 +0800

    fix: [Map] keep WorldMapFrame in secure panel system to avoid taint
    
    Stop detaching WorldMapFrame from Blizzard's UIPanel system (the insecure
    SetAttribute("UIPanelLayout-*") calls) and drop the movable/drag setup.
    Tainting the frame let QuestDataProvider's protected SetPassThroughButtons
    call be blocked in combat (intermittent ADDON_ACTION_BLOCKED).
    
    Follow ElvUI's approach: only scale and re-anchor the map to cfg.position
    via secure hooks (SynchronizeDisplayState/OnShow), guarded by
    InCombatLockdown. Dragging was ephemeral anyway (never saved, reset to
    cfg.position on every show), so behavior is effectively unchanged.
    
    Also normalizes the file's indentation to the project StyLua standard.

commit c36ddd7ba06caa1ee6fcea75799c9ed2ef63beac
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 16:02:56 2026 +0800

    feat: [Core] restore Variable module for CVar initialization and /resetui
    
    - First-time setup: screenshot quality, camera zoom, tutorials, loot, nameplates, chat class colors
    - Per-login conditional CVars based on module enable state
    - Disable HelpTip tutorials automatically
    - Add /resetui slash command with confirmation popup
    - Add /resetui to Options Commands panel

commit f328f86535dd77233ffc8f4f90e47f4e70e4e826
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 15:44:20 2026 +0800

    feat: [Options] build configuration GUI panel with tab-based categories
    
    - Core.lua: panel framework, widget factory (checkbox/slider/dropdown/button), reload popup
    - Options.lua: declarative option lists for 14 categories bound to DB dot-paths
    - Locales: updated enUS/zhCN/zhTW/ruRU, removed Combat, added Automation category
    - /darkui command now opens the Options panel

commit 29a4b1c35cfbfe88ef174a5d182d7883de822eaf
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 14:52:23 2026 +0800

    fix: [Bags] restore saved position on login instead of using defaults

commit 8c9fdac25afe4aec535ae1ffc5d1947a60c40eeb
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 14:45:02 2026 +0800

    feat: [Misc] migrate Misc module with 10 sub-modules
    
    - Focuser: shift+click to set focus target
    - Merchant: alt+click to buy a stack
    - QueueTimer: LFG/PvP queue countdown bar
    - FasterMovieSkip: skip cinematics with space/enter/escape
    - TrainAll: learn all available skills from trainer
    - AlreadyKnown: colorize known recipes/mounts/pets/toys green
    - SlotItemLevel: show item level on character/inspect/flyout slots
    - TradeTabs: profession quick-switch tabs on ProfessionsFrame
    - ClassColorNames: class color in friends/communities/PVP lists
    - RaidUtility: raid leader tool panel with markers/disband/convert

commit ec7d52264f1c1858ffdf5103b7772e403ffc7e6d
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 13:28:53 2026 +0800

    fix: [Unitframe] handle secret value in misshp tag

commit 57a7805efb7eece1fe0eb5fa2629f04f3767b498
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 13:27:20 2026 +0800

    chore: [Locales] remove deprecated i18n keys and fix CHAT_INTERRUPTED format
    
    - Remove COMBATTEXT_*, DAMAGEMETER_*, PANELS_AFK_* from all locales
    - Update CHAT_INTERRUPTED to single %s format matching new Interrupt.lua
    - Remove duplicate BAG_HINT_* from Bags/Localization.lua (defined in enUS)

commit e0e7dd2004f3692455d46fd4f0f871c5de1ae6f8
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 13:08:24 2026 +0800

    refactor: [Config] clean up Settings.lua and unify position configs
    
    - Rename C.stats to C.datatext for consistency with module name
    - Remove C.combat (no module implementation)
    - Remove obsolete C.blizzard keys (hide_maw_buffs, capturebar_pos,
      battlescore_pos, quest_tracker_pos)
    - Move hardcoded positions to config: tracker_pos, vehicle_pos

commit f19142ab54e3dd0d989705f4c39e88a0ea4792b2
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 12:56:46 2026 +0800

    fix: [Loot] hide slots with unloaded data, guard against nil/secret item name
    
    fix: [Blizzard] remove WorldMapFrame from Styles darken to prevent taint

commit bdab29aeddd1bbf96d076f03c4c8d3a1c0237a89
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 12:13:40 2026 +0800

    fix: [Unitframe] remove always-visible overlay on PrivateAura anchors

commit 1db5579796dca768639bf017d73ce58069b1d529
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 11:30:21 2026 +0800

    fix: [Map] adjust QueueStatusButton position and scale on minimap

commit 49a5fd5f89830b17141c9cdae7ec00a7ef6f2679
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 10:57:24 2026 +0800

    fix: [Unitframe] restore blue castbar color and fix player castbar logic
    
    - Interruptible color back to blue (0.11, 0.58, 0.89) matching old style
    - Player castbar uses fixed blue, no longer checks kick CD
    - Unify number format in color definitions

commit 9b7ba350374e434e97c477aac62f425591feba07
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 10:37:51 2026 +0800

    fix: [Blizzard] add font color lightening to Styles, fix Vehicle and Fixes errors
    
    - Styles.lua: lighten dark text (max < 0.5) on darkened panels, warm
      tone for brown text, white for neutral; full recursive traversal
    - Vehicle.lua: replace removed VehicleSeatIndicator_SetUpVehicle with
      OnShow child iteration
    - Fixes.lua: add tonumber() guard for STATICPOPUP_NUMDIALOGS

commit 4508a6f628a19c884dae7fd262be7555ac35acdd
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 09:51:33 2026 +0800

    feat: [Blizzard] add TimerTracker skin, Vehicle reposition and ObjectiveTracker combat collapse

commit 76e426d6af363238965ba2ccaddf010f06ff7e80
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 01:01:27 2026 +0800

    fix: [Core] handle 12.0 secret values and removed CLEU event
    
    - Event.lua: pcall RegisterEvent to handle invalid/removed events
    - Styles.lua: skip forbidden frames, move WorldMapFrame to ADDON_FRAMES,
      add GossipFrame/QuestFrame dynamic content hooks and Vigor darkening
    - Interrupt.lua: migrate from COMBAT_LOG_EVENT_UNFILTERED to
      UNIT_SPELLCAST_INTERRUPT for 12.0 compatibility
    - Unitframe/Core.lua: issecretvalue check on cooldown startTime
    - DebuffHighlight.lua: issecretvalue check on dispel color alpha
    - ItemIcons.lua: handle secret string in tooltip title text
    - Fixes.lua: issecretvalue fallback for STATICPOPUP_NUMDIALOGS

commit 672ab7f32e312d0282daf45e9bf5096dc82a6299
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 11 00:20:01 2026 +0800

    feat: [Blizzard] add Styles sub-module with DarkMode core mechanism
    
    Simplified from DarkMode addon: dynamic texture discovery + SetVertexColor
    darkening with hook to prevent resets. Covers modal dialogs, panel frames,
    and addon-loaded frames. No hardcoded NineSlice paths — safe across versions.

commit 82a23696df462bd233f481a6df47cea843ef123b
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 23:14:03 2026 +0800

    feat: [Blizzard] add Blizzard module with fixes, widgets and frame tweaks
    
    Submodules: Fixes (NoTaint2, tooltip, taint patches), AlertFrames,
    AltPowerBar (ColorCurve gradient, 12.0 secret-safe), MirrorBar,
    TalkingHead, UIWidget (status/capture bar skins), Durability,
    Mail (one-click collect), MoveBlizzFrames, ShiftMark (cycle marks).
    
    Excludes EditMode (future integration) and Styles (pending audit).

commit ec3c51538e615888998d6041317d0a24c37e56ec
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 22:57:53 2026 +0800

    refactor: [Announcement] move QuestNotification from Quest to Announcement
    
    Config key moved from C.quest.quest_notification to
    C.announcement.quest_notification. Module parent changed accordingly.

commit 03ab97d150df176554b9440a58ee1d03b2ba162c
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 22:55:22 2026 +0800

    feat: [Announcement] add Interrupt announce module
    
    Uses C_CombatLog.GetCurrentEventInfo() (12.0 compatible) instead of
    removed CombatLogGetCurrentEventInfo(). Supports SAY/YELL/EMOTE/PARTY/
    RAID/RAID_ONLY channels with instance-aware routing.

commit fea769072eb02cca5fc7e6227e91e5cabd79fbd4
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 22:52:35 2026 +0800

    feat: [Automation] migrate Automation sub-modules
    
    Add AutoInvite, AutoRelease, AutoRepair, AutoSell, AutoDisenchant,
    AutoGreed, DeclineDuel, SetRole, TabBinder. All wrapped in OnInit
    lifecycle with 12.0 API updates (C_SpecializationInfo, C_Container).

commit ffd87c65c1eb59bfc109a07e02b88f0714f519ad
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 22:43:30 2026 +0800

    feat: [Quest] add Quest module with ObjectiveTracker, AutoCollapse, AutoButton, QuestNotification
    
    Migrates Quest functionality from old DarkUI codebase:
    - ObjectiveTracker: reposition, skin minimize button, difficulty coloring,
      item/progress/timer bar skins, Ctrl+abandon/Alt+share, dungeon/M+ block styling
    - AutoCollapse: NONE/RAID/SCENARIO/RELOAD modes
    - AutoButton: quest item shortcut with keybinding display
    - QuestNotification: party/raid quest progress notifications (new, from NDui)
    - AutoQuest: auto accept/complete with issecretvalue protection and 12.0 blocklist

commit 5e06ad6542ac00028df44321423a698da75477b3
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 22:36:42 2026 +0800

    docs: [Libs] record local oUF unitIsUnit secret-value patch

commit 868d25ff5ee7d674f30a5329607c864f245b27fd
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 22:34:32 2026 +0800

    fix: [Tooltip] money frame secret value taint crash
    
    Money amounts are secret values in 12.0; MoneyFrame width arithmetic
    crashes under addon taint. Replace global SetTooltipMoney with a
    coin-text AddLine (via C_CurrencyInfo.GetCoinTextureString) so all
    formatting stays in secure C code, fixing the SetLootItem crash.
    
    Also drop WorldMapRewardIcon's applyTaintWorkarounds: C_Timer.After
    does not clear taint, and globally wrapping MoneyFrame_Update routed
    every money update through tainted code, causing the crash itself.

commit b987147f9a1a6d021eb252f19fcf5be457fcf20d
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 22:34:25 2026 +0800

    fix: [Unitframe] secret-safe unitIsUnit for oUF portrait

commit e69e02c040c13dab303dd0b4abbd4f3f3bfd3138
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 20:44:13 2026 +0800

    chore: [Chat] remove unused width/height config, enable background

commit fc64296914c3155ff282ec423ac4d878b424e2e1
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 20:23:54 2026 +0800

    feat: [Core] add SetGhost API method for safe frame hiding

commit 1778db917426a28aec0f432279695d0fae46df6e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 20:23:40 2026 +0800

    refactor: [Chat] simplify VoicePanel and clean up ChatFrame

commit 3bd552a6e234bdd882c609c42f67e8a7129bd506
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 20:17:13 2026 +0800

    feat: [Loot] add Loot module with FasterLoot and GroupLoot

commit 60ccc3534206706fa6650d0961d3e048e77e2472
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 20:16:27 2026 +0800

    feat: [Chat] add URLCopy, VoicePanel sub modules and refactor ChatFrame

commit 52041ea098bbec716d9c99da3fbafc9f64900502
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 20:15:58 2026 +0800

    fix: [Core] fix nil call in ReskinCloseButton hover hooks

commit 3baf2a546bf1b282c5c939ad7fc14da4132a219a
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 19:11:11 2026 +0800

    fix: [Unitframe] guard npcID parsing for player nameplate GUID

commit 58a2e75130e396a6d4d0b0b40b914d587e7c08c7
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 06:39:50 2026 +0800

    chore: [Chat] remove unused config keys
    
    Remove background_alpha, whisp_sound, bubbles, role_icons — these
    features were either not migrated (role_icons removed for 12.0 safety)
    or have no code referencing them.

commit 517935934af1d9e3505c23f4ae10b45e8c2140d1
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 06:39:26 2026 +0800

    refactor: [Chat] rename CopyChat to ChatCopy, add enable option

commit f54406834ad71ee6a63ff56bd57a13cee6fbb463
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 06:33:49 2026 +0800

    feat: [Chat] add CopyChat sub-module from ShestakUI

commit 580b1c83740fc7a7207f94923c944b0194876f47
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 10 06:32:10 2026 +0800

    feat: [Chat] migrate module with 12.0 compatibility
    
    - Migrate Chat module from LitePanels-based architecture
    - Use E:Module("Chat") with Sub modules for proper lifecycle control
    - Remove top guards in favor of SetConfigKey + OnInit internal checks
    - Fix 12.0 APIs: GetItemIcon → C_Item.GetItemIconByID, GetItemInfo →
      C_Item.GetItemInfo, GetItemQualityColor → C_Item.GetItemQualityColor
    - Replace EasyMenu with MenuUtil.CreateContextMenu pattern
    - Add canaccessvalue() protection for AddMessage text operations
    - Remove unsafe GetColoredName hook (role icons) and
      FCFManager_GetNumDedicatedFrames override
    - Refactor DataText to match: remove top guards from Element files,
      add enable check in Inject(), use SetConfigKey("stats")

commit bdd68f9a2a11a3e2147a75ce801a75ed776db2d1
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 23:50:06 2026 +0800

    fix: [Bags] remove OnEnterWorld that caused item duplication on instance transitions
    
    The PLAYER_ENTERING_WORLD handler failed to unregister itself (passed nil
    as handler to UnregisterEvent), so it ran on every loading screen. Each
    run cleared impl.buttons tracking without removing buttons from their
    containers, then UpdateBags created new ones — accumulating duplicates.
    
    Also fix ResetNewItems to wipe before re-counting instead of endlessly
    accumulating into the persisted SavedVar.

commit 55b68ec0619f6a7bb1fec37d1c5ed49d7cafb384
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 23:43:32 2026 +0800

    fix: [Nameplate] fix customUnits lookup — store npcID as number, remove dead unitName check

commit deb93ce7dd734462fc2451035998107f0b8f7d31
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 23:29:28 2026 +0800

    feat: [DataText] migrate module from LitePanels to inline panel system
    
    Inline LitePanels panel creation logic into Core.lua, replace EasyMenu
    with MenuUtil.CreateContextMenu for 12.0 compatibility, and fix
    ToggleFrame usage. Includes 10 element files (Latency, Memory, FPS,
    Friends, Guild, Location, Coords, Durability, Bags, Currencies).

commit 1ed52809c530aad42216618d2a84309682f4fc7b
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 23:08:41 2026 +0800

    refactor: [Nameplate] remove name-based totem/healer detection, use native CVars
    
    - Remove totemData spell-name table and custom totem icon frame
    - Remove healer icon detection (healList, arena/BG checkers)
    - Add visibility config with enemy/friendly sub-tables for native CVar
      control (totems, minions, guardians, pets, minus)
    - Simplify dd:nameLongAbbrev tag (E:UTF handles secret values internally)
    - Guard UnitGUID/UnitName with canaccessvalue in callback

commit 5fe046ffb18f330bd727689eb36ae83180cae13b
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 22:25:04 2026 +0800

    fix: [Tooltip] resolve secret value taint errors in WoW 12.0
    
    - Replace GetUnit() with GetTooltipData().guid + UnitTokenFromGUID() in
      Inspect.lua and UnitRole.lua to avoid secret unit tokens
    - Replace custom health bar (BackdropTemplate) with restyled native
      GameTooltip.StatusBar to prevent backdrop taint during secure execution

commit fa24c070c3828ec72963caedc35b3bbcf0ac511b
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 17:42:01 2026 +0800

    fix: [Bags] hide all containers by default, restore UISpecialFrames for ESC close

commit 6ff9e7666f2f616fd1cf6df781f98a983e3cb66e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 17:31:34 2026 +0800

    fix: [Bags] restore C_Container function references removed during style cleanup

commit 0857a152b0228cc9d87ae260d922bc91f906f377
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 17:01:32 2026 +0800

    chore: [Bags] fix function naming — local functions use camelCase per code style

commit 2e7b7bcdd287742036bc08310a545e07319f4dac
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 16:57:42 2026 +0800

    chore: [Bags] fix code style — remove unused locals, inline constants, fix localization

commit 5988cfd692f63df3ff279805c5722a17d29c01c1
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 16:54:16 2026 +0800

    chore: [Bags] apply StyLua formatting

commit c5bd80beb4fc2e802792bd18b31d8bd236f60f88
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 13:34:27 2026 +0800

    feat: [Bags] migrate cargBags lib to 12.0 and rewrite module with E:Module system
    
    - cargBags/base/itembutton: unified ContainerFrameItemButtonTemplate, Enum.BagIndex BANK_SLOTS
    - cargBags/base/implementation: remove PLAYERREAGENTBANKSLOTS_CHANGED, simplify PLAYERBANKSLOTS_CHANGED, BAG_UPDATE by bankType, add isUpdating guard
    - cargBags/base/core: use hooksecurefunc for CloseAllBags/CloseBackpack
    - cargBags/plugins/bagBar: simplify for 12.0 bank bag detection
    - cargBags/plugins/bagWarband: nil-guard AccountBankPanel, fix styling
    - cargBags/mixins/parseBags: update bag ID mappings for 12.0
    - cargBags/plugins/tagDisplay: fix free slot calculation ranges
    - Remove locale.lua and equipSets.lua (obsolete)
    - Modules/Bags: full rewrite using E:Module("Bags") lifecycle
    - Remove ArtifactPower/Keyring/Conduit categories
    - Fix BankFrame_ShowPanel -> BankFrame.BankPanel:Show()
    - Fix DepositReagentBank -> C_Bank.AutoDepositItemsIntoBank
    - Add BagButton/WarbandButton styling

commit 753b2eb5f1947771709fbb574cd622120f65c771
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 12:04:58 2026 +0800

    refactor: [Tooltip] merge ItemLevel and Talents into unified Inspect module

commit a0a184bb947d3b7c93e23c5105cb540632c17e89
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 11:47:37 2026 +0800

    feat: [Aura] add PrivateAuras anchors at top-center of screen

commit b024c9fd9a72db294506e5d82d1d55ffa0a5b9aa
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 11:38:45 2026 +0800

    fix: [Unitframe] remove PrivateAuras from Player frame to respect fader

commit e8fbdf178eb1feafdeb795ba4ff26559106d114a
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 11:31:58 2026 +0800

    refactor: [Core] rename remaining CreateBG calls to CreateBackdrop

commit 48a620c19cef7c7868b80b98672502824fb50e2f
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 11:31:01 2026 +0800

    feat: [Tooltip] add ItemLevel sub-module and fix menu skinning
    
    - Rewrite ItemLevel for 12.0 using C_TooltipInfo API and Sub pattern
    - Fix menu backdrop accumulation via external cache and AcquiredCallback
    - Hide UNIT_POPUP_RIGHT_CLICK line from unit tooltip

commit 08462c02cb5206032708125f80bc828de1261ab8
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 10:54:53 2026 +0800

    feat: [Tooltip] migrate module to 12.0 with Sub pattern
    
    - Rewrite Tooltip.lua with OnInit lifecycle and secret value safety
    - Add Sub modules: SpellID, HyperLink, Achievement, ItemCount,
      ItemIcons, MountSource, MultiItemRef, InstanceLockCompare, UnitRole
    - Remove obsolete globals, Garrison skins, old dropdown hooks
    - Use UnitIsDeadOrGhost filter instead of secret HP comparison
    - Inline health bar with class/reaction color

commit f08d07b3848d83ca5ba9e3316ae6d3936b7c8916
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 10:10:19 2026 +0800

    refactor: [Core] unify CreateBackdrop/CreateShadow/CreateBorder API
    
    - Remove CreateTemplate (generic style-keyed) and CreateBG (alias)
    - Add CreateBackdrop(style, margin) with fixed .__backdrop cache key
    - Inline CreateShadow/CreateBorder with dedicated .__shadow/.__border keys
    - Refactor SetTemplate to use BACKDROP constants table
    - Inject CreateBackdrop to metatable replacing CreateTemplate/CreateBG

commit a232f819a34f90ee71bb5837f886e17129880468
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 10:01:02 2026 +0800

    fix: [Core] rewrite Fader with private fade system to avoid tainting Blizzard tooltips

commit 1fea917964795df60de74a6f1afd8ea99cea1515
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 09:37:29 2026 +0800

    refactor: [Core] expose Database as 4th unpack parameter (DB)

commit cc1482b8beeba4372bbd5393be9bba11b9da94e5
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 07:58:46 2026 +0800

    feat: [Unitframe] add TargetBorder and ThreatBorder to Raid frame
    
    Implemented via FrameFG.texture vertex color tinting:
    - Target: warm gold (0.8, 0.7, 0.3), highest priority
    - Threat 3 (tanking): dark red (0.7, 0.1, 0.1)
    - Threat 2 (high): dark orange (0.7, 0.4, 0)
    - Threat 1 (low): dark yellow (0.7, 0.7, 0.3)
    - Default: muted gray (0.47, 0.4, 0.4)

commit 3e84248037745bbab5d49d45d6ec91f840a137ef
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 07:43:07 2026 +0800

    feat: [Unitframe] add ResurrectIndicator and SummonIndicator to Raid

commit ccb0f717bc056cb7bdb059c3e398e11a769afb50
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 07:37:11 2026 +0800

    fix: [Unitframe] enable ShowBossDebuff in RaidDebuffs

commit bf536329a683ee3a6622990a82c177998076fab0
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 07:33:44 2026 +0800

    docs: [Unitframe] update REFERENCES for CastBar, PrivateAuras and DebuffHighlight sources

commit 6dd249aa4f7e7c799bf06cfb2fc87b728d203d4b
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 07:31:34 2026 +0800

    refactor: [Libs] rewrite DebuffHighlight with 12.0 ColorCurve API
    
    Replace manual aura iteration with RAID_PLAYER_DISPELLABLE filter and
    C_UnitAuras.GetAuraDispelTypeColor + ColorCurve. Add talent-aware
    dispel detection (Evoker Cauterizing Flame, Paladin Cleanse Toxins,
    Shaman Poison Cleansing Totem). Retain existing display interface
    (DebuffHighlight texture, DebuffHighlightAlpha, Backdrop modes).

commit 7a00ad65102debb72979bd5031bfe4a9eab34799
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 00:22:29 2026 +0800

    refactor: [Unitframe] use ExponentialEaseOut smoothing for all bars

commit 6ab048da86b5c96048a133d2debb507d1ba14132
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 00:17:08 2026 +0800

    feat: [Unitframe] add CastBar to Focus frame
    
    Positioned below self with tex_bar_border foreground overlay,
    bg fill, spark, time and name text. Width matches Health bar (94px).

commit 1ac48edcc4d8a842b9258a5195bdec5e03633677
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 9 00:04:47 2026 +0800

    feat: [Unitframe] add CastBar to Boss frame
    
    Positioned right of self with tex_bar_border as foreground overlay,
    bg fill, spark, time and name text. No icon.
    Uses core PostCast callbacks for interrupt color handling.

commit 0a6645b22164c66c2a0af1ff5b064a7f46647993
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 23:59:18 2026 +0800

    Revert "fix: [Unitframe] add Health.bg to FocusTarget and TargetTarget frames"
    
    This reverts commit 0aacd17b13d8afd7f9535dcc8f896c4dd6a4d21d.

commit 0aacd17b13d8afd7f9535dcc8f896c4dd6a4d21d
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 23:54:16 2026 +0800

    fix: [Unitframe] add Health.bg to FocusTarget and TargetTarget frames

commit a0d38dcfe7fdccd564959ce7f19918dbce7c51a7
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 23:51:51 2026 +0800

    feat: [Unitframe] register PrivateAuras on Player, Raid and Boss frames
    
    Player: top-left of self, 30px icons growing left with overlay+shadow.
    Raid: center of Health, single 20px icon with overlay.
    Boss: left side of self, 24px icons growing left with overlay+shadow.
    Also split Boss Auras into separate Buffs (above) and Debuffs (below),
    and shift boss position left to reserve space for future CastBar.

commit 41e987f6204a3f61d85e2cf7507f8b34e7643e44
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 23:05:18 2026 +0800

    fix: [Unitframe] refactor Tags.lua secret value handling
    
    Use secret-safe APIs (AbbreviateNumbers, TruncateWhenZero, canaccessvalue)
    instead of manual issecretvalue guards. Add canaccessvalue check to E:UTF.

commit a352fda4e705c737227f68ade714c76eabeb111c
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 22:40:27 2026 +0800

    refactor: [Aura] remove AuraWatch module, clean up CoolDownViewer
    
    AuraWatch (NDui-based spell/CD tracker) removed due to 12.0
    C_Spell.GetSpellCooldown API delay making CD bar tracking unreliable.
    ShestakUI Filger also disabled CD tracking for the same reason.
    
    Blizzard's built-in CooldownViewer (restyled by CoolDownViewer.lua)
    handles this functionality natively without API timing issues.
    
    Also removed CoolDownViewer's manual mover system and /aurawatch
    slash command — EditMode manages viewer positioning.

commit 7541f5437c0712e5498e4632cff4ab8cabc2b7e6
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 21:04:02 2026 +0800

    fix: [Unitframe] remove invalid SetTexCoord on CombatIndicator

commit 6ada60d2e38058d4fca7bd102cfd40742c8e43c4
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 21:03:16 2026 +0800

    docs: [Unitframe] update REFERENCES for Class.lua and Player.lua sources

commit a48558a50586bb8875ba00f74ab9f8f05b4e2339
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 20:59:25 2026 +0800

    chore: [Libs] remove stale comment in LibActionButton, enable Nameplate module

commit cec8b60542250702e394e37b3778dce7de73f05d
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 20:49:37 2026 +0800

    feat: [Unitframe] reparent Blizzard ClassPower bars and fix AdditionalPower secret value
    
    - Class.lua: reparent PlayerFrameBottomManagedFramesContainer to player
      frame, explicitly SetParent bars into container (OnShow won't fire on
      fresh login), handle UNIT_DISPLAYPOWER for druid shapeshift
    - Player.lua: fix AdditionalPower PostUpdate arithmetic crash on secret
      value by using AbbreviateNumbers (secret-safe API)

commit 09d01bb8952eead2779d60404f5a25da2b3bc3d2
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 19:38:34 2026 +0800

    refactor: [Unitframe] unify castbar interrupt color with kick CD logic
    
    - Move kickID initialization to Core.lua (shared across all UFs)
    - Remove cfg.kick_color toggle, always show kick CD state
    - Unify colors: yellow (kick ready), orange (kick on CD), grey (not interruptible)
    - Nameplate uses SetVertexColorFromBoolean at PostCastStart (secret-safe)
    - Target uses same via core.PostCastStart
    - Expose SetCastbarInterruptible/NotInterruptible as module methods

commit 2f643dfa6c308053a7891aacba1eb6f964514c98
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 18:27:26 2026 +0800

    fix: [Unitframe] align castbar callbacks with oUF 12.0 API
    
    - Remove PostCastNotInterruptible (not called by oUF), merge logic into
      PostCastInterruptible using self.notInterruptible
    - Fix PostCastStart/Stop/Fail signatures to match oUF expected params
    - Use SetVertexColorFromBoolean for secret-safe interruptible coloring
    - Add issecretvalue guard on spellID in channeling tick lookup

commit 3b4b7de62ba8ea97852e3cd9d3a2c4c1d889afd5
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 17:46:24 2026 +0800

    fix: [Nameplate] [Aura] replace manual timer and DebuffTypeColor with oUF/Blizzard APIs
    
    - Remove hand-rolled OnUpdate aura timer, use oUF Cooldown widget instead
    - Replace DEBUFF_COLORS table with C_UnitAuras.GetAuraDispelTypeColor
      (secret value safe)

commit 9133a169d047e65949363d6ce7313a9d018b4926
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 17:28:53 2026 +0800

    chore: [Nameplate] adjust default size to 160x6

commit bbd7e63d9bfd8f39b967bd7f7dacd0cdd1528a90
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 17:28:50 2026 +0800

    fix: [Unitframe] simplify Tags secret value handling and format
    
    - Remove redundant isSecretValue checks (UnitHealthPercent with
      CurveConstants.ScaleTo100 returns safe values for format)
    - Unify separator style from " | " to " - "

commit 0353646c9964c6e7d4151cde5f6952bc63d474cf
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 17:25:27 2026 +0800

    fix: [Nameplate] adapt to oUF 12.0 and WoW 12.0 secret value APIs
    
    - Add E.noscalemult definition (was missing from API.lua)
    - Replace UnitHealth arithmetic with UnitHealthPercent ColorCurve for
      low-health border coloring (secret number safe)
    - Fix ColorMixin access: use :GetRGB() instead of unpack/array indexing
    - Add bg vertex color sync for NPC health bar branch
    - Remove noscalemult from frame/element sizes (only keep for border pixels)
    - Use driver:SetSize() for nameplate dimensions (oUF default was 200x30)
    - Register callback via driver:SetAddedCallback() (new oUF API)
    - Use DisableElement/EnableElement for Power visibility control
    - Add issecretvalue guard for spellId table lookups in aura filters
    - Replace removed DebuffTypeColor with C_UnitAuras.GetAuraDispelTypeColor
    - Split castbar color into separate Interruptible/NotInterruptible callbacks
    - Fix CustomTimeText to use DurationObject:GetRemainingDuration()
    - Switch from LibButtonGlow to LibCustomGlow-1.0
    - Add QuestIcon oUF plugin (tooltip-based quest progress detection)

commit ab32a0938198bb6c22168cade827be5e2a795191
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 15:23:32 2026 +0800

    fix: [Unitframe] Power bar class-colored for non-player units
    
    - Color.lua: add all modern power tokens (FURY, INSANITY, LUNAR_POWER,
      MAELSTROM, HOLY_POWER, SOUL_SHARDS, CHI, ARCANE_CHARGES, ESSENCE,
      COMBO_POINTS, PAIN) to prevent fallback to oUF stages sub-tables
    - Target/Focus/TargetTarget/FocusTarget/Party/Raid: switch Power from
      colorPower to colorClass/colorReaction/colorTapping/colorDisconnected
    - Core.lua PostUpdatePowerColor: add safety check for color.GetRGB

commit f05c8173f3fbaf16e85bed70cd4f8025f27bb516
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 14:46:31 2026 +0800

    fix: [Unitframe] dynamic Power.bg color and castbar secret value
    
    - Add PostUpdatePowerColor callback (ShestakUI pattern) to dynamically
      color Power.bg using multiplier after each color update
    - Restore bg.multiplier on all Power bars, remove static SetVertexColor
    - Fix castbar notInterruptible secret boolean: split updateCastbarColor
      into PostCastInterruptible/PostCastNotInterruptible callbacks
    - Register PostCastNotInterruptible on Player and Target castbars

commit e3bb05af4bdd352a854f8f950a0ee388b1c38ee7
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 14:16:29 2026 +0800

    fix: [Core] restore FadeIn/FadeOut metatable injection for all frames
    
    The old API.lua injected FadeIn/FadeOut methods into the frame
    metatable. This was lost during migration, breaking castbar fader.

commit 6daf587dd56387363845fa2cfe7da0b0b465cd86
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 13:58:29 2026 +0800

    fix: [Unitframe] set Power.bg vertex color to fix white bar appearance
    
    New oUF no longer auto-handles bg.multiplier, so Power background
    texture was rendered as uncolored white. Explicitly set dark color.

commit f46a449c5ebd7d72b3acb7539c732d5df547a98a
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 13:38:55 2026 +0800

    fix: [Unitframe] adapt to oUF 12.0 aura/castbar/smoothing API
    
    - FilterAuras: fix signature for new oUF callback (element as self),
      replace deprecated fields (isStealable, sourceUnit, isBossAura)
      with isPlayerAura, dispelName, isHarmfulAura
    - PostUpdateButton: use C_UnitAuras.GetAuraDispelTypeColor instead of
      removed DebuffTypeColor global, fix secret value arithmetic
    - Nameplate aurasCustomFilter: fix data.spellID → data.spellId casing
    - Castbar PostCastStop/PostCastFail: SetValue(1) instead of nil .max
    - Power.Smooth → Power.smoothing across all unit frames
    - HealPredictionAndAbsorb → Health sub-widgets (HealingAll, DamageAbsorb,
      HealAbsorb, OverDamageAbsorbIndicator, OverHealAbsorbIndicator)
    - Fix stray '}' syntax errors in Focus.lua and PartyPet.lua

commit f2af246b81f4f0d8c92dc4f79f0960074a528f96
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 13:05:27 2026 +0800

    fix: [Unitframe] adapt aura callbacks to new oUF API
    
    - Rename PostCreateIcon/PostUpdateIcon/PostUpdateGapIcon to
      PostCreateButton/PostUpdateButton/PostUpdateGapButton
    - Fix signatures to match new oUF element:Method(args) pattern
    - Replace non-existent E:ApplyOverlayBorder with CreateOverlay/CreateShadow
    - Fix .border/.shadow references to .__overlay/.__shadow

commit 1fee39c833bb75180e441ba03c240b54ff1fa5fd
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 12:57:27 2026 +0800

    fix: [Core] use locale-defined AbbrOptions, fix dd:pp color style
    
    - Remove GetLocalizedNumberAbbreviationData (internal API, not accessible)
    - Move locale abbreviation configs to L.AbbrOptions in zhCN/zhTW
    - Function.lua reads L.AbbrOptions with fallback to default k/m/b/t
    - dd:pp tag uses WrapTextInColorCode for consistency

commit e3e4f035fd167f99d4f0e7a39d9bc122dfe69dcd
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 8 12:52:40 2026 +0800

    refactor: [Core] rename ShortValue to AbbreviateNumber, use locale API
    
    - Rename E:ShortValue -> E:AbbreviateNumber
    - Use GetLocalizedNumberAbbreviationData() for locale-aware formatting
    - Add C.general.useLocalNumberFormat toggle (true=locale, false=k/m/b)
    - Remove L.NumberCap1/2/3 from locales (no longer needed)
    - Add Debugging & Fix Strategy section to CLAUDE.md

