@@ -83,6 +83,8 @@ const BlockCss = props => {
8383 clientId = '' , // The block's clientId, only used if rendering for the editor.
8484 instanceId = '' , // Used by the Query Loop block, this is the instance of the template being displayed.
8585 blockState = 'normal' , // The block's hover state to render the styles for.
86+
87+ generateForAllBlockStates = false , // If true, it will generate styles for all block states
8688 } = props
8789
8890 // const editorMode = ! compileCssTo
@@ -301,15 +303,20 @@ const BlockCss = props => {
301303
302304 // TODO: why do we have this condition for the collapsedSelector, but they just do the same prepending??
303305 if ( hasCollapsed ) {
304- if ( blockState === 'collapsed' ) {
306+ if ( generateForAllBlockStates ) {
307+ collapsedSelector = prependClass ( selector , '%h :where(.stk-block-accordion.stk--is-open) .%s' )
308+ } else if ( blockState === 'collapsed' ) {
305309 collapsedSelector = prependClass ( selector , ':where(.stk-block-accordion.stk--is-open) .%s' )
306310 } else {
307311 collapsedSelector = prependClass ( selector , ':where(.stk-block-accordion.stk--is-open) .%s' )
308312 }
309313 }
310314
315+ // Use %h as a placeholder to indicate that a hover state class should be prepended to the selector.
311316 if ( hasParentHover ) {
312- if ( blockState === 'parent-hover' ) {
317+ if ( generateForAllBlockStates ) {
318+ parentHoverSelector = [ prependClass ( selector , '%h.%s.stk--is-hovered' ) , prependClass ( selector , ':where(.stk-hover-parent:hover, .stk-hover-parent.stk--is-hovered) .%s' ) ]
319+ } else if ( blockState === 'parent-hover' ) {
313320 parentHoverSelector = prependClass ( selector , '.%s.stk--is-hovered' )
314321 } else {
315322 parentHoverSelector = prependClass ( selector , ':where(.stk-hover-parent:hover, .stk-hover-parent.stk--is-hovered) .%s' )
@@ -322,18 +329,24 @@ const BlockCss = props => {
322329 // using the selector `[data-block="clientId"]`, for these scenarios the
323330 // method will not work. Instead we just append `:hover` to the block
324331 // selector directly.
332+ // Use %h as a placeholder to indicate that a hover state class should be prepended to the selector.
325333 if ( hasHover ) {
326334 const selectorHasDataBlock = ( hoverSelector || selector ) . includes ( '[data-block=' ) && ( hoverSelector || selector ) . endsWith ( ']' )
327335 if ( selectorHasDataBlock ) {
328336 // If there is a [data-block] append the :hover or .stk-is-hovered directly to it.
329- if ( blockState === 'hover' ) {
337+ if ( generateForAllBlockStates ) {
338+ hoverSelector = [ appendClass ( selector , '%h.stk--is-hovered' ) , hoverSelector || appendClass ( selector , ':hover' ) ]
339+ } else if ( blockState === 'hover' ) {
330340 // In editor, always use the `selector` instead of the hoverSelector.
331341 hoverSelector = appendClass ( selector , '.stk--is-hovered' )
332342 } else {
333343 hoverSelector = hoverSelector || appendClass ( selector , ':hover' )
334344 }
335345 } else {
336346 // Prepend .%s:hover to the selector.
347+ if ( generateForAllBlockStates ) {
348+ hoverSelector = [ prependClass ( selector , '%h.%s.stk--is-hovered' ) , hoverSelector || prependClass ( selector , '.%s:hover' ) ]
349+ }
337350 if ( blockState === 'hover' ) { // eslint-disable-line no-lonely-if
338351 // In editor, always use the `selector` instead of the hoverSelector.
339352 hoverSelector = prependClass ( selector , '.%s.stk--is-hovered' )
@@ -353,8 +366,8 @@ const BlockCss = props => {
353366 if ( typeof selector === 'string' ) {
354367 // Add instance id to classes. ( e.g. `stk-abc123` -> `stk-abc123-2`, where 2 is `instanceId`. )
355368 selector = selector . replace ( / [ ^ ^ ? ] ( .% s ) ( [ ^ - ] ) / g, `$1-${ instanceId } $2` )
356- hoverSelector = hoverSelector . replace ( / [ ^ ^ ? ] ( .% s ) ( [ ^ - ] ) / g, `$1-${ instanceId } $2` )
357- parentHoverSelector = parentHoverSelector . replace ( / [ ^ ^ ? ] ( .% s ) ( [ ^ - ] ) / g, `$1-${ instanceId } $2` )
369+ hoverSelector = typeof hoverSelector === 'string' ? hoverSelector . replace ( / [ ^ ^ ? ] ( .% s ) ( [ ^ - ] ) / g, `$1-${ instanceId } $2` ) : hoverSelector . map ( s => s . replace ( / [ ^ ^ ? ] ( . % s ) ( [ ^ - ] ) / g , `$1- ${ instanceId } $2` ) )
370+ parentHoverSelector = typeof parentHoverSelector === 'string' ? parentHoverSelector . replace ( / [ ^ ^ ? ] ( .% s ) ( [ ^ - ] ) / g, `$1-${ instanceId } $2` ) : parentHoverSelector . map ( s => s . replace ( / [ ^ ^ ? ] ( . % s ) ( [ ^ - ] ) / g , `$1- ${ instanceId } $2` ) )
358371 collapsedSelector = collapsedSelector . replace ( / [ ^ ^ ? ] ( .% s ) ( [ ^ - ] ) / g, `$1-${ instanceId } $2` )
359372 }
360373 }
@@ -372,16 +385,20 @@ const BlockCss = props => {
372385 if ( Array . isArray ( hoverSelector ) ) {
373386 hoverSelector = hoverSelector . join ( ', ' )
374387 }
388+ if ( Array . isArray ( parentHoverSelector ) ) {
389+ parentHoverSelector = parentHoverSelector . join ( ', ' )
390+ }
375391
376- selector = prependCSSClass ( selector , blockUniqueClassName , blockUniqueClassName , editorMode ? '.editor-styles-wrapper' : '' )
392+ const wrapSelector = editorMode ? '.editor-styles-wrapper' : ''
393+ selector = prependCSSClass ( selector , blockUniqueClassName , blockUniqueClassName , wrapSelector )
377394 if ( hasHover ) {
378- hoverSelector = prependCSSClass ( hoverSelector , blockUniqueClassName , blockUniqueClassName , editorMode ? '.editor-styles-wrapper ' : '' )
395+ hoverSelector = prependCSSClass ( hoverSelector , blockUniqueClassName , blockUniqueClassName , wrapSelector , generateForAllBlockStates ? '.stk-preview-state--hover ' : '' )
379396 }
380397 if ( hasParentHover ) {
381- parentHoverSelector = prependCSSClass ( parentHoverSelector , blockUniqueClassName , blockUniqueClassName , editorMode ? '.editor-styles-wrapper ' : '' )
398+ parentHoverSelector = prependCSSClass ( parentHoverSelector , blockUniqueClassName , blockUniqueClassName , wrapSelector , generateForAllBlockStates ? '.stk-preview-state--parent-hover ' : '' )
382399 }
383400 if ( hasCollapsed ) {
384- collapsedSelector = prependCSSClass ( collapsedSelector , blockUniqueClassName , blockUniqueClassName , editorMode ? '.editor-styles-wrapper ' : '' )
401+ collapsedSelector = prependCSSClass ( collapsedSelector , blockUniqueClassName , blockUniqueClassName , wrapSelector , generateForAllBlockStates ? '.stk-preview-state--collapsed ' : '' )
385402 }
386403
387404 let css = ''
0 commit comments