# NEOVANTAGE -- WordPress Blog & WooCommerce Theme

![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-blue.svg)
![WordPress](https://img.shields.io/badge/WordPress-6.0%2B-blue)
![PHP](https://img.shields.io/badge/PHP-8.0%2B-purple)
![Tested up to](https://img.shields.io/badge/Tested%20up%20to-WP%207.0-brightgreen)
![WooCommerce](https://img.shields.io/badge/WooCommerce-Compatible-96588a)
![Version](https://img.shields.io/badge/Version-2.4.0-orange)

A clean, modern WordPress blog **and WooCommerce** theme with multiple layouts, live Customizer controls, post formats, and full Gutenberg support. Launch a polished blog or a complete online store -- fast to set up, easy to make your own.

> Available free on [WordPress.org](https://wordpress.org/themes/neovantage/) | Designed, built, and maintained by [PixelsPress](https://pixelspress.com)

---

## Features

- **Multiple Layouts** -- One-column full-width, right sidebar, and left sidebar. Switch layouts per page or post.
- **Live Customizer Controls** -- Adjust colors, typography, header, background, and layout with instant live preview. No page builder needed.
- **Post Format Support** -- Standard, Gallery, Image, Video, Audio, Quote, and Link -- each with a distinct layout.
- **Custom Logo & Header** -- Upload your logo and custom header image directly from the Customizer.
- **4-Column Footer Widget Area** -- Fill your footer across four independent widget columns.
- **Cookie Consent Bar** -- Built-in GDPR-aware cookie notice with customizable text, link, and expiry. No plugin needed.
- **Breadcrumb Navigation** -- Auto-generated breadcrumbs for better UX and SEO structure.
- **Related Posts** -- Automatically shown at the bottom of every post to keep readers engaged.
- **Open Graph Meta Tags** -- Built-in OG support for clean post previews on Facebook, Twitter, and LinkedIn.
- **Preloader** -- Smooth, lightweight page preloader for a polished first impression.
- **RTL Language Support** -- Full right-to-left support for Arabic, Hebrew, Persian, and other RTL languages.
- **Translation Ready** -- Every string uses proper translation functions with the `neovantage` text domain.
- **WooCommerce Ready** -- Turn your blog into a fully-fledged online store. Fully compatible with WooCommerce, the world's most popular eCommerce platform. Shop, single product, cart, checkout, order confirmation, and the complete My Account area are styled out of the box, plus a header cart icon with a live count and a slide-in mini-cart drawer. Sell physical products, digital downloads, or services -- your store inherits the theme's colours, typography, and buttons automatically.
- **Block Editor Ready** -- Full Gutenberg support with correct block rendering, wide/full-width alignment, and editor styles.
- **Clean Code** -- Built on Underscores (\_s). PHP 8.4 compatible. WordPress 7.0 tested. Follows WP coding standards.

---

## WooCommerce

NEOVANTAGE works seamlessly with [WooCommerce](https://woocommerce.com/) -- the eCommerce platform behind millions of online stores worldwide. Activate WooCommerce and every storefront page is styled to match the theme automatically, no setup required:

- Shop and single-product pages with a refined gallery, price, and add-to-cart layout
- Cart and Checkout (classic **and** block-based), order confirmation, and the full My Account dashboard
- A header cart icon with a live item count and a slide-in mini-cart drawer
- Product reviews, related products, sale badges, and notices -- all themed out of the box

The store stylesheet loads **only** on WooCommerce pages, so blog-only sites stay lean and fast. Sell physical products, digital downloads, or services without touching a line of code.

---

## Requirements

| Item      | Minimum            |
| --------- | ------------------ |
| WordPress | 6.0                |
| PHP       | 8.0                |
| Browser   | Any modern browser |

---

## Installation

**From WordPress Admin:**

1. Go to **Appearance -> Themes -> Add New**
2. Search for `NEOVANTAGE`
3. Click **Install**, then **Activate**

**Manual / From GitHub:**

1. Download the latest release zip
2. Go to **Appearance -> Themes -> Add New -> Upload Theme**
3. Upload the zip and click **Activate**

**After Activation:**

1. Go to **Appearance -> Customize** -- set your logo, colors, fonts, and layout
2. Install the recommended **NEOVANTAGE Core** plugin when prompted
3. Start writing your first post

Full setup guide: [pixelspress.com/article-categories/neovantage/](https://pixelspress.com/article-categories/neovantage/)

---

## Recommended Plugins

| Plugin                                                                          | Purpose                                                               |
| ------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| [NEOVANTAGE Core](https://github.com/mohsin-rafique/neovantage-core)            | Post views, enhanced widgets, demo importer, customizer export/import |
| [NEO Bootstrap Carousel](https://wordpress.org/plugins/neo-bootstrap-carousel/) | Image slider for your homepage                                        |
| [Contact Form 7](https://wordpress.org/plugins/contact-form-7/)                 | Simple, flexible contact forms                                        |
| [Smash Balloon Instagram Feed](https://wordpress.org/plugins/instagram-feed/)   | Display your Instagram feed anywhere                                  |
| [AMP WP](https://wordpress.org/plugins/amp-wp/)                                 | Fast, lightweight AMP pages for mobile readers                        |

---

## FAQ

**Is NEOVANTAGE free?**
Yes -- completely free and open source under GNU GPL v2 or later.

**Do I need to know how to code?**
No. Every setting is controlled from the WordPress Customizer with live preview.

**Does it work with Gutenberg?**
Yes. NEOVANTAGE is a classic theme with full block editor support. All core blocks render correctly. Wide and full-width alignment is supported. It does not use Full Site Editing (FSE) or block templates.

**Which plugins does NEOVANTAGE recommend?**
NEOVANTAGE recommends the NEOVANTAGE Core companion plugin for additional features (post views, demo content, customizer import/export). It also recommends NEO Bootstrap Carousel, Contact Form 7, and Smash Balloon Instagram Feed -- all available free on WordPress.org.

**Is it compatible with PHP 8.x?**
Yes. Tested and confirmed clean on PHP 8.0, 8.1, 8.2, 8.3, and 8.4. No deprecated functions are used.

**Does it support child themes?**
Yes. Create a child theme to make customizations that survive theme updates.

**Is NEOVANTAGE translation ready?**
Yes. All theme strings are wrapped in proper translation functions using the `neovantage` text domain. Translate using Loco Translate or any .po/.mo editor.

**Does it support RTL languages?**
Yes. NEOVANTAGE includes a dedicated `rtl.css` stylesheet for full right-to-left language support.

**Where can I get support?**
Post in the [WordPress.org support forum](https://wordpress.org/support/theme/neovantage/) or visit [pixelspress.com/article-categories/neovantage/](https://pixelspress.com/article-categories/neovantage/).

---

## Changelog

All notable changes are listed here, newest first. Versions follow [Semantic Versioning](https://semver.org/). The **Unreleased** section collects changes that have landed but are not yet part of a tagged release.

### 2.4.0 -- 24 June, 2026

- **Feature: Premium Gutenberg block styling suite.** A pass over the core block library brings the front end and block editor up to the theme's premium design language: a rounded "code window" Code block with a copy-to-clipboard button and horizontal scroll; a card-style Table with a shaded header, row hover, and footer row; a rounded Calendar card with a brand "today" cell and post-day links; Group cards and a brand-tinted gradient Separator; an elegant Quote with a brand watermark, a light-panel Preformatted treatment, and an italic prose Verse; brand-tinted List markers; a clean rounded Search field with a brand button; and a premium Latest Posts post-card grid (featured image, date glyph, Read More) that handles every image alignment and the author byline. Each is mirrored into the editor canvas so the preview matches the front end.
- **Feature: WooCommerce blocks styled out of the box.** The standalone WooCommerce blocks now match the classic shop card -- Product Collection (including the carousel layout with brand prev/next navigation), Product Categories (image-card grid and dropdown display styles), Featured Product / Featured Category banners, the legacy product grids (Best Selling, Newest, On Sale, Top Rated, Hand-picked, Products by Category), Product Search, and the Customer Account block. Mirrored into the editor canvas where applicable.
- **Feature:** In the Shop "Show categories & products" display mode, product categories now render in their own grid above the products (under a "Shop by Category" heading) instead of being mixed into the same grid, so a category no longer reads as an incomplete product. The category cards also get a distinct treatment (brand-tinted card, a "collection" glyph, a count pill, and a browse chevron). Done entirely with hooks calling WooCommerce's own category output -- no template overrides.
- **Feature:** The sidebar widget-title accent now inherits the Customizer Background Color.
- **Fix: Editor / front-end parity sweep.** Brought numerous blocks into visual agreement between the editor canvas and the front end -- Social Links (round chips instead of stretched capsules, with no square-on-hover artefact), Calendar cell alignment, the Latest Posts grid, the File block download button, block headings, Cover heading readability, Pullquote, the Quote watermark, Verse, Preformatted, and the restored blockGap between Group children.
- **Fix:** Theme stylesheets and scripts now cache-bust on edit -- the asset `?ver=` derives from the file modification time, so CSS/JS changes are picked up without a hard refresh in the browser or the block editor.
- **Fix:** Gutenberg blocks now follow the Customizer theme colour and fonts -- block accents, link and hover states, headings, and button typography read the brand-colour and font tokens instead of hardcoded defaults.
- **Fix: WooCommerce theming corrections.** Store headings and content follow the Customizer font selections; hover and focus states follow the brand colour instead of reverting to the default cyan; the variable-product variation form stacks correctly; disabled buttons no longer flash WooCommerce purple; the store stylesheet also loads on pages that embed products via a shortcode or block; product-grid gutters and the Customer Account "Login" label were fixed; and the On Sale block buttons render as a full-bleed bar.
- **Fix:** Removed the horizontal page scroll caused by full-bleed `.alignfull` / `.alignwide` blocks (the `100vw` scrollbar overshoot is now clipped with `overflow-x: clip`).
- **Fix:** Archive and search post layouts (Classic vs List view) now apply correctly, and the "Undefined variable `$layout`" notice on the search results page is gone -- the layout value is coerced with `absint()` before comparison.
- **Fix:** Corrected the Typekit (Adobe Fonts) script enqueue -- the version placeholder is replaced with the theme version, the dependencies argument is an array, and the kit loads in the document head before first paint.
- **Fix:** Accessibility -- screen-reader-only labels (such as the editor's "Editor canvas" iframe name) no longer paint as visible text in the block editor. The standard accessible-hide rule for `.screen-reader-text` / `.components-visually-hidden` (clip-based, so assistive tech still reads them) is now shipped in the editor stylesheet, matching the front end.
- **Fix:** `neovantage-scripts.js` now declares `neovantage-library` (Bootstrap, Magnific Popup) as an explicit dependency instead of relying on enqueue order.
- **Compat:** Raised the minimum required WordPress version from **5.3 to 6.0**. The theme now relies on block patterns (auto-loaded from the `patterns/` directory in WP 6.0+) and `theme.json` design tokens, so 6.0 is the genuine floor.
- **Compat:** Mirrored the premium Product Categories block grid into the Gutenberg editor so the canvas matches the front end.
- **Refactor:** WordPress Coding Standards / PHP 8.4 hardening pass over `functions.php` (doc-comments, return types, `str_contains()` for the product-detection checks, and a guarded DOM lookup for the Latest Posts read-more injection). No behaviour change.
- **Performance:** Removed the unused Google Code Prettify script (`js/run_prettify.js`, ~34 KB) and its enqueue. It loaded on every page but nothing referenced it, and it pulled assets from the long-dead rawgit.com CDN; the premium Code block now covers code styling. One fewer request and ~34 KB less JS per page. The small Code-block copy-to-clipboard script was also folded into the main theme script, removing another file and request.
- **i18n:** Regenerated the translation template (`languages/neovantage.pot`) for 2.4.0 -- it now includes the Code block copy button (`Copy` / `Copied!`), the Latest Posts `Read More` link, and strings accumulated since it was last built.
- **Docs:** The theme description now positions NEOVANTAGE as both a content-first blog and a fully styled WooCommerce storefront, rather than blog-only.

### 2.3.0 -- 5 June, 2026

- **Feature: NEO Knowledge Base integration.** With the NEO Knowledge Base plugin active, the theme's native breadcrumb roots a knowledge-base article at its product space's landing page (or the Knowledge Base archive) and includes its first category -- `Home > [Space | Knowledge Base] > Category > Article`. The page header also surfaces the Knowledge Base search form on single articles and the KB category/tag archives (not on product-space archives). Both are guarded with `function_exists()`, so the theme degrades gracefully when the plugin is inactive.
- **Security:** Hardened the Customizer export/import nonce handling -- nonces are now unslashed before sanitization (`sanitize_text_field( wp_unslash( ... ) )`). The capability and `wp_verify_nonce()` checks were already in place.
- **Fix:** Customizer custom font choices (and Typekit/Adobe Fonts fallbacks) apply on the front end again -- the inline font CSS was attached to a stylesheet handle the theme does not register, so WordPress silently dropped it.
- **Fix:** Jetpack Content Options toggles (date, categories, tags, author, comments) now work -- the support declared the wrong stylesheet handle.
- **Fix:** Footer copyright default links now use full `https://` URLs, and the breadcrumb category sort / null-post handling were corrected.
- **Improvement:** Jetpack Content Options can now also toggle featured-image display (archive, post, page).
- **Compat:** Updated the theme description and tags to reflect WooCommerce compatibility -- added the `e-commerce` subject tag and synced the tag list between `style.css` and `readme.txt`.
- **Refactor:** WordPress Coding Standards / PHP 8.4 hardening sweep across the Customizer subsystem (loader, settings registrar, all custom controls, custom-CSS, fonts, sanitization, export/import) plus the breadcrumb and template helpers -- doc-comments, ABSPATH guards, corrected property/return types, type-safe strict comparisons, explicit script versions, and dead-code removal. The ~132 KB Google Fonts catalogue was moved to a sibling `google-fonts.json` data file (byte-identical, 915 families). No behaviour change.
- **i18n:** Wrapped previously hardcoded Customizer typography labels for translation; the comment date is now escaped on output.

### 2.2.0 -- 30 May, 2026

- **Feature: WooCommerce compatibility.** NEOVANTAGE is now a fully WooCommerce-ready theme. The shop, single product, cart, checkout, order confirmation, and the complete My Account area are styled to match the theme, with a header cart icon and a slide-in mini-cart drawer. WooCommerce output, blocks, forms, and notices inherit the theme's colours, typography, and buttons; the store stylesheet loads only on WooCommerce pages, so sites without WooCommerce carry zero extra weight.
- **Fix:** Parent theme stylesheet not loading when a child theme is active -- `get_stylesheet_uri()` resolves to the child's style.css, so the parent's CSS was skipped entirely. Replaced with `get_template_directory_uri() . '/style.css'`.
- **Improvement:** The recommended-plugins screen now pulls the latest version of WordPress.org-hosted plugins (Contact Form 7, Smash Balloon Instagram Feed) live from the WordPress.org Plugins API (cached 12h), so listed versions stay current automatically -- no theme update needed.
- **Improvement:** Styled `core/details` block (WordPress built-in accordion) in `css/blocks.css`, `css/block-details.css`, and `css/style-editor.css` to match the NEOVANTAGE design language -- bordered card, custom chevron marker, theme color on hover/open state. Frontend loaded via `wp_enqueue_block_style()` (only when block is used).
- **Improvement:** Styled `core/accordion` block (WordPress 7.0+ built-in accordion) in `css/blocks.css` and `css/style-editor.css` -- card borders, custom CSS chevron replacing the default "+" icon, theme color on hover/open state, stacked sibling grouping, zero-margin spacing fix for accordion sub-blocks in the editor.
- **Compat:** Bumped Tested up to from 6.9 to 7.0. Verified child theme compatibility -- all enqueue handles, template inheritance, and editor-styles support work under WP 7.0's fully-iframed block editor.

### 2.1.0 -- 6 May, 2026

**Headline changes**

- **Feature: `theme.json` design tokens.** Added schema-version-2 `theme.json` at the theme root. Block editor now exposes the theme's palette (`Theme`, `Contrast`), font families (`Heading`, `Body`), four font sizes (S/M/L/XL), and four spacing presets directly in the inserter. Customizer choices flow through automatically -- pick a Theme Color in the Customizer and every block consuming the `Theme` swatch on the front-end and editor canvas updates without a refresh.
- **Feature: Six block patterns.** Added a `patterns/` directory with six auto-loaded patterns under a new `NEOVANTAGE` filter in the inserter: `Hero with title and CTA`, `Full-width call-to-action strip`, `Three-column latest posts`, `Image and text two-column`, `Solid-colour pull-quote`, and `Four-column footer info`. All use core blocks only (no plugin coupling) and reference the new design-token slugs so they pick up Customizer choices automatically.
- **Compat: Block-based widgets editor confirmed.** Audited the theme -- does not opt out of WP 5.8+'s block widgets editor. Authors can drop blocks into all six sidebars (sidebar-1, slideshow, footer-1..footer-4) via Customizer -> Widgets or wp-admin/widgets.php.

**Front-end / token surface**

- Refactor: New `css/theme-tokens.css` hosts every theme-color rule that previously lived in `neovantage_custom_styles()` PHP injection. Each rule consumes `var(--wp--preset--color--theme, #26c6da)` / `var(--wp--preset--color--contrast, #ffffff)` so Customizer changes resolve via the design-token surface -- single source of truth across front-end and editor.
- Refactor: `neovantage_custom_styles()` trimmed from ~410 lines (40+ rule groups) to ~70 (7 rule groups). Only computed-color rules -- the hover variants that need `neovantage_adjust_brightness( $color, -20 )` -- remain in PHP, since `theme.json` cannot express derived values.
- Refactor: `style-editor.css` block-editor color rules now consume `var(--wp--preset--color--theme, #26c6da)` instead of the legacy `--neovantage-primary-color` variable. The legacy `neovantage_get_editor_color_vars_css()` helper and its two injection callbacks were removed -- `theme.json` is the single source for editor color vars.
- Refactor: Retired the `editor-color-palette` `add_theme_support()` registration. The legacy `primary` slug is replaced by the `theme` slug; saved post markup using `class="has-primary-color"` should be migrated to `has-theme-color` on next edit (re-saving in the block editor rewrites the class automatically).
- Compat: Surgical opt-ins for block-editor controls (`color.link`, `typography.lineHeight`, `spacing.padding/margin/blockGap`) instead of bulk `appearanceTools: true`. Other surfaces (border-radius, dimensions, filter effects) stay disabled until the theme has CSS coverage for them.

**Pre-2.1.0 work that ships in this release**

- New: "Accent Text Color" Customizer control (Colors section) -- sets the foreground color for elements that use Theme Color as a background (buttons, category badges, tag-cloud hover, pagination active state, drop-cap, news-ticker heading, input-group addons). Defaults to `#ffffff`.
- Improvement: Introduced `css/blocks.css` -- a dedicated frontend stylesheet for Gutenberg block structural overrides, loaded after `style.css` via the `neovantage-blocks` enqueue handle. Dynamic colour rules remain in `neovantage_custom_styles()` so they stay live.
- Improvement: Expanded core Gutenberg block coverage across heading, list, quote citation, pullquote, preformatted, verse, image (figcaption + alignments + rounded), gallery, cover, media-text, embed (responsive aspect-ratio), audio, video, file, buttons (parent + outline), separator, columns, group, archives, categories, latest-posts, page-list, rss, tag-cloud, calendar, social-links, latest-comments, plus `has-text-align-*` utilities scoped to `.entry-content`.
- Improvement: core/group `is-layout-flex` (Row) and `is-vertical` (Stack) variations now have theme-side defaults for flex-wrap, gap, item alignment, `.is-nowrap`, and the four `.is-content-justification-*` utilities.
- Improvement: core/search block has a unified form-control treatment for both layout variants -- 38px input height, 1px `#eee` border, themed placeholder colour, themed focus border (live via `:focus-within` for the button-inside variant).
- Improvement: core/media-text -- three fixes. (a) `is-image-fill` no longer collapses to zero height (figure gets `min-height: 280px`; the hidden `<img>` uses screen-reader clip-path so it stays accessible). (b) `__content` gets 8% horizontal padding so text isn't flush against the image. (c) Mobile stack respects the `.is-stacked-on-mobile` flag.
- Improvement: core/file redesigned as a card row -- `#fafafa` background, 1px `#eee` border, 4px radius. Filename link reads as a label (color `#333`, weight 600); download button pinned right via `margin-left: auto`.
- Improvement: core/audio sits inside a matching card container so the bare browser audio control reads as a deliberate page element. Native control gets a 999px pill radius where browsers honour it.
- Feature: All nine core/cover content-position variants (`.has-custom-content-position .is-position-{top|center|bottom}-{left|center|right}`) now work -- Cover block is a flex column container so the editor's 3×3 picker actually moves content.
- Feature: In-post pagination (`page-links` / `post-page-numbers`) emitted by `wp_link_pages()` for posts split with a `<!--nextpage-->` page break is now styled -- chip-style 32px-min, 1px border, 3px radius, smooth hover; active and hover states themed live.
- Fix: core/button Solid variant rendered with a hardcoded black background. Added a higher-specificity override in `neovantage_custom_styles()` (and a CSS-variable mirror in `style-editor.css`) that paints background, border, hover, and text colour from the Customizer Theme Color while leaving `.has-background` / `.has-text-color` author picks untouched.
- Fix: Comment form submit button (id `submit`) -- rendered by both `comment_form()` and `wp-block-post-comments-form` -- now inherits the Theme Color as background and Accent Text Color as foreground, matching all other primary buttons.
- Fix: core/column `.has-background` had no inner padding; added `padding: 1em 1.25em` mirroring the existing `.wp-block-group.has-background` pattern.
- Fix: Replaced hardcoded `color: #fff` on `.wp-block-search__button` with the Accent Text Color Customizer value.

### 2.0.12 -- 23 April, 2026

- Fix: Resolved PHP warning "Undefined array key with_front" in `class-neovantage-breadcrumb.php` -- replaced direct array key access with `empty()` check at both call sites.
- Fix: Corrected double-hash colour output (`##ffffff`) in `custom-header.php` inline CSS -- root cause was `default-text-color` declared with a leading `#` in `add_theme_support()`, against WordPress convention.
- Fix: Refactored `neovantage_header_style()` in `custom-header.php` to build CSS as a PHP string instead of interleaving PHP tags inside a `<style>` block -- eliminates IDE CSS-linter false positives and removes an empty mobile-navigation rule.
- Fix: Inverted fallback condition for quote author in `template-parts/content-quote.php` (`&&` -> `||`) so the post author display name is substituted when no custom quote-author meta is set. Replaced bitwise `&` with logical `&&` in the same template.
- Fix: News ticker no longer renders on fresh installs or when no posts exist -- wrapper and arrows are suppressed on zero results. Removed undefined `$atts` variable references from the ticker block in `header.php` (PHP 8 "Undefined variable" warning).
- Fix: `phpcs:ignore WordPress.DB.SlowDBQuery` on intentional `tax_query` in `archive.php`. Pre-increment `++$i` per WordPress coding standards.
- Security: `esc_attr()` -> `esc_html()` for quote author output (text content, not attribute).
- Security: Escaped `$link_title` post meta with `esc_html()` in `template-parts/content-link.php` -- value was raw, allowing stored XSS via the `_neovantage_link_title` custom field.
- Security: Sanitized `$_SERVER['REQUEST_URI']` with `wp_unslash()` and `esc_url_raw()` at all 14 read sites in the breadcrumb class. Escaped `custom_class` with `esc_attr()` in the wrapper sprintf().
- Security: `the_title()` -> `echo esc_html( get_the_title() )` in `archive.php` grid layout. `esc_attr( get_the_title() )` -> `esc_html( get_the_title() )` in the news-ticker loop (avoids double-encoding entities).

### 2.0.11 -- 20 April, 2026

- Improvement: Plugin cache automatically clears on theme update -- eliminates stale plugin version data from GitHub after upgrading.

### 2.0.10 -- 20 April, 2026

- Fix: Bumped NEOVANTAGE Core fallback version in TGM plugin registration from 2.0.6 to 2.0.9 -- the stale fallback caused the Install Plugins screen to display 2.0.8 instead of 2.0.9 on sites where the remote `plugins-data.json` had not yet been fetched.

### 2.0.9 -- 11 April, 2026

- Improvement: Preloader dismisses on DOM-ready instead of `window.load` -- eliminates multi-second blocking on image-heavy pages. Fade 1200 ms -> 300 ms.
- Improvement: CSS safety-valve animation auto-hides the preloader after 4 s if JavaScript is delayed or blocked.
- Improvement: Preloader Customizer default changed to disabled -- opt-in via Customizer.
- Improvement: Cookie consent banner redesigned -- flex layout (message left, actions right), 3px solid `#26c6da` top border, Montserrat font, responsive mobile breakpoint.
- Fix: Cookie consent close element promoted from `<span>` to `<button type="button">` for keyboard and screen-reader accessibility.
- Fix: Eliminated duplicate navigation markup -- `wp_nav_menu()` called once server-side; mobile off-canvas drawer populated via JS DOM clone.
- Fix: Removed the separate "Mobile Menu" Customizer location -- a single "Primary" menu drives both desktop and mobile, removing the two-assignment requirement from WP Admin -> Menus.
- Improvement: "Menus" panel repositioned in Customizer sidebar to appear immediately after "Header" for faster access.
- Fix: Customizer sidebar Dashicons vertically centred with flexbox `align-items: center`.

### 2.0.8 -- 07 April, 2026

- Fix: Removed erroneous code in TGM class that caused the recommended plugins table to appear empty.
- Fix: Plugin metadata transient (`neovantage_premium_plugins_info`) auto-cleared on theme update -- no manual action required.

### 2.0.7 -- 07 April, 2026

- Security: Wrapped breadcrumb link output with `esc_url()`.
- Security: Escaped `alert()` output in Customizer export/import with `esc_js()`.
- Security: Replaced unescaped `echo` with `wp_kses_post()` for custom code injection in `header.php` and `footer.php`.
- Security: Added `wp_unslash()` and `sanitize_text_field()` to `$_REQUEST` nonce values before `wp_verify_nonce()`.
- Security: Replaced `serialize()`/`unserialize()` with `wp_json_encode()`/`json_decode()` to prevent object injection.
- Security: Customizer export format changed from `.dat` (octet-stream) to `.json` (application/json).
- Fix: Replaced `unlink()` with `wp_delete_file()` in Customizer export/import and image sideload.
- Fix: Added strict `true` to all `in_array()` calls in customize-export-import (and 19 instances in `class-neovantage-control-typography.php`).
- Fix: Replaced `(int)` cast with `absint()` for `$_GET['paged']` in `template-slideshow.php`.
- Fix: Loose `==`/`!=` comparisons replaced with strict `===`/`!==` in Customizer export/import.
- Fix: Replaced `WP_Filesystem` usage with `file_get_contents()` for reading uploaded import file (WP_Filesystem is for upgrade operations only).
- Fix: Renamed private methods removing underscore prefix per PSR-2 (`_export` -> `export`, etc.). Renamed reserved keyword parameter `$string` -> `$url`.
- Fix: TGM `no_items()` correctly renders the "Return to Dashboard" link -- switched from `esc_html__()` to `__()` wrapped in `wp_kses()` to allow the anchor through.
- Fix: TGM plugin download URL and metadata JSON endpoint moved from `downloads.pixelspress.com` to GitHub Releases / raw content (`mohsin-rafique/neovantage-core`).

### 2.0.6 -- 05 April, 2026

- Security: Escaped `header_image()` output with `esc_url()` in the header style attribute.
- Security: Replaced unescaped `the_title()`, `the_excerpt()`, `the_permalink()`, `bloginfo()` in Open Graph meta tags with properly escaped `get_*` equivalents.
- Fix: Removed duplicate TGM library; now correctly loads the prefixed `Neovantage_TGM_Plugin_Activation` class with `ABSPATH` guard.
- Fix: Replaced deprecated `wp_resource_hints` filter (removed WP 6.7) with version-aware `wp_preconnect_urls` shim.
- Fix: Updated all protocol-relative URLs to explicit `https://` in fonts, template-tags, and typekit.
- Fix: Replaced `dirname(__FILE__)` with `__DIR__` constant. Replaced reserved keyword parameter names `$object` and `$default`.
- Fix: Added strict type checking to all `in_array()` and `array_search()` calls in `template-tags.php`.
- Fix: Removed dead unprefixed `get_gallery_attachments()` from `inc/template-tags.php`. Restored accidentally disabled `get_transient()` in `neovantage_get_nonce()`. Corrected `$post` global override in `neovantage_related_posts()`.
- Improvement: Moved NEOVANTAGE Core update notices to the plugin itself (`Neovantage_Core_Updater`) -- plugins manage their own update lifecycle per WP standards.
- Improvement: TGM plugin list now fetches live version data from a remote JSON endpoint with 24-hour transient cache, timeout, HTTP status check, and proper error handling.
- Compatibility: Tested up to WordPress 6.9.
- Compatibility: Minimum PHP raised to 8.0; confirmed clean on PHP 8.4.

### 2.0.5 -- 07 July, 2021

- Fix: Dynamic CSS value for header links.

### 2.0.4 -- 05 April, 2021

- Feature: Option to show/hide related posts.
- Fix: Default layout for archive pages.

### 2.0.3 -- 18 March, 2021

- Compatibility: Code improvements and compatibility check with WordPress 5.7.1.

### 2.0.2 -- 15 March, 2021

- Fix: Removed Pinterest share link.

### 2.0.1 -- 15 March, 2021

- Fix: Incomplete output on gallery post format.
- Fix: Undefined index `with_front`.

### 2.0.0 -- 14 March, 2021

- Major: Revamped from scratch with improved site header and breadcrumb.

### 1.2.6 -- 24 August, 2018

- Feature: Cookie consent notification bar.
- Improvement: Theme options panel improvements.
- Update: Replaced Font Awesome with Lynny Icons.

### 1.2.5.2 -- 23 May, 2018

- Fix: Mobile menu close icon.

### 1.2.5 -- 14 May, 2018

- Update: Revised author page with author bio box.

### 1.2.4 -- 07 May, 2018

- Feature: Post view count.
- Fix: Missing Font Awesome icons.

### 1.2.3 -- 06 May, 2018

- Feature: Social media follow links in theme options.
- Update: Font Awesome updated to 5.0.12.

### 1.2.1 -- 05 May, 2018

- Feature: Custom code injection in head, after body open, and before body close via theme options.

### 1.2 -- 05 May, 2018

- Update: Theme options panel improvements.

### 1.1.4 -- 15 November, 2017

- Update: TGM Plugin Activation class updated.

### 1.1.3 -- 11 November, 2017

- Fix: Responsive video size.
- Note: CSS cleanup.

### 1.1.2 -- 17 October, 2017

- Fix: Post format structure and Open Graph permalink URL.

### 1.1.1 -- 09 August, 2017

- Feature: Open Graph meta tags.

### 1.1.0 -- 17 April, 2017

- Feature: Page preloader.
- Improvement: Migrated all theme options to WordPress Customizer; removed Redux Framework dependency.
- Improvement: Replaced custom pagination with native `the_posts_pagination()` and `the_post_navigation()`.
- Improvement: Replaced custom excerpt function with native excerpt length filter.

### 1.0.4 -- 04 January, 2017

- Feature: Custom logo support.

### 1.0.3 -- 23 November, 2016

- Compliance: All functions, options, globals, and post meta prefixed with `neovantage_`.
- Note: All resources included within the theme directory.

### 1.0.0 -- 28 August, 2016

- Initial release.

---

## Work With PixelsPress

NEOVANTAGE is designed and developed by **[PixelsPress](https://pixelspress.com)** -- a WordPress studio building fast, standards-compliant themes, plugins, and custom WooCommerce stores for clients across the **US, UK, and worldwide**.

Need more than an off-the-shelf theme? We partner with agencies, startups, and growing brands to ship clean, maintainable, conversion-focused websites:

- Custom WordPress theme & plugin development
- WooCommerce store design, setup, and optimization
- Performance, accessibility (WCAG), and SEO improvements
- Migrations, third-party integrations, and ongoing maintenance & support

We write standards-first code (PHP 8.4, WordPress coding standards, fully translatable and RTL-ready) -- the same engineering that goes into NEOVANTAGE goes into every client project.

**Start a project:** [pixelspress.com](https://pixelspress.com)

---

## Credits

| Resource                                                                        | License                                           | Author                                               |
| ------------------------------------------------------------------------------- | ------------------------------------------------- | ---------------------------------------------------- |
| [Underscores (\_s)](https://underscores.me/)                                    | GPL v2+                                           | Automattic, Inc.                                     |
| [normalize.css](https://necolas.github.io/normalize.css/)                       | MIT                                               | Nicolas Gallagher & Jonathan Neal                    |
| [Bootstrap v3.3.7](https://getbootstrap.com)                                    | MIT                                               | Twitter, Inc.                                        |
| [Lato](https://fonts.google.com/specimen/Lato)                                  | SIL OFL v1.1                                      | Łukasz Dziedzic                                      |
| [Montserrat](https://fonts.google.com/specimen/Montserrat)                      | SIL OFL v1.1                                      | Julieta Ulanovsky                                    |
| [Open Sans](https://fonts.google.com/specimen/Open+Sans)                        | SIL OFL v1.1                                      | Steve Matteson                                       |
| [Noto Serif](https://fonts.google.com/specimen/Noto+Serif)                      | SIL OFL v1.1                                      | Google LLC                                           |
| [Lynny Icons](https://dribbble.com/shots/1925069-Lynny-Icon-Set-Free)           | Free w/ attribution                               | Matthew Skiles                                       |
| [TGM Plugin Activation](https://tgmpluginactivation.com/)                       | GPL v2+                                           | Thomas Griffin, Gary Jones, Juliette Reinders Folmer |
| [NEO Bootstrap Carousel](https://wordpress.org/plugins/neo-bootstrap-carousel/) | GPL v3+                                           | PixelsPress                                          |
| [Contact Form 7](https://wordpress.org/plugins/contact-form-7/)                 | GPL v2+                                           | Takayuki Miyoshi                                     |
| [Smash Balloon Instagram Feed](https://wordpress.org/plugins/instagram-feed/)   | GPL v2+                                           | Smash Balloon                                        |
| Demo images                                                                     | [Pexels License](https://www.pexels.com/license/) | Various -- see [readme.txt](readme.txt)              |

---

## License

NEOVANTAGE WordPress Theme -- Copyright (C) 2016-2026 [PixelsPress](https://pixelspress.com)

Distributed under the [GNU General Public License v2 or later](https://www.gnu.org/licenses/gpl-2.0.html).

This program is free software: you can redistribute it and/or modify it under the terms of the GNU GPL as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

NEOVANTAGE is based on [Underscores (\_s)](https://underscores.me/), (C) 2012-2016 Automattic, Inc., distributed under GPL v2 or later.
