RRZE-Webteam / rrze-elements-blocks

Sammlung von Gestaltungselementen für WordPress-Websites für den BlockEditor
GNU General Public License v3.0
2 stars 0 forks source link

A11y im Editor… Keyboard Shortcuts in die Elements-Blöcke einbauen #98

Open lukasniebler opened 2 months ago

lukasniebler commented 2 months ago

Keyboard-Shortcuts für gängige Blöcke einbauen.

lukasniebler commented 1 month ago

Snippets aus https://github.com/WordPress/gutenberg/blob/trunk/packages/block-library/src/button/edit.js

import { displayShortcut, isKeyboardEvent, ENTER } from '@wordpress/keycodes';

function onKeyDown( event ) {
        if ( isKeyboardEvent.primary( event, 'k' ) ) {
            startEditing( event );
        } else if ( isKeyboardEvent.primaryShift( event, 'k' ) ) {
            unlink();
            richTextRef.current?.focus();
        }
    }

const useEnterRef = useEnter( { content: text, clientId } );

function useEnter( props ) {
    const { replaceBlocks, selectionChange } = useDispatch( blockEditorStore );
    const { getBlock, getBlockRootClientId, getBlockIndex } =
        useSelect( blockEditorStore );
    const propsRef = useRef( props );
    propsRef.current = props;
    return useRefEffect( ( element ) => {
        function onKeyDown( event ) {
            if ( event.defaultPrevented || event.keyCode !== ENTER ) {
                return;
            }
            const { content, clientId } = propsRef.current;
            if ( content.length ) {
                return;
            }
            event.preventDefault();
            const topParentListBlock = getBlock(
                getBlockRootClientId( clientId )
            );
            const blockIndex = getBlockIndex( clientId );
            const head = cloneBlock( {
                ...topParentListBlock,
                innerBlocks: topParentListBlock.innerBlocks.slice(
                    0,
                    blockIndex
                ),
            } );
            const middle = createBlock( getDefaultBlockName() );
            const after = topParentListBlock.innerBlocks.slice(
                blockIndex + 1
            );
            const tail = after.length
                ? [
                        cloneBlock( {
                            ...topParentListBlock,
                            innerBlocks: after,
                        } ),
                  ]
                : [];
            replaceBlocks(
                topParentListBlock.clientId,
                [ head, middle, ...tail ],
                1
            );
            // We manually change the selection here because we are replacing
            // a different block than the selected one.
            selectionChange( middle.clientId );
        }

        element.addEventListener( 'keydown', onKeyDown );
        return () => {
            element.removeEventListener( 'keydown', onKeyDown );
        };
    }, [] );
}