Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Changelog

## Unreleased

- Open Elementor Pro Theme Builder header and footer templates in the Elementor editor again. Flexia's block templates never call `get_header()`/`get_footer()`, where Elementor Pro prints those documents, so the editor preview stopped on "the content area was not found". Flexia now lets Elementor render header/footer templates with its own Header & Footer page template when Elementor registered the location on the theme's behalf.

## 3.2.1 — 2026-09-13

Upgrade QA follow-up to 3.2.0. Updating an existing site no longer replaces its header and footer layout.

- Restore the 3.1.0 header and footer under the `flexia/header` and `flexia/footer` slugs, so existing sites keep their chrome on update. The 3.2 native-identity chrome remains available as the new `flexia/header-minimal` and `flexia/footer-minimal` patterns.
- Give the minimal header's navigation an explicit page-list fallback so it no longer resolves to an unrelated saved menu.
- Lay the minimal header out without wrapping, keeping WooCommerce's account and mini-cart icons on the logo and menu row.
- Stop underlining button-shaped links inside post content, including WooCommerce's "Proceed to Checkout" button.
- Correct the 3.2 migration note: a database-saved header/footer part that only references a pattern still follows the theme's current pattern.

## 3.2.0 — 2026-09-13

Update from the public 3.1.0 release. Requires WordPress 6.6 or later; tested up to WordPress 7.1.
Expand Down
5 changes: 3 additions & 2 deletions assets/css/custom.css
Original file line number Diff line number Diff line change
Expand Up @@ -563,5 +563,6 @@ ol.wp-block-comment-template ol .wp-block-columns {
scroll-behavior: auto !important;
}
}
.wp-block-post-content a { text-decoration: underline; }
.wp-block-post-content a:hover { text-decoration-thickness: 2px; }
/* Body links are underlined, but button-shaped links are not. */
.wp-block-post-content a:not(.wp-element-button):not(.wp-block-button__link):not(.wc-block-components-button) { text-decoration: underline; }
.wp-block-post-content a:not(.wp-element-button):not(.wp-block-button__link):not(.wc-block-components-button):hover { text-decoration-thickness: 2px; }
7 changes: 6 additions & 1 deletion assets/fonts/README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ See Sora-OFL.txt and Inter-OFL.txt.

Original TTF files are retained from the Flexia 3.1.0 distribution.
WOFF2 files are losslessly compressed from those TTF files using fontTools 4.60.0.
No glyphs were subset or renamed.
The full WOFF2 files are kept for sites that reference them directly.
theme.json declares per-script subsets instead: *_latin.woff2 (Google Fonts'
"latin" range) and *_ext.woff2 (every other glyph in the font), each with its
unicodeRange, so Latin-only pages download only the latin file.
Subsets were cut from the TTF files with fontTools 4.60.0 pyftsubset
(layout features, name table and hinting kept).

License sources retrieved 2026-09-10:
https://raw.githubusercontent.com/google/fonts/main/ofl/sora/OFL.txt
Expand Down
Binary file added assets/fonts/inter_normal_400_ext.woff2
Binary file not shown.
Binary file added assets/fonts/inter_normal_400_latin.woff2
Binary file not shown.
Binary file added assets/fonts/sora_normal_400_ext.woff2
Binary file not shown.
Binary file added assets/fonts/sora_normal_400_latin.woff2
Binary file not shown.
Binary file added assets/fonts/sora_normal_500_ext.woff2
Binary file not shown.
Binary file added assets/fonts/sora_normal_500_latin.woff2
Binary file not shown.
Binary file added assets/fonts/sora_normal_600_ext.woff2
Binary file not shown.
Binary file added assets/fonts/sora_normal_600_latin.woff2
Binary file not shown.
2 changes: 1 addition & 1 deletion docs/MIGRATION-3.2.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Back up the database and theme/plugin files, then test on a staging clone. WordP
- **Home/blog:** home.html is now a posts index. For the previous agency layout, insert the Agency landing page pattern into a page and choose that page as the static front page in Reading settings. It is no longer forced onto the posts index.
- **Archives/sidebar:** archives inherit the requested category/date/author and pagination. Single-with-sidebar renders the selected post body and comments, rather than a latest-post list.
- **Commerce:** archive-product.html supplies the actual catalog override. The old woocommerce custom-template filename remains as an alias for existing assignments. Related products now use WooCommerce's current-product context.
- **Site identity:** configure your Site Logo, Site Title and Navigation. Default chrome no longer contains vendor demo contact links or signup links. Existing database-saved header/footer parts remain untouched.
- **Site identity:** the default header and footer keep their 3.1.0 layout under the `flexia/header` and `flexia/footer` slugs, so upgrading does not change site chrome. Note that a database-saved header/footer part whose content is only a `wp:pattern` reference still resolves to the theme's current pattern, so preserving the saved record is not by itself enough to preserve the rendered layout. The native-identity chrome ships alongside as `flexia/header-minimal` and `flexia/footer-minimal`; apply either from the Site Editor to replace the vendor demo contact and signup links with your own Site Logo, Site Title and Navigation.
- **Styles:** theme.json v3, accessible palette updates, shared editor CSS, focus/touch behavior and reduced motion may change appearance. Compare default/dark/orange variations and any child styles before rollout. No existing style/pattern slug is intentionally removed.
- **Fonts:** missing DM Sans files are replaced by an explicit system fallback under the old preset slug. Missing Inter weights are no longer declared. Existing Sora/Inter files are served as WOFF2; old TTF URLs remain available. If exact typography is contractual, review those presets before updating.

Expand Down
10 changes: 8 additions & 2 deletions functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
}

define( 'FLEXIA_DEV_MODE', false );
define( 'FLEXIA_VERSION', '3.2.0' );
define( 'FLEXIA_VERSION', '3.2.1' );
define( 'FLEXIA_SLUG', 'flexia' );
define( 'FLEXIA_NAME', 'flexia' );
define( 'FLEXIA_DIR_PATH', get_template_directory() );
Expand Down Expand Up @@ -56,7 +56,12 @@ function flexia_woocommerce_wrapper_end() {
function flexia_styles() {
wp_enqueue_style( 'flexia-custom', get_theme_file_uri( 'assets/css/custom.css' ), array(), FLEXIA_VERSION );
wp_enqueue_style( 'flexia-block-styles', get_theme_file_uri( 'assets/css/block-styles.css' ), array( 'flexia-custom' ), FLEXIA_VERSION );
wp_enqueue_style( 'flexia-style', get_stylesheet_uri(), array( 'flexia-block-styles' ), FLEXIA_VERSION );
// The parent style.css only carries the theme header, so it is fetched
// only for a child theme's stylesheet. Without a child the handle stays
// registered with no source so inline styles added to it still print.
// Registered first: wp_enqueue_style() skips registration for a false src.
wp_register_style( 'flexia-style', is_child_theme() ? get_stylesheet_uri() : false, array( 'flexia-block-styles' ), FLEXIA_VERSION );
wp_enqueue_style( 'flexia-style' );
}
}
add_action( 'wp_enqueue_scripts', 'flexia_styles' );
Expand Down Expand Up @@ -103,3 +108,4 @@ function flexia_register() {

// Keep the harmless legacy helper for existing child themes during migration.
require_once FLEXIA_DIR_PATH . '/includes/compatibility.php';
require_once FLEXIA_DIR_PATH . '/includes/elementor.php';
35 changes: 35 additions & 0 deletions includes/elementor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php
/**
* Optional Elementor Pro Theme Builder compatibility.
*
* @package Flexia
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}

if ( ! function_exists( 'flexia_elementor_header_footer_template' ) ) {
/**
* Let Elementor render Theme Builder header and footer templates itself.
*
* Elementor Pro prints header and footer documents from get_header() and
* get_footer(), which block templates never call. Left to Flexia's single
* template, the editor preview has no header/footer container and stops on
* "the content area was not found". Only locations Elementor registered on
* the theme's behalf ('overwrite') are handed back, so a child theme or
* plugin that registers its own header/footer location keeps control.
*
* @param bool $need_override Whether Elementor overrides the theme template.
* @param string $location Theme Builder location of the viewed template.
* @param object $locations_manager Elementor Pro locations manager.
* @return bool
*/
function flexia_elementor_header_footer_template( $need_override, $location, $locations_manager = null ) {
if ( $need_override || ! in_array( $location, array( 'header', 'footer' ), true ) || ! is_object( $locations_manager ) || ! method_exists( $locations_manager, 'get_location' ) ) {
return $need_override;
}
$settings = $locations_manager->get_location( $location );
return ! empty( $settings['overwrite'] );
}
}
add_filter( 'elementor/theme/need_override_location', 'flexia_elementor_header_footer_template', 10, 3 );
12 changes: 12 additions & 0 deletions patterns/footer-minimal.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php
/**
* Title: Footer (minimal)
* Slug: flexia/footer-minimal
* Categories: flexia, footer
*/
if ( ! defined( 'ABSPATH' ) ) { exit; }
?>
<!-- wp:group {"style":{"spacing":{"padding":{"top":"var:preset|spacing|40","bottom":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group" style="padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)"><!-- wp:separator /-->
<!-- wp:group {"align":"wide","layout":{"type":"flex","justifyContent":"space-between","flexWrap":"wrap"}} --><div class="wp-block-group"><!-- wp:site-title {"level":0} /--><!-- wp:site-tagline /--></div><!-- /wp:group -->
</div><!-- /wp:group -->
116 changes: 106 additions & 10 deletions patterns/footer.php
Original file line number Diff line number Diff line change
@@ -1,12 +1,108 @@
<?php
/**
* Title: Footer
* Slug: flexia/footer
* Categories: flexia, footer
*/
if ( ! defined( 'ABSPATH' ) ) { exit; }
/**
* Title: Footer
* Slug: flexia/footer
* Categories: flexia, footer
*/

if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<!-- wp:group {"style":{"spacing":{"padding":{"top":"var:preset|spacing|40","bottom":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group" style="padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)"><!-- wp:separator /-->
<!-- wp:group {"align":"wide","layout":{"type":"flex","justifyContent":"space-between","flexWrap":"wrap"}} --><div class="wp-block-group"><!-- wp:site-title {"level":0} /--><!-- wp:site-tagline /--></div><!-- /wp:group -->
</div><!-- /wp:group -->
<!-- wp:group {"style":{"spacing":{"padding":{"top":"120px","left":"20px","right":"20px","bottom":"var:preset|spacing|30"}}},"backgroundColor":"dark-background","layout":{"type":"constrained"}} -->
<div class="wp-block-group has-dark-background-background-color has-background" style="padding-top:120px;padding-right:20px;padding-bottom:var(--wp--preset--spacing--30);padding-left:20px"><!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":{"left":"var:preset|spacing|40"}}}} -->
<div class="wp-block-columns alignwide"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:group {"layout":{"type":"constrained"}} -->

<div class="wp-block-group"><!-- wp:image {"width":"128px","height":"auto","sizeSlug":"full","linkDestination":"none","style":{"color":{"duotone":"var:preset|duotone|secondary"}}} -->
<figure class="wp-block-image size-full is-resized"><img src="<?php echo esc_url( get_theme_file_uri( "/assets/images/logo.png" ) ); ?>" alt="" class="" style="width:128px;height:auto"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph {"style":{"elements":{"link":{"color":{"text":"var:preset|color|body-alt"}}}},"textColor":"body-alt"} -->
<p class="has-body-alt-color has-text-color has-link-color"><?php echo esc_html_x( 'Empower your Brand & Captivate your Audience With MultiGency right away and Boost your Business.', 'Message to convey footer content', 'flexia' ); ?></p>
<!-- /wp:paragraph -->

<!-- wp:social-links {"customIconColor":"#8f959f","iconColorValue":"#8f959f","customIconBackgroundColor":"#162747","iconBackgroundColorValue":"#162747","size":"has-normal-icon-size","style":{"spacing":{"blockGap":{"left":"16px"}}},"className":"is-style-flexia-social-rounded"} -->
<ul class="wp-block-social-links has-normal-icon-size has-icon-color has-icon-background-color is-style-flexia-social-rounded"><!-- wp:social-link {"url":"#","service":"facebook","label":"fb","rel":""} /-->

<!-- wp:social-link {"url":"#","service":"twitter","label":"","rel":""} /-->

<!-- wp:social-link {"url":"#","service":"linkedin"} /-->

<!-- wp:social-link {"url":"#","service":"instagram"} /-->

<!-- wp:social-link {"url":"#","service":"youtube"} /--></ul>
<!-- /wp:social-links --></div>
<!-- /wp:group --></div>
<!-- /wp:column -->

<!-- wp:column -->
<div class="wp-block-column"><!-- wp:columns {"isStackedOnMobile":false} -->
<div class="wp-block-columns is-not-stacked-on-mobile"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"style":{"elements":{"link":{"color":{"text":"var:preset|color|white"}}}},"textColor":"white","fontSize":"x-medium"} -->
<h2 class="wp-block-heading has-white-color has-text-color has-link-color has-x-medium-font-size"><?php echo esc_html_x( 'Product', 'Message to convey footer content', 'flexia' ); ?></h2>
<!-- /wp:heading -->

<!-- wp:navigation {"textColor":"body-alt","overlayMenu":"never","layout":{"type":"flex","orientation":"vertical"},"style":{"spacing":{"blockGap":"10px"}},"fontSize":"medium","fontFamily":"inter"} -->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Features', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Pricing', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Case Studies', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Reviews', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Updates', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- /wp:navigation --></div>
<!-- /wp:column -->

<!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"textColor":"white","fontSize":"x-medium"} -->
<h2 class="wp-block-heading has-white-color has-text-color has-x-medium-font-size"><?php echo esc_html_x( 'Company', 'Message to convey footer content', 'flexia' ); ?></h2>
<!-- /wp:heading -->

<!-- wp:navigation {"textColor":"body-alt","overlayMenu":"never","layout":{"type":"flex","orientation":"vertical"},"style":{"spacing":{"blockGap":"10px"}},"fontSize":"medium","fontFamily":"inter"} -->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'About', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Contact Us', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Careers', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Culture', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Blog', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- /wp:navigation --></div>

<!-- /wp:column --></div>
<!-- /wp:columns --></div>
<!-- /wp:column -->

<!-- wp:column -->
<div class="wp-block-column"><!-- wp:columns {"isStackedOnMobile":false} -->
<div class="wp-block-columns is-not-stacked-on-mobile"><!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"textColor":"white","fontSize":"x-medium"} -->
<h2 class="wp-block-heading has-white-color has-text-color has-x-medium-font-size"><?php echo esc_html_x( 'Support', 'Message to convey footer content', 'flexia' ); ?></h2>
<!-- /wp:heading -->

<!-- wp:navigation {"textColor":"body-alt","overlayMenu":"never","layout":{"type":"flex","orientation":"vertical"},"style":{"spacing":{"blockGap":"10px"}},"fontSize":"medium","fontFamily":"inter"} -->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Getting Started', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Help Center', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Server Status', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Report a bug', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- /wp:navigation --></div>
<!-- /wp:column -->

<!-- wp:column -->
<div class="wp-block-column"><!-- wp:heading {"textColor":"white","fontSize":"x-medium"} -->
<h2 class="wp-block-heading has-white-color has-text-color has-x-medium-font-size"><?php echo esc_html_x( 'Downloads', 'Message to convey footer content', 'flexia' ); ?></h2>
<!-- /wp:heading -->

<!-- wp:navigation {"textColor":"body-alt","overlayMenu":"never","layout":{"type":"flex","orientation":"vertical"},"style":{"spacing":{"blockGap":"10px"}},"fontSize":"medium","fontFamily":"inter"} -->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'IOS', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Android', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Mac', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- wp:navigation-link {"label":"<?php esc_html_e( 'Windows', 'flexia' ); ?>","url":"#","kind":"custom","isTopLevelLink":true} /-->
<!-- /wp:navigation --></div>
<!-- /wp:column --></div>
<!-- /wp:columns --></div>
<!-- /wp:column --></div>
<!-- /wp:columns -->

<!-- wp:group {"align":"wide","style":{"border":{"top":{"color":"#202124fa","width":"1px"},"right":{},"bottom":{},"left":{}},"spacing":{"padding":{"top":"var:preset|spacing|30"},"margin":{"top":"var:preset|spacing|50"}}},"layout":{"type":"flex","flexWrap":"nowrap","justifyContent":"center"}} -->
<div class="wp-block-group alignwide" style="border-top-color:#202124fa;border-top-width:1px;margin-top:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--30)"><!-- wp:paragraph {"align":"center","textColor":"body-alt"} -->
<p class="has-text-align-center has-body-alt-color has-text-color"><?php echo esc_html_x( '© Copyright by WPDeveloper', 'Message to convey footer content', 'flexia' ); ?></p>
<!-- /wp:paragraph --></div>
<!-- /wp:group --></div>
<!-- /wp:group -->
16 changes: 16 additions & 0 deletions patterns/header-minimal.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php
/**
* Title: Header (minimal)
* Slug: flexia/header-minimal
* Categories: flexia, header
*/
if ( ! defined( 'ABSPATH' ) ) { exit; }
?>
<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|20","bottom":"var:preset|spacing|20"}}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group alignfull" style="padding-top:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20)">
<!-- wp:group {"align":"wide","layout":{"type":"flex","justifyContent":"space-between","flexWrap":"nowrap"}} -->
<div class="wp-block-group alignwide"><!-- wp:group {"layout":{"type":"flex","flexWrap":"nowrap"}} --><div class="wp-block-group"><!-- wp:site-logo {"width":140} /--><!-- wp:site-title {"level":0} /--></div><!-- /wp:group -->
<!-- wp:navigation {"overlayMenu":"mobile","layout":{"type":"flex","justifyContent":"right","flexWrap":"nowrap"}} -->
<!-- wp:page-list /-->
<!-- /wp:navigation -->
</div><!-- /wp:group --></div><!-- /wp:group -->
Loading
Loading