Make WordPress Themes

Changeset 340497


Ignore:
Timestamp:
07/23/2026 08:34:09 PM (4 months ago)
Author:
themedropbox
Message:

New version of BuddyX - 5.1.5

Location:
buddyx/5.1.5
Files:
17 edited
1 copied

Legend:

Unmodified
Added
Removed
  • buddyx/5.1.5/buddypress/members/single/friends/requests-loop.php

    r339988 r340497  
    33 * BuddyPress - Members Friends Requests Loop
    44 *
    5  * @since 5.1.4
    6  * @version 5.1.4
     5 * @since 5.1.5
     6 * @version 5.1.5
    77 */
    88?>
  • buddyx/5.1.5/inc/Customizer/Component.php

    r339988 r340497  
    158158                }
    159159
    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                 );
    170160        }
    171161
  • buddyx/5.1.5/inc/Customizer_Framework/Component.php

    r335904 r340497  
    269269                        'content_background_color',
    270270                        'site_header_bg_color',
    271                         'site_footer_background_color',
    272271                        'site_copyright_background_color',
    273272                ),
    … …  
    277276                ),
    278277                '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]',
    284289                        'site_footer_title_color',
    285290                        'site_footer_links_color',
    … …  
    291296                ),
    292297        );
     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        }
    293310
    294311        /**
  • buddyx/5.1.5/inc/Customizer_Framework/Field.php

    r332732 r340497  
    360360        protected static function build_control_args( string $type, array $args ): array {
    361361                // 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' );
    363365                $out      = array_diff_key( $args, array_flip( $internal ) );
    364366
  • buddyx/5.1.5/inc/Customizer_Framework/Output_Builder.php

    r335904 r340497  
    3333                foreach ( $fields as $f ) {
    3434                        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'] ) ) {
    3542                                continue;
    3643                        }
  • buddyx/5.1.5/inc/Customizer_Framework/assets/customizer-controls.js

    r332732 r340497  
    819819                }
    820820
     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
    821854                function applyDefaults( slug, options ) {
    822855                        var defaults = map[ slug ];
    … …  
    831864                                if ( ctl && ctl.params ) {
    832865                                        ctl.params.default = newColor;
     866                                        retargetPickerDefault( ctl, newColor );
    833867                                }
    834868                                if ( alsoSetValue && wp.customize( settingId ) ) {
    … …  
    851885                                if ( ctl && ctl.params ) {
    852886                                        ctl.params.default = origDefault;
     887                                        retargetPickerDefault( ctl, origDefault );
    853888                                }
    854889                                if ( alsoSetValue && wp.customize( settingId ) ) {
    … …  
    882917                                if ( typeof map[ preset ][ ctl.id ] !== 'undefined' ) {
    883918                                        ctl.params.default = map[ preset ][ ctl.id ];
     919                                        retargetPickerDefault( ctl, map[ preset ][ ctl.id ] );
    884920                                }
    885921                        } );
  • buddyx/5.1.5/inc/Customizer_Framework/assets/customizer-preview.js

    r335904 r340497  
    7575                        'text-align': 'text-align',
    7676                        'text-decoration': 'text-decoration',
     77                        'color': 'color',
    7778                };
    7879                let decls = '';
  • buddyx/5.1.5/inc/Customizer_Settings/Component.php

    r332732 r340497  
    4040                add_filter( 'body_class', array( $this, 'site_sticky_header_classes' ) );
    4141                add_filter( 'body_class', array( $this, 'site_sticky_sidebar_body_classes' ) );
    42                 add_filter( 'body_class', array( $this, 'site_single_blog_post_body_classes' ) );
    4342                if ( class_exists( 'SFWD_LMS' ) ) {
    4443                        add_filter( 'body_class', array( $this, 'site_learndash_body_classes' ) );
    … …  
    8887
    8988        /**
    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         /**
    11089         * LearnDash dark mode body class.
    11190         */
    … …  
    296275                );
    297276
    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                        );
    310291
    311292                        \BuddyX\Buddyx\Customizer_Framework\Section::add(
    … …  
    380361                require_once $fields_dir . 'Site_Performance.php';
    381362
    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' ) ) {
    384367                        require_once $fields_dir . 'BuddyPress_Fields.php';
    385368                }
  • buddyx/5.1.5/inc/Customizer_Settings/Fields/Footer_Fields.php

    r339988 r340497  
    5050                                        ),
    5151                                ),
     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                                },
    5258                                'active_callback' => array(
    5359                                        array(
  • buddyx/5.1.5/inc/Customizer_Settings/Fields/Sub_Header_Fields.php

    r332732 r340497  
    5656                                        ),
    5757                                ),
     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                                },
    5864                                'active_callback' => array(
    5965                                        array(
  • buddyx/5.1.5/inc/Tokens/Component.php

    r339988 r340497  
    636636                // and clobber the variation's colors. Runs once per site.
    637637                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 );
    638644        }
    639645
    … …  
    750756                        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
    751757                }
     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 );
    752886        }
    753887
    … …  
    9561090                        'site_buttons_background_color'  => array( '--bx-color-button-bg', '#ef5455' ),
    9571091                        'site_links_color'               => array( '--bx-color-link', '#111111' ),
    958                         'body_background_color'          => array( '--bx-color-bg', '#ffffff' ),
     1092                        'body_background_color'          => array( '--bx-color-bg', '#f7f7f9' ),
    9591093                        'box_background_color'           => array( '--bx-color-bg-elevated', '#ffffff' ),
    9601094                        'site_header_bg_color'           => array( '--bx-color-header-bg', '#ffffff' ),
    … …  
    15371671
    15381672                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.
    15421684                                continue;
    15431685                        }
    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();
    15551726        }
    15561727
  • buddyx/5.1.5/inc/Welcome/Component.php

    r339988 r340497  
    410410                                                                                                $buddyx_family_plugin_status    = $this->family_status( $buddyx_family_plugin );
    411411                                                                                                $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'];
    415413                                                                                                // Minimal UTM so we can see which welcome-screen card drove the visit.
    416414                                                                                                $buddyx_family_utm         = array(
  • buddyx/5.1.5/inc/compatibility/fluentcart/fluentcart-functions.php

    r334340 r340497  
    332332                                <div class="menu-icons-wrapper cart-widget-wrapper">
    333333                                        <div class="cart">
    334                                                 <a href="#" class="cart-icon-wrap fcart-cart-toogle-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' ); ?>">
    335335                                                        <span class="fa fa-shopping-cart"></span>
    336336                                                        <?php if ( $item_count > 0 ) : ?>
    … …  
    399399                                });
    400400
    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.
    402406                                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) {
    405408                                                cartIcon.addEventListener('click', function(e) {
    406409                                                        e.preventDefault();
    407                                                         // Trigger FluentCart drawer toggle
    408                                                         const event = new CustomEvent('fluent_cart_toggle_drawer');
    409                                                         document.dispatchEvent(event);
    410410                                                });
    411                                         }
     411                                        });
    412412                                });
    413413                        })();
  • buddyx/5.1.5/readme.txt

    r339988 r340497  
    55Tested up to: 7.0
    66Requires PHP: 8.0
    7 Stable tag: 5.1.4
     7Stable tag: 5.1.5
    88License: GNU General Public License v3.0 (or later)
    99License URI: https://www.gnu.org/licenses/gpl-3.0.html
    … …  
    129129
    130130== 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.
    131146
    132147= 5.1.4 - July 2026 =
  • buddyx/5.1.5/style.css

    r339988 r340497  
    55Author URI: https://github.com/vapvarun/buddyx
    66Description: 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.4
     7Version: 5.1.5
    88Requires at least: 6.5
    99Tested up to: 7.0
  • buddyx/5.1.5/template-parts/layout/entry-default-layout.php

    r332732 r340497  
    1818);
    1919
    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', '' );
    2221?>
    2322
  • buddyx/5.1.5/woocommerce/archive-product.php

    r269187 r340497  
    3636                                do_action( 'buddyx_before_breadcrumb' );
    3737
    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 ) ) {
    3941                                        buddyx_the_breadcrumb();
    4042                                }
Note: See TracChangeset for help on using the changeset viewer.