diff --git a/packages/block-editor/src/components/global-styles/typography-panel.js b/packages/block-editor/src/components/global-styles/typography-panel.js index 9bc875cdc0a308..a9db994f495ca8 100644 --- a/packages/block-editor/src/components/global-styles/typography-panel.js +++ b/packages/block-editor/src/components/global-styles/typography-panel.js @@ -178,6 +178,7 @@ export default function TypographyPanel( { settings, panelId, defaultControls = DEFAULT_CONTROLS, + fitText = false, } ) { const decodeValue = ( rawValue ) => getValueFromVariable( { settings }, '', rawValue ); @@ -439,6 +440,7 @@ export default function TypographyPanel( { withReset={ false } withSlider size="__unstable-large" + disabled={ fitText } /> ) } diff --git a/packages/block-editor/src/hooks/typography.js b/packages/block-editor/src/hooks/typography.js index 066211c15aafe9..18e6c86828cb50 100644 --- a/packages/block-editor/src/hooks/typography.js +++ b/packages/block-editor/src/hooks/typography.js @@ -116,11 +116,13 @@ function TypographyInspectorControl( { children, resetAllFilter } ) { export function TypographyPanel( { clientId, name, setAttributes, settings } ) { function selector( select ) { - const { style, fontFamily, fontSize } = + const { style, fontFamily, fontSize, fitText } = select( blockEditorStore ).getBlockAttributes( clientId ) || {}; - return { style, fontFamily, fontSize }; + return { style, fontFamily, fontSize, fitText }; } - const { style, fontFamily, fontSize } = useSelect( selector, [ clientId ] ); + const { style, fontFamily, fontSize, fitText } = useSelect( selector, [ + clientId, + ] ); const isEnabled = useHasTypographyPanel( settings ); const value = useMemo( () => attributesToStyle( { style, fontFamily, fontSize } ), @@ -148,6 +150,7 @@ export function TypographyPanel( { clientId, name, setAttributes, settings } ) { value={ value } onChange={ onChange } defaultControls={ defaultControls } + fitText={ fitText } /> ); } diff --git a/packages/components/src/custom-select-control-v2/custom-select.tsx b/packages/components/src/custom-select-control-v2/custom-select.tsx index 9b4bd0616cbb16..decae373fc744a 100644 --- a/packages/components/src/custom-select-control-v2/custom-select.tsx +++ b/packages/components/src/custom-select-control-v2/custom-select.tsx @@ -93,6 +93,7 @@ function _CustomSelect( ) { const { children, + disabled = false, hideLabelFromVision = false, label, size, @@ -135,11 +136,13 @@ function _CustomSelect( __next40pxDefaultSize size={ size } suffix={ } + disabled={ disabled } > diff --git a/packages/components/src/custom-select-control-v2/types.ts b/packages/components/src/custom-select-control-v2/types.ts index a31598c1db3ead..e51bbd44fbddf0 100644 --- a/packages/components/src/custom-select-control-v2/types.ts +++ b/packages/components/src/custom-select-control-v2/types.ts @@ -67,6 +67,12 @@ export type _CustomSelectProps = CustomSelectButtonProps & { * The child elements. This should be composed of `CustomSelectItem` components. */ children: React.ReactNode; + /** + * If true, the control will be disabled and the user will not be able to interact with it. + * + * @default false + */ + disabled?: boolean; /** * Used to visually hide the label. It will always be visible to screen readers. * diff --git a/packages/components/src/custom-select-control/index.tsx b/packages/components/src/custom-select-control/index.tsx index e014e4bc642eef..7afffbbbcd29a3 100644 --- a/packages/components/src/custom-select-control/index.tsx +++ b/packages/components/src/custom-select-control/index.tsx @@ -59,6 +59,7 @@ function CustomSelectControl< T extends CustomSelectOption >( __next40pxDefaultSize = false, __shouldNotWarnDeprecated36pxSize, describedBy, + disabled = false, options, onChange, size = 'default', @@ -188,6 +189,7 @@ function CustomSelectControl< T extends CustomSelectOption >( <> <_CustomSelect aria-describedby={ descriptionId } + disabled={ disabled } renderSelectedValue={ showSelectedHint ? renderSelectedValueHint : undefined } diff --git a/packages/components/src/custom-select-control/types.ts b/packages/components/src/custom-select-control/types.ts index dd3db6d3bb0f95..19666f6f5cf7e0 100644 --- a/packages/components/src/custom-select-control/types.ts +++ b/packages/components/src/custom-select-control/types.ts @@ -37,6 +37,12 @@ export type CustomSelectProps< T extends CustomSelectOption > = { * Optional classname for the component. */ className?: string; + /** + * If true, the control will be disabled and the user will not be able to interact with it. + * + * @default false + */ + disabled?: boolean; /** * Hide the label visually, while keeping available to assistive technology. */ diff --git a/packages/components/src/font-size-picker/font-size-picker-select.tsx b/packages/components/src/font-size-picker/font-size-picker-select.tsx index 0d3681f39d5a97..0b09974bb1014e 100644 --- a/packages/components/src/font-size-picker/font-size-picker-select.tsx +++ b/packages/components/src/font-size-picker/font-size-picker-select.tsx @@ -20,7 +20,14 @@ const DEFAULT_OPTION: FontSizePickerSelectOption = { }; const FontSizePickerSelect = ( props: FontSizePickerSelectProps ) => { - const { __next40pxDefaultSize, fontSizes, value, size, onChange } = props; + const { + __next40pxDefaultSize, + fontSizes, + value, + size, + disabled, + onChange, + } = props; const options: FontSizePickerSelectOption[] = [ DEFAULT_OPTION, @@ -56,6 +63,7 @@ const FontSizePickerSelect = ( props: FontSizePickerSelectProps ) => { options={ options } value={ selectedOption } showSelectedHint + disabled={ disabled } onChange={ ( { selectedItem, }: { diff --git a/packages/components/src/font-size-picker/font-size-picker-toggle-group.tsx b/packages/components/src/font-size-picker/font-size-picker-toggle-group.tsx index 1b3619c800e453..fc987a1cfbdb23 100644 --- a/packages/components/src/font-size-picker/font-size-picker-toggle-group.tsx +++ b/packages/components/src/font-size-picker/font-size-picker-toggle-group.tsx @@ -14,7 +14,14 @@ import { T_SHIRT_ABBREVIATIONS, T_SHIRT_NAMES } from './constants'; import type { FontSizePickerToggleGroupProps } from './types'; const FontSizePickerToggleGroup = ( props: FontSizePickerToggleGroupProps ) => { - const { fontSizes, value, __next40pxDefaultSize, size, onChange } = props; + const { + fontSizes, + value, + __next40pxDefaultSize, + size, + disabled, + onChange, + } = props; return ( { onChange={ onChange } isBlock size={ size } + disabled={ disabled } > { fontSizes.map( ( fontSize, index ) => ( { label={ T_SHIRT_ABBREVIATIONS[ index ] } aria-label={ fontSize.name || T_SHIRT_NAMES[ index ] } showTooltip + disabled={ disabled } /> ) ) } diff --git a/packages/components/src/font-size-picker/index.tsx b/packages/components/src/font-size-picker/index.tsx index 6bc2bd206ebe0a..018da88c9ac04e 100644 --- a/packages/components/src/font-size-picker/index.tsx +++ b/packages/components/src/font-size-picker/index.tsx @@ -42,6 +42,7 @@ const UnforwardedFontSizePicker = ( fallbackFontSize, fontSizes = [], disableCustomFontSizes = false, + disabled = false, onChange, size = 'default', units: unitsProp = DEFAULT_UNITS, @@ -96,7 +97,7 @@ const UnforwardedFontSizePicker = ( ); const isValueUnitRelative = !! valueUnit && [ 'em', 'rem', 'vw', 'vh' ].includes( valueUnit ); - const isDisabled = value === undefined; + const isDisabled = disabled || value === undefined; maybeWarnDeprecated36pxSize( { componentName: 'FontSizePicker', @@ -110,6 +111,7 @@ const UnforwardedFontSizePicker = ( className="components-font-size-picker" // This Container component renders a fieldset element that needs to be labeled. aria-labelledby={ labelId } + disabled={ disabled } >
@@ -129,6 +131,7 @@ const UnforwardedFontSizePicker = ( } isPressed={ currentPickerType === 'custom' } size="small" + disabled={ disabled } /> ) }
@@ -141,6 +144,7 @@ const UnforwardedFontSizePicker = ( value={ value } disableCustomFontSizes={ disableCustomFontSizes } size={ size } + disabled={ disabled } onChange={ ( newValue ) => { if ( newValue === undefined ) { onChange?.( undefined ); @@ -163,6 +167,7 @@ const UnforwardedFontSizePicker = ( value={ value } __next40pxDefaultSize={ __next40pxDefaultSize } size={ size } + disabled={ disabled } onChange={ ( newValue ) => { if ( newValue === undefined ) { onChange?.( undefined ); @@ -188,6 +193,7 @@ const UnforwardedFontSizePicker = ( labelPosition="top" hideLabelFromVision value={ value } + disabled={ disabled } onChange={ ( newValue ) => { setUserRequestedCustom( true ); @@ -221,6 +227,7 @@ const UnforwardedFontSizePicker = ( value={ valueQuantity } initialPosition={ fallbackFontSize } withInputField={ false } + disabled={ disabled } onChange={ ( newValue ) => { setUserRequestedCustom( true ); diff --git a/packages/components/src/font-size-picker/types.ts b/packages/components/src/font-size-picker/types.ts index 04964e05d45d55..b862120f27d2c7 100644 --- a/packages/components/src/font-size-picker/types.ts +++ b/packages/components/src/font-size-picker/types.ts @@ -6,6 +6,13 @@ export type FontSizePickerProps = { * @default false */ disableCustomFontSizes?: boolean; + /** + * If `true`, the font size picker will be disabled and the user will not + * be able to change the font size. + * + * @default false + */ + disabled?: boolean; /** * If no value exists, this prop defines the starting position for the font * size picker slider. Only relevant if `withSlider` is `true`. @@ -100,7 +107,7 @@ export type FontSize = { export type FontSizePickerSelectProps = Pick< FontSizePickerProps, - 'value' | 'size' + 'value' | 'size' | 'disabled' > & { fontSizes: NonNullable< FontSizePickerProps[ 'fontSizes' ] >; disableCustomFontSizes: NonNullable< @@ -120,7 +127,7 @@ export type FontSizePickerSelectOption = { export type FontSizePickerToggleGroupProps = Pick< FontSizePickerProps, - 'value' | 'size' | '__next40pxDefaultSize' + 'value' | 'size' | '__next40pxDefaultSize' | 'disabled' > & { fontSizes: NonNullable< FontSizePickerProps[ 'fontSizes' ] >; onChange: NonNullable< FontSizePickerProps[ 'onChange' ] >;