v3.14.0
3.14.0 (2026-03-03)
⚠️ Breaking change: HTML classes for preferences and page actions have changed in this release. If your wiki caches HTML output, it is recommended to purge the cache after updating.
Highlights
- 🔌 Extensible preferences system
The preferences panel has been rewritten in Vue 3 and now supports programmatic registration. Extensions and gadgets can add their own preferences viamw.hookor PHP config providers. - 🌙 Image dimming in dark mode
A new toggle in the Appearance section lets users reduce the brightness of images when using dark mode. - 🔘 Header and page action button cleanup
Header and page action buttons have been migrated to Codex button classes, and CSS-drawn icons have been replaced with inline SVGs.
Changelog
Features
- CdxButton: ✨ use focus-visible instead of focus for more subtle appearance (by @alistair3149) (f16983b)
- core: ✨ migrate header and page-action buttons to Codex button classes (by @alistair3149) (80c4451)
- icons: ✨ replace CSS-drawn icons with inline SVG animations (by @alistair3149) (2813dc8)
- preferences: ✨ add extensible config utilities (by @alistair3149) (997bec2)
- preferences: ✨ add image dimming preference for dark mode (by @alistair3149) (7fe7437)
- preferences: ✨ add mw.hook register API for programmatic registration (by @alistair3149) (bf96e85)
- preferences: ✨ add PHP config provider for on-wiki overrides (by @alistair3149) (2d4a31c)
- preferences: ✨ convert preferences panel from vanilla JS to Vue 3 (by @alistair3149) (f1203b1)
- toc: ✨ add CitizenComponentTableOfContents PHP component (by @alistair3149) (a19c53a)
- VisualEditor: ✨ style edit categories button (VE 1.45) (by @wlft) (#1285) (220d7e2)
Bug Fixes
- ApiWebappManifest: 🐛 prevent logoSize variable leak between loop iterations (by @alistair3149) (2766f6d)
- CdxButton: 🐛 correct focus styles (by @alistair3149) (f2df13a)
- CitizenComponentUserInfo: 🐛 use DOM manipulation for username replacement (by @alistair3149) (f9c2634)
- core: 🐛 defer OutputPage modifications to rendering phase (by @alistair3149) (98eb1e7), closes #1272
- performance: 🐛 cache GPU detection result for no-GPU users (by @alistair3149) (6a71c67)
- preferences: 🐛 persist custom preference values across page loads (by @alistair3149) (aed32e3)
- scrollObserver: 🐛 store throttled scroll handler to fix event listener leak (by @alistair3149) (ea8aeea)
- SkinCitizen: 🐛 guard setSkinTheme() against invalid config values (by @alistair3149) (ecac37a)
- speculationRules: 🐛 convert to factory pattern and fix namespace exclusion (by @alistair3149) (4d5f6a9)
- TemplateData: 🐛 hide edit button sqaure brackets (by @wlft) (5b90d20)
- tests: 🐛 remove deprecated ReflectionMethod::setAccessible() calls (by @alistair3149) (77ff958)
- tests: 🐛 standardize test file namespaces to match directory paths (by @alistair3149) (4291772)
- toc: 🐛 guard against missing number-section-count key (by @alistair3149) (3e95e52)
Performance Improvements
- SkinHooks: ⚡️ cache inline script minification across requests (by @alistair3149) (3de603b)
Miscellaneous Chores
- 🔧 clean up export-ignore and gitignore (by @alistair3149) (7c59637)
- 🔧 migrate from husky to lefthook (by @alistair3149) (98137de)
- 🔧 remove unused phan dependency and config (by @alistair3149) (82afe5d)
- CitizenComponentPageFooter: 🔧 remove stale FIXME comment (by @alistair3149) (abac982)
Full Changelog: v3.13.0...v3.14.0