Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Global styles: keep custom CSS when switching between style variations #56623

Closed
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ import { store as coreStore } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
import { useMemo, useContext, useState } from '@wordpress/element';
import { ENTER } from '@wordpress/keycodes';
import { __experimentalGrid as Grid } from '@wordpress/components';
import {
__experimentalGrid as Grid,
ToggleControl,
} from '@wordpress/components';
import { __, sprintf } from '@wordpress/i18n';
import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';

Expand All @@ -25,7 +28,7 @@ const { GlobalStylesContext, areGlobalStyleConfigsEqual } = unlock(
blockEditorPrivateApis
);

function Variation( { variation } ) {
function Variation( { variation, preserveAdditionalCSS } ) {
const [ isFocused, setIsFocused ] = useState( false );
const { base, user, setUserConfig } = useContext( GlobalStylesContext );
const context = useMemo( () => {
Expand All @@ -41,10 +44,32 @@ function Variation( { variation } ) {
}, [ variation, base ] );

const selectVariation = () => {
const blockStyles = variation?.styles?.blocks || {};
if ( user?.styles?.blocks && preserveAdditionalCSS ) {
Object.keys( user.styles.blocks ).forEach( ( blockName ) => {
if ( user.styles.blocks[ blockName ].css ) {
blockStyles[ blockName ] = {
...( blockStyles[ blockName ]
? blockStyles[ blockName ]
: {} ),
css: user.styles.blocks[ blockName ].css,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need to modify this as theme variations can have block level CSS set so we need to merge instead of overwriting here

};
}
} );
}
const styles = preserveAdditionalCSS
? {
...variation.styles,
...( user?.styles?.css ? { css: user.styles.css } : {} ),
blocks: {
...blockStyles,
},
}
: variation.styles;
setUserConfig( () => {
return {
settings: variation.settings,
styles: variation.styles,
styles,
};
} );
};
Expand Down Expand Up @@ -101,6 +126,9 @@ function Variation( { variation } ) {
}

export default function StyleVariationsContainer() {
const [ preserveAdditionalCSS, setPreserveAdditionalCSS ] =
useState( true );

const variations = useSelect( ( select ) => {
return select(
coreStore
Expand All @@ -123,13 +151,33 @@ export default function StyleVariationsContainer() {
}, [ variations ] );

return (
<Grid
columns={ 2 }
className="edit-site-global-styles-style-variations-container"
>
{ withEmptyVariation.map( ( variation, index ) => (
<Variation key={ index } variation={ variation } />
) ) }
</Grid>
<>
<Grid
columns={ 2 }
className="edit-site-global-styles-style-variations-container"
>
{ withEmptyVariation.map( ( variation, index ) => (
<Variation
key={ index }
variation={ variation }
preserveAdditionalCSS={ preserveAdditionalCSS }
/>
) ) }
</Grid>

<ToggleControl
className="edit-site-global-styles-style-variations-preserve-css"
label={ __( 'Keep additional CSS' ) }
help={ __(
'Preserve additional CSS when switching between variations.'
) }
checked={ preserveAdditionalCSS }
onChange={ () => {
setPreserveAdditionalCSS(
preserveAdditionalCSS ? false : true
);
} }
/>
</>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@
}
}

.edit-site-global-styles-style-variations-preserve-css {
margin-top: $grid-unit-20;
}

.edit-site-sidebar-navigation-screen__footer {
position: sticky;
bottom: 0;
Expand Down
Loading