Make WordPress Core


Ignore:
Timestamp:
02/13/2026 01:51:03 AM (7 weeks ago)
Author:
ramonopoly
Message:

Block Supports: Add text indent to typography supports

This commit adds CSS text-indent support for paragraph blocks with traditional typography conventions - subsequent paragraphs get first-line indented in LTR languages, with an option to indent all paragraphs (default for RTL languages).

Text indentation is a fundamental typography feature. Traditional print typography conventions dictate that only subsequent paragraphs (not the first) should have their first line indented in LTR languages, while RTL languages typically indent all paragraphs. This feature enables proper typographic styling that matches publishing standards.

Props aaronrobertshaw, ramonopoly, andrewserong, wildworks, matveb, skorasaurus, greenshady, kjellr.

Fixes #64326.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-theme-json.php

    r61631 r61632  
    248248     * @since 6.7.0 Added `background-attachment` property.
    249249     * @since 7.0.0 Added `dimensions.width` and `dimensions.height`.
     250     *              Added `text-indent` property.
    250251     * @var array
    251252     */
     
    310311        'text-decoration'                   => array( 'typography', 'textDecoration' ),
    311312        'text-transform'                    => array( 'typography', 'textTransform' ),
     313        'text-indent'                       => array( 'typography', 'textIndent' ),
    312314        'filter'                            => array( 'filter', 'duotone' ),
    313315        'box-shadow'                        => array( 'shadow' ),
     
    410412     * @since 7.0.0 Added type markers to the schema for boolean values.
    411413     *              Added support for `dimensions.width` and `dimensions.height`.
     414     *              Added support for `typography.textIndent`.
    412415     * @var array
    413416     */
     
    495498            'textColumns'      => null,
    496499            'textDecoration'   => null,
     500            'textIndent'       => null,
    497501            'textTransform'    => null,
    498502            'writingMode'      => null,
     
    602606            'textColumns'    => null,
    603607            'textDecoration' => null,
     608            'textIndent'     => null,
    604609            'textTransform'  => null,
    605610            'writingMode'    => null,
     
    27512756
    27522757    /**
     2758     * Updates the text indent selector for paragraph blocks based on the textIndent setting.
     2759     *
     2760     * The textIndent setting can be 'subsequent' (default), 'all', or false.
     2761     * When set to 'all', the selector should be '.wp-block-paragraph' instead of
     2762     * '.wp-block-paragraph + .wp-block-paragraph' to apply indent to all paragraphs.
     2763     *
     2764     * @since 7.0.0
     2765     *
     2766     * @param array  $feature_declarations The feature declarations keyed by selector.
     2767     * @param array  $settings             The theme.json settings.
     2768     * @param string $block_name           The block name being processed.
     2769     * @return array The updated feature declarations.
     2770     */
     2771    private static function update_paragraph_text_indent_selector( $feature_declarations, $settings, $block_name ) {
     2772        if ( 'core/paragraph' !== $block_name ) {
     2773            return $feature_declarations;
     2774        }
     2775
     2776        // Check block-level settings first, then fall back to global settings.
     2777        $block_settings      = $settings['blocks']['core/paragraph'] ?? null;
     2778        $text_indent_setting = $block_settings['typography']['textIndent']
     2779            ?? $settings['typography']['textIndent']
     2780            ?? 'subsequent';
     2781
     2782        if ( 'all' !== $text_indent_setting ) {
     2783            return $feature_declarations;
     2784        }
     2785
     2786        // Look for the text indent selector and replace it.
     2787        $old_selector = '.wp-block-paragraph + .wp-block-paragraph';
     2788        $new_selector = '.wp-block-paragraph';
     2789
     2790        if ( isset( $feature_declarations[ $old_selector ] ) ) {
     2791            $declarations = $feature_declarations[ $old_selector ];
     2792            unset( $feature_declarations[ $old_selector ] );
     2793            $feature_declarations[ $new_selector ] = $declarations;
     2794        }
     2795
     2796        return $feature_declarations;
     2797    }
     2798
     2799    /**
    27532800     * An internal method to get the block nodes from a theme.json file.
    27542801     *
     
    29112958        $is_root_selector     = static::ROOT_BLOCK_SELECTOR === $selector;
    29122959
     2960        // Update text indent selector for paragraph blocks based on the textIndent setting.
     2961        $block_name           = $block_metadata['name'] ?? null;
     2962        $feature_declarations = static::update_paragraph_text_indent_selector( $feature_declarations, $settings, $block_name );
     2963
    29132964        // If there are style variations, generate the declarations for them, including any feature selectors the block may have.
    29142965        $style_variation_declarations    = array();
     
    29222973                // Generate any feature/subfeature style declarations for the current style variation.
    29232974                $variation_declarations = static::get_feature_declarations_for_node( $block_metadata, $style_variation_node );
     2975
     2976                // Update text indent selector for paragraph blocks based on the textIndent setting.
     2977                $variation_declarations = static::update_paragraph_text_indent_selector( $variation_declarations, $settings, $block_name );
    29242978
    29252979                // Combine selectors with style variation's selector and add to overall style variation declarations.
Note: See TracChangeset for help on using the changeset viewer.