@@ -16,7 +16,9 @@ import { fetchSettings, getDefaultFontSize } from '~stackable/util'
1616import {
1717 i18n , isPro , showProNotice ,
1818} from 'stackable'
19- import { head , isEqual } from 'lodash'
19+ import {
20+ head , isEqual , cloneDeep ,
21+ } from 'lodash'
2022
2123/**
2224 * WordPress dependencies
@@ -93,15 +95,47 @@ const TYPOGRAPHY_TAGS = [
9395]
9496
9597const 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 } ,
98+ {
99+ label : __ ( 'None' , i18n ) ,
100+ value : 'none' ,
101+ } ,
102+ {
103+ label : __ ( 'Custom' , i18n ) ,
104+ value : 'custom' ,
105+ disabled : true ,
106+ } ,
107+ {
108+ label : __ ( '1.067 - Minor Second' , i18n ) ,
109+ value : '1.067' ,
110+ } ,
111+ {
112+ label : __ ( '1.125 - Major Second' , i18n ) ,
113+ value : '1.125' ,
114+ } ,
115+ {
116+ label : __ ( '1.200 - Minor Third' , i18n ) ,
117+ value : '1.2' ,
118+ } ,
119+ {
120+ label : __ ( '1.250 - Major Third' , i18n ) ,
121+ value : '1.25' ,
122+ } ,
123+ {
124+ label : __ ( '1.333 - Perfect Fourth' , i18n ) ,
125+ value : '1.333' ,
126+ } ,
127+ {
128+ label : __ ( '1.414 - Augmented Fourth' , i18n ) ,
129+ value : '1.414' ,
130+ } ,
131+ {
132+ label : __ ( '1.500 - Perfect Fifth' , i18n ) ,
133+ value : '1.5' ,
134+ } ,
135+ {
136+ label : __ ( '1.618 - Golden Ratio' , i18n ) ,
137+ value : '1.618' ,
138+ } ,
105139]
106140
107141let saveTypographyThrottle = null
@@ -124,7 +158,7 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
124158 const [ customFontPairs , setCustomFontPairs ] = useState ( [ ] )
125159 const [ selectedFontPairName , setSelectedFontPairName ] = useState ( '' )
126160 const [ isEditingFontPair , setIsEditingFontPair ] = useState ( false )
127- const [ selectedTypeScale , setSelectedTypeScale ] = useState ( 1 )
161+ const [ selectedTypeScale , setSelectedTypeScale ] = useState ( 'none' )
128162
129163 const fontPairContainerRef = useRef ( null )
130164
@@ -135,22 +169,19 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
135169 setTypographySettings ( _typographySettings )
136170 setApplySettingsTo ( response . stackable_global_typography_apply_to || 'blocks-stackable-native' )
137171 setCustomFontPairs ( response . stackable_custom_font_pairs || [ ] )
138- setSelectedFontPairName ( response . stackable_selected_font_pair || '' )
172+ setSelectedFontPairName ( response . stackable_selected_font_pair || 'theme-heading-default/theme-body-default ' )
139173
140174 // 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-
175+ let typeScale = _typographySettings ?. h6 ?. fontSize
176+ if ( typeScale ) {
177+ const computedApplied = getAppliedTypeScale ( typeScale ) ?? { }
146178 const tags = Object . keys ( _typographySettings )
147179 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
180+ // If font size mismatch, set typography scale to Custom
181+ if ( _typographySettings [ tag ] ? .fontSize !== computedApplied [ tag ] ? .fontSize ) {
182+ typeScale = 'custom'
151183 }
152184 }
153-
154185 setSelectedTypeScale ( typeScale )
155186 }
156187 } )
@@ -225,18 +256,23 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
225256 return [ ...FONT_PAIRS , ...customFontPairs ] . find ( fontPair => fontPair . name === selectedFontPairName )
226257 }
227258
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- } )
259+ const getAppliedTypeScale = value => {
260+ const typeScale = Number ( value )
261+ if ( Number . isNaN ( typeScale ) ) {
262+ return
263+ }
264+ return {
265+ h1 : { fontSize : Number ( Math . pow ( typeScale , 6 ) . toFixed ( 3 ) ) , fontSizeUnit : 'rem' } ,
266+ h2 : { fontSize : Number ( Math . pow ( typeScale , 5 ) . toFixed ( 3 ) ) , fontSizeUnit : 'rem' } ,
267+ h3 : { fontSize : Number ( Math . pow ( typeScale , 4 ) . toFixed ( 3 ) ) , fontSizeUnit : 'rem' } ,
268+ h4 : { fontSize : Number ( Math . pow ( typeScale , 3 ) . toFixed ( 3 ) ) , fontSizeUnit : 'rem' } ,
269+ h5 : { fontSize : Number ( Math . pow ( typeScale , 2 ) . toFixed ( 3 ) ) , fontSizeUnit : 'rem' } ,
270+ h6 : { fontSize : Number ( typeScale . toFixed ( 3 ) ) , fontSizeUnit : 'rem' } ,
271+ p : { fontSize : 1 , fontSizeUnit : 'rem' } ,
272+ '.stk-subtitle' : { fontSize : Number ( ( 1 / typeScale ) . toFixed ( 3 ) ) , fontSizeUnit : 'rem' } ,
273+ '.stk-button__inner-text' : { fontSize : 1 , fontSizeUnit : 'rem' } ,
274+ }
275+ }
240276
241277 const updateTypography = newSettings => {
242278 setTypographySettings ( newSettings )
@@ -283,21 +319,31 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
283319 }
284320
285321 const updateTypeScale = value => {
286- const typeScale = Number ( value )
287- if ( isNaN ( typeScale ) ) {
322+ setSelectedTypeScale ( value )
323+
324+ // If value is custom, do not do anything
325+ if ( value === 'custom ' ) {
288326 return
289327 }
290328
291- setSelectedTypeScale ( typeScale )
292-
293- // Only update the typography settings if not None/Custom
294- if ( typeScale !== 1 ) {
295- const newSettings = getAppliedTypeScale ( typeScale )
329+ // If value is none, reset the font sizes and units
330+ if ( value === 'none' ) {
331+ const selectors = TYPOGRAPHY_TAGS . map ( tag => tag . selector )
332+ const newSettings = selectors . reduce ( ( acc , selector , ) => {
333+ acc [ selector ] = { fontSize : '' , fontSizeUnit : '' }
334+ return acc
335+ } , { } )
296336 changeStyles ( newSettings )
337+ return
297338 }
339+
340+ // If value is valid type scale, apply to the styles
341+ const newSettings = getAppliedTypeScale ( value )
342+ changeStyles ( newSettings )
298343 }
299344
300- const changeStyles = typography => {
345+ const changeStyles = _typography => {
346+ const typography = cloneDeep ( _typography )
301347 const newSettings = { ...typographySettings }
302348
303349 Object . entries ( typography ) . forEach ( ( [ selector , styles ] ) => {
@@ -497,7 +543,7 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
497543 options = { TYPE_SCALE }
498544 value = { selectedTypeScale }
499545 onChange = { updateTypeScale }
500- default = { 1 }
546+ default = "none"
501547 />
502548 { TYPOGRAPHY_TAGS . map ( ( {
503549 label, selector, help,
@@ -513,13 +559,18 @@ addFilter( 'stackable.global-settings.inspector', 'stackable/global-typography',
513559 isAllowReset = { getIsAllowReset ( selector ) }
514560 onChange = { styles => {
515561 changeStyles ( { [ selector ] : styles } )
516- // Also set the typescale to None/Custom
517- setSelectedTypeScale ( 1 )
562+ // Set typeScale to custom when editing font size or units
563+ if ( 'fontSize' in styles || 'fontSizeUnit' in styles ) {
564+ setSelectedTypeScale ( 'custom' )
565+ }
518566 } }
519567 onReset = { ( ) => {
520568 resetStyles ( selector )
521- // Also set the typescale to None/Custom
522- setSelectedTypeScale ( 1 )
569+ // Set typeScale to custom when editing font size or units
570+ const styles = typographySettings [ selector ]
571+ if ( 'fontSize' in styles || 'fontSizeUnit' in styles ) {
572+ setSelectedTypeScale ( 'custom' )
573+ }
523574 } }
524575 />
525576 )
0 commit comments