lightweight tag 1e52d37dbd6c456c189edf9ac6171437af2b1865 12.0.7-b1.3.0
Author:	SolardiaX <solardiax@hotmail.com>
Date:	Wed Jul 1 18:15:14 2026 +0800

commit 1e52d37dbd6c456c189edf9ac6171437af2b1865
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 18:15:14 2026 +0800

    chore: bump to version 12.0.7-b1.3.0

commit 557e36f08c46ac9c738ade64d24ab596b0f84e6f
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 18:13:31 2026 +0800

    feat: [Options] expose the Blizzard skins toggle
    
    Add C.general.skins as a checkbox under General > Blizzard, with
    enUS/zhCN/zhTW/ruRU labels.

commit a28c82dfbbeee708bfe036a2432a474b1b280b31
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 18:13:31 2026 +0800

    refactor: [Skins] collapse per-panel toggles into C.general.skins
    
    Every port now gates on the single global C.general.skins switch (was per-panel
    C.skins.<key>); the Skins module binds SetConfigKey("general.skins"). The dead
    per-panel keys (campsites/spellbook/tooltip/parchment_remover) go with them.
    Sync SYNC.md / TESTING.md.

commit 767e77c399d8c2906c803a2de65c3bf952bc62e5
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 18:13:20 2026 +0800

    refactor: [Core] support boolean-leaf config keys; move skins switch to C.general.skins
    
    Module SetConfigKey now accepts a plain boolean leaf path (e.g. general.skins),
    not only a table with .enable. Drop the C.skins table and put the skins master
    switch at C.general.skins.

commit 890ff99e43556b36759ac1d9fde993e13d169f3f
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 17:34:12 2026 +0800

    refactor: [Skins] de-Aurora-ize the S facade
    
    Drop the S.DB Aurora constant map (ports read C.media/E.myColor directly),
    rename the facade methods (S:Reskin -> S:ReskinButton, S:SetBD ->
    S:CreateBackground, S:ReskinScroll/TrimScroll -> ...ScrollBar), unify the
    .bg/.__bg field aliases to .backdrop, and rewrite the engine comments +
    SYNC.md to describe DarkUI's own contract. Correct legacy texture mismaps:
    statusbars blank -> status, item-button pushed glow -> button.pushed,
    stepper-slider thumb spark tinted to the theme gold.

commit 08674eebb7717c01636921eb389ba7b250023a3c
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 17:34:01 2026 +0800

    refactor: [Core] drop ElvUI-compat atoms and E.media alias
    
    Remove the ElvUI-idiom geometry atoms (:Point/:Size/:Width/:Height),
    :StyleButton/:OffsetFrameLevel/:NudgePoint, and the dead
    E:GetItemQualityColor/GetClassCoords/Delay helpers; inline the two live
    callers. Drop the E.media = config alias (engine reads C.media). Fix
    StyleCheckBox highlight to the standard blank texture and de-Aurora/ElvUI
    the engine comments.

commit bada52c4eba7079934a403dc1f49f94ee0ca9c28
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 17:26:09 2026 +0800

    fix: [Quest] disable WorldQuestObjectiveTracker collapse to prevent map taint

commit a2317b3eaa19def67d8879f0ee6d47459f641165
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 17:25:13 2026 +0800

    fix: [Unitframe/Tooltip] guard isBossAura and mouseover GUID against secret values

commit 1670c1de697fa43da2e80435c7ed960bcef692d3
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 17:01:08 2026 +0800

    fix: [Chat] guard bubble GUID against secret string comparison

commit e2536a54685e6b8882bb186a3cf196a5ef3104b8
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 17:00:44 2026 +0800

    fix: [Unitframe] guard DebuffsIndicator against secret spellId

commit 5cf28485b9bb7029272b4cfc36252e391d3a26eb
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 16:50:14 2026 +0800

    fix: [Quest] remove taint-prone trackers from auto-collapse list

commit c806a364cb5c59fdedafae11f790302ca50335f1
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 16:35:05 2026 +0800

    chore: [Actionbar] format BarExp.lua

commit da084239d11e9188bc107e30dd2c4b98bffb321a
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 16:34:23 2026 +0800

    fix: [Unitframe] guard aura data fields against secret values in raid frames

commit 9044b031ee295439cc3450ce00990c46353bd20f
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 15:42:51 2026 +0800

    fix: [Actionbar] rewrite rep auto-switch with proper pattern matching and standing-change fallback

commit 513f250f974666a60664d231499f11482d279e72
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 15:24:03 2026 +0800

    fix: [Unitframe] increase boss aura offset to avoid overlap

commit f41eab650dbacac091bbf57cc0282b3a2ec2e622
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 15:08:37 2026 +0800

    fix: [Nameplate] suppress Blizzard UnitFrame re-showing in instances

commit 916527c43c6c486b1eca536d08677c6c00f2a15e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 14:02:25 2026 +0800

    style: [Options] style the DarkUI game menu button to match

commit 8a669730baeced4db05a763dc1cb9822f58397f8
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 14:02:25 2026 +0800

    style: [Menu] round edge and gradient on game menu buttons

commit 2aff43770136532df530bd1aab959e8f907500de
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 13:38:28 2026 +0800

    docs: [Skins] mark verified panels in testing checklist

commit 5875f9634ddde1ba21347631122dfa520a82b6c8
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 13:38:28 2026 +0800

    fix: [PerksProgram] inset customize button backdrop instead of nil bg

commit d0e2b9287a4adef18848c2494fa30d2bc2e5d516
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 13:38:27 2026 +0800

    fix: [Trainer] free .backdrop slot before row backdrop (dedup trap)

commit d39574383c24ad180144484c7dcc886be240ec61
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 13:14:55 2026 +0800

    fix: [Barber] inset customize button gradient and highlight

commit 359b67ffec8e204b5bff467be88875fb53086903
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 13:14:55 2026 +0800

    refactor: [Core] give reskinned buttons a child backdrop instead of self-template

commit 1544a1f7daa515cb7deada2b5c368e5e77b9de89
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 10:33:26 2026 +0800

    fix: [Skins] round icon backdrops that bypass ReskinIcon

commit 6cf17a8bd06f420a27350297c03453fc7f7b8961
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 10:29:03 2026 +0800

    fix: [Skins] chain Merchant/PVEFrame tabs at -5 to match tightened pill

commit 9e64ffea893c152a183a7dcbe84fded33104a96e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 07:49:37 2026 +0800

    fix: [GuildBank] adjust tab spacing and item/tab button borders

commit b020bc15dfc8ef6044135c0ebe492e8dd081b448
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 07:39:21 2026 +0800

    docs: [Skins] mark verified panels in testing checklist

commit 888128e06a47bde6c75263d8ebeaaa6d0ce293f7
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jul 1 07:39:21 2026 +0800

    fix: [AuctionHouse] set sell-panel input box height

commit 33601f7dcf385b8e5effa2c0c8cf48052f7bca67
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 23:14:12 2026 +0800

    fix: [Skins] port ReskinIconBorder verbatim from Aurora (atlas suffix matching)

commit f23af699917499bb82b736f48ffd8b4e9a967d47
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 23:13:42 2026 +0800

    fix: [Blizzard] hook DoubleStatusBar Setup for nameplate widget skinning

commit 1cf3f1793f8da843aad611e3e2ec90d3dbcc318e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 22:58:15 2026 +0800

    fix: [Skins] adjust Inspect tab spacing

commit e6c8080a43cba54ed8e988bb2a2bd45bc7017fe7
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 21:23:10 2026 +0800

    fix: [Skins] restore height/width args on ReskinInput

commit f05f3cc368898b520ae1fc848c34c1d154da4749
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 21:20:12 2026 +0800

    docs: [Skins] mark Merchant panel tested

commit d23cf8af6e449e9718966a1fcfc37bf2afcd07f9
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 21:20:12 2026 +0800

    fix: [Challenges] round backdrop edges on icon and party frames

commit a3d27454a47fac14828740162983be2b14633444
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 21:14:26 2026 +0800

    docs: [Skins] drop bogus right-click context menu test entry

commit 3a788ac2edbf758c37953e177c576eae8b8f3a5f
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 20:09:55 2026 +0800

    fix: [EncounterJournal] back tutorial Start button with a Contents backdrop

commit 9ac8b70b9a35cad6df1e3a21bdd0cf3145429ecb
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 20:05:23 2026 +0800

    fix: [Skins] restore Communities reward icon after StripTextures

commit 624b3b1246e2badc36619dba790a4a51e2a0ea04
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 20:05:23 2026 +0800

    fix: [PVEFrame] adjust group button icon size and offset

commit 9f4514b0612df76c1ddb3cdd0a8976d72d513a2e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 20:05:23 2026 +0800

    fix: [Skins] make ReplaceIconString take an explicit FontString arg

commit 92f26c435f000c00e735af6be9c9fb6526424d59
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 17:23:42 2026 +0800

    fix: [Skins] rework Communities list button backdrop and nudge tabs

commit 76ea64badf45de3dfa3114b42357656f2e3d1996
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 16:29:56 2026 +0800

    fix: [Skins] rework Communities list button highlight and selection

commit ee718a0306d5f378a6aa53fbff2ffe71e7dd836a
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 15:57:19 2026 +0800

    docs: [Skins] mark EncounterJournal and Achievement validated

commit f0fb46836cfa34da6ac123892fce66f307242088
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 15:56:59 2026 +0800

    style: [Skins] align AchievementFrame with portrait-frame house look

commit 2ab6e0efaeceb610b69c966ee7ac1fe5535e234d
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 15:29:44 2026 +0800

    fix: [Skins] restore EncounterJournal tutorial StartButton body

commit d8e60f8555e8893ca994c8435d332369855c3cb2
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 14:12:57 2026 +0800

    fix: [Skins] tighten ReskinTab pill inset to 5 and retune tab spacing
    
    Inset the tab pill 8->5 so it sits closer to the tab edges, retune every
    panel that chains tabs from -15/-11 to -5 (5px gap at the new inset), and
    add a CollectionsJournal heirloom-tab reposition hook so the wardrobe tab
    follows when Blizzard re-clears its points.

commit ecd91d9ee9759ea70bf7b505bd6eff4b8aee43bd
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 13:57:14 2026 +0800

    fix: [Quest] lower auto-quest button position

commit 28e07159fdea33cedd5fb696e06f62b59f46e54f
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 13:57:14 2026 +0800

    fix: [Skins] tighten CollectionsJournal tab spacing to 5px gap

commit b705e5e90b97c5a82ef9da29e218c928d9dcdc3e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Tue Jun 30 08:23:58 2026 +0800

    feat: [Skins] migrate all Blizzard panels from AuroraClassic
    
    Port 66 Blizzard built-in panels from AuroraClassic to the DarkUI Skins
    engine (S:Reskin* facades over DarkUI atoms), wired through _load_.xml,
    Config/Settings.lua skin toggles, and a rewritten TESTING.md checklist.
    
    Aurora->DarkUI field/signature reconciliation (facade compat aliases):
    - S:Reskin button: __bg = button (in-place template, no child bg frame)
    - S:ReskinEditBox: __bg = .backdrop; S:ReskinCheck: bg = .backdrop
    - CreateBDFrame(f, alpha) -> CreateBackdrop()+SetBackdropColor (19 sites)
    - ReskinCollapse: drive +/- glyph from IsCollapsed (no Aurora __texture)
    - IconSelectionFrame: hook ScrollBox Update instead of one-shot ForEachFrame
    - ItemText SimpleHTML SetTextColor needs textType arg
    - Character: StripTextures PaperDollSidebarTabs to clear DecorLeft+Right

commit d7ede68ae46b50e38344d7ebac2933863aa55f06
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 29 23:09:08 2026 +0800

    refactor: [Skins] migrate panel skinning from ElvUI to AuroraClassic
    
    Rewrite Skins/Core.lua as an AuroraClassic-style S:Reskin* engine that
    routes to DarkUI's E:Reskin*/E:Style* atoms + qb quality borders. Drop all
    32 ElvUI-ported panels and the ElvUI compat shims (Config/Media aliases,
    Core/Skin no-ops). Seed rare widget metatables (Model/EditBox/...) in
    Core/API and neutralize the throwaway EditBox focus grab. Rebuild Socket
    and Collectables from AuroraClassic source; Collectables uses quality-
    colored icon borders (pets/toys/heirlooms), Aurora-style fill selection,
    and ActiveTexture for the summoned cue.

commit 2e9f176fe9bfea21dbdd849cb884d64624136608
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 29 23:06:02 2026 +0800

    fix: [Tooltip] menu skin guard uses external table to survive frame pooling

commit f15d1783becc704affbd65c7695b8af2ce271cdf
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 29 15:34:17 2026 +0800

    docs: [Skins] add panel testing checklist

commit e4feeb5b4bb3a9afafb141dab09a01d343701d7e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 29 15:34:10 2026 +0800

    fix: [Skins] complete item-button compat and Collectables skinning
    
    Implement the full ElvUI HandleButton signature (createBackdrop + filter arrow) and expose HandleItemButton hover/pushed/checked fields, fixing filter-button arrows and toy/heirloom icons. For setInside=false, wrap the backdrop around the icon at native size instead of stretching the icon to the button, so battle-pet loadout slots no longer balloon their icon. Hide the toy slotFrame art (we don't StripTextures). Kill tutorial buttons globally.

commit 541b0c157bf8b43fe91e0fcc401747183037de48
Author: SolardiaX <solardiax@hotmail.com>
Date:   Mon Jun 29 15:34:02 2026 +0800

    refactor: [Core] unify createXXX products to bare public fields
    
    Canonize .backdrop/.shadow/.border/.overlay/.gradient as DarkUI's public single fields, each its own created-once guard, dropping the __backdrop + .backdrop dual-field aliasing. Migrate all Modules consumers to the bare names; rename Unitframe/Blizzard hand-built textures with a Tex suffix to free the bare names; remove the Menu/Tooltip menu-pool relink workarounds. Also clean no-op SetTemplate args in ports.

commit 994443fb211889c14b052c7f613d66e88bb26dd9
Author: SolardiaX <solardiax@hotmail.com>
Date:   Sat Jun 27 22:58:24 2026 +0800

    feat: [Skins] NDui-style ReskinTab (drop atlas + dark pill + gold hover)
    
    Was a no-op. Now DisableDrawLayer('BACKGROUND') to drop the Blizzard tab art
    while keeping the text layer (native selected/deselected text brightness still
    carries the active indicator), hide Left/Right/MiddleHighlight, add an inset
    transparent pill backdrop, and a theme-gold hover highlight inside it. A one-time
    hook on PanelTemplates_SelectTab/DeselectTab re-centers the tab text. Affects all
    S:HandleTab consumers (Character/AH/Collections/EJ/LFG/Professions/Merchant/…).

commit 4274f08aab299e9499280c60a8dfbffd07b5f06e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Sat Jun 27 22:49:41 2026 +0800

    feat: [Skins] unify plain-panel look with portrait frames (gradient house look)
    
    E:ReskinPanel with no opts now applies the DarkUI house look
    (E.HOUSE_PANEL_OPTS = opaque bg + gradient + regular border + shadow), shared
    with E:ReskinPortrait. So S:HandleFrame panels (ProfessionsBook, RolePollPopup,
    InspectRecipe, Communities NotificationSettings) and the icon-selection popup
    now match Macro/Merchant. Transparent container reskins (inset/navbar) pass
    explicit opts and are unaffected; chat/bags call StyleContainer directly and are
    unchanged.

commit e57866b5057a8c6f799041b013bb524469938678
Author: SolardiaX <solardiax@hotmail.com>
Date:   Sat Jun 27 22:25:20 2026 +0800

    fix: [Skins] route ItemUpgrade/Calendar/MajorFaction/WeeklyRewards main window through HandlePortraitFrame
    
    These 4 ports styled their main window with raw CreateBackdrop/SetTemplate
    ('Transparent') — ElvUI's flat semi-transparent look, inconsistent with the
    DarkUI house look (Macro/Merchant). Route each main window through
    S:HandlePortraitFrame for the exact Merchant chrome (opaque bg + gradient +
    shadow + regular edge); ReskinPortrait safely skips the hide step on frames
    without a portrait. Sub-panels keep their ('Transparent') look (matches inset).
    
    - ItemUpgrade: drop now-redundant Portrait:Hide / NineSlice:Hide.
    - MajorFaction/WeeklyRewards: drop now-redundant manual HandleCloseButton.
    - WeeklyRewards: apply container unconditionally (was parchment_remover-only);
      remove the in-block SetTemplate('Transparent') that would re-flatten it.

commit 667db64cbbf047d0ff80947f1d0f32a5d5e852dc
Author: SolardiaX <solardiax@hotmail.com>
Date:   Sat Jun 27 10:30:17 2026 +0800

    fix: [Skins] checkbox .backdrop alias + S:ReplaceIconString shim
    
    - E:StyleCheckBox now aliases frame.backdrop = bg so ElvUI ports that call
      checkbox.backdrop:SetInside() resolve (LFG role checkboxes, PlayerSpells).
    - Add S:ReplaceIconString (ElvUI parity) — ports hook it on FontString SetText;
      was nil, so hooksecurefunc errored (Stable pet info type).

commit 4eabf76f34327c6ecced4eb652e809f5ce915eb3
Author: SolardiaX <solardiax@hotmail.com>
Date:   Sat Jun 27 10:10:46 2026 +0800

    feat: [Skins] port wave 4 core large panels (7)
    
    Ported from ElvUI Mainline/Skins (v15.15): Character, AuctionHouse, Collectables,
    Professions, EncounterJournal, LFG, PVP.
    
    Compat additions (Config/Media.lua + Skins/Core.lua):
    - E.Retail, E.Border=1, E.Spacing=0, E.OtherAddons, E.Libs.CustomGlow (bundled
      LibCustomGlow), E.GemTypeInfo, E.media.normFont, E.Media.Textures.Copy (+tex_copy)
    - S:ForEachCheckboxTextureRegion, S:SetupArrow, S:SkinReadyDialog, S:OverlayButton
    
    CRITICAL fix (also retroactive to wave-1 ItemUpgrade/WeeklyRewards): ElvUI's
    SetTemplate/CreateBackdrop build .Center/.border* sub-textures; DarkUI uses
    BackdropTemplate (no sub-textures), so every backdrop.Center / X.Center deref
    crashed. Dropped all such lines. Also fixed boolean-in-frameLevel CreateBackdrop
    crashes (Collectables/SkinReadyDialog forcePixelMode arg). SYNC.md documents both.

commit 65296553e0158fc075e5d50449ab037c7c3f17f3
Author: SolardiaX <solardiax@hotmail.com>
Date:   Sat Jun 27 09:56:39 2026 +0800

    feat: [Skins] port wave 3 calendar + transmog (2)
    
    Ported from ElvUI Mainline/Skins (v15.15): Calendar (uses E:GetClassCoords),
    Transmog.
    
    Compat: E.noop (ports neutralize methods via X = E.noop) + four E.media color/
    texture aliases ports rely on — blankTex, glossTex (-> blank), backdropfadecolor
    ({0.06,0.06,0.06,0.8}), rgbvaluecolor ({r,g,b} theme). The latter two also fix a
    latent unpack(nil) in wave-1 Barber/Trainer (keys did not exist yet).
    Manual divergence: Calendar HandleEventIcon multi-arg CreateBackdrop -> default.

commit 5dedf0bfaf686b5cc47aaadf4585958d21c5ed6f
Author: SolardiaX <solardiax@hotmail.com>
Date:   Sat Jun 27 09:53:22 2026 +0800

    feat: [Skins] port wave 2 current-expansion panels (5)
    
    Ported from ElvUI Mainline/Skins (v15.15): Delves, PlayerSpells, SpellBook
    (ProfessionsBook), Menu (dropdown menus), MajorFaction (renown).
    
    Compat:
    - E:RegisterCooldown() no-op (DarkUI owns cooldown styling via CooldownManager)
    - E.global.general.disableTutorialButtons = false (keep DarkUI's hide-Ring behavior)
    Manual divergence: SpellBook profession-button backdrop uses BackdropTemplate
    (no .Center sub-texture / color callback) — create + SetOutside + SetBackdropColor;
    multi-arg CreateBackdrop allPoints dropped (SetOutside repositions anyway).

commit 2bde3cc0310dce136954796b69f72718560f8a7c
Author: SolardiaX <solardiax@hotmail.com>
Date:   Sat Jun 27 09:49:30 2026 +0800

    feat: [Skins] port wave 1 small common panels (10)
    
    Ported from ElvUI Mainline/Skins (v15.15): WeeklyRewards, Inspect, Socket,
    Trainer, Barber, Stable, ItemUpgrade, TimeManager, Binding, DressingRoom.
    
    Compat infra (reduces per-file manual divergence for all later waves):
    - E.PixelMode = true so PixelMode ternaries resolve to the pixel branch
    - E:RegisterStatusBar() no-op (no runtime media hot-swap in DarkUI)
    - E.Media.Textures table mapping common ElvUI texture keys to ours;
      copy Play/Pause/Reset tga from ElvUI for the stopwatch buttons
    - S.SetModifiedBackdrop/SetOriginalBackdrop hover handlers
    Manual divergence: Binding multi-arg CreateBackdrop -> CreateBackdrop()+SetAllPoints.
    SYNC.md + _load_.xml + C.skins keys updated.

commit b2126be712b0239510cdadf1b3c3ebc78227046e
Author: SolardiaX <solardiax@hotmail.com>
Date:   Sat Jun 27 09:20:57 2026 +0800

    fix: [Skins] clear button art with E.ClearTexture instead of empty path
    
    SetNormalTexture("") does not reliably blank atlas-based button art (the gold
    NormalTexture on FriendsFrame ContactsMenuButton survived). ElvUI overwrites with
    a transparent texture (E.ClearTexture); match that for Normal/Pushed/Disabled.

commit 4f1b124aadea18bd94cf8169bc7d496b845bc5bd
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 23:08:11 2026 +0800

    fix: [Skins] sweep leftover Blizzard art regions in S:HandleButton
    
    S:HandleButton routed straight to E:ReskinUIPanelButton, whose hardcoded region
    list misses decorative pieces (Border/Background/Center). ElvUI's HandleButton
    always runs HandleBlizzardRegions after clearing textures; match that so buttons
    like FriendsFrame ContactsMenuButton lose their gold backdrop.

commit 20e14a1de8ada51f253500296c3b28d5f8a46616
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 23:02:42 2026 +0800

    feat: [Skins] port ElvUI Friends and Communities frames
    
    Near-verbatim ports of ElvUI Mainline/Skins/{Friends,Communities}.lua (v15.15).
    Config keys C.skins.friends/communities + _load_.xml entries. Manual divergences
    (multi-arg CreateBackdrop allPoints, PixelMode offset, RegisterStatusBar drop)
    documented in SYNC.md.

commit 5667f845202d85a7231ffca43c881fba3b5af41d
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 23:02:42 2026 +0800

    feat: [Core] add NudgePoint, GetItemQualityColor, button.hover compat atoms
    
    Prereqs for the Friends/Communities ElvUI skin ports:
    - mt.NudgePoint(obj,x,y): offset existing anchor (no E:Scale, our convention)
    - E:GetItemQualityColor(quality): r,g,b from C.media.qualityColors, secret-guarded
    - StyleIconButton: button.hover alias of button.highlight (ports reference .hover)

commit 4a5c3e61a86015624f893f294f3f569481a4d77c
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 22:20:12 2026 +0800

    style: [Skins] single-line file headers, convention notes as own section
    
    House style is a one-line `-- Title` header. Trim the Skin.lua / Skins/Core.lua
    headers to that and relocate the architecture + guard-convention prose into a
    dedicated divider-framed section below the file-level declarations.

commit 4b2f51d9a87184324ec2bab50dd052d8ff4bee7a
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 21:20:11 2026 +0800

    refactor: [Skins] remove dead E:RegisterSkin dispatch
    
    The Core skin engine carried an unused ADDON_LOADED dispatch
    (themes/loaded/E:RegisterSkin/onAddonLoaded + a top-level E.Event:Register).
    Skinning is dispatched entirely by the Skins module (S:AddCallbackForAddon
    + S:OnEnable), so this was dead code and the only top-level side effect in
    the file. Drop it, plus the now-unused CreateFrame/unpack locals, and refresh
    the header.

commit ca5e3f47079eca7b4ed59b38ecc06f7420130b8c
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 21:01:59 2026 +0800

    docs: [Skins] add ElvUI re-sync guide and version anchors
    
    Add Skins/SYNC.md documenting the deterministic ElvUI->DarkUI port
    transforms (header, config gate, IsSkinned->__styled, .template->__template,
    S.Blizzard.Regions->S.BlizzardRegions), the compat layer that keeps ports
    byte-close, a perl transform recipe, and the re-sync workflow. Record the
    tracked upstream version (ElvUI v15.15) in each port header so future
    re-syncs have an anchor to diff against.

commit 1feb10161329d8cd0f297bfa038b10cc38182ebe
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 20:51:02 2026 +0800

    fix: [Skins] apply icon selector offset on first show
    
    HandleIconSelectionFrame runs from the popup's own OnShow, so the
    OnShow hook it installed for selectionOffset was added mid-dispatch and
    never fired for that first show (and the __styled guard stops re-entry).
    Apply selectionOffset directly when already shown so the popup is nudged
    beside its parent on first open; keep the hook for subsequent shows.

commit 4c2966f6b6980be4a2c34bd6657e47f776e6c604
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 20:50:36 2026 +0800

    fix: [Skins] keep EditBox caret visible
    
    A blanket editbox:StripTextures() also blanks the region the blinking
    insertion caret renders against, so focused boxes showed no cursor (text
    still appeared on typing). Mirror ElvUI HandleEditBox: hide only the named
    border pieces (Left/Middle/Right/Mid) + the NineSlice, and pull the backdrop
    left edge out a few px so the border line clears the caret's home position.

commit da1d80bd0a72214fdd947b4f2613f0dd79b05467
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 20:50:04 2026 +0800

    refactor: [Core] consolidate styling API naming and container reskins
    
    Rename the styling vocabulary so verb (Style/Reskin) + widget category line up:
    - E:StylePanel  -> E:StyleContainer   (decorated backdrop builder for any frame)
    - E:ReskinFrame -> E:ReskinPanel       (strip Blizzard panel art + StyleContainer)
    - E:StyleButton -> E:StyleIconButton   (square icon button; :StyleButton() alias kept)
    - E:ReskinButton-> E:ReskinUIPanelButton (UIPanelButtonTemplate text/push button)
    
    Route the container reskins (Portrait/NavBar/Inset) through E:ReskinPanel(opts)
    so strip+StyleContainer lives in one place. Also folds in the earlier
    consistency pass: dropdown single-impl via E:ReskinDropDown, close-button hover
    flip, __styled guard unification, Merchant repair button de-dup.

commit 6f961e1aeb57a1e48419e3b2d57fb9f3d151f76c
Author: SolardiaX <solardiax@hotmail.com>
Date:   Fri Jun 26 11:36:18 2026 +0800

    feat: [Skins] add ElvUI-style per-frame skin migration system
    
    Introduce DarkUI/Skins (S layer) ported from ElvUI Mainline/Skins:
    - Skins/Core.lua: Skins module, AddCallback dispatcher, S:Handle* compat
      layer routing to Core engine, and gap helpers (icon border/item button/
      icon selection frame) with secret-value + IsForbidden guards.
    - Skins/Frames: Gossip, Macro, Merchant, Mail, Trade, Guild ports.
    - Core/API.lua: color/frameLevel params on setBackdropEdge/createBorder/
      createShadow/createBackdrop; round/round_white + *_white edges; BACKDROP
      .button; ElvUI-compat atoms.
    - Core/Skin.lua: ReskinButton white edge, ReskinTab no-op (keep native art).
    - Remove old DarkMode Styles.lua and its blizzard.style option (conflicts
      with surgical per-frame skinning).
    - New media: border *_white / round, arrow, close, plus, minus.

commit 771accac95aa83c6d47ffad73cb6a6e482cad428
Author: SolardiaX <solardiax@hotmail.com>
Date:   Thu Jun 25 00:45:18 2026 +0800

    fix: [Nameplate] correct element creation order and highlight anchor
    
    - Move Level + ClassificationIndicator before Name in style() so
      Name:SetPoint("LEFT", self.Level, ...) doesn't reference nil
    - Use explicit SetPoint + SetSize for friendly nameOnly highlight
      instead of anchoring to Name FontString (unreliable rect)

commit 762c95ba3c36632157bd3a3b2325eead0fe5cc50
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 24 23:58:38 2026 +0800

    fix: [Nameplate] add missing spark texture and media path for friendly highlight

commit 98fe499460b1b8f25df2977d7249ae6cdfcba1f7
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 24 23:43:41 2026 +0800

    refactor: [Nameplate] overhaul with QuestIcons, ClassificationIndicator, friendly nameOnly and layout rework
    
    - Rewrite QuestIcon plugin (ElvUI-style): C_QuestLog.GetQuestObjectives + C_TooltipInfo structured tooltip, GUID cache, incremental updates, 4 icon types (Default/Skull/Chat/Item) with localized classification
    - Add ClassificationIndicator oUF plugin: elite/rare/boss atlas icons
    - Add friendly nameOnly mode: hide health/cast/auras, center name with spark highlight on mouseover
    - Rearrange top-line layout: [ClassIcon][Level][Name] ... [QuestIcons]
    - Add Highlight system via oUF event + OnUpdate polling
    - ThreatIndicator via oUF element, plateType classification in callback
    - Align CVars with ElvUI (nameplateOtherAtBase, friendlySize, etc.)

commit 57843a390975bae8d2edabcc946ce87f629fde9c
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 24 20:53:36 2026 +0800

    fix: [Core/Tooltip] global BackdropTemplateMixin patch and IsForbidden guards

commit 4db8c99e966d76adf7a66911fe5cffdc1750f483
Author: SolardiaX <solardiax@hotmail.com>
Date:   Wed Jun 24 15:41:18 2026 +0800

    refactor: [Blizzard] rewrite AltPowerBar as event-driven single StatusBar

