Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Global Styles: Add a typesets section to Typography #62539

Merged
merged 11 commits into from
Jul 25, 2024
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>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For here, and line 45, let's use "Fonts" as these are the fonts applied within the typeset.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@richtabor Has this change been covered? Was it to change "Typeset" to "Fonts"?

</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 }
/>
) }
Comment on lines +41 to +46
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm thinking these may work better below the typesets, so when a typeset has more fonts it does not displace the typesets UI. And you decide on a typeset here, not necessarily the fonts for each.


<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
Loading