Skip to content

Commit

Permalink
Global Styles: Add a typesets section to Typography (#62539)
Browse files Browse the repository at this point in the history
* Global Styles: Add a typesets section to Typography

Only show typesets if there are fonts

* update typesets to contain font families

* add variation name to typesets

* add variation name to typesets

* use variation titles for typeset button

* Update packages/edit-site/src/components/global-styles/typeset-button.js

Co-authored-by: Sarah Norris <[email protected]>

* Update packages/edit-site/src/components/global-styles/typeset-button.js

Co-authored-by: Sarah Norris <[email protected]>

* Update packages/edit-site/src/components/global-styles/typeset-button.js

Co-authored-by: Sarah Norris <[email protected]>

* Add fontLibraryEnabled to ScreenTypography

* Remove window.__experimentalDisableFontLibrary

* Check for themeFontFamilies and customFontFamilies

---------

Co-authored-by: Sarah Norris <[email protected]>
Co-authored-by: Sarah Norris <[email protected]>
Co-authored-by: scruffian <[email protected]>
Co-authored-by: mikachan <[email protected]>
Co-authored-by: jasmussen <[email protected]>
Co-authored-by: richtabor <[email protected]>
  • Loading branch information
7 people authored Jul 25, 2024
1 parent d77fe65 commit 4af798f
Show file tree
Hide file tree
Showing 6 changed files with 230 additions and 5 deletions.
42 changes: 42 additions & 0 deletions packages/edit-site/src/components/global-styles/screen-typeset.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/**
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
import { useSelect } from '@wordpress/data';
import { store as editorStore } from '@wordpress/editor';
import { __experimentalVStack as VStack } from '@wordpress/components';

/**
* Internal dependencies
*/
import TypographyVariations from './variations/variations-typography';
import ScreenHeader from './header';
import FontFamilies from './font-families';

function ScreenTypeset() {
const fontLibraryEnabled = useSelect(
( select ) =>
select( editorStore ).getEditorSettings().fontLibraryEnabled,
[]
);

return (
<>
<ScreenHeader
title={ __( 'Typesets' ) }
description={ __(
'Fonts and typographic styling applied across the site.'
) }
/>
<div className="edit-site-global-styles-screen">
<VStack spacing={ 7 }>
<TypographyVariations />

{ fontLibraryEnabled && <FontFamilies /> }
</VStack>
</div>
</>
);
}

export default ScreenTypeset;
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
*/
import { __ } from '@wordpress/i18n';
import { __experimentalVStack as VStack } from '@wordpress/components';
import { store as editorStore } from '@wordpress/editor';
import { useSelect } from '@wordpress/data';
import { store as editorStore } from '@wordpress/editor';

/**
* Internal dependencies
*/
import TypographyElements from './typography-elements';
import TypographyVariations from './variations/variations-typography';
import FontFamilies from './font-families';
import ScreenHeader from './header';
import FontSizesCount from './font-sizes/font-sizes-count';
import TypesetButton from './typeset-button';
import FontFamilies from './font-families';

function ScreenTypography() {
const fontLibraryEnabled = useSelect(
Expand All @@ -32,9 +32,9 @@ function ScreenTypography() {
/>
<div className="edit-site-global-styles-screen">
<VStack spacing={ 7 }>
<TypesetButton />
{ fontLibraryEnabled && <FontFamilies /> }
<TypographyElements />
<TypographyVariations title={ __( 'Presets' ) } />
<FontSizesCount />
</VStack>
</div>
Expand Down
93 changes: 93 additions & 0 deletions packages/edit-site/src/components/global-styles/typeset-button.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/**
* WordPress dependencies
*/
import { isRTL, __ } from '@wordpress/i18n';
import {
__experimentalItemGroup as ItemGroup,
__experimentalVStack as VStack,
__experimentalHStack as HStack,
FlexItem,
} from '@wordpress/components';
import { store as coreStore } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';
import { privateApis as editorPrivateApis } from '@wordpress/editor';
import { useMemo, useContext } from '@wordpress/element';
import { Icon, chevronLeft, chevronRight } from '@wordpress/icons';

/**
* Internal dependencies
*/
import FontLibraryProvider from './font-library-modal/context';
import { getFontFamilies } from './utils';
import { NavigationButtonAsItem } from './navigation-button';
import Subtitle from './subtitle';
import { unlock } from '../../lock-unlock';
import { filterObjectByProperties } from '../../hooks/use-theme-style-variations/use-theme-style-variations-by-property';

const { GlobalStylesContext } = unlock( blockEditorPrivateApis );
const { mergeBaseAndUserConfigs } = unlock( editorPrivateApis );

function TypesetButton() {
const { base } = useContext( GlobalStylesContext );
const { user: userConfig } = useContext( GlobalStylesContext );
const config = mergeBaseAndUserConfigs( base, userConfig );
const allFontFamilies = getFontFamilies( config );
const hasFonts =
allFontFamilies.filter( ( font ) => font !== null ).length > 0;
const variations = useSelect( ( select ) => {
return select(
coreStore
).__experimentalGetCurrentThemeGlobalStylesVariations();
}, [] );
const userTypographyConfig = filterObjectByProperties(
userConfig,
'typography'
);

const title = useMemo( () => {
if ( Object.keys( userTypographyConfig ).length === 0 ) {
return __( 'Default' );
}
const activeVariation = variations.find( ( variation ) => {
return (
JSON.stringify(
filterObjectByProperties( variation, 'typography' )
) === JSON.stringify( userTypographyConfig )
);
} );
if ( activeVariation ) {
return activeVariation.title;
}
return allFontFamilies.map( ( font ) => font?.name ).join( ', ' );
}, [ userTypographyConfig, variations ] );

return (
hasFonts && (
<VStack spacing={ 2 }>
<HStack justify="space-between">
<Subtitle level={ 3 }>{ __( 'Typeset' ) }</Subtitle>
</HStack>
<ItemGroup isBordered isSeparated>
<NavigationButtonAsItem
path="/typography/typeset"
aria-label={ __( 'Typeset' ) }
>
<HStack direction="row">
<FlexItem>{ title }</FlexItem>
<Icon
icon={ isRTL() ? chevronLeft : chevronRight }
/>
</HStack>
</NavigationButtonAsItem>
</ItemGroup>
</VStack>
)
);
}

export default ( { ...props } ) => (
<FontLibraryProvider>
<TypesetButton { ...props } />
</FontLibraryProvider>
);
73 changes: 73 additions & 0 deletions packages/edit-site/src/components/global-styles/typeset.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/**
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
import {
__experimentalItemGroup as ItemGroup,
__experimentalVStack as VStack,
__experimentalHStack as HStack,
} from '@wordpress/components';
import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';
import { privateApis as editorPrivateApis } from '@wordpress/editor';
import { useContext } from '@wordpress/element';

/**
* Internal dependencies
*/
import FontLibraryProvider, {
FontLibraryContext,
} from './font-library-modal/context';
import FontLibraryModal from './font-library-modal';
import FontFamilyItem from './font-family-item';
import Subtitle from './subtitle';
import { getFontFamilies } from './utils';
import { unlock } from '../../lock-unlock';

const { GlobalStylesContext } = unlock( blockEditorPrivateApis );
const { mergeBaseAndUserConfigs } = unlock( editorPrivateApis );

function Typesets() {
const { modalTabOpen, setModalTabOpen } = useContext( FontLibraryContext );
const { base } = useContext( GlobalStylesContext );
const { user: userConfig } = useContext( GlobalStylesContext );
const config = mergeBaseAndUserConfigs( base, userConfig );
const allFontFamilies = getFontFamilies( config );
const hasFonts =
allFontFamilies.filter( ( font ) => font !== null ).length > 0;

return (
hasFonts && (
<>
{ !! modalTabOpen && (
<FontLibraryModal
onRequestClose={ () => setModalTabOpen( null ) }
defaultTabId={ modalTabOpen }
/>
) }

<VStack spacing={ 2 }>
<HStack justify="space-between">
<Subtitle level={ 3 }>{ __( 'Fonts' ) }</Subtitle>
</HStack>
<ItemGroup isBordered isSeparated>
{ allFontFamilies.map(
( font ) =>
font && (
<FontFamilyItem
key={ font.slug }
font={ font }
/>
)
) }
</ItemGroup>
</VStack>
</>
)
);
}

export default ( { ...props } ) => (
<FontLibraryProvider>
<Typesets { ...props } />
</FontLibraryProvider>
);
5 changes: 5 additions & 0 deletions packages/edit-site/src/components/global-styles/ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import {
} from './screen-block-list';
import ScreenBlock from './screen-block';
import ScreenTypography from './screen-typography';
import ScreenTypeset from './screen-typeset';
import ScreenTypographyElement from './screen-typography-element';
import FontSize from './font-sizes/font-size';
import FontSizes from './font-sizes/font-sizes';
Expand Down Expand Up @@ -323,6 +324,10 @@ function GlobalStylesUI() {
<FontSize />
</GlobalStylesNavigationScreen>

<GlobalStylesNavigationScreen path="/typography/typeset">
<ScreenTypeset />
</GlobalStylesNavigationScreen>

<GlobalStylesNavigationScreen path="/typography/text">
<ScreenTypographyElement element="text" />
</GlobalStylesNavigationScreen>
Expand Down
14 changes: 13 additions & 1 deletion packages/edit-site/src/components/global-styles/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,19 @@ function getFontFamilyFromSetting( fontFamilies, setting ) {
}

export function getFontFamilies( themeJson ) {
const fontFamilies = themeJson?.settings?.typography?.fontFamilies?.theme; // TODO this could not be under theme.
const themeFontFamilies =
themeJson?.settings?.typography?.fontFamilies?.theme;
const customFontFamilies =
themeJson?.settings?.typography?.fontFamilies?.custom;

let fontFamilies = [];
if ( themeFontFamilies && customFontFamilies ) {
fontFamilies = [ ...themeFontFamilies, ...customFontFamilies ];
} else if ( themeFontFamilies ) {
fontFamilies = themeFontFamilies;
} else if ( customFontFamilies ) {
fontFamilies = customFontFamilies;
}
const bodyFontFamilySetting = themeJson?.styles?.typography?.fontFamily;
const bodyFontFamily = getFontFamilyFromSetting(
fontFamilies,
Expand Down

0 comments on commit 4af798f

Please sign in to comment.