Changeset 340497
- Timestamp:
- 07/23/2026 08:34:09 PM (4 months ago)
- Location:
- buddyx/5.1.5
- Files:
-
- 17 edited
- 1 copied
-
. (copied) (copied from buddyx/5.1.4 )
-
buddypress/members/single/friends/requests-loop.php (modified) (1 diff)
-
inc/Customizer/Component.php (modified) (1 diff)
-
inc/Customizer_Framework/Component.php (modified) (3 diffs)
-
inc/Customizer_Framework/Field.php (modified) (1 diff)
-
inc/Customizer_Framework/Output_Builder.php (modified) (1 diff)
-
inc/Customizer_Framework/assets/customizer-controls.js (modified) (4 diffs)
-
inc/Customizer_Framework/assets/customizer-preview.js (modified) (1 diff)
-
inc/Customizer_Settings/Component.php (modified) (4 diffs)
-
inc/Customizer_Settings/Fields/Footer_Fields.php (modified) (1 diff)
-
inc/Customizer_Settings/Fields/Sub_Header_Fields.php (modified) (1 diff)
-
inc/Tokens/Component.php (modified) (4 diffs)
-
inc/Welcome/Component.php (modified) (1 diff)
-
inc/compatibility/fluentcart/fluentcart-functions.php (modified) (2 diffs)
-
readme.txt (modified) (2 diffs)
-
style.css (modified) (1 diff)
-
template-parts/layout/entry-default-layout.php (modified) (1 diff)
-
woocommerce/archive-product.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
buddyx/5.1.5/buddypress/members/single/friends/requests-loop.php
r339988 r340497 3 3 * BuddyPress - Members Friends Requests Loop 4 4 * 5 * @since 5.1. 46 * @version 5.1. 45 * @since 5.1.5 6 * @version 5.1.5 7 7 */ 8 8 ?> -
buddyx/5.1.5/inc/Customizer/Component.php
r339988 r340497 158 158 } 159 159 160 /**161 * Theme options.162 */163 $wp_customize->add_section(164 'theme_options',165 array(166 'title' => __( 'Theme Options', 'buddyx' ),167 'priority' => 130, // Before Additional CSS.168 )169 );170 160 } 171 161 -
buddyx/5.1.5/inc/Customizer_Framework/Component.php
r335904 r340497 269 269 'content_background_color', 270 270 'site_header_bg_color', 271 'site_footer_background_color',272 271 'site_copyright_background_color', 273 272 ), … … 277 276 ), 278 277 'contrast' => array( 279 'body_text_color', 280 'headings_color', 281 'site_title_color', 282 'menu_color', 283 'subheader_title_color', 278 'typography_option[color]', 279 'h1_typography_option[color]', 280 'h2_typography_option[color]', 281 'h3_typography_option[color]', 282 'h4_typography_option[color]', 283 'h5_typography_option[color]', 284 'h6_typography_option[color]', 285 'site_title_typography_option[color]', 286 'site_tagline_typography_option[color]', 287 'menu_typography_option[color]', 288 'site_sub_header_typography[color]', 284 289 'site_footer_title_color', 285 290 'site_footer_links_color', … … 291 296 ), 292 297 ); 298 299 /** 300 * Public accessor for the variation -> per-control colour defaults map. 301 * Consumed by Tokens\Component::purge_preset_equal_saves() to decide 302 * whether a saved colour is a real personalisation or just the preset's 303 * own value persisted by a customizer publish. 304 * 305 * @return array<string, array<string, string>> variation slug => { setting_id => hex }. 306 */ 307 public static function get_style_variation_defaults(): array { 308 return self::collect_style_variation_defaults(); 309 } 293 310 294 311 /** -
buddyx/5.1.5/inc/Customizer_Framework/Field.php
r332732 r340497 360 360 protected static function build_control_args( string $type, array $args ): array { 361 361 // Strip keys consumed by Field::register_with_manager / add_setting. 362 $internal = array( '_type', 'settings', 'default', 'transport', 'sanitize_callback', 'capability' ); 362 // 'output_condition' is consumed by Output_Builder::collect() at render 363 // time and must not leak into control constructor args. 364 $internal = array( '_type', 'settings', 'default', 'transport', 'sanitize_callback', 'capability', 'output_condition' ); 363 365 $out = array_diff_key( $args, array_flip( $internal ) ); 364 366 -
buddyx/5.1.5/inc/Customizer_Framework/Output_Builder.php
r335904 r340497 33 33 foreach ( $fields as $f ) { 34 34 if ( empty( $f['output'] ) || empty( $f['settings'] ) ) { 35 continue; 36 } 37 // An 'output_condition' callable gates emission at render time. 38 // Without it, a saved value keeps emitting CSS even after the 39 // customer disables the owning toggle (the toggle only hides the 40 // control via active_callback - it never suppressed the output). 41 if ( isset( $f['output_condition'] ) && is_callable( $f['output_condition'] ) && ! call_user_func( $f['output_condition'] ) ) { 35 42 continue; 36 43 } -
buddyx/5.1.5/inc/Customizer_Framework/assets/customizer-controls.js
r332732 r340497 819 819 } 820 820 821 // Point a colour control's reset ("Default") button at a new 822 // colour. ctl.params.default alone is not enough: the wpColorPicker 823 // widget caches options.defaultColor at init (from the input's 824 // data-default-color attribute) and the Default button reads that 825 // cached option at click time. Update both the attribute (covers 826 // pickers that initialise later, e.g. on section expand) and the 827 // live widget option (covers already-initialised pickers). 828 function retargetPickerDefault( ctl, newColor ) { 829 if ( ! ctl || ! ctl.container ) { 830 return; 831 } 832 var run = function () { 833 var $picker = ctl.container.find( '.wp-color-picker, input.color-picker-hex, input[type="text"].wp-color-picker' ).first(); 834 if ( ! $picker.length ) { 835 return; 836 } 837 $picker.data( 'default-color', newColor ).attr( 'data-default-color', newColor ); 838 if ( jQuery.fn.wpColorPicker && $picker.data( 'a8c-iris' ) ) { 839 try { 840 $picker.wpColorPicker( 'option', 'defaultColor', newColor ); 841 } catch ( e ) { 842 // Widget not initialised yet - the attribute update 843 // above will seed it correctly when it does. 844 } 845 } 846 }; 847 if ( ctl.deferred && ctl.deferred.embedded ) { 848 ctl.deferred.embedded.done( run ); 849 } else { 850 run(); 851 } 852 } 853 821 854 function applyDefaults( slug, options ) { 822 855 var defaults = map[ slug ]; … … 831 864 if ( ctl && ctl.params ) { 832 865 ctl.params.default = newColor; 866 retargetPickerDefault( ctl, newColor ); 833 867 } 834 868 if ( alsoSetValue && wp.customize( settingId ) ) { … … 851 885 if ( ctl && ctl.params ) { 852 886 ctl.params.default = origDefault; 887 retargetPickerDefault( ctl, origDefault ); 853 888 } 854 889 if ( alsoSetValue && wp.customize( settingId ) ) { … … 882 917 if ( typeof map[ preset ][ ctl.id ] !== 'undefined' ) { 883 918 ctl.params.default = map[ preset ][ ctl.id ]; 919 retargetPickerDefault( ctl, map[ preset ][ ctl.id ] ); 884 920 } 885 921 } ); -
buddyx/5.1.5/inc/Customizer_Framework/assets/customizer-preview.js
r335904 r340497 75 75 'text-align': 'text-align', 76 76 'text-decoration': 'text-decoration', 77 'color': 'color', 77 78 }; 78 79 let decls = ''; -
buddyx/5.1.5/inc/Customizer_Settings/Component.php
r332732 r340497 40 40 add_filter( 'body_class', array( $this, 'site_sticky_header_classes' ) ); 41 41 add_filter( 'body_class', array( $this, 'site_sticky_sidebar_body_classes' ) ); 42 add_filter( 'body_class', array( $this, 'site_single_blog_post_body_classes' ) );43 42 if ( class_exists( 'SFWD_LMS' ) ) { 44 43 add_filter( 'body_class', array( $this, 'site_learndash_body_classes' ) ); … … 88 87 89 88 /** 90 * Site single blog post body class.91 */92 public function site_single_blog_post_body_classes( array $classes ): array {93 94 $single_post_layout = get_theme_mod( 'single_post_layout', buddyx_defaults( 'single-post-layout' ) );95 96 if ( $single_post_layout === '2' ) {97 $classes[] = 'single-post-layout-1';98 } elseif ( $single_post_layout === '3' ) {99 $classes[] = 'single-post-layout-2';100 } elseif ( $single_post_layout === '4' ) {101 $classes[] = 'single-post-layout-3';102 } else {103 $classes[] = '';104 }105 106 return $classes;107 }108 109 /**110 89 * LearnDash dark mode body class. 111 90 */ … … 296 275 ); 297 276 298 // BuddyPress Option. 299 if ( class_exists( 'BuddyPress' ) ) { 300 if ( ! class_exists( 'Youzify' ) ) { 301 \BuddyX\Buddyx\Customizer_Framework\Panel::add( 302 'site_buddypress_panel', 303 array( 304 'title' => esc_html__( 'Community Settings', 'buddyx' ), 305 'priority' => 31, 306 'description' => '', 307 ) 308 ); 309 } 277 // BuddyPress Option. The panel, section and fields share ONE gate: 278 // BuddyPress active AND Youzify absent (Youzify replaces the avatar 279 // styling this section controls). Registering the section without 280 // its parent panel makes WordPress silently drop it, orphaning 281 // buddypress_avatar_style with nowhere to render. 282 if ( class_exists( 'BuddyPress' ) && ! class_exists( 'Youzify' ) ) { 283 \BuddyX\Buddyx\Customizer_Framework\Panel::add( 284 'site_buddypress_panel', 285 array( 286 'title' => esc_html__( 'Community Settings', 'buddyx' ), 287 'priority' => 31, 288 'description' => '', 289 ) 290 ); 310 291 311 292 \BuddyX\Buddyx\Customizer_Framework\Section::add( … … 380 361 require_once $fields_dir . 'Site_Performance.php'; 381 362 382 // BuddyPress fields - only load when BuddyPress is active. 383 if ( class_exists( 'BuddyPress' ) ) { 363 // BuddyPress fields - same gate as the Community panel/section above 364 // (BuddyPress active AND Youzify absent) so the avatar toggle never 365 // registers against a section WordPress dropped. 366 if ( class_exists( 'BuddyPress' ) && ! class_exists( 'Youzify' ) ) { 384 367 require_once $fields_dir . 'BuddyPress_Fields.php'; 385 368 } -
buddyx/5.1.5/inc/Customizer_Settings/Fields/Footer_Fields.php
r339988 r340497 50 50 ), 51 51 ), 52 // Saved background CSS must stop rendering when the customer 53 // flips 'Customize Background?' back off - active_callback only 54 // hides the control, it does not suppress emission. 55 'output_condition' => static function () { 56 return buddyx_is_truthy( get_theme_mod( 'site_footer_bg', 'off' ) ); 57 }, 52 58 'active_callback' => array( 53 59 array( -
buddyx/5.1.5/inc/Customizer_Settings/Fields/Sub_Header_Fields.php
r332732 r340497 56 56 ), 57 57 ), 58 // Saved background CSS must stop rendering when the customer 59 // flips 'Customize Background?' back off - active_callback only 60 // hides the control, it does not suppress emission. 61 'output_condition' => static function () { 62 return buddyx_is_truthy( get_theme_mod( 'site_sub_header_bg', 'off' ) ); 63 }, 58 64 'active_callback' => array( 59 65 array( -
buddyx/5.1.5/inc/Tokens/Component.php
r339988 r340497 636 636 // and clobber the variation's colors. Runs once per site. 637 637 add_action( 'init', array( __CLASS__, 'maybe_purge_alpha_color_pollution' ), 5 ); 638 // Preset-equal saves are not personalisations: strip them at publish 639 // time (and once on upgrade for sites that already published a 640 // preset) so the mode-aware token overlay stays the source of truth. 641 // Runs before register_variation_theme_mod_filters (init 20). 642 add_action( 'init', array( __CLASS__, 'maybe_purge_preset_equal_saves_once' ), 15 ); 643 add_action( 'customize_save_after', array( __CLASS__, 'purge_preset_equal_saves' ), 20 ); 638 644 } 639 645 … … 750 756 error_log( sprintf( '[BuddyX 5.1.0] alpha-color pollution purge removed %d theme_mods', $purged ) ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log 751 757 } 758 } 759 760 /** 761 * Purge saved color theme_mods that canonically equal the active Style 762 * preset's value for that setting (or the registered field default when 763 * no preset is active). 764 * 765 * Why: picking a Style preset in the customizer paints the preset's 766 * palette into every mapped per-control color setting (so the pickers 767 * visually reflect the preset). Publishing then persists those values as 768 * customer theme_mods even though the customer never personalised them. 769 * Two things break downstream: 770 * 771 * 1. Typography `color` sub-keys emit element-level CSS through 772 * Output_Builder (e.g. `body{color:#0A0A0A}`) that applies in BOTH 773 * color modes - a light preset then renders near-black text on the 774 * dark surface (and the Dark preset near-white text on light). 775 * 2. The saves block/skew the variation theme_mod filters and clutter 776 * the DB with values the variation overlay already provides. 777 * 778 * A save that equals the preset's value is not a personalisation - the 779 * token overlay (mode-aware) is the source of truth for it. Values that 780 * genuinely differ from the preset are always preserved. 781 * 782 * Reads/writes the raw theme_mods option (NOT get_theme_mod) so the 783 * variation theme_mod filters cannot leak injected values back into the 784 * saved option. 785 */ 786 public static function purge_preset_equal_saves(): void { 787 $mods = \get_option( 'theme_mods_' . \get_stylesheet(), array() ); 788 if ( ! is_array( $mods ) ) { 789 return; 790 } 791 $slug = (string) ( $mods['site_style_variation'] ?? '' ); 792 $baseline = array(); 793 if ( '' !== $slug ) { 794 $map = \BuddyX\Buddyx\Customizer_Framework\Component::get_style_variation_defaults(); 795 $baseline = $map[ $slug ] ?? array(); 796 } else { 797 // Empty "Default" preset: baseline is each field's registered 798 // default (static 5.1.0 snapshots; kept in sync with Skin_Fields). 799 $baseline = self::$alpha_color_field_defaults_5_1_0; 800 foreach ( self::$alpha_color_typography_subkey_defaults_5_1_0 as $setting => $default ) { 801 $baseline[ $setting . '[color]' ] = $default; 802 } 803 } 804 if ( array() === $baseline ) { 805 return; 806 } 807 808 $changed = false; 809 foreach ( $baseline as $setting_id => $expected ) { 810 if ( ! is_string( $expected ) || '' === $expected ) { 811 continue; 812 } 813 if ( preg_match( '/^([^\[]+)\[([^\]]+)\]$/', $setting_id, $m ) ) { 814 $parent = $m[1]; 815 $key = $m[2]; 816 $saved = $mods[ $parent ] ?? null; 817 if ( ! is_array( $saved ) || empty( $saved[ $key ] ) || ! is_string( $saved[ $key ] ) ) { 818 continue; 819 } 820 if ( self::colors_canonically_equal( $saved[ $key ], $expected ) ) { 821 unset( $saved[ $key ] ); 822 if ( array() === $saved ) { 823 unset( $mods[ $parent ] ); 824 } else { 825 $mods[ $parent ] = $saved; 826 } 827 $changed = true; 828 } 829 } else { 830 $saved = $mods[ $setting_id ] ?? null; 831 if ( ! is_string( $saved ) || '' === $saved ) { 832 continue; 833 } 834 if ( self::colors_canonically_equal( $saved, $expected ) ) { 835 unset( $mods[ $setting_id ] ); 836 $changed = true; 837 } 838 } 839 } 840 // Typography sub-keys (font-family / weight / letter-spacing) that 841 // equal the active variation's own override are filter-provided, not 842 // customer personalisations - strip them too. Cleans rows persisted 843 // before the customize_save filter detachment existed, where a save 844 // serialized the injected variation fonts into theme_mods. 845 if ( '' !== $slug ) { 846 foreach ( self::resolve_variation_typography_overrides( $slug ) as $setting => $props ) { 847 $saved = $mods[ $setting ] ?? null; 848 if ( ! is_array( $saved ) || ! is_array( $props ) ) { 849 continue; 850 } 851 $dirty = false; 852 foreach ( $props as $key => $value ) { 853 if ( isset( $saved[ $key ] ) && is_string( $saved[ $key ] ) && trim( $saved[ $key ] ) === trim( (string) $value ) ) { 854 unset( $saved[ $key ] ); 855 $dirty = true; 856 } 857 } 858 if ( $dirty ) { 859 if ( array() === $saved ) { 860 unset( $mods[ $setting ] ); 861 } else { 862 $mods[ $setting ] = $saved; 863 } 864 $changed = true; 865 } 866 } 867 } 868 if ( $changed ) { 869 \update_option( 'theme_mods_' . \get_stylesheet(), $mods ); 870 } 871 } 872 873 /** 874 * One-time cleanup for sites that already published a Style preset 875 * before the purge above existed (5.1.5). Runs before 876 * register_variation_theme_mod_filters() (init 20) so the variation 877 * filters see the cleaned option and correctly treat the purged 878 * settings as unsaved. 879 */ 880 public static function maybe_purge_preset_equal_saves_once(): void { 881 if ( get_theme_mod( '_buddyx_preset_equal_purged', false ) ) { 882 return; 883 } 884 self::purge_preset_equal_saves(); 885 set_theme_mod( '_buddyx_preset_equal_purged', 1 ); 752 886 } 753 887 … … 956 1090 'site_buttons_background_color' => array( '--bx-color-button-bg', '#ef5455' ), 957 1091 'site_links_color' => array( '--bx-color-link', '#111111' ), 958 'body_background_color' => array( '--bx-color-bg', '#f fffff' ),1092 'body_background_color' => array( '--bx-color-bg', '#f7f7f9' ), 959 1093 'box_background_color' => array( '--bx-color-bg-elevated', '#ffffff' ), 960 1094 'site_header_bg_color' => array( '--bx-color-header-bg', '#ffffff' ), … … 1537 1671 1538 1672 foreach ( $overrides as $setting => $variation_value ) { 1539 // Customer has actively saved this setting → respect their save, 1540 // do not override. Variation is a "starting point" only. 1541 if ( array_key_exists( $setting, $saved_mods ) ) { 1673 // Layering: field default < variation < customer save. A partial 1674 // customer save (e.g. only the color sub-key persisted by a preset 1675 // pick in the customizer) must NOT disable the variation's other 1676 // sub-keys - skipping the whole filter on array_key_exists() used 1677 // to drop the preset's fontFamily/weight the moment any sub-key 1678 // was saved. $saved_raw is captured at registration because the 1679 // filter callback only receives the post-default value and cannot 1680 // tell a real save from the caller's default fallback. 1681 $saved_raw = $saved_mods[ $setting ] ?? null; 1682 if ( null !== $saved_raw && ! is_array( $variation_value ) ) { 1683 // Scalar override with a real customer save: save wins outright. 1542 1684 continue; 1543 1685 } 1544 \add_filter( 1545 "theme_mod_{$setting}", 1546 static function ( $current ) use ( $variation_value ) { 1547 if ( is_array( $current ) && is_array( $variation_value ) ) { 1548 return array_merge( $current, $variation_value ); 1549 } 1550 return $variation_value; 1551 }, 1552 5 1553 ); 1554 } 1686 $callback = static function ( $current ) use ( $variation_value, $saved_raw ) { 1687 if ( is_array( $variation_value ) ) { 1688 $base = is_array( $current ) ? $current : array(); 1689 $saved = is_array( $saved_raw ) ? $saved_raw : array(); 1690 return array_merge( $base, $variation_value, $saved ); 1691 } 1692 return $variation_value; 1693 }; 1694 \add_filter( "theme_mod_{$setting}", $callback, 5 ); 1695 self::$variation_filter_handles[] = array( "theme_mod_{$setting}", $callback ); 1696 } 1697 1698 // WP_Customize_Setting builds a multidimensional root value from the 1699 // FILTERED theme_mod before writing it back, so a customizer save 1700 // would otherwise persist the filter-injected variation sub-keys 1701 // (fontFamily/weight) as if the customer had saved them - polluting 1702 // theme_mods and surviving later preset switches. Detach the filters 1703 // for the duration of the save; purge_preset_equal_saves() then 1704 // cleans the color sub-keys the preset pick itself dirtied. 1705 \add_action( 'customize_save', array( __CLASS__, 'detach_variation_theme_mod_filters' ) ); 1706 } 1707 1708 /** 1709 * Handles of the theme_mod filters registered by 1710 * register_variation_theme_mod_filters(), as [hook, callback] pairs, so 1711 * they can be detached during a customizer save. 1712 * 1713 * @var array<int, array{0:string, 1:callable}> 1714 */ 1715 protected static array $variation_filter_handles = array(); 1716 1717 /** 1718 * Remove every variation theme_mod filter (used right before the 1719 * customizer writes settings so injected values are never persisted). 1720 */ 1721 public static function detach_variation_theme_mod_filters(): void { 1722 foreach ( self::$variation_filter_handles as $pair ) { 1723 \remove_filter( $pair[0], $pair[1], 5 ); 1724 } 1725 self::$variation_filter_handles = array(); 1555 1726 } 1556 1727 -
buddyx/5.1.5/inc/Welcome/Component.php
r339988 r340497 410 410 $buddyx_family_plugin_status = $this->family_status( $buddyx_family_plugin ); 411 411 $buddyx_family_plugin_is_active = ( 'active' === $buddyx_family_plugin_status ); 412 $buddyx_family_plugin_base_url = ! empty( $buddyx_family_plugin['href'] ) 413 ? $buddyx_family_plugin['href'] 414 : 'https://wbcomdesigns.com/downloads/'; 412 $buddyx_family_plugin_base_url = $buddyx_family_plugin['href']; 415 413 // Minimal UTM so we can see which welcome-screen card drove the visit. 416 414 $buddyx_family_utm = array( -
buddyx/5.1.5/inc/compatibility/fluentcart/fluentcart-functions.php
r334340 r340497 332 332 <div class="menu-icons-wrapper cart-widget-wrapper"> 333 333 <div class="cart"> 334 <a href="#" class="cart-icon-wrap fcart-cart-to ogle-button"aria-label="<?php esc_attr_e( 'View Shopping Cart', 'buddyx' ); ?>">334 <a href="#" class="cart-icon-wrap fcart-cart-toggle-button" data-fluent-cart-cart-toggle-button aria-label="<?php esc_attr_e( 'View Shopping Cart', 'buddyx' ); ?>"> 335 335 <span class="fa fa-shopping-cart"></span> 336 336 <?php if ( $item_count > 0 ) : ?> … … 399 399 }); 400 400 401 // Handle cart icon click to toggle FluentCart drawer 401 // Prevent the '#' anchor from jumping the page; FluentCart's own 402 // delegated document click listener (bound to the 403 // data-fluent-cart-cart-toggle-button attribute set on this link) 404 // handles the actual drawer open/close - preventDefault() here 405 // does not stop that listener from also seeing the click. 402 406 document.addEventListener('DOMContentLoaded', function() { 403 const cartIcon = document.querySelector('.fcart-cart-toogle-button'); 404 if (cartIcon) { 407 document.querySelectorAll('.fcart-cart-toggle-button').forEach(function(cartIcon) { 405 408 cartIcon.addEventListener('click', function(e) { 406 409 e.preventDefault(); 407 // Trigger FluentCart drawer toggle408 const event = new CustomEvent('fluent_cart_toggle_drawer');409 document.dispatchEvent(event);410 410 }); 411 } 411 }); 412 412 }); 413 413 })(); -
buddyx/5.1.5/readme.txt
r339988 r340497 5 5 Tested up to: 7.0 6 6 Requires PHP: 8.0 7 Stable tag: 5.1. 47 Stable tag: 5.1.5 8 8 License: GNU General Public License v3.0 (or later) 9 9 License URI: https://www.gnu.org/licenses/gpl-3.0.html … … 129 129 130 130 == Changelog == 131 132 = 5.1.5 - July 2026 = 133 134 * Fix - Style presets: the color reset arrows on Body Text, H1-H6, Site Title, Tagline, Menu and Subheader controls now revert to the picked preset's color. 135 * Fix - The color picker's Default button now targets the active Style preset's color instead of the original theme default on every preset-managed control. 136 * Fix - Publishing a Style preset no longer saves the preset palette as customer settings, which made dark mode unreadable after picking a light preset and dropped the preset's fonts. 137 * Fix - The visitor dark/light toggle now renders coherent, readable colors with any Style preset published. 138 * Fix - WooCommerce shop and archive pages now honor Breadcrumbs OFF, including legacy on/off values. 139 * Fix - FluentCart cart drawer now opens from the header cart icon. A selector typo previously left the toggle inert. 140 * Fix - Footer and Sub Header background toggles now stop the saved background from rendering when switched off. The saved color returns when re-enabled. 141 * Fix - Community Settings registration is consistent when Youzify runs alongside BuddyPress. The avatar toggle no longer registers against a dropped section. 142 * Fix - Derived background color variants now compute from the correct default #f7f7f9 on sites with nothing saved. 143 * Dev - New output_condition field arg lets the customizer framework gate CSS emission on an owning toggle at render time. 144 * Dev - Typography live preview gained color parity with the PHP output builder. 145 * Dev - Removed dead customizer code: the unregistered single_post_layout body-class filter, a dead blog_layout_style read, and the empty Theme Options section. 131 146 132 147 = 5.1.4 - July 2026 = -
buddyx/5.1.5/style.css
r339988 r340497 5 5 Author URI: https://github.com/vapvarun/buddyx 6 6 Description: BuddyX is an editorial-grade WordPress theme with a designer pattern library - 27 plug-and-play block patterns (hero, about, services, testimonials, pricing, FAQ, CTA, footer, query) composed from core blocks only. Self-hosted Inter and Newsreader fonts, fluid 8-step type scale, semantic color tokens (base / contrast / accent / surface) with WCAG AA contrast, Light and Editorial style variations, and full BuddyPress / WooCommerce / LearnDash compatibility. Hybrid FSE: classic templates plus theme.json design tokens editable in Site Editor. Lightweight, responsive, RTL- and translation-ready, accessibility-audited (WCAG 2.1 AA). 7 Version: 5.1. 47 Version: 5.1.5 8 8 Requires at least: 6.5 9 9 Tested up to: 7.0 -
buddyx/5.1.5/template-parts/layout/entry-default-layout.php
r332732 r340497 18 18 ); 19 19 20 $post_style = get_theme_mod( 'blog_layout_style', buddyx_defaults( 'blog-layout-style' ) ); 21 $blog_tags = get_theme_mod( 'blog_show_tags', '' ); 20 $blog_tags = get_theme_mod( 'blog_show_tags', '' ); 22 21 ?> 23 22 -
buddyx/5.1.5/woocommerce/archive-product.php
r269187 r340497 36 36 do_action( 'buddyx_before_breadcrumb' ); 37 37 38 if ( ! empty( $breadcrumbs ) ) { 38 // `buddyx_is_truthy()` handles pre-5.1.0 'on'/'off' string values; 39 // `! empty()` treats the literal 'off' string as enabled. 40 if ( buddyx_is_truthy( $breadcrumbs ) ) { 39 41 buddyx_the_breadcrumb(); 40 42 }
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)