Plugin Directory

Changeset 3736444


Ignore:
Timestamp:
10/09/2026 10:52:53 AM (2 weeks ago)
Author:
wbcomdesigns
Message:

Updated version

Location:
bp-user-profile-reviews
Files:
122 added
33 edited

Legend:

Unmodified
Added
Removed
  • bp-user-profile-reviews/trunk/admin/assets/css/bupr-admin.css

    r3617176 r3736444  
    7777
    7878
    79 /* Rounded sliders */
    80 .bupr-slider.bupr-round {
    81     border-radius: 34px;
    82 }
    83 
    84 .bupr-slider.bupr-round:before {
    85     border-radius: 50%;
    86 }
    87 
    8879.bupr_excluding_member {
    8980    width: 70%;
    … …  
    9990}
    10091
    101 @media (min-width: 782px) {
    102     .bupr-switch {
    103         width: 30px;
    104         height: 17px;
    105     }
    106 
    107     .bupr-slider:before {
    108         height: 13px;
    109         width: 13px;
    110         left: 2px;
    111         bottom: 2px;
    112     }
    113 
    114     input:checked+.bupr-slider:before {
    115         -webkit-transform: translateX(13px);
    116         -ms-transform: translateX(13px);
    117         transform: translateX(13px);
    118     }
    119 }
    12092
    12193/* Admin Switch Toggle : End */
    … …  
    129101    background-color: var(--bupr-admin-surface-1, #fafafa);
    130102    /* Must travel with the background. Once the surface follows the token it
    131        goes dark under body.admin-color-dark, while WP's default input colour
     103       goes dark under body.is-dark-theme, while WP's default input colour
    132104       stays near-black - dark text on a dark field. Verified in-browser. */
    133105    color: var(--bupr-admin-text, #1e293b);
    … …  
    144116    -ms-flex-pack: center;
    145117    justify-content: center;
    146 }
    147 
    148 .bupr-criteria .bupr-delete-tag input[type=button],
    149 #bupr-add-criteria-action input#bupr-btnAdd,
    150 #bupr-admin-row-criteria input.bupr-remove.button.button-secondary {
    151     padding: 12px 30px;
    152     font-size: 15px;
    153     background: var(--bupr-admin-danger, #ee1313);
    154     margin-inline-end: 35px;
    155     text-shadow: none;
    156     font-weight: 600;
    157     width: auto;
    158     color: #fff;
    159     line-height: 1;
    160     border: 0;
    161     -webkit-transition: all 0.3s;
    162     transition: all 0.3s;
    163     box-shadow: 0px 8px 20px rgba(32, 53, 85, 0.35);
    164     border-radius: 12px;
    165     height: auto;
    166 }
    167 
    168 .bupr-criteria .bupr-delete-tag input[type=button]:hover {
    169     background: var(--bupr-admin-danger-hover, #272B41);
    170 }
    171 
    172 #bupr-add-criteria-action input#bupr-btnAdd:hover {
    173     background: var(--bupr-admin-success-hover, #272B41);
    174 }
    175 
    176 #bupr-add-criteria-action input#bupr-btnAdd {
    177     padding: 16px 30px;
    178     margin-bottom: 10px;
    179     margin-top: 10px;
    180     background: var(--bupr-admin-success, #08c462);
    181118}
    182119
    … …  
    327264}
    328265
    329 /* custom css for switch */
    330 .bupr-switch-custom {
    331     margin: 0 10px;
    332     margin-top: 6px;
    333 }
    334 
    335 .buprcriteria .bupr-switch {
    336     margin-right: 40px;
    337 }
    338 
    339 @media(max-width: 781px) {
    340     .buprcriteria input:checked+.bupr-slider::before {
    341         -webkit-transform: translateX(35px);
    342         -ms-transform: translateX(35px);
    343         transform: translateX(35px);
    344     }
    345 
    346     .buprcriteria .bupr-switch {
    347         width: 70px;
    348         margin-right: 0;
    349     }
    350 }
    351 
    352266.bupr-delete-tag {
    353267    margin-top: 0px;
    354268    margin-bottom: 10px;
    355 }
    356 
    357 .bupr-criteria-remove-button {
    358     border-radius: 20px;
    359     height: 34px;
    360     margin: 0;
    361     padding: 2px;
    362     width: 70px;
    363269}
    364270
    … …  
    380286}
    381287
    382 .bupr-show-if-allowed {
     288/* The legacy card sets `.bupr-card--legacy .wbcom-settings-section-wrap { display: flex }`
     289   (0,2,0); the gate must out-rank it or the criteria builder never hides. */
     290.bupr-show-if-allowed,
     291.bupr-card--legacy .wbcom-settings-section-wrap.bupr-show-if-allowed {
    383292    display: none;
    384293}
    … …  
    437346 * Do not reintroduce either. Style notices through `.bupr-admin .notice`.
    438347 */
    439 
    440 .wbcom-settings-section-options input#profile_reviews_per_page {
    441     width: 300px;
    442     margin-inline-end: 10px;
    443 }
     348/* Reviews list: a review pulled by the report threshold, as opposed to one awaiting
     349   first approval. This sheet also loads on edit.php?post_type=review, which has no
     350   .bupr-admin wrapper, so every token keeps a literal fallback. */
     351.bupr-status-auto-hidden {
     352    display: inline-block;
     353    margin-inline-start: 4px;
     354    padding: 1px 8px;
     355    border-radius: 999px;
     356    font-size: 11px;
     357    font-weight: 600;
     358    line-height: 1.6;
     359    background: var(--bupr-admin-danger-light, #fee2e2);
     360    color: var(--bupr-admin-danger, #b91c1c);
     361}
  • bp-user-profile-reviews/trunk/admin/assets/css/min/bupr-admin.min.css

    r3617176 r3736444  
    1 .bupr-admin-settings-header p{font-size:24px}.wbcom-wrap .notice.notice-error.is-dismissible.learndash-license-is-dismissible{display:none}.bupr-admin-settings-spinner{vertical-align:middle;display:none}.bupr-btn-ajax{color:var(--bupr-admin-accent,#66c6e4)}#bupr_settings_updated{display:none;margin-left:0;margin-bottom:15px}.bupr-review-fields input{width:100%}.bupr-remove{margin:10px 0}.bupr-widget-class p{width:100%}.bupr-widget-class p label{width:50%}.bupr-widget-class p input{width:50%}.bupr-widget-class p select{width:50%}.bupr-adming-setting{float:left;width:90%;padding-top:10px}.bupr-border{border-inline-end:1px solid var(--bupr-admin-border,hsl(0,0%,87%))}.bupr-shortcode{font-size:16px;font-weight:400}.wbcom-field-error{color:var(--bupr-admin-danger,#ee1313);font-family:auto;font-weight:100}.bupr-slider.bupr-round{border-radius:34px}.bupr-slider.bupr-round:before{border-radius:50%}.bupr_excluding_member{width:70%}.bupr_adding_member{width:70%}.bupr-label{font-size:15px;font-weight:600}@media (min-width:782px){.bupr-switch{width:30px;height:17px}.bupr-slider:before{height:13px;width:13px;left:2px;bottom:2px}input:checked+.bupr-slider:before{-webkit-transform:translateX(13px);-ms-transform:translateX(13px);transform:translateX(13px)}}.bupr-criteria input[type=text]{width:95%;height:40px;border-radius:8px;border-color:var(--bupr-admin-border,#e3e2ea);background-color:var(--bupr-admin-surface-1,#fafafa);color:var(--bupr-admin-text,#1e293b)}.bupr-admin-col-6.buprcriteria{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}#bupr-add-criteria-action input#bupr-btnAdd,#bupr-admin-row-criteria input.bupr-remove.button.button-secondary,.bupr-criteria .bupr-delete-tag input[type=button]{padding:12px 30px;font-size:15px;background:var(--bupr-admin-danger,#ee1313);margin-inline-end:35px;text-shadow:none;font-weight:600;width:auto;color:#fff;line-height:1;border:0;-webkit-transition:all .3s;transition:all .3s;box-shadow:0 8px 20px rgba(32,53,85,.35);border-radius:12px;height:auto}.bupr-criteria .bupr-delete-tag input[type=button]:hover{background:var(--bupr-admin-danger-hover,#272b41)}#bupr-add-criteria-action input#bupr-btnAdd:hover{background:var(--bupr-admin-success-hover,#272b41)}#bupr-add-criteria-action input#bupr-btnAdd{padding:16px 30px;margin-bottom:10px;margin-top:10px;background:var(--bupr-admin-success,#08c462)}[class*=bupr-admin-col-]{float:left;padding:10px 0}div#bupr-admin-row-criteria.bupr-admin-row{overflow:hidden;border:1px solid var(--bupr-admin-border,#e3e2ec);border-radius:10px;padding:5px 13px;margin-top:15px;display:-webkit-box;display:-ms-flexbox;display:flex;background:var(--bupr-admin-white,#fff);-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-admin-row#bupr-admin-row-criteria .bupr-admin-col-6{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-admin-col-1{width:8.33%}.bupr-admin-col-2{width:16.66%}.bupr-admin-col-3{width:25%}.bupr-admin-col-4{width:33.33%}.bupr-admin-col-5{width:41.66%}.bupr-admin-col-6{width:50%}.bupr-admin-col-7{width:58.33%}.bupr-admin-col-8{width:66.66%}.bupr-admin-col-9{width:75%}.bupr-admin-col-10{width:83.33%}.bupr-admin-col-11{width:91.66%}.bupr-admin-col-12{width:100%}@media(max-width:767px){[class*=bupr-admin-col-]{width:100%}div#bupr-admin-row-criteria.bupr-admin-row{-ms-flex-flow:wrap;flex-flow:wrap}.bupr-admin-col-6.buprcriteria{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}}button.bupr-accordion{background-color:var(--bupr-admin-surface-2,#ddd);border:medium none;border-top-right-radius:10px;border-top-left-radius:10px;color:var(--bupr-admin-text,#444);cursor:pointer;font-size:15px;margin:0 5%;outline:medium none;padding:15px 20px;text-align:left;-webkit-transition:all .4s ease 0s;transition:all .4s ease 0s;width:90%}button.bupr-accordion.active,button.bupr-accordion:hover{background-color:var(--bupr-admin-accent,#2094f3);color:#fff}div.panel{padding:0 18px;background-color:#fff;max-height:0;overflow:hidden;-webkit-transition:max-height .2s ease-out;transition:max-height .2s ease-out;margin:0 5%}button.bupr-accordion::after{color:var(--bupr-admin-text-3,#777);content:"+";float:right;font-size:13px;font-weight:700;margin-left:5px}button.bupr-accordion::after:hover{color:#fff}button.bupr-accordion.active::after{content:"−";color:#fff}.bupr-switch-custom{margin:0 10px;margin-top:6px}.buprcriteria .bupr-switch{margin-right:40px}@media(max-width:781px){.buprcriteria input:checked+.bupr-slider::before{-webkit-transform:translateX(35px);-ms-transform:translateX(35px);transform:translateX(35px)}.buprcriteria .bupr-switch{width:70px;margin-right:0}}.bupr-delete-tag{margin-top:0;margin-bottom:10px}.bupr-criteria-remove-button{border-radius:20px;height:34px;margin:0;padding:2px;width:70px}.buprcriteria span.description{margin:0}span.move-icons{font-size:30px;font-weight:700;margin-right:10px;cursor:move}.bupr-display-info{font-weight:400;font-size:14px;margin-left:10px}.bupr-show-if-allowed{display:none}.bupr-approve-review{color:green}.bupr-extra-actions{float:right}.nav-tab-wrapper ul .bupr-general a:before{content:"\f111"}.nav-tab-wrapper ul .bupr-criteria a:before{content:"\f155"}.nav-tab-wrapper ul .bupr-shortcode a:before{content:"\f150"}.nav-tab-wrapper ul .bupr-display a:before{content:"\f478"}.nav-tab-wrapper ul .bupr-pro-features a:before{content:"\f527"}.wbcom-settings-section-options input#profile_reviews_per_page{width:300px;margin-inline-end:10px}
     1.bupr-admin-settings-header p{font-size:24px}.wbcom-wrap .notice.notice-error.is-dismissible.learndash-license-is-dismissible{display:none}.bupr-admin-settings-spinner{vertical-align:middle;display:none}.bupr-btn-ajax{color:var(--bupr-admin-accent,#66c6e4)}#bupr_settings_updated{display:none;margin-left:0;margin-bottom:15px}.bupr-review-fields input{width:100%}.bupr-remove{margin:10px 0}.bupr-widget-class p{width:100%}.bupr-widget-class p label{width:50%}.bupr-widget-class p input{width:50%}.bupr-widget-class p select{width:50%}.bupr-adming-setting{float:left;width:90%;padding-top:10px}.bupr-border{border-inline-end:1px solid var(--bupr-admin-border,hsl(0,0%,87%))}.bupr-shortcode{font-size:16px;font-weight:400}.wbcom-field-error{color:var(--bupr-admin-danger,#ee1313);font-family:auto;font-weight:100}.bupr_excluding_member{width:70%}.bupr_adding_member{width:70%}.bupr-label{font-size:15px;font-weight:600}.bupr-criteria input[type=text]{width:95%;height:40px;border-radius:8px;border-color:var(--bupr-admin-border,#e3e2ea);background-color:var(--bupr-admin-surface-1,#fafafa);color:var(--bupr-admin-text,#1e293b)}.bupr-admin-col-6.buprcriteria{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}[class*=bupr-admin-col-]{float:left;padding:10px 0}div#bupr-admin-row-criteria.bupr-admin-row{overflow:hidden;border:1px solid var(--bupr-admin-border,#e3e2ec);border-radius:10px;padding:5px 13px;margin-top:15px;display:-webkit-box;display:-ms-flexbox;display:flex;background:var(--bupr-admin-white,#fff);-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-admin-row#bupr-admin-row-criteria .bupr-admin-col-6{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-admin-col-1{width:8.33%}.bupr-admin-col-2{width:16.66%}.bupr-admin-col-3{width:25%}.bupr-admin-col-4{width:33.33%}.bupr-admin-col-5{width:41.66%}.bupr-admin-col-6{width:50%}.bupr-admin-col-7{width:58.33%}.bupr-admin-col-8{width:66.66%}.bupr-admin-col-9{width:75%}.bupr-admin-col-10{width:83.33%}.bupr-admin-col-11{width:91.66%}.bupr-admin-col-12{width:100%}@media(max-width:767px){[class*=bupr-admin-col-]{width:100%}div#bupr-admin-row-criteria.bupr-admin-row{-ms-flex-flow:wrap;flex-flow:wrap}.bupr-admin-col-6.buprcriteria{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}}button.bupr-accordion{background-color:var(--bupr-admin-surface-2,#ddd);border:medium none;border-top-right-radius:10px;border-top-left-radius:10px;color:var(--bupr-admin-text,#444);cursor:pointer;font-size:15px;margin:0 5%;outline:medium none;padding:15px 20px;text-align:left;-webkit-transition:all .4s ease 0s;transition:all .4s ease 0s;width:90%}button.bupr-accordion.active,button.bupr-accordion:hover{background-color:var(--bupr-admin-accent,#2094f3);color:#fff}div.panel{padding:0 18px;background-color:#fff;max-height:0;overflow:hidden;-webkit-transition:max-height .2s ease-out;transition:max-height .2s ease-out;margin:0 5%}button.bupr-accordion::after{color:var(--bupr-admin-text-3,#777);content:"+";float:right;font-size:13px;font-weight:700;margin-left:5px}button.bupr-accordion::after:hover{color:#fff}button.bupr-accordion.active::after{content:"−";color:#fff}.bupr-delete-tag{margin-top:0;margin-bottom:10px}.buprcriteria span.description{margin:0}span.move-icons{font-size:30px;font-weight:700;margin-right:10px;cursor:move}.bupr-display-info{font-weight:400;font-size:14px;margin-left:10px}.bupr-card--legacy .wbcom-settings-section-wrap.bupr-show-if-allowed,.bupr-show-if-allowed{display:none}.bupr-approve-review{color:green}.bupr-extra-actions{float:right}.nav-tab-wrapper ul .bupr-general a:before{content:"\f111"}.nav-tab-wrapper ul .bupr-criteria a:before{content:"\f155"}.nav-tab-wrapper ul .bupr-shortcode a:before{content:"\f150"}.nav-tab-wrapper ul .bupr-display a:before{content:"\f478"}.nav-tab-wrapper ul .bupr-pro-features a:before{content:"\f527"}.bupr-status-auto-hidden{display:inline-block;margin-inline-start:4px;padding:1px 8px;border-radius:999px;font-size:11px;font-weight:600;line-height:1.6;background:var(--bupr-admin-danger-light,#fee2e2);color:var(--bupr-admin-danger,#b91c1c)}
  • bp-user-profile-reviews/trunk/admin/assets/css/rtl/bupr-admin.rtl.css

    r3617176 r3736444  
    7777
    7878
    79 /* Rounded sliders */
    80 .bupr-slider.bupr-round {
    81     border-radius: 34px;
    82 }
    83 
    84 .bupr-slider.bupr-round:before {
    85     border-radius: 50%;
    86 }
    87 
    8879.bupr_excluding_member {
    8980    width: 70%;
    … …  
    9990}
    10091
    101 @media (min-width: 782px) {
    102     .bupr-switch {
    103         width: 30px;
    104         height: 17px;
    105     }
    106 
    107     .bupr-slider:before {
    108         height: 13px;
    109         width: 13px;
    110         right: 2px;
    111         bottom: 2px;
    112     }
    113 
    114     input:checked+.bupr-slider:before {
    115         -webkit-transform: translateX(-13px);
    116         -ms-transform: translateX(-13px);
    117         transform: translateX(-13px);
    118     }
    119 }
    12092
    12193/* Admin Switch Toggle : End */
    … …  
    129101    background-color: var(--bupr-admin-surface-1, #fafafa);
    130102    /* Must travel with the background. Once the surface follows the token it
    131        goes dark under body.admin-color-dark, while WP's default input colour
     103       goes dark under body.is-dark-theme, while WP's default input colour
    132104       stays near-black - dark text on a dark field. Verified in-browser. */
    133105    color: var(--bupr-admin-text, #1e293b);
    … …  
    144116    -ms-flex-pack: center;
    145117    justify-content: center;
    146 }
    147 
    148 .bupr-criteria .bupr-delete-tag input[type=button],
    149 #bupr-add-criteria-action input#bupr-btnAdd,
    150 #bupr-admin-row-criteria input.bupr-remove.button.button-secondary {
    151     padding: 12px 30px;
    152     font-size: 15px;
    153     background: var(--bupr-admin-danger, #ee1313);
    154     margin-inline-end: 35px;
    155     text-shadow: none;
    156     font-weight: 600;
    157     width: auto;
    158     color: #fff;
    159     line-height: 1;
    160     border: 0;
    161     -webkit-transition: all 0.3s;
    162     transition: all 0.3s;
    163     box-shadow: 0px 8px 20px rgba(32, 53, 85, 0.35);
    164     border-radius: 12px;
    165     height: auto;
    166 }
    167 
    168 .bupr-criteria .bupr-delete-tag input[type=button]:hover {
    169     background: var(--bupr-admin-danger-hover, #272B41);
    170 }
    171 
    172 #bupr-add-criteria-action input#bupr-btnAdd:hover {
    173     background: var(--bupr-admin-success-hover, #272B41);
    174 }
    175 
    176 #bupr-add-criteria-action input#bupr-btnAdd {
    177     padding: 16px 30px;
    178     margin-bottom: 10px;
    179     margin-top: 10px;
    180     background: var(--bupr-admin-success, #08c462);
    181118}
    182119
    … …  
    327264}
    328265
    329 /* custom css for switch */
    330 .bupr-switch-custom {
    331     margin: 0 10px;
    332     margin-top: 6px;
    333 }
    334 
    335 .buprcriteria .bupr-switch {
    336     margin-left: 40px;
    337 }
    338 
    339 @media(max-width: 781px) {
    340     .buprcriteria input:checked+.bupr-slider::before {
    341         -webkit-transform: translateX(-35px);
    342         -ms-transform: translateX(-35px);
    343         transform: translateX(-35px);
    344     }
    345 
    346     .buprcriteria .bupr-switch {
    347         width: 70px;
    348         margin-left: 0;
    349     }
    350 }
    351 
    352266.bupr-delete-tag {
    353267    margin-top: 0px;
    354268    margin-bottom: 10px;
    355 }
    356 
    357 .bupr-criteria-remove-button {
    358     border-radius: 20px;
    359     height: 34px;
    360     margin: 0;
    361     padding: 2px;
    362     width: 70px;
    363269}
    364270
    … …  
    380286}
    381287
    382 .bupr-show-if-allowed {
     288/* The legacy card sets `.bupr-card--legacy .wbcom-settings-section-wrap { display: flex }`
     289   (0,2,0); the gate must out-rank it or the criteria builder never hides. */
     290.bupr-show-if-allowed,
     291.bupr-card--legacy .wbcom-settings-section-wrap.bupr-show-if-allowed {
    383292    display: none;
    384293}
    … …  
    437346 * Do not reintroduce either. Style notices through `.bupr-admin .notice`.
    438347 */
    439 
    440 .wbcom-settings-section-options input#profile_reviews_per_page {
    441     width: 300px;
    442     margin-inline-end: 10px;
    443 }
     348/* Reviews list: a review pulled by the report threshold, as opposed to one awaiting
     349   first approval. This sheet also loads on edit.php?post_type=review, which has no
     350   .bupr-admin wrapper, so every token keeps a literal fallback. */
     351.bupr-status-auto-hidden {
     352    display: inline-block;
     353    margin-inline-start: 4px;
     354    padding: 1px 8px;
     355    border-radius: 999px;
     356    font-size: 11px;
     357    font-weight: 600;
     358    line-height: 1.6;
     359    background: var(--bupr-admin-danger-light, #fee2e2);
     360    color: var(--bupr-admin-danger, #b91c1c);
     361}
     362
    444363/*# sourceMappingURL=bupr-admin.rtl.css.map */
  • bp-user-profile-reviews/trunk/admin/assets/js/bupr-admin.js

    r3617176 r3736444  
    7474                        '#bupr_allow_multiple_criteria',
    7575                        function () {
    76                                 if (jQuery(this).is(':checked')) {
    77                                         jQuery('.bupr-criteria-settings-tbl #buprTextBoxContainer').removeClass('bupr-show-if-allowed');
    78                                         jQuery('.bupr-criteria-settings-tbl #bupr-add-criteria-action').removeClass('bupr-show-if-allowed');
    79                                 } else {
    80                                         jQuery('.bupr-criteria-settings-tbl #buprTextBoxContainer').addClass('bupr-show-if-allowed');
    81                                         jQuery('.bupr-criteria-settings-tbl #bupr-add-criteria-action').addClass('bupr-show-if-allowed');
    82                                 }
     76                                // One wrapper holds the rows and the Add button; the server renders the same class on load.
     77                                jQuery('#bupr-criteria-builder').toggleClass('bupr-show-if-allowed', !this.checked);
     78                        }
     79                );
     80
     81                // Approval email fields only apply while reviews wait for approval.
     82                jQuery(document).on(
     83                        'change',
     84                        '#bupr_review_auto_approval',
     85                        function () {
     86                                jQuery('.review-approve-email-section').toggleClass('bupr-show-if-allowed', this.checked);
    8387                        }
    8488                );
    … …  
    8892                        "click",
    8993                        function () {
    90                                 var div = jQuery("<div />");
    91                                 div.html(GetDynamicTextBox(""));
    92                                 jQuery("#buprTextBoxContainer").append(div);
     94                                jQuery("#buprTextBoxContainer").append(GetDynamicTextBox(""));
    9395                        }
    9496                );
    … …  
    185187        }
    186188
    187         return '<div id="bupr-admin-row-criteria" class="bupr-admin-row border bupr-criteria"><div class="bupr-admin-col-6"><input name="bupr_admin_settings[rating_field_name][' + rand_num + ']" class = "buprDynamicTextBox" type="text" value = "' + attr(value) + '" placeholder="' + attr(placeholder) + '" aria-label="' + attr(ariaLabel) + '" /></div>' +
    188                 '<div class="bupr-admin-col-6"><input type="button" value="' + attr(removeLabel) + '" aria-label="' + attr(removeAria) + '" class="bupr-remove button button-secondary" /></div></div>'
     189        return '<div id="bupr-admin-row-criteria" class="bupr-admin-row bupr-criteria bupr-criteria-fields border draggable"><div class="bupr-admin-col-6"><span class="move-icons">&equiv;</span><input name="bupr_admin_settings[rating_field_name][' + rand_num + ']" class = "buprDynamicTextBox" type="text" value = "' + attr(value) + '" placeholder="' + attr(placeholder) + '" aria-label="' + attr(ariaLabel) + '" /></div>' +
     190                '<div class="bupr-admin-col-6 buprcriteria"><p class="bupr-delete-tag"><input type="button" value="' + attr(removeLabel) + '" aria-label="' + attr(removeAria) + '" class="bupr-criteria-remove-button bupr-remove bupr-btn bupr-btn-danger" /></p></div></div>'
    189191}
  • bp-user-profile-reviews/trunk/admin/assets/js/min/bupr-admin.min.js

    r3617176 r3736444  
    1 if("undefined"!=typeof wp&&wp.i18n){let __=wp.i18n.__}function GetDynamicTextBox(value){var rand_num=Math.random(),i18n=window.bupr_admin_ajax_object||{},placeholder=i18n.criteria_placeholder||"Add Review criteria eg. Member Response. ",ariaLabel=i18n.criteria_aria_label||"Review criteria name",removeLabel=i18n.criteria_remove||"Remove",i18n=i18n.criteria_remove_aria||"Remove this review criteria";function attr(text){return jQuery("<div/>").text(text).html()}return'<div id="bupr-admin-row-criteria" class="bupr-admin-row border bupr-criteria"><div class="bupr-admin-col-6"><input name="bupr_admin_settings[rating_field_name]['+rand_num+']" class = "buprDynamicTextBox" type="text" value = "'+attr(value)+'" placeholder="'+attr(placeholder)+'" aria-label="'+attr(ariaLabel)+'" /></div><div class="bupr-admin-col-6"><input type="button" value="'+attr(removeLabel)+'" aria-label="'+attr(i18n)+'" class="bupr-remove button button-secondary" /></div></div>'}jQuery.noConflict(),jQuery(document).ready(function($){jQuery("#buprTextBoxContainer").sortable(),jQuery("#buprTextBoxContainer").disableSelection(),jQuery("#bupr_exc_member").select2(),jQuery("#bupr_add_member").select2();for(var acc=document.getElementsByClassName("bupr-accordion"),i=0;i<acc.length;i++)acc[i].onclick=function(){this.classList.toggle("active");var panel=this.nextElementSibling;panel.style.maxHeight?panel.style.maxHeight=null:panel.style.maxHeight=panel.scrollHeight+"px"};var bupr_current_tab=jQuery(".bupr-tab-active").val();jQuery("."+bupr_current_tab).addClass("nav-tab-active"),jQuery(".bupr_enable_criteria").change(function(){jQuery(this).is(":checked")?jQuery(this).val("yes"):jQuery(this).val("no")}),jQuery(document).on("change","#bupr_allow_multiple_criteria",function(){jQuery(this).is(":checked")?(jQuery(".bupr-criteria-settings-tbl #buprTextBoxContainer").removeClass("bupr-show-if-allowed"),jQuery(".bupr-criteria-settings-tbl #bupr-add-criteria-action").removeClass("bupr-show-if-allowed")):(jQuery(".bupr-criteria-settings-tbl #buprTextBoxContainer").addClass("bupr-show-if-allowed"),jQuery(".bupr-criteria-settings-tbl #bupr-add-criteria-action").addClass("bupr-show-if-allowed"))}),jQuery("#bupr-btnAdd").bind("click",function(){var div=jQuery("<div />");div.html(GetDynamicTextBox("")),jQuery("#buprTextBoxContainer").append(div)}),jQuery("body").on("click",".bupr-remove",function(){jQuery(this).parent().parent().parent("div").remove()}),jQuery(document).on("click",".bupr-approve-review",function(){var review_id=jQuery(this).data("rid");jQuery(this).html(bupr_admin_ajax_object.approving_text),jQuery.post(bupr_admin_ajax_object.ajaxurl,{action:"bupr_approve_review",review_id:review_id,nonce:bupr_admin_ajax_object.nonce},function(response){response&&response.success&&response.data&&"review-approved-successfully"===response.data.code?window.location.reload():console.log(response&&response.data?response.data.message:response)})}),jQuery(document).on("keyup","#bupr_member_tab_title",function(){null!=jQuery(this).val().match(/\d+/g)?($(this).next().text(bupr_admin_ajax_object.number_validation),$(this).parent().append('<span class="wbcom-field-error"></span>'),$("#submit").attr("disabled","disabled")):($(this).siblings("wbcom-field-error").remove(),$(this).next().text(""),$("#submit").removeAttr("disabled","disabled"))}),jQuery(document).on("keyup","#bupr_member_tab_title_plural",function(){null!=jQuery(this).val().match(/\d+/g)?($(this).next().text(bupr_admin_ajax_object.number_validation),$(this).parent().append('<span class="wbcom-field-error"></span>'),$("#submit").attr("disabled","disabled")):($(this).siblings("wbcom-field-error").remove(),$(this).next().text(""),$("#submit").removeAttr("disabled","disabled"))})});
     1if("undefined"!=typeof wp&&wp.i18n){let __=wp.i18n.__}function GetDynamicTextBox(value){var rand_num=Math.random(),i18n=window.bupr_admin_ajax_object||{},placeholder=i18n.criteria_placeholder||"Add Review criteria eg. Member Response. ",ariaLabel=i18n.criteria_aria_label||"Review criteria name",removeLabel=i18n.criteria_remove||"Remove",i18n=i18n.criteria_remove_aria||"Remove this review criteria";function attr(text){return jQuery("<div/>").text(text).html()}return'<div id="bupr-admin-row-criteria" class="bupr-admin-row bupr-criteria bupr-criteria-fields border draggable"><div class="bupr-admin-col-6"><span class="move-icons">&equiv;</span><input name="bupr_admin_settings[rating_field_name]['+rand_num+']" class = "buprDynamicTextBox" type="text" value = "'+attr(value)+'" placeholder="'+attr(placeholder)+'" aria-label="'+attr(ariaLabel)+'" /></div><div class="bupr-admin-col-6 buprcriteria"><p class="bupr-delete-tag"><input type="button" value="'+attr(removeLabel)+'" aria-label="'+attr(i18n)+'" class="bupr-criteria-remove-button bupr-remove bupr-btn bupr-btn-danger" /></p></div></div>'}jQuery.noConflict(),jQuery(document).ready(function($){jQuery("#buprTextBoxContainer").sortable(),jQuery("#buprTextBoxContainer").disableSelection(),jQuery("#bupr_exc_member").select2(),jQuery("#bupr_add_member").select2();for(var acc=document.getElementsByClassName("bupr-accordion"),i=0;i<acc.length;i++)acc[i].onclick=function(){this.classList.toggle("active");var panel=this.nextElementSibling;panel.style.maxHeight?panel.style.maxHeight=null:panel.style.maxHeight=panel.scrollHeight+"px"};var bupr_current_tab=jQuery(".bupr-tab-active").val();jQuery("."+bupr_current_tab).addClass("nav-tab-active"),jQuery(".bupr_enable_criteria").change(function(){jQuery(this).is(":checked")?jQuery(this).val("yes"):jQuery(this).val("no")}),jQuery(document).on("change","#bupr_allow_multiple_criteria",function(){jQuery("#bupr-criteria-builder").toggleClass("bupr-show-if-allowed",!this.checked)}),jQuery(document).on("change","#bupr_review_auto_approval",function(){jQuery(".review-approve-email-section").toggleClass("bupr-show-if-allowed",this.checked)}),jQuery("#bupr-btnAdd").bind("click",function(){jQuery("#buprTextBoxContainer").append(GetDynamicTextBox(""))}),jQuery("body").on("click",".bupr-remove",function(){jQuery(this).parent().parent().parent("div").remove()}),jQuery(document).on("click",".bupr-approve-review",function(){var review_id=jQuery(this).data("rid");jQuery(this).html(bupr_admin_ajax_object.approving_text),jQuery.post(bupr_admin_ajax_object.ajaxurl,{action:"bupr_approve_review",review_id:review_id,nonce:bupr_admin_ajax_object.nonce},function(response){response&&response.success&&response.data&&"review-approved-successfully"===response.data.code?window.location.reload():console.log(response&&response.data?response.data.message:response)})}),jQuery(document).on("keyup","#bupr_member_tab_title",function(){null!=jQuery(this).val().match(/\d+/g)?($(this).next().text(bupr_admin_ajax_object.number_validation),$(this).parent().append('<span class="wbcom-field-error"></span>'),$("#submit").attr("disabled","disabled")):($(this).siblings("wbcom-field-error").remove(),$(this).next().text(""),$("#submit").removeAttr("disabled","disabled"))}),jQuery(document).on("keyup","#bupr_member_tab_title_plural",function(){null!=jQuery(this).val().match(/\d+/g)?($(this).next().text(bupr_admin_ajax_object.number_validation),$(this).parent().append('<span class="wbcom-field-error"></span>'),$("#submit").attr("disabled","disabled")):($(this).siblings("wbcom-field-error").remove(),$(this).next().text(""),$("#submit").removeAttr("disabled","disabled"))})});
  • bp-user-profile-reviews/trunk/admin/bupr-admin.php

    r3617176 r3736444  
    4040                        add_filter( 'pre_update_option_bupr_admin_settings', array( $this, 'bupr_update_admin_settings' ), 10, 2 );
    4141                        add_action( 'transition_post_status', array( $this, 'bupr_generate_activity_review_status_change' ), 10, 3 );
     42                        add_action( 'template_redirect', array( $this, 'bupr_redirect_review_single' ) );
    4243                        /* Register custom post type review */
    4344                        $bupr_post_types = get_post_types();
    … …  
    207208                        $args   = array(
    208209                                'labels'             => $labels,
    209                                 'public'             => true,
     210                                // Not public: a review's own page, archive, search result and sitemap entry
     211                                // would show the real author of an anonymous review. Reviews are read on the
     212                                // member's profile; old /review/ links redirect there (bupr_redirect_review_single).
     213                                'public'             => false,
    210214                                'menu_icon'          => 'dashicons-testimonial',
    211215                                'publicly_queryable' => true,
    … …  
    222226                                ),
    223227                                'map_meta_cap'       => true,
    224                                 'has_archive'        => true,
     228                                'has_archive'        => false,
    225229                                'hierarchical'       => false,
    226230                                'menu_position'      => null,
    … …  
    231235
    232236                /**
     237                 * Send a review's own URL (/review/slug/) to the review on the member's profile.
     238                 * Listings (old archive rule, feed, ?post_type=review) and unpublished reviews
     239                 * 404 so no page renders the author. Group reviews are left to Group Reviews.
     240                 *
     241                 * @since 3.8.1
     242                 */
     243                public function bupr_redirect_review_single() {
     244                        global $wp_query;
     245                        if ( ! is_singular( 'review' ) ) {
     246                                if ( in_array( 'review', (array) get_query_var( 'post_type' ), true ) && ! is_admin() ) {
     247                                        $wp_query->set_404();
     248                                        status_header( 404 );
     249                                }
     250                                return;
     251                        }
     252                        $review_id = get_queried_object_id();
     253                        $member_id = (int) get_post_meta( $review_id, 'linked_bp_member', true );
     254                        if ( ! $member_id ) {
     255                                return;
     256                        }
     257                        if ( 'publish' === get_post_status( $review_id ) ) {
     258                                wp_safe_redirect( bupr_member_url( $member_id ) . bupr_profile_review_tab_plural_slug() . '/view/' . $review_id, 301 );
     259                                exit;
     260                        }
     261                        $wp_query->set_404();
     262                        status_header( 404 );
     263                }
     264
     265                /**
    233266                 * Get review count and display in admin menu.
    234267                 *
    … …  
    248281                                                        $key = $this->bupr_recursive_array_search( 'edit.php?post_type=review', $menu );
    249282
    250                                                         if ( false === $key ) {
     283                                                        // BP Group Reviews shares the review post type and adds the same badge.
     284                                                        if ( false === $key || false !== strpos( $menu[ $key ][0], 'awaiting-mod' ) ) {
    251285                                                                return;
    252286                                                        }
    … …  
    339373
    340374                                        do_action( 'bupr_member_review_after_review_insert', $post->ID, $bupr_member_id );
    341                                         do_action( 'bupr_sent_review_notification', $bupr_member_id, $post->ID );
     375
     376                                        // A review brought back after its reports were dismissed is not news to the
     377                                        // member. This runs before bupr_handle_review_status_transition() clears the
     378                                        // marker (same priority, registered first), so the marker still means "restore".
     379                                        if ( get_post_meta( $post->ID, 'bupr_auto_hidden', true ) ) {
     380                                                return;
     381                                        }
     382
     383                                        // Honour the owner's switches, as the submit path in BUPR_AJAX does.
     384                                        if ( isset( $bupr['allow_notification'] ) && 'yes' === $bupr['allow_notification'] ) {
     385                                                do_action( 'bupr_sent_review_notification', $bupr_member_id, $post->ID );
     386                                        }
     387                                        if ( ! isset( $bupr['allow_email'] ) || 'yes' !== $bupr['allow_email'] ) {
     388                                                return;
     389                                        }
    342390
    343391                                        $bupr_admin_general = get_option( 'bupr_admin_general_options' );
    … …  
    369417                                        );
    370418
    371                                         // Check BuddyPress version and use the appropriate function.
    372                                         // Check if the bp_members_get_user_url() function exists (introduced in BuddyPress 12.0.0).
    373                                         if ( function_exists( 'bp_members_get_user_url' ) ) {
    374                                                 // Use bp_members_get_user_url() if it exists (for BuddyPress v12.0.0 and above).
    375                                                 $bupr_review_url = bp_members_get_user_url( $bupr_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $post->ID;
    376                                         } else {
    377                                                 // Fall back to bp_core_get_user_domain() for older versions of BuddyPress.
    378                                                 $bupr_review_url = bp_core_get_user_domain( $bupr_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $post->ID;
    379                                         }
     419                                        $bupr_review_url = bupr_member_url( $bupr_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $post->ID;
    380420                                        $bupr_to = $bupr_reciever_email;
    381421                                        // Define a default value for $bupr_subject with translation support.
    … …  
    406446                                        }
    407447                                        $bupr_header = array( 'Content-Type: text/html; charset=UTF-8' );
    408                                         wp_mail( $bupr_to, $bupr_subject, nl2br( $bupr_message ), $bupr_header );
     448                                        wp_mail( $bupr_to, $bupr_subject, wpautop( $bupr_message ), $bupr_header );
    409449                                }
    410450                        }
    … …  
    485525                        }
    486526
     527                        // Pulled by the report threshold, not waiting for first approval.
     528                        if ( 'draft' === get_post_status( $post_id ) && get_post_meta( $post_id, 'bupr_auto_hidden', true ) ) {
     529                                $hidden_at     = (int) get_post_meta( $post_id, 'bupr_auto_hidden_date', true );
     530                                $status_label .= sprintf(
     531                                        ' <span class="bupr-status-auto-hidden" title="%s">%s</span>',
     532                                        /* translators: %s: date and time the review was hidden. */
     533                                        esc_attr( $hidden_at ? sprintf( __( 'Hidden on %s', 'bp-member-reviews' ), date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $hidden_at ) ) : '' ),
     534                                        esc_html__( 'Auto-hidden', 'bp-member-reviews' )
     535                                );
     536                        }
     537
    487538                        printf(
    488539                                '<span class="bupr-flag-count %s">%d %s</span>%s',
    … …  
    502553                 */
    503554                public function bupr_add_flagged_filter_link( $views ) {
    504                         $flagged_count = $this->bupr_get_flagged_reviews_count();
     555                        $flagged_count = bupr_get_flagged_reviews_count();
    505556
    506557                        if ( $flagged_count > 0 ) {
    … …  
    524575                        }
    525576
     577                        $auto_hidden_count = bupr_get_auto_hidden_reviews_count();
     578                        if ( $auto_hidden_count > 0 ) {
     579                                // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Checking query param for view highlight only.
     580                                $current              = isset( $_GET['bupr_auto_hidden'] ) && '1' === sanitize_text_field( wp_unslash( $_GET['bupr_auto_hidden'] ) ) ? 'current' : '';
     581                                $views['auto_hidden'] = sprintf(
     582                                        '<a href="%s" class="%s">%s <span class="count">(%d)</span></a>',
     583                                        esc_url(
     584                                                add_query_arg(
     585                                                        array(
     586                                                                'post_type'        => 'review',
     587                                                                'post_status'      => 'draft',
     588                                                                'bupr_auto_hidden' => '1',
     589                                                        ),
     590                                                        admin_url( 'edit.php' )
     591                                                )
     592                                        ),
     593                                        esc_attr( $current ),
     594                                        esc_html__( 'Auto-hidden', 'bp-member-reviews' ),
     595                                        (int) $auto_hidden_count
     596                                );
     597                        }
     598
    526599                        return $views;
    527                 }
    528 
    529                 /**
    530                  * Get count of flagged reviews.
    531                  *
    532                  * @since 3.8.0
    533                  * @return int The count of flagged reviews.
    534                  */
    535                 private function bupr_get_flagged_reviews_count() {
    536                         global $wpdb;
    537                         return (int) $wpdb->get_var(
    538                                 $wpdb->prepare(
    539                                         "SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p
    540                                         INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
    541                                         WHERE p.post_type = %s
    542                                         AND p.post_status IN ('publish', 'draft')
    543                                         AND pm.meta_key = 'bupr_flag_status'
    544                                         AND pm.meta_value = 'flagged'",
    545                                         'review'
    546                                 )
    547                         );
    548600                }
    549601
    … …  
    574626                                                        'value'   => 'flagged',
    575627                                                        'compare' => '=',
     628                                                ),
     629                                        )
     630                                );
     631                        }
     632
     633                        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Query filter based on URL param, no state change.
     634                        if ( isset( $_GET['bupr_auto_hidden'] ) && '1' === sanitize_text_field( wp_unslash( $_GET['bupr_auto_hidden'] ) ) ) {
     635                                $query->set( 'post_status', 'draft' );
     636                                // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Necessary for auto-hidden filter functionality.
     637                                $query->set(
     638                                        'meta_query',
     639                                        array(
     640                                                array(
     641                                                        'key'     => 'bupr_auto_hidden',
     642                                                        'compare' => 'EXISTS',
    576643                                                ),
    577644                                        )
    … …  
    704771                        }
    705772
    706                         $new_status = 'bupr_dismiss_flags' === $doaction ? 'dismissed' : 'resolved';
    707                         $updated    = 0;
     773                        // Same Editor gate as the single Dismiss/Resolve actions.
     774                        if ( ! current_user_can( 'edit_others_posts' ) ) {
     775                                return $redirect_to;
     776                        }
     777
     778                        $updated = 0;
    708779
    709780                        foreach ( $post_ids as $post_id ) {
    710                                 $current_status = get_post_meta( $post_id, 'bupr_flag_status', true );
    711                                 if ( 'flagged' === $current_status ) {
    712                                         update_post_meta( $post_id, 'bupr_flag_status', $new_status );
    713                                         ++$updated;
     781                                if ( 'flagged' !== get_post_meta( $post_id, 'bupr_flag_status', true ) ) {
     782                                        continue;
    714783                                }
     784                                $this->bupr_close_reports( (int) $post_id, 'bupr_dismiss_flags' === $doaction ? 'dismissed' : 'resolved' );
     785                                ++$updated;
    715786                        }
    716787
    … …  
    758829
    759830                /**
     831                 * Close the reports on one review as dismissed or resolved. Shared by the
     832                 * single and bulk actions so every path treats reports the same way.
     833                 *
     834                 * @since 3.8.1
     835                 * @param int    $review_id Review post ID.
     836                 * @param string $status    'dismissed' or 'resolved'.
     837                 */
     838                private function bupr_close_reports( $review_id, $status ) {
     839                        update_post_meta( $review_id, 'bupr_flag_status', $status );
     840                        // Reports up to now were reviewed by an admin; only later ones count toward auto-hide.
     841                        $bupr_flags = get_post_meta( $review_id, 'bupr_flags', true );
     842                        update_post_meta( $review_id, 'bupr_flag_dismissed_at_count', is_array( $bupr_flags ) ? count( $bupr_flags ) : 0 );
     843
     844                        if ( 'dismissed' !== $status ) {
     845                                return;
     846                        }
     847
     848                        // Dismissing means the reports were unfounded: a review they auto-hid comes back.
     849                        // The publish transition clears the auto-hidden marker and restores its activity.
     850                        if ( get_post_meta( $review_id, 'bupr_auto_hidden', true ) && 'draft' === get_post_status( $review_id ) ) {
     851                                wp_update_post(
     852                                        array(
     853                                                'ID'          => $review_id,
     854                                                'post_status' => 'publish',
     855                                        )
     856                                );
     857                        }
     858                }
     859
     860                /**
    760861                 * Handle dismiss flag action from admin-post.
    761862                 *
    … …  
    771872
    772873                        // Check user capabilities.
    773                         if ( ! current_user_can( 'edit_post', $review_id ) ) {
     874                        // Moderating reports is an Editor task; edit_post let an Author dismiss reports on their own review.
     875                        if ( ! current_user_can( 'edit_others_posts' ) ) {
    774876                                wp_die( esc_html__( 'You do not have permission to perform this action.', 'bp-member-reviews' ) );
    775877                        }
    … …  
    781883                        }
    782884
    783                         // Update flag status to dismissed.
    784                         update_post_meta( $review_id, 'bupr_flag_status', 'dismissed' );
     885                        $this->bupr_close_reports( $review_id, 'dismissed' );
    785886
    786887                        // Redirect back to the review edit page.
    … …  
    812913
    813914                        // Check user capabilities.
    814                         if ( ! current_user_can( 'edit_post', $review_id ) ) {
     915                        // Moderating reports is an Editor task; edit_post let an Author dismiss reports on their own review.
     916                        if ( ! current_user_can( 'edit_others_posts' ) ) {
    815917                                wp_die( esc_html__( 'You do not have permission to perform this action.', 'bp-member-reviews' ) );
    816918                        }
    … …  
    822924                        }
    823925
    824                         // Update flag status to resolved.
    825                         update_post_meta( $review_id, 'bupr_flag_status', 'resolved' );
     926                        $this->bupr_close_reports( $review_id, 'resolved' );
    826927
    827928                        // Redirect back to the review edit page.
  • bp-user-profile-reviews/trunk/admin/tab-templates/bupr-setting-criteria-tab.php

    r3617176 r3736444  
    4040                                        <?php
    4141                                        printf(
    42                                                 /* translators: 1: Current mode label, 2: Link to Add-ons tab */
    43                                                 esc_html__( 'Rating criteria are only used in Star Ratings mode. You are currently using %1$s mode. To manage criteria, switch to Star Ratings mode in the %2$s tab.', 'bp-member-reviews' ),
    44                                                 '<strong>' . esc_html( $mode_label ) . '</strong>',
    45                                                 '<a href="' . esc_url( admin_url( 'admin.php?page=bp-member-review-settings&tab=bupr-pro-features' ) ) . '">' . esc_html__( 'Add-ons', 'bp-member-reviews' ) . '</a>'
     42                                                /* translators: %s: Current mode label */
     43                                                esc_html__( 'Rating criteria are only used in Star Ratings mode. You are currently using %s mode. To manage criteria, switch to Star Ratings mode in the Member Reviews Pro settings.', 'bp-member-reviews' ),
     44                                                '<strong>' . esc_html( $mode_label ) . '</strong>'
    4645                                        );
    4746                                        ?>
    … …  
    9695                                        </div>
    9796                        </div>
    98                         <div class="wbcom-settings-section-wrap <?php echo esc_attr( $bupr_multi_rating_allowed_class ); ?>">
     97                        <div id="bupr-criteria-builder" class="wbcom-settings-section-wrap <?php echo esc_attr( $bupr_multi_rating_allowed_class ); ?>">
    9998                                <div class="bupr-admin-settings-block">
    10099                                        <div id="bupr-settings-tbl" class="bupr-table bupr-criteria-settings-tbl">
    … …  
    117116                                                                        <div class="bupr-admin-col-6 buprcriteria">
    118117                                                                                <p class="bupr-delete-tag">
    119                                                                                         <input type="button" value="<?php esc_attr_e( 'Delete', 'bp-member-reviews' ); ?>" aria-label="<?php esc_attr_e( 'Delete this review criteria', 'bp-member-reviews' ); ?>" class="bupr-criteria-remove-button bupr-remove button button-secondary" />
     118                                                                                        <input type="button" value="<?php esc_attr_e( 'Remove', 'bp-member-reviews' ); ?>" aria-label="<?php esc_attr_e( 'Remove this review criteria', 'bp-member-reviews' ); ?>" class="bupr-criteria-remove-button bupr-remove bupr-btn bupr-btn-danger" />
    120119                                                                                        <!-- Removed description span. -->
    121120                                                                                </p>
    … …  
    131130                                <div id="bupr-add-criteria-action" class="bupr-admin-row border">
    132131                                        <div class="bupr-admin-col-12">
    133                                                 <input id="bupr-btnAdd" type="button" value="<?php esc_attr_e( 'Add Criteria', 'bp-member-reviews' ); ?>" aria-label="<?php esc_attr_e( 'Add a new review criteria', 'bp-member-reviews' ); ?>" class="button button-secondary"/>
    134                                                 <p class="description"><?php esc_html_e( 'This option allows you to add multiple rating criteria. By default, no criteria are shown until you activate them.', 'bp-member-reviews' ); ?></p>
     132                                                <input id="bupr-btnAdd" type="button" value="<?php esc_attr_e( 'Add Criteria', 'bp-member-reviews' ); ?>" aria-label="<?php esc_attr_e( 'Add a new review criteria', 'bp-member-reviews' ); ?>" class="bupr-btn bupr-btn-secondary"/>
     133                                                <p class="description"><?php esc_html_e( 'This option allows you to add multiple rating criteria. By default, no criteria are shown until you activate them. With no criteria, reviews are text only and have no stars.', 'bp-member-reviews' ); ?></p>
    135134                                        </div>
    136135                                </div>
  • bp-user-profile-reviews/trunk/admin/tab-templates/bupr-setting-display-tab.php

    r3617176 r3736444  
    1515        <div class="wbcom-admin-title-section">
    1616                <h3><?php esc_html_e( 'Display Settings', 'bp-member-reviews' ); ?></h3>
    17                 <p class="wbcom-welcome-description">
    18                         <b><?php esc_html_e( 'Note', 'bp-member-reviews' ); ?>:</b>
    19                         <?php esc_html_e( 'This setting is applicable only if you have added a criterion for review.', 'bp-member-reviews' ); ?>                </p>
    2017        </div>
    2118        <div class="wbcom-admin-option-wrap wbcom-admin-option-wrap-view">
  • bp-user-profile-reviews/trunk/admin/tab-templates/bupr-setting-general-tab.php

    r3617176 r3736444  
    9595                                                <div class="wbcom-settings-section-options">
    9696                                                        <label class="bupr-switch">
     97                                                                <input type="hidden" name="bupr_admin_general_options[bupr_hide_review_button]" value="no">
    9798                                                                <input name="bupr_admin_general_options[bupr_hide_review_button]" type="checkbox" id="bupr-hide-review-button" <?php checked( esc_attr( $bupr['hide_review_button'] ), 'yes' ); ?> value="yes">
    9899                                                                <div class="bupr-slider bupr-round"></div>
    … …  
    189190                                        </div>
    190191                                        <?php
    191                                         if ( ! empty( $bupr_admin_general ) ) {
    192                                                 if ( isset( $bupr_admin_general['bupr_auto_approve_reviews'] ) && 'no' === $bupr_admin_general['bupr_auto_approve_reviews'] ) {
    193                                                         ?>
     192                                        // Always rendered so the Auto Approve switch can show/hide them without a save.
     193                                        $bupr_approval_hidden = ( isset( $bupr_admin_general['bupr_auto_approve_reviews'] ) && 'no' === $bupr_admin_general['bupr_auto_approve_reviews'] ) ? '' : ' bupr-show-if-allowed';
     194                                        ?>
    194195                                        <!-- admin email section -->
    195                                         <div class="bgr-row wbcom-settings-section-wrap review-approve-email-section">
     196                                        <div class="bgr-row wbcom-settings-section-wrap review-approve-email-section<?php echo esc_attr( $bupr_approval_hidden ); ?>">
    196197                                                        <div class="wbcom-settings-section-options-heading">
    197198                                                                <label for="review_approve_email_subject">
    … …  
    204205                                                        </div>
    205206                                                </div>
    206                                                 <div class="bgr-row wbcom-settings-section-wrap review-approve-email-section">
     207                                                <div class="bgr-row wbcom-settings-section-wrap review-approve-email-section<?php echo esc_attr( $bupr_approval_hidden ); ?>">
    207208                                        <div class="wbcom-settings-section-options-heading">
    208209                                                <label for="review-approve-email-message">
    … …  
    223224                                                        ?>
    224225                                        </div>
    225                                                         <?php
    226                                                 }
    227                                         }
    228                                         ?>
     226                                                </div>
    229227                                        <!-- admin email section end -->
    230228                                        <div class="wbcom-settings-section-wrap">
    … …  
    283281                                                                <?php esc_html_e( 'Reviewer Roles', 'bp-member-reviews' ); ?>
    284282                                                        </label>
    285                                                         <p class="description"><?php esc_html_e( 'Select user roles that can submit reviews.', 'bp-member-reviews' ); ?></p>
     283                                                        <p class="description"><?php esc_html_e( 'Select user roles that can submit reviews. A member with any of the selected roles can. An empty list allows every role.', 'bp-member-reviews' ); ?></p>
    286284                                                </div>
    287285                                                <div class="wbcom-settings-section-options">
    … …  
    316314                                                                <?php esc_html_e( 'Reviewee Roles', 'bp-member-reviews' ); ?>
    317315                                                        </label>
    318                                                         <p class="description"><?php esc_html_e( 'Select user roles that can receive reviews.', 'bp-member-reviews' ); ?></p>
     316                                                        <p class="description"><?php esc_html_e( 'Select user roles that can receive reviews. A member with any of the selected roles can. An empty list allows every role.', 'bp-member-reviews' ); ?></p>
    319317                                                </div>
    320318                                                <div class="wbcom-settings-section-options">
  • bp-user-profile-reviews/trunk/assets/css/admin.css

    r3617176 r3736444  
    5555   Dark mode (ADMIN-1)
    5656   Full dark token scale for the admin panel. Gated behind an EXPLICIT
    57    dark-admin signal (WP's is-dark-theme / the "Dark" admin color scheme
    58    body.admin-color-dark) rather than prefers-color-scheme. Rationale: WP
     57   dark-admin signal (body.is-dark-theme) rather than prefers-color-scheme.
     58   body.admin-color-dark is deliberately NOT a trigger: WP's "Dark" admin
     59   colour scheme restyles only the menu and toolbar, so the content area
     60   stays light and the panel's header text became light-on-light. Rationale: WP
    5961   admin core has no dark mode in 6.x/7.0, so keying off the OS preference
    6062   alone flips this panel dark while the surrounding WP admin chrome (and,
    … …  
    6365   adopts dark uniformly the moment a real dark admin context sets the class.
    6466   ═══════════════════════════════════════════════════════════ */
    65 body.is-dark-theme .bupr-admin,
    66 body.admin-color-dark .bupr-admin {
     67body.is-dark-theme .bupr-admin {
    6768        --bupr-admin-white: #1e1e2e;
    6869        --bupr-admin-surface-1: #181825;
    … …  
    896897}
    897898
     899/* Row widths, desktop only (the <=640px layout stacks rows as columns):
     900   text inputs get a real column instead of shrinking to the placeholder width,
     901   and rich-text editors take the full row instead of the right half. */
     902@media (min-width: 641px) {
     903        .bupr-card--legacy .wbcom-settings-section-options:has(> input.large-text) {
     904                flex: 0 1 480px;
     905        }
     906
     907        .bupr-card--legacy .wbcom-settings-section-options:has(.wp-editor-wrap) {
     908                flex: 1 1 100%;
     909        }
     910}
     911
     912/* Toggle switch. The tab templates render label.bupr-switch > checkbox + .bupr-slider;
     913   its styles lived in the old wbcom wrapper sheet and were lost in the 3.8.0 shell
     914   migration, which left a bare checkbox. */
     915.bupr-admin .bupr-switch {
     916        position: relative;
     917        display: inline-block;
     918        flex: 0 0 auto;
     919        width: 40px;
     920        height: 22px;
     921        margin: 0;
     922}
     923
     924.bupr-admin .bupr-switch input[type="checkbox"] {
     925        position: absolute;
     926        inset: 0;
     927        width: 100%;
     928        height: 100%;
     929        margin: 0;
     930        opacity: 0;
     931        cursor: pointer;
     932        z-index: 1;
     933}
     934
     935.bupr-admin .bupr-slider {
     936        position: absolute;
     937        inset: 0;
     938        border-radius: 999px;
     939        background: var(--bupr-admin-border-strong);
     940        transition: background 0.15s;
     941}
     942
     943.bupr-admin .bupr-slider::before {
     944        content: "";
     945        position: absolute;
     946        top: 2px;
     947        inset-inline-start: 2px;
     948        width: 18px;
     949        height: 18px;
     950        border-radius: 50%;
     951        background: #fff;
     952        box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
     953        transition: transform 0.15s;
     954}
     955
     956.bupr-admin .bupr-switch input:checked + .bupr-slider {
     957        background: var(--bupr-admin-accent);
     958}
     959
     960.bupr-admin .bupr-switch input:checked + .bupr-slider::before {
     961        transform: translateX(18px);
     962}
     963
     964[dir="rtl"] .bupr-admin .bupr-switch input:checked + .bupr-slider::before {
     965        transform: translateX(-18px);
     966}
     967
     968.bupr-admin .bupr-switch input:focus-visible + .bupr-slider {
     969        outline: 2px solid var(--bupr-admin-accent);
     970        outline-offset: 2px;
     971}
     972
    898973.bupr-card--legacy input[type="text"],
    899974.bupr-card--legacy input[type="number"],
    … …  
    10631138        }
    10641139
     1140        /* In a column the desktop flex-basis (300px / 480px) becomes a HEIGHT. */
     1141        .bupr-card--legacy .wbcom-settings-section-options-heading,
     1142        .bupr-card--legacy .wbcom-settings-section-options {
     1143                flex-basis: auto;
     1144        }
     1145
    10651146        .bupr-stats-grid,
    10661147        .bupr-discover-grid {
  • bp-user-profile-reviews/trunk/assets/css/bupr-front.css

    r3617176 r3736444  
    582582    width: 100%;
    583583    padding: 10px;
     584}
     585
     586/* Widths below are 100% / calc() plus padding: without border-box they overflow on themes
     587   that do not reset box-sizing globally (Twenty Twenty-Five overflowed at every width). */
     588#review_desc,
     589.bupr-review-modal-content,
     590.bupr-flag-modal-content,
     591.bupr-review-modal-content textarea,
     592.bupr-flag-modal-content textarea {
     593    box-sizing: border-box;
     594}
     595
     596#review_desc,
     597.bupr-review-modal-content textarea,
     598.bupr-flag-modal-content textarea {
     599    max-width: 100%;
    584600}
    585601
    … …  
    15371553# --bupr-* tokens below; the component rules that consume them are written
    15381554# once and fall back to the exact light values, so light mode is unchanged.
    1539 # Reign exposes no --bx-color-* vars, so every dark fallback is a dark literal.
     1555# Reign exposes no --bx-color-* vars but redefines its own --reign-* tokens
     1556# under the same [data-bx-mode="dark"] selector (reign-theme critical.css), so
     1557# the four it darkens are read before the dark literal. Only map a --reign-*
     1558# token Reign actually redefines in dark, or dark mode gets its LIGHT value.
    15401559--------------------------------------------------------------*/
    15411560html[data-bx-mode="dark"],
    … …  
    15431562body.dark-mode,
    15441563body.dark-scheme {
    1545     --bupr-card-bg: var(--bx-color-bg-elevated, #1e1e1e);
     1564    --bupr-card-bg: var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, #1e1e1e));
    15461565    --bupr-chip-bg: var(--bx-color-bg-muted, #272727);
    15471566    --bupr-chip-bg-hover: var(--bx-color-bg-subtle, #313131);
    1548     --bupr-field-bg: var(--bx-color-bg, #161616);
    1549     --bupr-text: var(--bx-color-fg, #e6e6e6);
     1567    --bupr-field-bg: var(--bx-color-bg, var(--reign-form-background-color, #161616));
     1568    --bupr-text: var(--bx-color-fg, var(--reign-site-body-text-color, #e6e6e6));
    15501569    --bupr-text-muted: var(--bx-color-fg-muted, #a6a6a6);
    15511570    --bupr-text-subtle: var(--bx-color-fg-subtle, #8a8a8a);
    1552     --bupr-border: var(--bx-color-border, rgba(255, 255, 255, 0.15));
     1571    --bupr-border: var(--bx-color-border, var(--reign-form-border-color, rgba(255, 255, 255, 0.15)));
    15531572    --bupr-reply-bg: var(--bx-color-bg-muted, #232323);
    15541573    --bupr-reply-hover-bg: rgba(0, 124, 186, 0.15);
    … …  
    16611680    border-color: #dc3232;
    16621681    color: var(--bupr-danger-fg, #dc3232);
     1682}
     1683
     1684/* BuddyPress styles every button inside .buddypress-wrap at (0,2,1), and its hover rule
     1685   (0,3,1) sets a light grey background with `color: inherit` - under a dark theme that is
     1686   light text on light grey, so Report / Edit / the modal close vanished on hover. These
     1687   buttons own their colours: the .buddypress-wrap ancestor plus a doubled class out-ranks
     1688   BP's rules, which load after ours. Theme rules marked !important (BuddyX Pro) still win. */
     1689.buddypress-wrap .bupr-report-button.bupr-report-button {
     1690    background: var(--bupr-chip-bg, #f8f9fa);
     1691    border: 1px solid var(--bupr-border, #ddd);
     1692    color: var(--bupr-text-muted, #666);
     1693}
     1694
     1695.buddypress-wrap .bupr-report-button.bupr-report-button:hover,
     1696.buddypress-wrap .bupr-report-button.bupr-report-button:focus {
     1697    background: var(--bupr-danger-bg, #fff0f0);
     1698    border-color: #dc3232;
     1699    color: var(--bupr-danger-fg, #dc3232);
     1700}
     1701
     1702.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close {
     1703    background: transparent;
     1704    border: none;
     1705    box-shadow: none;
     1706    color: var(--bupr-text-muted, #666);
     1707}
     1708
     1709.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:hover,
     1710.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:focus {
     1711    background: transparent;
     1712    color: var(--bupr-danger-fg, #dc3232);
     1713}
     1714
     1715/* Edit Review is a secondary action: the same self-contained chip colours as Report, which
     1716   the dark token block also sets. White on the theme accent failed in dark mode, where
     1717   BuddyX's accent turns light (1.89:1). */
     1718button.bupr-edit-review-button,
     1719.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button {
     1720    background: var(--bupr-chip-bg, #f8f9fa);
     1721    border: 1px solid var(--bupr-border, #ddd);
     1722    color: var(--bupr-text, #1d2327);
     1723}
     1724
     1725button.bupr-edit-review-button:hover,
     1726button.bupr-edit-review-button:focus,
     1727.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:hover,
     1728.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:focus {
     1729    background: var(--bupr-chip-bg-hover, #f0f0f1);
     1730    border-color: var(--bupr-border, #ddd);
     1731    color: var(--bupr-text, #1d2327);
     1732}
     1733
     1734/* Report dialog actions and the reply Cancel: the destructive Submit stays red, Cancel
     1735   stays neutral instead of a second primary. BuddyX styles every button.button inside the
     1736   BP wrapper at (0,3,1) (.buddypress .buddypress-wrap button.button), so these sit at (0,4,1). */
     1737.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit {
     1738    background: #dc3232;
     1739    border: none;
     1740    color: #fff;
     1741}
     1742
     1743.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:hover,
     1744.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:focus {
     1745    background: #a00;
     1746    color: #fff;
     1747}
     1748
     1749.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel,
     1750body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply {
     1751    background: var(--bupr-chip-bg, #f0f0f1);
     1752    border: 1px solid var(--bupr-border, #dcdcde);
     1753    color: var(--bupr-text, #50575e);
     1754}
     1755
     1756.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:hover,
     1757.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:focus,
     1758body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:hover,
     1759body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:focus {
     1760    background: var(--bupr-chip-bg-hover, #dcdcde);
     1761    color: var(--bupr-text, #50575e);
    16631762}
    16641763
  • bp-user-profile-reviews/trunk/assets/css/min/admin.min.css

    r3617176 r3736444  
    1 .bupr-admin{--bupr-admin-accent:#2563eb;--bupr-admin-accent-hover:#1d4ed8;--bupr-admin-accent-light:#eff6ff;--bupr-admin-white:#ffffff;--bupr-admin-surface-1:#f8fafc;--bupr-admin-surface-2:#f1f5f9;--bupr-admin-border:#e2e8f0;--bupr-admin-border-strong:#cbd5e1;--bupr-admin-text:#1e293b;--bupr-admin-text-2:#475569;--bupr-admin-text-3:#64748b;--bupr-admin-text-4:#374151;--bupr-admin-text-muted:#94a3b8;--bupr-admin-success:#16a34a;--bupr-admin-success-hover:#15803d;--bupr-admin-success-light:#dcfce7;--bupr-admin-warn:#f59e0b;--bupr-admin-warn-light:#fef9c3;--bupr-admin-danger:#dc2626;--bupr-admin-danger-hover:#b91c1c;--bupr-admin-danger-light:#fee2e2;--bupr-admin-radius:8px;--bupr-admin-radius-sm:6px;--bupr-admin-shadow:0 1px 3px rgba(0, 0, 0, 0.06),0 1px 2px rgba(0, 0, 0, 0.04);--bupr-admin-shadow-hover:0 4px 6px rgba(0, 0, 0, 0.07),0 2px 4px rgba(0, 0, 0, 0.04);--bupr-admin-gap-sm:8px;--bupr-admin-gap-md:16px;--bupr-admin-gap-lg:20px;--bupr-admin-gap-xl:32px}body.admin-color-dark .bupr-admin,body.is-dark-theme .bupr-admin{--bupr-admin-white:#1e1e2e;--bupr-admin-surface-1:#181825;--bupr-admin-surface-2:#11111b;--bupr-admin-border:#313244;--bupr-admin-border-strong:#45475a;--bupr-admin-text:#e4e6eb;--bupr-admin-text-2:#b8bcc8;--bupr-admin-text-3:#9399a8;--bupr-admin-text-4:#c8ccd8;--bupr-admin-text-muted:#7f8496;--bupr-admin-accent-light:#1e293b;--bupr-admin-success-hover:#22c55e;--bupr-admin-success-light:#14311f;--bupr-admin-warn-light:#3a2f10;--bupr-admin-danger-hover:#ef4444;--bupr-admin-danger-light:#3a1518;--bupr-admin-shadow:0 1px 3px rgba(0, 0, 0, 0.4),0 1px 2px rgba(0, 0, 0, 0.3);--bupr-admin-shadow-hover:0 4px 6px rgba(0, 0, 0, 0.45),0 2px 4px rgba(0, 0, 0, 0.3)}.bupr-admin{margin:0 20px 0 0;color:var(--bupr-admin-text);font-size:13px;line-height:1.5}.bupr-admin h1,.bupr-admin h2,.bupr-admin h3,.bupr-admin p{margin:0;color:inherit}.bupr-admin a{color:var(--bupr-admin-accent)}.bupr-page-header{display:flex;align-items:center;justify-content:space-between;gap:var(--bupr-admin-gap-md);padding:18px 0 14px;margin:0 0 18px;border-bottom:1px solid var(--bupr-admin-border)}.bupr-page-header__title{display:flex;align-items:center;gap:10px}.bupr-page-header__title h1{font-size:20px;font-weight:700;line-height:1.2;margin:0;padding:0}.bupr-page-header__title .dashicons{color:var(--bupr-admin-accent);width:24px;height:24px;font-size:24px}.bupr-page-header__subtitle{font-size:13px;color:var(--bupr-admin-text-3);margin:2px 0 0}.bupr-page-header__actions{display:flex;align-items:center;gap:8px}.bupr-version-pill{display:inline-block;padding:4px 10px;background:var(--bupr-admin-accent);color:#fff;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.03em}.bupr-settings-layout{display:flex;align-items:flex-start;gap:0;margin-top:var(--bupr-admin-gap-md)}.bupr-settings-sidebar{width:240px;box-sizing:border-box;flex-shrink:0;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);position:sticky;top:32px;overflow:hidden}.bupr-settings-sidebar-brand{display:flex;align-items:center;gap:10px;padding:16px 16px 14px;border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-settings-brand-icon{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--bupr-admin-radius-sm);background:var(--bupr-admin-accent);color:#fff;flex-shrink:0}.bupr-settings-brand-icon .dashicons{color:#fff;width:18px;height:18px;font-size:18px}.bupr-settings-brand-text{min-width:0}.bupr-settings-brand-name{margin:0;font-size:13px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2}.bupr-settings-brand-sub{margin:2px 0 0;font-size:10px;color:var(--bupr-admin-text-muted);text-transform:uppercase;letter-spacing:.06em;font-weight:600}.bupr-settings-sidebar-nav{padding:8px}.bupr-snav-link{display:flex;align-items:center;gap:8px;padding:9px 10px;border-radius:var(--bupr-admin-radius-sm);color:var(--bupr-admin-text-2);text-decoration:none;font-size:13px;font-weight:500;line-height:1.4;transition:background .12s,color .12s;margin-bottom:1px}.bupr-snav-link .dashicons{width:16px;height:16px;font-size:16px;flex-shrink:0;color:var(--bupr-admin-text-muted);transition:color .12s}.bupr-snav-link:focus,.bupr-snav-link:hover{background:var(--bupr-admin-surface-1);color:var(--bupr-admin-text);box-shadow:none}.bupr-snav-link:focus:not(:focus-visible){outline:0}.bupr-snav-link:focus .dashicons,.bupr-snav-link:hover .dashicons{color:var(--bupr-admin-text-3)}.bupr-snav-link:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-snav-link--active,.bupr-snav-link--active:focus,.bupr-snav-link--active:hover{background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent);font-weight:600}.bupr-snav-link--active .dashicons{color:var(--bupr-admin-accent)}.bupr-snav-link .dashicons.bupr-snav-link__ext{margin-inline-start:auto;width:14px;height:14px;font-size:14px}.bupr-snav-divider{height:1px;background:var(--bupr-admin-surface-2);margin:8px 0}.bupr-snav-section-label{margin:8px 0 4px 10px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--bupr-admin-text-muted)}.bupr-settings-main{flex:1;min-width:0;margin-left:var(--bupr-admin-gap-lg)}.bupr-card{background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);margin-bottom:var(--bupr-admin-gap-lg);overflow:hidden}.bupr-card__head{padding:14px 20px 12px;border-bottom:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-card__title{font-size:13px;font-weight:700;color:var(--bupr-admin-text);margin:0 0 2px;text-transform:uppercase;letter-spacing:.04em}.bupr-card__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0;line-height:1.5}.bupr-card__body{padding:20px}.bupr-card .form-table{margin:0}.bupr-card .form-table th{padding:14px 20px;font-size:13px;font-weight:500;color:var(--bupr-admin-text-4);width:260px;vertical-align:middle}.bupr-card .form-table td{padding:14px 20px}.bupr-card .form-table tr{border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-card .form-table tr:last-child{border-bottom:none}.bupr-status-on{color:var(--bupr-admin-success);font-weight:600}.bupr-status-off{color:var(--bupr-admin-text-3)}.bupr-action-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.bupr-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 16px;border-radius:var(--bupr-admin-radius-sm);border:1px solid transparent;font-size:13px;font-weight:500;line-height:1.4;cursor:pointer;text-decoration:none;transition:background .12s,border-color .12s,color .12s;min-height:40px;box-shadow:none}.bupr-btn .dashicons{width:16px;height:16px;font-size:16px}.bupr-btn-primary{background:var(--bupr-admin-accent);color:#fff;border-color:var(--bupr-admin-accent)}.bupr-btn-primary:focus,.bupr-btn-primary:hover{background:var(--bupr-admin-accent-hover);border-color:var(--bupr-admin-accent-hover);color:#fff}.bupr-btn-secondary{background:var(--bupr-admin-white);color:var(--bupr-admin-text);border-color:var(--bupr-admin-border-strong)}.bupr-btn-secondary:focus,.bupr-btn-secondary:hover{background:var(--bupr-admin-surface-1);color:var(--bupr-admin-text);border-color:var(--bupr-admin-border-strong)}.bupr-btn-danger{background:var(--bupr-admin-white);color:var(--bupr-admin-danger);border-color:var(--bupr-admin-danger-light)}.bupr-btn-danger:focus,.bupr-btn-danger:hover{background:var(--bupr-admin-danger);color:#fff;border-color:var(--bupr-admin-danger)}.bupr-btn:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-inline-hint{display:inline-block;margin-left:8px;font-size:12px;font-weight:500}.bupr-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--bupr-admin-gap-md);margin:0 0 var(--bupr-admin-gap-lg)}.bupr-stat{background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:18px}.bupr-stat__label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--bupr-admin-text-muted);margin:0 0 6px}.bupr-stat__value{font-size:26px;font-weight:700;color:var(--bupr-admin-text);line-height:1.1}.bupr-stat__trend{margin:4px 0 0;font-size:12px;color:var(--bupr-admin-text-3)}.bupr-notice{display:flex;align-items:flex-start;gap:10px;padding:12px 16px;border-radius:var(--bupr-admin-radius-sm);border:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1);margin-bottom:var(--bupr-admin-gap-md);font-size:13px}.bupr-notice .dashicons{flex-shrink:0}.bupr-notice--info{background:var(--bupr-admin-accent-light);border-color:rgba(37,99,235,.2);color:var(--bupr-admin-accent)}.bupr-notice--warn{background:var(--bupr-admin-warn-light);border-color:rgba(245,158,11,.3);color:#92400e}.bupr-notice--warn a{color:#92400e;text-decoration:underline}.bupr-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:56px 32px;text-align:center}.bupr-empty-state__icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin:0 auto 16px;background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent);border-radius:50%;font-size:32px}.bupr-empty-state__icon .dashicons{width:32px;height:32px;font-size:32px;line-height:1;color:inherit}.bupr-empty-state__title{font-size:16px;font-weight:700;color:var(--bupr-admin-text);margin:0 0 6px;line-height:1.3}.bupr-empty-state__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0 auto;max-width:440px;line-height:1.55}.bupr-hub-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--bupr-admin-gap-md);margin:0 0 var(--bupr-admin-gap-lg)}.bupr-hub-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:20px;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);text-decoration:none;color:var(--bupr-admin-text);transition:transform .12s,box-shadow .12s,border-color .12s}.bupr-hub-card:focus,.bupr-hub-card:hover{border-color:var(--bupr-admin-accent);box-shadow:var(--bupr-admin-shadow-hover);transform:translateY(-1px);color:var(--bupr-admin-text);text-decoration:none}.bupr-hub-card:focus:not(:focus-visible){outline:0}.bupr-hub-card:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-hub-card__icon{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:10px;background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent)}.bupr-hub-card__icon .dashicons{width:22px;height:22px;font-size:22px;color:inherit}.bupr-hub-card__title{font-size:15px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2}.bupr-hub-card__subtitle{font-size:12px;color:var(--bupr-admin-text-3);line-height:1.4}.bupr-hub-card__cta{margin-top:auto;display:inline-flex;align-items:center;gap:4px;padding-top:6px;font-size:13px;font-weight:600;color:var(--bupr-admin-accent)}.bupr-hub-card__cta .dashicons{width:16px;height:16px;font-size:16px;transition:transform .12s}.bupr-hub-card:hover .bupr-hub-card__cta .dashicons{transform:translateX(2px)}.bupr-discover-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--bupr-admin-gap-md)}.bupr-discover-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:20px;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);transition:box-shadow .12s,border-color .12s,transform .12s}.bupr-discover-card:hover{border-color:var(--bupr-admin-border-strong);box-shadow:var(--bupr-admin-shadow-hover);transform:translateY(-1px)}.bupr-discover-card__logo{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px}.bupr-discover-card__logo img{width:52px;height:52px;object-fit:contain;display:block;border-radius:var(--bupr-admin-radius-sm)}.bupr-discover-card__title{font-size:15px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2;margin:0}.bupr-discover-card__desc{font-size:13px;color:var(--bupr-admin-text-3);line-height:1.5;margin:0;flex:1 1 auto}.bupr-discover-card__cta{margin-top:4px}.bupr-discover-card__cta .dashicons{width:14px;height:14px;font-size:14px}.bupr-admin .notice{border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:12px 16px;margin:0 0 18px;font-size:14px;line-height:1.5;border-width:0;border-inline-start-width:4px;border-style:solid}.bupr-admin .notice p{margin:0;padding:0;font-size:14px;line-height:1.5}.bupr-admin .notice.is-dismissible{padding-right:38px}.bupr-admin .notice .notice-dismiss{top:8px;right:8px}.bupr-card--legacy .bupr-card__body{padding:0}.bupr-card--legacy .wbcom-tab-content{padding:0}.bupr-card--legacy .wbcom-admin-title-section{padding:14px 20px 12px;border-bottom:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-card--legacy .wbcom-admin-title-section h3{font-size:13px;font-weight:700;color:var(--bupr-admin-text);text-transform:uppercase;letter-spacing:.04em;margin:0}.bupr-card--legacy .wbcom-admin-title-section p,.bupr-card--legacy .wbcom-welcome-description{font-size:13px;color:var(--bupr-admin-text-3);margin:4px 0 0}.bupr-card--legacy .wbcom-admin-option-wrap{padding:8px 20px 20px}.bupr-card--legacy .wbcom-settings-section-wrap{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:16px;padding:16px 20px;border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-card--legacy .wbcom-settings-section-wrap:last-of-type{border-bottom:none}.bupr-card--legacy .wbcom-settings-section-options-heading{flex:1 1 300px;min-width:0}.bupr-card--legacy .wbcom-settings-section-options-heading label{font-size:13px;font-weight:600;color:var(--bupr-admin-text-4);display:block}.bupr-card--legacy .wbcom-settings-section-options-heading .description{font-size:12px;color:var(--bupr-admin-text-3);margin:6px 0 0;line-height:1.5}.bupr-card--legacy .wbcom-settings-section-options{flex:0 1 auto}.bupr-card--legacy input.large-text,.bupr-card--legacy input[type=email],.bupr-card--legacy input[type=number],.bupr-card--legacy input[type=text],.bupr-card--legacy select,.bupr-card--legacy textarea{border:1px solid var(--bupr-admin-border-strong);border-radius:var(--bupr-admin-radius-sm);font-size:13px}.bupr-card--legacy input.large-text{width:100%;max-width:480px}.bupr-card--legacy .submit,.bupr-card--legacy p.submit{padding:16px 20px;margin:0;border-top:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-toast-host{position:fixed;right:24px;bottom:24px;z-index:100000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.bupr-toast{background:var(--bupr-admin-text);color:#fff;padding:12px 16px;border-radius:var(--bupr-admin-radius-sm);font-size:13px;font-weight:500;box-shadow:var(--bupr-admin-shadow-hover);min-width:240px;max-width:360px;pointer-events:auto;transform:translateY(8px);opacity:0;transition:opacity .2s,transform .2s}.bupr-toast--visible{opacity:1;transform:translateY(0)}.bupr-toast--success{background:var(--bupr-admin-success)}.bupr-toast--error{background:var(--bupr-admin-danger)}.bupr-confirm-backdrop{position:fixed;inset:0;background:rgba(15,23,42,.5);z-index:100001;display:flex;align-items:center;justify-content:center;padding:24px}.bupr-confirm{background:var(--bupr-admin-white);border-radius:var(--bupr-admin-radius);box-shadow:0 20px 40px rgba(0,0,0,.2);max-width:420px;width:100%;padding:24px}.bupr-confirm__title{font-size:16px;font-weight:700;margin:0 0 8px;color:var(--bupr-admin-text)}.bupr-confirm__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0 0 18px;line-height:1.5}.bupr-confirm__actions{display:flex;gap:8px;justify-content:flex-end}@media (max-width:1024px){.bupr-settings-layout{flex-direction:column}.bupr-settings-sidebar{width:100%;position:static;top:auto}.bupr-settings-sidebar-nav{display:flex;flex-wrap:wrap;padding:8px}.bupr-snav-link{flex:1 1 auto;justify-content:center}.bupr-snav-divider,.bupr-snav-section-label{display:none}.bupr-settings-main{margin-left:0;margin-top:var(--bupr-admin-gap-md)}}@media (max-width:640px){.bupr-admin{margin-right:0}.bupr-page-header{flex-direction:column;align-items:flex-start;gap:8px}.bupr-card .form-table td,.bupr-card .form-table th{display:block;width:100%;padding:8px 16px}.bupr-card--legacy .wbcom-settings-section-wrap{flex-direction:column}.bupr-discover-grid,.bupr-stats-grid{grid-template-columns:1fr}}
     1.bupr-admin{--bupr-admin-accent:#2563eb;--bupr-admin-accent-hover:#1d4ed8;--bupr-admin-accent-light:#eff6ff;--bupr-admin-white:#ffffff;--bupr-admin-surface-1:#f8fafc;--bupr-admin-surface-2:#f1f5f9;--bupr-admin-border:#e2e8f0;--bupr-admin-border-strong:#cbd5e1;--bupr-admin-text:#1e293b;--bupr-admin-text-2:#475569;--bupr-admin-text-3:#64748b;--bupr-admin-text-4:#374151;--bupr-admin-text-muted:#94a3b8;--bupr-admin-success:#16a34a;--bupr-admin-success-hover:#15803d;--bupr-admin-success-light:#dcfce7;--bupr-admin-warn:#f59e0b;--bupr-admin-warn-light:#fef9c3;--bupr-admin-danger:#dc2626;--bupr-admin-danger-hover:#b91c1c;--bupr-admin-danger-light:#fee2e2;--bupr-admin-radius:8px;--bupr-admin-radius-sm:6px;--bupr-admin-shadow:0 1px 3px rgba(0, 0, 0, 0.06),0 1px 2px rgba(0, 0, 0, 0.04);--bupr-admin-shadow-hover:0 4px 6px rgba(0, 0, 0, 0.07),0 2px 4px rgba(0, 0, 0, 0.04);--bupr-admin-gap-sm:8px;--bupr-admin-gap-md:16px;--bupr-admin-gap-lg:20px;--bupr-admin-gap-xl:32px}body.is-dark-theme .bupr-admin{--bupr-admin-white:#1e1e2e;--bupr-admin-surface-1:#181825;--bupr-admin-surface-2:#11111b;--bupr-admin-border:#313244;--bupr-admin-border-strong:#45475a;--bupr-admin-text:#e4e6eb;--bupr-admin-text-2:#b8bcc8;--bupr-admin-text-3:#9399a8;--bupr-admin-text-4:#c8ccd8;--bupr-admin-text-muted:#7f8496;--bupr-admin-accent-light:#1e293b;--bupr-admin-success-hover:#22c55e;--bupr-admin-success-light:#14311f;--bupr-admin-warn-light:#3a2f10;--bupr-admin-danger-hover:#ef4444;--bupr-admin-danger-light:#3a1518;--bupr-admin-shadow:0 1px 3px rgba(0, 0, 0, 0.4),0 1px 2px rgba(0, 0, 0, 0.3);--bupr-admin-shadow-hover:0 4px 6px rgba(0, 0, 0, 0.45),0 2px 4px rgba(0, 0, 0, 0.3)}.bupr-admin{margin:0 20px 0 0;color:var(--bupr-admin-text);font-size:13px;line-height:1.5}.bupr-admin h1,.bupr-admin h2,.bupr-admin h3,.bupr-admin p{margin:0;color:inherit}.bupr-admin a{color:var(--bupr-admin-accent)}.bupr-page-header{display:flex;align-items:center;justify-content:space-between;gap:var(--bupr-admin-gap-md);padding:18px 0 14px;margin:0 0 18px;border-bottom:1px solid var(--bupr-admin-border)}.bupr-page-header__title{display:flex;align-items:center;gap:10px}.bupr-page-header__title h1{font-size:20px;font-weight:700;line-height:1.2;margin:0;padding:0}.bupr-page-header__title .dashicons{color:var(--bupr-admin-accent);width:24px;height:24px;font-size:24px}.bupr-page-header__subtitle{font-size:13px;color:var(--bupr-admin-text-3);margin:2px 0 0}.bupr-page-header__actions{display:flex;align-items:center;gap:8px}.bupr-version-pill{display:inline-block;padding:4px 10px;background:var(--bupr-admin-accent);color:#fff;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.03em}.bupr-settings-layout{display:flex;align-items:flex-start;gap:0;margin-top:var(--bupr-admin-gap-md)}.bupr-settings-sidebar{width:240px;box-sizing:border-box;flex-shrink:0;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);position:sticky;top:32px;overflow:hidden}.bupr-settings-sidebar-brand{display:flex;align-items:center;gap:10px;padding:16px 16px 14px;border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-settings-brand-icon{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--bupr-admin-radius-sm);background:var(--bupr-admin-accent);color:#fff;flex-shrink:0}.bupr-settings-brand-icon .dashicons{color:#fff;width:18px;height:18px;font-size:18px}.bupr-settings-brand-text{min-width:0}.bupr-settings-brand-name{margin:0;font-size:13px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2}.bupr-settings-brand-sub{margin:2px 0 0;font-size:10px;color:var(--bupr-admin-text-muted);text-transform:uppercase;letter-spacing:.06em;font-weight:600}.bupr-settings-sidebar-nav{padding:8px}.bupr-snav-link{display:flex;align-items:center;gap:8px;padding:9px 10px;border-radius:var(--bupr-admin-radius-sm);color:var(--bupr-admin-text-2);text-decoration:none;font-size:13px;font-weight:500;line-height:1.4;transition:background .12s,color .12s;margin-bottom:1px}.bupr-snav-link .dashicons{width:16px;height:16px;font-size:16px;flex-shrink:0;color:var(--bupr-admin-text-muted);transition:color .12s}.bupr-snav-link:focus,.bupr-snav-link:hover{background:var(--bupr-admin-surface-1);color:var(--bupr-admin-text);box-shadow:none}.bupr-snav-link:focus:not(:focus-visible){outline:0}.bupr-snav-link:focus .dashicons,.bupr-snav-link:hover .dashicons{color:var(--bupr-admin-text-3)}.bupr-snav-link:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-snav-link--active,.bupr-snav-link--active:focus,.bupr-snav-link--active:hover{background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent);font-weight:600}.bupr-snav-link--active .dashicons{color:var(--bupr-admin-accent)}.bupr-snav-link .dashicons.bupr-snav-link__ext{margin-inline-start:auto;width:14px;height:14px;font-size:14px}.bupr-snav-divider{height:1px;background:var(--bupr-admin-surface-2);margin:8px 0}.bupr-snav-section-label{margin:8px 0 4px 10px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--bupr-admin-text-muted)}.bupr-settings-main{flex:1;min-width:0;margin-left:var(--bupr-admin-gap-lg)}.bupr-card{background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);margin-bottom:var(--bupr-admin-gap-lg);overflow:hidden}.bupr-card__head{padding:14px 20px 12px;border-bottom:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-card__title{font-size:13px;font-weight:700;color:var(--bupr-admin-text);margin:0 0 2px;text-transform:uppercase;letter-spacing:.04em}.bupr-card__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0;line-height:1.5}.bupr-card__body{padding:20px}.bupr-card .form-table{margin:0}.bupr-card .form-table th{padding:14px 20px;font-size:13px;font-weight:500;color:var(--bupr-admin-text-4);width:260px;vertical-align:middle}.bupr-card .form-table td{padding:14px 20px}.bupr-card .form-table tr{border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-card .form-table tr:last-child{border-bottom:none}.bupr-status-on{color:var(--bupr-admin-success);font-weight:600}.bupr-status-off{color:var(--bupr-admin-text-3)}.bupr-action-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.bupr-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 16px;border-radius:var(--bupr-admin-radius-sm);border:1px solid transparent;font-size:13px;font-weight:500;line-height:1.4;cursor:pointer;text-decoration:none;transition:background .12s,border-color .12s,color .12s;min-height:40px;box-shadow:none}.bupr-btn .dashicons{width:16px;height:16px;font-size:16px}.bupr-btn-primary{background:var(--bupr-admin-accent);color:#fff;border-color:var(--bupr-admin-accent)}.bupr-btn-primary:focus,.bupr-btn-primary:hover{background:var(--bupr-admin-accent-hover);border-color:var(--bupr-admin-accent-hover);color:#fff}.bupr-btn-secondary{background:var(--bupr-admin-white);color:var(--bupr-admin-text);border-color:var(--bupr-admin-border-strong)}.bupr-btn-secondary:focus,.bupr-btn-secondary:hover{background:var(--bupr-admin-surface-1);color:var(--bupr-admin-text);border-color:var(--bupr-admin-border-strong)}.bupr-btn-danger{background:var(--bupr-admin-white);color:var(--bupr-admin-danger);border-color:var(--bupr-admin-danger-light)}.bupr-btn-danger:focus,.bupr-btn-danger:hover{background:var(--bupr-admin-danger);color:#fff;border-color:var(--bupr-admin-danger)}.bupr-btn:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-inline-hint{display:inline-block;margin-left:8px;font-size:12px;font-weight:500}.bupr-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--bupr-admin-gap-md);margin:0 0 var(--bupr-admin-gap-lg)}.bupr-stat{background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:18px}.bupr-stat__label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--bupr-admin-text-muted);margin:0 0 6px}.bupr-stat__value{font-size:26px;font-weight:700;color:var(--bupr-admin-text);line-height:1.1}.bupr-stat__trend{margin:4px 0 0;font-size:12px;color:var(--bupr-admin-text-3)}.bupr-notice{display:flex;align-items:flex-start;gap:10px;padding:12px 16px;border-radius:var(--bupr-admin-radius-sm);border:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1);margin-bottom:var(--bupr-admin-gap-md);font-size:13px}.bupr-notice .dashicons{flex-shrink:0}.bupr-notice--info{background:var(--bupr-admin-accent-light);border-color:rgba(37,99,235,.2);color:var(--bupr-admin-accent)}.bupr-notice--warn{background:var(--bupr-admin-warn-light);border-color:rgba(245,158,11,.3);color:#92400e}.bupr-notice--warn a{color:#92400e;text-decoration:underline}.bupr-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:56px 32px;text-align:center}.bupr-empty-state__icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin:0 auto 16px;background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent);border-radius:50%;font-size:32px}.bupr-empty-state__icon .dashicons{width:32px;height:32px;font-size:32px;line-height:1;color:inherit}.bupr-empty-state__title{font-size:16px;font-weight:700;color:var(--bupr-admin-text);margin:0 0 6px;line-height:1.3}.bupr-empty-state__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0 auto;max-width:440px;line-height:1.55}.bupr-hub-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--bupr-admin-gap-md);margin:0 0 var(--bupr-admin-gap-lg)}.bupr-hub-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:20px;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);text-decoration:none;color:var(--bupr-admin-text);transition:transform .12s,box-shadow .12s,border-color .12s}.bupr-hub-card:focus,.bupr-hub-card:hover{border-color:var(--bupr-admin-accent);box-shadow:var(--bupr-admin-shadow-hover);transform:translateY(-1px);color:var(--bupr-admin-text);text-decoration:none}.bupr-hub-card:focus:not(:focus-visible){outline:0}.bupr-hub-card:focus-visible{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-hub-card__icon{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:10px;background:var(--bupr-admin-accent-light);color:var(--bupr-admin-accent)}.bupr-hub-card__icon .dashicons{width:22px;height:22px;font-size:22px;color:inherit}.bupr-hub-card__title{font-size:15px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2}.bupr-hub-card__subtitle{font-size:12px;color:var(--bupr-admin-text-3);line-height:1.4}.bupr-hub-card__cta{margin-top:auto;display:inline-flex;align-items:center;gap:4px;padding-top:6px;font-size:13px;font-weight:600;color:var(--bupr-admin-accent)}.bupr-hub-card__cta .dashicons{width:16px;height:16px;font-size:16px;transition:transform .12s}.bupr-hub-card:hover .bupr-hub-card__cta .dashicons{transform:translateX(2px)}.bupr-discover-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--bupr-admin-gap-md)}.bupr-discover-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:20px;background:var(--bupr-admin-white);border:1px solid var(--bupr-admin-border);border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);transition:box-shadow .12s,border-color .12s,transform .12s}.bupr-discover-card:hover{border-color:var(--bupr-admin-border-strong);box-shadow:var(--bupr-admin-shadow-hover);transform:translateY(-1px)}.bupr-discover-card__logo{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px}.bupr-discover-card__logo img{width:52px;height:52px;object-fit:contain;display:block;border-radius:var(--bupr-admin-radius-sm)}.bupr-discover-card__title{font-size:15px;font-weight:700;color:var(--bupr-admin-text);line-height:1.2;margin:0}.bupr-discover-card__desc{font-size:13px;color:var(--bupr-admin-text-3);line-height:1.5;margin:0;flex:1 1 auto}.bupr-discover-card__cta{margin-top:4px}.bupr-discover-card__cta .dashicons{width:14px;height:14px;font-size:14px}.bupr-admin .notice{border-radius:var(--bupr-admin-radius);box-shadow:var(--bupr-admin-shadow);padding:12px 16px;margin:0 0 18px;font-size:14px;line-height:1.5;border-width:0;border-inline-start-width:4px;border-style:solid}.bupr-admin .notice p{margin:0;padding:0;font-size:14px;line-height:1.5}.bupr-admin .notice.is-dismissible{padding-right:38px}.bupr-admin .notice .notice-dismiss{top:8px;right:8px}.bupr-card--legacy .bupr-card__body{padding:0}.bupr-card--legacy .wbcom-tab-content{padding:0}.bupr-card--legacy .wbcom-admin-title-section{padding:14px 20px 12px;border-bottom:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-card--legacy .wbcom-admin-title-section h3{font-size:13px;font-weight:700;color:var(--bupr-admin-text);text-transform:uppercase;letter-spacing:.04em;margin:0}.bupr-card--legacy .wbcom-admin-title-section p,.bupr-card--legacy .wbcom-welcome-description{font-size:13px;color:var(--bupr-admin-text-3);margin:4px 0 0}.bupr-card--legacy .wbcom-admin-option-wrap{padding:8px 20px 20px}.bupr-card--legacy .wbcom-settings-section-wrap{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:16px;padding:16px 20px;border-bottom:1px solid var(--bupr-admin-surface-2)}.bupr-card--legacy .wbcom-settings-section-wrap:last-of-type{border-bottom:none}.bupr-card--legacy .wbcom-settings-section-options-heading{flex:1 1 300px;min-width:0}.bupr-card--legacy .wbcom-settings-section-options-heading label{font-size:13px;font-weight:600;color:var(--bupr-admin-text-4);display:block}.bupr-card--legacy .wbcom-settings-section-options-heading .description{font-size:12px;color:var(--bupr-admin-text-3);margin:6px 0 0;line-height:1.5}.bupr-card--legacy .wbcom-settings-section-options{flex:0 1 auto}@media (min-width:641px){.bupr-card--legacy .wbcom-settings-section-options:has(> input.large-text){flex:0 1 480px}.bupr-card--legacy .wbcom-settings-section-options:has(.wp-editor-wrap){flex:1 1 100%}}.bupr-admin .bupr-switch{position:relative;display:inline-block;flex:0 0 auto;width:40px;height:22px;margin:0}.bupr-admin .bupr-switch input[type=checkbox]{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer;z-index:1}.bupr-admin .bupr-slider{position:absolute;inset:0;border-radius:999px;background:var(--bupr-admin-border-strong);transition:background .15s}.bupr-admin .bupr-slider::before{content:"";position:absolute;top:2px;inset-inline-start:2px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform .15s}.bupr-admin .bupr-switch input:checked+.bupr-slider{background:var(--bupr-admin-accent)}.bupr-admin .bupr-switch input:checked+.bupr-slider::before{transform:translateX(18px)}[dir=rtl] .bupr-admin .bupr-switch input:checked+.bupr-slider::before{transform:translateX(-18px)}.bupr-admin .bupr-switch input:focus-visible+.bupr-slider{outline:2px solid var(--bupr-admin-accent);outline-offset:2px}.bupr-card--legacy input.large-text,.bupr-card--legacy input[type=email],.bupr-card--legacy input[type=number],.bupr-card--legacy input[type=text],.bupr-card--legacy select,.bupr-card--legacy textarea{border:1px solid var(--bupr-admin-border-strong);border-radius:var(--bupr-admin-radius-sm);font-size:13px}.bupr-card--legacy input.large-text{width:100%;max-width:480px}.bupr-card--legacy .submit,.bupr-card--legacy p.submit{padding:16px 20px;margin:0;border-top:1px solid var(--bupr-admin-border);background:var(--bupr-admin-surface-1)}.bupr-toast-host{position:fixed;right:24px;bottom:24px;z-index:100000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.bupr-toast{background:var(--bupr-admin-text);color:#fff;padding:12px 16px;border-radius:var(--bupr-admin-radius-sm);font-size:13px;font-weight:500;box-shadow:var(--bupr-admin-shadow-hover);min-width:240px;max-width:360px;pointer-events:auto;transform:translateY(8px);opacity:0;transition:opacity .2s,transform .2s}.bupr-toast--visible{opacity:1;transform:translateY(0)}.bupr-toast--success{background:var(--bupr-admin-success)}.bupr-toast--error{background:var(--bupr-admin-danger)}.bupr-confirm-backdrop{position:fixed;inset:0;background:rgba(15,23,42,.5);z-index:100001;display:flex;align-items:center;justify-content:center;padding:24px}.bupr-confirm{background:var(--bupr-admin-white);border-radius:var(--bupr-admin-radius);box-shadow:0 20px 40px rgba(0,0,0,.2);max-width:420px;width:100%;padding:24px}.bupr-confirm__title{font-size:16px;font-weight:700;margin:0 0 8px;color:var(--bupr-admin-text)}.bupr-confirm__desc{font-size:13px;color:var(--bupr-admin-text-3);margin:0 0 18px;line-height:1.5}.bupr-confirm__actions{display:flex;gap:8px;justify-content:flex-end}@media (max-width:1024px){.bupr-settings-layout{flex-direction:column}.bupr-settings-sidebar{width:100%;position:static;top:auto}.bupr-settings-sidebar-nav{display:flex;flex-wrap:wrap;padding:8px}.bupr-snav-link{flex:1 1 auto;justify-content:center}.bupr-snav-divider,.bupr-snav-section-label{display:none}.bupr-settings-main{margin-left:0;margin-top:var(--bupr-admin-gap-md)}}@media (max-width:640px){.bupr-admin{margin-right:0}.bupr-page-header{flex-direction:column;align-items:flex-start;gap:8px}.bupr-card .form-table td,.bupr-card .form-table th{display:block;width:100%;padding:8px 16px}.bupr-card--legacy .wbcom-settings-section-wrap{flex-direction:column}.bupr-card--legacy .wbcom-settings-section-options,.bupr-card--legacy .wbcom-settings-section-options-heading{flex-basis:auto}.bupr-discover-grid,.bupr-stats-grid{grid-template-columns:1fr}}
  • bp-user-profile-reviews/trunk/assets/css/min/bupr-front.min.css

    r3617176 r3736444  
    1 .stars{display:inline-block}[class*=bupr-col-]{float:inline-start;padding:10px 0}.bupr-col-1{width:8.33%}.bupr-col-2{width:16.66%}.bupr-col-3{width:25%}.bupr-col-4{width:33.33%}.bupr-col-5{width:41.66%}.bupr-col-6{width:50%}.bupr-col-7{width:58.33%}.bupr-col-8{width:66.66%}.bupr-col-9{width:75%}.bupr-col-10{width:83.33%}.bupr-col-11{width:91.66%}.bupr-col-12{width:100%}.bupr-row{clear:both;border-bottom:1px solid rgba(0,0,0,.1);overflow:hidden;padding:15px 0;display:block}.bupr-row:first-child{padding-top:0}.bupr-row:last-child{padding-bottom:0;border-bottom:0}.bp-nouveau .bupr-row{margin-bottom:20px;padding:15px;background:#fff;border:0;box-shadow:0 0 3px 0 rgba(0,0,0,.16)}.bupr-review-full-description{display:none;padding-top:20px}.bupr-criteria-label{word-break:break-word}.bupr-criteria-label span{display:inline;width:50%;height:40px}@media only screen and (max-width:768px){[class*=bupr-col-]{width:100%}.bupr-criteria-label span{display:inline;width:100%;clear:inline-start}}.sel{color:red}.bupr-accept-button,.bupr-deny-button{float:inline-start;margin-inline-end:5px}.bupr-pagination{border-bottom:0;clear:both}.single-headers #bupr-add-review-btn{list-style:none;margin:10px 10px 0 0}.single-headers .bb-enable-cover-img .member-header-actions>#bupr-add-review-btn{margin:5px 10px 10px 0}.bupr_members_review_setting ul.bupr-member-main li.bupr-members,.widget ul#bp-member-rating li{height:auto;width:100%;position:relative;display:block;margin:0;padding:.5em 0}ul.bupr-member-main{margin:0;list-style:none;padding:0}.bupr_members_review_setting ul.bupr-member-main li:first-child,.widget ul#bp-member-rating li:first-child{padding-top:0}.bupr_members_review_setting ul.bupr-member-main li:last-child,.widget ul#bp-member-rating li:last-child{padding-bottom:0;border-bottom:0}.widget ul#bp-member-rating .item-avatar,ul.bupr-member-main li.bupr-members img.avatar{width:50px;height:50px;float:inline-start}.widget ul#bp-member-rating .item,ul.bupr-member-main li.bupr-members .bupr-content-widget{margin-inline-start:70px}ul.bupr-member-main li.bupr-members.bupr-hide .bupr-content-widget{margin-inline-start:0}ul.bupr-member-main li.bupr-members .bupr-meta{display:block;font-size:90%;line-height:normal;margin-top:5px}.bupr-modal-msg{margin:50px 0;text-align:center}.bupr-members-profiles{text-align:center;width:80px;float:inline-start;text-align:start}.bupr-members-profiles img.avatar{max-width:50px;max-height:50px}.bupr-members-profiles .reviewer h4{text-transform:capitalize;margin:10px 0 0;font-size:80%}.bupr-members-content{margin-inline-start:100px}.bupr-members-content .review-subject h4{margin:5px 0}.bupr-review-modal{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.5);opacity:0;visibility:hidden;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);-webkit-transition:visibility 0s linear .25s,opacity .25s 0s,-webkit-transform .25s;transition:visibility 0s linear .25s,opacity .25s 0s,transform .25s;z-index:9999999}.bupr-review-modal-content{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit);padding:1rem 1.5rem;max-width:30rem;width:-webkit-calc(100% - 30px);width:calc(100% - 30px);margin:auto;border-radius:8px}#bupr-edit-review-modal .bupr-review-modal-close-button{float:inline-end;width:1.75rem;height:1.75rem;min-width:0;padding:0;margin:0;line-height:1.75rem;font-size:1.5rem;text-align:center;text-transform:none;text-shadow:none;letter-spacing:normal;cursor:pointer;border:0;box-shadow:none;background:0 0;color:var(--bupr-text-muted,#666);border-radius:.25rem;-webkit-transition:background-color .2s,color .2s,-webkit-transform .2s;transition:background-color .2s,color .2s,transform .2s}#bupr-edit-review-modal .bupr-review-modal-close-button:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);background:var(--bupr-chip-bg-hover,rgba(0,0,0,.06));color:var(--bupr-text,#1d2327)}#bupr-edit-review-modal .bupr-review-modal-close-button:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}#bupr-edit-review-modal .bupr-review-modal-close-button:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}.bupr-show-modal{opacity:1;visibility:visible;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);-webkit-transition:visibility 0s linear 0s,opacity .25s 0s,-webkit-transform .25s;transition:visibility 0s linear 0s,opacity .25s 0s,transform .25s}.bupr-edit-review-button-wrapper{text-align:end;margin-bottom:10px}.bp-member-reviews .bupr-row{position:relative;padding-inline-end:160px}.bp-member-reviews .bupr-row .bupr-edit-review-button-wrapper{position:absolute;inset-inline-end:15px}@media only screen and (max-width:480px){.bp-member-reviews .bupr-row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-inline-end:15px}.bp-member-reviews .bupr-row .bupr-edit-review-button-wrapper{position:static;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3;margin:15px 0 0}}button.bupr-edit-review-button{padding:10px;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-inline-start:auto}.bupr-review-modal-content button#bupr_upodate_review{text-align:center;margin:auto;width:100%;margin-top:15px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bupr-posts-pagination{margin:15px 0;text-align:end}.bupr-posts-pagination span{border:1px solid #7f7f7f;border-radius:5px;margin:0 5px;padding:5px 10px}.bupr-posts-pagination .page-numbers{border:1px solid rgba(0,0,0,.1);border-radius:3px;margin:0 0;padding:0;background:#fff;display:inline-block;height:32px;width:32px;text-align:center;line-height:32px;font-size:80%;font-weight:700}.bupr-posts-pagination .next.page-numbers,.bupr-posts-pagination .prev.page-numbers{width:auto;padding:0 10px}.bupr-single-reivew{margin-top:20px}.no-count{margin-inline-start:3px}#bupr_success_review p{display:none}.bupr-save-reivew-spinner{display:none;float:inline-start;margin-inline-start:10px;margin-top:8px}.bupr-error-fields{display:none;font-size:12px;color:red}.bupr-review-error-fields{display:none;font-size:14px;color:red}.bupr-error{width:100%;padding:10px;border-radius:5px;background-color:#f1dede;border-color:#ebcbd0;color:#a84341;margin-top:10px}.br-theme-bars-square .bupr-rating-widget{height:15px;white-space:nowrap}.br-theme-bars-square .bupr-rating-widget a{display:block;width:28px;height:28px;float:inline-start;border:2px solid #8a9bc4;background-color:#fff;margin:2px;text-decoration:none;font-size:12px;font-weight:400;line-height:2;text-align:center;color:#5a6b96;font-weight:600}.br-theme-bars-square .bupr-rating-widget a:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}.br-theme-bars-square .bupr-rating-widget a.bupr-square-selected{border:2px solid #1a56db;color:#1a56db}.br-theme-bars-square .br-readonly a{cursor:default}.br-theme-bars-square .br-readonly a.bupr-square-selected{border:2px solid #2c5fd0;color:#2c5fd0}@media print{.br-theme-bars-square .bupr-rating-widget a{border:2px solid #b3b3b3;color:#b3b3b3}}.br-theme-bars-square .br-readonly a.bupr-square-half{border-top:2px solid #2c5fd0;border-inline-start:2px solid #2c5fd0;color:#2c5fd0}.br-theme-bars-square .bupr-rating-widget a.bupr-square-half{border-top:2px solid #1a56db;border-inline-start:2px solid #1a56db;color:#1a56db}.item-header-content .activity{margin-bottom:10px}.success_review_msg{color:#4f8a10;background-color:#dff2bf;font-weight:700;margin-top:3px;text-decoration:none;margin-bottom:1.75em;border-radius:5px}.success_review_msg p{padding:10px 15px;margin:0}.bupr-star-rate{margin-inline-end:0}#review_desc,.bupr-bp-member-review-no-popup-add-block #review_desc{width:100%;padding:10px}.bupr-bp-member-review-no-popup-add-block #bupr_save_review{width:100%;margin:0;max-width:160px;height:auto;float:inline-start}.bp-member-add-form:after{content:"";display:table;clear:both}.bp-member-add-form input[type=checkbox]#bupr_anonymous_review{vertical-align:middle;margin:0 5px 0 0}.add_review_msg{display:none}.success_review_msg{display:none}#bupr-view-review-btn{width:100%}.bupr-member-review-wrapper{margin:10px 0;text-align:start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.bupr-member-review-stars{display:inline-block;margin-inline-end:10px;position:relative}.bupr-member-tooltip::before{content:attr(data-tooltip);position:absolute;bottom:150%;left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0);background-color:#333;color:#fff;padding:5px 10px;border-radius:5px;font-size:12px;white-space:nowrap;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.bupr-member-tooltip:hover::before{opacity:1;visibility:visible}.bupr-member-rating-text{font-size:14px;color:#555;margin-inline-start:5px}body.bp-legacy:not([class*=youzify]) .bupr-directory-review-parent-container{display:block}.bupr-directory-review-parent-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:10px 0}.bupr-directory-review-wrapper{margin:0;text-align:start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.bp-list.grid .bupr-directory-review-wrapper{text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bp-list:not(.grid) .bupr-directory-review-wrapper{display:block}.bupr-directory-review-stars{display:inline-block;margin-inline-end:10px;position:relative}.bupr-directory-tooltip::before{content:attr(data-tooltip);position:absolute;bottom:150%;left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0);background-color:#333;color:#fff;padding:5px 10px;border-radius:5px;font-size:12px;white-space:nowrap;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.bupr-directory-tooltip:hover::before{opacity:1;visibility:visible}.bupr-directory-rating-text{font-size:14px;color:#555;margin-inline-start:5px}.kleo-masonry-item .member-review-stars{text-align:center}.widget.bupr_members_review_setting{overflow:hidden}.posted-on.list{padding-top:10px}.widget-area .widget.buddypress div.item-options#bp-member-rating-list-options a{margin:0}.bp-nouveau .widget-area .widget.buddypress #bp-member-rating div.item{padding:0}.bb-grid .widget.buddypress div.item-options#bp-member-rating-list-options a{margin-inline-end:1.25rem;margin-top:10px}.kleo-page .widget.buddypress #bp-member-rating div.item-avatar img.avatar{width:50px;height:50px;margin:0;border-radius:0}.rating-sec{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:10px}.rating-num{margin:0 10px;font-weight:700}.rating-sec .posted-on.list{padding:0}.bupr-full-description{word-break:break-all}.description{font-style:italic;margin-bottom:10px}.description p{margin:0}li#bupr-add-review-btn a.add-review{margin:0;display:inline-block}body[class*=youzify] .youzify-head-content .bupr-member-review-wrapper{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}body[class*=youzify].reviews .youzify-page-main-content .youzify-main-column div#subnav.item-list-tabs{margin:0}body[class*=youzify].add-review .youzify-page-main-content .youzify-main-column .bupr-bp-member-review-no-popup-add-block,body[class*=youzify].reviews .youzify-page-main-content .bupr-bp-member-reviews-block .bp-member-reviews{padding:30px;border-top:1px solid #eee;background-color:var(--reign-site-sections-bg-color);background-color:var(--yzfy-card-bg-color);margin:0}body[class*=youzify] .youzify-page-main-content #bupr-reiew-edit button.bupr-edit-review-button,body[class*=youzify].add-review .youzify-page-main-content button#bupr_save_review{color:#fff}#review_desc,body[class*=youzify] .youzify-page-main-content .bupr-bp-member-review-no-popup-add-block #review_desc{margin-top:15px}.youzify .bupr-save-reivew-spinner{display:none}body[class*=youzify] #bupr-add-review-btn .add-review.button{padding:12px 20px;margin-top:15px;display:inline-block;text-align:center;border-radius:8px;background-color:var(--yzfy-scheme-color)!important;color:var(--yzfy-scheme-text-color)!important}body[class*=youzify] #bupr-add-review-btn .add-review.button:hover{background-color:#005177}.olympus-theme .bgr-submit-review,.olympus-theme .bgr-submit-review:hover{color:inherit}body[class*=youzify] .bupr-member-tooltip .bupr-member-rating-text{color:var(--yzfy-scheme-text-color)!important}@media only screen and (max-width:480px){.bupr-members-profiles{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;float:none;width:100%;margin-bottom:10px}.bupr-members-content,.bupr-members-profiles .reviewer h4{margin:0}.rating-num{margin-inline-start:0}.rating-star{margin-inline-end:10px}body[class*=youzify] .youzify-page-main-content .bupr-criteria-label{margin-bottom:10px}}@media only screen and (max-width:768px){.multi-review{display:-webkit-box;display:-ms-flexbox;display:flex}.bupr-member-review-wrapper{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}}@media only screen and (max-width:480px){.multi-review{display:inline-block}}.youzify-tabs-list-gradient .youzify-default-subnav li#reviews-add-review-personal-li a i::before,.youzify-tabs-list-gradient .youzify-default-subnav li#reviews-view-personal-li a i::before{content:"\f005"}.bupr-youzify-show-modal #youzify-profile-navmenu,.bupr-youzify-show-modal .youzify-hdr-v1 .youzify-cover-content .youzify-inner-content,.bupr-youzify-show-modal .youzify-header-cover>img,.bupr-youzify-show-modal .youzify-header-overlay .youzify-header-cover:before,.bupr-youzify-show-modal .youzify-header-pattern .youzify-header-cover:after{z-index:0}.buddyboss-theme .members-directory-wrapper .members .member-review-stars{text-align:center}.buddyboss-theme .member-header-actions-wrap .member-header-actions.action{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px}.rating{color:red}#bupr-reiew-edit button.bupr-edit-review-button{padding:6px 15px}.bp-member-add-form button#bupr_save_review{display:inline-block;max-width:180px;font-size:16px;font-weight:400}.bupr-reply-section{margin-top:15px;clear:both}.bupr-owner-reply{background:linear-gradient(135deg,#f8f9fa 0,#e9ecef 100%);border-inline-start:4px solid var(--bupr-accent,#007cba);padding:15px;margin-top:10px;border-start-end-radius:8px;border-end-end-radius:8px}.bupr-reply-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:10px;margin-bottom:10px}.bupr-reply-header img.avatar{border-radius:50%;width:32px;height:32px}.bupr-reply-author{font-weight:600;color:#1d2327}.bupr-reply-badge{background:var(--bupr-accent,#007cba);color:#fff;font-size:11px;padding:3px 8px;border-radius:12px;text-transform:uppercase;font-weight:600}.bupr-reply-date{color:#666;font-size:12px}.bupr-reply-content{font-style:italic;color:#333}.bupr-reply-content p{margin:0}.bupr-reply-form-wrapper{margin-top:10px}.bupr-show-reply-form{background:0 0;border:1px dashed var(--bupr-accent,#007cba);color:var(--bupr-accent,#007cba);padding:8px 16px;cursor:pointer;border-radius:4px;font-size:13px}.bupr-show-reply-form:hover{background:#f0f7fc}.bupr-reply-form{margin-top:10px}.bupr-reply-textarea{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;resize:vertical;min-height:80px}.bupr-reply-textarea:focus{border-color:var(--bupr-accent,#007cba);box-shadow:0 0 0 2px rgba(0,124,186,.1);box-shadow:0 0 0 2px color-mix(in srgb,var(--bupr-accent,#007cba) 15%,transparent)}.bupr-reply-textarea:focus:not(:focus-visible){outline:0}.bupr-reply-textarea:focus-visible{outline:2px solid var(--bupr-focus,#007cba);outline-offset:2px}.bupr-reply-actions{margin-top:10px;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-submit-reply{background:var(--bupr-accent,#007cba);color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.bupr-submit-reply:hover{background:#005a87}.bupr-cancel-reply{background:#f0f0f1;color:#50575e;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.bupr-cancel-reply:hover{background:#dcdcde}.bupr-reply-spinner{width:20px;height:20px;border:2px solid #ddd;border-top-color:var(--bupr-accent,#007cba);border-radius:50%;-webkit-animation:bupr-spin 1s linear infinite;animation:bupr-spin 1s linear infinite}.bupr-report-section{position:absolute;inset-inline-end:15px;top:15px}.bp-member-reviews .bupr-row{position:relative}.bupr-report-button{background:#f8f9fa;border:1px solid #ddd;border-radius:4px;cursor:pointer;padding:6px 12px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:5px;font-size:12px;color:#666;-webkit-transition:all .2s;transition:all .2s}.bupr-report-button:hover{background:#fff0f0;border-color:#dc3232;color:#dc3232}.bupr-report-button .dashicons{font-size:14px;width:14px;height:14px}.bupr-report-text{font-weight:500}.bupr-report-success{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;color:#46b450;font-size:12px;font-weight:500;padding:6px 12px;background:#ecfdf5;border-radius:4px;border:1px solid #d4edda}.bupr-report-success .dashicons{font-size:14px;width:14px;height:14px}.bupr-flag-section{position:absolute;inset-inline-end:15px;top:15px}.bupr-flag-button{background:#f8f9fa;border:1px solid #ddd;border-radius:4px;cursor:pointer;padding:6px 12px}.bupr-flag-success{display:inline-flex;align-items:center;gap:4px;color:#46b450;font-size:12px}.bupr-flag-modal{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:999999;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bupr-flag-modal-content{background:#fff;border-radius:8px;max-width:400px;width:90%;box-shadow:0 4px 20px rgba(0,0,0,.15)}.bupr-flag-modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 20px;border-bottom:1px solid #ddd}.bupr-flag-modal-header h3{margin:0;font-size:18px;color:#1d2327}.bupr-flag-modal-close{background:0 0;border:none;font-size:24px;cursor:pointer;color:#666;line-height:1}.bupr-flag-modal-close:hover{color:#dc3232}.bupr-flag-modal-body{padding:20px}.bupr-flag-modal-body p{margin:0 0 15px;color:#50575e}.bupr-flag-reasons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:10px}.bupr-flag-reason-option{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;padding:10px 15px;background:#f9f9f9;border-radius:4px;cursor:pointer;-webkit-transition:background .2s;transition:background .2s}.bupr-flag-reason-option:hover{background:#f0f0f1}.bupr-flag-reason-option input[type=radio]{margin:0}.bupr-flag-modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;padding:15px 20px;border-top:1px solid #ddd;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-flag-submit{background:#dc3232;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer}.bupr-flag-submit:hover{background:#a00}.bupr-flag-cancel{background:#f0f0f1;color:#50575e;border:none;padding:10px 20px;border-radius:4px;cursor:pointer}.bupr-flag-cancel:hover{background:#dcdcde}.bupr-flag-spinner{width:20px;height:20px;border:2px solid #ddd;border-top-color:#dc3232;border-radius:50%;-webkit-animation:bupr-spin 1s linear infinite;animation:bupr-spin 1s linear infinite}@-webkit-keyframes bupr-spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes bupr-spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@media only screen and (max-width:480px){.bupr-flag-section,.bupr-report-section{position:static;margin-top:10px}.bupr-reply-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.bupr-reply-actions{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.bupr-reply-actions button{width:100%}}.bupr-front-toast-host{position:fixed;inset-inline-end:24px;bottom:24px;z-index:100000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.bupr-front-toast{background:#1e293b;color:#fff;padding:12px 16px;border-radius:6px;font-size:14px;font-weight:500;line-height:1.4;box-shadow:0 4px 12px rgba(0,0,0,.18);min-width:220px;max-width:360px;pointer-events:auto;transform:translateY(8px);opacity:0;transition:opacity .2s,transform .2s}.bupr-front-toast--visible{opacity:1;transform:translateY(0)}.bupr-front-toast--success{background:#16a34a}.bupr-front-toast--error{background:#dc2626}:root{--bupr-card-bg:var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, var(--wp--preset--color--base, #fff)));--bupr-chip-bg:var(--bx-color-bg-muted, #f9f9f9);--bupr-chip-bg-hover:var(--bx-color-bg-subtle, #f0f0f1);--bupr-field-bg:var(--bx-color-bg, var(--reign-form-background-color, var(--wp--preset--color--base, #fff)));--bupr-text:var(--bx-color-fg, var(--wp--preset--color--contrast, #1d2327));--bupr-text-muted:var(--bx-color-fg-muted, #50575e);--bupr-text-subtle:var(--bx-color-fg-subtle, #666);--bupr-border:var(--bx-color-border, var(--reign-form-border-color, rgba(0, 0, 0, 0.1)));--bupr-reply-bg:var(--bx-color-bg-muted, #f8f9fa);--bupr-reply-hover-bg:#f0f7fc;--bupr-success-bg:#ecfdf5;--bupr-success-fg:#46b450;--bupr-success-border:#d4edda;--bupr-danger-bg:#fff0f0;--bupr-danger-fg:#dc3232;--bupr-danger-border:#f5c6cb;--bupr-accent:var(--bx-color-accent, var(--reign-colors-theme, var(--wp--preset--color--primary, #007cba)));--bupr-focus:var(--bx-color-accent, var(--reign-colors-theme, var(--wp--preset--color--primary, #2271b1)))}body.buddyx-dark-theme,body.dark-mode,body.dark-scheme,html[data-bx-mode=dark]{--bupr-card-bg:var(--bx-color-bg-elevated, #1e1e1e);--bupr-chip-bg:var(--bx-color-bg-muted, #272727);--bupr-chip-bg-hover:var(--bx-color-bg-subtle, #313131);--bupr-field-bg:var(--bx-color-bg, #161616);--bupr-text:var(--bx-color-fg, #e6e6e6);--bupr-text-muted:var(--bx-color-fg-muted, #a6a6a6);--bupr-text-subtle:var(--bx-color-fg-subtle, #8a8a8a);--bupr-border:var(--bx-color-border, rgba(255, 255, 255, 0.15));--bupr-reply-bg:var(--bx-color-bg-muted, #232323);--bupr-reply-hover-bg:rgba(0, 124, 186, 0.15);--bupr-success-bg:rgba(70, 180, 80, 0.15);--bupr-success-fg:#7fd58b;--bupr-success-border:rgba(70, 180, 80, 0.4);--bupr-danger-bg:rgba(220, 50, 50, 0.15);--bupr-danger-fg:#ff8a8a;--bupr-danger-border:rgba(220, 50, 50, 0.4)}.bupr-row{border-color:var(--bupr-border,rgba(0,0,0,.1))}.bp-nouveau .bupr-row{background:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-review-modal-content{background-color:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-flag-modal-content{background:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-flag-modal-footer,.bupr-flag-modal-header{border-color:var(--bupr-border,#ddd)}.bupr-flag-modal-header h3{color:var(--bupr-text,#1d2327)}.bupr-flag-modal-close{color:var(--bupr-text-muted,#666)}.bupr-flag-modal-body p{color:var(--bupr-text-muted,#50575e)}.bupr-flag-reason-option{background:var(--bupr-chip-bg,#f9f9f9);color:var(--bupr-text,inherit)}.bupr-flag-reason-option:hover{background:var(--bupr-chip-bg-hover,#f0f0f1)}.bupr-cancel-reply,.bupr-flag-cancel{background:var(--bupr-chip-bg,#f0f0f1);color:var(--bupr-text,#50575e)}.bupr-cancel-reply:hover,.bupr-flag-cancel:hover{background:var(--bupr-chip-bg-hover,#dcdcde)}.bupr-owner-reply{background:var(--bupr-reply-bg,linear-gradient(135deg,#f8f9fa 0,#e9ecef 100%))}.bupr-reply-author{color:var(--bupr-text,#1d2327)}.bupr-reply-content{color:var(--bupr-text-muted,#333)}.bupr-reply-date{color:var(--bupr-text-subtle,#666)}.bupr-reply-textarea{background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,#ddd)}.bupr-show-reply-form:hover{background:var(--bupr-reply-hover-bg,#f0f7fc)}.bupr-flag-button,.bupr-report-button{background:var(--bupr-chip-bg,#f8f9fa);border-color:var(--bupr-border,#ddd);color:var(--bupr-text-muted,#666)}.bupr-report-button:hover{background:var(--bupr-danger-bg,#fff0f0);border-color:#dc3232;color:var(--bupr-danger-fg,#dc3232)}.bupr-report-success{background:var(--bupr-success-bg,#ecfdf5);border-color:var(--bupr-success-border,#d4edda);color:var(--bupr-success-fg,#46b450)}.success_review_msg{background-color:var(--bupr-success-bg,#dff2bf);color:var(--bupr-success-fg,#4f8a10)}.bupr-error{background-color:var(--bupr-danger-bg,#f1dede);border-color:var(--bupr-danger-border,#ebcbd0);color:var(--bupr-danger-fg,#a84341)}.br-theme-bars-square .bupr-rating-widget a{background-color:var(--bupr-chip-bg,#fff)}.bupr-posts-pagination .page-numbers{background:var(--bupr-chip-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,rgba(0,0,0,.1))}#bp-member-reviews-list{width:100%}.bp-member-reviews{margin-top:25px}.bp-member-add-form textarea{width:100%;padding:10px;background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,#ddd)}.bp-member-add-form input{width:100%;margin-inline-end:5px}.bp-member-add-form button{width:100%;display:block;margin:0 auto}#bupr_member_review_id{padding:10px;padding-inline-start:10px;max-width:300px;width:100%;border:1px var(--bupr-border,#e3e3e3) solid;background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);font-family:inherit}.bp-member-add-form p{text-align:start;margin:10px 0}.bp-member-add-form p button{width:100%}.bupr-criteria-label span{float:inline-start}.bupr-add-review{margin-inline-start:5px}.bupr-bp-member-review-no-popup-add-block{display:block}.bupr-multi-review{margin:15px}.multi-review{display:inline-block;width:100%;margin:0;padding:10px 0 0;background:0 0}.multi-review>div{padding:0}.bupr-directory-tooltip span.bupr-star-rate{font-size:15px}.bupr-error{width:90%;padding:10px;border-radius:5px;background-color:var(--bupr-danger-bg,#f1dede);border-color:var(--bupr-danger-border,#ebcbd0);color:var(--bupr-danger-fg,#a84341)}.bupr-review-description a{margin:10px 0;display:inline-block;text-decoration:underline}.bupr_not_give_review p{padding:10px;font-weight:500;font-size:20px;color:#e84242}.members-list li .more-action-button{display:none}#bupr_save_review:focus-visible,.bp-member-add-form button:focus-visible,.bupr-edit-review-button:focus-visible,.bupr-flag-cancel:focus-visible,.bupr-flag-modal-close:focus-visible,.bupr-flag-reason-option:focus-visible,.bupr-flag-submit:focus-visible,.bupr-pagination a:focus-visible,.bupr-report-button:focus-visible,.bupr-submit-reply:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}#bupr_save_review:active,.bp-member-add-form button:active,.bupr-edit-review-button:active,.bupr-flag-cancel:active,.bupr-flag-submit:active,.bupr-report-button:active,.bupr-submit-reply:active{-webkit-transform:translateY(1px);transform:translateY(1px)}.bupr-flag-reason-option:active{-webkit-transform:scale(.98);transform:scale(.98)}#bupr_save_review:disabled,#bupr_save_review[disabled],.bp-member-add-form button:disabled,.bp-member-add-form button[disabled],.bupr-edit-review-button:disabled,.bupr-edit-review-button[disabled],.bupr-flag-cancel:disabled,.bupr-flag-submit:disabled,.bupr-report-button:disabled,.bupr-submit-reply:disabled{opacity:.6;cursor:not-allowed;-webkit-transform:none;transform:none;pointer-events:none}.member-edit-stars:focus-visible,.member_stars:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px;border-radius:2px}
     1.stars{display:inline-block}[class*=bupr-col-]{float:inline-start;padding:10px 0}.bupr-col-1{width:8.33%}.bupr-col-2{width:16.66%}.bupr-col-3{width:25%}.bupr-col-4{width:33.33%}.bupr-col-5{width:41.66%}.bupr-col-6{width:50%}.bupr-col-7{width:58.33%}.bupr-col-8{width:66.66%}.bupr-col-9{width:75%}.bupr-col-10{width:83.33%}.bupr-col-11{width:91.66%}.bupr-col-12{width:100%}.bupr-row{clear:both;border-bottom:1px solid rgba(0,0,0,.1);overflow:hidden;padding:15px 0;display:block}.bupr-row:first-child{padding-top:0}.bupr-row:last-child{padding-bottom:0;border-bottom:0}.bp-nouveau .bupr-row{margin-bottom:20px;padding:15px;background:#fff;border:0;box-shadow:0 0 3px 0 rgba(0,0,0,.16)}.bupr-review-full-description{display:none;padding-top:20px}.bupr-criteria-label{word-break:break-word}.bupr-criteria-label span{display:inline;width:50%;height:40px}@media only screen and (max-width:768px){[class*=bupr-col-]{width:100%}.bupr-criteria-label span{display:inline;width:100%;clear:inline-start}}.sel{color:red}.bupr-accept-button,.bupr-deny-button{float:inline-start;margin-inline-end:5px}.bupr-pagination{border-bottom:0;clear:both}.single-headers #bupr-add-review-btn{list-style:none;margin:10px 10px 0 0}.single-headers .bb-enable-cover-img .member-header-actions>#bupr-add-review-btn{margin:5px 10px 10px 0}.bupr_members_review_setting ul.bupr-member-main li.bupr-members,.widget ul#bp-member-rating li{height:auto;width:100%;position:relative;display:block;margin:0;padding:.5em 0}ul.bupr-member-main{margin:0;list-style:none;padding:0}.bupr_members_review_setting ul.bupr-member-main li:first-child,.widget ul#bp-member-rating li:first-child{padding-top:0}.bupr_members_review_setting ul.bupr-member-main li:last-child,.widget ul#bp-member-rating li:last-child{padding-bottom:0;border-bottom:0}.widget ul#bp-member-rating .item-avatar,ul.bupr-member-main li.bupr-members img.avatar{width:50px;height:50px;float:inline-start}.widget ul#bp-member-rating .item,ul.bupr-member-main li.bupr-members .bupr-content-widget{margin-inline-start:70px}ul.bupr-member-main li.bupr-members.bupr-hide .bupr-content-widget{margin-inline-start:0}ul.bupr-member-main li.bupr-members .bupr-meta{display:block;font-size:90%;line-height:normal;margin-top:5px}.bupr-modal-msg{margin:50px 0;text-align:center}.bupr-members-profiles{text-align:center;width:80px;float:inline-start;text-align:start}.bupr-members-profiles img.avatar{max-width:50px;max-height:50px}.bupr-members-profiles .reviewer h4{text-transform:capitalize;margin:10px 0 0;font-size:80%}.bupr-members-content{margin-inline-start:100px}.bupr-members-content .review-subject h4{margin:5px 0}.bupr-review-modal{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.5);opacity:0;visibility:hidden;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);-webkit-transition:visibility 0s linear .25s,opacity .25s 0s,-webkit-transform .25s;transition:visibility 0s linear .25s,opacity .25s 0s,transform .25s;z-index:9999999}.bupr-review-modal-content{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit);padding:1rem 1.5rem;max-width:30rem;width:-webkit-calc(100% - 30px);width:calc(100% - 30px);margin:auto;border-radius:8px}#bupr-edit-review-modal .bupr-review-modal-close-button{float:inline-end;width:1.75rem;height:1.75rem;min-width:0;padding:0;margin:0;line-height:1.75rem;font-size:1.5rem;text-align:center;text-transform:none;text-shadow:none;letter-spacing:normal;cursor:pointer;border:0;box-shadow:none;background:0 0;color:var(--bupr-text-muted,#666);border-radius:.25rem;-webkit-transition:background-color .2s,color .2s,-webkit-transform .2s;transition:background-color .2s,color .2s,transform .2s}#bupr-edit-review-modal .bupr-review-modal-close-button:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);background:var(--bupr-chip-bg-hover,rgba(0,0,0,.06));color:var(--bupr-text,#1d2327)}#bupr-edit-review-modal .bupr-review-modal-close-button:active{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}#bupr-edit-review-modal .bupr-review-modal-close-button:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}.bupr-show-modal{opacity:1;visibility:visible;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);-webkit-transition:visibility 0s linear 0s,opacity .25s 0s,-webkit-transform .25s;transition:visibility 0s linear 0s,opacity .25s 0s,transform .25s}.bupr-edit-review-button-wrapper{text-align:end;margin-bottom:10px}.bp-member-reviews .bupr-row{position:relative;padding-inline-end:160px}.bp-member-reviews .bupr-row .bupr-edit-review-button-wrapper{position:absolute;inset-inline-end:15px}@media only screen and (max-width:480px){.bp-member-reviews .bupr-row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-inline-end:15px}.bp-member-reviews .bupr-row .bupr-edit-review-button-wrapper{position:static;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3;margin:15px 0 0}}button.bupr-edit-review-button{padding:10px;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-inline-start:auto}.bupr-review-modal-content button#bupr_upodate_review{text-align:center;margin:auto;width:100%;margin-top:15px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bupr-posts-pagination{margin:15px 0;text-align:end}.bupr-posts-pagination span{border:1px solid #7f7f7f;border-radius:5px;margin:0 5px;padding:5px 10px}.bupr-posts-pagination .page-numbers{border:1px solid rgba(0,0,0,.1);border-radius:3px;margin:0 0;padding:0;background:#fff;display:inline-block;height:32px;width:32px;text-align:center;line-height:32px;font-size:80%;font-weight:700}.bupr-posts-pagination .next.page-numbers,.bupr-posts-pagination .prev.page-numbers{width:auto;padding:0 10px}.bupr-single-reivew{margin-top:20px}.no-count{margin-inline-start:3px}#bupr_success_review p{display:none}.bupr-save-reivew-spinner{display:none;float:inline-start;margin-inline-start:10px;margin-top:8px}.bupr-error-fields{display:none;font-size:12px;color:red}.bupr-review-error-fields{display:none;font-size:14px;color:red}.bupr-error{width:100%;padding:10px;border-radius:5px;background-color:#f1dede;border-color:#ebcbd0;color:#a84341;margin-top:10px}.br-theme-bars-square .bupr-rating-widget{height:15px;white-space:nowrap}.br-theme-bars-square .bupr-rating-widget a{display:block;width:28px;height:28px;float:inline-start;border:2px solid #8a9bc4;background-color:#fff;margin:2px;text-decoration:none;font-size:12px;font-weight:400;line-height:2;text-align:center;color:#5a6b96;font-weight:600}.br-theme-bars-square .bupr-rating-widget a:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}.br-theme-bars-square .bupr-rating-widget a.bupr-square-selected{border:2px solid #1a56db;color:#1a56db}.br-theme-bars-square .br-readonly a{cursor:default}.br-theme-bars-square .br-readonly a.bupr-square-selected{border:2px solid #2c5fd0;color:#2c5fd0}@media print{.br-theme-bars-square .bupr-rating-widget a{border:2px solid #b3b3b3;color:#b3b3b3}}.br-theme-bars-square .br-readonly a.bupr-square-half{border-top:2px solid #2c5fd0;border-inline-start:2px solid #2c5fd0;color:#2c5fd0}.br-theme-bars-square .bupr-rating-widget a.bupr-square-half{border-top:2px solid #1a56db;border-inline-start:2px solid #1a56db;color:#1a56db}.item-header-content .activity{margin-bottom:10px}.success_review_msg{color:#4f8a10;background-color:#dff2bf;font-weight:700;margin-top:3px;text-decoration:none;margin-bottom:1.75em;border-radius:5px}.success_review_msg p{padding:10px 15px;margin:0}.bupr-star-rate{margin-inline-end:0}#review_desc,.bupr-bp-member-review-no-popup-add-block #review_desc{width:100%;padding:10px}#review_desc,.bupr-flag-modal-content,.bupr-flag-modal-content textarea,.bupr-review-modal-content,.bupr-review-modal-content textarea{box-sizing:border-box}#review_desc,.bupr-flag-modal-content textarea,.bupr-review-modal-content textarea{max-width:100%}.bupr-bp-member-review-no-popup-add-block #bupr_save_review{width:100%;margin:0;max-width:160px;height:auto;float:inline-start}.bp-member-add-form:after{content:"";display:table;clear:both}.bp-member-add-form input[type=checkbox]#bupr_anonymous_review{vertical-align:middle;margin:0 5px 0 0}.add_review_msg{display:none}.success_review_msg{display:none}#bupr-view-review-btn{width:100%}.bupr-member-review-wrapper{margin:10px 0;text-align:start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.bupr-member-review-stars{display:inline-block;margin-inline-end:10px;position:relative}.bupr-member-tooltip::before{content:attr(data-tooltip);position:absolute;bottom:150%;left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0);background-color:#333;color:#fff;padding:5px 10px;border-radius:5px;font-size:12px;white-space:nowrap;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.bupr-member-tooltip:hover::before{opacity:1;visibility:visible}.bupr-member-rating-text{font-size:14px;color:#555;margin-inline-start:5px}body.bp-legacy:not([class*=youzify]) .bupr-directory-review-parent-container{display:block}.bupr-directory-review-parent-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:10px 0}.bupr-directory-review-wrapper{margin:0;text-align:start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.bp-list.grid .bupr-directory-review-wrapper{text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bp-list:not(.grid) .bupr-directory-review-wrapper{display:block}.bupr-directory-review-stars{display:inline-block;margin-inline-end:10px;position:relative}.bupr-directory-tooltip::before{content:attr(data-tooltip);position:absolute;bottom:150%;left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0);background-color:#333;color:#fff;padding:5px 10px;border-radius:5px;font-size:12px;white-space:nowrap;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.bupr-directory-tooltip:hover::before{opacity:1;visibility:visible}.bupr-directory-rating-text{font-size:14px;color:#555;margin-inline-start:5px}.kleo-masonry-item .member-review-stars{text-align:center}.widget.bupr_members_review_setting{overflow:hidden}.posted-on.list{padding-top:10px}.widget-area .widget.buddypress div.item-options#bp-member-rating-list-options a{margin:0}.bp-nouveau .widget-area .widget.buddypress #bp-member-rating div.item{padding:0}.bb-grid .widget.buddypress div.item-options#bp-member-rating-list-options a{margin-inline-end:1.25rem;margin-top:10px}.kleo-page .widget.buddypress #bp-member-rating div.item-avatar img.avatar{width:50px;height:50px;margin:0;border-radius:0}.rating-sec{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:10px}.rating-num{margin:0 10px;font-weight:700}.rating-sec .posted-on.list{padding:0}.bupr-full-description{word-break:break-all}.description{font-style:italic;margin-bottom:10px}.description p{margin:0}li#bupr-add-review-btn a.add-review{margin:0;display:inline-block}body[class*=youzify] .youzify-head-content .bupr-member-review-wrapper{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}body[class*=youzify].reviews .youzify-page-main-content .youzify-main-column div#subnav.item-list-tabs{margin:0}body[class*=youzify].add-review .youzify-page-main-content .youzify-main-column .bupr-bp-member-review-no-popup-add-block,body[class*=youzify].reviews .youzify-page-main-content .bupr-bp-member-reviews-block .bp-member-reviews{padding:30px;border-top:1px solid #eee;background-color:var(--reign-site-sections-bg-color);background-color:var(--yzfy-card-bg-color);margin:0}body[class*=youzify] .youzify-page-main-content #bupr-reiew-edit button.bupr-edit-review-button,body[class*=youzify].add-review .youzify-page-main-content button#bupr_save_review{color:#fff}#review_desc,body[class*=youzify] .youzify-page-main-content .bupr-bp-member-review-no-popup-add-block #review_desc{margin-top:15px}.youzify .bupr-save-reivew-spinner{display:none}body[class*=youzify] #bupr-add-review-btn .add-review.button{padding:12px 20px;margin-top:15px;display:inline-block;text-align:center;border-radius:8px;background-color:var(--yzfy-scheme-color)!important;color:var(--yzfy-scheme-text-color)!important}body[class*=youzify] #bupr-add-review-btn .add-review.button:hover{background-color:#005177}.olympus-theme .bgr-submit-review,.olympus-theme .bgr-submit-review:hover{color:inherit}body[class*=youzify] .bupr-member-tooltip .bupr-member-rating-text{color:var(--yzfy-scheme-text-color)!important}@media only screen and (max-width:480px){.bupr-members-profiles{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;float:none;width:100%;margin-bottom:10px}.bupr-members-content,.bupr-members-profiles .reviewer h4{margin:0}.rating-num{margin-inline-start:0}.rating-star{margin-inline-end:10px}body[class*=youzify] .youzify-page-main-content .bupr-criteria-label{margin-bottom:10px}}@media only screen and (max-width:768px){.multi-review{display:-webkit-box;display:-ms-flexbox;display:flex}.bupr-member-review-wrapper{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}}@media only screen and (max-width:480px){.multi-review{display:inline-block}}.youzify-tabs-list-gradient .youzify-default-subnav li#reviews-add-review-personal-li a i::before,.youzify-tabs-list-gradient .youzify-default-subnav li#reviews-view-personal-li a i::before{content:"\f005"}.bupr-youzify-show-modal #youzify-profile-navmenu,.bupr-youzify-show-modal .youzify-hdr-v1 .youzify-cover-content .youzify-inner-content,.bupr-youzify-show-modal .youzify-header-cover>img,.bupr-youzify-show-modal .youzify-header-overlay .youzify-header-cover:before,.bupr-youzify-show-modal .youzify-header-pattern .youzify-header-cover:after{z-index:0}.buddyboss-theme .members-directory-wrapper .members .member-review-stars{text-align:center}.buddyboss-theme .member-header-actions-wrap .member-header-actions.action{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px}.rating{color:red}#bupr-reiew-edit button.bupr-edit-review-button{padding:6px 15px}.bp-member-add-form button#bupr_save_review{display:inline-block;max-width:180px;font-size:16px;font-weight:400}.bupr-reply-section{margin-top:15px;clear:both}.bupr-owner-reply{background:linear-gradient(135deg,#f8f9fa 0,#e9ecef 100%);border-inline-start:4px solid var(--bupr-accent,#007cba);padding:15px;margin-top:10px;border-start-end-radius:8px;border-end-end-radius:8px}.bupr-reply-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:10px;margin-bottom:10px}.bupr-reply-header img.avatar{border-radius:50%;width:32px;height:32px}.bupr-reply-author{font-weight:600;color:#1d2327}.bupr-reply-badge{background:var(--bupr-accent,#007cba);color:#fff;font-size:11px;padding:3px 8px;border-radius:12px;text-transform:uppercase;font-weight:600}.bupr-reply-date{color:#666;font-size:12px}.bupr-reply-content{font-style:italic;color:#333}.bupr-reply-content p{margin:0}.bupr-reply-form-wrapper{margin-top:10px}.bupr-show-reply-form{background:0 0;border:1px dashed var(--bupr-accent,#007cba);color:var(--bupr-accent,#007cba);padding:8px 16px;cursor:pointer;border-radius:4px;font-size:13px}.bupr-show-reply-form:hover{background:#f0f7fc}.bupr-reply-form{margin-top:10px}.bupr-reply-textarea{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;resize:vertical;min-height:80px}.bupr-reply-textarea:focus{border-color:var(--bupr-accent,#007cba);box-shadow:0 0 0 2px rgba(0,124,186,.1);box-shadow:0 0 0 2px color-mix(in srgb,var(--bupr-accent,#007cba) 15%,transparent)}.bupr-reply-textarea:focus:not(:focus-visible){outline:0}.bupr-reply-textarea:focus-visible{outline:2px solid var(--bupr-focus,#007cba);outline-offset:2px}.bupr-reply-actions{margin-top:10px;display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-submit-reply{background:var(--bupr-accent,#007cba);color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.bupr-submit-reply:hover{background:#005a87}.bupr-cancel-reply{background:#f0f0f1;color:#50575e;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.bupr-cancel-reply:hover{background:#dcdcde}.bupr-reply-spinner{width:20px;height:20px;border:2px solid #ddd;border-top-color:var(--bupr-accent,#007cba);border-radius:50%;-webkit-animation:bupr-spin 1s linear infinite;animation:bupr-spin 1s linear infinite}.bupr-report-section{position:absolute;inset-inline-end:15px;top:15px}.bp-member-reviews .bupr-row{position:relative}.bupr-report-button{background:#f8f9fa;border:1px solid #ddd;border-radius:4px;cursor:pointer;padding:6px 12px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:5px;font-size:12px;color:#666;-webkit-transition:all .2s;transition:all .2s}.bupr-report-button:hover{background:#fff0f0;border-color:#dc3232;color:#dc3232}.bupr-report-button .dashicons{font-size:14px;width:14px;height:14px}.bupr-report-text{font-weight:500}.bupr-report-success{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;color:#46b450;font-size:12px;font-weight:500;padding:6px 12px;background:#ecfdf5;border-radius:4px;border:1px solid #d4edda}.bupr-report-success .dashicons{font-size:14px;width:14px;height:14px}.bupr-flag-section{position:absolute;inset-inline-end:15px;top:15px}.bupr-flag-button{background:#f8f9fa;border:1px solid #ddd;border-radius:4px;cursor:pointer;padding:6px 12px}.bupr-flag-success{display:inline-flex;align-items:center;gap:4px;color:#46b450;font-size:12px}.bupr-flag-modal{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:999999;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.bupr-flag-modal-content{background:#fff;border-radius:8px;max-width:400px;width:90%;box-shadow:0 4px 20px rgba(0,0,0,.15)}.bupr-flag-modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 20px;border-bottom:1px solid #ddd}.bupr-flag-modal-header h3{margin:0;font-size:18px;color:#1d2327}.bupr-flag-modal-close{background:0 0;border:none;font-size:24px;cursor:pointer;color:#666;line-height:1}.bupr-flag-modal-close:hover{color:#dc3232}.bupr-flag-modal-body{padding:20px}.bupr-flag-modal-body p{margin:0 0 15px;color:#50575e}.bupr-flag-reasons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:10px}.bupr-flag-reason-option{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px;padding:10px 15px;background:#f9f9f9;border-radius:4px;cursor:pointer;-webkit-transition:background .2s;transition:background .2s}.bupr-flag-reason-option:hover{background:#f0f0f1}.bupr-flag-reason-option input[type=radio]{margin:0}.bupr-flag-modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px;padding:15px 20px;border-top:1px solid #ddd;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bupr-flag-submit{background:#dc3232;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer}.bupr-flag-submit:hover{background:#a00}.bupr-flag-cancel{background:#f0f0f1;color:#50575e;border:none;padding:10px 20px;border-radius:4px;cursor:pointer}.bupr-flag-cancel:hover{background:#dcdcde}.bupr-flag-spinner{width:20px;height:20px;border:2px solid #ddd;border-top-color:#dc3232;border-radius:50%;-webkit-animation:bupr-spin 1s linear infinite;animation:bupr-spin 1s linear infinite}@-webkit-keyframes bupr-spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes bupr-spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@media only screen and (max-width:480px){.bupr-flag-section,.bupr-report-section{position:static;margin-top:10px}.bupr-reply-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.bupr-reply-actions{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.bupr-reply-actions button{width:100%}}.bupr-front-toast-host{position:fixed;inset-inline-end:24px;bottom:24px;z-index:100000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.bupr-front-toast{background:#1e293b;color:#fff;padding:12px 16px;border-radius:6px;font-size:14px;font-weight:500;line-height:1.4;box-shadow:0 4px 12px rgba(0,0,0,.18);min-width:220px;max-width:360px;pointer-events:auto;transform:translateY(8px);opacity:0;transition:opacity .2s,transform .2s}.bupr-front-toast--visible{opacity:1;transform:translateY(0)}.bupr-front-toast--success{background:#16a34a}.bupr-front-toast--error{background:#dc2626}:root{--bupr-card-bg:var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, var(--wp--preset--color--base, #fff)));--bupr-chip-bg:var(--bx-color-bg-muted, #f9f9f9);--bupr-chip-bg-hover:var(--bx-color-bg-subtle, #f0f0f1);--bupr-field-bg:var(--bx-color-bg, var(--reign-form-background-color, var(--wp--preset--color--base, #fff)));--bupr-text:var(--bx-color-fg, var(--wp--preset--color--contrast, #1d2327));--bupr-text-muted:var(--bx-color-fg-muted, #50575e);--bupr-text-subtle:var(--bx-color-fg-subtle, #666);--bupr-border:var(--bx-color-border, var(--reign-form-border-color, rgba(0, 0, 0, 0.1)));--bupr-reply-bg:var(--bx-color-bg-muted, #f8f9fa);--bupr-reply-hover-bg:#f0f7fc;--bupr-success-bg:#ecfdf5;--bupr-success-fg:#46b450;--bupr-success-border:#d4edda;--bupr-danger-bg:#fff0f0;--bupr-danger-fg:#dc3232;--bupr-danger-border:#f5c6cb;--bupr-accent:var(--bx-color-accent, var(--reign-colors-theme, var(--wp--preset--color--primary, #007cba)));--bupr-focus:var(--bx-color-accent, var(--reign-colors-theme, var(--wp--preset--color--primary, #2271b1)))}body.buddyx-dark-theme,body.dark-mode,body.dark-scheme,html[data-bx-mode=dark]{--bupr-card-bg:var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, #1e1e1e));--bupr-chip-bg:var(--bx-color-bg-muted, #272727);--bupr-chip-bg-hover:var(--bx-color-bg-subtle, #313131);--bupr-field-bg:var(--bx-color-bg, var(--reign-form-background-color, #161616));--bupr-text:var(--bx-color-fg, var(--reign-site-body-text-color, #e6e6e6));--bupr-text-muted:var(--bx-color-fg-muted, #a6a6a6);--bupr-text-subtle:var(--bx-color-fg-subtle, #8a8a8a);--bupr-border:var(--bx-color-border, var(--reign-form-border-color, rgba(255, 255, 255, 0.15)));--bupr-reply-bg:var(--bx-color-bg-muted, #232323);--bupr-reply-hover-bg:rgba(0, 124, 186, 0.15);--bupr-success-bg:rgba(70, 180, 80, 0.15);--bupr-success-fg:#7fd58b;--bupr-success-border:rgba(70, 180, 80, 0.4);--bupr-danger-bg:rgba(220, 50, 50, 0.15);--bupr-danger-fg:#ff8a8a;--bupr-danger-border:rgba(220, 50, 50, 0.4)}.bupr-row{border-color:var(--bupr-border,rgba(0,0,0,.1))}.bp-nouveau .bupr-row{background:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-review-modal-content{background-color:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-flag-modal-content{background:var(--bupr-card-bg,#fff);color:var(--bupr-text,inherit)}.bupr-flag-modal-footer,.bupr-flag-modal-header{border-color:var(--bupr-border,#ddd)}.bupr-flag-modal-header h3{color:var(--bupr-text,#1d2327)}.bupr-flag-modal-close{color:var(--bupr-text-muted,#666)}.bupr-flag-modal-body p{color:var(--bupr-text-muted,#50575e)}.bupr-flag-reason-option{background:var(--bupr-chip-bg,#f9f9f9);color:var(--bupr-text,inherit)}.bupr-flag-reason-option:hover{background:var(--bupr-chip-bg-hover,#f0f0f1)}.bupr-cancel-reply,.bupr-flag-cancel{background:var(--bupr-chip-bg,#f0f0f1);color:var(--bupr-text,#50575e)}.bupr-cancel-reply:hover,.bupr-flag-cancel:hover{background:var(--bupr-chip-bg-hover,#dcdcde)}.bupr-owner-reply{background:var(--bupr-reply-bg,linear-gradient(135deg,#f8f9fa 0,#e9ecef 100%))}.bupr-reply-author{color:var(--bupr-text,#1d2327)}.bupr-reply-content{color:var(--bupr-text-muted,#333)}.bupr-reply-date{color:var(--bupr-text-subtle,#666)}.bupr-reply-textarea{background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,#ddd)}.bupr-show-reply-form:hover{background:var(--bupr-reply-hover-bg,#f0f7fc)}.bupr-flag-button,.bupr-report-button{background:var(--bupr-chip-bg,#f8f9fa);border-color:var(--bupr-border,#ddd);color:var(--bupr-text-muted,#666)}.bupr-report-button:hover{background:var(--bupr-danger-bg,#fff0f0);border-color:#dc3232;color:var(--bupr-danger-fg,#dc3232)}.buddypress-wrap .bupr-report-button.bupr-report-button{background:var(--bupr-chip-bg,#f8f9fa);border:1px solid var(--bupr-border,#ddd);color:var(--bupr-text-muted,#666)}.buddypress-wrap .bupr-report-button.bupr-report-button:focus,.buddypress-wrap .bupr-report-button.bupr-report-button:hover{background:var(--bupr-danger-bg,#fff0f0);border-color:#dc3232;color:var(--bupr-danger-fg,#dc3232)}.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close{background:0 0;border:none;box-shadow:none;color:var(--bupr-text-muted,#666)}.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:focus,.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:hover{background:0 0;color:var(--bupr-danger-fg,#dc3232)}.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button,button.bupr-edit-review-button{background:var(--bupr-chip-bg,#f8f9fa);border:1px solid var(--bupr-border,#ddd);color:var(--bupr-text,#1d2327)}.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:focus,.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:hover,button.bupr-edit-review-button:focus,button.bupr-edit-review-button:hover{background:var(--bupr-chip-bg-hover,#f0f0f1);border-color:var(--bupr-border,#ddd);color:var(--bupr-text,#1d2327)}.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit{background:#dc3232;border:none;color:#fff}.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:focus,.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:hover{background:#a00;color:#fff}.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel,body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply{background:var(--bupr-chip-bg,#f0f0f1);border:1px solid var(--bupr-border,#dcdcde);color:var(--bupr-text,#50575e)}.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:focus,.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:hover,body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:focus,body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:hover{background:var(--bupr-chip-bg-hover,#dcdcde);color:var(--bupr-text,#50575e)}.bupr-report-success{background:var(--bupr-success-bg,#ecfdf5);border-color:var(--bupr-success-border,#d4edda);color:var(--bupr-success-fg,#46b450)}.success_review_msg{background-color:var(--bupr-success-bg,#dff2bf);color:var(--bupr-success-fg,#4f8a10)}.bupr-error{background-color:var(--bupr-danger-bg,#f1dede);border-color:var(--bupr-danger-border,#ebcbd0);color:var(--bupr-danger-fg,#a84341)}.br-theme-bars-square .bupr-rating-widget a{background-color:var(--bupr-chip-bg,#fff)}.bupr-posts-pagination .page-numbers{background:var(--bupr-chip-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,rgba(0,0,0,.1))}#bp-member-reviews-list{width:100%}.bp-member-reviews{margin-top:25px}.bp-member-add-form textarea{width:100%;padding:10px;background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);border-color:var(--bupr-border,#ddd)}.bp-member-add-form input{width:100%;margin-inline-end:5px}.bp-member-add-form button{width:100%;display:block;margin:0 auto}#bupr_member_review_id{padding:10px;padding-inline-start:10px;max-width:300px;width:100%;border:1px var(--bupr-border,#e3e3e3) solid;background:var(--bupr-field-bg,#fff);color:var(--bupr-text,inherit);font-family:inherit}.bp-member-add-form p{text-align:start;margin:10px 0}.bp-member-add-form p button{width:100%}.bupr-criteria-label span{float:inline-start}.bupr-add-review{margin-inline-start:5px}.bupr-bp-member-review-no-popup-add-block{display:block}.bupr-multi-review{margin:15px}.multi-review{display:inline-block;width:100%;margin:0;padding:10px 0 0;background:0 0}.multi-review>div{padding:0}.bupr-directory-tooltip span.bupr-star-rate{font-size:15px}.bupr-error{width:90%;padding:10px;border-radius:5px;background-color:var(--bupr-danger-bg,#f1dede);border-color:var(--bupr-danger-border,#ebcbd0);color:var(--bupr-danger-fg,#a84341)}.bupr-review-description a{margin:10px 0;display:inline-block;text-decoration:underline}.bupr_not_give_review p{padding:10px;font-weight:500;font-size:20px;color:#e84242}.members-list li .more-action-button{display:none}#bupr_save_review:focus-visible,.bp-member-add-form button:focus-visible,.bupr-edit-review-button:focus-visible,.bupr-flag-cancel:focus-visible,.bupr-flag-modal-close:focus-visible,.bupr-flag-reason-option:focus-visible,.bupr-flag-submit:focus-visible,.bupr-pagination a:focus-visible,.bupr-report-button:focus-visible,.bupr-submit-reply:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px}#bupr_save_review:active,.bp-member-add-form button:active,.bupr-edit-review-button:active,.bupr-flag-cancel:active,.bupr-flag-submit:active,.bupr-report-button:active,.bupr-submit-reply:active{-webkit-transform:translateY(1px);transform:translateY(1px)}.bupr-flag-reason-option:active{-webkit-transform:scale(.98);transform:scale(.98)}#bupr_save_review:disabled,#bupr_save_review[disabled],.bp-member-add-form button:disabled,.bp-member-add-form button[disabled],.bupr-edit-review-button:disabled,.bupr-edit-review-button[disabled],.bupr-flag-cancel:disabled,.bupr-flag-submit:disabled,.bupr-report-button:disabled,.bupr-submit-reply:disabled{opacity:.6;cursor:not-allowed;-webkit-transform:none;transform:none;pointer-events:none}.member-edit-stars:focus-visible,.member_stars:focus-visible{outline:2px solid var(--bupr-focus,#2271b1);outline-offset:2px;border-radius:2px}
  • bp-user-profile-reviews/trunk/assets/css/rtl/admin.rtl.css

    r3617176 r3736444  
    5555   Dark mode (ADMIN-1)
    5656   Full dark token scale for the admin panel. Gated behind an EXPLICIT
    57    dark-admin signal (WP's is-dark-theme / the "Dark" admin color scheme
    58    body.admin-color-dark) rather than prefers-color-scheme. Rationale: WP
     57   dark-admin signal (body.is-dark-theme) rather than prefers-color-scheme.
     58   body.admin-color-dark is deliberately NOT a trigger: WP's "Dark" admin
     59   colour scheme restyles only the menu and toolbar, so the content area
     60   stays light and the panel's header text became light-on-light. Rationale: WP
    5961   admin core has no dark mode in 6.x/7.0, so keying off the OS preference
    6062   alone flips this panel dark while the surrounding WP admin chrome (and,
    … …  
    6365   adopts dark uniformly the moment a real dark admin context sets the class.
    6466   ═══════════════════════════════════════════════════════════ */
    65 body.is-dark-theme .bupr-admin,
    66 body.admin-color-dark .bupr-admin {
     67body.is-dark-theme .bupr-admin {
    6768        --bupr-admin-white: #1e1e2e;
    6869        --bupr-admin-surface-1: #181825;
    … …  
    896897}
    897898
     899/* Row widths, desktop only (the <=640px layout stacks rows as columns):
     900   text inputs get a real column instead of shrinking to the placeholder width,
     901   and rich-text editors take the full row instead of the right half. */
     902@media (min-width: 641px) {
     903        .bupr-card--legacy .wbcom-settings-section-options:has(> input.large-text) {
     904                flex: 0 1 480px;
     905        }
     906
     907        .bupr-card--legacy .wbcom-settings-section-options:has(.wp-editor-wrap) {
     908                flex: 1 1 100%;
     909        }
     910}
     911
     912/* Toggle switch. The tab templates render label.bupr-switch > checkbox + .bupr-slider;
     913   its styles lived in the old wbcom wrapper sheet and were lost in the 3.8.0 shell
     914   migration, which left a bare checkbox. */
     915.bupr-admin .bupr-switch {
     916        position: relative;
     917        display: inline-block;
     918        flex: 0 0 auto;
     919        width: 40px;
     920        height: 22px;
     921        margin: 0;
     922}
     923
     924.bupr-admin .bupr-switch input[type="checkbox"] {
     925        position: absolute;
     926        inset: 0;
     927        width: 100%;
     928        height: 100%;
     929        margin: 0;
     930        opacity: 0;
     931        cursor: pointer;
     932        z-index: 1;
     933}
     934
     935.bupr-admin .bupr-slider {
     936        position: absolute;
     937        inset: 0;
     938        border-radius: 999px;
     939        background: var(--bupr-admin-border-strong);
     940        transition: background 0.15s;
     941}
     942
     943.bupr-admin .bupr-slider::before {
     944        content: "";
     945        position: absolute;
     946        top: 2px;
     947        inset-inline-start: 2px;
     948        width: 18px;
     949        height: 18px;
     950        border-radius: 50%;
     951        background: #fff;
     952        box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
     953        transition: transform 0.15s;
     954}
     955
     956.bupr-admin .bupr-switch input:checked + .bupr-slider {
     957        background: var(--bupr-admin-accent);
     958}
     959
     960.bupr-admin .bupr-switch input:checked + .bupr-slider::before {
     961        transform: translateX(-18px);
     962}
     963
     964[dir="rtl"] .bupr-admin .bupr-switch input:checked + .bupr-slider::before {
     965        transform: translateX(18px);
     966}
     967
     968.bupr-admin .bupr-switch input:focus-visible + .bupr-slider {
     969        outline: 2px solid var(--bupr-admin-accent);
     970        outline-offset: 2px;
     971}
     972
    898973.bupr-card--legacy input[type="text"],
    899974.bupr-card--legacy input[type="number"],
    … …  
    10631138        }
    10641139
     1140        /* In a column the desktop flex-basis (300px / 480px) becomes a HEIGHT. */
     1141        .bupr-card--legacy .wbcom-settings-section-options-heading,
     1142        .bupr-card--legacy .wbcom-settings-section-options {
     1143                flex-basis: auto;
     1144        }
     1145
    10651146        .bupr-stats-grid,
    10661147        .bupr-discover-grid {
  • bp-user-profile-reviews/trunk/assets/css/rtl/bupr-front.rtl.css

    r3617176 r3736444  
    582582    width: 100%;
    583583    padding: 10px;
     584}
     585
     586/* Widths below are 100% / calc() plus padding: without border-box they overflow on themes
     587   that do not reset box-sizing globally (Twenty Twenty-Five overflowed at every width). */
     588#review_desc,
     589.bupr-review-modal-content,
     590.bupr-flag-modal-content,
     591.bupr-review-modal-content textarea,
     592.bupr-flag-modal-content textarea {
     593    box-sizing: border-box;
     594}
     595
     596#review_desc,
     597.bupr-review-modal-content textarea,
     598.bupr-flag-modal-content textarea {
     599    max-width: 100%;
    584600}
    585601
    … …  
    15371553# --bupr-* tokens below; the component rules that consume them are written
    15381554# once and fall back to the exact light values, so light mode is unchanged.
    1539 # Reign exposes no --bx-color-* vars, so every dark fallback is a dark literal.
     1555# Reign exposes no --bx-color-* vars but redefines its own --reign-* tokens
     1556# under the same [data-bx-mode="dark"] selector (reign-theme critical.css), so
     1557# the four it darkens are read before the dark literal. Only map a --reign-*
     1558# token Reign actually redefines in dark, or dark mode gets its LIGHT value.
    15401559--------------------------------------------------------------*/
    15411560html[data-bx-mode="dark"],
    … …  
    15431562body.dark-mode,
    15441563body.dark-scheme {
    1545     --bupr-card-bg: var(--bx-color-bg-elevated, #1e1e1e);
     1564    --bupr-card-bg: var(--bx-color-bg-elevated, var(--reign-site-sections-bg-color, #1e1e1e));
    15461565    --bupr-chip-bg: var(--bx-color-bg-muted, #272727);
    15471566    --bupr-chip-bg-hover: var(--bx-color-bg-subtle, #313131);
    1548     --bupr-field-bg: var(--bx-color-bg, #161616);
    1549     --bupr-text: var(--bx-color-fg, #e6e6e6);
     1567    --bupr-field-bg: var(--bx-color-bg, var(--reign-form-background-color, #161616));
     1568    --bupr-text: var(--bx-color-fg, var(--reign-site-body-text-color, #e6e6e6));
    15501569    --bupr-text-muted: var(--bx-color-fg-muted, #a6a6a6);
    15511570    --bupr-text-subtle: var(--bx-color-fg-subtle, #8a8a8a);
    1552     --bupr-border: var(--bx-color-border, rgba(255, 255, 255, 0.15));
     1571    --bupr-border: var(--bx-color-border, var(--reign-form-border-color, rgba(255, 255, 255, 0.15)));
    15531572    --bupr-reply-bg: var(--bx-color-bg-muted, #232323);
    15541573    --bupr-reply-hover-bg: rgba(0, 124, 186, 0.15);
    … …  
    16611680    border-color: #dc3232;
    16621681    color: var(--bupr-danger-fg, #dc3232);
     1682}
     1683
     1684/* BuddyPress styles every button inside .buddypress-wrap at (0,2,1), and its hover rule
     1685   (0,3,1) sets a light grey background with `color: inherit` - under a dark theme that is
     1686   light text on light grey, so Report / Edit / the modal close vanished on hover. These
     1687   buttons own their colours: the .buddypress-wrap ancestor plus a doubled class out-ranks
     1688   BP's rules, which load after ours. Theme rules marked !important (BuddyX Pro) still win. */
     1689.buddypress-wrap .bupr-report-button.bupr-report-button {
     1690    background: var(--bupr-chip-bg, #f8f9fa);
     1691    border: 1px solid var(--bupr-border, #ddd);
     1692    color: var(--bupr-text-muted, #666);
     1693}
     1694
     1695.buddypress-wrap .bupr-report-button.bupr-report-button:hover,
     1696.buddypress-wrap .bupr-report-button.bupr-report-button:focus {
     1697    background: var(--bupr-danger-bg, #fff0f0);
     1698    border-color: #dc3232;
     1699    color: var(--bupr-danger-fg, #dc3232);
     1700}
     1701
     1702.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close {
     1703    background: transparent;
     1704    border: none;
     1705    box-shadow: none;
     1706    color: var(--bupr-text-muted, #666);
     1707}
     1708
     1709.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:hover,
     1710.bupr-flag-modal .bupr-flag-modal-close.bupr-flag-modal-close:focus {
     1711    background: transparent;
     1712    color: var(--bupr-danger-fg, #dc3232);
     1713}
     1714
     1715/* Edit Review is a secondary action: the same self-contained chip colours as Report, which
     1716   the dark token block also sets. White on the theme accent failed in dark mode, where
     1717   BuddyX's accent turns light (1.89:1). */
     1718button.bupr-edit-review-button,
     1719.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button {
     1720    background: var(--bupr-chip-bg, #f8f9fa);
     1721    border: 1px solid var(--bupr-border, #ddd);
     1722    color: var(--bupr-text, #1d2327);
     1723}
     1724
     1725button.bupr-edit-review-button:hover,
     1726button.bupr-edit-review-button:focus,
     1727.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:hover,
     1728.buddypress-wrap .bupr-edit-review-button.bupr-edit-review-button:focus {
     1729    background: var(--bupr-chip-bg-hover, #f0f0f1);
     1730    border-color: var(--bupr-border, #ddd);
     1731    color: var(--bupr-text, #1d2327);
     1732}
     1733
     1734/* Report dialog actions and the reply Cancel: the destructive Submit stays red, Cancel
     1735   stays neutral instead of a second primary. BuddyX styles every button.button inside the
     1736   BP wrapper at (0,3,1) (.buddypress .buddypress-wrap button.button), so these sit at (0,4,1). */
     1737.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit {
     1738    background: #dc3232;
     1739    border: none;
     1740    color: #fff;
     1741}
     1742
     1743.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:hover,
     1744.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-submit.bupr-flag-submit:focus {
     1745    background: #a00;
     1746    color: #fff;
     1747}
     1748
     1749.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel,
     1750body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply {
     1751    background: var(--bupr-chip-bg, #f0f0f1);
     1752    border: 1px solid var(--bupr-border, #dcdcde);
     1753    color: var(--bupr-text, #50575e);
     1754}
     1755
     1756.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:hover,
     1757.bupr-flag-modal .bupr-flag-modal-content button.bupr-flag-cancel.bupr-flag-cancel:focus,
     1758body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:hover,
     1759body .buddypress-wrap button.bupr-cancel-reply.bupr-cancel-reply:focus {
     1760    background: var(--bupr-chip-bg-hover, #dcdcde);
     1761    color: var(--bupr-text, #50575e);
    16631762}
    16641763
  • bp-user-profile-reviews/trunk/assets/js/bupr-front.js

    r3617176 r3736444  
    190190              jQuery(".bupr-save-reivew-spinner").hide();
    191191              sessionStorage.reloadAfterPageLoad = true;
    192               var date = new Date();
    193               date.setTime(date.getTime() + 20 * 1000);
    194               // jQuery.cookie("response", response, {
    195               //   expires: date,
    196               // });
     192              // The message stays until the next submit; only a saved review clears the form,
     193              // so a refused submission keeps what the member typed.
    197194              jQuery(".add_review_msg").show();
    198195              jQuery(".add_review_msg p").html(response.data);
    199               reset_review_form_data();
    200               setTimeout(() => {
    201                 jQuery(".add_review_msg p").html('');
    202                 jQuery(".add_review_msg").hide();
    203               }, 2000);
     196              if (response && response.success) {
     197                reset_review_form_data();
     198              }
    204199              // window.location.reload();
    205200            }
    … …  
    236231            jQuery(".bupr-save-reivew-spinner").hide();
    237232            sessionStorage.reloadAfterPageLoad = true;
    238             var date = new Date();
    239             date.setTime(date.getTime() + 20 * 1000);
    240             // jQuery.cookie("response", response, {
    241             //   expires: date,
    242             // });
     233            // The message stays until the next submit; only a saved review clears the form,
     234            // so a refused submission keeps what the member typed.
    243235            jQuery(".add_review_msg").show();
    244             reset_review_form_data();
    245236            jQuery(".add_review_msg p").html(response.data);
    246             setTimeout(() => {
    247               jQuery(".add_review_msg p").html('');
    248               jQuery(".add_review_msg").hide();
    249             }, 200);
     237            if (response && response.success) {
     238              reset_review_form_data();
     239            }
    250240          }
    251241        );
    … …  
    575565        var reportedLabel = jQuery('<div/>').text(mail_title.reported || "Reported").html();
    576566        $reportBtn.replaceWith('<span class="bupr-report-success"><span class="dashicons dashicons-yes"></span> ' + reportedLabel + '</span>');
    577         // Auto-fade after 3 seconds
    578         setTimeout(function() {
    579           jQuery('.bupr-report-success').fadeOut();
    580         }, 3000);
     567        // Stays put: the server renders the same Reported state on reload.
    581568      } else {
    582569        jQuery(".bupr-flag-error").text(response.data.message).show();
  • bp-user-profile-reviews/trunk/assets/js/min/bupr-front.min.js

    r3617176 r3736444  
    1 window.buprFrontToast=function(message,tone){tone=tone||"info";var host=document.querySelector(".bupr-front-toast-host"),el=(host||((host=document.createElement("div")).className="bupr-front-toast-host",document.body.appendChild(host)),document.createElement("div"));el.className="bupr-front-toast bupr-front-toast--"+tone,el.setAttribute("role","status"),el.setAttribute("aria-live","polite"),el.textContent=String(message),host.appendChild(el),window.requestAnimationFrame(function(){el.classList.add("bupr-front-toast--visible")}),window.setTimeout(function(){el.classList.remove("bupr-front-toast--visible"),window.setTimeout(function(){el.parentNode&&el.parentNode.removeChild(el)},250)},3600)},jQuery(document).ready(function(){jQuery(".add_review_msg").hide(),jQuery(document).on("click","#bupr-add-review-btn a",function(e){var show_content=jQuery(this).attr("show");localStorage.setItem("bupr_show_form",show_content)}),jQuery('.dataTables_filter input[type="search"]').attr("placeholder",mail_title.search_placeholder||"Enter Keywords....");jQuery("#reviews_pluginurl").val();function reset_review_form_data(){jQuery("#bupr_review_form_public")[0].reset(),jQuery("#bupr_review_form_public .member_rated_stars").val(0),jQuery(".member_stars").each(function(index){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).removeClass("fas").addClass("far")})}jQuery(".member_stars").mouseenter(function(){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far")}),jQuery(".member_stars").mouseleave(function(){var clicked_id=jQuery(this).parent().children().eq(1).val(),parent_id=(jQuery(this).attr("data-attr"),jQuery(this).parent().attr("id"));if("clicked"!==jQuery(this).parent().children().eq(0).val()){clicked_id=parseInt(clicked_id)+1;for(i=clicked_id;i<=5;i++)jQuery("#"+parent_id).children("."+i).addClass("far").removeClass("fas")}}),jQuery(".member_stars").on("click",function(){var attr=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(jQuery(this).parent().children().eq(1).val(attr),jQuery(this).parent().children().eq(0).val("clicked"),i=1;i<=attr;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far");var k=parseInt(attr)+1;for(j=k;j<=5;j++)jQuery("#"+parent_id).children("."+j).addClass("far").removeClass("fas")}),jQuery("#bupr_member_review_id").on("change",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery("#review_desc").on("keydown",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery(".member_stars").on("click",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery(document).on("click","#bupr_save_review",function(event){event.preventDefault();var rating_exist=[],bupr_member_id=jQuery("#bupr_member_review_id").val(),bupr_current_user=jQuery("#bupr_current_user_id").val(),bupr_review_title=(mail_title.review_title_format||"%1$s received a %2$s").replace("%1$s",mail_title.cur_username).replace("%2$s",mail_title.review_title),bupr_review_desc=jQuery("#review_desc").val(),bupr_review_count=jQuery("#member_rating_field_counter").val(),bupr_review_rating={},bupr_anonymous_review="",bupr_anonymous_review=jQuery("#bupr_anonymous_review").is(":checked")?"yes":"no";jQuery(".bupr-star-member-rating").each(function(index){bupr_review_rating[index]=jQuery(this).val()}),jQuery(".bupr-star-member-rating").each(function(){var rate_val=jQuery(this).val();0<rate_val&&0,bupr_review_desc.trim()||0!=rate_val||jQuery(".bupr-review-error-fields").show(),rating_exist.push(rate_val)}),0<bupr_review_count?""==bupr_member_id?jQuery(".bupr-review-error-fields").show():-1!=jQuery.inArray("0",rating_exist)&&!bupr_review_desc||(jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"allow_bupr_member_review_update",bupr_member_id:bupr_member_id,bupr_current_user:bupr_current_user,bupr_review_title:bupr_review_title,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_field_counter:bupr_review_count,bupr_anonymous_review:bupr_anonymous_review,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),sessionStorage.reloadAfterPageLoad=!0;var date=new Date;date.setTime(date.getTime()+2e4),jQuery(".add_review_msg").show(),jQuery(".add_review_msg p").html(response.data),reset_review_form_data(),setTimeout(()=>{jQuery(".add_review_msg p").html(""),jQuery(".add_review_msg").hide()},2e3)})):""==bupr_member_id||""==bupr_review_desc?(""==bupr_member_id&&(jQuery(".bupr-review-error-fields").show(),event.preventDefault()),""==bupr_review_desc&&(jQuery(".bupr-review-error-fields").show(),event.preventDefault())):(jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"allow_bupr_member_review_update",bupr_member_id:bupr_member_id,bupr_current_user:bupr_current_user,bupr_review_title:bupr_review_title,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_field_counter:bupr_review_count,bupr_anonymous_review:bupr_anonymous_review,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),sessionStorage.reloadAfterPageLoad=!0;var date=new Date;date.setTime(date.getTime()+2e4),jQuery(".add_review_msg").show(),reset_review_form_data(),jQuery(".add_review_msg p").html(response.data),setTimeout(()=>{jQuery(".add_review_msg p").html(""),jQuery(".add_review_msg").hide()},200)}))}),jQuery(document).on("click","#bupr-review-edit-btn",function(event){event.preventDefault();var reviewwrapper=document.getElementById("bupr-edit-review"),modal=document.querySelector(".bupr-review-modal"),event=jQuery(this).data("review");event&&jQuery.post(ajaxurl,{action:"bupr_edit_review",review:event,nonce:mail_title.review_nonce},function(response){response.success&&""!=response.data.review&&(""!==reviewwrapper.innerHTML&&(reviewwrapper.innerHTML=""),response=response.data.review,jQuery("#bupr-edit-review").append(response),modal.classList.add("bupr-show-modal"),response=document.querySelector(".youzify-content"))&&!response.classList.contains("bupr-youzify-show-modal")&&response.classList.add("bupr-youzify-show-modal")})}),jQuery(document).on("click",".bupr-review-modal-close-button",function(event){event.preventDefault();document.querySelector(".bupr-review-modal").classList.remove("bupr-show-modal");event=document.querySelector(".youzify-content");event&&event.classList.contains("bupr-youzify-show-modal")&&event.classList.remove("bupr-youzify-show-modal")}),jQuery(window).click(function(e){var modal=document.querySelector(".bupr-review-modal");e.target===modal&&(modal.classList.remove("bupr-show-modal"),e=document.querySelector(".youzify-content"))&&e.classList.contains("bupr-youzify-show-modal")&&e.classList.remove("bupr-youzify-show-modal")}),jQuery(document).on("mouseenter",".member-edit-stars",function(){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far")}),jQuery(document).on("mouseleave",".member-edit-stars",function(){var clicked_id=jQuery(this).parent().children().eq(1).val(),parent_id=(jQuery(this).attr("data-attr"),jQuery(this).parent().attr("id"));if("clicked"!==jQuery(this).parent().children().eq(0).val()){clicked_id=parseInt(clicked_id)+1;for(i=clicked_id;i<=5;i++)jQuery("#"+parent_id).children("."+i).addClass("far").removeClass("fas")}}),jQuery(document).on("click",".member-edit-stars",function(){var attr=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(jQuery(this).parent().children().eq(1).val(attr),jQuery(this).parent().children().eq(0).val("clicked"),i=1;i<=attr;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far");var k=parseInt(attr)+1;for(j=k;j<=5;j++)jQuery("#"+parent_id).children("."+j).addClass("far").removeClass("fas")}),jQuery(document).on("click","#bupr_upodate_review",function(event){event.preventDefault();var modal=document.querySelector(".bupr-review-modal"),event=jQuery("#bupr-edit-review-field-wrapper").data("review"),bupr_review_desc=jQuery("#review_desc").val(),bupr_review_rating={},bupr_endorsed_skills=(jQuery(".bupr-star-member-rating").each(function(index,item){var critaria=jQuery(this).data("critaria");bupr_review_rating[critaria]=jQuery(this).val()}),[]);jQuery('input[name="bupr_endorsed_skills[]"]:checked').each(function(){bupr_endorsed_skills.push(jQuery(this).val())}),jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_update_review",review_id:event,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_endorsed_skills:bupr_endorsed_skills,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),response.success&&(modal.classList.remove("bupr-show-modal"),window.location.reload())})})}),jQuery(document).on("click",".bupr-show-reply-form",function(e){e.preventDefault();e=jQuery(this).closest(".bupr-reply-form-wrapper");jQuery(this).hide(),e.find(".bupr-reply-form").slideDown()}),jQuery(document).on("click",".bupr-cancel-reply",function(e){e.preventDefault();var wrapper=jQuery(this).closest(".bupr-reply-form-wrapper");wrapper.find(".bupr-reply-form").slideUp(function(){wrapper.find(".bupr-show-reply-form").show(),wrapper.find(".bupr-reply-textarea").val("")})}),jQuery(document).on("click",".bupr-submit-reply",function(e){e.preventDefault();var button=jQuery(this),wrapper=button.closest(".bupr-reply-form-wrapper"),replySection=button.closest(".bupr-reply-section"),e=button.data("review"),replyContent=wrapper.find(".bupr-reply-textarea").val().trim();replyContent?(button.prop("disabled",!0),wrapper.find(".bupr-reply-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_add_owner_reply",review_id:e,reply_content:replyContent,nonce:mail_title.review_nonce},function(response){button.prop("disabled",!1),wrapper.find(".bupr-reply-spinner").hide(),response.success?(wrapper.remove(),replySection.html(response.data.reply_html)):window.buprFrontToast(response.data&&response.data.message||mail_title.reply_failed||"Failed to add reply.","error")}).fail(function(){button.prop("disabled",!1),wrapper.find(".bupr-reply-spinner").hide(),window.buprFrontToast(mail_title.generic_error||"An error occurred. Please try again.","error")})):window.buprFrontToast(mail_title.reply_empty||"Please enter a reply.","error")}),jQuery(document).on("click",".bupr-report-button, .bupr-flag-button",function(e){e.preventDefault();e=jQuery(this).data("review");jQuery("#bupr-flag-review-id").val(e),jQuery('input[name="bupr_flag_reason"]').prop("checked",!1),jQuery(".bupr-flag-error").hide().text(""),jQuery(".bupr-flag-modal").fadeIn()}),jQuery(document).on("click",".bupr-flag-modal-close, .bupr-flag-cancel",function(e){e.preventDefault(),jQuery(".bupr-flag-modal").fadeOut()}),jQuery(document).on("click",".bupr-flag-modal",function(e){jQuery(e.target).hasClass("bupr-flag-modal")&&jQuery(".bupr-flag-modal").fadeOut()}),jQuery(document).on("click",".bupr-flag-submit",function(e){e.preventDefault();var reviewId=jQuery("#bupr-flag-review-id").val(),e=jQuery('input[name="bupr_flag_reason"]:checked').val();e?(jQuery(".bupr-flag-submit").prop("disabled",!0),jQuery(".bupr-flag-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_flag_review",review_id:reviewId,flag_reason:e,nonce:mail_title.review_nonce},function(response){var $reportBtn,reportedLabel;jQuery(".bupr-flag-submit").prop("disabled",!1),jQuery(".bupr-flag-spinner").hide(),response.success?(jQuery(".bupr-flag-modal").fadeOut(),$reportBtn=jQuery('.bupr-report-button[data-review="'+reviewId+'"], .bupr-flag-button[data-review="'+reviewId+'"]'),reportedLabel=jQuery("<div/>").text(mail_title.reported||"Reported").html(),$reportBtn.replaceWith('<span class="bupr-report-success"><span class="dashicons dashicons-yes"></span> '+reportedLabel+"</span>"),setTimeout(function(){jQuery(".bupr-report-success").fadeOut()},3e3)):jQuery(".bupr-flag-error").text(response.data.message).show()}).fail(function(){jQuery(".bupr-flag-submit").prop("disabled",!1),jQuery(".bupr-flag-spinner").hide(),jQuery(".bupr-flag-error").text(mail_title.generic_error||"An error occurred. Please try again.").show()})):jQuery(".bupr-flag-error").text(mail_title.flag_select_reason||"Please select a reason.").show()}),jQuery(function($){var A=window.bupr_a11y||{rate_label:"Rate %d out of 5",group_label:"Rating"},STAR=".member_stars, .member-edit-stars";function starIndex($star){return parseInt($star.attr("data-attr"),10)||0}function syncGroup($group){var val=($group=>parseInt($group.find(".bupr-star-member-rating").val(),10)||0)($group),$group=$group.find(STAR),focusTarget=0<val?val:1;$group.each(function(){var i=starIndex($(this));$(this).attr("aria-checked",i===val?"true":"false").attr("tabindex",i===focusTarget?"0":"-1")})}function enhanceAll(){$(STAR).each(function(){var group,lbl,$group=$(this).closest(".bupr-criteria-content");$group.length&&((group=$(group=$group)).data("buprA11y")||(group.attr("role","radiogroup"),group.attr("aria-label")||(lbl=group.closest(".multi-review").find(".bupr-criteria-label").first().text().trim(),group.attr("aria-label",lbl||A.group_label)),group.find(STAR).each(function(){var i=starIndex($(this));$(this).attr("role","radio").attr("aria-label",A.rate_label.replace("%d",i))}),group.data("buprA11y",!0)),syncGroup(group))})}enhanceAll(),window.MutationObserver&&new MutationObserver(function(){enhanceAll()}).observe(document.body,{childList:!0,subtree:!0}),$(document).on("click",STAR,function(){syncGroup($(this).closest(".bupr-criteria-content"))}),$(document).on("keydown",STAR,function(e){var $star=$(this),$group=$star.closest(".bupr-criteria-content"),$stars=$group.find(STAR),idx=$stars.index($star),key=e.key,move=null;if("Enter"===key||" "===key||"Spacebar"===key)e.preventDefault(),$star.trigger("click"),syncGroup($group),$star.attr("tabindex","0").focus();else{if("ArrowRight"===key||"ArrowUp"===key)move=Math.min($stars.length-1,idx+1);else if("ArrowLeft"===key||"ArrowDown"===key)move=Math.max(0,idx-1);else if("Home"===key)move=0;else{if("End"!==key)return;move=$stars.length-1}e.preventDefault();$star=$stars.eq(move);$star.trigger("click"),syncGroup($group),$star.attr("tabindex","0").focus()}})});
     1window.buprFrontToast=function(message,tone){tone=tone||"info";var host=document.querySelector(".bupr-front-toast-host"),el=(host||((host=document.createElement("div")).className="bupr-front-toast-host",document.body.appendChild(host)),document.createElement("div"));el.className="bupr-front-toast bupr-front-toast--"+tone,el.setAttribute("role","status"),el.setAttribute("aria-live","polite"),el.textContent=String(message),host.appendChild(el),window.requestAnimationFrame(function(){el.classList.add("bupr-front-toast--visible")}),window.setTimeout(function(){el.classList.remove("bupr-front-toast--visible"),window.setTimeout(function(){el.parentNode&&el.parentNode.removeChild(el)},250)},3600)},jQuery(document).ready(function(){jQuery(".add_review_msg").hide(),jQuery(document).on("click","#bupr-add-review-btn a",function(e){var show_content=jQuery(this).attr("show");localStorage.setItem("bupr_show_form",show_content)}),jQuery('.dataTables_filter input[type="search"]').attr("placeholder",mail_title.search_placeholder||"Enter Keywords....");jQuery("#reviews_pluginurl").val();function reset_review_form_data(){jQuery("#bupr_review_form_public")[0].reset(),jQuery("#bupr_review_form_public .member_rated_stars").val(0),jQuery(".member_stars").each(function(index){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).removeClass("fas").addClass("far")})}jQuery(".member_stars").mouseenter(function(){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far")}),jQuery(".member_stars").mouseleave(function(){var clicked_id=jQuery(this).parent().children().eq(1).val(),parent_id=(jQuery(this).attr("data-attr"),jQuery(this).parent().attr("id"));if("clicked"!==jQuery(this).parent().children().eq(0).val()){clicked_id=parseInt(clicked_id)+1;for(i=clicked_id;i<=5;i++)jQuery("#"+parent_id).children("."+i).addClass("far").removeClass("fas")}}),jQuery(".member_stars").on("click",function(){var attr=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(jQuery(this).parent().children().eq(1).val(attr),jQuery(this).parent().children().eq(0).val("clicked"),i=1;i<=attr;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far");var k=parseInt(attr)+1;for(j=k;j<=5;j++)jQuery("#"+parent_id).children("."+j).addClass("far").removeClass("fas")}),jQuery("#bupr_member_review_id").on("change",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery("#review_desc").on("keydown",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery(".member_stars").on("click",function(){jQuery(".bupr-review-error-fields").hide()}),jQuery(document).on("click","#bupr_save_review",function(event){event.preventDefault();var rating_exist=[],bupr_member_id=jQuery("#bupr_member_review_id").val(),bupr_current_user=jQuery("#bupr_current_user_id").val(),bupr_review_title=(mail_title.review_title_format||"%1$s received a %2$s").replace("%1$s",mail_title.cur_username).replace("%2$s",mail_title.review_title),bupr_review_desc=jQuery("#review_desc").val(),bupr_review_count=jQuery("#member_rating_field_counter").val(),bupr_review_rating={},bupr_anonymous_review="",bupr_anonymous_review=jQuery("#bupr_anonymous_review").is(":checked")?"yes":"no";jQuery(".bupr-star-member-rating").each(function(index){bupr_review_rating[index]=jQuery(this).val()}),jQuery(".bupr-star-member-rating").each(function(){var rate_val=jQuery(this).val();0<rate_val&&0,bupr_review_desc.trim()||0!=rate_val||jQuery(".bupr-review-error-fields").show(),rating_exist.push(rate_val)}),0<bupr_review_count?""==bupr_member_id?jQuery(".bupr-review-error-fields").show():-1!=jQuery.inArray("0",rating_exist)&&!bupr_review_desc||(jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"allow_bupr_member_review_update",bupr_member_id:bupr_member_id,bupr_current_user:bupr_current_user,bupr_review_title:bupr_review_title,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_field_counter:bupr_review_count,bupr_anonymous_review:bupr_anonymous_review,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),sessionStorage.reloadAfterPageLoad=!0,jQuery(".add_review_msg").show(),jQuery(".add_review_msg p").html(response.data),response&&response.success&&reset_review_form_data()})):""==bupr_member_id||""==bupr_review_desc?(""==bupr_member_id&&(jQuery(".bupr-review-error-fields").show(),event.preventDefault()),""==bupr_review_desc&&(jQuery(".bupr-review-error-fields").show(),event.preventDefault())):(jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"allow_bupr_member_review_update",bupr_member_id:bupr_member_id,bupr_current_user:bupr_current_user,bupr_review_title:bupr_review_title,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_field_counter:bupr_review_count,bupr_anonymous_review:bupr_anonymous_review,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),sessionStorage.reloadAfterPageLoad=!0,jQuery(".add_review_msg").show(),jQuery(".add_review_msg p").html(response.data),response&&response.success&&reset_review_form_data()}))}),jQuery(document).on("click","#bupr-review-edit-btn",function(event){event.preventDefault();var reviewwrapper=document.getElementById("bupr-edit-review"),modal=document.querySelector(".bupr-review-modal"),event=jQuery(this).data("review");event&&jQuery.post(ajaxurl,{action:"bupr_edit_review",review:event,nonce:mail_title.review_nonce},function(response){response.success&&""!=response.data.review&&(""!==reviewwrapper.innerHTML&&(reviewwrapper.innerHTML=""),response=response.data.review,jQuery("#bupr-edit-review").append(response),modal.classList.add("bupr-show-modal"),response=document.querySelector(".youzify-content"))&&!response.classList.contains("bupr-youzify-show-modal")&&response.classList.add("bupr-youzify-show-modal")})}),jQuery(document).on("click",".bupr-review-modal-close-button",function(event){event.preventDefault();document.querySelector(".bupr-review-modal").classList.remove("bupr-show-modal");event=document.querySelector(".youzify-content");event&&event.classList.contains("bupr-youzify-show-modal")&&event.classList.remove("bupr-youzify-show-modal")}),jQuery(window).click(function(e){var modal=document.querySelector(".bupr-review-modal");e.target===modal&&(modal.classList.remove("bupr-show-modal"),e=document.querySelector(".youzify-content"))&&e.classList.contains("bupr-youzify-show-modal")&&e.classList.remove("bupr-youzify-show-modal")}),jQuery(document).on("mouseenter",".member-edit-stars",function(){jQuery(this).parent().children().eq(0).val("not_clicked");var id=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(i=1;i<=id;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far")}),jQuery(document).on("mouseleave",".member-edit-stars",function(){var clicked_id=jQuery(this).parent().children().eq(1).val(),parent_id=(jQuery(this).attr("data-attr"),jQuery(this).parent().attr("id"));if("clicked"!==jQuery(this).parent().children().eq(0).val()){clicked_id=parseInt(clicked_id)+1;for(i=clicked_id;i<=5;i++)jQuery("#"+parent_id).children("."+i).addClass("far").removeClass("fas")}}),jQuery(document).on("click",".member-edit-stars",function(){var attr=jQuery(this).attr("data-attr"),parent_id=jQuery(this).parent().attr("id");for(jQuery(this).parent().children().eq(1).val(attr),jQuery(this).parent().children().eq(0).val("clicked"),i=1;i<=attr;i++)jQuery("#"+parent_id).children("."+i).addClass("fas").removeClass("far");var k=parseInt(attr)+1;for(j=k;j<=5;j++)jQuery("#"+parent_id).children("."+j).addClass("far").removeClass("fas")}),jQuery(document).on("click","#bupr_upodate_review",function(event){event.preventDefault();var modal=document.querySelector(".bupr-review-modal"),event=jQuery("#bupr-edit-review-field-wrapper").data("review"),bupr_review_desc=jQuery("#review_desc").val(),bupr_review_rating={},bupr_endorsed_skills=(jQuery(".bupr-star-member-rating").each(function(index,item){var critaria=jQuery(this).data("critaria");bupr_review_rating[critaria]=jQuery(this).val()}),[]);jQuery('input[name="bupr_endorsed_skills[]"]:checked').each(function(){bupr_endorsed_skills.push(jQuery(this).val())}),jQuery(".bupr-save-reivew-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_update_review",review_id:event,bupr_review_desc:bupr_review_desc,bupr_review_rating:bupr_review_rating,bupr_endorsed_skills:bupr_endorsed_skills,nonce:mail_title.review_nonce},function(response){jQuery(".bupr-save-reivew-spinner").hide(),response.success&&(modal.classList.remove("bupr-show-modal"),window.location.reload())})})}),jQuery(document).on("click",".bupr-show-reply-form",function(e){e.preventDefault();e=jQuery(this).closest(".bupr-reply-form-wrapper");jQuery(this).hide(),e.find(".bupr-reply-form").slideDown()}),jQuery(document).on("click",".bupr-cancel-reply",function(e){e.preventDefault();var wrapper=jQuery(this).closest(".bupr-reply-form-wrapper");wrapper.find(".bupr-reply-form").slideUp(function(){wrapper.find(".bupr-show-reply-form").show(),wrapper.find(".bupr-reply-textarea").val("")})}),jQuery(document).on("click",".bupr-submit-reply",function(e){e.preventDefault();var button=jQuery(this),wrapper=button.closest(".bupr-reply-form-wrapper"),replySection=button.closest(".bupr-reply-section"),e=button.data("review"),replyContent=wrapper.find(".bupr-reply-textarea").val().trim();replyContent?(button.prop("disabled",!0),wrapper.find(".bupr-reply-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_add_owner_reply",review_id:e,reply_content:replyContent,nonce:mail_title.review_nonce},function(response){button.prop("disabled",!1),wrapper.find(".bupr-reply-spinner").hide(),response.success?(wrapper.remove(),replySection.html(response.data.reply_html)):window.buprFrontToast(response.data&&response.data.message||mail_title.reply_failed||"Failed to add reply.","error")}).fail(function(){button.prop("disabled",!1),wrapper.find(".bupr-reply-spinner").hide(),window.buprFrontToast(mail_title.generic_error||"An error occurred. Please try again.","error")})):window.buprFrontToast(mail_title.reply_empty||"Please enter a reply.","error")}),jQuery(document).on("click",".bupr-report-button, .bupr-flag-button",function(e){e.preventDefault();e=jQuery(this).data("review");jQuery("#bupr-flag-review-id").val(e),jQuery('input[name="bupr_flag_reason"]').prop("checked",!1),jQuery(".bupr-flag-error").hide().text(""),jQuery(".bupr-flag-modal").fadeIn()}),jQuery(document).on("click",".bupr-flag-modal-close, .bupr-flag-cancel",function(e){e.preventDefault(),jQuery(".bupr-flag-modal").fadeOut()}),jQuery(document).on("click",".bupr-flag-modal",function(e){jQuery(e.target).hasClass("bupr-flag-modal")&&jQuery(".bupr-flag-modal").fadeOut()}),jQuery(document).on("click",".bupr-flag-submit",function(e){e.preventDefault();var reviewId=jQuery("#bupr-flag-review-id").val(),e=jQuery('input[name="bupr_flag_reason"]:checked').val();e?(jQuery(".bupr-flag-submit").prop("disabled",!0),jQuery(".bupr-flag-spinner").show(),jQuery.post(ajaxurl,{action:"bupr_flag_review",review_id:reviewId,flag_reason:e,nonce:mail_title.review_nonce},function(response){var $reportBtn,reportedLabel;jQuery(".bupr-flag-submit").prop("disabled",!1),jQuery(".bupr-flag-spinner").hide(),response.success?(jQuery(".bupr-flag-modal").fadeOut(),$reportBtn=jQuery('.bupr-report-button[data-review="'+reviewId+'"], .bupr-flag-button[data-review="'+reviewId+'"]'),reportedLabel=jQuery("<div/>").text(mail_title.reported||"Reported").html(),$reportBtn.replaceWith('<span class="bupr-report-success"><span class="dashicons dashicons-yes"></span> '+reportedLabel+"</span>")):jQuery(".bupr-flag-error").text(response.data.message).show()}).fail(function(){jQuery(".bupr-flag-submit").prop("disabled",!1),jQuery(".bupr-flag-spinner").hide(),jQuery(".bupr-flag-error").text(mail_title.generic_error||"An error occurred. Please try again.").show()})):jQuery(".bupr-flag-error").text(mail_title.flag_select_reason||"Please select a reason.").show()}),jQuery(function($){var A=window.bupr_a11y||{rate_label:"Rate %d out of 5",group_label:"Rating"},STAR=".member_stars, .member-edit-stars";function starIndex($star){return parseInt($star.attr("data-attr"),10)||0}function syncGroup($group){var val=($group=>parseInt($group.find(".bupr-star-member-rating").val(),10)||0)($group),$group=$group.find(STAR),focusTarget=0<val?val:1;$group.each(function(){var i=starIndex($(this));$(this).attr("aria-checked",i===val?"true":"false").attr("tabindex",i===focusTarget?"0":"-1")})}function enhanceAll(){$(STAR).each(function(){var group,lbl,$group=$(this).closest(".bupr-criteria-content");$group.length&&((group=$(group=$group)).data("buprA11y")||(group.attr("role","radiogroup"),group.attr("aria-label")||(lbl=group.closest(".multi-review").find(".bupr-criteria-label").first().text().trim(),group.attr("aria-label",lbl||A.group_label)),group.find(STAR).each(function(){var i=starIndex($(this));$(this).attr("role","radio").attr("aria-label",A.rate_label.replace("%d",i))}),group.data("buprA11y",!0)),syncGroup(group))})}enhanceAll(),window.MutationObserver&&new MutationObserver(function(){enhanceAll()}).observe(document.body,{childList:!0,subtree:!0}),$(document).on("click",STAR,function(){syncGroup($(this).closest(".bupr-criteria-content"))}),$(document).on("keydown",STAR,function(e){var $star=$(this),$group=$star.closest(".bupr-criteria-content"),$stars=$group.find(STAR),idx=$stars.index($star),key=e.key,move=null;if("Enter"===key||" "===key||"Spacebar"===key)e.preventDefault(),$star.trigger("click"),syncGroup($group),$star.attr("tabindex","0").focus();else{if("ArrowRight"===key||"ArrowUp"===key)move=Math.min($stars.length-1,idx+1);else if("ArrowLeft"===key||"ArrowDown"===key)move=Math.max(0,idx-1);else if("Home"===key)move=0;else{if("End"!==key)return;move=$stars.length-1}e.preventDefault();$star=$stars.eq(move);$star.trigger("click"),syncGroup($group),$star.attr("tabindex","0").focus()}})});
  • bp-user-profile-reviews/trunk/buddypress-member-review.php

    r3617176 r3736444  
    44 * Plugin URI: https://wbcomdesigns.com/downloads/buddypress-member-reviews/
    55 * Description: Enhances the BuddyPress community by allowing registered users to post reviews on other members' profiles. This feature is available exclusively to registered members and ensures unbiased feedback by preventing users from reviewing their own profiles.
    6  * Version: 3.8.0
     6 * Version: 3.8.1
    77 * Requires at least: 6.5
    8  * Requires PHP: 8.0
     8 * Requires PHP: 8.1
    99 * Author: Wbcom Designs
    1010 * Author URI: https://wbcomdesigns.com
    … …  
    2323 * Plugin version and path constants.
    2424 */
    25 define( 'BUPR_PLUGIN_VERSION', '3.8.0' );
     25define( 'BUPR_PLUGIN_VERSION', '3.8.1' );
    2626define( 'BUPR_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
    2727define( 'BUPR_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
    … …  
    385385
    386386/**
    387  * Redirect to plugin settings page after activation.
    388  *
    389  * @param string $plugin The plugin basename.
    390  *
    391  * @return void
    392  */
    393 function bupr_activation_redirect_settings( $plugin ) {
    394         if ( BUPR_PLUGIN_BASENAME === $plugin && class_exists( 'BuddyPress' ) && ! is_multisite() && bupr_check_buddypress_compatibility() ) {
    395                 wp_safe_redirect( admin_url( 'admin.php?page=bp-member-review-settings' ) );
    396                 exit;
    397         }
    398 }
    399 add_action( 'activated_plugin', 'bupr_activation_redirect_settings' );
    400 
    401 /**
    402387 * Perform plugin activation redirect.
    403388 */
    404389function bupr_do_activation_redirect() {
    405         if ( get_transient( '_bupr_activation_redirect' ) && ! is_multisite() && bupr_check_buddypress_compatibility() ) {
    406                 delete_transient( '_bupr_activation_redirect' );
    407                 wp_safe_redirect( admin_url( 'admin.php?page=bp-member-review-settings' ) );
    408         }
     390        if ( ! get_transient( '_bupr_activation_redirect' ) ) {
     391                return;
     392        }
     393        delete_transient( '_bupr_activation_redirect' );
     394
     395        // The single redirect path (an exit inside activated_plugin used to cut bulk
     396        // activations short and end WP-CLI runs early). Skip bulk activation and
     397        // non-interactive requests; the transient is cleared either way.
     398        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only check of core's bulk-activation flag.
     399        if ( wp_doing_ajax() || is_network_admin() || isset( $_GET['activate-multi'] ) || is_multisite() || ! bupr_check_buddypress_compatibility() ) {
     400                return;
     401        }
     402        wp_safe_redirect( admin_url( 'admin.php?page=bp-member-review-settings' ) );
     403        exit;
    409404}
    410405add_action( 'admin_init', 'bupr_do_activation_redirect' );
  • bp-user-profile-reviews/trunk/includes/admin/class-bupr-admin-panel.php

    r3617176 r3736444  
    296296                 * toggles correctly persist as their "off"/default value).
    297297                 *
    298                  * The ONE exception is the approval-email pair, which the General tab
    299                  * renders only when auto-approve is OFF. To avoid wiping those keys
    300                  * when the form is saved with auto-approve ON (they're absent from
    301                  * the POST), we restore them from the stored option if missing. This
    302                  * is the single sentinel-guarded carve-out (Playbook 7.1) this plugin
    303                  * needs — everything else is a full per-group rebuild.
     298                 * The ONE exception is the approval-email pair: if a save arrives
     299                 * without them (the General tab has always posted them since 3.8.1,
     300                 * but this sanitizer also runs for programmatic update_option()
     301                 * calls), they are restored from the stored option instead of wiped.
     302                 * This is the single sentinel-guarded carve-out (Playbook 7.1) this
     303                 * plugin needs; everything else is a full per-group rebuild.
    304304                 *
    305305                 * @param mixed $input Raw input.
    … …  
    312312                        $stored = is_array( $stored ) ? $stored : array();
    313313
    314                         // Conditionally-rendered keys: preserve only when this save did
    315                         // not include them (auto-approve was ON, so the fields were hidden).
     314                        // Approval-email keys: keep the stored value when a save omits them.
    316315                        $conditional_keys = array( 'review_approve_email_subject', 'review_approve_email_message' );
    317316                        foreach ( $conditional_keys as $cond_key ) {
    … …  
    319318                                        $sanitized[ $cond_key ] = $stored[ $cond_key ];
    320319                                }
     320                        }
     321
     322                        // The two email bodies come from a rich-text editor: keep paragraphs and safe
     323                        // HTML. The generic sanitizer runs sanitize_text_field(), which flattened every
     324                        // saved message to one line with its formatting stripped.
     325                        foreach ( array( 'review_email_message', 'review_approve_email_message' ) as $message_key ) {
     326                                if ( is_array( $input ) && isset( $input[ $message_key ] ) && is_string( $input[ $message_key ] ) ) {
     327                                        $sanitized[ $message_key ] = wp_kses_post( $input[ $message_key ] );
     328                                }
     329                        }
     330
     331                        // Numeric fields: a blank or junk value falls back to the documented default
     332                        // instead of being stored verbatim (a blank threshold silently disabled auto-hide).
     333                        // 0 stays meaningful for the threshold ("never auto-hide").
     334                        $numeric_defaults = array(
     335                                'bupr_flag_threshold'      => array( 5, 0 ),
     336                                'profile_reviews_per_page' => array( 5, 1 ),
     337                        );
     338                        foreach ( $numeric_defaults as $num_key => list( $default, $min ) ) {
     339                                if ( ! array_key_exists( $num_key, $sanitized ) ) {
     340                                        continue;
     341                                }
     342                                $raw                   = $sanitized[ $num_key ];
     343                                $sanitized[ $num_key ] = is_numeric( $raw ) && (int) $raw >= $min ? (int) $raw : $default;
    321344                        }
    322345
  • bp-user-profile-reviews/trunk/includes/admin/views/overview.php

    r3617176 r3736444  
    3737);
    3838
    39 // Flagged reviews still pending moderation.
    40 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
    41 $bupr_flagged = (int) $wpdb->get_var(
    42         $wpdb->prepare(
    43                 "SELECT COUNT(DISTINCT p.ID)
    44                  FROM {$wpdb->posts} p
    45                  INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
    46                  WHERE p.post_type = %s
    47                  AND p.post_status IN ('publish', 'draft')
    48                  AND pm.meta_key = %s
    49                  AND pm.meta_value = %s",
    50                 'review',
    51                 'bupr_flag_status',
    52                 'flagged'
    53         )
    54 );
     39// Reviews still pending moderation. Auto-hidden drafts were pulled by reports,
     40// not waiting for first approval, so they are counted apart from Pending.
     41$bupr_flagged     = bupr_get_flagged_reviews_count();
     42$bupr_auto_hidden = bupr_get_auto_hidden_reviews_count();
     43$bupr_pending     = max( 0, $bupr_pending - $bupr_auto_hidden );
    5544
    5645// Feature flags (read from the hydrated global, falling back to option).
    … …  
    10594                <p class="bupr-stat__label"><?php esc_html_e( 'Reported', 'bp-member-reviews' ); ?></p>
    10695                <p class="bupr-stat__value"><?php echo esc_html( number_format_i18n( $bupr_flagged ) ); ?></p>
    107                 <p class="bupr-stat__trend"><?php esc_html_e( 'Reviews flagged for moderation', 'bp-member-reviews' ); ?></p>
     96                <p class="bupr-stat__trend">
     97                        <?php
     98                        if ( $bupr_auto_hidden > 0 ) {
     99                                printf(
     100                                        '<a class="bupr-inline-hint" href="%s">%s</a>',
     101                                        esc_url(
     102                                                add_query_arg(
     103                                                        array(
     104                                                                'post_status'      => 'draft',
     105                                                                'bupr_auto_hidden' => '1',
     106                                                        ),
     107                                                        $bupr_reviews_url
     108                                                )
     109                                        ),
     110                                        esc_html(
     111                                                sprintf(
     112                                                        /* translators: %d: number of reviews hidden by the report threshold */
     113                                                        _n( '%d hidden automatically', '%d hidden automatically', $bupr_auto_hidden, 'bp-member-reviews' ),
     114                                                        $bupr_auto_hidden
     115                                                )
     116                                        )
     117                                );
     118                        } else {
     119                                esc_html_e( 'Reviews flagged for moderation', 'bp-member-reviews' );
     120                        }
     121                        ?>
     122                </p>
    108123        </div>
    109124</div>
    … …  
    154169                                <?php else : ?>
    155170                                        <span class="bupr-status-off"><?php esc_html_e( 'Off', 'bp-member-reviews' ); ?></span>
     171                                        <a href="<?php echo esc_url( $bupr_general_url ); ?>" class="bupr-inline-hint"><?php esc_html_e( 'Turn on', 'bp-member-reviews' ); ?></a>
    156172                                <?php endif; ?>
    157173                        </td>
    … …  
    164180                                <?php else : ?>
    165181                                        <span class="bupr-status-off"><?php esc_html_e( 'Off', 'bp-member-reviews' ); ?></span>
     182                                        <a href="<?php echo esc_url( $bupr_general_url ); ?>" class="bupr-inline-hint"><?php esc_html_e( 'Turn on', 'bp-member-reviews' ); ?></a>
    166183                                <?php endif; ?>
    167184                        </td>
    … …  
    174191                                <?php else : ?>
    175192                                        <span class="bupr-status-off"><?php esc_html_e( 'Off', 'bp-member-reviews' ); ?></span>
     193                                        <a href="<?php echo esc_url( $bupr_general_url ); ?>" class="bupr-inline-hint"><?php esc_html_e( 'Turn on', 'bp-member-reviews' ); ?></a>
    176194                                <?php endif; ?>
    177195                        </td>
  • bp-user-profile-reviews/trunk/includes/bupr-ajax.php

    r3617176 r3736444  
    3636                        /* add action for approving reviews */
    3737                        add_action( 'wp_ajax_bupr_approve_review', array( $this, 'bupr_approve_review' ) );
    38                         add_action( 'wp_ajax_nopriv_bupr_approve_review', array( $this, 'bupr_approve_review' ) );
    3938
    4039                        add_action( 'wp_ajax_allow_bupr_member_review_update', array( $this, 'wp_allow_bupr_my_member' ) );
    41                         add_action( 'wp_ajax_nopriv_allow_bupr_member_review_update', array( $this, 'wp_allow_bupr_my_member' ) );
    4240
    4341                        /*** Filter post_date_gmt for prevent update post date on update_post_data */
    … …  
    8886                        }
    8987
    90                         // Check if user can approve reviews.
    91                         if ( ! current_user_can( 'edit_posts' ) ) {
     88                        // Approving publishes another member's review, which is moderation: Editor and up.
     89                        // edit_posts let a Contributor publish any pending review (including their own).
     90                        if ( ! current_user_can( 'edit_others_posts' ) ) {
    9291                                wp_send_json_error(
    9392                                        array(
    … …  
    201200                        $review_desc                = isset( $_POST['bupr_review_desc'] ) ? sanitize_textarea_field( wp_unslash( $_POST['bupr_review_desc'] ) ) : '';
    202201                        $bupr_member_id             = filter_input( INPUT_POST, 'bupr_member_id', FILTER_VALIDATE_INT );
    203                         $review_count               = filter_input( INPUT_POST, 'bupr_field_counter', FILTER_VALIDATE_INT );
    204202                        $anonymous_review           = filter_input( INPUT_POST, 'bupr_anonymous_review' );
    205203                        $profile_rated_field_values = isset( $_POST['bupr_review_rating'] ) ? array_map( 'absint', wp_unslash( $_POST['bupr_review_rating'] ) ) : array();
    … …  
    225223                                return;
    226224                        }
     225                        // The profile UI hides Add Review from disallowed roles; the endpoint must refuse too.
     226                        if ( ! bupr_roles_allow_review( $bupr_current_user, $bupr_member_id ) ) {
     227                                wp_send_json_error( '<p class="bupr-error">' . esc_html__( 'You are not allowed to review this member.', 'bp-member-reviews' ) . '</p>' );
     228                        }
     229
    227230                        // Set user name (anonymous or actual).
     231                        // The anonymous flag only counts when the site allows anonymous reviews.
     232                        $anonymous_review = ( 'yes' === $anonymous_review && 'yes' === ( $bupr['anonymous_reviews'] ?? 'no' ) ) ? 'yes' : 'no';
    228233                        $user_name = ( 'yes' === $anonymous_review ) ? __( 'An anonymous user', 'bp-member-reviews' ) : $current_user->display_name;
    229234
    … …  
    237242                        );
    238243
    239                         // Process rating values.
    240                         $bupr_count       = 0;
    241                         $bupr_member_star = array();
    242 
    243244                        $member_args  = array(
    244245                                'post_type'      => 'review',
    245                                 'posts_per_page' => -1,
     246                                // Only "has this author reviewed this member?" is needed.
     247                                'posts_per_page' => 1,
     248                                'fields'         => 'ids',
     249                                'no_found_rows'  => true,
    246250                                'post_status'    => array(
    247251                                        'draft',
    … …  
    268272
    269273                        if ( 0 === $user_post_count ) {
    270                                 if ( ! empty( $profile_rated_field_values ) ) {
    271                                         foreach ( $profile_rated_field_values as $bupr_stars_rate ) {
    272                                                 if ( $bupr_count === $review_count ) {
    273                                                         break;
     274                                /*
     275                                 * Ratings arrive positionally, one per criterion in form order. Keep each
     276                                 * rating on its own criterion: skipping an unrated (0) value used to shift
     277                                 * every later rating onto the wrong criterion, and a partial set was then
     278                                 * stored with numeric keys no reader could match to a criterion.
     279                                 */
     280                                $bupr_rated_stars = array();
     281                                foreach ( array_values( $profile_rated_field_values ) as $bupr_index => $bupr_stars_rate ) {
     282                                        $bupr_stars_rate = (int) $bupr_stars_rate;
     283                                        if ( $bupr_stars_rate < 1 || $bupr_stars_rate > 5 ) {
     284                                                continue;
     285                                        }
     286                                        if ( $bupr['multi_criteria_allowed'] ) {
     287                                                if ( isset( $bupr_rating_criteria[ $bupr_index ] ) ) {
     288                                                        $bupr_rated_stars[ $bupr_rating_criteria[ $bupr_index ] ] = $bupr_stars_rate;
    274289                                                }
    275                                                 $bupr_stars_rate = (int) $bupr_stars_rate;
    276                                                 // Validate rating is between 1-5, skip invalid ratings.
    277                                                 if ( $bupr_stars_rate >= 1 && $bupr_stars_rate <= 5 ) {
    278                                                         $bupr_member_star[] = $bupr_stars_rate;
    279                                                 }
    280                                                 ++$bupr_count;
     290                                        } elseif ( empty( $bupr_rated_stars ) ) {
     291                                                $bupr_rated_stars[] = $bupr_stars_rate;
    281292                                        }
    282293                                }
    283294
    284                                 $bupr_rated_stars = array();
    285                                 if ( $bupr['multi_criteria_allowed'] && ( count( $bupr_rating_criteria ) === count( $bupr_member_star ) ) ) {
    286                                         $bupr_rated_stars = array_combine( $bupr_rating_criteria, $bupr_member_star );
    287                                 } else {
    288                                         $bupr_rated_stars = $bupr_member_star;
     295                                // Same rule as the form: every criterion rated, or a written review.
     296                                $bupr_needed_ratings = $bupr['multi_criteria_allowed'] ? count( $bupr_rating_criteria ) : 1;
     297                                if ( '' === trim( $review_desc ) && ( empty( $bupr_rated_stars ) || count( $bupr_rated_stars ) < $bupr_needed_ratings ) ) {
     298                                        wp_send_json_error( '<p class="bupr-error">' . esc_html__( 'Please rate every criterion or write a review.', 'bp-member-reviews' ) . '</p>' );
    289299                                }
    290300
    … …  
    404414                                        $bupr_review_url = bp_members_get_user_url( $member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $review_id;
    405415                                } else {
    406                                         $bupr_review_url = bp_core_get_user_domain( $member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $review_id;
     416                                        $bupr_review_url = bupr_member_url( $member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $review_id;
    407417                                }
    408418
    … …  
    437447
    438448                                $bupr_header = array( 'Content-Type: text/html; charset=UTF-8' );
    439                                 $mail_sent   = wp_mail( $bupr_reciever_email, $bupr_subject, nl2br( $bupr_message ), $bupr_header );
     449                                $mail_sent   = wp_mail( $bupr_reciever_email, $bupr_subject, wpautop( $bupr_message ), $bupr_header );
    440450                                if ( ! $mail_sent && defined( 'WP_DEBUG' ) && WP_DEBUG ) {
    441451                                        error_log( 'BUPR: Failed to send review notification email to ' . $bupr_reciever_email );
    … …  
    492502
    493503                                $bupr_header = array( 'Content-Type: text/html; charset=UTF-8' );
    494                                 $mail_sent   = wp_mail( $bupr_to, $bupr_subject, nl2br( $bupr_approve_message ), $bupr_header );
     504                                $mail_sent   = wp_mail( $bupr_to, $bupr_subject, wpautop( $bupr_approve_message ), $bupr_header );
    495505                                if ( ! $mail_sent && defined( 'WP_DEBUG' ) && WP_DEBUG ) {
    496506                                        error_log( 'BUPR: Failed to send admin approval notification email to ' . $bupr_to );
    … …  
    558568
    559569                        // Check if current user can edit this review.
     570                        // Settings > General > Update Review off: members can no longer edit (moderators still can).
     571                        global $bupr;
     572                        if ( 'yes' !== ( $bupr['allow_update'] ?? 'yes' ) && ! current_user_can( 'edit_others_posts' ) ) {
     573                                wp_send_json_error(
     574                                        array(
     575                                                'message' => __( 'Editing reviews is turned off on this site.', 'bp-member-reviews' ),
     576                                                'code'    => 'update_disabled',
     577                                        )
     578                                );
     579                        }
     580
    560581                        if ( get_current_user_id() !== (int) $review->post_author && ! current_user_can( 'edit_others_posts' ) ) {
    561582                                wp_send_json_error(
    … …  
    740761                         * others' posts (editor/admin).
    741762                         */
     763                        // Settings > General > Update Review off: members can no longer edit (moderators still can).
     764                        global $bupr;
     765                        if ( 'yes' !== ( $bupr['allow_update'] ?? 'yes' ) && ! current_user_can( 'edit_others_posts' ) ) {
     766                                wp_send_json_error(
     767                                        array(
     768                                                'message' => __( 'Editing reviews is turned off on this site.', 'bp-member-reviews' ),
     769                                                'code'    => 'update_disabled',
     770                                        )
     771                                );
     772                        }
     773
    742774                        if ( get_current_user_id() !== (int) $review->post_author && ! current_user_can( 'edit_others_posts' ) ) {
    743775                                wp_send_json_error(
    … …  
    759791
    760792                        $review_args = array(
    761                                 'ID'           => esc_sql( $review_id ),
     793                                'ID'           => (int) $review_id,
    762794                                'post_content' => wp_kses_post( $review_content ),
    763                                 'post_status'  => 'publish',
     795                                // No post_status: an edit keeps the review's status. Forcing 'publish' let an
     796                                // author re-publish a pending or report-hidden review without moderation.
    764797                        );
    765798
    … …  
    850883                        // Get the review.
    851884                        $review = get_post( $review_id );
    852                         if ( ! $review || 'review' !== $review->post_type ) {
     885                        // Only published reviews can be replied to (the owner cannot see pending ones).
     886                        if ( ! $review || 'review' !== $review->post_type || 'publish' !== $review->post_status ) {
    853887                                wp_send_json_error(
    854888                                        array(
    … …  
    10601094                        $flag_threshold = isset( $bupr['flag_threshold'] ) ? absint( $bupr['flag_threshold'] ) : 5;
    10611095                        $auto_hidden    = false;
    1062                         if ( $flag_threshold > 0 && $flag_count >= $flag_threshold ) {
     1096                        // Reports an admin already dismissed do not count again.
     1097                        $active_flags = $flag_count - (int) get_post_meta( $review_id, 'bupr_flag_dismissed_at_count', true );
     1098                        if ( $flag_threshold > 0 && $active_flags >= $flag_threshold ) {
    10631099                                // Auto-hide the review by setting it to draft.
    10641100                                wp_update_post(
  • bp-user-profile-reviews/trunk/includes/bupr-filters.php

    r3617176 r3736444  
    2020         */
    2121        class BUPR_Custom_Hooks {
    22 
    23                 /**
    24                  * Holds user role cache.
    25                  *
    26                  * @var array
    27                  */
    28                 public $user_role_cache = array();
    29 
    3022
    3123                /**
    … …  
    132124
    133125                        if ( 'personal' === $bp_nouveau->displayed_nav && ! empty( $nav_item->primary ) ) {
    134                                 if ( bp_loggedin_user_domain() ) {
    135                                         $link = str_replace( bp_loggedin_user_domain(), bp_displayed_user_domain(), $link );
     126                                if ( is_user_logged_in() ) {
     127                                        $link = str_replace( bupr_member_url( bp_loggedin_user_id() ), bupr_member_url( bp_displayed_user_id() ), $link );
    136128                                } else {
    137                                         $link = trailingslashit( bp_displayed_user_domain() . $link );
     129                                        $link = trailingslashit( bupr_member_url( bp_displayed_user_id() ) . $link );
    138130                                }
    139131                        }
    140132                        return $link;
    141                 }
    142 
    143                 /**
    144                  * Get displayed user role.
    145                  *
    146                  * @since    2.3.0
    147                  * @access   public
    148                  * @author   Wbcom Designs
    149                  *
    150                  * @param int $user_id The user ID to get roles for.
    151                  * @return array Array of user roles.
    152                  */
    153                 public function bupr_get_current_user_roles( $user_id ) {
    154                         // Return empty array if not logged in.
    155                         if ( ! is_user_logged_in() || empty( $user_id ) ) {
    156                                 return array();
    157                         }
    158 
    159                         $user_id = absint( $user_id );
    160                         // Check cache first.
    161                         if ( isset( $this->user_role_cache[ $user_id ] ) ) {
    162                                 return $this->user_role_cache[ $user_id ];
    163                         }
    164 
    165                         if ( ! get_userdata( $user_id ) ) {
    166                                 return array();
    167                         }
    168                         // Get user data.
    169                         $user  = get_userdata( $user_id );
    170                         $roles = array();
    171 
    172                         if ( is_object( $user ) && isset( $user->roles ) ) {
    173                                 $roles = $user->roles;
    174                         }
    175 
    176                         // Cache the result.
    177                         $this->user_role_cache[ $user_id ] = $roles;
    178 
    179                         return $roles;
    180133                }
    181134
    … …  
    345298                public function bupr_add_review_button_on_member_header() {
    346299                        global $bupr;
    347                         if ( ! empty( $bupr['hide_review_button'] ) && 'yes' === $bupr['hide_review_button'] ) {
    348                                 if ( is_user_logged_in() ) {
    349                                         if ( bp_displayed_user_id() === bp_loggedin_user_id() ) {
    350                                                 $this->bupr_members_right_to_review();
    351                                         } else {
    352                                                 $this->bupr_members_right_to_take_review();
    353                                         }
    354                                 }
    355                         }
    356                 }
    357 
    358                 /**
    359                  * Map members who can give review by member role.
    360                  */
    361                 public function bupr_members_right_to_review() {
    362                         // Add capability checks.
    363                         if ( ! current_user_can( 'read' ) || ! is_user_logged_in() ) {
     300                        if ( empty( $bupr['hide_review_button'] ) || 'yes' !== $bupr['hide_review_button'] || ! is_user_logged_in() ) {
    364301                                return;
    365302                        }
    366                         global $bp, $bupr;
    367                         $review_div = 'form';
    368                         $user_id    = bp_loggedin_user_id();
    369 
    370                         // Get user roles once for efficiency (avoid double function call).
    371                         $user_roles = $this->bupr_get_current_user_roles( $user_id );
    372                         $user_role  = ( is_array( $user_roles ) && ! empty( $user_roles ) ) ? $user_roles[0] : '';
    373 
    374                         // If user role is NOT in the allowed reviewer roles, exit early.
    375                         $allowed_reviewer_roles = isset( $bupr['exclude_given_members'] ) && is_array( $bupr['exclude_given_members'] ) ? $bupr['exclude_given_members'] : array();
    376                         if ( ! empty( $allowed_reviewer_roles ) && ! in_array( $user_role, $allowed_reviewer_roles, true ) ) {
     303                        $member_id = bp_displayed_user_id();
     304                        // Never on own profile (self-review is refused), and only when the roles
     305                        // settings allow it: the same check the Add Review tab and the submit use.
     306                        if ( ! $member_id || bp_loggedin_user_id() === $member_id || ! bupr_roles_allow_review( bp_loggedin_user_id(), $member_id ) ) {
    377307                                return;
    378308                        }
    379 
    380                         // Check if the displayed user is not the logged-in user.
    381                         if ( bp_displayed_user_id() !== bp_loggedin_user_id() ) {
    382 
    383                                 // User passed the role check above, show the "Add Review" button.
    384                                 $review_url         = bp_core_get_userlink( $user_id, false, true ) . bupr_profile_review_tab_plural_slug() . '/add-' . bupr_profile_review_tab_singular_slug();
    385                                 $bp_template_option = bp_get_option( '_bp_theme_package_id' );
    386 
    387                                 // BuddyPress Nouveau template.
    388                                 if ( 'nouveau' === $bp_template_option ) {
     309                        $review_url = bupr_member_url( $member_id ) . bupr_profile_review_tab_plural_slug() . '/add-' . bupr_profile_review_tab_singular_slug();
     310                        $tag        = 'nouveau' === bp_get_option( '_bp_theme_package_id' ) ? 'li' : 'div';
     311                        ?>
     312                        <<?php echo esc_html( $tag ); ?> id="bupr-add-review-btn" class="generic-button">
     313                                <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="form">
     314                                        <?php
     315                                        /* translators: %s: Review label. */
     316                                        printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) );
    389317                                        ?>
    390                                         <li id="bupr-add-review-btn" class="generic-button">
    391                                                 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review">
    392                                                         <?php
    393                                                         /* translators: %s: Review label. */
    394                                                         printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) );
    395                                                         ?>
    396                                                 </a>
    397                                         </li>
    398                                         <?php
    399                                 } else {
    400                                         // BuddyPress legacy or other template.
    401                                         ?>
    402                                         <div id="bupr-add-review-btn" class="generic-button">
    403                                                 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review">
    404                                                         <?php
    405                                                         /* translators: %s: review label. */
    406                                                         printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) );
    407                                                         ?>
    408                                                 </a>
    409                                         </div>
    410                                         <?php
    411                                 }
    412                         }
    413                 }
    414 
    415                 /**
    416                  * Members who can only take reviews.
    417                  */
    418                 public function bupr_members_right_to_take_review() {
    419                         global $bp, $bupr;
    420                         $review_div = 'form';
    421                         $user_id    = bp_loggedin_user_id();
    422                         $user_role  = ( ! empty( $this->bupr_get_current_user_roles( $user_id ) ) ) ? $this->bupr_get_current_user_roles( $user_id )[0] : '';
    423 
    424                         // Exit early if the user's role is NOT in the allowed reviewer roles.
    425                         $allowed_reviewer_roles = isset( $bupr['exclude_given_members'] ) && is_array( $bupr['exclude_given_members'] ) ? $bupr['exclude_given_members'] : array();
    426                         if ( ! empty( $allowed_reviewer_roles ) && ! in_array( $user_role, $allowed_reviewer_roles, true ) ) {
    427                                 return;
    428                         }
    429 
    430                         // Check if the displayed user is not the logged-in user.
    431                         if ( bp_displayed_user_id() !== bp_loggedin_user_id() ) {
    432 
    433                                 // If add_taken_members is set, process the review logic.
    434                                 if ( ! empty( $bupr['add_taken_members'] ) ) {
    435                                         $user_id    = bp_displayed_user_id();
    436                                         $user_roles = $this->bupr_get_current_user_roles( $user_id );
    437                                         $user_role  = ! empty( $user_roles ) ? $user_roles[0] : '';
    438                                         // Check if the displayed user has the role to take reviews.
    439                                         if ( in_array( $user_role, $bupr['add_taken_members'], true ) ) {
    440 
    441                                                 // Construct the review URL.
    442                                                 $review_url         = bp_core_get_userlink( $user_id, false, true ) . bupr_profile_review_tab_plural_slug() . '/add-' . bupr_profile_review_tab_singular_slug();
    443                                                 $bp_template_option = bp_get_option( '_bp_theme_package_id' );
    444 
    445                                                 // BuddyPress Nouveau template.
    446                                                 if ( 'nouveau' === $bp_template_option ) {
    447                                                         ?>
    448                                                         <li id="bupr-add-review-btn" class="generic-button">
    449                                                                 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="<?php echo esc_attr( $review_div ); ?>">
    450                                                                         <?php
    451                                                                         /* translators: %s: review label. */
    452                                                                         printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) );
    453                                                                         ?>
    454                                                                 </a>
    455                                                         </li>
    456                                                         <?php
    457                                                 } else {
    458                                                         // BuddyPress legacy or other template.
    459                                                         ?>
    460                                                         <div id="bupr-add-review-btn" class="generic-button">
    461                                                                 <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="<?php echo esc_attr( $review_div ); ?>">
    462                                                                         <?php
    463                                                                         /* translators: %s: review label. */
    464                                                                         printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) );
    465                                                                         ?>
    466                                                                 </a>
    467                                                         </div>
    468                                                         <?php
    469                                                 }
    470                                         }
    471                                 } else {
    472                                         // If add_taken_members is empty, allow reviews for all.
    473 
    474                                         // Construct the review URL.
    475                                         $review_url         = bp_core_get_userlink( $user_id, false, true ) . bupr_profile_review_tab_plural_slug() . '/add-' . bupr_profile_review_tab_singular_slug();
    476                                         $bp_template_option = bp_get_option( '_bp_theme_package_id' );
    477 
    478                                         // BuddyPress Nouveau template.
    479                                         if ( 'nouveau' === $bp_template_option ) {
    480                                                 ?>
    481                                                 <li id="bupr-add-review-btn" class="generic-button">
    482                                                         <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="<?php echo esc_attr( $review_div ); ?>">
    483                                                                 <?php
    484                                                                 /* translators: %s: review label. */
    485                                                                 printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) );
    486                                                                 ?>
    487                                                         </a>
    488                                                 </li>
    489                                                 <?php
    490                                         } else {
    491                                                 // BuddyPress legacy or other template.
    492                                                 ?>
    493                                                 <div id="bupr-add-review-btn" class="generic-button">
    494                                                         <a href="<?php echo esc_url( $review_url ); ?>" class="button add-review" show="<?php echo esc_attr( $review_div ); ?>">
    495                                                                 <?php
    496                                                                 /* translators: %s: review label. */
    497                                                                 printf( esc_html__( 'Add %s', 'bp-member-reviews' ), esc_html( $bupr['review_label'] ) );
    498                                                                 ?>
    499                                                         </a>
    500                                                 </div>
    501                                                 <?php
    502                                         }
    503                                 }
    504                         }
     318                                </a>
     319                        </<?php echo esc_html( $tag ); ?>>
     320                        <?php
    505321                }
    506322
    … …  
    516332                        global $wp_admin_bar;
    517333                        global $bupr;
    518                         $bupr_args = array(
    519                                 'post_type'      => 'review',
    520                                 'posts_per_page' => -1,
    521                                 'post_status'    => 'publish',
    522                                 'category'       => 'bp-member',
    523                                 'meta_query'     => array(
    524                                         array(
    525                                                 'key'     => 'linked_bp_member',
    526                                                 'value'   => get_current_user_id(),
    527                                                 'compare' => '=',
    528                                         ),
    529                                 ),
    530                         );
    531 
    532                         $reviews       = get_posts( $bupr_args );
    533                         $reviews_count = count( $reviews );
     334                        $reviews_count = bupr_get_member_review_count( get_current_user_id() );
    534335
    535336                        $profile_menu_slug = isset( $bupr['review_label_plural'] ) ? sanitize_title( $bupr['review_label_plural'] ) : esc_html( 'reviews' );
    536337
    537                         $base_url = bp_loggedin_user_domain() . $profile_menu_slug;
     338                        $base_url = bupr_member_url( bp_loggedin_user_id() ) . $profile_menu_slug;
    538339                        if ( is_user_logged_in() ) {
    539340                                $wp_admin_bar->add_menu(
    … …  
    735536
    736537                                        // Add Approve Link for draft reviews.
    737                                         if ( 'draft' === $post->post_status ) {
     538                                        if ( 'draft' === $post->post_status && current_user_can( 'edit_others_posts' ) ) {
    738539                                                $actions['approve_review'] = '<a href="javascript:void(0);" title="' . $review_title . '" class="bupr-approve-review" data-rid="' . $post->ID . '">' . esc_html__( 'Approve', 'bp-member-reviews' ) . '</a>';
    739540                                        }
    … …  
    767568                        global $bp, $bupr;
    768569
    769                         // Default from plugin settings.
    770                         $exclude_given_members = $bupr['exclude_given_members'] ?? array();
    771                         $add_taken_members     = $bupr['add_taken_members'] ?? array();
    772                         $review_label          = $bupr['review_label'] ?? esc_html__( 'Review', 'bp-member-reviews' );
    773 
    774                         if ( bupr_bp_classic_activate() ) {
    775                                 global $wp_roles;
    776                                 // Ensure $wp_roles is set correctly.
    777                                 if ( ! isset( $wp_roles ) || ! is_object( $wp_roles ) || ! isset( $wp_roles->roles ) ) {
    778                                         // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Initializing WordPress global when not set.
    779                                         $wp_roles = wp_roles();
    780                                 }
    781                                 // Get all available roles for pre-population.
    782                                 $available_roles       = array_keys( $wp_roles->roles );
    783                                 $bupr_general_settings = get_option( 'bupr_admin_general_options', array() );
    784                                 $exclude_given_members = $bupr_general_settings['bupr_exc_member'] ?? $available_roles;
    785                                 $add_taken_members     = $bupr_general_settings['bupr_add_member'] ?? $available_roles;
    786                         }
    787 
    788570                        $bp_pages = bp_core_get_directory_pages();
    789571                        add_filter( 'site_url', 'bupr_site_url', 99 );
    790572                        $member_slug = ( isset( $bp_pages->members ) && isset( $bp_pages->members->slug ) ) ? $bp_pages->members->slug : 'members';
    791573
    792                         // Count member's review.
    793                         // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
    794                         $bupr_args = array(
    795                                 'post_type'      => 'review',
    796                                 'posts_per_page' => -1,
    797                                 'post_status'    => 'publish',
    798                                 'category'       => 'bp-member',
    799                                 'meta_query'     => array(
    800                                         array(
    801                                                 'key'     => 'linked_bp_member',
    802                                                 'value'   => bp_displayed_user_id(),
    803                                                 'compare' => '=',
    804                                         ),
    805                                 ),
    806                         );
    807 
    808                         $bupr_reviews = new WP_Query( $bupr_args );
    809                         if ( ! empty( $bupr_reviews->posts ) ) {
    810                                 $bupr_reviews = count( $bupr_reviews->posts );
    811                                 if ( ! empty( $bupr_reviews ) ) {
    812                                         $bupr_notification = '<span class="count">' . $bupr_reviews . '</span>';
    813                                 } else {
    814                                         $bupr_notification = '<span class="count">' . 0 . '</span>';
    815                                 }
    816                         } else {
    817                                 $bupr_notification = '<span class="count">' . 0 . '</span>';
    818                         }
    819                         wp_reset_postdata();
     574                        // Count member's reviews (cached aggregate, not a full query per page view).
     575                        $bupr_notification = '<span class="count">' . bupr_get_member_review_count( bp_displayed_user_id() ) . '</span>';
    820576
    821577                        $name = bp_get_displayed_user_username();
    … …  
    823579                        if ( apply_filters( 'bupr_show_profile_review_tab', true ) ) {
    824580                                $tab_args = array(
    825                                         'name'                    => bupr_profile_review_tab_name() . 's' . $bupr_notification,
     581                                        'name'                    => bupr_profile_review_tab_name() . ' ' . $bupr_notification, // BP cuts one char before the count span.
    826582                                        'slug'                    => bupr_profile_review_tab_plural_slug(),
    827583                                        'screen_function'         => array( $this, 'bupr_reviews_tab_function_to_show_screen' ),
    … …  
    849605
    850606                        // Add subnav to add a review.
    851                         if ( bp_displayed_user_id() === bp_loggedin_user_id() ) {
    852                                 // On own profile: show "Add Review" subnav if user's role is in the allowed reviewer roles.
    853                                 $user_role     = $this->bupr_get_current_user_roles( bp_loggedin_user_id() );
    854                                 $allowed_roles = ! empty( $exclude_given_members ) && is_array( $exclude_given_members ) ? $exclude_given_members : array();
    855 
    856                                 // Show subnav if no role restrictions are set, or if user's role is in the allowed list.
    857                                 if ( empty( $allowed_roles ) || ( ! empty( $user_role ) && array_intersect( (array) $user_role, $allowed_roles ) ) ) {
    858                                         bp_core_new_subnav_item(
    859                                                 array(
    860                                                         /* translators: %1$s: Review Label. */
    861                                                         'name'            => sprintf( esc_html__( 'Add %1$s', 'bp-member-reviews' ), esc_html( $review_label ) ),
    862                                                         'slug'            => 'add-' . bupr_profile_review_tab_singular_slug(),
    863                                                         'parent_url'      => $bp->loggedin_user->domain . $parent_slug . '/',
    864                                                         'parent_slug'     => $parent_slug,
    865                                                         'screen_function' => array( $this, 'bupr_reviews_form_tab_function_to_show_screen' ),
    866                                                         'position'        => 200,
    867                                                         'link'            => site_url() . "/$member_slug/$name/$parent_slug/" . 'add-' . bupr_profile_review_tab_singular_slug(),
    868                                                 )
    869                                         );
    870                                 }
    871                         } else {
    872                                 // On another user's profile: check if logged-in user's role is allowed to give reviews.
    873                                 $user_role     = $this->bupr_get_current_user_roles( bp_loggedin_user_id() );
    874                                 $allowed_roles = ! empty( $exclude_given_members ) && is_array( $exclude_given_members ) ? $exclude_given_members : array();
    875 
    876                                 // If allowed roles are set and user's role is NOT in the list, block the subnav.
    877                                 if ( ! empty( $allowed_roles ) && ! empty( $user_role ) && ! array_intersect( (array) $user_role, $allowed_roles ) ) {
    878                                         return;
    879                                 }
    880 
    881                                 if ( ! empty( $add_taken_members ) && ! empty( $user_role ) ) {
    882                                         $user_role = $this->bupr_get_current_user_roles( bp_displayed_user_id() );
    883                                         $user_role = ! empty( $user_role ) ? $user_role : array();
    884 
    885                                         if ( array_intersect( $user_role, $add_taken_members ) ) {
    886                                                 bp_core_new_subnav_item(
    887                                                         array(
    888                                                                 /* translators: %1$s: Review label. */
    889                                                                 'name'            => sprintf( esc_html__( 'Add %1$s', 'bp-member-reviews' ), esc_html( bupr_profile_review_singular_tab_name() ) ),
    890                                                                 'slug'            => 'add-' . bupr_profile_review_tab_singular_slug(),
    891                                                                 'parent_url'      => $bp->loggedin_user->domain . $parent_slug . '/',
    892                                                                 'parent_slug'     => $parent_slug,
    893                                                                 'screen_function' => array( $this, 'bupr_reviews_form_tab_function_to_show_screen' ),
    894                                                                 'position'        => 200,
    895                                                                 'link'            => site_url() . "/$member_slug/$name/$parent_slug/" . 'add-' . bupr_profile_review_tab_singular_slug(),
    896                                                         )
    897                                                 );
    898                                         }
    899                                 } else {
    900 
    901                                         bp_core_new_subnav_item(
    902                                                 array(
    903                                                         /* translators: %1$s: Review label. */
    904                                                         'name'            => sprintf( esc_html__( 'Add %1$s', 'bp-member-reviews' ), esc_html( bupr_profile_review_singular_tab_name() ) ),
    905                                                         'slug'            => 'add-' . bupr_profile_review_tab_singular_slug(),
    906                                                         'parent_url'      => $bp->loggedin_user->domain . $parent_slug . '/',
    907                                                         'parent_slug'     => $parent_slug,
    908                                                         'screen_function' => array( $this, 'bupr_reviews_form_tab_function_to_show_screen' ),
    909                                                         'position'        => 200,
    910                                                         'link'            => site_url() . "/$member_slug/$name/$parent_slug/" . 'add-' . bupr_profile_review_tab_singular_slug(),
    911                                                 )
    912                                         );
    913                                 }
     607                        // Never on own profile: the profile form has no member picker and self-review is refused (bupr-ajax.php).
     608                        // Logged-in viewers get it only when the roles settings allow the review, the same check as the header
     609                        // button and the submit; logged-out visitors see it and the form asks them to log in.
     610                        $member_id = bp_displayed_user_id();
     611                        if ( bp_loggedin_user_id() !== $member_id && ( ! is_user_logged_in() || bupr_roles_allow_review( bp_loggedin_user_id(), $member_id ) ) ) {
     612                                bp_core_new_subnav_item(
     613                                        array(
     614                                                /* translators: %1$s: Review label. */
     615                                                'name'            => sprintf( esc_html__( 'Add %1$s', 'bp-member-reviews' ), esc_html( bupr_profile_review_singular_tab_name() ) ),
     616                                                'slug'            => 'add-' . bupr_profile_review_tab_singular_slug(),
     617                                                'parent_url'      => $bp->loggedin_user->domain . $parent_slug . '/',
     618                                                'parent_slug'     => $parent_slug,
     619                                                'screen_function' => array( $this, 'bupr_reviews_form_tab_function_to_show_screen' ),
     620                                                'position'        => 200,
     621                                                'link'            => site_url() . "/$member_slug/$name/$parent_slug/" . 'add-' . bupr_profile_review_tab_singular_slug(),
     622                                        )
     623                                );
    914624                        }
    915625                        remove_filter( 'site_url', 'bupr_site_url', 99 );
    … …  
    977687                                                        <?php
    978688                                                        printf(
    979                                                         /* translators: %1$s: Review user link; %2$s: review label; %3$s: reviewed user link. */
    980                                                                 'You must <a href="%1$s">login</a> to add a %2$s.',
    981                                                                 esc_url( wp_login_url( get_permalink() ) ),
    982                                                                 esc_html( strtolower( $bupr['review_label'] ) ),
     689                                                                wp_kses(
     690                                                                        /* translators: %1$s: login URL; %2$s: review label. */
     691                                                                        __( 'You must <a href="%1$s">log in</a> to add a %2$s.', 'bp-member-reviews' ),
     692                                                                        array( 'a' => array( 'href' => array() ) )
     693                                                                ),
     694                                                                // Come back to this form after logging in.
     695                                                                esc_url( wp_login_url( bp_get_requested_url() ) ),
     696                                                                esc_html( strtolower( $bupr['review_label'] ) )
    983697                                                        );
    984698                                                        ?>
    … …  
    1051765                        }
    1052766
    1053                         // Check if the review activity should be created (based on settings).
    1054                         // Get the review post data.
     767                        // Only a published review belongs in the activity stream (an edit to a pending
     768                        // or report-hidden review fires this same hook).
    1055769                        $review = get_post( $review_id );
    1056                         if ( ! empty( $review ) ) {
     770                        if ( ! empty( $review ) && 'publish' === $review->post_status ) {
    1057771                                // Get the reviewer's (author's) and reviewed user's profile URLs.
    1058772                                $reviewer_user_id   = $review->post_author;
    … …  
    1088802                                        $activity_user_id = $is_anonymous ? $reviewed_user_id : $reviewer_user_id;
    1089803
     804                                        // One entry per review: an edit or re-approval updates the existing
     805                                        // entry in place (keeping its date) instead of posting a duplicate.
     806                                        $existing_id   = bupr_get_review_activity_id( $review_id );
     807                                        $recorded_time = $existing_id ? ( new BP_Activity_Activity( $existing_id ) )->date_recorded : bp_core_current_time();
     808
    1090809                                        // Add activity to BuddyPress.
    1091810                                        $activity_id = bp_activity_add(
    1092811                                                array(
     812                                                        'id'                => $existing_id,
     813                                                        'recorded_time'     => $recorded_time,
    1093814                                                        'action'            => $action,
    1094815                                                        'content'           => ! empty( $escaped_content ) ? $escaped_content : 'Ratings',
    1095816                                                        'component'         => $bp->members->id,
    1096                                                         'type'              => defined( 'YOUZIFY_VERSION' ) ? 'activity_status' : 'member_review',
     817                                                        'type'              => bupr_review_activity_type(),
    1097818                                                        'user_id'           => $activity_user_id,
    1098819                                                        'item_id'           => $review_id,
  • bp-user-profile-reviews/trunk/includes/bupr-general-functions.php

    r3617176 r3736444  
    607607                }
    608608
     609                if ( 'before_delete_post' === current_action() ) {
     610                        // The row still exists here, so recalculating now would count it again.
     611                        // Drop its activity and recalculate once the delete has gone through.
     612                        bupr_delete_review_activity( $post_id );
     613                        add_action(
     614                                'deleted_post',
     615                                function ( $deleted_id ) use ( $post_id, $user_id ) {
     616                                        if ( (int) $deleted_id === (int) $post_id ) {
     617                                                bupr_recalculate_user_reviews_for_user( $user_id );
     618                                                bupr_flush_top_members_cache();
     619                                        }
     620                                }
     621                        );
     622                        return;
     623                }
     624
    609625                // Force recalculation.
    610626                bupr_recalculate_user_reviews_for_user( $user_id );
    … …  
    635651
    636652/**
     653 * Published reviews a member has received, from the cached aggregate (recalculated once if missing).
     654 *
     655 * Replaces per-request get_posts( posts_per_page => -1 ) counts, which loaded every
     656 * review a member has into memory on every page view.
     657 *
     658 * @since 3.8.1
     659 * @param int $user_id Member ID.
     660 * @return int
     661 */
     662function bupr_get_member_review_count( $user_id ) {
     663        $user_id = (int) $user_id;
     664        if ( ! $user_id ) {
     665                return 0;
     666        }
     667        $count = get_user_meta( $user_id, 'bupr_review_count', true );
     668        if ( '' === $count ) {
     669                bupr_recalculate_user_reviews_for_user( $user_id );
     670                $count = get_user_meta( $user_id, 'bupr_review_count', true );
     671        }
     672        return (int) $count;
     673}
     674
     675/**
     676 * A member's profile URL, with a trailing slash, on every supported BuddyPress.
     677 *
     678 * BuddyPress 12 deprecated bp_core_get_user_domain() (a notice on every call under
     679 * WP_DEBUG), and bp_members_get_user_url() does not exist before 12.
     680 *
     681 * @since 3.8.1
     682 * @param int $user_id User ID.
     683 * @return string
     684 */
     685function bupr_member_url( $user_id ) {
     686        $url = function_exists( 'bp_members_get_user_url' ) ? bp_members_get_user_url( (int) $user_id ) : bp_core_get_user_domain( (int) $user_id );
     687        return trailingslashit( (string) $url );
     688}
     689
     690/**
     691 * Whether the Reviewer Roles / Reviewee Roles settings allow one member to review another.
     692 *
     693 * An empty list means "every role". A user passes when ANY of their roles is listed.
     694 * The header button, the Add Review tab, the shortcode picker and the submit all use this check.
     695 *
     696 * @since 3.8.1
     697 * @param int $reviewer_id User submitting the review.
     698 * @param int $member_id   User being reviewed.
     699 * @return bool
     700 */
     701function bupr_roles_allow_review( $reviewer_id, $member_id ) {
     702        global $bupr;
     703        $reviewer = get_userdata( (int) $reviewer_id );
     704        $member   = get_userdata( (int) $member_id );
     705        if ( ! $reviewer || ! $member ) {
     706                return false;
     707        }
     708        $reviewer_roles = isset( $bupr['exclude_given_members'] ) && is_array( $bupr['exclude_given_members'] ) ? $bupr['exclude_given_members'] : array();
     709        $reviewee_roles = isset( $bupr['add_taken_members'] ) && is_array( $bupr['add_taken_members'] ) ? $bupr['add_taken_members'] : array();
     710        if ( $reviewer_roles && ! array_intersect( (array) $reviewer->roles, $reviewer_roles ) ) {
     711                return false;
     712        }
     713        if ( $reviewee_roles && ! array_intersect( (array) $member->roles, $reviewee_roles ) ) {
     714                return false;
     715        }
     716        return true;
     717}
     718
     719/**
     720 * Number of reviews whose reports are still open (published or hidden).
     721 *
     722 * @since 3.8.1
     723 * @return int
     724 */
     725function bupr_get_flagged_reviews_count() {
     726        global $wpdb;
     727        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
     728        return (int) $wpdb->get_var(
     729                $wpdb->prepare(
     730                        "SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p
     731                        INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
     732                        WHERE p.post_type = %s AND p.post_status IN ('publish', 'draft')
     733                        AND pm.meta_key = 'bupr_flag_status' AND pm.meta_value = 'flagged'",
     734                        'review'
     735                )
     736        );
     737}
     738
     739/**
     740 * Number of reviews currently hidden because they reached the report threshold.
     741 *
     742 * @since 3.8.1
     743 * @return int
     744 */
     745function bupr_get_auto_hidden_reviews_count() {
     746        global $wpdb;
     747        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
     748        return (int) $wpdb->get_var(
     749                $wpdb->prepare(
     750                        "SELECT COUNT(DISTINCT p.ID) FROM {$wpdb->posts} p
     751                        INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
     752                        WHERE p.post_type = %s AND p.post_status = 'draft'
     753                        AND pm.meta_key = 'bupr_auto_hidden' AND pm.meta_value <> ''",
     754                        'review'
     755                )
     756        );
     757}
     758
     759/**
     760 * Activity type used for review entries. Youzify only renders its own status type.
     761 *
     762 * @since 3.8.1
     763 * @return string
     764 */
     765function bupr_review_activity_type() {
     766        return defined( 'YOUZIFY_VERSION' ) ? 'activity_status' : 'member_review';
     767}
     768
     769/**
     770 * ID of the activity entry recorded for a review, or 0 when there is none.
     771 *
     772 * @since 3.8.1
     773 * @param int $review_id Review post ID.
     774 * @return int
     775 */
     776function bupr_get_review_activity_id( $review_id ) {
     777        if ( ! function_exists( 'bp_activity_get_activity_id' ) ) {
     778                return 0;
     779        }
     780        return (int) bp_activity_get_activity_id(
     781                array(
     782                        'component' => buddypress()->members->id,
     783                        'type'      => bupr_review_activity_type(),
     784                        'item_id'   => (int) $review_id,
     785                )
     786        );
     787}
     788
     789/**
     790 * Remove the activity entries recorded for a review.
     791 *
     792 * @since 3.8.1
     793 * @param int $review_id Review post ID.
     794 */
     795function bupr_delete_review_activity( $review_id ) {
     796        if ( ! function_exists( 'bp_activity_delete' ) ) {
     797                return;
     798        }
     799        bp_activity_delete(
     800                array(
     801                        'component' => buddypress()->members->id,
     802                        'type'      => bupr_review_activity_type(),
     803                        'item_id'   => (int) $review_id,
     804                )
     805        );
     806}
     807
     808/**
    637809 * Handle review status transitions to trigger cache invalidation.
    638810 *
    … …  
    652824        if ( $new_status === $old_status ) {
    653825                return;
     826        }
     827
     828        // A review that stops being public takes its activity entry with it. Re-publishing
     829        // creates a fresh one through bupr_member_review_after_review_insert.
     830        if ( 'publish' === $old_status ) {
     831                bupr_delete_review_activity( $post->ID );
     832        }
     833
     834        // An admin re-approving an auto-hidden review clears the auto-hidden marker.
     835        if ( 'publish' === $new_status ) {
     836                delete_post_meta( $post->ID, 'bupr_auto_hidden' );
     837                delete_post_meta( $post->ID, 'bupr_auto_hidden_date' );
    654838        }
    655839
  • bp-user-profile-reviews/trunk/includes/bupr-notification.php

    r3617176 r3736444  
    5757        global $bp, $bupr;
    5858        $post_status = get_post_status( $item_id ); // getting review status.
     59
     60        if ( 'bupr_review_flagged_action' === $component_action_name || 'bupr_owner_reply_action' === $component_action_name ) {
     61                $label = strtolower( $bupr['review_label'] ?? __( 'Review', 'bp-member-reviews' ) );
     62                if ( 'bupr_review_flagged_action' === $component_action_name ) {
     63                        $link = admin_url( 'post.php?post=' . (int) $item_id . '&action=edit' );
     64                        /* translators: %s: review label. */
     65                        $text = sprintf( __( 'A member reported a %s. Check it and dismiss or resolve the report.', 'bp-member-reviews' ), $label );
     66                } else {
     67                        $member_id = (int) get_post_meta( $item_id, 'linked_bp_member', true );
     68                        $member    = get_userdata( $member_id );
     69                        $link      = bupr_member_url( $member_id ) . bupr_profile_review_tab_plural_slug() . '/view/' . (int) $item_id;
     70                        /* translators: 1: member name, 2: review label. */
     71                        $text = sprintf( __( '%1$s replied to your %2$s', 'bp-member-reviews' ), $member ? $member->display_name : '', $label );
     72                }
     73                $link = wp_nonce_url(
     74                        add_query_arg(
     75                                array(
     76                                        'referer' => 'user_notification',
     77                                        'id'      => $item_id,
     78                                ),
     79                                $link
     80                        ),
     81                        'mark-as-read-notification-' . bp_loggedin_user_id()
     82                );
     83                if ( 'string' === $format ) {
     84                        return sprintf( '<a href="%s">%s</a>', esc_url( $link ), esc_html( $text ) );
     85                }
     86                return array(
     87                        'text' => $text,
     88                        'link' => $link,
     89                );
     90        }
    5991
    6092        if ( 'bupr_add_review_action' === $component_action_name ) {
    … …  
    91123                        $linked_user_name = $linked_user_info->display_name;
    92124                }
    93                 // Check if bp_members_get_user_url() exists and use it; otherwise, fall back to bp_core_get_user_domain().
    94125                if ( is_array( $bupr ) ) {
    95                         if ( function_exists( 'bp_members_get_user_url' ) ) {
    96                                 // Use bp_members_get_user_url() if it exists (for BuddyPress v12.0.0 and above).
    97                                 $notification_link = bp_members_get_user_url( $linked_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $item_id;
    98                         } else {
    99                                 // Fall back to bp_core_get_user_domain() for older versions of BuddyPress.
    100                                 $notification_link = bp_core_get_user_domain( $linked_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $item_id;
    101                         }
     126                        $notification_link = bupr_member_url( $linked_member_id ) . sanitize_title( $bupr['review_label_plural'] ) . '/view/' . $item_id;
    102127
    103128                        /* translators: %s: */
    … …  
    195220
    196221/**
     222 * Add one unread notification for a review event, behind the BuddyPress Notifications switch.
     223 * An unread one for the same review and recipient is not repeated.
     224 *
     225 * @since 3.8.1
     226 * @param int    $user_id   Recipient.
     227 * @param int    $review_id Review post ID.
     228 * @param string $action    Component action.
     229 */
     230function bupr_add_review_event_notification( $user_id, $review_id, $action ) {
     231        global $bupr;
     232        if ( ! $user_id || ! function_exists( 'bp_notifications_add_notification' ) || 'yes' !== ( $bupr['allow_notification'] ?? '' ) ) {
     233                return;
     234        }
     235        $unread = BP_Notifications_Notification::get(
     236                array(
     237                        'user_id'          => $user_id,
     238                        'item_id'          => $review_id,
     239                        'component_name'   => 'buddypress_member_review',
     240                        'component_action' => $action,
     241                        'is_new'           => 1,
     242                )
     243        );
     244        if ( $unread ) {
     245                return;
     246        }
     247        bp_notifications_add_notification(
     248                array(
     249                        'user_id'           => $user_id,
     250                        'item_id'           => $review_id,
     251                        'secondary_item_id' => get_current_user_id(),
     252                        'component_name'    => 'buddypress_member_review',
     253                        'component_action'  => $action,
     254                        'date_notified'     => bp_core_current_time(),
     255                        'is_new'            => 1,
     256                )
     257        );
     258}
     259
     260/**
     261 * Tell the site administrator a review was reported (the same account that gets the
     262 * pending-approval notice). Reporters stay anonymous: the text does not name them.
     263 *
     264 * @since 3.8.1
     265 * @param int $review_id Review post ID.
     266 */
     267function bupr_notify_review_flagged( $review_id ) {
     268        $admins = get_users(
     269                array(
     270                        'role'   => 'administrator',
     271                        'number' => 1,
     272                        'fields' => 'ID',
     273                )
     274        );
     275        if ( $admins ) {
     276                bupr_add_review_event_notification( (int) $admins[0], (int) $review_id, 'bupr_review_flagged_action' );
     277        }
     278}
     279add_action( 'bupr_review_flagged', 'bupr_notify_review_flagged' );
     280
     281/**
     282 * Tell the reviewer the reviewed member replied to their review.
     283 *
     284 * @since 3.8.1
     285 * @param int $review_id   Review post ID.
     286 * @param int $owner_id    Member who replied.
     287 * @param int $reviewer_id Review author.
     288 */
     289function bupr_notify_owner_reply( $review_id, $owner_id, $reviewer_id ) {
     290        if ( (int) $reviewer_id !== (int) $owner_id ) {
     291                bupr_add_review_event_notification( (int) $reviewer_id, (int) $review_id, 'bupr_owner_reply_action' );
     292        }
     293}
     294add_action( 'bupr_owner_reply_added', 'bupr_notify_owner_reply', 10, 3 );
     295
     296/**
    197297 * Delete all BuddyPress notifications tied to a review.
    198298 *
    … …  
    213313        }
    214314
    215         // Removes the notification for every recipient (reviewed member + the
    216         // admin approval notice) in one query, keyed on the review item id.
     315        // Removes every notification for the review (new review, approval, report,
     316        // reply) for every recipient in one query, keyed on the review item id.
    217317        BP_Notifications_Notification::delete(
    218318                array(
    219                         'item_id'          => $review_id,
    220                         'component_name'   => 'buddypress_member_review',
    221                         'component_action' => 'bupr_add_review_action',
     319                        'item_id'        => $review_id,
     320                        'component_name' => 'buddypress_member_review',
    222321                )
    223322        );
    … …  
    225324
    226325add_action( 'bp_actions', 'bupr_buddypress_notification_marked_as_read' );
     326// Pending-approval and report notifications link to the review edit screen in wp-admin.
     327add_action( 'load-post.php', 'bupr_buddypress_notification_marked_as_read' );
    227328
    228329/**
    … …  
    260361                array( 'is_new' => false ),
    261362                array(
    262                         'component_action' => 'bupr_add_review_action',
    263                         'user_id'          => $current_user_id,
    264                         'item_id'          => $review_id,
    265                 )
    266         );
    267 }
     363                        'component_name' => 'buddypress_member_review',
     364                        'user_id'        => $current_user_id,
     365                        'item_id'        => $review_id,
     366                )
     367        );
     368}
  • bp-user-profile-reviews/trunk/includes/bupr-scripts.php

    r3617176 r3736444  
    9595                                        return true;
    9696                                }
     97                        }
     98
     99                        // The Member Review widget renders in any sidebar, not only on BuddyPress pages.
     100                        if ( is_active_widget( false, false, 'bupr_members_review_setting', true ) ) {
     101                                return true;
    97102                        }
    98103
  • bp-user-profile-reviews/trunk/includes/bupr-shortcodes.php

    r3617176 r3736444  
    9292                                        FROM {$wpdb->usermeta}
    9393                                        WHERE meta_key = %s
     94                                        AND CAST(meta_value AS DECIMAL(10,2)) > 0
    9495                                        ORDER BY CAST(meta_value AS DECIMAL(10,2)) DESC
    9596                                        LIMIT %d",
    … …  
    118119                                        $review_count     = apply_filters( 'bupr_shortcode_review_count', ( ! empty( $review_count ) ? $review_count : 0 ), $user_id );
    119120
    120                                         // Get user profile link using bp_core_get_user_domain() which works across all BP versions.
    121                                         $user_domain     = function_exists( 'bp_core_get_user_domain' ) ? bp_core_get_user_domain( $user_id ) : '';
    122                                         $user_nicename  = get_the_author_meta( 'user_nicename', $user_id );
    123                                         $profile_url    = ! empty( $user_domain ) ? $user_domain : home_url( '/members/' . $user_nicename . '/' );
     121                                        $profile_url = bupr_member_url( $user_id );
    124122
    125123                                        // Get global settings for review tab URL.
    … …  
    134132                                        }
    135133                                        $output .= '<div class="bupr-content-widget">';
    136                                         $display_name   = bp_core_get_username( $user_id );
     134                                        // Display name, never the login (a login is half of a member's credentials).
     135                                        $display_name   = bp_core_get_user_displayname( $user_id );
    137136                                        $members_profile = '<a href="' . esc_url( $profile_url ) . '">' . esc_html( $display_name ) . '</a>';
    138137                                        $output .= '<div class="bupr-member-title">' . wp_kses_post( $members_profile ) . '</div>';
    … …  
    173172                                         * @since 3.8.0
    174173                                         * @param string $label The item type label. Default 'reviews'.
     174                                         * @param int    $count Review count, for choosing singular or plural (since 3.8.1).
    175175                                         */
    176                                         $item_label = apply_filters( 'bupr_item_type_label', __( 'reviews', 'bp-member-reviews' ) );
     176                                        $item_label = apply_filters( 'bupr_item_type_label', _n( 'review', 'reviews', (int) $review_count, 'bp-member-reviews' ), (int) $review_count );
    177177
    178178                                        $aggregate_rating = round( $aggregate_rating, 2 );
    … …  
    180180
    181181                                        if ( $show_stars ) {
     182                                                $review_count_link = '<a href="' . esc_url( $reviews_url ) . '" class="bupr-review-count-link">' . esc_html( $review_count ) . '</a>';
    182183                                                /* translators: %1$s: rating; %2$s: review count; %3$s: item type label */
    183                                                 $review_count_link = '<a href="' . esc_url( $reviews_url ) . '" class="bupr-review-count-link">' . esc_html( $review_count ) . '</a>';
    184184                                                $output .= apply_filters( 'bupr_shortcode_rating_text', sprintf( esc_html__( 'Rating: %1$s/5 (%2$s %3$s)', 'bp-member-reviews' ), esc_html( $aggregate_rating ), $review_count_link, esc_html( $item_label ) ), $user_id, $aggregate_rating, $review_count );
    185185                                        } else {
     186                                                $review_count_link = '<a href="' . esc_url( $reviews_url ) . '" class="bupr-review-count-link">' . esc_html( $review_count ) . '</a>';
    186187                                                /* translators: %1$s: review count; %2$s: item type label */
    187                                                 $review_count_link = '<a href="' . esc_url( $reviews_url ) . '" class="bupr-review-count-link">' . esc_html( $review_count ) . '</a>';
    188188                                                $output .= apply_filters( 'bupr_shortcode_count_text', sprintf( esc_html__( '%1$s %2$s', 'bp-member-reviews' ), $review_count_link, esc_html( $item_label ) ), $user_id, $review_count );
    189189                                        }
    … …  
    275275                        $member_args = array(
    276276                                'post_type'      => 'review',
    277                                 'posts_per_page' => -1,
     277                                // Only this author's own review of the member is needed.
     278                                'posts_per_page' => 1,
     279                                'no_found_rows'  => true,
    278280                                'post_status'    => array(
    279281                                        'draft',
    … …  
    409411                                                                <?php
    410412                                                                foreach ( $bupr_member as $user ) {
    411                                                                         if ( is_array( $bupr['add_taken_members'] ) && ! empty( $bupr['add_taken_members'] ) && isset( $user['member_roles'][0] ) && in_array( $user['member_roles'][0], $bupr['add_taken_members'], true ) ) {
     413                                                                        if ( bupr_roles_allow_review( get_current_user_id(), $user['member_id'] ) ) {
    412414                                                                                echo '<option value="' . esc_attr( $user['member_id'] ) . '">' . esc_attr( $user['member_name'] ) . '</option>';
    413415                                                                        }
  • bp-user-profile-reviews/trunk/includes/class-buprglobals.php

    r3617176 r3736444  
    8080                        $enable_flagging      = $bupr_general_settings['bupr_enable_flagging'] ?? 'yes';       // Default to 'yes'.
    8181                        $flag_threshold       = $bupr_general_settings['bupr_flag_threshold'] ?? 5;            // Default to 5.
     82                        $flag_threshold       = is_numeric( $flag_threshold ) ? $flag_threshold : 5;           // A blank save must not disable auto-hide.
    8283
    8384                        /**
  • bp-user-profile-reviews/trunk/includes/templates/bupr-reviews-tab-template.php

    r3617176 r3736444  
    295295                                                                        </div>
    296296                                                                </div>
    297                                                                 <?php
    298                                                                 // Owner Reply Section - only show if enabled in settings.
    299                                                                 $owner_replies_enabled = isset( $bupr['enable_owner_replies'] ) ? $bupr['enable_owner_replies'] : 'yes';
    300                                                                 if ( 'yes' === $owner_replies_enabled ) :
    301                                                                         $owner_reply      = get_post_meta( get_the_ID(), 'bupr_owner_reply', true );
    302                                                                         $owner_reply_date = get_post_meta( get_the_ID(), 'bupr_owner_reply_date', true );
    303                                                                         $linked_member_id = get_post_meta( get_the_ID(), 'linked_bp_member', true );
    304                                                                         $current_user_id  = get_current_user_id();
    305                                                                         $can_reply        = ( (int) $linked_member_id === $current_user_id ) && empty( $owner_reply );
    306                                                                         ?>
    307                                                                 <div class="bupr-reply-section" data-review="<?php echo esc_attr( get_the_ID() ); ?>">
    308                                                                         <?php if ( ! empty( $owner_reply ) ) : ?>
    309                                                                                 <?php
    310                                                                                 $owner_data   = get_userdata( $linked_member_id );
    311                                                                                 $owner_name   = $owner_data ? $owner_data->display_name : __( 'Profile Owner', 'bp-member-reviews' );
    312                                                                                 $owner_avatar = bp_core_fetch_avatar(
    313                                                                                         array(
    314                                                                                                 'item_id' => $linked_member_id,
    315                                                                                                 'object'  => 'user',
    316                                                                                                 'html'    => false,
    317                                                                                         )
    318                                                                                 );
    319                                                                                 ?>
    320                                                                                 <div class="bupr-owner-reply">
    321                                                                                         <div class="bupr-reply-header">
    322                                                                                                 <img src="<?php echo esc_url( $owner_avatar ); ?>" class="avatar avatar-32" alt="<?php echo esc_attr( $owner_name ); ?>" width="32" height="32">
    323                                                                                                 <span class="bupr-reply-author"><?php echo esc_html( $owner_name ); ?></span>
    324                                                                                                 <span class="bupr-reply-badge"><?php esc_html_e( 'Owner Response', 'bp-member-reviews' ); ?></span>
    325                                                                                                 <?php if ( $owner_reply_date ) : ?>
    326                                                                                                         <span class="bupr-reply-date"><?php echo esc_html( date_i18n( get_option( 'date_format' ), $owner_reply_date ) ); ?></span>
    327                                                                                                 <?php endif; ?>
    328                                                                                         </div>
    329                                                                                         <div class="bupr-reply-content"><?php echo wp_kses_post( wpautop( $owner_reply ) ); ?></div>
    330                                                                                 </div>
    331                                                                         <?php elseif ( $can_reply ) : ?>
    332                                                                                 <div class="bupr-reply-form-wrapper">
    333                                                                                         <button type="button" class="bupr-show-reply-form button" data-review="<?php echo esc_attr( get_the_ID() ); ?>">
    334                                                                                                 <?php esc_html_e( 'Reply to this review', 'bp-member-reviews' ); ?>
    335                                                                                         </button>
    336                                                                                         <div class="bupr-reply-form" style="display: none;">
    337                                                                                                 <textarea class="bupr-reply-textarea" rows="3" placeholder="<?php esc_attr_e( 'Write your response...', 'bp-member-reviews' ); ?>"></textarea>
    338                                                                                                 <div class="bupr-reply-actions">
    339                                                                                                         <button type="button" class="bupr-submit-reply button" data-review="<?php echo esc_attr( get_the_ID() ); ?>">
    340                                                                                                                 <?php esc_html_e( 'Submit Reply', 'bp-member-reviews' ); ?>
    341                                                                                                         </button>
    342                                                                                                         <button type="button" class="bupr-cancel-reply button">
    343                                                                                                                 <?php esc_html_e( 'Cancel', 'bp-member-reviews' ); ?>
    344                                                                                                         </button>
    345                                                                                                         <span class="bupr-reply-spinner" style="display: none;"></span>
    346                                                                                                 </div>
    347                                                                                         </div>
    348                                                                                 </div>
    349                                                                         <?php endif; ?>
    350                                                                 </div>
    351                                                                 <?php endif; // End owner replies enabled check. ?>
     297                                                                <?php bupr_get_template( 'bupr-owner-reply.php', array( 'review_id' => get_the_ID() ) ); ?>
    352298                                                        </div>
    353299
    … …  
    358304                                                                ?>
    359305                                                                <div class="bupr-report-section">
     306                                                                        <?php
     307                                                                        // A member who already reported this review sees that, not a button that fails.
     308                                                                        $bupr_flags         = get_post_meta( get_the_ID(), 'bupr_flags', true );
     309                                                                        $bupr_reporter_ids  = is_array( $bupr_flags ) ? array_map( 'intval', wp_list_pluck( $bupr_flags, 'reporter_id' ) ) : array();
     310                                                                        if ( in_array( get_current_user_id(), $bupr_reporter_ids, true ) ) :
     311                                                                                ?>
     312                                                                        <span class="bupr-report-success"><span class="dashicons dashicons-yes" aria-hidden="true"></span> <?php esc_html_e( 'Reported', 'bp-member-reviews' ); ?></span>
     313                                                                        <?php else : ?>
    360314                                                                        <button type="button" class="bupr-report-button" data-review="<?php echo esc_attr( get_the_ID() ); ?>" title="<?php esc_attr_e( 'Report this review', 'bp-member-reviews' ); ?>">
    361315                                                                                <span class="dashicons dashicons-warning"></span>
    362316                                                                                <span class="bupr-report-text"><?php esc_html_e( 'Report', 'bp-member-reviews' ); ?></span>
    363317                                                                        </button>
     318                                                                        <?php endif; ?>
    364319                                                                </div>
    365320                                                        <?php endif; // End flagging enabled check. ?>
  • bp-user-profile-reviews/trunk/includes/templates/bupr-single-review-template.php

    r3617176 r3736444  
    2020
    2121        // Bail if review doesn't exist or is not a review post type.
    22         if ( ! $review || 'review' !== $review->post_type ) {
     22        // Pending and report-hidden reviews are visible only to their author and moderators,
     23        // and a review is only shown on the profile of the member it was written about.
     24        $bupr_can_see = $review && 'review' === $review->post_type
     25                && ( 'publish' === $review->post_status || get_current_user_id() === (int) $review->post_author || current_user_can( 'edit_others_posts' ) )
     26                && (int) get_post_meta( $review->ID, 'linked_bp_member', true ) === (int) bp_displayed_user_id();
     27        if ( ! $bupr_can_see ) {
    2328                echo '<p>' . esc_html__( 'Review not found.', 'bp-member-reviews' ) . '</p>';
    2429                return;
    2530        }
    26 
    27         $review_title = $review->post_title;
    28         $review_url   = get_permalink( $review_id );
    2931
    3032        $author         = $review->post_author;
    … …  
    3739        }
    3840
    39         $review_author     = $author_details->data->user_login;
    4041        $author_id         = $author_details->data->ID;
    4142        $member_profile    = bp_core_get_userlink( $author_id );
    42         $review_author_url = home_url() . '/author/' . $review_author;
    4343        $review_date_time  = $review->post_date;
    4444        $review_date       = date_i18n( 'M Y', $review_date_time );
    … …  
    8989                                        <div class="bupr-members-profiles">
    9090                                                <div class="author">
    91                                                         <img src="<?php echo esc_url( $avatar ); ?>" class="avatar user-<?php echo esc_attr( $author ); ?>-avatar avatar-128 photo" alt="Profile photo of <?php echo esc_attr( $review_author ); ?>" width="50" height="50">
     91                                                        <?php if ( 'yes' === $anonymous_post_review ) : ?>
     92                                                        <img src="<?php echo esc_url( $avatar ); ?>" class="avatar avatar-128 photo" alt="<?php esc_attr_e( 'Profile Photo', 'bp-member-reviews' ); ?>" width="50" height="50">
     93                                                        <?php else : ?>
     94                                                        <img src="<?php echo esc_url( $avatar ); ?>" class="avatar user-<?php echo esc_attr( $author ); ?>-avatar avatar-128 photo" alt="<?php echo esc_attr( sprintf( /* translators: %s: reviewer display name. */ __( 'Profile photo of %s', 'bp-member-reviews' ), $author_details->display_name ) ); ?>" width="50" height="50">
     95                                                        <?php endif; ?>
    9296                                                        <div class="reviewer">
    9397                                                                <h4>
    … …  
    245249                                        </div>
    246250                                </div>
     251                                <?php bupr_get_template( 'bupr-owner-reply.php', array( 'review_id' => $review_id ) ); ?>
    247252                </article>
    248253        </div>
  • bp-user-profile-reviews/trunk/includes/widgets/display-review.php

    r3617176 r3736444  
    8585                WHERE um1.meta_key = 'bupr_aggregate_rating'
    8686                AND um2.meta_key = 'bupr_review_count'
     87                AND CAST(um2.meta_value AS UNSIGNED) > 0
    8788                ORDER BY CAST(um1.meta_value AS DECIMAL(10,2)) DESC
    8889                LIMIT %d
    … …  
    101102                WHERE um1.meta_key = 'bupr_aggregate_rating'
    102103                AND um2.meta_key = 'bupr_review_count'
     104                AND CAST(um2.meta_value AS UNSIGNED) > 0
    103105                ORDER BY CAST(um2.meta_value AS UNSIGNED) DESC
    104106                LIMIT %d
    … …  
    143145                                 * @since 3.8.0
    144146                                 * @param string $label The item type label. Default 'reviews'.
     147                                 * @param int    $count Review count, for choosing singular or plural (since 3.8.1).
    145148                                 */
    146                                 $item_label = apply_filters( 'bupr_item_type_label', __( 'reviews', 'bp-member-reviews' ) );
     149                                $item_label = apply_filters( 'bupr_item_type_label', _n( 'review', 'reviews', (int) $review_count, 'bp-member-reviews' ), (int) $review_count );
    147150
    148151                                if ( $show_stars ) {
  • bp-user-profile-reviews/trunk/includes/widgets/member-rating.php

    r3617176 r3736444  
    120120                        $bupr_user_count = 0;
    121121                        foreach ( $final_review_arr as $bupr_key => $bupr_value ) {
    122                                 if ( $bupr_user_count === $rating_limit ) {
     122                                if ( (int) $rating_limit > 0 && $bupr_user_count >= (int) $rating_limit ) { // Saved as a string; blank or 0 means no limit.
    123123                                        break;
    124124                                } else {
    … …  
    128128
    129129                                        echo '<li class="vcard"><div class="item-avatar">';
    130                                         echo get_avatar( $author_id, 50 );
     130                                        // An anonymous review gets the default avatar, never the reviewer's own.
     131                                        echo get_avatar( 'yes' === $user_anonymous_review ? 0 : $author_id, 50 );
    131132                                        echo '</div><div class="item"><div class="item-title">';
    132133                                        echo ( 'yes' !== $user_anonymous_review ) ? wp_kses_post( $members_profile ) : esc_html__( 'Anonymous', 'bp-member-reviews' );
  • bp-user-profile-reviews/trunk/languages/bp-member-reviews.pot

    r3617176 r3736444  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Wbcom Designs - BuddyPress Member Reviews 3.8.0\n"
     5"Project-Id-Version: Wbcom Designs - BuddyPress Member Reviews 3.8.1\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/buddypress-member-review\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-07-21T10:46:16+00:00\n"
     12"POT-Creation-Date: 2026-10-07T12:47:46+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
    … …  
    4040msgstr ""
    4141
    42 #: admin/bupr-admin.php:75
    43 #: includes/widgets/member-rating.php:208
     42#: admin/bupr-admin.php:76
     43#: includes/widgets/member-rating.php:209
    4444msgid "Member Ratings"
    4545msgstr ""
    4646
    47 #: admin/bupr-admin.php:193
     47#: admin/bupr-admin.php:194
     48#: admin/bupr-admin.php:196
     49#: admin/bupr-admin.php:197
     50#: admin/tab-templates/bupr-setting-general-tab.php:275
     51#: includes/bupr-general-functions.php:127
     52#: includes/class-buprglobals.php:88
     53msgid "Reviews"
     54msgstr ""
     55
    4856#: admin/bupr-admin.php:195
    49 #: admin/bupr-admin.php:196
    50 #: admin/tab-templates/bupr-setting-general-tab.php:277
    51 #: includes/bupr-general-functions.php:127
     57#: includes/bupr-general-functions.php:114
     58#: includes/bupr-notification.php:61
    5259#: includes/class-buprglobals.php:87
    53 msgid "Reviews"
    54 msgstr ""
    55 
    56 #: admin/bupr-admin.php:194
    57 #: includes/bupr-filters.php:772
    58 #: includes/bupr-general-functions.php:114
    59 #: includes/class-buprglobals.php:86
    6060msgid "Review"
    6161msgstr ""
    6262
    63 #: admin/bupr-admin.php:197
    6463#: admin/bupr-admin.php:198
     64#: admin/bupr-admin.php:199
    6565msgid "Add New Review"
    6666msgstr ""
    6767
    68 #: admin/bupr-admin.php:199
     68#: admin/bupr-admin.php:200
    6969msgid "New Review"
    7070msgstr ""
    7171
    72 #: admin/bupr-admin.php:200
     72#: admin/bupr-admin.php:201
    7373msgid "View Reviews"
    7474msgstr ""
    7575
    76 #: admin/bupr-admin.php:201
     76#: admin/bupr-admin.php:202
    7777msgid "All Reviews"
    7878msgstr ""
    7979
    80 #: admin/bupr-admin.php:202
     80#: admin/bupr-admin.php:203
    8181msgid "Search Reviews"
    8282msgstr ""
    8383
    84 #: admin/bupr-admin.php:203
     84#: admin/bupr-admin.php:204
    8585msgid "Parent Review:"
    8686msgstr ""
    8787
    88 #: admin/bupr-admin.php:204
     88#: admin/bupr-admin.php:205
    8989msgid "No Review Found"
    9090msgstr ""
    9191
    92 #: admin/bupr-admin.php:205
     92#: admin/bupr-admin.php:206
    9393msgid "No Review Found In Trash"
    9494msgstr ""
    9595
    96 #: admin/bupr-admin.php:301
     96#: admin/bupr-admin.php:335
    9797msgctxt "taxonomy general name"
    9898msgid "Reviews Category"
    9999msgstr ""
    100100
    101 #: admin/bupr-admin.php:302
     101#: admin/bupr-admin.php:336
    102102msgctxt "taxonomy singular name"
    103103msgid "Review Category"
    104104msgstr ""
    105105
    106 #: admin/bupr-admin.php:303
     106#: admin/bupr-admin.php:337
    107107msgid "Search Categories"
    108108msgstr ""
    109109
    110 #: admin/bupr-admin.php:304
     110#: admin/bupr-admin.php:338
    111111msgid "All Categories"
    112112msgstr ""
    113113
    114 #: admin/bupr-admin.php:305
     114#: admin/bupr-admin.php:339
    115115msgid "Parent Category"
    116116msgstr ""
    117117
    118 #: admin/bupr-admin.php:306
     118#: admin/bupr-admin.php:340
    119119msgid "Parent Category:"
    120120msgstr ""
    121121
    122 #: admin/bupr-admin.php:307
     122#: admin/bupr-admin.php:341
    123123msgid "Edit Category"
    124124msgstr ""
    125125
    126 #: admin/bupr-admin.php:308
     126#: admin/bupr-admin.php:342
    127127msgid "Update Category"
    128128msgstr ""
    129129
    130 #: admin/bupr-admin.php:309
     130#: admin/bupr-admin.php:343
    131131msgid "Add Category"
    132132msgstr ""
    133133
    134 #: admin/bupr-admin.php:310
     134#: admin/bupr-admin.php:344
    135135msgid "New Category Name"
    136136msgstr ""
    137137
    138 #: admin/bupr-admin.php:311
     138#: admin/bupr-admin.php:345
    139139msgid "Category"
    140140msgstr ""
    141141
    142 #: admin/bupr-admin.php:360
    143 #: includes/bupr-ajax.php:228
    144 #: includes/bupr-filters.php:1067
    145 #: includes/bupr-filters.php:1166
    146 #: includes/bupr-notification.php:65
     142#: admin/bupr-admin.php:408
     143#: includes/bupr-ajax.php:233
     144#: includes/bupr-filters.php:781
     145#: includes/bupr-filters.php:887
     146#: includes/bupr-notification.php:97
    147147msgid "An anonymous user"
    148148msgstr ""
    … …  
    150150#. translators: 1: User display name, 2: Review tab name (singular).
    151151#. translators: 1: Reviewed member's display name. 2: Singular review label (e.g. "review").
    152 #: admin/bupr-admin.php:366
    153 #: includes/bupr-ajax.php:234
    154 #: includes/bupr-ajax.php:411
    155 #: includes/bupr-scripts.php:195
     152#: admin/bupr-admin.php:414
     153#: includes/bupr-ajax.php:239
     154#: includes/bupr-ajax.php:421
     155#: includes/bupr-scripts.php:200
    156156#, php-format
    157157msgid "%1$s received a %2$s"
    158158msgstr ""
    159159
    160 #: admin/bupr-admin.php:382
    161 #: includes/bupr-ajax.php:420
     160#: admin/bupr-admin.php:422
     161#: includes/bupr-ajax.php:430
    162162msgid "New Review on Your Profile at [site-name]"
    163163msgstr ""
    164164
    165165#. translators: [user-name], [reviewer-name], [review-link] and [site-name] are tokens replaced at send time - keep them verbatim.
    166 #: admin/bupr-admin.php:393
    167 #: includes/bupr-ajax.php:426
     166#: admin/bupr-admin.php:433
     167#: includes/bupr-ajax.php:436
    168168msgid "Hello [user-name], <br><br>We are pleased to inform you that [reviewer-name] has recently reviewed your profile.<br><br>To view the review, simply click on the link below:<br>[review-link]<br><br>Best regards,<br>The [site-name] Team"
    169169msgstr ""
    170170
    171 #: admin/bupr-admin.php:453
    172 #: admin/tab-templates/bupr-setting-general-tab.php:420
     171#: admin/bupr-admin.php:493
     172#: admin/tab-templates/bupr-setting-general-tab.php:418
    173173msgid "Reports"
    174174msgstr ""
    175175
    176 #: admin/bupr-admin.php:482
    177 #: admin/bupr-admin.php:621
     176#: admin/bupr-admin.php:522
     177#: admin/bupr-admin.php:688
    178178msgid "Resolved"
    179179msgstr ""
    180180
    181 #: admin/bupr-admin.php:484
    182 #: admin/bupr-admin.php:624
     181#: admin/bupr-admin.php:524
     182#: admin/bupr-admin.php:691
    183183msgid "Dismissed"
    184184msgstr ""
    185185
    186 #: admin/bupr-admin.php:491
     186#. translators: %s: date and time the review was hidden.
     187#: admin/bupr-admin.php:533
     188#, php-format
     189msgid "Hidden on %s"
     190msgstr ""
     191
     192#: admin/bupr-admin.php:534
     193#: admin/bupr-admin.php:594
     194msgid "Auto-hidden"
     195msgstr ""
     196
     197#: admin/bupr-admin.php:542
    187198msgid "report"
    188199msgid_plural "reports"
    … …  
    190201msgstr[1] ""
    191202
    192 #: admin/bupr-admin.php:521
    193 #: includes/admin/views/overview.php:105
    194 #: includes/bupr-scripts.php:200
     203#: admin/bupr-admin.php:572
     204#: includes/admin/views/overview.php:94
     205#: includes/bupr-scripts.php:205
     206#: includes/templates/bupr-reviews-tab-template.php:312
    195207msgid "Reported"
    196208msgstr ""
    197209
    198 #: admin/bupr-admin.php:590
     210#: admin/bupr-admin.php:657
    199211msgid "Report Details"
    200212msgstr ""
    201213
    202 #: admin/bupr-admin.php:610
     214#: admin/bupr-admin.php:677
    203215msgid "No reports for this review."
    204216msgstr ""
    205217
    206 #: admin/bupr-admin.php:615
     218#: admin/bupr-admin.php:682
    207219msgid "Status:"
    208220msgstr ""
    209221
    210 #: admin/bupr-admin.php:618
     222#: admin/bupr-admin.php:685
    211223msgid "Pending Review"
    212224msgstr ""
    213225
    214 #: admin/bupr-admin.php:627
     226#: admin/bupr-admin.php:694
    215227msgid "None"
    216228msgstr ""
    217229
    218 #: admin/bupr-admin.php:631
     230#: admin/bupr-admin.php:698
    219231msgid "Total Reports:"
    220232msgstr ""
    221233
    222 #: admin/bupr-admin.php:636
     234#: admin/bupr-admin.php:703
    223235msgid "Unknown"
    224236msgstr ""
    225237
    226 #: admin/bupr-admin.php:641
     238#: admin/bupr-admin.php:708
    227239msgid "By:"
    228240msgstr ""
    229241
    230 #: admin/bupr-admin.php:671
    231 #: admin/bupr-admin.php:687
     242#: admin/bupr-admin.php:738
     243#: admin/bupr-admin.php:754
    232244msgid "Dismiss Reports"
    233245msgstr ""
    234246
    235 #: admin/bupr-admin.php:672
     247#: admin/bupr-admin.php:739
    236248msgid "Mark Resolved"
    237249msgstr ""
    238250
    239 #: admin/bupr-admin.php:688
     251#: admin/bupr-admin.php:755
    240252msgid "Resolve Reports"
    241253msgstr ""
    242254
    243255#. translators: %d: Number of reviews updated
    244 #: admin/bupr-admin.php:734
     256#: admin/bupr-admin.php:805
    245257#, php-format
    246258msgid "%d review report status updated."
    … …  
    249261msgstr[1] ""
    250262
    251 #: admin/bupr-admin.php:745
     263#: admin/bupr-admin.php:816
    252264msgid "Review reports have been dismissed."
    253265msgstr ""
    254266
    255 #: admin/bupr-admin.php:754
     267#: admin/bupr-admin.php:825
    256268msgid "Review reports have been marked as resolved."
    257269msgstr ""
    258270
    259 #: admin/bupr-admin.php:769
    260 #: admin/bupr-admin.php:810
     271#: admin/bupr-admin.php:870
     272#: admin/bupr-admin.php:911
    261273msgid "Security check failed."
    262274msgstr ""
    263275
    264 #: admin/bupr-admin.php:774
    265 #: admin/bupr-admin.php:815
     276#: admin/bupr-admin.php:876
     277#: admin/bupr-admin.php:917
    266278msgid "You do not have permission to perform this action."
    267279msgstr ""
    268280
    269 #: admin/bupr-admin.php:780
    270 #: admin/bupr-admin.php:821
     281#: admin/bupr-admin.php:882
     282#: admin/bupr-admin.php:923
    271283msgid "Invalid review."
    272284msgstr ""
    … …  
    353365
    354366#: admin/tab-templates/bupr-setting-criteria-tab.php:31
    355 #: admin/tab-templates/bupr-setting-criteria-tab.php:79
     367#: admin/tab-templates/bupr-setting-criteria-tab.php:78
    356368msgid "Review Criteria"
    357369msgstr ""
    … …  
    361373msgstr ""
    362374
    363 #. translators: 1: Current mode label, 2: Link to Add-ons tab
     375#. translators: %s: Current mode label
    364376#: admin/tab-templates/bupr-setting-criteria-tab.php:43
    365377#, php-format
    366 msgid "Rating criteria are only used in Star Ratings mode. You are currently using %1$s mode. To manage criteria, switch to Star Ratings mode in the %2$s tab."
    367 msgstr ""
    368 
    369 #: admin/tab-templates/bupr-setting-criteria-tab.php:45
    370 msgid "Add-ons"
    371 msgstr ""
    372 
    373 #: admin/tab-templates/bupr-setting-criteria-tab.php:87
     378msgid "Rating criteria are only used in Star Ratings mode. You are currently using %s mode. To manage criteria, switch to Star Ratings mode in the Member Reviews Pro settings."
     379msgstr ""
     380
     381#: admin/tab-templates/bupr-setting-criteria-tab.php:86
    374382msgid "Multiple Criteria"
    375383msgstr ""
    376384
    377 #: admin/tab-templates/bupr-setting-criteria-tab.php:89
     385#: admin/tab-templates/bupr-setting-criteria-tab.php:88
    378386msgid "Rate members by multiple criteria (e.g., Communication, Skills) instead of a single overall rating."
    379387msgstr ""
    380388
    381 #: admin/tab-templates/bupr-setting-criteria-tab.php:114
    382 #: includes/bupr-scripts.php:269
     389#: admin/tab-templates/bupr-setting-criteria-tab.php:113
     390#: includes/bupr-scripts.php:274
    383391msgid "Review criteria name"
    384392msgstr ""
    385393
    386 #: admin/tab-templates/bupr-setting-criteria-tab.php:119
    387 msgid "Delete"
    388 msgstr ""
    389 
    390 #: admin/tab-templates/bupr-setting-criteria-tab.php:119
    391 msgid "Delete this review criteria"
     394#: admin/tab-templates/bupr-setting-criteria-tab.php:118
     395#: includes/bupr-scripts.php:275
     396msgid "Remove"
     397msgstr ""
     398
     399#: admin/tab-templates/bupr-setting-criteria-tab.php:118
     400#: includes/bupr-scripts.php:276
     401msgid "Remove this review criteria"
     402msgstr ""
     403
     404#: admin/tab-templates/bupr-setting-criteria-tab.php:132
     405msgid "Add Criteria"
     406msgstr ""
     407
     408#: admin/tab-templates/bupr-setting-criteria-tab.php:132
     409msgid "Add a new review criteria"
    392410msgstr ""
    393411
    394412#: admin/tab-templates/bupr-setting-criteria-tab.php:133
    395 msgid "Add Criteria"
    396 msgstr ""
    397 
    398 #: admin/tab-templates/bupr-setting-criteria-tab.php:133
    399 msgid "Add a new review criteria"
    400 msgstr ""
    401 
    402 #: admin/tab-templates/bupr-setting-criteria-tab.php:134
    403 msgid "This option allows you to add multiple rating criteria. By default, no criteria are shown until you activate them."
     413msgid "This option allows you to add multiple rating criteria. By default, no criteria are shown until you activate them. With no criteria, reviews are text only and have no stars."
    404414msgstr ""
    405415
    … …  
    408418msgstr ""
    409419
    410 #: admin/tab-templates/bupr-setting-display-tab.php:18
    411 msgid "Note"
    412 msgstr ""
    413 
    414 #: admin/tab-templates/bupr-setting-display-tab.php:19
    415 msgid "This setting is applicable only if you have added a criterion for review."
     420#: admin/tab-templates/bupr-setting-display-tab.php:28
     421msgid "Review Label"
    416422msgstr ""
    417423
    418424#: admin/tab-templates/bupr-setting-display-tab.php:31
    419 msgid "Review Label"
    420 msgstr ""
    421 
    422 #: admin/tab-templates/bupr-setting-display-tab.php:34
    423425msgid "Label used in the profile tab and review form."
    424426msgstr ""
    425427
     428#: admin/tab-templates/bupr-setting-display-tab.php:41
     429msgid "Reviews Label (Plural)"
     430msgstr ""
     431
    426432#: admin/tab-templates/bupr-setting-display-tab.php:44
    427 msgid "Reviews Label (Plural)"
    428 msgstr ""
    429 
    430 #: admin/tab-templates/bupr-setting-display-tab.php:47
    431433msgid "Plural form of the review label."
    432434msgstr ""
    433435
    434 #: admin/tab-templates/bupr-setting-display-tab.php:56
     436#: admin/tab-templates/bupr-setting-display-tab.php:53
    435437msgid "Colors"
    436438msgstr ""
    437439
     440#: admin/tab-templates/bupr-setting-display-tab.php:59
     441msgid "Rating Color"
     442msgstr ""
     443
    438444#: admin/tab-templates/bupr-setting-display-tab.php:62
    439 msgid "Rating Color"
    440 msgstr ""
    441 
    442 #: admin/tab-templates/bupr-setting-display-tab.php:65
    443445msgid "This option allows you to change the star rating color."
    444446msgstr ""
    … …  
    485487#. translators: [site-name] is a token replaced at send time - keep it verbatim.
    486488#: admin/tab-templates/bupr-setting-general-tab.php:54
    487 #: includes/bupr-ajax.php:450
     489#: includes/bupr-ajax.php:460
    488490msgid "A New Review Requires Your Approval on [site-name]"
    489491msgstr ""
    490492
    491493#: admin/tab-templates/bupr-setting-general-tab.php:63
    492 #: includes/admin/views/overview.php:194
     494#: includes/admin/views/overview.php:212
    493495msgid "General Settings"
    494496msgstr ""
    … …  
    510512msgstr ""
    511513
    512 #: admin/tab-templates/bupr-setting-general-tab.php:105
     514#: admin/tab-templates/bupr-setting-general-tab.php:106
    513515msgid "Auto Approve Reviews"
    514516msgstr ""
    515517
    516 #: admin/tab-templates/bupr-setting-general-tab.php:108
     518#: admin/tab-templates/bupr-setting-general-tab.php:109
    517519msgid "Automatically approve reviews without requiring manual approval."
    518520msgstr ""
    519521
    520 #: admin/tab-templates/bupr-setting-general-tab.php:124
     522#: admin/tab-templates/bupr-setting-general-tab.php:125
    521523msgid "Member Directory Ratings"
    522524msgstr ""
    523525
    524 #: admin/tab-templates/bupr-setting-general-tab.php:127
     526#: admin/tab-templates/bupr-setting-general-tab.php:128
    525527msgid "Display member ratings on the member directory page."
    526528msgstr ""
    527529
    528 #: admin/tab-templates/bupr-setting-general-tab.php:143
     530#: admin/tab-templates/bupr-setting-general-tab.php:144
    529531msgid "Email Notifications"
    530532msgstr ""
    531533
    532 #: admin/tab-templates/bupr-setting-general-tab.php:146
     534#: admin/tab-templates/bupr-setting-general-tab.php:147
    533535msgid "Send an email notification to members when someone reviews their profile."
    534536msgstr ""
    535537
    536 #: admin/tab-templates/bupr-setting-general-tab.php:162
     538#: admin/tab-templates/bupr-setting-general-tab.php:163
    537539msgid "Email Subject"
    538540msgstr ""
    539541
    540 #: admin/tab-templates/bupr-setting-general-tab.php:164
     542#: admin/tab-templates/bupr-setting-general-tab.php:165
    541543msgid "Enter the subject line for review notification emails."
    542544msgstr ""
    543545
    544 #: admin/tab-templates/bupr-setting-general-tab.php:167
     546#: admin/tab-templates/bupr-setting-general-tab.php:168
    545547msgid "Please enter review email subject."
    546548msgstr ""
    547549
    548 #: admin/tab-templates/bupr-setting-general-tab.php:173
     550#: admin/tab-templates/bupr-setting-general-tab.php:174
    549551msgid "Email Message"
    550552msgstr ""
    551553
    552 #: admin/tab-templates/bupr-setting-general-tab.php:175
     554#: admin/tab-templates/bupr-setting-general-tab.php:176
    553555msgid "Enter the message content for review notification emails."
    554556msgstr ""
    555557
    556 #: admin/tab-templates/bupr-setting-general-tab.php:198
     558#: admin/tab-templates/bupr-setting-general-tab.php:199
    557559msgid "Approval Email Subject"
    558560msgstr ""
    559561
    560 #: admin/tab-templates/bupr-setting-general-tab.php:200
     562#: admin/tab-templates/bupr-setting-general-tab.php:201
    561563msgid "Enter the subject line for review approval notification emails."
    562564msgstr ""
    563565
    564 #: admin/tab-templates/bupr-setting-general-tab.php:203
     566#: admin/tab-templates/bupr-setting-general-tab.php:204
    565567msgid "Please enter review approval email subject."
    566568msgstr ""
    567569
    568 #: admin/tab-templates/bupr-setting-general-tab.php:209
     570#: admin/tab-templates/bupr-setting-general-tab.php:210
    569571msgid "Approval Email Message"
    570572msgstr ""
    571573
    572 #: admin/tab-templates/bupr-setting-general-tab.php:211
     574#: admin/tab-templates/bupr-setting-general-tab.php:212
    573575msgid "Enter the message content for review approval notification emails."
    574576msgstr ""
    575577
    576 #: admin/tab-templates/bupr-setting-general-tab.php:233
     578#: admin/tab-templates/bupr-setting-general-tab.php:231
    577579msgid "BuddyPress Notifications"
    578580msgstr ""
    579581
    580 #: admin/tab-templates/bupr-setting-general-tab.php:236
     582#: admin/tab-templates/bupr-setting-general-tab.php:234
    581583msgid "Notify members through BuddyPress when they receive a new review."
    582584msgstr ""
    583585
    584 #: admin/tab-templates/bupr-setting-general-tab.php:252
     586#: admin/tab-templates/bupr-setting-general-tab.php:250
    585587msgid "Update Review"
    586588msgstr ""
    587589
    588 #: admin/tab-templates/bupr-setting-general-tab.php:255
     590#: admin/tab-templates/bupr-setting-general-tab.php:253
    589591msgid "Allow members to update or modify their reviews."
    590592msgstr ""
    591593
     594#: admin/tab-templates/bupr-setting-general-tab.php:269
     595msgid "Reviews Per Page"
     596msgstr ""
     597
    592598#: admin/tab-templates/bupr-setting-general-tab.php:271
    593 msgid "Reviews Per Page"
    594 msgstr ""
    595 
    596 #: admin/tab-templates/bupr-setting-general-tab.php:273
    597599msgid "Number of reviews to display per page."
    598600msgstr ""
    599601
     602#: admin/tab-templates/bupr-setting-general-tab.php:281
     603msgid "Reviewer Roles"
     604msgstr ""
     605
    600606#: admin/tab-templates/bupr-setting-general-tab.php:283
    601 msgid "Reviewer Roles"
    602 msgstr ""
    603 
    604 #: admin/tab-templates/bupr-setting-general-tab.php:285
    605 msgid "Select user roles that can submit reviews."
     607msgid "Select user roles that can submit reviews. A member with any of the selected roles can. An empty list allows every role."
     608msgstr ""
     609
     610#: admin/tab-templates/bupr-setting-general-tab.php:314
     611msgid "Reviewee Roles"
    606612msgstr ""
    607613
    608614#: admin/tab-templates/bupr-setting-general-tab.php:316
    609 msgid "Reviewee Roles"
    610 msgstr ""
    611 
    612 #: admin/tab-templates/bupr-setting-general-tab.php:318
    613 msgid "Select user roles that can receive reviews."
     615msgid "Select user roles that can receive reviews. A member with any of the selected roles can. An empty list allows every role."
     616msgstr ""
     617
     618#: admin/tab-templates/bupr-setting-general-tab.php:349
     619msgid "Anonymous Reviews"
    614620msgstr ""
    615621
    616622#: admin/tab-templates/bupr-setting-general-tab.php:351
    617 msgid "Anonymous Reviews"
    618 msgstr ""
    619 
    620 #: admin/tab-templates/bupr-setting-general-tab.php:353
    621623msgid "Allow users to submit reviews anonymously."
    622624msgstr ""
    623625
     626#: admin/tab-templates/bupr-setting-general-tab.php:363
     627msgid "Activity Stream"
     628msgstr ""
     629
    624630#: admin/tab-templates/bupr-setting-general-tab.php:365
    625 msgid "Activity Stream"
    626 msgstr ""
    627 
    628 #: admin/tab-templates/bupr-setting-general-tab.php:367
    629631msgid "Post reviews to the BuddyPress activity stream."
    630632msgstr ""
    631633
     634#: admin/tab-templates/bupr-setting-general-tab.php:379
     635msgid "Owner Replies"
     636msgstr ""
     637
    632638#: admin/tab-templates/bupr-setting-general-tab.php:381
    633 msgid "Owner Replies"
    634 msgstr ""
    635 
    636 #: admin/tab-templates/bupr-setting-general-tab.php:383
    637639msgid "Allow profile owners to respond once to each review they receive."
    638640msgstr ""
    639641
     642#: admin/tab-templates/bupr-setting-general-tab.php:396
     643msgid "Review Reporting"
     644msgstr ""
     645
    640646#: admin/tab-templates/bupr-setting-general-tab.php:398
    641 msgid "Review Reporting"
    642 msgstr ""
    643 
    644 #: admin/tab-templates/bupr-setting-general-tab.php:400
    645647msgid "Allow users to report inappropriate reviews for admin moderation."
    646648msgstr ""
    647649
     650#: admin/tab-templates/bupr-setting-general-tab.php:412
     651msgid "Auto-Hide Threshold"
     652msgstr ""
     653
    648654#: admin/tab-templates/bupr-setting-general-tab.php:414
    649 msgid "Auto-Hide Threshold"
    650 msgstr ""
    651 
    652 #: admin/tab-templates/bupr-setting-general-tab.php:416
    653655msgid "Automatically hide reviews after this many reports. Set to 0 to disable."
    654656msgstr ""
    … …  
    726728msgstr ""
    727729
    728 #: includes/admin/class-bupr-admin-panel.php:386
     730#: includes/admin/class-bupr-admin-panel.php:409
    729731msgid "Settings saved."
    730732msgstr ""
    731733
    732 #: includes/admin/class-bupr-admin-panel.php:387
     734#: includes/admin/class-bupr-admin-panel.php:410
    733735msgid "Are you sure? This cannot be undone."
    734736msgstr ""
    735737
    736 #: includes/admin/class-bupr-admin-panel.php:388
     738#: includes/admin/class-bupr-admin-panel.php:411
    737739msgid "Continue"
    738740msgstr ""
    739741
    740 #: includes/admin/class-bupr-admin-panel.php:389
    741 #: includes/templates/bupr-reviews-tab-template.php:343
    742 #: includes/templates/bupr-reviews-tab-template.php:452
     742#: includes/admin/class-bupr-admin-panel.php:412
     743#: includes/templates/bupr-owner-reply.php:62
     744#: includes/templates/bupr-reviews-tab-template.php:407
    743745msgid "Cancel"
    744746msgstr ""
    … …  
    834836msgstr ""
    835837
    836 #: includes/admin/views/overview.php:73
     838#: includes/admin/views/overview.php:62
    837839msgid "Reported reviews need attention."
    838840msgstr ""
    839841
    840842#. translators: %d: number of reported reviews
    841 #: includes/admin/views/overview.php:78
     843#: includes/admin/views/overview.php:67
    842844#, php-format
    843845msgid "%d review has been reported and is awaiting moderation."
    … …  
    846848msgstr[1] ""
    847849
    848 #: includes/admin/views/overview.php:83
     850#: includes/admin/views/overview.php:72
    849851msgid "Review now"
    850852msgstr ""
    851853
    852 #: includes/admin/views/overview.php:90
     854#: includes/admin/views/overview.php:79
    853855msgid "Published Reviews"
    854856msgstr ""
    855857
    856 #: includes/admin/views/overview.php:92
     858#: includes/admin/views/overview.php:81
    857859msgid "Live reviews across all profiles"
    858860msgstr ""
    859861
    860 #: includes/admin/views/overview.php:95
     862#: includes/admin/views/overview.php:84
    861863msgid "Pending Approval"
    862864msgstr ""
    863865
    864 #: includes/admin/views/overview.php:97
     866#: includes/admin/views/overview.php:86
    865867msgid "Drafts awaiting moderation"
    866868msgstr ""
    867869
    868 #: includes/admin/views/overview.php:100
     870#: includes/admin/views/overview.php:89
    869871msgid "Members Reviewed"
    870872msgstr ""
    871873
    872 #: includes/admin/views/overview.php:102
     874#: includes/admin/views/overview.php:91
    873875msgid "Profiles with at least one review"
    874876msgstr ""
    875877
    876 #: includes/admin/views/overview.php:107
     878#. translators: %d: number of reviews hidden by the report threshold
     879#: includes/admin/views/overview.php:113
     880#, php-format
     881msgid "%d hidden automatically"
     882msgid_plural "%d hidden automatically"
     883msgstr[0] ""
     884msgstr[1] ""
     885
     886#: includes/admin/views/overview.php:119
    877887msgid "Reviews flagged for moderation"
    878888msgstr ""
    879889
    880 #: includes/admin/views/overview.php:113
     890#: includes/admin/views/overview.php:128
    881891msgid "Current Configuration"
    882892msgstr ""
    883893
    884 #: includes/admin/views/overview.php:114
     894#: includes/admin/views/overview.php:129
    885895msgid "What happens right now when a member reviews someone on this site."
    886896msgstr ""
    887897
    888 #: includes/admin/views/overview.php:118
     898#: includes/admin/views/overview.php:133
    889899msgid "Review approval"
    890900msgstr ""
    891901
    892 #: includes/admin/views/overview.php:121
     902#: includes/admin/views/overview.php:136
    893903msgid "Automatic: reviews publish immediately"
    894904msgstr ""
    895905
    896 #: includes/admin/views/overview.php:123
     906#: includes/admin/views/overview.php:138
    897907msgid "Manual: reviews wait for admin approval"
    898908msgstr ""
    899909
    900 #: includes/admin/views/overview.php:128
     910#: includes/admin/views/overview.php:143
    901911msgid "Email notifications"
    902912msgstr ""
    903913
    904 #: includes/admin/views/overview.php:131
     914#: includes/admin/views/overview.php:146
    905915msgid "On: members are emailed about new reviews"
    906916msgstr ""
    907917
    908 #: includes/admin/views/overview.php:133
    909 #: includes/admin/views/overview.php:144
    910 #: includes/admin/views/overview.php:155
     918#: includes/admin/views/overview.php:148
     919#: includes/admin/views/overview.php:159
     920#: includes/admin/views/overview.php:170
     921#: includes/admin/views/overview.php:181
     922#: includes/admin/views/overview.php:192
     923msgid "Off"
     924msgstr ""
     925
     926#: includes/admin/views/overview.php:149
     927#: includes/admin/views/overview.php:160
     928#: includes/admin/views/overview.php:171
     929#: includes/admin/views/overview.php:182
     930#: includes/admin/views/overview.php:193
     931msgid "Turn on"
     932msgstr ""
     933
     934#: includes/admin/views/overview.php:154
     935msgid "BuddyPress notifications"
     936msgstr ""
     937
     938#: includes/admin/views/overview.php:157
     939msgid "On: members get a notification for new reviews"
     940msgstr ""
     941
    911942#: includes/admin/views/overview.php:165
    912 #: includes/admin/views/overview.php:175
    913 msgid "Off"
    914 msgstr ""
    915 
    916 #: includes/admin/views/overview.php:134
    917 #: includes/admin/views/overview.php:145
    918 msgid "Turn on"
    919 msgstr ""
    920 
    921 #: includes/admin/views/overview.php:139
    922 msgid "BuddyPress notifications"
    923 msgstr ""
    924 
    925 #: includes/admin/views/overview.php:142
    926 msgid "On: members get a notification for new reviews"
    927 msgstr ""
    928 
    929 #: includes/admin/views/overview.php:150
    930943msgid "Anonymous reviews"
    931944msgstr ""
    932945
    933 #: includes/admin/views/overview.php:153
     946#: includes/admin/views/overview.php:168
    934947msgid "On: members can review without revealing their identity"
    935948msgstr ""
    936949
    937 #: includes/admin/views/overview.php:160
     950#: includes/admin/views/overview.php:176
    938951msgid "Owner replies"
    939952msgstr ""
    940953
    941 #: includes/admin/views/overview.php:163
     954#: includes/admin/views/overview.php:179
    942955msgid "On: profile owners can reply once to each review"
    943956msgstr ""
    944957
    945 #: includes/admin/views/overview.php:170
     958#: includes/admin/views/overview.php:187
    946959msgid "Review reporting"
    947960msgstr ""
    948961
    949 #: includes/admin/views/overview.php:173
     962#: includes/admin/views/overview.php:190
    950963msgid "On: members can report inappropriate reviews"
    951964msgstr ""
    952965
    953 #: includes/admin/views/overview.php:184
     966#: includes/admin/views/overview.php:202
    954967msgid "Quick Actions"
    955968msgstr ""
    956969
    957 #: includes/admin/views/overview.php:190
     970#: includes/admin/views/overview.php:208
    958971msgid "Manage Reviews"
    959972msgstr ""
    960973
    961 #: includes/admin/views/overview.php:198
     974#: includes/admin/views/overview.php:216
    962975msgid "Rating Criteria"
    963976msgstr ""
    … …  
    10191032msgstr ""
    10201033
    1021 #: includes/bupr-ajax.php:84
    1022 #: includes/bupr-ajax.php:159
    1023 #: includes/bupr-ajax.php:517
    1024 #: includes/bupr-ajax.php:691
    1025 #: includes/bupr-ajax.php:831
    1026 #: includes/bupr-ajax.php:964
     1034#: includes/bupr-ajax.php:82
     1035#: includes/bupr-ajax.php:158
     1036#: includes/bupr-ajax.php:527
     1037#: includes/bupr-ajax.php:712
     1038#: includes/bupr-ajax.php:864
     1039#: includes/bupr-ajax.php:998
    10271040msgid "Security verification failed."
    10281041msgstr ""
    10291042
    1030 #: includes/bupr-ajax.php:94
     1043#: includes/bupr-ajax.php:93
    10311044msgid "You do not have permission to approve reviews."
    10321045msgstr ""
    10331046
    1034 #: includes/bupr-ajax.php:105
    1035 #: includes/bupr-ajax.php:540
    1036 #: includes/bupr-ajax.php:713
    1037 #: includes/bupr-ajax.php:843
    1038 #: includes/bupr-ajax.php:987
     1047#: includes/bupr-ajax.php:104
     1048#: includes/bupr-ajax.php:550
     1049#: includes/bupr-ajax.php:734
     1050#: includes/bupr-ajax.php:876
     1051#: includes/bupr-ajax.php:1021
    10391052msgid "Invalid review ID."
    10401053msgstr ""
    10411054
    1042 #: includes/bupr-ajax.php:116
    1043 #: includes/bupr-ajax.php:552
    1044 #: includes/bupr-ajax.php:725
    1045 #: includes/bupr-ajax.php:855
    1046 #: includes/bupr-ajax.php:999
    1047 #: includes/templates/bupr-single-review-template.php:23
     1055#: includes/bupr-ajax.php:115
     1056#: includes/bupr-ajax.php:562
     1057#: includes/bupr-ajax.php:746
     1058#: includes/bupr-ajax.php:889
     1059#: includes/bupr-ajax.php:1033
     1060#: includes/templates/bupr-single-review-template.php:28
    10481061msgid "Review not found."
    10491062msgstr ""
    10501063
    1051 #: includes/bupr-ajax.php:143
     1064#: includes/bupr-ajax.php:142
    10521065msgid "Review approved successfully."
    10531066msgstr ""
    10541067
    1055 #: includes/bupr-ajax.php:169
    1056 #: includes/bupr-ajax.php:528
    1057 #: includes/bupr-ajax.php:701
     1068#: includes/bupr-ajax.php:168
     1069#: includes/bupr-ajax.php:538
     1070#: includes/bupr-ajax.php:722
    10581071msgid "Invalid request."
    10591072msgstr ""
    10601073
    1061 #: includes/bupr-ajax.php:198
     1074#: includes/bupr-ajax.php:197
    10621075msgid "You must be logged in to submit a review."
    10631076msgstr ""
    10641077
    1065 #: includes/bupr-ajax.php:211
     1078#: includes/bupr-ajax.php:209
    10661079msgid "Please select a member."
    10671080msgstr ""
    10681081
    1069 #: includes/bupr-ajax.php:217
     1082#: includes/bupr-ajax.php:215
    10701083msgid "You cannot review your own profile."
    10711084msgstr ""
    10721085
    1073 #: includes/bupr-ajax.php:224
     1086#: includes/bupr-ajax.php:222
    10741087msgid "Selected member does not exist."
    10751088msgstr ""
    10761089
    1077 #: includes/bupr-ajax.php:302
     1090#: includes/bupr-ajax.php:227
     1091msgid "You are not allowed to review this member."
     1092msgstr ""
     1093
     1094#: includes/bupr-ajax.php:298
     1095msgid "Please rate every criterion or write a review."
     1096msgstr ""
     1097
     1098#: includes/bupr-ajax.php:312
    10781099msgid "Error creating review. Please try again."
    10791100msgstr ""
    10801101
    10811102#. translators: %s: Review label (e.g., "Review").
    1082 #: includes/bupr-ajax.php:348
     1103#: includes/bupr-ajax.php:358
    10831104#, php-format
    10841105msgid "Thank you for sharing your %s! After admin approval, it will be displayed on members' profiles."
    … …  
    10861107
    10871108#. translators: %s: Review label in lowercase (e.g., "review").
    1088 #: includes/bupr-ajax.php:356
     1109#: includes/bupr-ajax.php:366
    10891110#, php-format
    10901111msgid "Thank you for sharing your thoughts in this %s!"
    … …  
    10921113
    10931114#. translators: %s:
    1094 #: includes/bupr-ajax.php:363
    1095 #: includes/bupr-shortcodes.php:320
     1115#: includes/bupr-ajax.php:373
     1116#: includes/bupr-shortcodes.php:322
    10961117#, php-format
    10971118msgid "You already posted a %1$s for this member."
    … …  
    10991120
    11001121#. translators: %s: User name who submitted the review.
    1101 #: includes/bupr-ajax.php:462
     1122#: includes/bupr-ajax.php:472
    11021123#, php-format
    11031124msgid "Review from %s"
    … …  
    11051126
    11061127#. translators: [site-admin], [site-name] and [review-aproval-link] are tokens replaced at send time - keep them verbatim.
    1107 #: includes/bupr-ajax.php:467
     1128#: includes/bupr-ajax.php:477
    11081129msgid ""
    11091130"Hello [site-admin],\n"
    … …  
    11211142msgstr ""
    11221143
    1123 #: includes/bupr-ajax.php:563
    1124 #: includes/bupr-ajax.php:745
     1144#: includes/bupr-ajax.php:575
     1145#: includes/bupr-ajax.php:768
     1146msgid "Editing reviews is turned off on this site."
     1147msgstr ""
     1148
     1149#: includes/bupr-ajax.php:584
     1150#: includes/bupr-ajax.php:777
    11251151msgid "You do not have permission to edit this review."
    11261152msgstr ""
    11271153
    1128 #: includes/bupr-ajax.php:623
    1129 #: includes/bupr-shortcodes.php:460
     1154#: includes/bupr-ajax.php:644
     1155#: includes/bupr-shortcodes.php:462
    11301156msgid "Rating : "
    11311157msgstr ""
    11321158
    1133 #: includes/bupr-ajax.php:642
    1134 #: includes/bupr-shortcodes.php:417
    1135 #: includes/bupr-shortcodes.php:446
     1159#: includes/bupr-ajax.php:663
     1160#: includes/bupr-shortcodes.php:419
     1161#: includes/bupr-shortcodes.php:448
    11361162msgid "This field is required."
    11371163msgstr ""
    11381164
    11391165#. translators: %s:
    1140 #: includes/bupr-ajax.php:663
     1166#: includes/bupr-ajax.php:684
    11411167#, php-format
    11421168msgid "Update %s"
    11431169msgstr ""
    11441170
    1145 #: includes/bupr-ajax.php:674
     1171#: includes/bupr-ajax.php:695
    11461172msgid "Unable to load review form."
    11471173msgstr ""
    11481174
    11491175#. translators: %s: Review label (e.g., "Review").
    1150 #: includes/bupr-ajax.php:800
     1176#: includes/bupr-ajax.php:833
    11511177#, php-format
    11521178msgid "%s updated successfully."
    11531179msgstr ""
    11541180
    1155 #: includes/bupr-ajax.php:820
     1181#: includes/bupr-ajax.php:853
    11561182msgid "Owner replies are disabled."
    11571183msgstr ""
    11581184
    1159 #: includes/bupr-ajax.php:869
     1185#: includes/bupr-ajax.php:903
    11601186msgid "You do not have permission to reply to this review."
    11611187msgstr ""
    11621188
    1163 #: includes/bupr-ajax.php:881
     1189#: includes/bupr-ajax.php:915
    11641190msgid "You have already replied to this review."
    11651191msgstr ""
    11661192
    1167 #: includes/bupr-ajax.php:893
     1193#: includes/bupr-ajax.php:927
    11681194msgid "Reply content cannot be empty."
    11691195msgstr ""
    11701196
    1171 #: includes/bupr-ajax.php:906
    1172 #: includes/templates/bupr-reviews-tab-template.php:311
     1197#: includes/bupr-ajax.php:940
     1198#: includes/templates/bupr-owner-reply.php:30
    11731199msgid "Profile Owner"
    11741200msgstr ""
    11751201
    1176 #: includes/bupr-ajax.php:920
    1177 #: includes/templates/bupr-reviews-tab-template.php:324
     1202#: includes/bupr-ajax.php:954
     1203#: includes/templates/bupr-owner-reply.php:43
    11781204msgid "Owner Response"
    11791205msgstr ""
    11801206
    1181 #: includes/bupr-ajax.php:932
     1207#: includes/bupr-ajax.php:966
    11821208msgid "Reply added successfully."
    11831209msgstr ""
    11841210
    1185 #: includes/bupr-ajax.php:953
     1211#: includes/bupr-ajax.php:987
    11861212msgid "Review flagging is disabled."
    11871213msgstr ""
    11881214
    1189 #: includes/bupr-ajax.php:975
     1215#: includes/bupr-ajax.php:1009
    11901216msgid "You must be logged in to flag a review."
    11911217msgstr ""
    11921218
    1193 #: includes/bupr-ajax.php:1009
    1194 #: includes/templates/bupr-reviews-tab-template.php:433
     1219#: includes/bupr-ajax.php:1043
     1220#: includes/templates/bupr-reviews-tab-template.php:388
    11951221msgid "Spam or fake review"
    11961222msgstr ""
    11971223
    1198 #: includes/bupr-ajax.php:1010
    1199 #: includes/templates/bupr-reviews-tab-template.php:437
     1224#: includes/bupr-ajax.php:1044
     1225#: includes/templates/bupr-reviews-tab-template.php:392
    12001226msgid "Harassment or abuse"
    12011227msgstr ""
    12021228
    1203 #: includes/bupr-ajax.php:1011
    1204 #: includes/templates/bupr-reviews-tab-template.php:441
     1229#: includes/bupr-ajax.php:1045
     1230#: includes/templates/bupr-reviews-tab-template.php:396
    12051231msgid "Inappropriate content"
    12061232msgstr ""
    12071233
    1208 #: includes/bupr-ajax.php:1012
    1209 #: includes/templates/bupr-reviews-tab-template.php:445
     1234#: includes/bupr-ajax.php:1046
     1235#: includes/templates/bupr-reviews-tab-template.php:400
    12101236msgid "Conflict of interest"
    12111237msgstr ""
    12121238
    1213 #: includes/bupr-ajax.php:1018
     1239#: includes/bupr-ajax.php:1052
    12141240msgid "Please select a valid reason for flagging."
    12151241msgstr ""
    12161242
    1217 #: includes/bupr-ajax.php:1037
     1243#: includes/bupr-ajax.php:1071
    12181244msgid "You have already flagged this review."
    12191245msgstr ""
    12201246
    1221 #: includes/bupr-ajax.php:1079
     1247#: includes/bupr-ajax.php:1115
    12221248msgid "Thank you for reporting. This review has been hidden pending admin review."
    12231249msgstr ""
    12241250
    1225 #: includes/bupr-ajax.php:1080
     1251#: includes/bupr-ajax.php:1116
    12261252msgid "Thank you for reporting. We will review this content."
    12271253msgstr ""
    12281254
    12291255#. translators: %s: Number of reviews.
    1230 #: includes/bupr-filters.php:240
    1231 #: includes/bupr-filters.php:607
     1256#: includes/bupr-filters.php:193
     1257#: includes/bupr-filters.php:408
    12321258#, php-format
    12331259msgid "%s review"
    … …  
    12371263
    12381264#. translators: 1: Average rating value (e.g. "4.50"). 2: Number of ratings.
    1239 #: includes/bupr-filters.php:275
     1265#: includes/bupr-filters.php:228
    12401266#, php-format
    12411267msgid "Average rating: %1$s based on %2$s rating"
    … …  
    12451271
    12461272#. translators: 1: Average rating value out of 5 (e.g. "4.50"). 2: Number of reviews.
    1247 #: includes/bupr-filters.php:282
     1273#: includes/bupr-filters.php:235
    12481274#, php-format
    12491275msgid "%1$s/5 ( %2$s review )"
    … …  
    12531279
    12541280#. translators: %s: Review label.
    1255 #. translators: %s: review label.
    1256 #: includes/bupr-filters.php:394
    1257 #: includes/bupr-filters.php:406
    1258 #: includes/bupr-filters.php:452
    1259 #: includes/bupr-filters.php:464
    1260 #: includes/bupr-filters.php:485
    1261 #: includes/bupr-filters.php:497
     1281#: includes/bupr-filters.php:316
    12621282#, php-format
    12631283msgid "Add %s"
    … …  
    12651285
    12661286#. translators: %s: Review label.
    1267 #: includes/bupr-filters.php:734
     1287#: includes/bupr-filters.php:535
    12681288#, php-format
    12691289msgid "View %s"
    12701290msgstr ""
    12711291
    1272 #: includes/bupr-filters.php:738
     1292#: includes/bupr-filters.php:539
    12731293msgid "Approve"
    12741294msgstr ""
    12751295
    1276 #. translators: %1$s: Review Label.
    12771296#. translators: %1$s: Review label.
    1278 #: includes/bupr-filters.php:861
    1279 #: includes/bupr-filters.php:889
    1280 #: includes/bupr-filters.php:904
     1297#: includes/bupr-filters.php:615
    12811298#, php-format
    12821299msgid "Add %1$s"
    12831300msgstr ""
    12841301
     1302#. translators: %1$s: login URL; %2$s: review label.
     1303#: includes/bupr-filters.php:691
     1304#, php-format
     1305msgid "You must <a href=\"%1$s\">log in</a> to add a %2$s."
     1306msgstr ""
     1307
    12851308#. translators: %1$s: Review user link; %2$s: review label; %3$s: reviewed user link.
    1286 #: includes/bupr-filters.php:1075
     1309#: includes/bupr-filters.php:789
    12871310#, php-format
    12881311msgid "%1$s posted a new %2$s to %3$s"
    12891312msgstr ""
    12901313
    1291 #: includes/bupr-filters.php:1235
     1314#: includes/bupr-filters.php:956
    12921315msgid "Custom Default Gravatar"
    12931316msgstr ""
    … …  
    13071330msgstr ""
    13081331
     1332#. translators: %s: review label.
     1333#: includes/bupr-notification.php:65
     1334#, php-format
     1335msgid "A member reported a %s. Check it and dismiss or resolve the report."
     1336msgstr ""
     1337
     1338#. translators: 1: member name, 2: review label.
     1339#: includes/bupr-notification.php:71
     1340#, php-format
     1341msgid "%1$s replied to your %2$s"
     1342msgstr ""
     1343
    13091344#. translators: %s:
    1310 #: includes/bupr-notification.php:104
     1345#: includes/bupr-notification.php:129
    13111346#, php-format
    13121347msgid "A new %s posted."
    … …  
    13141349
    13151350#. translators: %s:
    1316 #: includes/bupr-notification.php:106
     1351#: includes/bupr-notification.php:131
    13171352#, php-format
    13181353msgid "%1$s posted a %2$s"
    … …  
    13201355
    13211356#. translators: %s:
    1322 #: includes/bupr-notification.php:110
     1357#: includes/bupr-notification.php:135
    13231358#, php-format
    13241359msgid "( Pending Approval )  %1$s posted a %2$s"
    13251360msgstr ""
    13261361
    1327 #: includes/bupr-scripts.php:196
     1362#: includes/bupr-scripts.php:201
    13281363msgid "Enter Keywords...."
    13291364msgstr ""
    13301365
    1331 #: includes/bupr-scripts.php:197
     1366#: includes/bupr-scripts.php:202
    13321367msgid "Please enter a reply."
    13331368msgstr ""
    13341369
    1335 #: includes/bupr-scripts.php:198
     1370#: includes/bupr-scripts.php:203
    13361371msgid "Failed to add reply."
    13371372msgstr ""
    13381373
    1339 #: includes/bupr-scripts.php:199
     1374#: includes/bupr-scripts.php:204
    13401375msgid "Please select a reason."
    13411376msgstr ""
    13421377
    1343 #: includes/bupr-scripts.php:201
     1378#: includes/bupr-scripts.php:206
    13441379msgid "An error occurred. Please try again."
    13451380msgstr ""
    13461381
    13471382#. translators: %d: star position (1-5) in the rating group.
    1348 #: includes/bupr-scripts.php:209
     1383#: includes/bupr-scripts.php:214
    13491384#, php-format
    13501385msgid "Rate %d out of 5"
    13511386msgstr ""
    13521387
    1353 #: includes/bupr-scripts.php:210
     1388#: includes/bupr-scripts.php:215
    13541389msgid "Rating"
    13551390msgstr ""
    13561391
    1357 #: includes/bupr-scripts.php:262
     1392#: includes/bupr-scripts.php:267
    13581393msgid "Already Installed & Activated"
    13591394msgstr ""
    13601395
    1361 #: includes/bupr-scripts.php:263
     1396#: includes/bupr-scripts.php:268
    13621397msgid "There was a problem performing the action."
    13631398msgstr ""
    13641399
    1365 #: includes/bupr-scripts.php:264
     1400#: includes/bupr-scripts.php:269
    13661401msgid "* Number input is not allowed *"
    13671402msgstr ""
    13681403
    1369 #: includes/bupr-scripts.php:265
     1404#: includes/bupr-scripts.php:270
    13701405msgid "Approving…"
    13711406msgstr ""
    13721407
    1373 #: includes/bupr-scripts.php:268
     1408#: includes/bupr-scripts.php:273
    13741409msgid "Add Review criteria eg. Member Response. "
    13751410msgstr ""
    13761411
    1377 #: includes/bupr-scripts.php:270
    1378 msgid "Remove"
    1379 msgstr ""
    1380 
    1381 #: includes/bupr-scripts.php:271
    1382 msgid "Remove this review criteria"
    1383 msgstr ""
    1384 
    13851412#: includes/bupr-shortcodes.php:176
    1386 #: includes/widgets/display-review.php:146
    1387 msgid "reviews"
    1388 msgstr ""
    1389 
     1413#: includes/widgets/display-review.php:149
     1414msgid "review"
     1415msgid_plural "reviews"
     1416msgstr[0] ""
     1417msgstr[1] ""
     1418
     1419#. translators: %1$s: rating; %2$s: review count; %3$s: item type label
    13901420#: includes/bupr-shortcodes.php:184
    13911421#, php-format
    … …  
    13931423msgstr ""
    13941424
     1425#. translators: %1$s: review count; %2$s: item type label
    13951426#. translators: %1$s: Review count; %2$s: item type label
    13961427#: includes/bupr-shortcodes.php:188
    1397 #: includes/widgets/display-review.php:172
     1428#: includes/widgets/display-review.php:175
    13981429#, php-format
    13991430msgid "%1$s %2$s"
    … …  
    14011432
    14021433#: includes/bupr-shortcodes.php:195
    1403 #: includes/widgets/display-review.php:181
     1434#: includes/widgets/display-review.php:184
    14041435msgid "No members have been reviewed yet."
    14051436msgstr ""
    14061437
    14071438#. translators: %s:
    1408 #: includes/bupr-shortcodes.php:323
     1439#: includes/bupr-shortcodes.php:325
    14091440#, php-format
    14101441msgid "Thank you for taking time to write this wonderful %1$s."
    … …  
    14121443
    14131444#. translators: %s:
    1414 #: includes/bupr-shortcodes.php:326
     1445#: includes/bupr-shortcodes.php:328
    14151446#, php-format
    14161447msgid "Thank you for taking time to write this wonderful %1$s. Your %1$s will display after moderator's approval."
    14171448msgstr ""
    14181449
    1419 #: includes/bupr-shortcodes.php:390
     1450#: includes/bupr-shortcodes.php:392
    14201451msgid "Sorry, You have not been given permission to review the user !!!"
    14211452msgstr ""
    14221453
    14231454#. translators: %s:
    1424 #: includes/bupr-shortcodes.php:402
     1455#: includes/bupr-shortcodes.php:404
    14251456#, php-format
    14261457msgid "Fill in details to submit %s"
    14271458msgstr ""
    14281459
    1429 #: includes/bupr-shortcodes.php:408
     1460#: includes/bupr-shortcodes.php:410
    14301461msgid "--Select--"
    14311462msgstr ""
    14321463
    14331464#. translators: %s: review label
    1434 #: includes/bupr-shortcodes.php:501
    1435 #: includes/bupr-shortcodes.php:507
     1465#: includes/bupr-shortcodes.php:503
     1466#: includes/bupr-shortcodes.php:509
    14361467#, php-format
    14371468msgid "Enter your %s"
    … …  
    14391470
    14401471#. translators: %s: review label;
    1441 #: includes/bupr-shortcodes.php:515
     1472#: includes/bupr-shortcodes.php:517
    14421473#, php-format
    14431474msgid "Send %s anonymously."
    14441475msgstr ""
    14451476
    1446 #: includes/bupr-shortcodes.php:521
     1477#: includes/bupr-shortcodes.php:523
    14471478msgid "Please either select a rating or write a review."
    14481479msgstr ""
    14491480
    14501481#. translators: %s:
    1451 #: includes/bupr-shortcodes.php:527
     1482#: includes/bupr-shortcodes.php:529
    14521483#, php-format
    14531484msgid "Submit %s"
    14541485msgstr ""
    14551486
    1456 #: includes/bupr-shortcodes.php:531
     1487#: includes/bupr-shortcodes.php:533
    14571488msgid "Loading..."
    14581489msgstr ""
    … …  
    14701501msgstr ""
    14711502
     1503#: includes/templates/bupr-owner-reply.php:53
     1504msgid "Reply to this review"
     1505msgstr ""
     1506
     1507#: includes/templates/bupr-owner-reply.php:56
     1508msgid "Write your response..."
     1509msgstr ""
     1510
     1511#: includes/templates/bupr-owner-reply.php:59
     1512msgid "Submit Reply"
     1513msgstr ""
     1514
    14721515#. translators: %s:
    14731516#: includes/templates/bupr-reviews-tab-template.php:75
    … …  
    14771520
    14781521#: includes/templates/bupr-reviews-tab-template.php:101
     1522#: includes/templates/bupr-single-review-template.php:92
    14791523msgid "Profile Photo"
    14801524msgstr ""
    … …  
    14891533msgstr ""
    14901534
    1491 #: includes/templates/bupr-reviews-tab-template.php:334
    1492 msgid "Reply to this review"
    1493 msgstr ""
    1494 
    1495 #: includes/templates/bupr-reviews-tab-template.php:337
    1496 msgid "Write your response..."
    1497 msgstr ""
    1498 
    1499 #: includes/templates/bupr-reviews-tab-template.php:340
    1500 msgid "Submit Reply"
    1501 msgstr ""
    1502 
    1503 #: includes/templates/bupr-reviews-tab-template.php:360
     1535#: includes/templates/bupr-reviews-tab-template.php:314
    15041536msgid "Report this review"
    15051537msgstr ""
    15061538
    1507 #: includes/templates/bupr-reviews-tab-template.php:362
     1539#: includes/templates/bupr-reviews-tab-template.php:316
    15081540msgid "Report"
    15091541msgstr ""
    15101542
    15111543#. translators: %s:
     1544#: includes/templates/bupr-reviews-tab-template.php:361
     1545#, php-format
     1546msgid "Unfortunately, there are no %1$s found."
     1547msgstr ""
     1548
     1549#: includes/templates/bupr-reviews-tab-template.php:379
     1550msgid "Report Review"
     1551msgstr ""
     1552
     1553#: includes/templates/bupr-reviews-tab-template.php:383
     1554msgid "Please select a reason for reporting this review:"
     1555msgstr ""
     1556
    15121557#: includes/templates/bupr-reviews-tab-template.php:406
    1513 #, php-format
    1514 msgid "Unfortunately, there are no %1$s found."
    1515 msgstr ""
    1516 
    1517 #: includes/templates/bupr-reviews-tab-template.php:424
    1518 msgid "Report Review"
    1519 msgstr ""
    1520 
    1521 #: includes/templates/bupr-reviews-tab-template.php:428
    1522 msgid "Please select a reason for reporting this review:"
    1523 msgstr ""
    1524 
    1525 #: includes/templates/bupr-reviews-tab-template.php:451
    15261558msgid "Submit Report"
    15271559msgstr ""
    15281560
    1529 #: includes/templates/bupr-single-review-template.php:35
     1561#: includes/templates/bupr-single-review-template.php:37
    15301562msgid "Review author not found."
     1563msgstr ""
     1564
     1565#. translators: %s: reviewer display name.
     1566#: includes/templates/bupr-single-review-template.php:94
     1567#, php-format
     1568msgid "Profile photo of %s"
    15311569msgstr ""
    15321570
    … …  
    15441582
    15451583#. translators: %1$s: aggregate rating; %2$s: Review count; %3$s: item type label
    1546 #: includes/widgets/display-review.php:169
     1584#: includes/widgets/display-review.php:172
    15471585#, php-format
    15481586msgid "%1$s/5 (%2$s %3$s)"
    15491587msgstr ""
    15501588
    1551 #: includes/widgets/display-review.php:209
     1589#: includes/widgets/display-review.php:212
    15521590msgid "Top Members"
    15531591msgstr ""
    15541592
    1555 #: includes/widgets/display-review.php:222
     1593#: includes/widgets/display-review.php:225
    15561594msgid "Enter Title"
    15571595msgstr ""
    15581596
    1559 #: includes/widgets/display-review.php:226
     1597#: includes/widgets/display-review.php:229
    15601598msgid "Display Members"
    15611599msgstr ""
    15621600
    1563 #: includes/widgets/display-review.php:233
     1601#: includes/widgets/display-review.php:236
    15641602msgid "Top Rated "
    15651603msgstr ""
    15661604
    1567 #: includes/widgets/display-review.php:238
     1605#: includes/widgets/display-review.php:241
    15681606msgid "Most Reviewed"
    15691607msgstr ""
    15701608
    1571 #: includes/widgets/display-review.php:244
     1609#: includes/widgets/display-review.php:247
    15721610msgid "Display Avatar "
    15731611msgstr ""
    … …  
    15871625msgstr ""
    15881626
    1589 #: includes/widgets/member-rating.php:132
     1627#: includes/widgets/member-rating.php:133
    15901628msgid "Anonymous"
    15911629msgstr ""
    15921630
    15931631#. translators: %1$s: average rating
    1594 #: includes/widgets/member-rating.php:167
     1632#: includes/widgets/member-rating.php:168
    15951633#, php-format
    15961634msgid "%1$s/5"
    15971635msgstr ""
    15981636
    1599 #: includes/widgets/member-rating.php:179
     1637#: includes/widgets/member-rating.php:180
    16001638msgid "The member has not received a rating yet."
    16011639msgstr ""
    16021640
    1603 #: includes/widgets/member-rating.php:218
     1641#: includes/widgets/member-rating.php:219
    16041642msgid "Enter Title:"
    16051643msgstr ""
    16061644
    1607 #: includes/widgets/member-rating.php:222
     1645#: includes/widgets/member-rating.php:223
    16081646msgid "Number of Ratings to Show:"
    16091647msgstr ""
    16101648
    1611 #: includes/widgets/member-rating.php:226
     1649#: includes/widgets/member-rating.php:227
    16121650msgid "Default Sorting:"
    16131651msgstr ""
    16141652
    1615 #: includes/widgets/member-rating.php:228
     1653#: includes/widgets/member-rating.php:229
    16161654msgid "Latest"
    16171655msgstr ""
    16181656
    1619 #: includes/widgets/member-rating.php:229
     1657#: includes/widgets/member-rating.php:230
    16201658msgid "Highest"
    16211659msgstr ""
    16221660
    1623 #: includes/widgets/member-rating.php:230
     1661#: includes/widgets/member-rating.php:231
    16241662msgid "Lowest"
    16251663msgstr ""
  • bp-user-profile-reviews/trunk/readme.txt

    r3617176 r3736444  
    44Tags: buddypress, members, reviews, ratings, community
    55Requires at least: 6.5
    6 Tested up to: 7.0
    7 Stable tag: 3.8.0
    8 Requires PHP: 8.0
     6Tested up to: 7.1
     7Stable tag: 3.8.1
     8Requires PHP: 8.1
     9Tested with BuddyPress: 14.5.2
    910License: GPLv2 or later
    1011License URI: http://www.gnu.org/licenses/gpl-2.0.html
    … …  
    7374
    7475* English (default)
    75 * German (de_DE) and French (fr_FR) translations included
     76* German (de_DE), French (fr_FR), Spanish (es_ES), Italian (it_IT) and Portuguese Brazil (pt_BR) translations included
    7677* Ready for translation in your language with included POT file
    7778* WPML compatible (wpml-config.xml included)
    … …  
    8889
    8990* WordPress 6.5 and higher
    90 * PHP 8.0 and higher
     91* PHP 8.1 and higher
    9192* BuddyPress 6.0+ or BuddyBoss Platform 1.8+ required, with the Members component active
    9293* Works with the block editor and classic editor. The two widgets are classic WP_Widget classes, so on a block theme add them through the Legacy Widget block.
    … …  
    145146
    146147* WordPress 6.5 or higher
    147 * PHP 8.0 or higher
     148* PHP 8.1 or higher
    148149* BuddyPress 6.0+ or BuddyBoss Platform 1.8+, with the Members component active
    149150
    … …  
    219220= Is the plugin translation ready? =
    220221
    221 Yes. German and French translations ship with the plugin, and a POT file is included so you can translate into any language. The plugin is WPML compatible and includes RTL support.
     222Yes. German, French, Spanish, Italian and Portuguese (Brazil) translations ship with the plugin, and a POT file is included so you can translate into any language. The plugin is WPML compatible and includes RTL support.
    222223
    223224= Where can I get support? =
    … …  
    246247
    247248== Changelog ==
     249
     250= 3.8.1 - October 2026 =
     251
     252Moderation and settings-screen fixes.
     253
     254* New      - The site administrator gets a BuddyPress notification when a review is reported, and the reviewer gets one when the member replies to their review.
     255* New      - Reviews hidden by the report threshold now show an Auto-hidden badge with the hide date, an Auto-hidden filter in the Reviews list, and a count on the Overview screen.
     256* Improve  - The single review page shows the owner's reply, and the reviewed member can reply from it.
     257* Improve  - Settings toggles render as switches again, and the criteria Add and Remove buttons match the rest of the settings screen.
     258* Improve  - Email editors use the full row width, subject fields are wider, and settings rows no longer leave large gaps on phones.
     259* Improve  - Member review counts in the admin bar and profile tab read the cached total instead of loading every review on each page view.
     260* Improve  - Approval email fields show and hide as soon as Auto Approve is switched, without saving first.
     261* Improve  - Members who already reported a review see Reported instead of a Report button that fails.
     262* Improve  - The top members widget and shortcode skip members with no reviews and say 1 review instead of 1 reviews.
     263* Improve  - The logged-out Add Review prompt is translatable and returns visitors to the review form after logging in.
     264* Improve  - The Edit Review button uses the same readable style as Report in light and dark mode.
     265* Fix      - A review hidden by the report threshold, unpublished or trashed is removed from the activity stream and the activity REST API.
     266* Fix      - Re-approving or editing a review no longer posts a duplicate activity entry.
     267* Fix      - Clearing the Auto-Hide Threshold field no longer switches auto-hide off; a blank or invalid value falls back to 5 reports.
     268* Fix      - Several General settings rows were nested inside the Approval Email section, which broke their alignment.
     269* Fix      - Turning Multiple Criteria off now hides the criteria builder.
     270* Fix      - The Overview screen shows a Turn on link for every disabled feature.
     271* Fix      - Criteria rows use the same Remove label whether they were saved or just added.
     272* Fix      - The Member Review widget now picks up the Rating Color setting on pages outside BuddyPress.
     273* Fix      - Review cards in Reign dark mode now use Reign's own dark colors.
     274* Fix      - Report, Edit Review and the report dialog close button stay readable on hover in dark mode.
     275* Fix      - Unchecking Show Review Button is now saved explicitly.
     276* Fix      - The WordPress Dark admin color scheme no longer makes the settings header text unreadable.
     277* Fix      - Editing a review no longer publishes it; pending and report-hidden reviews stay hidden until approved.
     278* Fix      - The Update Review setting is now enforced, not only by hiding the Edit button.
     279* Fix      - A submitted review is stored with each rating on its own criterion, and an empty review is refused.
     280* Fix      - A refused review submission keeps what the member typed, and the confirmation message stays on screen.
     281* Fix      - Dismissed reports no longer count toward auto-hide, and dismissing the reports on a review they hid publishes it again.
     282* Fix      - Deleting a review recalculates the member's rating and removes its activity entry.
     283* Fix      - Notification email formatting is kept when saved, so emails are no longer one run-on paragraph.
     284* Fix      - The Anonymous flag is ignored in emails when Anonymous Reviews is off.
     285* Fix      - Owner replies are only accepted on published reviews.
     286* Fix      - Approving a review respects the Email Notifications and BuddyPress Notifications switches, and a review restored by dismissing its reports no longer re-sends the "new review" email.
     287* Fix      - The bulk Dismiss Reports action restores a review hidden by reports, the same as dismissing a single review.
     288* Fix      - The Member Rating widget respects Number of Ratings to Show, and shows the default avatar for anonymous reviews.
     289* Fix      - The Add Review tab no longer shows on your own profile, where a review could never be submitted.
     290* Fix      - Mark Resolved now stops the resolved reports counting toward auto-hide, the same as Dismiss Reports.
     291* Fix      - The Add Review button, the Add Review tab and the review form's member list accept a member with any allowed role, not only their first role.
     292* Fix      - A custom plural review label shows as typed on the profile tab with BuddyPress Legacy templates.
     293* Fix      - The Reviewer Roles, Reviewee Roles, Criteria and Display settings describe what they really do.
     294* Fix      - The review form and dialogs no longer overflow the screen on themes without a box-sizing reset, such as Twenty Twenty-Five.
     295* Fix      - Report dialog Submit and Cancel buttons keep their own styles inside BuddyPress pages.
     296* Fix      - Removed BuddyPress 12 deprecation notices from profile links.
     297* Fix      - Bulk-activating several plugins no longer stops after this one, and activating it from WP-CLI no longer exits early.
     298* Security - Approving a review from the Reviews list now requires the Editor capability; Contributors and Authors could previously approve any pending review.
     299* Security - The Reviewer Roles and Reviewee Roles settings are now enforced when a review is submitted, not only by hiding the Add Review button.
     300* Security - Pending and report-hidden reviews are no longer readable at their direct link, and a review only shows on the profile it belongs to.
     301* Security - Anonymous reviews no longer reveal the reviewer in the avatar text on the single review page.
     302* Security - Reviews no longer have public pages, archives, feeds or search results, which showed the author of an anonymous review; old review links redirect to the review on the member's profile.
     303* Security - The top members list shows display names instead of login usernames.
     304* Security - Dismissing or resolving reports requires the Editor capability.
     305* Security - The review submit and approve actions no longer accept logged-out requests.
    248306
    249307= 3.8.0 - July 2026 =
    … …  
    327385== Upgrade Notice ==
    328386
     387= 3.8.1 =
     388Security and moderation update: pending and report-hidden reviews stay private, review approval and report moderation need the Editor capability, and reviewer role settings are enforced. Recommended for all users.
     389
    329390= 3.8.0 =
    330391Security update: the review update endpoint now enforces an ownership check, so members can only edit their own reviews. Also includes the rebuilt admin settings screen and a front-end accessibility, dark-mode and RTL pass. Recommended for all users.
Note: See TracChangeset for help on using the changeset viewer.