8.5 KiB
Aurora Admin v2 — Project Status
Last updated: 2026-07-03
What this project is
A ground-up rebuild of the "uiXpress" WordPress admin-theme plugin, relaunched
as Aurora Admin. The original plugin's look/feel and feature set are the
target, but no original code is reused — all Vue components, PHP classes,
Tailwind config, and build tooling are freshly written. This lives in
aurora-admin-v2/ (the earlier in-place rebrand attempt, aurora-admin-working/,
is superseded and no longer the active codebase).
Workflow rules established
- Always verify live in Chrome before declaring a fix done — the user was
burned by blind-iteration guesses costing time/money. Use the Chrome MCP
tools (
tabs_context_mcp,navigate,computer/screenshot,javascript_exec) to inspect real DOM/computed styles rather than guessing from source. - Zip packaging: Windows
Compress-Archivecorrupts the WP upload (backslash path separators break PHP's unzip). Always build the zip via PowerShellSystem.IO.Compression.ZipFile, normalizing every entry path with.Replace('\', '/'). Output goes toaurora-admin-v2-dist\aurora-admin\aurora-admin-v2.zip. - Old build caching gotcha: WordPress serves whatever plugin files were last
installed — if the user says "didn't fix it," suspect a stale zip still
installed before suspecting the code. Verify the live script hash via
document.querySelector('script[src*="dashboard"]')when in doubt. - Site under test:
http://admin.local/wp-admin/.
Architecture
- PHP (
admin/src/..., namespacedAuroraAdmin\...), bootstrapped fromaurora-admin.php, instantiated inadmin/src/App/AuroraAdmin.php. - Vue 3 app (
app/src/...), Vite multi-entry build →manifest.json, read byadmin/src/Utility/Assets.php::enqueue()which also walks the manifest'simportschain to pull in shared-chunk CSS. - Single global stylesheet:
app/src/shell/shell-frame.css— defines all--aurora-*CSS variables (incl..aurora-darkoverrides) and the only rules that touch WP structural IDs (#wpcontent,#wpbody-content). No element resets/utility classes leak onto native WP pages (this was the root cause of the original rebrand's Tailwind-leakage bug — avoided here by design). - Immersive shell (
admin/src/Shell/Shell.php+app/src/shell/SiteShell.vueSidebar.vue+Toolbar.vue): hides native WP chrome, mounts a Vue sidebar/toolbar on every admin page.MenuSerializer.phpconverts WP's$menu/$submenuglobals into JSON for the sidebar.
- Dashboard takeover (
admin/src/Pages/DashboardTakeover.php+app/src/pages/dashboard/Dashboard.vue): hijacks nativeindex.phpviain_admin_header, hides the native.wrap, renders the Aurora dashboard in its place. 12-col grid; cards are single<section class="aurora-card">elements with inlinegrid-column: span N(NOT wrapped — component attribute fallthrough for styles was unreliable). - Settings page (
admin/src/Pages/SettingsPage.php+app/src/pages/ settings/Settings.vue): owns the top-level "Aurora Admin" admin menu directly (no submenu). Two-box layout:.settings__nav(category list) +.settings__content(fields), both boxed/bordered on a darker backdrop. Field schema is declarative inapp/src/pages/settings/settingsConfig.js, rendered byapp/src/pages/settings/components/SettingsField.vue(types: text, toggle, color, image, repeater, multiselect, segmented, remote-sites). - Settings persistence:
admin/src/Options/Settings.php— partial-payload save viamerge_on_save()sanitize callback (merges into existing option, doesn't overwrite).Settings::get_safe()stripslicense_keyand remote site passwords for use on non-admin-gated pages;Settings::get()(full) only used on the manage_options-gated settings page itself. - Global search:
app/src/shell/components/SearchModal.vue, Ctrl+K, debouncedwp/v2/searchREST calls, gated ondisable_global_searchsetting. - Remote site switcher: toolbar dropdown, gated on
canSwitchSites(fromremote_site_switcher_capabilitysetting) + non-emptyremote_sites. - Scheduled content:
app/src/pages/dashboard/cards/ScheduledContent.vuecalendar cells (squares, date top-left, count centered) are clickable — navigate toedit.php?post_status=future&aurora_day=YYYY-MM-DDif that day has scheduled posts, else show a toast ("no scheduled content"). Server side:admin/src/Posts/ScheduledDayFilter.phpfilters theedit.phpquery viapre_get_postsand prints an info notice. - Analytics:
admin/src/Analytics/Analytics.php(first-party pageview tracker, own DB tablewp_aurora_admin_pageviews, bot detection, gated onenable_analytics/track_adminssettings) +admin/src/Rest/AnalyticsData.php(aggregation REST endpoint: totals, series, device/referrer/country breakdowns, bounce rate, active users). - White label:
admin/src/WhiteLabel/WhiteLabel.php— custom favicon, rename plugin in Plugins list, rename top-level menu item, gettext find/replace viatext_replacementssetting. - Native page dark styling:
admin/assets/native-dark.css(large static sheet, all rules gatedhtml.aurora-dark.aurora-ready, scoped under#wpbody-content) +admin/assets/native-enhance.js(progressive JS enhancement — currently onlyenhanceUpdates(), which groups the flat Updates page sections into.aurora-native-cardwrapper divs onbody.update-core-php).
Key bugs fixed (root causes, in case they resurface)
.cardglobal class collision: original Dashboard cards usedclass="card", colliding with WP core's.card { max-width: 520px }, capping card width regardless of grid span. Fixed by renaming to.aurora-card*everywhere. Lesson: never use unprefixed class names on Aurora components — always prefixaurora-.- Grid-column not applying on wrapped cards: settled on unwrapped
<section class="aurora-card" :style="{gridColumn: ...}">— component boundaries ate the style binding in earlier attempts. - Two-box settings layout: took two wrong iterations (splitting header/fields instead of nav/content) before matching the user's reference image. If revisiting settings layout, re-confirm against a screenshot before assuming intent.
- Redundant outer frame border on settings page:
#wpbody-content's frame border/radius doubled up with the new two-box layout; fixed with abody.toplevel_page_aurora-adminoverride inshell-frame.cssthat drops the outer frame there only.
Current / in-progress task
User's last request: "now the updates page doesn't match the style as the dashboard page."
Status: diagnosis started but not finished. I navigated to
update-core.php and confirmed the page renders with the shell (minify
button, View Website/Dashboard icons, search, dark toggle) and that
native-enhance.js is already grouping the page into three
.aurora-native-card boxes (Current version / Plugins / Themes). I had
not yet done a side-by-side computed-style comparison against
.aurora-card (used on the Dashboard, e.g. "Recent content" / "Site Health"
cards) to find the actual mismatch — could be background shade, border
radius, padding, title typography, or hover state. No code changes made yet
for this specific request.
Next step (concrete)
Via Chrome javascript_exec, pull getComputedStyle() for a live
.aurora-card element on the Dashboard and a live .aurora-native-card
element on the Updates page — compare background-color, border-color,
border-radius, padding, box-shadow, and heading font-size/weight. Then
patch .aurora-native-card rules in admin/assets/native-dark.css (and/or
structure in native-enhance.js if the mismatch is structural, e.g. missing
a title wrapper element) to match .aurora-card in Dashboard.vue. Verify
live, then rebuild/sync to dist, re-zip, and have the user reinstall.
Not-yet-done (deferred, no active request)
- Full field sets for settings categories beyond General/Analytics/White Label (original plugin had more).
- Extending
native-enhance.jsboxing to other native screens (Tools, etc.) beyond Updates. - Porting the real license-key activation flow (built previously in the old
aurora-admin-workingproject, not yet ported to v2 — currently just a text field). - Light-mode boxing for native pages (
native-dark.css/native-enhance.jscurrently only styled for dark mode; light mode native pages are untouched WP default).