@@ -7,18 +7,26 @@ import { __ } from '@wordpress/i18n'
77const 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
3240export 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