@@ -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+
95107let saveTypographyThrottle = null
96108let saveSelectedFontPairThrottle = null
97109let 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