Skip to content

Commit cd1cbc1

Browse files
committed
feat: initial init
1 parent d4dc17f commit cd1cbc1

File tree

1 file changed

+77
-3
lines changed
  • src/plugins/global-settings/typography

1 file changed

+77
-3
lines changed

src/plugins/global-settings/typography/index.js

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,18 @@ const TYPOGRAPHY_TAGS = [
9292
},
9393
]
9494

95+
const TYPE_SCALE = [
96+
{ label: __( 'None / Custom', i18n ), value: 1 },
97+
{ label: __( '1.067 - Minor Second', i18n ), value: 1.067 },
98+
{ label: __( '1.125 - Major Second', i18n ), value: 1.125 },
99+
{ label: __( '1.200 - Minor Third', i18n ), value: 1.2 },
100+
{ label: __( '1.250 - Major Third', i18n ), value: 1.25 },
101+
{ label: __( '1.333 - Perfect Fourth', i18n ), value: 1.333 },
102+
{ label: __( '1.414 - Augmented Fourth', i18n ), value: 1.414 },
103+
{ label: __( '1.500 - Perfect Fifth', i18n ), value: 1.5 },
104+
{ label: __( '1.618 - Golden Ratio', i18n ), value: 1.618 },
105+
]
106+
95107
let saveTypographyThrottle = null
96108
let saveSelectedFontPairThrottle = null
97109
let saveCustomFontPairsThrottle = null
@@ -112,16 +124,35 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
112124
const [ customFontPairs, setCustomFontPairs ] = useState( [] )
113125
const [ selectedFontPairName, setSelectedFontPairName ] = useState( '' )
114126
const [ isEditingFontPair, setIsEditingFontPair ] = useState( false )
127+
const [ selectedTypeScale, setSelectedTypeScale ] = useState( 1 )
115128

116129
const fontPairContainerRef = useRef( null )
117130

118131
useEffect( () => {
119132
fetchSettings().then( response => {
120133
// Get settings.
121-
setTypographySettings( ( head( response.stackable_global_typography ) ) || {} )
134+
const _typographySettings = ( head( response.stackable_global_typography ) ) || {}
135+
setTypographySettings( _typographySettings )
122136
setApplySettingsTo( response.stackable_global_typography_apply_to || 'blocks-stackable-native' )
123137
setCustomFontPairs( response.stackable_custom_font_pairs || [] )
124138
setSelectedFontPairName( response.stackable_selected_font_pair || '' )
139+
140+
// Reversely compute the type scale from the font sizes
141+
// Check first if the units are rem
142+
if ( Object.values( _typographySettings ).every( setting => setting.fontSizeUnit === 'rem' ) ) {
143+
let typeScale = _typographySettings?.h6?.fontSize
144+
const computedApplied = getAppliedTypeScale( typeScale )
145+
146+
const tags = Object.keys( _typographySettings )
147+
for ( const tag of tags ) {
148+
// If font size mismatch, set typography scale to None / Custom
149+
if ( _typographySettings[ tag ].fontSize !== computedApplied[ tag ].fontSize ) {
150+
typeScale = 1
151+
}
152+
}
153+
154+
setSelectedTypeScale( typeScale )
155+
}
125156
} )
126157
}, [] )
127158

@@ -194,6 +225,19 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
194225
return [ ...FONT_PAIRS, ...customFontPairs ].find( fontPair => fontPair.name === selectedFontPairName )
195226
}
196227

228+
const getAppliedTypeScale = typeScale => ( {
229+
h1: { fontSize: Number( Math.pow( typeScale, 6 ).toFixed( 3 ) ), fontSizeUnit: 'rem' },
230+
h2: { fontSize: Number( Math.pow( typeScale, 5 ).toFixed( 3 ) ), fontSizeUnit: 'rem' },
231+
h3: { fontSize: Number( Math.pow( typeScale, 4 ).toFixed( 3 ) ), fontSizeUnit: 'rem' },
232+
h4: { fontSize: Number( Math.pow( typeScale, 3 ).toFixed( 3 ) ), fontSizeUnit: 'rem' },
233+
h5: { fontSize: Number( Math.pow( typeScale, 2 ).toFixed( 3 ) ), fontSizeUnit: 'rem' },
234+
h6: { fontSize: Number( typeScale.toFixed( 3 ) ), fontSizeUnit: 'rem' },
235+
p: { fontSize: 1, fontSizeUnit: 'rem' },
236+
'.stk-subtitle': { fontSize: Number( ( 1 / typeScale ).toFixed( 3 ) ), fontSizeUnit: 'rem' },
237+
'.stk-button__inner-text': { fontSize: 1, fontSizeUnit: 'rem' },
238+
239+
} )
240+
197241
const updateTypography = newSettings => {
198242
setTypographySettings( newSettings )
199243

@@ -238,6 +282,21 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
238282
model.save()
239283
}
240284

285+
const updateTypeScale = value => {
286+
const typeScale = Number( value )
287+
if ( isNaN( typeScale ) ) {
288+
return
289+
}
290+
291+
setSelectedTypeScale( typeScale )
292+
293+
// Only update the typography settings if not None/Custom
294+
if ( typeScale !== 1 ) {
295+
const newSettings = getAppliedTypeScale( typeScale )
296+
changeStyles( newSettings )
297+
}
298+
}
299+
241300
const changeStyles = typography => {
242301
const newSettings = { ...typographySettings }
243302

@@ -433,6 +492,13 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
433492
<ControlSeparator />
434493

435494
<h3>{ __( 'Typography Settings' ) }</h3>
495+
<AdvancedSelectControl
496+
label={ __( 'Type Scale', i18n ) }
497+
options={ TYPE_SCALE }
498+
value={ selectedTypeScale }
499+
onChange={ updateTypeScale }
500+
default={ 1 }
501+
/>
436502
{ TYPOGRAPHY_TAGS.map( ( {
437503
label, selector, help,
438504
}, index ) => {
@@ -445,8 +511,16 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
445511
value={ ( typographySettings[ selector ] ) || {} }
446512
defaultFontFamily={ getDefaultFontFamily( selector ) }
447513
isAllowReset={ getIsAllowReset( selector ) }
448-
onChange={ styles => changeStyles( { [ selector ]: styles } ) }
449-
onReset={ () => resetStyles( selector ) }
514+
onChange={ styles => {
515+
changeStyles( { [ selector ]: styles } )
516+
// Also set the typescale to None/Custom
517+
setSelectedTypeScale( 1 )
518+
} }
519+
onReset={ () => {
520+
resetStyles( selector )
521+
// Also set the typescale to None/Custom
522+
setSelectedTypeScale( 1 )
523+
} }
450524
/>
451525
)
452526
} ) }

0 commit comments

Comments
 (0)