Skip to content

Commit 0a6b8ca

Browse files
authored
Fix (default presets): Get default presets, add support for themes.json v3 (#3536)
* merge theme and wp default presets if defaultSizesEnabled is true * update dev note * rephrased dev note * improve code readability
1 parent f40cef1 commit 0a6b8ca

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

src/hooks/use-preset-controls.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,26 @@ import { __ } from '@wordpress/i18n'
77
const PRESET_MAPPING = {
88
fontSizes: {
99
settings: [ 'typography', 'fontSizes' ],
10+
defaultSizes: 'typography.fontSizes.default',
11+
defaultEnabled: 'typography.defaultFontSizes',
1012
prefix: 'font-size',
1113
},
1214
spacingSizes: {
1315
settings: [ 'spacing', 'spacingSizes' ],
16+
defaultSizes: 'spacing.spacingSizes.default',
17+
defaultEnabled: 'spacing.defaultSpacingSizes',
1418
prefix: 'spacing',
1519
},
1620
blockHeights: {
1721
settings: [ 'blockHeights' ],
22+
defaultSizes: '',
23+
defaultEnabled: '',
1824
prefix: 'block-height',
1925
},
2026
borderRadius: {
2127
settings: [ 'borderRadius' ],
28+
defaultSizes: '',
29+
defaultEnabled: '',
2230
prefix: 'border-radius',
2331
},
2432
}
@@ -31,15 +39,42 @@ const nonePreset = {
3139

3240
export const usePresetControls = property => {
3341
// Get the theme presets for the property
34-
const [ themePresets ] = useSettings( PRESET_MAPPING[ property ].settings.join( '.' ) )
42+
const [
43+
_themePresets,
44+
45+
/**
46+
* Dev note:
47+
* In theme.json version 3, `typography.defaultFontSizes` and `spacing.defaultSpacingSizes` default to `true`.
48+
* These settings must be explicitly set to `false` to override default presets. When enabled, themes with matching slugs
49+
* will use default presets, and theme presets with the same slugs will be ignored.
50+
* Therefore, we also need to get the default presets if the `defaultSizesEnabled` is `true` and merge it with the theme presets.
51+
*
52+
* See: https://make.wordpress.org/core/2024/06/19/theme-json-version-3/#:~:text=Breaking%20changes%20in%20version%203
53+
* */
54+
wpDefaultPresets,
55+
defaultSizesEnabled,
56+
] = useSettings(
57+
PRESET_MAPPING[ property ].settings.join( '.' ),
58+
PRESET_MAPPING[ property ].defaultSizes,
59+
PRESET_MAPPING[ property ].defaultEnabled
60+
)
61+
3562
// Get all custom presets
3663
const { allCustomPresets } = useSelect( select => {
3764
const _customPresetControls = select( 'stackable/global-preset-controls.custom' )?.getCustomPresetControls()
3865
return { allCustomPresets: { ..._customPresetControls } }
3966
}, [] )
4067

68+
let themePresets = _themePresets
4169
const hasThemePresets = Array.isArray( themePresets ) && themePresets.length > 0
4270

71+
// Merge theme presets with default presets when default sizes are enabled.
72+
// This happens when settings like `typography.defaultFontSizes` or `spacing.defaultSpacingSizes`
73+
// are not explicitly set to `false` in theme.json v3.
74+
if ( hasThemePresets && wpDefaultPresets && defaultSizesEnabled !== false ) {
75+
themePresets = [ ..._themePresets, ...wpDefaultPresets ]
76+
}
77+
4378
// Get the theme/default presets if the user have one, else return the stackable presets
4479
const basePresets = hasThemePresets
4580
? themePresets

0 commit comments

Comments
 (0)