Repository navigation
Releases: Cidan/tv
Releases · Cidan/tv
Release list
v1.1.0
TemplateViewer
v1.1.0 (2026-10-15)
Full Changelog Previous Releases
- Forever review fixes: beta-only addons, TOC selection tests, doc corrections
- Forever clients are beta/test builds today: the wiki lists only Forever Beta and Test
at 16001. So tools/flavors.lua gives ForeverbetaOrPTR = true, and its index keeps
OnlyBetaAndPTR addons. Blizzard_PTRFeedback loads at login there, and UIPanelBugButton
is now in data/catalog_forever.lua. Retail is unchanged. Flip the flag when Forever
launches. - spec/toc_spec.lua now checks that each flavor's client would pick that flavor's TOC,
following its suffix order through the existing tv TOCs, and that the packager
discovers it (BigWigs packager v2.6.1 release.sh:1402). This replaces tests that
restated the suffix config. - ParseToc specs cover the
forevergame-type alias, in both inline and addon-level
directives. - The fake client's flavor switch is internal: only WoWMock.Reset(flavor) switches it,
so loaded addons never carry over between flavors. - Docs:
- side-effect counts per flavor (Retail 67, Forever 74);
- Forever's Camelot SharedUIPanelTemplates/NineSlice overrides;
- the Forever audit file path;
- the remaining Retail-only wording made flavor-neutral.
219 tests, luacheck clean.
- Forever clients are beta/test builds today: the wiki lists only Forever Beta and Test
- Support WoW Forever (tv_Camelot.toc, Forever catalog, per-flavor fake client)
WoW Forever is a Mainline-family client: game type camelot (alias forever), build
1.60.1.70374, interface 16001. On this machine it is the _classic_beta_ install. The
addon code needs no flavor branches. Everything tv uses exists at login on Forever, from
the same Blizzard_SharedXML Mainline files: PortraitFrameTemplate, SearchBoxTemplate,
the ScrollBox list, InputBoxTemplate, UICheckButtonTemplate, both curated templates,
C_XMLUtil and C_AddOns. Only the template catalog differs per flavor.- tv_Camelot.toc: same files as tv.toc, Interface 16001, loads data/catalog_forever.lua.
It uses _Camelot because BigWigs packager v2.6.1 recognises that suffix
(release.sh:1175, :1402), not _Forever; BetterBags ships _Camelot too. - tools/flavors.lua describes each flavor: TOC, catalog, source dir, the game types
matched by AllowLoadGameType/ExcludeLoadGameType, and what [Family]/[Game] expand to.
For Forever that's Mainline/Camelot, checked against folders like
Blizzard_EditMode/Camelot. - tools/ui_source.lua builds one memoised index per flavor (UISource.For).
tools/generate_catalog.lua writes every flavor's catalog. Forever has 3,280 templates,
708 from on-demand addons and 74 with side effects; there are 0 duplicates and 0
missing files. - install-deps.sh pins the wow-ui-source
foreverbranch (735496de, 1.60.1.70374) into
.libraries/wow-ui-source-forever. - Fake client: WoWMock.Reset(flavor) and LoadTV(flavor) fake a given flavor's templates,
addons and GetBuildInfo. GetTemplateInfo skips undefined parents, because Blizzard's
Forever data has one gap: GarrisonMissionCompleteModelTemplate inherits a template
only Blizzard_GarrisonUI defines, and that addon doesn't load on Forever. - The FrameXML fakes were checked against Forever's source. What they model is
identical, or differs only in ways tv doesn't touch: HideUIPanel's extra EventRegistry
event, PortraitFrameBaseTemplate's focus mixin and hidden children, FitToText's
padding default, and ScrollBox SmartNav.
Specs: - Both catalogs are checked for drift.
- Both TOCs are checked: files, own catalog only, Interface matches the source, and the
same file list. - Every curated entry is checked on both flavors.
- Forever index facts: [Game]=Camelot, retail-only addons excluded, inline directives
applied. - Login-inherits-on-demand and undefined-parent gaps are pinned per flavor.
- spec/forever_spec.lua runs tv end to end on Forever: window, curated renders, clean
audit, anchors.
217 tests, luacheck clean. CI fetches both sources; docs cover the flavor table and how
to add another flavor.
- tv_Camelot.toc: same files as tv.toc, Interface 16001, loads data/catalog_forever.lua.
v1.0.0
TemplateViewer
v1.0.0 (2026-10-15)
Full Changelog Previous Releases
- Release workflow: package tags with the BigWigs packager for GitHub and CurseForge
Adds .github/workflows/release.yml (tag push -> BigWigsMods/packager@v2.6.1, as in
BetterBags) and ## X-Curse-Project-ID: 1745723 so the packager uploads to the
TemplateViewer CurseForge project. CF_API_KEY / WAGO_API_TOKEN come from repo secrets;
there is no Wago project yet, so no X-Wago-ID. - List every template: generated catalog, GetTemplates merge, raw rendering, /tv audit
tv listed only its two curated templates. It now lists all of them: curated entries
first, then every template retail's UI defines, plus anything else
C_XMLUtil.GetTemplates() reports (other addons' templates).
Catalog- tools/ui_source.lua (moved from spec/helpers) now reads TOCs per the wiki's rules
(warcraft.wiki.gg/wiki/TOC_format):- TOC choice: _Standard, then _Mainline, then the plain TOC.
- Repeated AllowLoadGameType/ExcludeLoadGameType/Dep*/LoadWith lines append; LoadWith
implies on-demand; [TextLocale] expands; OnlyBetaAndPTR addons are excluded. - On-demand addons that a login addon requires are loaded at login. For example,
Blizzard_WorldMap requires Blizzard_MapCanvas, and WorldMapFrameTemplate inherits
MapCanvasFrameTemplate. A spec pins that no login template inherits an unloaded one. - It derives two global side effects per template: fixed global child names, and
Edit Mode system registration.
- tools/generate_catalog.lua writes data/catalog_mainline.lua, which ships with the
addon. It covers 3,581 templates in 779 files, 1,021 of them from 84 on-demand addons,
and flags 67 with side effects. A spec fails if the committed file is stale. - core/catalog.lua merges curated entries, the catalog and GetTemplates(). Entry
identities stay stable across rebuilds, and the list rebuilds on ADDON_LOADED.
Rendering - Uncurated templates render only on request (Render, or the Auto-render toggle).
Building one runs its scripts, and the instance can't be destroyed. - Raw instances:
- drop the events they registered during creation;
- stop taking keyboard focus if they're edit boxes;
- get sample text if they're Font, FontFamily or FontString templates;
- get a 256 fallback for any size they don't declare.
Line templates are now built with CreateLine.
- Anchoring, setup and raw preparation each run under xpcall, and their errors are
recorded. - Templates that create fixed global frames (e.g. RaidFramePreviewTemplate replaces
RaidFrameSettingsPreviewFrame) or register with Edit Mode show a warning and a
"Render anyway" button. Auto-render never builds them. - Templates from unloaded on-demand addons offer "Load " (C_AddOns.LoadAddOn).
The preview refreshes when an addon load defines the template it is showing.
/tv audit - Whether GetTemplates() lists everything the client defines is undocumented.
/tv audit compares GetTemplates(), the catalog and GetTemplateInfo, prints a summary,
and saves the report to the TemplateViewerAudit SavedVariable so it can be read from
disk after /reload.
UI - List rows: curated names in gold with their category; other templates in white with
", "; undefined templates dimmed. - The info panel gains an Addon row and falls back to catalog data for templates the
client hasn't defined yet. The footer counts templates. - Search ranks the name, then the group (category, or addon for uncurated templates),
then the description, with cached lowercase keys.
Fake client - C_AddOns.LoadAddOn loads required dependencies first, then LoadWith addons, with one
ADDON_LOADED each. IsAddOnLoaded is added. - Added UnregisterAllEvents, CreateLine, CheckButton click toggling and a
UICheckButtonTemplate fake. GetTemplates omissions can be simulated. - The fake ScrollBox realises only the visible rows, like the client.
- The new behaviours are pinned in spec/wow_mocks_spec.lua.
187 tests, luacheck clean. Docs updated: CLAUDE.md, README, .claude/rules/*.
- tools/ui_source.lua (moved from spec/helpers) now reads TOCs per the wiki's rules
- TemplateViewer: preview Blizzard XML templates the way TextureAtlasViewer previews atlases
tv is a pure (no Ace, no LibStub) retail addon that lists curated Blizzard XML frame
templates and renders a live instance of the selected one with the running client, so
it shows exactly how that client draws the template (art, fonts, atlas remaps).
Addon- core/templates.lua wraps C_XMLUtil.GetTemplateInfo. It never caches, because
load-on-demand Blizzard addons define templates when they load. - core/registry.lua validates showcase entries (template, category, description, size,
setup) and raises at the call site on typos, bad types or duplicates. - core/search.lua does plain-text, case-insensitive filtering, ranking template-name
hits over category over description. - core/stage.lua builds each template once (widgets can't be destroyed). It uses the
widget type the client reports, as Blizzard's FrameUtil.CreateFrame does; Texture and
FontString templates become regions. Instances get global names, and failed creates
or setups are captured. - ui/ is the window, built on first open:
- a PortraitFrameTemplate window with a SearchBoxTemplate and a ScrollBox list;
- a clipping preview canvas with wheel zoom, drag pan, Reset View and background
presets; - an info panel with a copyable name, type, size, inherits, source, KeyValues and
description.
The window won't open in combat and closes when combat starts (templates may be
protected). Escape closes it. /tv and /templateviewer toggle it; "/tv " opens it
searching for .
- Starter showcase: UIPanelButtonTemplate (SetTextToFit, tooltipText) and
ButtonFrameTemplate (SetTitle, SetPortraitToAsset).
Test harness (busted, Lua 5.1) - spec/helpers/ui_source.lua indexes the ~3,580 templates retail loads straight from
Blizzard's XML. It follows the client's own TOC load rules: _Mainline TOCs,
AllowLoad/AllowLoadGameType/ExcludeLoadGameType/AllowLoadTextLocale, [Family] and
[Game] placeholders, and . Every name resolves to one definition and
load-on-demand templates are flagged. - wow_mocks.lua is a fake client. Templates resolve through that index, so unknown or
LoD templates fail as in game. XML and are applied and script names
are validated per widget type. OnShow/OnHide follow visibility changes.
GetTemplateInfo reports inherited sizes. AnchorProblems flags anchor sets that real
layout would break. - framexml_fakes.lua transcribes the FrameXML tv touches (portrait frames, panel
buttons, search box, ScrollBox list, HideUIPanel), citing Blizzard source lines. - The specs cover every module, every showcase entry (against retail XML and through
the real Stage), the TOC (files listed, Interface matches the UI source build), the
fake client's own contract, and anchor consistency across the whole window.
112 tests; luacheck clean.
Tooling and docs - install-deps.sh fetches Gethe/wow-ui-source (live, 12.1.5.70391) and Ketho's
vscode-wow-api annotations into the gitignored .libraries/, pinned to commits so
local and CI runs test the same build. - CI workflows for busted with coverage and luacheck, .luacov, .luarc.json, and a
.pkgmeta ignore list. - CLAUDE.md (AGENTS.md/GEMINI.md symlinks) and .claude/rules/ document the
architecture, the showcase entry contract, the test harness, and the behaviours that
still need checking in a real client.
- core/templates.lua wraps C_XMLUtil.GetTemplateInfo. It never caches, because