GraV-IT
← All work

2024 · Solo developer

Convention & Visitors Bureau Site

A custom WordPress theme for a convention and visitors bureau in a regional destination city, translated from Adobe XD designs. The distinctive feature is structural — it's effectively two coordinated brands sharing one codebase. When a visitor navigates into the convention-center section, the entire visual identity (header, footer, palette, navigation, mobile nav) shifts to a different presentation, with tasteful pass-through links back to the parent brand. Detection happens via a page-tree ancestry walk, not URL hacks or per-page templates.

Stack
WordPress Advanced Custom Fields Tailwind CSS PHP Sass Laravel Mix

The brief

The client is a convention and visitors bureau for a regional destination city — promoting hospitality, dining, sports tourism, and the meetings business. The reach is regional: the city sits in a metropolitan area of 4.6 million people, within one of the largest combined statistical areas in the country (18+ million). Two adjacent audiences: leisure visitors and event planners, plus a third sub-audience that warranted its own brand presentation — clients of the city’s convention center.

I built the WordPress theme from Adobe XD designs in 2024. The brief from the design side was unusually disciplined — the convention-center experience needed to feel like its own site, with its own header, footer, color palette, and navigation, while remaining technically and editorially part of the same WordPress install.

What I built

A dual-brand architecture driven by page hierarchy. The interesting piece is how the convention-center takeover happens. There’s no URL-prefix trick, no per-page-template selection, no editor-facing “is this the sub-brand?” toggle. A function runs on template_redirect and walks the current page’s ancestors looking for the designated sub-brand root page. If the current page IS that root, or has it as an ancestor anywhere in the page tree, a global flag flips on. header.php and footer.php read the flag and pick the appropriate partial; the body class gets a sub-brand modifier; a sibling rule classifies all The Events Calendar queries as sub-brand content because events live exclusively there. The editor experience is: nest a page under the sub-brand root, and the brand follows. No documentation, no template picker, no convention to remember.

Two coordinated brands, one codebase. The sub-brand partials swap the logo, the navigation menus (including a separate top-utility menu and a separate mobile nav), the color palette, the header geometry — diagonal accent shapes the main site doesn’t share — and the footer arrangement entirely. A small parent-brand CTA in the sub-brand header and a parent-brand logo in the sub-brand footer act as pass-through links — a visitor inside the convention-center experience always has a clean way back to the parent site without losing their bearings.

Adobe XD to code, with fidelity. The section library has the shape of a design system that started in XD and got translated deliberately — sections named with consistent prefixes (HERO_, CARDS_, FEAT_, GAL_, LOGOS_, SUB_, EAT_, BODY_), each one mapping to a specific composition pattern from the source designs. Tailwind utility classes hold the visual contract; ACF flexible content groups drive what an editor can compose. The result is a content-authoring experience that feels like assembling from a fixed kit of well-designed parts, not a free-for-all template.

What’s notable about it

The dual-brand mechanic is the kind of thing that’s easy to do badly — URL-sniffing if-trees, duplicated theme directories, manual flags on every page — and easy to over-engineer with brand switchers and feature flags nobody asked for. The right answer was the simplest one that respects how WordPress already organizes content: ancestor walks and a flag. The branding follows the editorial intent without the editor having to think about it. That’s what good multi-brand infrastructure looks like at the page-tree level.