Edit File by line
/home/zeestwma/ceyloniy.../wp-conte.../plugins/wpforms-.../src/Frontend
File: CSSVars.php
* @return ThemesData
[500] Fix | Delete
*/
[501] Fix | Delete
private function get_themes_data_object(): ThemesData {
[502] Fix | Delete
[503] Fix | Delete
if ( wpforms()->is_pro() ) {
[504] Fix | Delete
return new ProThemesData( new StockPhotos() );
[505] Fix | Delete
}
[506] Fix | Delete
[507] Fix | Delete
return new LiteThemesData();
[508] Fix | Delete
}
[509] Fix | Delete
[510] Fix | Delete
/**
[511] Fix | Delete
* Add CSS vars units.
[512] Fix | Delete
*
[513] Fix | Delete
* Form builder saves values without pixels, we need to add them before outputting as CSS vars.
[514] Fix | Delete
*
[515] Fix | Delete
* @since 1.9.7
[516] Fix | Delete
*
[517] Fix | Delete
* @param array $css_vars CSS vars.
[518] Fix | Delete
*
[519] Fix | Delete
* @return array
[520] Fix | Delete
*/
[521] Fix | Delete
private function add_css_vars_units( array $css_vars ): array {
[522] Fix | Delete
[523] Fix | Delete
$has_pixels = [
[524] Fix | Delete
'field-border-size',
[525] Fix | Delete
'field-border-radius',
[526] Fix | Delete
'button-border-size',
[527] Fix | Delete
'button-border-radius',
[528] Fix | Delete
'container-padding',
[529] Fix | Delete
'container-border-width',
[530] Fix | Delete
'container-border-radius',
[531] Fix | Delete
];
[532] Fix | Delete
[533] Fix | Delete
foreach ( $has_pixels as $key ) {
[534] Fix | Delete
if ( isset( $css_vars[ $key ] ) && is_numeric( $css_vars[ $key ] ) && $css_vars[ $key ] > 0 ) {
[535] Fix | Delete
$css_vars[ $key ] .= 'px';
[536] Fix | Delete
}
[537] Fix | Delete
}
[538] Fix | Delete
[539] Fix | Delete
return $css_vars;
[540] Fix | Delete
}
[541] Fix | Delete
[542] Fix | Delete
/**
[543] Fix | Delete
* Get selector variables CSS.
[544] Fix | Delete
*
[545] Fix | Delete
* @since 1.9.3
[546] Fix | Delete
*
[547] Fix | Delete
* @param string $selector Selector.
[548] Fix | Delete
* @param array $vars Variables data.
[549] Fix | Delete
* @param string|int $form_id Form ID. Optional. Default is an empty string.
[550] Fix | Delete
*
[551] Fix | Delete
* @return string
[552] Fix | Delete
*/
[553] Fix | Delete
private function get_selector_vars_css( string $selector, array $vars, $form_id = '' ): string {
[554] Fix | Delete
[555] Fix | Delete
return sprintf(
[556] Fix | Delete
'%1$s {
[557] Fix | Delete
%2$s
[558] Fix | Delete
}',
[559] Fix | Delete
$selector, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
[560] Fix | Delete
wp_strip_all_tags( $this->get_vars_css( $vars, $form_id ) )
[561] Fix | Delete
);
[562] Fix | Delete
}
[563] Fix | Delete
[564] Fix | Delete
/**
[565] Fix | Delete
* Pre print vars filter.
[566] Fix | Delete
*
[567] Fix | Delete
* @since 1.8.8
[568] Fix | Delete
*
[569] Fix | Delete
* @param array $vars Variables data.
[570] Fix | Delete
* @param string|int $form_id Form ID. Optional. Default is an empty string.
[571] Fix | Delete
*
[572] Fix | Delete
* @return array
[573] Fix | Delete
*/
[574] Fix | Delete
private function get_pre_print_vars( array $vars, $form_id = '' ): array {
[575] Fix | Delete
[576] Fix | Delete
// Normalize the `background-url` variable.
[577] Fix | Delete
if ( isset( $vars['background-url'] ) ) {
[578] Fix | Delete
$vars['background-url'] = $vars['background-url'] === 'url()' ? 'none' : $vars['background-url'];
[579] Fix | Delete
}
[580] Fix | Delete
[581] Fix | Delete
/**
[582] Fix | Delete
* Filter CSS variables right before printing the CSS.
[583] Fix | Delete
*
[584] Fix | Delete
* @since 1.8.8
[585] Fix | Delete
*
[586] Fix | Delete
* @param array $vars CSS variables.
[587] Fix | Delete
* @param int $form_id Form ID. Optional. Default is an empty string.
[588] Fix | Delete
*/
[589] Fix | Delete
return (array) apply_filters( 'wpforms_frontend_css_vars_pre_print_filter', $vars, $form_id );
[590] Fix | Delete
}
[591] Fix | Delete
[592] Fix | Delete
/**
[593] Fix | Delete
* Generate CSS code from given vars data.
[594] Fix | Delete
*
[595] Fix | Delete
* @since 1.8.1
[596] Fix | Delete
*
[597] Fix | Delete
* @param array $vars Variables data.
[598] Fix | Delete
* @param string|int $form_id Form ID. Optional. Default is an empty string.
[599] Fix | Delete
*/
[600] Fix | Delete
private function get_vars_css( array $vars, $form_id = '' ): string {
[601] Fix | Delete
[602] Fix | Delete
$vars = $this->get_pre_print_vars( $vars, $form_id );
[603] Fix | Delete
$result = '';
[604] Fix | Delete
[605] Fix | Delete
foreach ( $vars as $name => $value ) {
[606] Fix | Delete
if ( ! is_string( $value ) ) {
[607] Fix | Delete
continue;
[608] Fix | Delete
}
[609] Fix | Delete
[610] Fix | Delete
if ( $value === '0' ) {
[611] Fix | Delete
$value = '0px';
[612] Fix | Delete
}
[613] Fix | Delete
[614] Fix | Delete
$result .= "--wpforms-{$name}: {$value};\n";
[615] Fix | Delete
[616] Fix | Delete
if ( in_array( $name, self::SPARE_VARS, true ) ) {
[617] Fix | Delete
$result .= "--wpforms-{$name}-spare: {$value};\n";
[618] Fix | Delete
}
[619] Fix | Delete
}
[620] Fix | Delete
[621] Fix | Delete
return $result;
[622] Fix | Delete
}
[623] Fix | Delete
[624] Fix | Delete
/**
[625] Fix | Delete
* Get customized CSS vars.
[626] Fix | Delete
*
[627] Fix | Delete
* @since 1.8.3
[628] Fix | Delete
*
[629] Fix | Delete
* @param array $attr Attributes passed by integration.
[630] Fix | Delete
*
[631] Fix | Delete
* @return array
[632] Fix | Delete
*/
[633] Fix | Delete
public function get_customized_css_vars( array $attr ): array { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh
[634] Fix | Delete
[635] Fix | Delete
$root_css_vars = $this->get_vars();
[636] Fix | Delete
$css_vars = [];
[637] Fix | Delete
[638] Fix | Delete
foreach ( $attr as $key => $value ) {
[639] Fix | Delete
[640] Fix | Delete
$var_name = strtolower( preg_replace( '/[A-Z]/', '-$0', $key ) );
[641] Fix | Delete
[642] Fix | Delete
// Skip an attribute that is not the CSS var or has the default value.
[643] Fix | Delete
if ( empty( $root_css_vars[ $var_name ] ) || $root_css_vars[ $var_name ] === $value ) {
[644] Fix | Delete
continue;
[645] Fix | Delete
}
[646] Fix | Delete
[647] Fix | Delete
$css_vars[ $var_name ] = $value;
[648] Fix | Delete
}
[649] Fix | Delete
[650] Fix | Delete
// Reset border size in case of border style is `none`.
[651] Fix | Delete
$css_vars = $this->maybe_reset_border( $css_vars, 'field-border' );
[652] Fix | Delete
$css_vars = $this->maybe_reset_border( $css_vars, 'button-border' );
[653] Fix | Delete
[654] Fix | Delete
// Set the button alternative background color and use border color for accent in case of transparent color.
[655] Fix | Delete
$button_bg_color = $css_vars['button-background-color'] ?? $root_css_vars['button-background-color'];
[656] Fix | Delete
[657] Fix | Delete
if ( $this->is_transparent_color( $button_bg_color ) ) {
[658] Fix | Delete
$css_vars['button-background-color-alt'] = $button_bg_color;
[659] Fix | Delete
[660] Fix | Delete
$border_color = $css_vars['button-border-color'] ?? $root_css_vars['button-border-color'];
[661] Fix | Delete
[662] Fix | Delete
$css_vars['button-background-color'] = $this->is_transparent_color( $border_color ) ? $root_css_vars['button-background-color'] : $border_color;
[663] Fix | Delete
$button_bg_color = $css_vars['button-background-color'];
[664] Fix | Delete
}
[665] Fix | Delete
[666] Fix | Delete
$button_bg_color = strtolower( $button_bg_color );
[667] Fix | Delete
[668] Fix | Delete
// Set the button alternative text color in case if the background and text color are identical.
[669] Fix | Delete
$button_text_color = strtolower( $css_vars['button-text-color'] ?? $root_css_vars['button-text-color'] );
[670] Fix | Delete
[671] Fix | Delete
if ( $button_bg_color === $button_text_color || $this->is_transparent_color( $button_text_color ) ) {
[672] Fix | Delete
$css_vars['button-text-color-alt'] = $this->get_contrast_color( $button_bg_color );
[673] Fix | Delete
}
[674] Fix | Delete
[675] Fix | Delete
$size_css_vars = $this->get_size_css_vars( $attr );
[676] Fix | Delete
[677] Fix | Delete
return array_merge( $css_vars, $size_css_vars );
[678] Fix | Delete
}
[679] Fix | Delete
[680] Fix | Delete
/**
[681] Fix | Delete
* Reset border size in case of border style is `none`.
[682] Fix | Delete
*
[683] Fix | Delete
* @since 1.9.7
[684] Fix | Delete
*
[685] Fix | Delete
* @param array $css_vars CSS vars.
[686] Fix | Delete
* @param string $key Key.
[687] Fix | Delete
*
[688] Fix | Delete
* @return array
[689] Fix | Delete
*/
[690] Fix | Delete
private function maybe_reset_border( array $css_vars, string $key ): array {
[691] Fix | Delete
[692] Fix | Delete
$style_key = $key . '-style';
[693] Fix | Delete
$size_key = $key . '-size';
[694] Fix | Delete
[695] Fix | Delete
if ( isset( $css_vars[ $style_key ] ) && $css_vars[ $style_key ] === 'none' ) {
[696] Fix | Delete
$css_vars[ $size_key ] = '0px';
[697] Fix | Delete
}
[698] Fix | Delete
[699] Fix | Delete
return $css_vars;
[700] Fix | Delete
}
[701] Fix | Delete
[702] Fix | Delete
/**
[703] Fix | Delete
* Checks if the provided color has transparency.
[704] Fix | Delete
*
[705] Fix | Delete
* @since 1.8.8
[706] Fix | Delete
*
[707] Fix | Delete
* @param string $color The color to check.
[708] Fix | Delete
*
[709] Fix | Delete
* @return bool
[710] Fix | Delete
*/
[711] Fix | Delete
private function is_transparent_color( string $color ): bool {
[712] Fix | Delete
[713] Fix | Delete
$rgba = $this->get_color_as_rgb_array( $color );
[714] Fix | Delete
[715] Fix | Delete
$opacity_threshold = 0.33;
[716] Fix | Delete
$opacity = $rgba[3] ?? 1;
[717] Fix | Delete
[718] Fix | Delete
return $opacity < $opacity_threshold;
[719] Fix | Delete
}
[720] Fix | Delete
[721] Fix | Delete
/**
[722] Fix | Delete
* Get contrast color relative to a given color.
[723] Fix | Delete
*
[724] Fix | Delete
* @since 1.8.8
[725] Fix | Delete
*
[726] Fix | Delete
* @param string|array $color The color.
[727] Fix | Delete
*
[728] Fix | Delete
* @return string
[729] Fix | Delete
*/
[730] Fix | Delete
private function get_contrast_color( $color ): string {
[731] Fix | Delete
[732] Fix | Delete
$rgba = is_array( $color ) ? $color : $this->get_color_as_rgb_array( $color );
[733] Fix | Delete
$avg = (int) ( ( ( array_sum( $rgba ) ) / 3 ) * ( $rgba[3] ?? 1 ) );
[734] Fix | Delete
[735] Fix | Delete
return $avg < 128 ? '#ffffff' : '#000000';
[736] Fix | Delete
}
[737] Fix | Delete
[738] Fix | Delete
/**
[739] Fix | Delete
* Get size CSS vars.
[740] Fix | Delete
*
[741] Fix | Delete
* @since 1.8.3
[742] Fix | Delete
* @since 1.8.8 Removed $css_vars argument.
[743] Fix | Delete
*
[744] Fix | Delete
* @param array $attr Attributes passed by integration.
[745] Fix | Delete
*
[746] Fix | Delete
* @return array
[747] Fix | Delete
*/
[748] Fix | Delete
private function get_size_css_vars( array $attr ): array {
[749] Fix | Delete
[750] Fix | Delete
$size_items = [ 'field', 'label', 'button', 'container-shadow' ];
[751] Fix | Delete
$size_css_vars = [];
[752] Fix | Delete
[753] Fix | Delete
foreach ( $size_items as $item ) {
[754] Fix | Delete
[755] Fix | Delete
$item_attr = preg_replace_callback(
[756] Fix | Delete
'/-(\w)/',
[757] Fix | Delete
static function ( $matches ) {
[758] Fix | Delete
[759] Fix | Delete
return strtoupper( $matches[1] );
[760] Fix | Delete
},
[761] Fix | Delete
$item
[762] Fix | Delete
);
[763] Fix | Delete
[764] Fix | Delete
$item_attr .= 'Size';
[765] Fix | Delete
[766] Fix | Delete
$item_key = $item . '-size';
[767] Fix | Delete
$item_constant = 'self::' . str_replace( '-', '_', strtoupper( $item ) ) . '_SIZE';
[768] Fix | Delete
[769] Fix | Delete
if ( empty( $attr[ $item_attr ] ) ) {
[770] Fix | Delete
continue;
[771] Fix | Delete
}
[772] Fix | Delete
[773] Fix | Delete
$size_css_vars[] = $this->get_complex_vars( $item_key, constant( $item_constant )[ $attr[ $item_attr ] ] );
[774] Fix | Delete
}
[775] Fix | Delete
[776] Fix | Delete
return empty( $size_css_vars ) ? [] : array_merge( ...$size_css_vars );
[777] Fix | Delete
}
[778] Fix | Delete
[779] Fix | Delete
/**
[780] Fix | Delete
* Get color as an array of RGB(A) values.
[781] Fix | Delete
*
[782] Fix | Delete
* @since 1.8.8
[783] Fix | Delete
*
[784] Fix | Delete
* @param string $color Color.
[785] Fix | Delete
*
[786] Fix | Delete
* @return array|bool Color as an array of RGBA values. False on error.
[787] Fix | Delete
*/
[788] Fix | Delete
private function get_color_as_rgb_array( string $color ) {
[789] Fix | Delete
[790] Fix | Delete
// Remove # from the beginning of the string and remove whitespaces.
[791] Fix | Delete
$color = preg_replace( '/^#/', '', strtolower( trim( $color ) ) );
[792] Fix | Delete
$color = str_replace( ' ', '', (string) $color );
[793] Fix | Delete
[794] Fix | Delete
if ( $color === 'transparent' ) {
[795] Fix | Delete
$color = 'rgba(0,0,0,0)';
[796] Fix | Delete
}
[797] Fix | Delete
[798] Fix | Delete
$rgba = $color;
[799] Fix | Delete
$rgb_array = [];
[800] Fix | Delete
[801] Fix | Delete
// Check if color is in HEX(A) format.
[802] Fix | Delete
$is_hex = preg_match( '/[0-9a-f]{6,8}$/', $rgba );
[803] Fix | Delete
[804] Fix | Delete
if ( $is_hex ) {
[805] Fix | Delete
// Search and split HEX(A) color into an array of char couples.
[806] Fix | Delete
preg_match_all( '/\w\w/', $rgba, $rgb_array );
[807] Fix | Delete
[808] Fix | Delete
$rgb_array = array_map(
[809] Fix | Delete
static function ( $value ) {
[810] Fix | Delete
[811] Fix | Delete
return hexdec( '0x' . $value );
[812] Fix | Delete
},
[813] Fix | Delete
$rgb_array[0] ?? []
[814] Fix | Delete
);
[815] Fix | Delete
$rgb_array[3] = ( $rgb_array[3] ?? 255 ) / 255;
[816] Fix | Delete
} else {
[817] Fix | Delete
$rgba = preg_replace( '/[^\d,.]/', '', $rgba );
[818] Fix | Delete
$rgb_array = explode( ',', $rgba );
[819] Fix | Delete
}
[820] Fix | Delete
[821] Fix | Delete
return $rgb_array;
[822] Fix | Delete
}
[823] Fix | Delete
}
[824] Fix | Delete
[825] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function