@wordpress/block-editor 15.6.2 → 15.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/components/block-settings-menu/block-settings-dropdown.js +4 -1
- package/build/components/block-settings-menu/block-settings-dropdown.js.map +2 -2
- package/build/hooks/block-bindings.js +6 -2
- package/build/hooks/block-bindings.js.map +2 -2
- package/build/hooks/fit-text.js +22 -1
- package/build/hooks/fit-text.js.map +2 -2
- package/build-module/components/block-settings-menu/block-settings-dropdown.js +4 -1
- package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +2 -2
- package/build-module/hooks/block-bindings.js +6 -2
- package/build-module/hooks/block-bindings.js.map +2 -2
- package/build-module/hooks/fit-text.js +22 -1
- package/build-module/hooks/fit-text.js.map +2 -2
- package/package.json +2 -2
- package/src/components/block-settings-menu/block-settings-dropdown.js +4 -1
- package/src/hooks/block-bindings.js +6 -2
- package/src/hooks/fit-text.js +35 -3
|
@@ -296,7 +296,10 @@ function BlockSettingsDropdown({
|
|
|
296
296
|
count === 1 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
297
297
|
import_block_comment_icon_slot.default.Slot,
|
|
298
298
|
{
|
|
299
|
-
fillProps: {
|
|
299
|
+
fillProps: {
|
|
300
|
+
clientId: firstBlockClientId,
|
|
301
|
+
onClose
|
|
302
|
+
}
|
|
300
303
|
}
|
|
301
304
|
)
|
|
302
305
|
] }),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/block-settings-menu/block-settings-dropdown.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tgetBlockType,\n\tserialize,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\nimport { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { moreVertical } from '@wordpress/icons';\nimport { Children, cloneElement } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';\nimport { pipe, useCopyToClipboard } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport BlockActions from '../block-actions';\nimport CommentIconSlotFill from '../../components/collab/block-comment-icon-slot';\nimport BlockHTMLConvertButton from './block-html-convert-button';\nimport __unstableBlockSettingsMenuFirstItem from './block-settings-menu-first-item';\nimport BlockSettingsMenuControls from '../block-settings-menu-controls';\nimport BlockParentSelectorMenuItem from './block-parent-selector-menu-item';\nimport { store as blockEditorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\nimport { useNotifyCopy } from '../../utils/use-notify-copy';\n\nconst POPOVER_PROPS = {\n\tclassName: 'block-editor-block-settings-menu__popover',\n\tplacement: 'bottom-start',\n};\n\nfunction CopyMenuItem( {\n\tclientIds,\n\tonCopy,\n\tlabel,\n\tshortcut,\n\teventType = 'copy',\n\t__experimentalUpdateSelection: updateSelection = false,\n} ) {\n\tconst { getBlocksByClientId } = useSelect( blockEditorStore );\n\tconst { removeBlocks } = useDispatch( blockEditorStore );\n\tconst notifyCopy = useNotifyCopy();\n\tconst ref = useCopyToClipboard(\n\t\t() => serialize( getBlocksByClientId( clientIds ) ),\n\t\t() => {\n\t\t\tswitch ( eventType ) {\n\t\t\t\tcase 'copy':\n\t\t\t\tcase 'copyStyles':\n\t\t\t\t\tonCopy();\n\t\t\t\t\tnotifyCopy( eventType, clientIds );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'cut':\n\t\t\t\t\tnotifyCopy( eventType, clientIds );\n\t\t\t\t\tremoveBlocks( clientIds, updateSelection );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t);\n\tconst copyMenuItemLabel = label ? label : __( 'Copy' );\n\treturn (\n\t\t<MenuItem ref={ ref } shortcut={ shortcut }>\n\t\t\t{ copyMenuItemLabel }\n\t\t</MenuItem>\n\t);\n}\n\nexport function BlockSettingsDropdown( {\n\tblock,\n\tclientIds,\n\tchildren,\n\t__experimentalSelectBlock,\n\t...props\n} ) {\n\t// Get the client id of the current block for this menu, if one is set.\n\tconst currentClientId = block?.clientId;\n\tconst count = clientIds.length;\n\tconst firstBlockClientId = clientIds[ 0 ];\n\n\tconst {\n\t\tfirstParentClientId,\n\t\tparentBlockType,\n\t\tpreviousBlockClientId,\n\t\tselectedBlockClientIds,\n\t\topenedBlockSettingsMenu,\n\t\tisContentOnly,\n\t\tisZoomOut,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockName,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\tgetPreviousBlockClientId,\n\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\tgetBlockAttributes,\n\t\t\t\tgetOpenedBlockSettingsMenu,\n\t\t\t\tgetBlockEditingMode,\n\t\t\t\tisZoomOut: _isZoomOut,\n\t\t\t} = unlock( select( blockEditorStore ) );\n\n\t\t\tconst { getActiveBlockVariation } = select( blocksStore );\n\n\t\t\tconst _firstParentClientId =\n\t\t\t\tgetBlockRootClientId( firstBlockClientId );\n\t\t\tconst parentBlockName =\n\t\t\t\t_firstParentClientId && getBlockName( _firstParentClientId );\n\n\t\t\treturn {\n\t\t\t\tfirstParentClientId: _firstParentClientId,\n\t\t\t\tparentBlockType:\n\t\t\t\t\t_firstParentClientId &&\n\t\t\t\t\t( getActiveBlockVariation(\n\t\t\t\t\t\tparentBlockName,\n\t\t\t\t\t\tgetBlockAttributes( _firstParentClientId )\n\t\t\t\t\t) ||\n\t\t\t\t\t\tgetBlockType( parentBlockName ) ),\n\t\t\t\tpreviousBlockClientId:\n\t\t\t\t\tgetPreviousBlockClientId( firstBlockClientId ),\n\t\t\t\tselectedBlockClientIds: getSelectedBlockClientIds(),\n\t\t\t\topenedBlockSettingsMenu: getOpenedBlockSettingsMenu(),\n\t\t\t\tisContentOnly:\n\t\t\t\t\tgetBlockEditingMode( firstBlockClientId ) === 'contentOnly',\n\t\t\t\tisZoomOut: _isZoomOut(),\n\t\t\t};\n\t\t},\n\t\t[ firstBlockClientId ]\n\t);\n\n\tconst { getBlockOrder, getSelectedBlockClientIds } =\n\t\tuseSelect( blockEditorStore );\n\n\tconst { setOpenedBlockSettingsMenu } = unlock(\n\t\tuseDispatch( blockEditorStore )\n\t);\n\n\tconst shortcuts = useSelect( ( select ) => {\n\t\tconst { getShortcutRepresentation } = select( keyboardShortcutsStore );\n\t\treturn {\n\t\t\tcopy: getShortcutRepresentation( 'core/block-editor/copy' ),\n\t\t\tcut: getShortcutRepresentation( 'core/block-editor/cut' ),\n\t\t\tduplicate: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/duplicate'\n\t\t\t),\n\t\t\tremove: getShortcutRepresentation( 'core/block-editor/remove' ),\n\t\t\tinsertAfter: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/insert-after'\n\t\t\t),\n\t\t\tinsertBefore: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/insert-before'\n\t\t\t),\n\t\t};\n\t}, [] );\n\tconst hasSelectedBlocks = selectedBlockClientIds.length > 0;\n\n\tasync function updateSelectionAfterDuplicate( clientIdsPromise ) {\n\t\tif ( ! __experimentalSelectBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst ids = await clientIdsPromise;\n\t\tif ( ids && ids[ 0 ] ) {\n\t\t\t__experimentalSelectBlock( ids[ 0 ], false );\n\t\t}\n\t}\n\n\tfunction updateSelectionAfterRemove() {\n\t\tif ( ! __experimentalSelectBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet blockToFocus = previousBlockClientId || firstParentClientId;\n\n\t\t// Focus the first block if there's no previous block nor parent block.\n\t\tif ( ! blockToFocus ) {\n\t\t\tblockToFocus = getBlockOrder()[ 0 ];\n\t\t}\n\n\t\t// Only update the selection if the original selection is removed.\n\t\tconst shouldUpdateSelection =\n\t\t\thasSelectedBlocks && getSelectedBlockClientIds().length === 0;\n\n\t\t__experimentalSelectBlock( blockToFocus, shouldUpdateSelection );\n\t}\n\n\t// This can occur when the selected block (the parent)\n\t// displays child blocks within a List View.\n\tconst parentBlockIsSelected =\n\t\tselectedBlockClientIds?.includes( firstParentClientId );\n\n\t// When a currentClientId is in use, treat the menu as a controlled component.\n\t// This ensures that only one block settings menu is open at a time.\n\t// This is a temporary solution to work around an issue with `onFocusOutside`\n\t// where it does not allow a dropdown to be closed if focus was never within\n\t// the dropdown to begin with. Examples include a user either CMD+Clicking or\n\t// right clicking into an inactive window.\n\t// See: https://github.com/WordPress/gutenberg/pull/54083\n\tconst open = ! currentClientId\n\t\t? undefined\n\t\t: openedBlockSettingsMenu === currentClientId || false;\n\n\tfunction onToggle( localOpen ) {\n\t\tif ( localOpen && openedBlockSettingsMenu !== currentClientId ) {\n\t\t\tsetOpenedBlockSettingsMenu( currentClientId );\n\t\t} else if (\n\t\t\t! localOpen &&\n\t\t\topenedBlockSettingsMenu &&\n\t\t\topenedBlockSettingsMenu === currentClientId\n\t\t) {\n\t\t\tsetOpenedBlockSettingsMenu( undefined );\n\t\t}\n\t}\n\n\tconst shouldShowBlockParentMenuItem =\n\t\t! parentBlockIsSelected && !! firstParentClientId;\n\n\treturn (\n\t\t<BlockActions\n\t\t\tclientIds={ clientIds }\n\t\t\t__experimentalUpdateSelection={ ! __experimentalSelectBlock }\n\t\t>\n\t\t\t{ ( {\n\t\t\t\tcanCopyStyles,\n\t\t\t\tcanDuplicate,\n\t\t\t\tcanInsertBlock,\n\t\t\t\tcanRemove,\n\t\t\t\tonDuplicate,\n\t\t\t\tonInsertAfter,\n\t\t\t\tonInsertBefore,\n\t\t\t\tonRemove,\n\t\t\t\tonCopy,\n\t\t\t\tonPasteStyles,\n\t\t\t} ) => {\n\t\t\t\t// It is possible that some plugins register fills for this menu\n\t\t\t\t// even if Core doesn't render anything in the block settings menu.\n\t\t\t\t// in which case, we may want to render the menu anyway.\n\t\t\t\t// That said for now, we can start more conservative.\n\t\t\t\tconst isEmpty =\n\t\t\t\t\t! canRemove &&\n\t\t\t\t\t! canDuplicate &&\n\t\t\t\t\t! canInsertBlock &&\n\t\t\t\t\tisContentOnly;\n\n\t\t\t\tif ( isEmpty ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<DropdownMenu\n\t\t\t\t\t\ticon={ moreVertical }\n\t\t\t\t\t\tlabel={ __( 'Options' ) }\n\t\t\t\t\t\tclassName=\"block-editor-block-settings-menu\"\n\t\t\t\t\t\tpopoverProps={ POPOVER_PROPS }\n\t\t\t\t\t\topen={ open }\n\t\t\t\t\t\tonToggle={ onToggle }\n\t\t\t\t\t\tnoIcons\n\t\t\t\t\t\t{ ...props }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ ( { onClose } ) => (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t<__unstableBlockSettingsMenuFirstItem.Slot\n\t\t\t\t\t\t\t\t\t\tfillProps={ { onClose } }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{ shouldShowBlockParentMenuItem && (\n\t\t\t\t\t\t\t\t\t\t<BlockParentSelectorMenuItem\n\t\t\t\t\t\t\t\t\t\t\tparentClientId={\n\t\t\t\t\t\t\t\t\t\t\t\tfirstParentClientId\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tparentBlockType={ parentBlockType }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ count === 1 && (\n\t\t\t\t\t\t\t\t\t\t<BlockHTMLConvertButton\n\t\t\t\t\t\t\t\t\t\t\tclientId={ firstBlockClientId }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tonCopy={ onCopy }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.copy }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Cut' ) }\n\t\t\t\t\t\t\t\t\t\t\teventType=\"cut\"\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.cut }\n\t\t\t\t\t\t\t\t\t\t\t__experimentalUpdateSelection={\n\t\t\t\t\t\t\t\t\t\t\t\t! __experimentalSelectBlock\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ canDuplicate && (\n\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\tonDuplicate,\n\t\t\t\t\t\t\t\t\t\t\t\tupdateSelectionAfterDuplicate\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.duplicate }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Duplicate' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ canInsertBlock && ! isZoomOut && (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\tonInsertBefore\n\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut={\n\t\t\t\t\t\t\t\t\t\t\t\t\tshortcuts.insertBefore\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{ __( 'Add before' ) }\n\t\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\tonInsertAfter\n\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut={\n\t\t\t\t\t\t\t\t\t\t\t\t\tshortcuts.insertAfter\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{ __( 'Add after' ) }\n\t\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ count === 1 && (\n\t\t\t\t\t\t\t\t\t\t<CommentIconSlotFill.Slot\n\t\t\t\t\t\t\t\t\t\t\tfillProps={ { onClose } }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t{ canCopyStyles && ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tonCopy={ onCopy }\n\t\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Copy styles' ) }\n\t\t\t\t\t\t\t\t\t\t\teventType=\"copyStyles\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<MenuItem onClick={ onPasteStyles }>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Paste styles' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t<BlockSettingsMenuControls.Slot\n\t\t\t\t\t\t\t\t\t\tfillProps={ {\n\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\tcount,\n\t\t\t\t\t\t\t\t\t\t\tfirstBlockClientId,\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t{ typeof children === 'function'\n\t\t\t\t\t\t\t\t\t? children( { onClose } )\n\t\t\t\t\t\t\t\t\t: Children.map( ( child ) =>\n\t\t\t\t\t\t\t\t\t\t\tcloneElement( child, { onClose } )\n\t\t\t\t\t\t\t\t\t ) }\n\t\t\t\t\t\t\t\t{ canRemove && (\n\t\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\tonRemove,\n\t\t\t\t\t\t\t\t\t\t\t\tupdateSelectionAfterRemove\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.remove }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Delete' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</DropdownMenu>\n\t\t\t\t);\n\t\t\t} }\n\t\t</BlockActions>\n\t);\n}\n\nexport default BlockSettingsDropdown;\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tgetBlockType,\n\tserialize,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\nimport { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { moreVertical } from '@wordpress/icons';\nimport { Children, cloneElement } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';\nimport { pipe, useCopyToClipboard } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport BlockActions from '../block-actions';\nimport CommentIconSlotFill from '../../components/collab/block-comment-icon-slot';\nimport BlockHTMLConvertButton from './block-html-convert-button';\nimport __unstableBlockSettingsMenuFirstItem from './block-settings-menu-first-item';\nimport BlockSettingsMenuControls from '../block-settings-menu-controls';\nimport BlockParentSelectorMenuItem from './block-parent-selector-menu-item';\nimport { store as blockEditorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\nimport { useNotifyCopy } from '../../utils/use-notify-copy';\n\nconst POPOVER_PROPS = {\n\tclassName: 'block-editor-block-settings-menu__popover',\n\tplacement: 'bottom-start',\n};\n\nfunction CopyMenuItem( {\n\tclientIds,\n\tonCopy,\n\tlabel,\n\tshortcut,\n\teventType = 'copy',\n\t__experimentalUpdateSelection: updateSelection = false,\n} ) {\n\tconst { getBlocksByClientId } = useSelect( blockEditorStore );\n\tconst { removeBlocks } = useDispatch( blockEditorStore );\n\tconst notifyCopy = useNotifyCopy();\n\tconst ref = useCopyToClipboard(\n\t\t() => serialize( getBlocksByClientId( clientIds ) ),\n\t\t() => {\n\t\t\tswitch ( eventType ) {\n\t\t\t\tcase 'copy':\n\t\t\t\tcase 'copyStyles':\n\t\t\t\t\tonCopy();\n\t\t\t\t\tnotifyCopy( eventType, clientIds );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'cut':\n\t\t\t\t\tnotifyCopy( eventType, clientIds );\n\t\t\t\t\tremoveBlocks( clientIds, updateSelection );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t);\n\tconst copyMenuItemLabel = label ? label : __( 'Copy' );\n\treturn (\n\t\t<MenuItem ref={ ref } shortcut={ shortcut }>\n\t\t\t{ copyMenuItemLabel }\n\t\t</MenuItem>\n\t);\n}\n\nexport function BlockSettingsDropdown( {\n\tblock,\n\tclientIds,\n\tchildren,\n\t__experimentalSelectBlock,\n\t...props\n} ) {\n\t// Get the client id of the current block for this menu, if one is set.\n\tconst currentClientId = block?.clientId;\n\tconst count = clientIds.length;\n\tconst firstBlockClientId = clientIds[ 0 ];\n\n\tconst {\n\t\tfirstParentClientId,\n\t\tparentBlockType,\n\t\tpreviousBlockClientId,\n\t\tselectedBlockClientIds,\n\t\topenedBlockSettingsMenu,\n\t\tisContentOnly,\n\t\tisZoomOut,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockName,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\tgetPreviousBlockClientId,\n\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\tgetBlockAttributes,\n\t\t\t\tgetOpenedBlockSettingsMenu,\n\t\t\t\tgetBlockEditingMode,\n\t\t\t\tisZoomOut: _isZoomOut,\n\t\t\t} = unlock( select( blockEditorStore ) );\n\n\t\t\tconst { getActiveBlockVariation } = select( blocksStore );\n\n\t\t\tconst _firstParentClientId =\n\t\t\t\tgetBlockRootClientId( firstBlockClientId );\n\t\t\tconst parentBlockName =\n\t\t\t\t_firstParentClientId && getBlockName( _firstParentClientId );\n\n\t\t\treturn {\n\t\t\t\tfirstParentClientId: _firstParentClientId,\n\t\t\t\tparentBlockType:\n\t\t\t\t\t_firstParentClientId &&\n\t\t\t\t\t( getActiveBlockVariation(\n\t\t\t\t\t\tparentBlockName,\n\t\t\t\t\t\tgetBlockAttributes( _firstParentClientId )\n\t\t\t\t\t) ||\n\t\t\t\t\t\tgetBlockType( parentBlockName ) ),\n\t\t\t\tpreviousBlockClientId:\n\t\t\t\t\tgetPreviousBlockClientId( firstBlockClientId ),\n\t\t\t\tselectedBlockClientIds: getSelectedBlockClientIds(),\n\t\t\t\topenedBlockSettingsMenu: getOpenedBlockSettingsMenu(),\n\t\t\t\tisContentOnly:\n\t\t\t\t\tgetBlockEditingMode( firstBlockClientId ) === 'contentOnly',\n\t\t\t\tisZoomOut: _isZoomOut(),\n\t\t\t};\n\t\t},\n\t\t[ firstBlockClientId ]\n\t);\n\n\tconst { getBlockOrder, getSelectedBlockClientIds } =\n\t\tuseSelect( blockEditorStore );\n\n\tconst { setOpenedBlockSettingsMenu } = unlock(\n\t\tuseDispatch( blockEditorStore )\n\t);\n\n\tconst shortcuts = useSelect( ( select ) => {\n\t\tconst { getShortcutRepresentation } = select( keyboardShortcutsStore );\n\t\treturn {\n\t\t\tcopy: getShortcutRepresentation( 'core/block-editor/copy' ),\n\t\t\tcut: getShortcutRepresentation( 'core/block-editor/cut' ),\n\t\t\tduplicate: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/duplicate'\n\t\t\t),\n\t\t\tremove: getShortcutRepresentation( 'core/block-editor/remove' ),\n\t\t\tinsertAfter: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/insert-after'\n\t\t\t),\n\t\t\tinsertBefore: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/insert-before'\n\t\t\t),\n\t\t};\n\t}, [] );\n\tconst hasSelectedBlocks = selectedBlockClientIds.length > 0;\n\n\tasync function updateSelectionAfterDuplicate( clientIdsPromise ) {\n\t\tif ( ! __experimentalSelectBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst ids = await clientIdsPromise;\n\t\tif ( ids && ids[ 0 ] ) {\n\t\t\t__experimentalSelectBlock( ids[ 0 ], false );\n\t\t}\n\t}\n\n\tfunction updateSelectionAfterRemove() {\n\t\tif ( ! __experimentalSelectBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet blockToFocus = previousBlockClientId || firstParentClientId;\n\n\t\t// Focus the first block if there's no previous block nor parent block.\n\t\tif ( ! blockToFocus ) {\n\t\t\tblockToFocus = getBlockOrder()[ 0 ];\n\t\t}\n\n\t\t// Only update the selection if the original selection is removed.\n\t\tconst shouldUpdateSelection =\n\t\t\thasSelectedBlocks && getSelectedBlockClientIds().length === 0;\n\n\t\t__experimentalSelectBlock( blockToFocus, shouldUpdateSelection );\n\t}\n\n\t// This can occur when the selected block (the parent)\n\t// displays child blocks within a List View.\n\tconst parentBlockIsSelected =\n\t\tselectedBlockClientIds?.includes( firstParentClientId );\n\n\t// When a currentClientId is in use, treat the menu as a controlled component.\n\t// This ensures that only one block settings menu is open at a time.\n\t// This is a temporary solution to work around an issue with `onFocusOutside`\n\t// where it does not allow a dropdown to be closed if focus was never within\n\t// the dropdown to begin with. Examples include a user either CMD+Clicking or\n\t// right clicking into an inactive window.\n\t// See: https://github.com/WordPress/gutenberg/pull/54083\n\tconst open = ! currentClientId\n\t\t? undefined\n\t\t: openedBlockSettingsMenu === currentClientId || false;\n\n\tfunction onToggle( localOpen ) {\n\t\tif ( localOpen && openedBlockSettingsMenu !== currentClientId ) {\n\t\t\tsetOpenedBlockSettingsMenu( currentClientId );\n\t\t} else if (\n\t\t\t! localOpen &&\n\t\t\topenedBlockSettingsMenu &&\n\t\t\topenedBlockSettingsMenu === currentClientId\n\t\t) {\n\t\t\tsetOpenedBlockSettingsMenu( undefined );\n\t\t}\n\t}\n\n\tconst shouldShowBlockParentMenuItem =\n\t\t! parentBlockIsSelected && !! firstParentClientId;\n\n\treturn (\n\t\t<BlockActions\n\t\t\tclientIds={ clientIds }\n\t\t\t__experimentalUpdateSelection={ ! __experimentalSelectBlock }\n\t\t>\n\t\t\t{ ( {\n\t\t\t\tcanCopyStyles,\n\t\t\t\tcanDuplicate,\n\t\t\t\tcanInsertBlock,\n\t\t\t\tcanRemove,\n\t\t\t\tonDuplicate,\n\t\t\t\tonInsertAfter,\n\t\t\t\tonInsertBefore,\n\t\t\t\tonRemove,\n\t\t\t\tonCopy,\n\t\t\t\tonPasteStyles,\n\t\t\t} ) => {\n\t\t\t\t// It is possible that some plugins register fills for this menu\n\t\t\t\t// even if Core doesn't render anything in the block settings menu.\n\t\t\t\t// in which case, we may want to render the menu anyway.\n\t\t\t\t// That said for now, we can start more conservative.\n\t\t\t\tconst isEmpty =\n\t\t\t\t\t! canRemove &&\n\t\t\t\t\t! canDuplicate &&\n\t\t\t\t\t! canInsertBlock &&\n\t\t\t\t\tisContentOnly;\n\n\t\t\t\tif ( isEmpty ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<DropdownMenu\n\t\t\t\t\t\ticon={ moreVertical }\n\t\t\t\t\t\tlabel={ __( 'Options' ) }\n\t\t\t\t\t\tclassName=\"block-editor-block-settings-menu\"\n\t\t\t\t\t\tpopoverProps={ POPOVER_PROPS }\n\t\t\t\t\t\topen={ open }\n\t\t\t\t\t\tonToggle={ onToggle }\n\t\t\t\t\t\tnoIcons\n\t\t\t\t\t\t{ ...props }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ ( { onClose } ) => (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t<__unstableBlockSettingsMenuFirstItem.Slot\n\t\t\t\t\t\t\t\t\t\tfillProps={ { onClose } }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{ shouldShowBlockParentMenuItem && (\n\t\t\t\t\t\t\t\t\t\t<BlockParentSelectorMenuItem\n\t\t\t\t\t\t\t\t\t\t\tparentClientId={\n\t\t\t\t\t\t\t\t\t\t\t\tfirstParentClientId\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tparentBlockType={ parentBlockType }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ count === 1 && (\n\t\t\t\t\t\t\t\t\t\t<BlockHTMLConvertButton\n\t\t\t\t\t\t\t\t\t\t\tclientId={ firstBlockClientId }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tonCopy={ onCopy }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.copy }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Cut' ) }\n\t\t\t\t\t\t\t\t\t\t\teventType=\"cut\"\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.cut }\n\t\t\t\t\t\t\t\t\t\t\t__experimentalUpdateSelection={\n\t\t\t\t\t\t\t\t\t\t\t\t! __experimentalSelectBlock\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ canDuplicate && (\n\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\tonDuplicate,\n\t\t\t\t\t\t\t\t\t\t\t\tupdateSelectionAfterDuplicate\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.duplicate }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Duplicate' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ canInsertBlock && ! isZoomOut && (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\tonInsertBefore\n\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut={\n\t\t\t\t\t\t\t\t\t\t\t\t\tshortcuts.insertBefore\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{ __( 'Add before' ) }\n\t\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\tonInsertAfter\n\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut={\n\t\t\t\t\t\t\t\t\t\t\t\t\tshortcuts.insertAfter\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{ __( 'Add after' ) }\n\t\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ count === 1 && (\n\t\t\t\t\t\t\t\t\t\t<CommentIconSlotFill.Slot\n\t\t\t\t\t\t\t\t\t\t\tfillProps={ {\n\t\t\t\t\t\t\t\t\t\t\t\tclientId: firstBlockClientId,\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t{ canCopyStyles && ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tonCopy={ onCopy }\n\t\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Copy styles' ) }\n\t\t\t\t\t\t\t\t\t\t\teventType=\"copyStyles\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<MenuItem onClick={ onPasteStyles }>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Paste styles' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t<BlockSettingsMenuControls.Slot\n\t\t\t\t\t\t\t\t\t\tfillProps={ {\n\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\tcount,\n\t\t\t\t\t\t\t\t\t\t\tfirstBlockClientId,\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t{ typeof children === 'function'\n\t\t\t\t\t\t\t\t\t? children( { onClose } )\n\t\t\t\t\t\t\t\t\t: Children.map( ( child ) =>\n\t\t\t\t\t\t\t\t\t\t\tcloneElement( child, { onClose } )\n\t\t\t\t\t\t\t\t\t ) }\n\t\t\t\t\t\t\t\t{ canRemove && (\n\t\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\tonRemove,\n\t\t\t\t\t\t\t\t\t\t\t\tupdateSelectionAfterRemove\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.remove }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Delete' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</DropdownMenu>\n\t\t\t\t);\n\t\t\t} }\n\t\t</BlockActions>\n\t);\n}\n\nexport default BlockSettingsDropdown;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiEE;AA9DF,oBAIO;AACP,wBAAkD;AAClD,kBAAuC;AACvC,mBAA6B;AAC7B,qBAAuC;AACvC,kBAAmB;AACnB,gCAAgD;AAChD,qBAAyC;AAKzC,2BAAyB;AACzB,qCAAgC;AAChC,uCAAmC;AACnC,4CAAiD;AACjD,0CAAsC;AACtC,6CAAwC;AACxC,mBAA0C;AAC1C,yBAAuB;AACvB,6BAA8B;AAE9B,MAAM,gBAAgB;AAAA,EACrB,WAAW;AAAA,EACX,WAAW;AACZ;AAEA,SAAS,aAAc;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,+BAA+B,kBAAkB;AAClD,GAAI;AACH,QAAM,EAAE,oBAAoB,QAAI,uBAAW,aAAAA,KAAiB;AAC5D,QAAM,EAAE,aAAa,QAAI,yBAAa,aAAAA,KAAiB;AACvD,QAAM,iBAAa,sCAAc;AACjC,QAAM,UAAM;AAAA,IACX,UAAM,yBAAW,oBAAqB,SAAU,CAAE;AAAA,IAClD,MAAM;AACL,cAAS,WAAY;AAAA,QACpB,KAAK;AAAA,QACL,KAAK;AACJ,iBAAO;AACP,qBAAY,WAAW,SAAU;AACjC;AAAA,QACD,KAAK;AACJ,qBAAY,WAAW,SAAU;AACjC,uBAAc,WAAW,eAAgB;AACzC;AAAA,QACD;AACC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AACA,QAAM,oBAAoB,QAAQ,YAAQ,gBAAI,MAAO;AACrD,SACC,4CAAC,8BAAS,KAAY,UACnB,6BACH;AAEF;AAEO,SAAS,sBAAuB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAI;AAEH,QAAM,kBAAkB,OAAO;AAC/B,QAAM,QAAQ,UAAU;AACxB,QAAM,qBAAqB,UAAW,CAAE;AAExC,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,QAAI;AAAA,IACH,CAAE,WAAY;AACb,YAAM;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,2BAAAC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACZ,QAAI,2BAAQ,OAAQ,aAAAD,KAAiB,CAAE;AAEvC,YAAM,EAAE,wBAAwB,IAAI,OAAQ,cAAAE,KAAY;AAExD,YAAM,uBACL,qBAAsB,kBAAmB;AAC1C,YAAM,kBACL,wBAAwB,aAAc,oBAAqB;AAE5D,aAAO;AAAA,QACN,qBAAqB;AAAA,QACrB,iBACC,yBACE;AAAA,UACD;AAAA,UACA,mBAAoB,oBAAqB;AAAA,QAC1C,SACC,4BAAc,eAAgB;AAAA,QAChC,uBACC,yBAA0B,kBAAmB;AAAA,QAC9C,wBAAwBD,2BAA0B;AAAA,QAClD,yBAAyB,2BAA2B;AAAA,QACpD,eACC,oBAAqB,kBAAmB,MAAM;AAAA,QAC/C,WAAW,WAAW;AAAA,MACvB;AAAA,IACD;AAAA,IACA,CAAE,kBAAmB;AAAA,EACtB;AAEA,QAAM,EAAE,eAAe,0BAA0B,QAChD,uBAAW,aAAAD,KAAiB;AAE7B,QAAM,EAAE,2BAA2B,QAAI;AAAA,QACtC,yBAAa,aAAAA,KAAiB;AAAA,EAC/B;AAEA,QAAM,gBAAY,uBAAW,CAAE,WAAY;AAC1C,UAAM,EAAE,0BAA0B,IAAI,OAAQ,0BAAAG,KAAuB;AACrE,WAAO;AAAA,MACN,MAAM,0BAA2B,wBAAyB;AAAA,MAC1D,KAAK,0BAA2B,uBAAwB;AAAA,MACxD,WAAW;AAAA,QACV;AAAA,MACD;AAAA,MACA,QAAQ,0BAA2B,0BAA2B;AAAA,MAC9D,aAAa;AAAA,QACZ;AAAA,MACD;AAAA,MACA,cAAc;AAAA,QACb;AAAA,MACD;AAAA,IACD;AAAA,EACD,GAAG,CAAC,CAAE;AACN,QAAM,oBAAoB,uBAAuB,SAAS;AAE1D,iBAAe,8BAA+B,kBAAmB;AAChE,QAAK,CAAE,2BAA4B;AAClC;AAAA,IACD;AAEA,UAAM,MAAM,MAAM;AAClB,QAAK,OAAO,IAAK,CAAE,GAAI;AACtB,gCAA2B,IAAK,CAAE,GAAG,KAAM;AAAA,IAC5C;AAAA,EACD;AAEA,WAAS,6BAA6B;AACrC,QAAK,CAAE,2BAA4B;AAClC;AAAA,IACD;AAEA,QAAI,eAAe,yBAAyB;AAG5C,QAAK,CAAE,cAAe;AACrB,qBAAe,cAAc,EAAG,CAAE;AAAA,IACnC;AAGA,UAAM,wBACL,qBAAqB,0BAA0B,EAAE,WAAW;AAE7D,8BAA2B,cAAc,qBAAsB;AAAA,EAChE;AAIA,QAAM,wBACL,wBAAwB,SAAU,mBAAoB;AASvD,QAAM,OAAO,CAAE,kBACZ,SACA,4BAA4B,mBAAmB;AAElD,WAAS,SAAU,WAAY;AAC9B,QAAK,aAAa,4BAA4B,iBAAkB;AAC/D,iCAA4B,eAAgB;AAAA,IAC7C,WACC,CAAE,aACF,2BACA,4BAA4B,iBAC3B;AACD,iCAA4B,MAAU;AAAA,IACvC;AAAA,EACD;AAEA,QAAM,gCACL,CAAE,yBAAyB,CAAC,CAAE;AAE/B,SACC;AAAA,IAAC,qBAAAC;AAAA,IAAA;AAAA,MACA;AAAA,MACA,+BAAgC,CAAE;AAAA,MAEhC,WAAE;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,MAAO;AAKN,cAAM,UACL,CAAE,aACF,CAAE,gBACF,CAAE,kBACF;AAED,YAAK,SAAU;AACd,iBAAO;AAAA,QACR;AAEA,eACC;AAAA,UAAC;AAAA;AAAA,YACA,MAAO;AAAA,YACP,WAAQ,gBAAI,SAAU;AAAA,YACtB,WAAU;AAAA,YACV,cAAe;AAAA,YACf;AAAA,YACA;AAAA,YACA,SAAO;AAAA,YACL,GAAG;AAAA,YAEH,WAAE,EAAE,QAAQ,MACb,4EACC;AAAA,2DAAC,+BACA;AAAA;AAAA,kBAAC,sCAAAC,QAAqC;AAAA,kBAArC;AAAA,oBACA,WAAY,EAAE,QAAQ;AAAA;AAAA,gBACvB;AAAA,gBACE,iCACD;AAAA,kBAAC,uCAAAC;AAAA,kBAAA;AAAA,oBACA,gBACC;AAAA,oBAED;AAAA;AAAA,gBACD;AAAA,gBAEC,UAAU,KACX;AAAA,kBAAC,iCAAAC;AAAA,kBAAA;AAAA,oBACA,UAAW;AAAA;AAAA,gBACZ;AAAA,gBAEC,CAAE,iBACH;AAAA,kBAAC;AAAA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,UAAW,UAAU;AAAA;AAAA,gBACtB;AAAA,gBAEC,CAAE,iBACH;AAAA,kBAAC;AAAA;AAAA,oBACA;AAAA,oBACA,WAAQ,gBAAI,KAAM;AAAA,oBAClB,WAAU;AAAA,oBACV,UAAW,UAAU;AAAA,oBACrB,+BACC,CAAE;AAAA;AAAA,gBAEJ;AAAA,gBAEC,gBACD;AAAA,kBAAC;AAAA;AAAA,oBACA,aAAU;AAAA,sBACT;AAAA,sBACA;AAAA,sBACA;AAAA,oBACD;AAAA,oBACA,UAAW,UAAU;AAAA,oBAEnB,8BAAI,WAAY;AAAA;AAAA,gBACnB;AAAA,gBAEC,kBAAkB,CAAE,aACrB,4EACC;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACA,aAAU;AAAA,wBACT;AAAA,wBACA;AAAA,sBACD;AAAA,sBACA,UACC,UAAU;AAAA,sBAGT,8BAAI,YAAa;AAAA;AAAA,kBACpB;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACA,aAAU;AAAA,wBACT;AAAA,wBACA;AAAA,sBACD;AAAA,sBACA,UACC,UAAU;AAAA,sBAGT,8BAAI,WAAY;AAAA;AAAA,kBACnB;AAAA,mBACD;AAAA,gBAEC,UAAU,KACX;AAAA,kBAAC,+BAAAC,QAAoB;AAAA,kBAApB;AAAA,oBACA,WAAY;AAAA,sBACX,UAAU;AAAA,sBACV;AAAA,oBACD;AAAA;AAAA,gBACD;AAAA,iBAEF;AAAA,cACE,iBAAiB,CAAE,iBACpB,6CAAC,+BACA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,WAAQ,gBAAI,aAAc;AAAA,oBAC1B,WAAU;AAAA;AAAA,gBACX;AAAA,gBACA,4CAAC,8BAAS,SAAU,eACjB,8BAAI,cAAe,GACtB;AAAA,iBACD;AAAA,cAEC,CAAE,iBACH;AAAA,gBAAC,oCAAAC,QAA0B;AAAA,gBAA1B;AAAA,kBACA,WAAY;AAAA,oBACX;AAAA,oBACA;AAAA,oBACA;AAAA,kBACD;AAAA,kBACA;AAAA;AAAA,cACD;AAAA,cAEC,OAAO,aAAa,aACnB,SAAU,EAAE,QAAQ,CAAE,IACtB,wBAAS;AAAA,gBAAK,CAAE,cAChB,6BAAc,OAAO,EAAE,QAAQ,CAAE;AAAA,cACjC;AAAA,cACD,aACD,4CAAC,+BACA;AAAA,gBAAC;AAAA;AAAA,kBACA,aAAU;AAAA,oBACT;AAAA,oBACA;AAAA,oBACA;AAAA,kBACD;AAAA,kBACA,UAAW,UAAU;AAAA,kBAEnB,8BAAI,QAAS;AAAA;AAAA,cAChB,GACD;AAAA,eAEF;AAAA;AAAA,QAEF;AAAA,MAEF;AAAA;AAAA,EACD;AAEF;AAEA,IAAO,kCAAQ;",
|
|
6
6
|
"names": ["blockEditorStore", "getSelectedBlockClientIds", "blocksStore", "keyboardShortcutsStore", "BlockActions", "__unstableBlockSettingsMenuFirstItem", "BlockParentSelectorMenuItem", "BlockHTMLConvertButton", "CommentIconSlotFill", "BlockSettingsMenuControls"]
|
|
7
7
|
}
|
|
@@ -359,8 +359,12 @@ const BlockBindingsPanel = ({ name: blockName, metadata }) => {
|
|
|
359
359
|
var block_bindings_default = {
|
|
360
360
|
edit: BlockBindingsPanel,
|
|
361
361
|
attributeKeys: ["metadata"],
|
|
362
|
-
hasSupport() {
|
|
363
|
-
return
|
|
362
|
+
hasSupport(name) {
|
|
363
|
+
return ![
|
|
364
|
+
"core/post-date",
|
|
365
|
+
"core/navigation-link",
|
|
366
|
+
"core/navigation-submenu"
|
|
367
|
+
].includes(name);
|
|
364
368
|
}
|
|
365
369
|
};
|
|
366
370
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/block-bindings.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { getBlockBindingsSources, getBlockType } from '@wordpress/blocks';\nimport {\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalItem as Item,\n\t__experimentalText as Text,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalVStack as VStack,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { useContext } from '@wordpress/element';\nimport { useViewportMatch } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { useBlockBindingsUtils } from '../utils/block-bindings';\nimport { unlock } from '../lock-unlock';\nimport InspectorControls from '../components/inspector-controls';\nimport BlockContext from '../components/block-context';\nimport { useBlockEditContext } from '../components/block-edit';\nimport { store as blockEditorStore } from '../store';\n\nconst { Menu } = unlock( componentsPrivateApis );\n\nconst EMPTY_OBJECT = {};\n\n/**\n * Get the normalized attribute type for block bindings.\n * Converts 'rich-text' to 'string' since rich-text is stored as string.\n *\n * @param {string} blockName The block name.\n * @param {string} attribute The attribute name.\n * @return {string} The normalized attribute type.\n */\nconst getAttributeType = ( blockName, attribute ) => {\n\tconst _attributeType =\n\t\tgetBlockType( blockName ).attributes?.[ attribute ]?.type;\n\treturn _attributeType === 'rich-text' ? 'string' : _attributeType;\n};\n\nconst useToolsPanelDropdownMenuProps = () => {\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\treturn ! isMobile\n\t\t? {\n\t\t\t\tpopoverProps: {\n\t\t\t\t\tplacement: 'left-start',\n\t\t\t\t\t// For non-mobile, inner sidebar width (248px) - button width (24px) - border (1px) + padding (16px) + spacing (20px)\n\t\t\t\t\toffset: 259,\n\t\t\t\t},\n\t\t }\n\t\t: {};\n};\n\nfunction BlockBindingsPanelMenuContent( { attribute, binding, sources } ) {\n\tconst { clientId } = useBlockEditContext();\n\tconst { updateBlockBindings } = useBlockBindingsUtils();\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\tconst blockContext = useContext( BlockContext );\n\tconst { attributeType, select } = useSelect(\n\t\t( _select ) => {\n\t\t\tconst { name: blockName } =\n\t\t\t\t_select( blockEditorStore ).getBlock( clientId );\n\t\t\treturn {\n\t\t\t\tattributeType: getAttributeType( blockName, attribute ),\n\t\t\t\tselect: _select,\n\t\t\t};\n\t\t},\n\t\t[ clientId, attribute ]\n\t);\n\treturn (\n\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t{ Object.entries( sources ).map( ( [ sourceKey, source ] ) => {\n\t\t\t\t// Only show sources that have compatible data for this specific attribute.\n\t\t\t\tconst sourceDataItems = source.data?.filter(\n\t\t\t\t\t( item ) => item?.type === attributeType\n\t\t\t\t);\n\n\t\t\t\tconst noItemsAvailable =\n\t\t\t\t\t! sourceDataItems || sourceDataItems.length === 0;\n\n\t\t\t\tif ( noItemsAvailable ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<Menu\n\t\t\t\t\t\tkey={ sourceKey }\n\t\t\t\t\t\tplacement={ isMobile ? 'bottom-start' : 'left-start' }\n\t\t\t\t\t>\n\t\t\t\t\t\t<Menu.SubmenuTriggerItem>\n\t\t\t\t\t\t\t<Menu.ItemLabel>{ source.label }</Menu.ItemLabel>\n\t\t\t\t\t\t</Menu.SubmenuTriggerItem>\n\t\t\t\t\t\t<Menu.Popover gutter={ 8 }>\n\t\t\t\t\t\t\t<Menu.Group>\n\t\t\t\t\t\t\t\t{ sourceDataItems.map( ( item ) => {\n\t\t\t\t\t\t\t\t\tconst itemBindings = {\n\t\t\t\t\t\t\t\t\t\tsource: sourceKey,\n\t\t\t\t\t\t\t\t\t\targs: item?.args || {\n\t\t\t\t\t\t\t\t\t\t\tkey: item.key,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tconst values = source.getValues( {\n\t\t\t\t\t\t\t\t\t\tselect,\n\t\t\t\t\t\t\t\t\t\tcontext: blockContext,\n\t\t\t\t\t\t\t\t\t\tbindings: {\n\t\t\t\t\t\t\t\t\t\t\t[ attribute ]: itemBindings,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Menu.CheckboxItem\n\t\t\t\t\t\t\t\t\t\t\tkey={\n\t\t\t\t\t\t\t\t\t\t\t\tsourceKey +\n\t\t\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t\t) || item.key\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst isCurrentlySelected =\n\t\t\t\t\t\t\t\t\t\t\t\t\tfastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t\t) ??\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Deprecate key dependency in 7.0.\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.key ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args?.key;\n\n\t\t\t\t\t\t\t\t\t\t\t\tif ( isCurrentlySelected ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Unset if the same item is selected again.\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ attribute ]:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ attribute ]:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\titemBindings,\n\t\t\t\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\tname={ attribute + '-binding' }\n\t\t\t\t\t\t\t\t\t\t\tvalue={ values[ attribute ] }\n\t\t\t\t\t\t\t\t\t\t\tchecked={\n\t\t\t\t\t\t\t\t\t\t\t\tfastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args,\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t) ??\n\t\t\t\t\t\t\t\t\t\t\t\t// Deprecate key dependency in 7.0.\n\t\t\t\t\t\t\t\t\t\t\t\titem.key === binding?.args?.key\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Menu.ItemLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t{ item?.label }\n\t\t\t\t\t\t\t\t\t\t\t</Menu.ItemLabel>\n\t\t\t\t\t\t\t\t\t\t\t<Menu.ItemHelpText>\n\t\t\t\t\t\t\t\t\t\t\t\t{ values[ attribute ] }\n\t\t\t\t\t\t\t\t\t\t\t</Menu.ItemHelpText>\n\t\t\t\t\t\t\t\t\t\t</Menu.CheckboxItem>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</Menu.Group>\n\t\t\t\t\t\t</Menu.Popover>\n\t\t\t\t\t</Menu>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Menu>\n\t);\n}\n\nfunction BlockBindingsAttribute( { attribute, binding, sources, blockName } ) {\n\tconst { source: sourceName, args } = binding || {};\n\tconst source = sources?.[ sourceName ];\n\n\tlet displayText;\n\tlet isValid = true;\n\tconst isNotBound = binding === undefined;\n\n\tif ( isNotBound ) {\n\t\t// Check if there are any compatible sources for this attribute type.\n\t\tconst attributeType = getAttributeType( blockName, attribute );\n\n\t\tconst hasCompatibleSources = Object.values( sources ).some( ( src ) =>\n\t\t\tsrc.data?.some( ( item ) => item?.type === attributeType )\n\t\t);\n\n\t\tif ( ! hasCompatibleSources ) {\n\t\t\tdisplayText = __( 'No sources available' );\n\t\t} else {\n\t\t\tdisplayText = __( 'Not connected' );\n\t\t}\n\t\tisValid = true;\n\t} else if ( ! source ) {\n\t\t// If there's a binding but the source is not found, it's invalid.\n\t\tisValid = false;\n\t\tdisplayText = __( 'Source not registered' );\n\t\tif ( Object.keys( sources ).length === 0 ) {\n\t\t\tdisplayText = __( 'No sources available' );\n\t\t}\n\t} else {\n\t\tdisplayText =\n\t\t\tsource.data?.find( ( item ) => fastDeepEqual( item.args, args ) )\n\t\t\t\t?.label ||\n\t\t\tsource.label ||\n\t\t\tsourceName;\n\t}\n\n\treturn (\n\t\t<VStack className=\"block-editor-bindings__item\" spacing={ 0 }>\n\t\t\t<Text truncate>{ attribute }</Text>\n\t\t\t<Text\n\t\t\t\ttruncate\n\t\t\t\tvariant={ isValid ? 'muted' : undefined }\n\t\t\t\tisDestructive={ ! isValid }\n\t\t\t>\n\t\t\t\t{ displayText }\n\t\t\t</Text>\n\t\t</VStack>\n\t);\n}\n\nfunction ReadOnlyBlockBindingsPanelItem( {\n\tattribute,\n\tbinding,\n\tsources,\n\tblockName,\n} ) {\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\n\treturn (\n\t\t<ToolsPanelItem hasValue={ () => !! binding } label={ attribute }>\n\t\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t\t<Menu.TriggerButton render={ <Item /> } disabled>\n\t\t\t\t\t<BlockBindingsAttribute\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.TriggerButton>\n\t\t\t</Menu>\n\t\t</ToolsPanelItem>\n\t);\n}\n\nfunction EditableBlockBindingsPanelItem( {\n\tattribute,\n\tbinding,\n\tsources,\n\tblockName,\n} ) {\n\tconst { updateBlockBindings } = useBlockBindingsUtils();\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\n\treturn (\n\t\t<ToolsPanelItem\n\t\t\thasValue={ () => !! binding }\n\t\t\tlabel={ attribute }\n\t\t\tonDeselect={ () => {\n\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t[ attribute ]: undefined,\n\t\t\t\t} );\n\t\t\t} }\n\t\t>\n\t\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t\t<Menu.TriggerButton render={ <Item /> }>\n\t\t\t\t\t<BlockBindingsAttribute\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.TriggerButton>\n\t\t\t\t<Menu.Popover gutter={ isMobile ? 8 : 36 }>\n\t\t\t\t\t<BlockBindingsPanelMenuContent\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.Popover>\n\t\t\t</Menu>\n\t\t</ToolsPanelItem>\n\t);\n}\n\nexport const BlockBindingsPanel = ( { name: blockName, metadata } ) => {\n\tconst blockContext = useContext( BlockContext );\n\tconst { removeAllBlockBindings } = useBlockBindingsUtils();\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\n\t// Use useSelect to ensure sources are updated whenever there are updates in block context\n\t// or when underlying data changes.\n\t// Still needs a fix regarding _sources scope.\n\tconst _sources = {};\n\tconst { sources, canUpdateBlockBindings, bindableAttributes } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { __experimentalBlockBindingsSupportedAttributes } =\n\t\t\t\tselect( blockEditorStore ).getSettings();\n\t\t\tconst _bindableAttributes =\n\t\t\t\t__experimentalBlockBindingsSupportedAttributes?.[ blockName ];\n\t\t\tif ( ! _bindableAttributes || _bindableAttributes.length === 0 ) {\n\t\t\t\treturn EMPTY_OBJECT;\n\t\t\t}\n\n\t\t\tconst registeredSources = getBlockBindingsSources();\n\t\t\tObject.entries( registeredSources ).forEach(\n\t\t\t\t( [\n\t\t\t\t\tsourceName,\n\t\t\t\t\t{ getFieldsList, usesContext, label, getValues },\n\t\t\t\t] ) => {\n\t\t\t\t\t// Populate context.\n\t\t\t\t\tconst context = {};\n\t\t\t\t\tif ( usesContext?.length ) {\n\t\t\t\t\t\tfor ( const key of usesContext ) {\n\t\t\t\t\t\t\tcontext[ key ] = blockContext[ key ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( getFieldsList ) {\n\t\t\t\t\t\tconst fieldsListResult = getFieldsList( {\n\t\t\t\t\t\t\tselect,\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t} );\n\t\t\t\t\t\t_sources[ sourceName ] = {\n\t\t\t\t\t\t\tdata: fieldsListResult || [],\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tgetValues,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Include sources without getFieldsList if they are already used in a binding.\n\t\t\t\t\t\t * This allows them to be displayed in read-only mode.\n\t\t\t\t\t\t */\n\t\t\t\t\t\t_sources[ sourceName ] = {\n\t\t\t\t\t\t\tdata: [],\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tgetValues,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tsources:\n\t\t\t\t\tObject.values( _sources ).length > 0\n\t\t\t\t\t\t? _sources\n\t\t\t\t\t\t: EMPTY_OBJECT,\n\t\t\t\tcanUpdateBlockBindings:\n\t\t\t\t\tselect( blockEditorStore ).getSettings()\n\t\t\t\t\t\t.canUpdateBlockBindings,\n\t\t\t\tbindableAttributes: _bindableAttributes,\n\t\t\t};\n\t\t},\n\t\t[ blockContext, blockName ]\n\t);\n\t// Return early if there are no bindable attributes.\n\tif ( ! bindableAttributes || bindableAttributes.length === 0 ) {\n\t\treturn null;\n\t}\n\n\tconst { bindings } = metadata || {};\n\n\t// Check if all sources have empty data arrays.\n\tconst hasCompatibleData = Object.values( sources ).some(\n\t\t( source ) => source.data && source.data.length > 0\n\t);\n\n\t// Lock the UI when the user can't update bindings or there are no fields to connect to.\n\tconst readOnly = ! canUpdateBlockBindings || ! hasCompatibleData;\n\n\tif ( bindings === undefined && ! hasCompatibleData ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<InspectorControls group=\"bindings\">\n\t\t\t<ToolsPanel\n\t\t\t\tlabel={ __( 'Attributes' ) }\n\t\t\t\tresetAll={ () => {\n\t\t\t\t\tremoveAllBlockBindings();\n\t\t\t\t} }\n\t\t\t\tdropdownMenuProps={ dropdownMenuProps }\n\t\t\t\tclassName=\"block-editor-bindings__panel\"\n\t\t\t>\n\t\t\t\t<ItemGroup isBordered isSeparated>\n\t\t\t\t\t{ bindableAttributes.map( ( attribute ) => {\n\t\t\t\t\t\tconst binding = bindings?.[ attribute ];\n\n\t\t\t\t\t\t// Check if this specific attribute has compatible data from any source.\n\t\t\t\t\t\tconst attributeType = getAttributeType(\n\t\t\t\t\t\t\tblockName,\n\t\t\t\t\t\t\tattribute\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst hasCompatibleDataForAttribute = Object.values(\n\t\t\t\t\t\t\tsources\n\t\t\t\t\t\t).some( ( source ) =>\n\t\t\t\t\t\t\tsource.data?.some(\n\t\t\t\t\t\t\t\t( item ) => item?.type === attributeType\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst isAttributeReadOnly =\n\t\t\t\t\t\t\treadOnly || ! hasCompatibleDataForAttribute;\n\n\t\t\t\t\t\treturn isAttributeReadOnly ? (\n\t\t\t\t\t\t\t<ReadOnlyBlockBindingsPanelItem\n\t\t\t\t\t\t\t\tkey={ attribute }\n\t\t\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<EditableBlockBindingsPanelItem\n\t\t\t\t\t\t\t\tkey={ attribute }\n\t\t\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</ItemGroup>\n\t\t\t\t{ /*\n\t\t\t\t\tUse a div element to make the ToolsPanelHiddenInnerWrapper\n\t\t\t\t\ttoggle the visibility of this help text automatically.\n\t\t\t\t*/ }\n\t\t\t\t<Text as=\"div\" variant=\"muted\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'Attributes connected to custom fields or other dynamic data.'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t</Text>\n\t\t\t</ToolsPanel>\n\t\t</InspectorControls>\n\t);\n};\n\nexport default {\n\tedit: BlockBindingsPanel,\n\tattributeKeys: [ 'metadata' ],\n\thasSupport() {\n\t\treturn true;\n\t},\n};\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { getBlockBindingsSources, getBlockType } from '@wordpress/blocks';\nimport {\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalItem as Item,\n\t__experimentalText as Text,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalVStack as VStack,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { useContext } from '@wordpress/element';\nimport { useViewportMatch } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { useBlockBindingsUtils } from '../utils/block-bindings';\nimport { unlock } from '../lock-unlock';\nimport InspectorControls from '../components/inspector-controls';\nimport BlockContext from '../components/block-context';\nimport { useBlockEditContext } from '../components/block-edit';\nimport { store as blockEditorStore } from '../store';\n\nconst { Menu } = unlock( componentsPrivateApis );\n\nconst EMPTY_OBJECT = {};\n\n/**\n * Get the normalized attribute type for block bindings.\n * Converts 'rich-text' to 'string' since rich-text is stored as string.\n *\n * @param {string} blockName The block name.\n * @param {string} attribute The attribute name.\n * @return {string} The normalized attribute type.\n */\nconst getAttributeType = ( blockName, attribute ) => {\n\tconst _attributeType =\n\t\tgetBlockType( blockName ).attributes?.[ attribute ]?.type;\n\treturn _attributeType === 'rich-text' ? 'string' : _attributeType;\n};\n\nconst useToolsPanelDropdownMenuProps = () => {\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\treturn ! isMobile\n\t\t? {\n\t\t\t\tpopoverProps: {\n\t\t\t\t\tplacement: 'left-start',\n\t\t\t\t\t// For non-mobile, inner sidebar width (248px) - button width (24px) - border (1px) + padding (16px) + spacing (20px)\n\t\t\t\t\toffset: 259,\n\t\t\t\t},\n\t\t }\n\t\t: {};\n};\n\nfunction BlockBindingsPanelMenuContent( { attribute, binding, sources } ) {\n\tconst { clientId } = useBlockEditContext();\n\tconst { updateBlockBindings } = useBlockBindingsUtils();\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\tconst blockContext = useContext( BlockContext );\n\tconst { attributeType, select } = useSelect(\n\t\t( _select ) => {\n\t\t\tconst { name: blockName } =\n\t\t\t\t_select( blockEditorStore ).getBlock( clientId );\n\t\t\treturn {\n\t\t\t\tattributeType: getAttributeType( blockName, attribute ),\n\t\t\t\tselect: _select,\n\t\t\t};\n\t\t},\n\t\t[ clientId, attribute ]\n\t);\n\treturn (\n\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t{ Object.entries( sources ).map( ( [ sourceKey, source ] ) => {\n\t\t\t\t// Only show sources that have compatible data for this specific attribute.\n\t\t\t\tconst sourceDataItems = source.data?.filter(\n\t\t\t\t\t( item ) => item?.type === attributeType\n\t\t\t\t);\n\n\t\t\t\tconst noItemsAvailable =\n\t\t\t\t\t! sourceDataItems || sourceDataItems.length === 0;\n\n\t\t\t\tif ( noItemsAvailable ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<Menu\n\t\t\t\t\t\tkey={ sourceKey }\n\t\t\t\t\t\tplacement={ isMobile ? 'bottom-start' : 'left-start' }\n\t\t\t\t\t>\n\t\t\t\t\t\t<Menu.SubmenuTriggerItem>\n\t\t\t\t\t\t\t<Menu.ItemLabel>{ source.label }</Menu.ItemLabel>\n\t\t\t\t\t\t</Menu.SubmenuTriggerItem>\n\t\t\t\t\t\t<Menu.Popover gutter={ 8 }>\n\t\t\t\t\t\t\t<Menu.Group>\n\t\t\t\t\t\t\t\t{ sourceDataItems.map( ( item ) => {\n\t\t\t\t\t\t\t\t\tconst itemBindings = {\n\t\t\t\t\t\t\t\t\t\tsource: sourceKey,\n\t\t\t\t\t\t\t\t\t\targs: item?.args || {\n\t\t\t\t\t\t\t\t\t\t\tkey: item.key,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tconst values = source.getValues( {\n\t\t\t\t\t\t\t\t\t\tselect,\n\t\t\t\t\t\t\t\t\t\tcontext: blockContext,\n\t\t\t\t\t\t\t\t\t\tbindings: {\n\t\t\t\t\t\t\t\t\t\t\t[ attribute ]: itemBindings,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Menu.CheckboxItem\n\t\t\t\t\t\t\t\t\t\t\tkey={\n\t\t\t\t\t\t\t\t\t\t\t\tsourceKey +\n\t\t\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t\t) || item.key\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst isCurrentlySelected =\n\t\t\t\t\t\t\t\t\t\t\t\t\tfastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t\t) ??\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Deprecate key dependency in 7.0.\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.key ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args?.key;\n\n\t\t\t\t\t\t\t\t\t\t\t\tif ( isCurrentlySelected ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Unset if the same item is selected again.\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ attribute ]:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ attribute ]:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\titemBindings,\n\t\t\t\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\tname={ attribute + '-binding' }\n\t\t\t\t\t\t\t\t\t\t\tvalue={ values[ attribute ] }\n\t\t\t\t\t\t\t\t\t\t\tchecked={\n\t\t\t\t\t\t\t\t\t\t\t\tfastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args,\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t) ??\n\t\t\t\t\t\t\t\t\t\t\t\t// Deprecate key dependency in 7.0.\n\t\t\t\t\t\t\t\t\t\t\t\titem.key === binding?.args?.key\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Menu.ItemLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t{ item?.label }\n\t\t\t\t\t\t\t\t\t\t\t</Menu.ItemLabel>\n\t\t\t\t\t\t\t\t\t\t\t<Menu.ItemHelpText>\n\t\t\t\t\t\t\t\t\t\t\t\t{ values[ attribute ] }\n\t\t\t\t\t\t\t\t\t\t\t</Menu.ItemHelpText>\n\t\t\t\t\t\t\t\t\t\t</Menu.CheckboxItem>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</Menu.Group>\n\t\t\t\t\t\t</Menu.Popover>\n\t\t\t\t\t</Menu>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Menu>\n\t);\n}\n\nfunction BlockBindingsAttribute( { attribute, binding, sources, blockName } ) {\n\tconst { source: sourceName, args } = binding || {};\n\tconst source = sources?.[ sourceName ];\n\n\tlet displayText;\n\tlet isValid = true;\n\tconst isNotBound = binding === undefined;\n\n\tif ( isNotBound ) {\n\t\t// Check if there are any compatible sources for this attribute type.\n\t\tconst attributeType = getAttributeType( blockName, attribute );\n\n\t\tconst hasCompatibleSources = Object.values( sources ).some( ( src ) =>\n\t\t\tsrc.data?.some( ( item ) => item?.type === attributeType )\n\t\t);\n\n\t\tif ( ! hasCompatibleSources ) {\n\t\t\tdisplayText = __( 'No sources available' );\n\t\t} else {\n\t\t\tdisplayText = __( 'Not connected' );\n\t\t}\n\t\tisValid = true;\n\t} else if ( ! source ) {\n\t\t// If there's a binding but the source is not found, it's invalid.\n\t\tisValid = false;\n\t\tdisplayText = __( 'Source not registered' );\n\t\tif ( Object.keys( sources ).length === 0 ) {\n\t\t\tdisplayText = __( 'No sources available' );\n\t\t}\n\t} else {\n\t\tdisplayText =\n\t\t\tsource.data?.find( ( item ) => fastDeepEqual( item.args, args ) )\n\t\t\t\t?.label ||\n\t\t\tsource.label ||\n\t\t\tsourceName;\n\t}\n\n\treturn (\n\t\t<VStack className=\"block-editor-bindings__item\" spacing={ 0 }>\n\t\t\t<Text truncate>{ attribute }</Text>\n\t\t\t<Text\n\t\t\t\ttruncate\n\t\t\t\tvariant={ isValid ? 'muted' : undefined }\n\t\t\t\tisDestructive={ ! isValid }\n\t\t\t>\n\t\t\t\t{ displayText }\n\t\t\t</Text>\n\t\t</VStack>\n\t);\n}\n\nfunction ReadOnlyBlockBindingsPanelItem( {\n\tattribute,\n\tbinding,\n\tsources,\n\tblockName,\n} ) {\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\n\treturn (\n\t\t<ToolsPanelItem hasValue={ () => !! binding } label={ attribute }>\n\t\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t\t<Menu.TriggerButton render={ <Item /> } disabled>\n\t\t\t\t\t<BlockBindingsAttribute\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.TriggerButton>\n\t\t\t</Menu>\n\t\t</ToolsPanelItem>\n\t);\n}\n\nfunction EditableBlockBindingsPanelItem( {\n\tattribute,\n\tbinding,\n\tsources,\n\tblockName,\n} ) {\n\tconst { updateBlockBindings } = useBlockBindingsUtils();\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\n\treturn (\n\t\t<ToolsPanelItem\n\t\t\thasValue={ () => !! binding }\n\t\t\tlabel={ attribute }\n\t\t\tonDeselect={ () => {\n\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t[ attribute ]: undefined,\n\t\t\t\t} );\n\t\t\t} }\n\t\t>\n\t\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t\t<Menu.TriggerButton render={ <Item /> }>\n\t\t\t\t\t<BlockBindingsAttribute\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.TriggerButton>\n\t\t\t\t<Menu.Popover gutter={ isMobile ? 8 : 36 }>\n\t\t\t\t\t<BlockBindingsPanelMenuContent\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.Popover>\n\t\t\t</Menu>\n\t\t</ToolsPanelItem>\n\t);\n}\n\nexport const BlockBindingsPanel = ( { name: blockName, metadata } ) => {\n\tconst blockContext = useContext( BlockContext );\n\tconst { removeAllBlockBindings } = useBlockBindingsUtils();\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\n\t// Use useSelect to ensure sources are updated whenever there are updates in block context\n\t// or when underlying data changes.\n\t// Still needs a fix regarding _sources scope.\n\tconst _sources = {};\n\tconst { sources, canUpdateBlockBindings, bindableAttributes } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { __experimentalBlockBindingsSupportedAttributes } =\n\t\t\t\tselect( blockEditorStore ).getSettings();\n\t\t\tconst _bindableAttributes =\n\t\t\t\t__experimentalBlockBindingsSupportedAttributes?.[ blockName ];\n\t\t\tif ( ! _bindableAttributes || _bindableAttributes.length === 0 ) {\n\t\t\t\treturn EMPTY_OBJECT;\n\t\t\t}\n\n\t\t\tconst registeredSources = getBlockBindingsSources();\n\t\t\tObject.entries( registeredSources ).forEach(\n\t\t\t\t( [\n\t\t\t\t\tsourceName,\n\t\t\t\t\t{ getFieldsList, usesContext, label, getValues },\n\t\t\t\t] ) => {\n\t\t\t\t\t// Populate context.\n\t\t\t\t\tconst context = {};\n\t\t\t\t\tif ( usesContext?.length ) {\n\t\t\t\t\t\tfor ( const key of usesContext ) {\n\t\t\t\t\t\t\tcontext[ key ] = blockContext[ key ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( getFieldsList ) {\n\t\t\t\t\t\tconst fieldsListResult = getFieldsList( {\n\t\t\t\t\t\t\tselect,\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t} );\n\t\t\t\t\t\t_sources[ sourceName ] = {\n\t\t\t\t\t\t\tdata: fieldsListResult || [],\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tgetValues,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Include sources without getFieldsList if they are already used in a binding.\n\t\t\t\t\t\t * This allows them to be displayed in read-only mode.\n\t\t\t\t\t\t */\n\t\t\t\t\t\t_sources[ sourceName ] = {\n\t\t\t\t\t\t\tdata: [],\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tgetValues,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tsources:\n\t\t\t\t\tObject.values( _sources ).length > 0\n\t\t\t\t\t\t? _sources\n\t\t\t\t\t\t: EMPTY_OBJECT,\n\t\t\t\tcanUpdateBlockBindings:\n\t\t\t\t\tselect( blockEditorStore ).getSettings()\n\t\t\t\t\t\t.canUpdateBlockBindings,\n\t\t\t\tbindableAttributes: _bindableAttributes,\n\t\t\t};\n\t\t},\n\t\t[ blockContext, blockName ]\n\t);\n\t// Return early if there are no bindable attributes.\n\tif ( ! bindableAttributes || bindableAttributes.length === 0 ) {\n\t\treturn null;\n\t}\n\n\tconst { bindings } = metadata || {};\n\n\t// Check if all sources have empty data arrays.\n\tconst hasCompatibleData = Object.values( sources ).some(\n\t\t( source ) => source.data && source.data.length > 0\n\t);\n\n\t// Lock the UI when the user can't update bindings or there are no fields to connect to.\n\tconst readOnly = ! canUpdateBlockBindings || ! hasCompatibleData;\n\n\tif ( bindings === undefined && ! hasCompatibleData ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<InspectorControls group=\"bindings\">\n\t\t\t<ToolsPanel\n\t\t\t\tlabel={ __( 'Attributes' ) }\n\t\t\t\tresetAll={ () => {\n\t\t\t\t\tremoveAllBlockBindings();\n\t\t\t\t} }\n\t\t\t\tdropdownMenuProps={ dropdownMenuProps }\n\t\t\t\tclassName=\"block-editor-bindings__panel\"\n\t\t\t>\n\t\t\t\t<ItemGroup isBordered isSeparated>\n\t\t\t\t\t{ bindableAttributes.map( ( attribute ) => {\n\t\t\t\t\t\tconst binding = bindings?.[ attribute ];\n\n\t\t\t\t\t\t// Check if this specific attribute has compatible data from any source.\n\t\t\t\t\t\tconst attributeType = getAttributeType(\n\t\t\t\t\t\t\tblockName,\n\t\t\t\t\t\t\tattribute\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst hasCompatibleDataForAttribute = Object.values(\n\t\t\t\t\t\t\tsources\n\t\t\t\t\t\t).some( ( source ) =>\n\t\t\t\t\t\t\tsource.data?.some(\n\t\t\t\t\t\t\t\t( item ) => item?.type === attributeType\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst isAttributeReadOnly =\n\t\t\t\t\t\t\treadOnly || ! hasCompatibleDataForAttribute;\n\n\t\t\t\t\t\treturn isAttributeReadOnly ? (\n\t\t\t\t\t\t\t<ReadOnlyBlockBindingsPanelItem\n\t\t\t\t\t\t\t\tkey={ attribute }\n\t\t\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<EditableBlockBindingsPanelItem\n\t\t\t\t\t\t\t\tkey={ attribute }\n\t\t\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</ItemGroup>\n\t\t\t\t{ /*\n\t\t\t\t\tUse a div element to make the ToolsPanelHiddenInnerWrapper\n\t\t\t\t\ttoggle the visibility of this help text automatically.\n\t\t\t\t*/ }\n\t\t\t\t<Text as=\"div\" variant=\"muted\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'Attributes connected to custom fields or other dynamic data.'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t</Text>\n\t\t\t</ToolsPanel>\n\t\t</InspectorControls>\n\t);\n};\n\nexport default {\n\tedit: BlockBindingsPanel,\n\tattributeKeys: [ 'metadata' ],\n\thasSupport( name ) {\n\t\treturn ! [\n\t\t\t'core/post-date',\n\t\t\t'core/navigation-link',\n\t\t\t'core/navigation-submenu',\n\t\t].includes( name );\n\t},\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["componentsPrivateApis", "BlockContext", "blockEditorStore", "fastDeepEqual", "VStack", "Text", "ToolsPanelItem", "Item", "InspectorControls", "ToolsPanel", "ItemGroup"]
|
|
7
7
|
}
|
package/build/hooks/fit-text.js
CHANGED
|
@@ -95,14 +95,35 @@ function useFitText({ fitText, name, clientId }) {
|
|
|
95
95
|
if (!fitText || !blockElement || !clientId || !hasFitTextSupport2) {
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
|
-
applyFitText();
|
|
99
98
|
const currentElement = blockElement;
|
|
99
|
+
const previousVisibility = currentElement.style.visibility;
|
|
100
|
+
let hideFrameId = null;
|
|
101
|
+
let calculateFrameId = null;
|
|
102
|
+
let showTimeoutId = null;
|
|
103
|
+
hideFrameId = window.requestAnimationFrame(() => {
|
|
104
|
+
currentElement.style.visibility = "hidden";
|
|
105
|
+
calculateFrameId = window.requestAnimationFrame(() => {
|
|
106
|
+
applyFitText();
|
|
107
|
+
showTimeoutId = setTimeout(() => {
|
|
108
|
+
currentElement.style.visibility = previousVisibility;
|
|
109
|
+
}, 10);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
100
112
|
let resizeObserver;
|
|
101
113
|
if (window.ResizeObserver && currentElement.parentElement) {
|
|
102
114
|
resizeObserver = new window.ResizeObserver(applyFitText);
|
|
103
115
|
resizeObserver.observe(currentElement.parentElement);
|
|
104
116
|
}
|
|
105
117
|
return () => {
|
|
118
|
+
if (hideFrameId !== null) {
|
|
119
|
+
window.cancelAnimationFrame(hideFrameId);
|
|
120
|
+
}
|
|
121
|
+
if (calculateFrameId !== null) {
|
|
122
|
+
window.cancelAnimationFrame(calculateFrameId);
|
|
123
|
+
}
|
|
124
|
+
if (showTimeoutId !== null) {
|
|
125
|
+
clearTimeout(showTimeoutId);
|
|
126
|
+
}
|
|
106
127
|
if (resizeObserver) {
|
|
107
128
|
resizeObserver.disconnect();
|
|
108
129
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/fit-text.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { addFilter } from '@wordpress/hooks';\nimport { hasBlockSupport } from '@wordpress/blocks';\nimport { useEffect, useCallback } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport {\n\tToggleControl,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport { optimizeFitText } from '../utils/fit-text-utils';\nimport { store as blockEditorStore } from '../store';\nimport { useBlockElement } from '../components/block-list/use-block-props/use-block-refs';\nimport InspectorControls from '../components/inspector-controls';\n\nexport const FIT_TEXT_SUPPORT_KEY = 'typography.fitText';\n\n/**\n * Filters registered block settings, extending attributes to include\n * the `fitText` attribute.\n *\n * @param {Object} settings Original block settings.\n * @return {Object} Filtered block settings.\n */\nfunction addAttributes( settings ) {\n\tif ( ! hasBlockSupport( settings, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn settings;\n\t}\n\n\t// Allow blocks to specify their own attribute definition.\n\tif ( settings.attributes?.fitText ) {\n\t\treturn settings;\n\t}\n\n\t// Add fitText attribute.\n\treturn {\n\t\t...settings,\n\t\tattributes: {\n\t\t\t...settings.attributes,\n\t\t\tfitText: {\n\t\t\t\ttype: 'boolean',\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Custom hook to handle fit text functionality in the editor.\n *\n * @param {Object} props Component props.\n * @param {?boolean} props.fitText Fit text attribute.\n * @param {string} props.name Block name.\n * @param {string} props.clientId Block client ID.\n */\nfunction useFitText( { fitText, name, clientId } ) {\n\tconst hasFitTextSupport = hasBlockSupport( name, FIT_TEXT_SUPPORT_KEY );\n\tconst blockElement = useBlockElement( clientId );\n\n\t// Monitor block attribute changes\n\t// Any attribute may change the available space.\n\tconst blockAttributes = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! clientId || ! hasFitTextSupport || ! fitText ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn select( blockEditorStore ).getBlockAttributes( clientId );\n\t\t},\n\t\t[ clientId, hasFitTextSupport, fitText ]\n\t);\n\n\tconst applyFitText = useCallback( () => {\n\t\tif ( ! blockElement || ! hasFitTextSupport || ! fitText ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get or create style element with unique ID\n\t\tconst styleId = `fit-text-${ clientId }`;\n\t\tlet styleElement = blockElement.ownerDocument.getElementById( styleId );\n\t\tif ( ! styleElement ) {\n\t\t\tstyleElement = blockElement.ownerDocument.createElement( 'style' );\n\t\t\tstyleElement.id = styleId;\n\t\t\tblockElement.ownerDocument.head.appendChild( styleElement );\n\t\t}\n\n\t\tconst blockSelector = `#block-${ clientId }`;\n\n\t\tconst applyStylesFn = ( css ) => {\n\t\t\tstyleElement.textContent = css;\n\t\t};\n\n\t\toptimizeFitText( blockElement, blockSelector, applyStylesFn );\n\t}, [ blockElement, clientId, hasFitTextSupport, fitText ] );\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! fitText ||\n\t\t\t! blockElement ||\n\t\t\t! clientId ||\n\t\t\t! hasFitTextSupport\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t//
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { addFilter } from '@wordpress/hooks';\nimport { hasBlockSupport } from '@wordpress/blocks';\nimport { useEffect, useCallback } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport {\n\tToggleControl,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport { optimizeFitText } from '../utils/fit-text-utils';\nimport { store as blockEditorStore } from '../store';\nimport { useBlockElement } from '../components/block-list/use-block-props/use-block-refs';\nimport InspectorControls from '../components/inspector-controls';\n\nexport const FIT_TEXT_SUPPORT_KEY = 'typography.fitText';\n\n/**\n * Filters registered block settings, extending attributes to include\n * the `fitText` attribute.\n *\n * @param {Object} settings Original block settings.\n * @return {Object} Filtered block settings.\n */\nfunction addAttributes( settings ) {\n\tif ( ! hasBlockSupport( settings, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn settings;\n\t}\n\n\t// Allow blocks to specify their own attribute definition.\n\tif ( settings.attributes?.fitText ) {\n\t\treturn settings;\n\t}\n\n\t// Add fitText attribute.\n\treturn {\n\t\t...settings,\n\t\tattributes: {\n\t\t\t...settings.attributes,\n\t\t\tfitText: {\n\t\t\t\ttype: 'boolean',\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Custom hook to handle fit text functionality in the editor.\n *\n * @param {Object} props Component props.\n * @param {?boolean} props.fitText Fit text attribute.\n * @param {string} props.name Block name.\n * @param {string} props.clientId Block client ID.\n */\nfunction useFitText( { fitText, name, clientId } ) {\n\tconst hasFitTextSupport = hasBlockSupport( name, FIT_TEXT_SUPPORT_KEY );\n\tconst blockElement = useBlockElement( clientId );\n\n\t// Monitor block attribute changes\n\t// Any attribute may change the available space.\n\tconst blockAttributes = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! clientId || ! hasFitTextSupport || ! fitText ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn select( blockEditorStore ).getBlockAttributes( clientId );\n\t\t},\n\t\t[ clientId, hasFitTextSupport, fitText ]\n\t);\n\n\tconst applyFitText = useCallback( () => {\n\t\tif ( ! blockElement || ! hasFitTextSupport || ! fitText ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get or create style element with unique ID\n\t\tconst styleId = `fit-text-${ clientId }`;\n\t\tlet styleElement = blockElement.ownerDocument.getElementById( styleId );\n\t\tif ( ! styleElement ) {\n\t\t\tstyleElement = blockElement.ownerDocument.createElement( 'style' );\n\t\t\tstyleElement.id = styleId;\n\t\t\tblockElement.ownerDocument.head.appendChild( styleElement );\n\t\t}\n\n\t\tconst blockSelector = `#block-${ clientId }`;\n\n\t\tconst applyStylesFn = ( css ) => {\n\t\t\tstyleElement.textContent = css;\n\t\t};\n\n\t\toptimizeFitText( blockElement, blockSelector, applyStylesFn );\n\t}, [ blockElement, clientId, hasFitTextSupport, fitText ] );\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! fitText ||\n\t\t\t! blockElement ||\n\t\t\t! clientId ||\n\t\t\t! hasFitTextSupport\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Store current element value for cleanup\n\t\tconst currentElement = blockElement;\n\t\tconst previousVisibility = currentElement.style.visibility;\n\n\t\t// Store IDs for cleanup\n\t\tlet hideFrameId = null;\n\t\tlet calculateFrameId = null;\n\t\tlet showTimeoutId = null;\n\n\t\t// We are hiding the element doing the calculation of fit text\n\t\t// and then showing it again to avoid the user noticing a flash of potentially\n\t\t// big fitText while the binary search is happening.\n\t\thideFrameId = window.requestAnimationFrame( () => {\n\t\t\tcurrentElement.style.visibility = 'hidden';\n\t\t\t// Wait for browser to render the hidden state\n\t\t\tcalculateFrameId = window.requestAnimationFrame( () => {\n\t\t\t\tapplyFitText();\n\n\t\t\t\t// Using a timeout instead of requestAnimationFrame, because\n\t\t\t\t// with requestAnimationFrame a flash of very high size\n\t\t\t\t// can still occur although rare.\n\t\t\t\tshowTimeoutId = setTimeout( () => {\n\t\t\t\t\tcurrentElement.style.visibility = previousVisibility;\n\t\t\t\t}, 10 );\n\t\t\t} );\n\t\t} );\n\n\t\t// Watch for size changes\n\t\tlet resizeObserver;\n\t\tif ( window.ResizeObserver && currentElement.parentElement ) {\n\t\t\tresizeObserver = new window.ResizeObserver( applyFitText );\n\t\t\tresizeObserver.observe( currentElement.parentElement );\n\t\t}\n\n\t\t// Cleanup function\n\t\treturn () => {\n\t\t\t// Cancel pending async operations\n\t\t\tif ( hideFrameId !== null ) {\n\t\t\t\twindow.cancelAnimationFrame( hideFrameId );\n\t\t\t}\n\t\t\tif ( calculateFrameId !== null ) {\n\t\t\t\twindow.cancelAnimationFrame( calculateFrameId );\n\t\t\t}\n\t\t\tif ( showTimeoutId !== null ) {\n\t\t\t\tclearTimeout( showTimeoutId );\n\t\t\t}\n\n\t\t\tif ( resizeObserver ) {\n\t\t\t\tresizeObserver.disconnect();\n\t\t\t}\n\n\t\t\tconst styleId = `fit-text-${ clientId }`;\n\t\t\tconst styleElement =\n\t\t\t\tcurrentElement.ownerDocument.getElementById( styleId );\n\t\t\tif ( styleElement ) {\n\t\t\t\tstyleElement.remove();\n\t\t\t}\n\t\t};\n\t}, [ fitText, clientId, applyFitText, blockElement, hasFitTextSupport ] );\n\n\t// Trigger fit text recalculation when content changes\n\tuseEffect( () => {\n\t\tif ( fitText && blockElement && hasFitTextSupport ) {\n\t\t\t// Wait for next frame to ensure DOM has updated after content changes\n\t\t\tconst frameId = window.requestAnimationFrame( () => {\n\t\t\t\tif ( blockElement ) {\n\t\t\t\t\tapplyFitText();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn () => window.cancelAnimationFrame( frameId );\n\t\t}\n\t}, [\n\t\tblockAttributes,\n\t\tfitText,\n\t\tapplyFitText,\n\t\tblockElement,\n\t\thasFitTextSupport,\n\t] );\n}\n\n/**\n * Fit text control component for the typography panel.\n *\n * @param {Object} props Component props.\n * @param {string} props.clientId Block client ID.\n * @param {Function} props.setAttributes Function to set block attributes.\n * @param {string} props.name Block name.\n * @param {boolean} props.fitText Whether fit text is enabled.\n * @param {string} props.fontSize Font size slug.\n * @param {Object} props.style Block style object.\n */\nexport function FitTextControl( {\n\tclientId,\n\tfitText = false,\n\tsetAttributes,\n\tname,\n\tfontSize,\n\tstyle,\n} ) {\n\tif ( ! hasBlockSupport( name, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<InspectorControls group=\"typography\">\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => fitText }\n\t\t\t\tlabel={ __( 'Fit text' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { fitText: undefined } ) }\n\t\t\t\tresetAllFilter={ () => ( { fitText: undefined } ) }\n\t\t\t\tpanelId={ clientId }\n\t\t\t>\n\t\t\t\t<ToggleControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Fit text' ) }\n\t\t\t\t\tchecked={ fitText }\n\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\tconst newFitText = ! fitText || undefined;\n\t\t\t\t\t\tconst updates = { fitText: newFitText };\n\n\t\t\t\t\t\t// When enabling fit text, clear font size if it has a value\n\t\t\t\t\t\tif ( newFitText ) {\n\t\t\t\t\t\t\tif ( fontSize ) {\n\t\t\t\t\t\t\t\tupdates.fontSize = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( style?.typography?.fontSize ) {\n\t\t\t\t\t\t\t\tupdates.style = {\n\t\t\t\t\t\t\t\t\t...style,\n\t\t\t\t\t\t\t\t\ttypography: {\n\t\t\t\t\t\t\t\t\t\t...style?.typography,\n\t\t\t\t\t\t\t\t\t\tfontSize: undefined,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetAttributes( updates );\n\t\t\t\t\t} }\n\t\t\t\t\thelp={\n\t\t\t\t\t\tfitText\n\t\t\t\t\t\t\t? __( 'Text will resize to fit its container.' )\n\t\t\t\t\t\t\t: __(\n\t\t\t\t\t\t\t\t\t'The text will resize to fit its container, resetting other font size settings.'\n\t\t\t\t\t\t\t )\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\t\t</InspectorControls>\n\t);\n}\n\n/**\n * Override props applied to the block element on save.\n *\n * @param {Object} props Additional props applied to the block element.\n * @param {Object} blockType Block type.\n * @param {Object} attributes Block attributes.\n * @return {Object} Filtered props applied to the block element.\n */\nfunction addSaveProps( props, blockType, attributes ) {\n\tif ( ! hasBlockSupport( blockType, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn props;\n\t}\n\n\tconst { fitText } = attributes;\n\n\tif ( ! fitText ) {\n\t\treturn props;\n\t}\n\n\t// Add CSS class for frontend detection and styling\n\tconst className = props.className\n\t\t? `${ props.className } has-fit-text`\n\t\t: 'has-fit-text';\n\n\treturn {\n\t\t...props,\n\t\tclassName,\n\t};\n}\n/**\n * Override props applied to the block element in the editor.\n *\n * @param {Object} props Component props including block attributes.\n * @param {string} props.name Block name.\n * @param {boolean} props.fitText Whether fit text is enabled.\n * @param {string} props.clientId Block client ID.\n * @return {Object} Filtered props applied to the block element.\n */\nfunction useBlockProps( { name, fitText, clientId } ) {\n\tuseFitText( { fitText, name, clientId } );\n\tif ( ! fitText || ! hasBlockSupport( name, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn {};\n\t}\n\treturn {\n\t\tclassName: 'has-fit-text',\n\t};\n}\n\naddFilter(\n\t'blocks.registerBlockType',\n\t'core/fit-text/addAttribute',\n\taddAttributes\n);\n\nconst hasFitTextSupport = ( blockNameOrType ) => {\n\treturn hasBlockSupport( blockNameOrType, FIT_TEXT_SUPPORT_KEY );\n};\n\nexport default {\n\tuseBlockProps,\n\taddSaveProps,\n\tattributeKeys: [ 'fitText', 'fontSize', 'style' ],\n\thasSupport: hasFitTextSupport,\n\tedit: FitTextControl,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["hasFitTextSupport", "blockEditorStore", "InspectorControls", "ToolsPanelItem"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/block-settings-menu/block-settings-dropdown.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tgetBlockType,\n\tserialize,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\nimport { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { moreVertical } from '@wordpress/icons';\nimport { Children, cloneElement } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';\nimport { pipe, useCopyToClipboard } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport BlockActions from '../block-actions';\nimport CommentIconSlotFill from '../../components/collab/block-comment-icon-slot';\nimport BlockHTMLConvertButton from './block-html-convert-button';\nimport __unstableBlockSettingsMenuFirstItem from './block-settings-menu-first-item';\nimport BlockSettingsMenuControls from '../block-settings-menu-controls';\nimport BlockParentSelectorMenuItem from './block-parent-selector-menu-item';\nimport { store as blockEditorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\nimport { useNotifyCopy } from '../../utils/use-notify-copy';\n\nconst POPOVER_PROPS = {\n\tclassName: 'block-editor-block-settings-menu__popover',\n\tplacement: 'bottom-start',\n};\n\nfunction CopyMenuItem( {\n\tclientIds,\n\tonCopy,\n\tlabel,\n\tshortcut,\n\teventType = 'copy',\n\t__experimentalUpdateSelection: updateSelection = false,\n} ) {\n\tconst { getBlocksByClientId } = useSelect( blockEditorStore );\n\tconst { removeBlocks } = useDispatch( blockEditorStore );\n\tconst notifyCopy = useNotifyCopy();\n\tconst ref = useCopyToClipboard(\n\t\t() => serialize( getBlocksByClientId( clientIds ) ),\n\t\t() => {\n\t\t\tswitch ( eventType ) {\n\t\t\t\tcase 'copy':\n\t\t\t\tcase 'copyStyles':\n\t\t\t\t\tonCopy();\n\t\t\t\t\tnotifyCopy( eventType, clientIds );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'cut':\n\t\t\t\t\tnotifyCopy( eventType, clientIds );\n\t\t\t\t\tremoveBlocks( clientIds, updateSelection );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t);\n\tconst copyMenuItemLabel = label ? label : __( 'Copy' );\n\treturn (\n\t\t<MenuItem ref={ ref } shortcut={ shortcut }>\n\t\t\t{ copyMenuItemLabel }\n\t\t</MenuItem>\n\t);\n}\n\nexport function BlockSettingsDropdown( {\n\tblock,\n\tclientIds,\n\tchildren,\n\t__experimentalSelectBlock,\n\t...props\n} ) {\n\t// Get the client id of the current block for this menu, if one is set.\n\tconst currentClientId = block?.clientId;\n\tconst count = clientIds.length;\n\tconst firstBlockClientId = clientIds[ 0 ];\n\n\tconst {\n\t\tfirstParentClientId,\n\t\tparentBlockType,\n\t\tpreviousBlockClientId,\n\t\tselectedBlockClientIds,\n\t\topenedBlockSettingsMenu,\n\t\tisContentOnly,\n\t\tisZoomOut,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockName,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\tgetPreviousBlockClientId,\n\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\tgetBlockAttributes,\n\t\t\t\tgetOpenedBlockSettingsMenu,\n\t\t\t\tgetBlockEditingMode,\n\t\t\t\tisZoomOut: _isZoomOut,\n\t\t\t} = unlock( select( blockEditorStore ) );\n\n\t\t\tconst { getActiveBlockVariation } = select( blocksStore );\n\n\t\t\tconst _firstParentClientId =\n\t\t\t\tgetBlockRootClientId( firstBlockClientId );\n\t\t\tconst parentBlockName =\n\t\t\t\t_firstParentClientId && getBlockName( _firstParentClientId );\n\n\t\t\treturn {\n\t\t\t\tfirstParentClientId: _firstParentClientId,\n\t\t\t\tparentBlockType:\n\t\t\t\t\t_firstParentClientId &&\n\t\t\t\t\t( getActiveBlockVariation(\n\t\t\t\t\t\tparentBlockName,\n\t\t\t\t\t\tgetBlockAttributes( _firstParentClientId )\n\t\t\t\t\t) ||\n\t\t\t\t\t\tgetBlockType( parentBlockName ) ),\n\t\t\t\tpreviousBlockClientId:\n\t\t\t\t\tgetPreviousBlockClientId( firstBlockClientId ),\n\t\t\t\tselectedBlockClientIds: getSelectedBlockClientIds(),\n\t\t\t\topenedBlockSettingsMenu: getOpenedBlockSettingsMenu(),\n\t\t\t\tisContentOnly:\n\t\t\t\t\tgetBlockEditingMode( firstBlockClientId ) === 'contentOnly',\n\t\t\t\tisZoomOut: _isZoomOut(),\n\t\t\t};\n\t\t},\n\t\t[ firstBlockClientId ]\n\t);\n\n\tconst { getBlockOrder, getSelectedBlockClientIds } =\n\t\tuseSelect( blockEditorStore );\n\n\tconst { setOpenedBlockSettingsMenu } = unlock(\n\t\tuseDispatch( blockEditorStore )\n\t);\n\n\tconst shortcuts = useSelect( ( select ) => {\n\t\tconst { getShortcutRepresentation } = select( keyboardShortcutsStore );\n\t\treturn {\n\t\t\tcopy: getShortcutRepresentation( 'core/block-editor/copy' ),\n\t\t\tcut: getShortcutRepresentation( 'core/block-editor/cut' ),\n\t\t\tduplicate: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/duplicate'\n\t\t\t),\n\t\t\tremove: getShortcutRepresentation( 'core/block-editor/remove' ),\n\t\t\tinsertAfter: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/insert-after'\n\t\t\t),\n\t\t\tinsertBefore: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/insert-before'\n\t\t\t),\n\t\t};\n\t}, [] );\n\tconst hasSelectedBlocks = selectedBlockClientIds.length > 0;\n\n\tasync function updateSelectionAfterDuplicate( clientIdsPromise ) {\n\t\tif ( ! __experimentalSelectBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst ids = await clientIdsPromise;\n\t\tif ( ids && ids[ 0 ] ) {\n\t\t\t__experimentalSelectBlock( ids[ 0 ], false );\n\t\t}\n\t}\n\n\tfunction updateSelectionAfterRemove() {\n\t\tif ( ! __experimentalSelectBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet blockToFocus = previousBlockClientId || firstParentClientId;\n\n\t\t// Focus the first block if there's no previous block nor parent block.\n\t\tif ( ! blockToFocus ) {\n\t\t\tblockToFocus = getBlockOrder()[ 0 ];\n\t\t}\n\n\t\t// Only update the selection if the original selection is removed.\n\t\tconst shouldUpdateSelection =\n\t\t\thasSelectedBlocks && getSelectedBlockClientIds().length === 0;\n\n\t\t__experimentalSelectBlock( blockToFocus, shouldUpdateSelection );\n\t}\n\n\t// This can occur when the selected block (the parent)\n\t// displays child blocks within a List View.\n\tconst parentBlockIsSelected =\n\t\tselectedBlockClientIds?.includes( firstParentClientId );\n\n\t// When a currentClientId is in use, treat the menu as a controlled component.\n\t// This ensures that only one block settings menu is open at a time.\n\t// This is a temporary solution to work around an issue with `onFocusOutside`\n\t// where it does not allow a dropdown to be closed if focus was never within\n\t// the dropdown to begin with. Examples include a user either CMD+Clicking or\n\t// right clicking into an inactive window.\n\t// See: https://github.com/WordPress/gutenberg/pull/54083\n\tconst open = ! currentClientId\n\t\t? undefined\n\t\t: openedBlockSettingsMenu === currentClientId || false;\n\n\tfunction onToggle( localOpen ) {\n\t\tif ( localOpen && openedBlockSettingsMenu !== currentClientId ) {\n\t\t\tsetOpenedBlockSettingsMenu( currentClientId );\n\t\t} else if (\n\t\t\t! localOpen &&\n\t\t\topenedBlockSettingsMenu &&\n\t\t\topenedBlockSettingsMenu === currentClientId\n\t\t) {\n\t\t\tsetOpenedBlockSettingsMenu( undefined );\n\t\t}\n\t}\n\n\tconst shouldShowBlockParentMenuItem =\n\t\t! parentBlockIsSelected && !! firstParentClientId;\n\n\treturn (\n\t\t<BlockActions\n\t\t\tclientIds={ clientIds }\n\t\t\t__experimentalUpdateSelection={ ! __experimentalSelectBlock }\n\t\t>\n\t\t\t{ ( {\n\t\t\t\tcanCopyStyles,\n\t\t\t\tcanDuplicate,\n\t\t\t\tcanInsertBlock,\n\t\t\t\tcanRemove,\n\t\t\t\tonDuplicate,\n\t\t\t\tonInsertAfter,\n\t\t\t\tonInsertBefore,\n\t\t\t\tonRemove,\n\t\t\t\tonCopy,\n\t\t\t\tonPasteStyles,\n\t\t\t} ) => {\n\t\t\t\t// It is possible that some plugins register fills for this menu\n\t\t\t\t// even if Core doesn't render anything in the block settings menu.\n\t\t\t\t// in which case, we may want to render the menu anyway.\n\t\t\t\t// That said for now, we can start more conservative.\n\t\t\t\tconst isEmpty =\n\t\t\t\t\t! canRemove &&\n\t\t\t\t\t! canDuplicate &&\n\t\t\t\t\t! canInsertBlock &&\n\t\t\t\t\tisContentOnly;\n\n\t\t\t\tif ( isEmpty ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<DropdownMenu\n\t\t\t\t\t\ticon={ moreVertical }\n\t\t\t\t\t\tlabel={ __( 'Options' ) }\n\t\t\t\t\t\tclassName=\"block-editor-block-settings-menu\"\n\t\t\t\t\t\tpopoverProps={ POPOVER_PROPS }\n\t\t\t\t\t\topen={ open }\n\t\t\t\t\t\tonToggle={ onToggle }\n\t\t\t\t\t\tnoIcons\n\t\t\t\t\t\t{ ...props }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ ( { onClose } ) => (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t<__unstableBlockSettingsMenuFirstItem.Slot\n\t\t\t\t\t\t\t\t\t\tfillProps={ { onClose } }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{ shouldShowBlockParentMenuItem && (\n\t\t\t\t\t\t\t\t\t\t<BlockParentSelectorMenuItem\n\t\t\t\t\t\t\t\t\t\t\tparentClientId={\n\t\t\t\t\t\t\t\t\t\t\t\tfirstParentClientId\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tparentBlockType={ parentBlockType }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ count === 1 && (\n\t\t\t\t\t\t\t\t\t\t<BlockHTMLConvertButton\n\t\t\t\t\t\t\t\t\t\t\tclientId={ firstBlockClientId }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tonCopy={ onCopy }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.copy }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Cut' ) }\n\t\t\t\t\t\t\t\t\t\t\teventType=\"cut\"\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.cut }\n\t\t\t\t\t\t\t\t\t\t\t__experimentalUpdateSelection={\n\t\t\t\t\t\t\t\t\t\t\t\t! __experimentalSelectBlock\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ canDuplicate && (\n\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\tonDuplicate,\n\t\t\t\t\t\t\t\t\t\t\t\tupdateSelectionAfterDuplicate\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.duplicate }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Duplicate' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ canInsertBlock && ! isZoomOut && (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\tonInsertBefore\n\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut={\n\t\t\t\t\t\t\t\t\t\t\t\t\tshortcuts.insertBefore\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{ __( 'Add before' ) }\n\t\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\tonInsertAfter\n\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut={\n\t\t\t\t\t\t\t\t\t\t\t\t\tshortcuts.insertAfter\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{ __( 'Add after' ) }\n\t\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ count === 1 && (\n\t\t\t\t\t\t\t\t\t\t<CommentIconSlotFill.Slot\n\t\t\t\t\t\t\t\t\t\t\tfillProps={ { onClose } }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t{ canCopyStyles && ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tonCopy={ onCopy }\n\t\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Copy styles' ) }\n\t\t\t\t\t\t\t\t\t\t\teventType=\"copyStyles\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<MenuItem onClick={ onPasteStyles }>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Paste styles' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t<BlockSettingsMenuControls.Slot\n\t\t\t\t\t\t\t\t\t\tfillProps={ {\n\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\tcount,\n\t\t\t\t\t\t\t\t\t\t\tfirstBlockClientId,\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t{ typeof children === 'function'\n\t\t\t\t\t\t\t\t\t? children( { onClose } )\n\t\t\t\t\t\t\t\t\t: Children.map( ( child ) =>\n\t\t\t\t\t\t\t\t\t\t\tcloneElement( child, { onClose } )\n\t\t\t\t\t\t\t\t\t ) }\n\t\t\t\t\t\t\t\t{ canRemove && (\n\t\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\tonRemove,\n\t\t\t\t\t\t\t\t\t\t\t\tupdateSelectionAfterRemove\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.remove }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Delete' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</DropdownMenu>\n\t\t\t\t);\n\t\t\t} }\n\t\t</BlockActions>\n\t);\n}\n\nexport default BlockSettingsDropdown;\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tgetBlockType,\n\tserialize,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\nimport { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { moreVertical } from '@wordpress/icons';\nimport { Children, cloneElement } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';\nimport { pipe, useCopyToClipboard } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport BlockActions from '../block-actions';\nimport CommentIconSlotFill from '../../components/collab/block-comment-icon-slot';\nimport BlockHTMLConvertButton from './block-html-convert-button';\nimport __unstableBlockSettingsMenuFirstItem from './block-settings-menu-first-item';\nimport BlockSettingsMenuControls from '../block-settings-menu-controls';\nimport BlockParentSelectorMenuItem from './block-parent-selector-menu-item';\nimport { store as blockEditorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\nimport { useNotifyCopy } from '../../utils/use-notify-copy';\n\nconst POPOVER_PROPS = {\n\tclassName: 'block-editor-block-settings-menu__popover',\n\tplacement: 'bottom-start',\n};\n\nfunction CopyMenuItem( {\n\tclientIds,\n\tonCopy,\n\tlabel,\n\tshortcut,\n\teventType = 'copy',\n\t__experimentalUpdateSelection: updateSelection = false,\n} ) {\n\tconst { getBlocksByClientId } = useSelect( blockEditorStore );\n\tconst { removeBlocks } = useDispatch( blockEditorStore );\n\tconst notifyCopy = useNotifyCopy();\n\tconst ref = useCopyToClipboard(\n\t\t() => serialize( getBlocksByClientId( clientIds ) ),\n\t\t() => {\n\t\t\tswitch ( eventType ) {\n\t\t\t\tcase 'copy':\n\t\t\t\tcase 'copyStyles':\n\t\t\t\t\tonCopy();\n\t\t\t\t\tnotifyCopy( eventType, clientIds );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'cut':\n\t\t\t\t\tnotifyCopy( eventType, clientIds );\n\t\t\t\t\tremoveBlocks( clientIds, updateSelection );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t);\n\tconst copyMenuItemLabel = label ? label : __( 'Copy' );\n\treturn (\n\t\t<MenuItem ref={ ref } shortcut={ shortcut }>\n\t\t\t{ copyMenuItemLabel }\n\t\t</MenuItem>\n\t);\n}\n\nexport function BlockSettingsDropdown( {\n\tblock,\n\tclientIds,\n\tchildren,\n\t__experimentalSelectBlock,\n\t...props\n} ) {\n\t// Get the client id of the current block for this menu, if one is set.\n\tconst currentClientId = block?.clientId;\n\tconst count = clientIds.length;\n\tconst firstBlockClientId = clientIds[ 0 ];\n\n\tconst {\n\t\tfirstParentClientId,\n\t\tparentBlockType,\n\t\tpreviousBlockClientId,\n\t\tselectedBlockClientIds,\n\t\topenedBlockSettingsMenu,\n\t\tisContentOnly,\n\t\tisZoomOut,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockName,\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\tgetPreviousBlockClientId,\n\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\tgetBlockAttributes,\n\t\t\t\tgetOpenedBlockSettingsMenu,\n\t\t\t\tgetBlockEditingMode,\n\t\t\t\tisZoomOut: _isZoomOut,\n\t\t\t} = unlock( select( blockEditorStore ) );\n\n\t\t\tconst { getActiveBlockVariation } = select( blocksStore );\n\n\t\t\tconst _firstParentClientId =\n\t\t\t\tgetBlockRootClientId( firstBlockClientId );\n\t\t\tconst parentBlockName =\n\t\t\t\t_firstParentClientId && getBlockName( _firstParentClientId );\n\n\t\t\treturn {\n\t\t\t\tfirstParentClientId: _firstParentClientId,\n\t\t\t\tparentBlockType:\n\t\t\t\t\t_firstParentClientId &&\n\t\t\t\t\t( getActiveBlockVariation(\n\t\t\t\t\t\tparentBlockName,\n\t\t\t\t\t\tgetBlockAttributes( _firstParentClientId )\n\t\t\t\t\t) ||\n\t\t\t\t\t\tgetBlockType( parentBlockName ) ),\n\t\t\t\tpreviousBlockClientId:\n\t\t\t\t\tgetPreviousBlockClientId( firstBlockClientId ),\n\t\t\t\tselectedBlockClientIds: getSelectedBlockClientIds(),\n\t\t\t\topenedBlockSettingsMenu: getOpenedBlockSettingsMenu(),\n\t\t\t\tisContentOnly:\n\t\t\t\t\tgetBlockEditingMode( firstBlockClientId ) === 'contentOnly',\n\t\t\t\tisZoomOut: _isZoomOut(),\n\t\t\t};\n\t\t},\n\t\t[ firstBlockClientId ]\n\t);\n\n\tconst { getBlockOrder, getSelectedBlockClientIds } =\n\t\tuseSelect( blockEditorStore );\n\n\tconst { setOpenedBlockSettingsMenu } = unlock(\n\t\tuseDispatch( blockEditorStore )\n\t);\n\n\tconst shortcuts = useSelect( ( select ) => {\n\t\tconst { getShortcutRepresentation } = select( keyboardShortcutsStore );\n\t\treturn {\n\t\t\tcopy: getShortcutRepresentation( 'core/block-editor/copy' ),\n\t\t\tcut: getShortcutRepresentation( 'core/block-editor/cut' ),\n\t\t\tduplicate: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/duplicate'\n\t\t\t),\n\t\t\tremove: getShortcutRepresentation( 'core/block-editor/remove' ),\n\t\t\tinsertAfter: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/insert-after'\n\t\t\t),\n\t\t\tinsertBefore: getShortcutRepresentation(\n\t\t\t\t'core/block-editor/insert-before'\n\t\t\t),\n\t\t};\n\t}, [] );\n\tconst hasSelectedBlocks = selectedBlockClientIds.length > 0;\n\n\tasync function updateSelectionAfterDuplicate( clientIdsPromise ) {\n\t\tif ( ! __experimentalSelectBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst ids = await clientIdsPromise;\n\t\tif ( ids && ids[ 0 ] ) {\n\t\t\t__experimentalSelectBlock( ids[ 0 ], false );\n\t\t}\n\t}\n\n\tfunction updateSelectionAfterRemove() {\n\t\tif ( ! __experimentalSelectBlock ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet blockToFocus = previousBlockClientId || firstParentClientId;\n\n\t\t// Focus the first block if there's no previous block nor parent block.\n\t\tif ( ! blockToFocus ) {\n\t\t\tblockToFocus = getBlockOrder()[ 0 ];\n\t\t}\n\n\t\t// Only update the selection if the original selection is removed.\n\t\tconst shouldUpdateSelection =\n\t\t\thasSelectedBlocks && getSelectedBlockClientIds().length === 0;\n\n\t\t__experimentalSelectBlock( blockToFocus, shouldUpdateSelection );\n\t}\n\n\t// This can occur when the selected block (the parent)\n\t// displays child blocks within a List View.\n\tconst parentBlockIsSelected =\n\t\tselectedBlockClientIds?.includes( firstParentClientId );\n\n\t// When a currentClientId is in use, treat the menu as a controlled component.\n\t// This ensures that only one block settings menu is open at a time.\n\t// This is a temporary solution to work around an issue with `onFocusOutside`\n\t// where it does not allow a dropdown to be closed if focus was never within\n\t// the dropdown to begin with. Examples include a user either CMD+Clicking or\n\t// right clicking into an inactive window.\n\t// See: https://github.com/WordPress/gutenberg/pull/54083\n\tconst open = ! currentClientId\n\t\t? undefined\n\t\t: openedBlockSettingsMenu === currentClientId || false;\n\n\tfunction onToggle( localOpen ) {\n\t\tif ( localOpen && openedBlockSettingsMenu !== currentClientId ) {\n\t\t\tsetOpenedBlockSettingsMenu( currentClientId );\n\t\t} else if (\n\t\t\t! localOpen &&\n\t\t\topenedBlockSettingsMenu &&\n\t\t\topenedBlockSettingsMenu === currentClientId\n\t\t) {\n\t\t\tsetOpenedBlockSettingsMenu( undefined );\n\t\t}\n\t}\n\n\tconst shouldShowBlockParentMenuItem =\n\t\t! parentBlockIsSelected && !! firstParentClientId;\n\n\treturn (\n\t\t<BlockActions\n\t\t\tclientIds={ clientIds }\n\t\t\t__experimentalUpdateSelection={ ! __experimentalSelectBlock }\n\t\t>\n\t\t\t{ ( {\n\t\t\t\tcanCopyStyles,\n\t\t\t\tcanDuplicate,\n\t\t\t\tcanInsertBlock,\n\t\t\t\tcanRemove,\n\t\t\t\tonDuplicate,\n\t\t\t\tonInsertAfter,\n\t\t\t\tonInsertBefore,\n\t\t\t\tonRemove,\n\t\t\t\tonCopy,\n\t\t\t\tonPasteStyles,\n\t\t\t} ) => {\n\t\t\t\t// It is possible that some plugins register fills for this menu\n\t\t\t\t// even if Core doesn't render anything in the block settings menu.\n\t\t\t\t// in which case, we may want to render the menu anyway.\n\t\t\t\t// That said for now, we can start more conservative.\n\t\t\t\tconst isEmpty =\n\t\t\t\t\t! canRemove &&\n\t\t\t\t\t! canDuplicate &&\n\t\t\t\t\t! canInsertBlock &&\n\t\t\t\t\tisContentOnly;\n\n\t\t\t\tif ( isEmpty ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<DropdownMenu\n\t\t\t\t\t\ticon={ moreVertical }\n\t\t\t\t\t\tlabel={ __( 'Options' ) }\n\t\t\t\t\t\tclassName=\"block-editor-block-settings-menu\"\n\t\t\t\t\t\tpopoverProps={ POPOVER_PROPS }\n\t\t\t\t\t\topen={ open }\n\t\t\t\t\t\tonToggle={ onToggle }\n\t\t\t\t\t\tnoIcons\n\t\t\t\t\t\t{ ...props }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ ( { onClose } ) => (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t<__unstableBlockSettingsMenuFirstItem.Slot\n\t\t\t\t\t\t\t\t\t\tfillProps={ { onClose } }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{ shouldShowBlockParentMenuItem && (\n\t\t\t\t\t\t\t\t\t\t<BlockParentSelectorMenuItem\n\t\t\t\t\t\t\t\t\t\t\tparentClientId={\n\t\t\t\t\t\t\t\t\t\t\t\tfirstParentClientId\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tparentBlockType={ parentBlockType }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ count === 1 && (\n\t\t\t\t\t\t\t\t\t\t<BlockHTMLConvertButton\n\t\t\t\t\t\t\t\t\t\t\tclientId={ firstBlockClientId }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tonCopy={ onCopy }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.copy }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Cut' ) }\n\t\t\t\t\t\t\t\t\t\t\teventType=\"cut\"\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.cut }\n\t\t\t\t\t\t\t\t\t\t\t__experimentalUpdateSelection={\n\t\t\t\t\t\t\t\t\t\t\t\t! __experimentalSelectBlock\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ canDuplicate && (\n\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\tonDuplicate,\n\t\t\t\t\t\t\t\t\t\t\t\tupdateSelectionAfterDuplicate\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.duplicate }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Duplicate' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ canInsertBlock && ! isZoomOut && (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\tonInsertBefore\n\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut={\n\t\t\t\t\t\t\t\t\t\t\t\t\tshortcuts.insertBefore\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{ __( 'Add before' ) }\n\t\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\tonInsertAfter\n\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t\tshortcut={\n\t\t\t\t\t\t\t\t\t\t\t\t\tshortcuts.insertAfter\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{ __( 'Add after' ) }\n\t\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ count === 1 && (\n\t\t\t\t\t\t\t\t\t\t<CommentIconSlotFill.Slot\n\t\t\t\t\t\t\t\t\t\t\tfillProps={ {\n\t\t\t\t\t\t\t\t\t\t\t\tclientId: firstBlockClientId,\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t{ canCopyStyles && ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t\t<CopyMenuItem\n\t\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t\t\tonCopy={ onCopy }\n\t\t\t\t\t\t\t\t\t\t\tlabel={ __( 'Copy styles' ) }\n\t\t\t\t\t\t\t\t\t\t\teventType=\"copyStyles\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<MenuItem onClick={ onPasteStyles }>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Paste styles' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t{ ! isContentOnly && (\n\t\t\t\t\t\t\t\t\t<BlockSettingsMenuControls.Slot\n\t\t\t\t\t\t\t\t\t\tfillProps={ {\n\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\tcount,\n\t\t\t\t\t\t\t\t\t\t\tfirstBlockClientId,\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\tclientIds={ clientIds }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t{ typeof children === 'function'\n\t\t\t\t\t\t\t\t\t? children( { onClose } )\n\t\t\t\t\t\t\t\t\t: Children.map( ( child ) =>\n\t\t\t\t\t\t\t\t\t\t\tcloneElement( child, { onClose } )\n\t\t\t\t\t\t\t\t\t ) }\n\t\t\t\t\t\t\t\t{ canRemove && (\n\t\t\t\t\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\t\t\tonClick={ pipe(\n\t\t\t\t\t\t\t\t\t\t\t\tonClose,\n\t\t\t\t\t\t\t\t\t\t\t\tonRemove,\n\t\t\t\t\t\t\t\t\t\t\t\tupdateSelectionAfterRemove\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\tshortcut={ shortcuts.remove }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'Delete' ) }\n\t\t\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</DropdownMenu>\n\t\t\t\t);\n\t\t\t} }\n\t\t</BlockActions>\n\t);\n}\n\nexport default BlockSettingsDropdown;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["getSelectedBlockClientIds"]
|
|
7
7
|
}
|
|
@@ -333,8 +333,12 @@ const BlockBindingsPanel = ({ name: blockName, metadata }) => {
|
|
|
333
333
|
var block_bindings_default = {
|
|
334
334
|
edit: BlockBindingsPanel,
|
|
335
335
|
attributeKeys: ["metadata"],
|
|
336
|
-
hasSupport() {
|
|
337
|
-
return
|
|
336
|
+
hasSupport(name) {
|
|
337
|
+
return ![
|
|
338
|
+
"core/post-date",
|
|
339
|
+
"core/navigation-link",
|
|
340
|
+
"core/navigation-submenu"
|
|
341
|
+
].includes(name);
|
|
338
342
|
}
|
|
339
343
|
};
|
|
340
344
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/block-bindings.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { getBlockBindingsSources, getBlockType } from '@wordpress/blocks';\nimport {\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalItem as Item,\n\t__experimentalText as Text,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalVStack as VStack,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { useContext } from '@wordpress/element';\nimport { useViewportMatch } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { useBlockBindingsUtils } from '../utils/block-bindings';\nimport { unlock } from '../lock-unlock';\nimport InspectorControls from '../components/inspector-controls';\nimport BlockContext from '../components/block-context';\nimport { useBlockEditContext } from '../components/block-edit';\nimport { store as blockEditorStore } from '../store';\n\nconst { Menu } = unlock( componentsPrivateApis );\n\nconst EMPTY_OBJECT = {};\n\n/**\n * Get the normalized attribute type for block bindings.\n * Converts 'rich-text' to 'string' since rich-text is stored as string.\n *\n * @param {string} blockName The block name.\n * @param {string} attribute The attribute name.\n * @return {string} The normalized attribute type.\n */\nconst getAttributeType = ( blockName, attribute ) => {\n\tconst _attributeType =\n\t\tgetBlockType( blockName ).attributes?.[ attribute ]?.type;\n\treturn _attributeType === 'rich-text' ? 'string' : _attributeType;\n};\n\nconst useToolsPanelDropdownMenuProps = () => {\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\treturn ! isMobile\n\t\t? {\n\t\t\t\tpopoverProps: {\n\t\t\t\t\tplacement: 'left-start',\n\t\t\t\t\t// For non-mobile, inner sidebar width (248px) - button width (24px) - border (1px) + padding (16px) + spacing (20px)\n\t\t\t\t\toffset: 259,\n\t\t\t\t},\n\t\t }\n\t\t: {};\n};\n\nfunction BlockBindingsPanelMenuContent( { attribute, binding, sources } ) {\n\tconst { clientId } = useBlockEditContext();\n\tconst { updateBlockBindings } = useBlockBindingsUtils();\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\tconst blockContext = useContext( BlockContext );\n\tconst { attributeType, select } = useSelect(\n\t\t( _select ) => {\n\t\t\tconst { name: blockName } =\n\t\t\t\t_select( blockEditorStore ).getBlock( clientId );\n\t\t\treturn {\n\t\t\t\tattributeType: getAttributeType( blockName, attribute ),\n\t\t\t\tselect: _select,\n\t\t\t};\n\t\t},\n\t\t[ clientId, attribute ]\n\t);\n\treturn (\n\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t{ Object.entries( sources ).map( ( [ sourceKey, source ] ) => {\n\t\t\t\t// Only show sources that have compatible data for this specific attribute.\n\t\t\t\tconst sourceDataItems = source.data?.filter(\n\t\t\t\t\t( item ) => item?.type === attributeType\n\t\t\t\t);\n\n\t\t\t\tconst noItemsAvailable =\n\t\t\t\t\t! sourceDataItems || sourceDataItems.length === 0;\n\n\t\t\t\tif ( noItemsAvailable ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<Menu\n\t\t\t\t\t\tkey={ sourceKey }\n\t\t\t\t\t\tplacement={ isMobile ? 'bottom-start' : 'left-start' }\n\t\t\t\t\t>\n\t\t\t\t\t\t<Menu.SubmenuTriggerItem>\n\t\t\t\t\t\t\t<Menu.ItemLabel>{ source.label }</Menu.ItemLabel>\n\t\t\t\t\t\t</Menu.SubmenuTriggerItem>\n\t\t\t\t\t\t<Menu.Popover gutter={ 8 }>\n\t\t\t\t\t\t\t<Menu.Group>\n\t\t\t\t\t\t\t\t{ sourceDataItems.map( ( item ) => {\n\t\t\t\t\t\t\t\t\tconst itemBindings = {\n\t\t\t\t\t\t\t\t\t\tsource: sourceKey,\n\t\t\t\t\t\t\t\t\t\targs: item?.args || {\n\t\t\t\t\t\t\t\t\t\t\tkey: item.key,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tconst values = source.getValues( {\n\t\t\t\t\t\t\t\t\t\tselect,\n\t\t\t\t\t\t\t\t\t\tcontext: blockContext,\n\t\t\t\t\t\t\t\t\t\tbindings: {\n\t\t\t\t\t\t\t\t\t\t\t[ attribute ]: itemBindings,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Menu.CheckboxItem\n\t\t\t\t\t\t\t\t\t\t\tkey={\n\t\t\t\t\t\t\t\t\t\t\t\tsourceKey +\n\t\t\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t\t) || item.key\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst isCurrentlySelected =\n\t\t\t\t\t\t\t\t\t\t\t\t\tfastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t\t) ??\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Deprecate key dependency in 7.0.\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.key ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args?.key;\n\n\t\t\t\t\t\t\t\t\t\t\t\tif ( isCurrentlySelected ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Unset if the same item is selected again.\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ attribute ]:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ attribute ]:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\titemBindings,\n\t\t\t\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\tname={ attribute + '-binding' }\n\t\t\t\t\t\t\t\t\t\t\tvalue={ values[ attribute ] }\n\t\t\t\t\t\t\t\t\t\t\tchecked={\n\t\t\t\t\t\t\t\t\t\t\t\tfastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args,\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t) ??\n\t\t\t\t\t\t\t\t\t\t\t\t// Deprecate key dependency in 7.0.\n\t\t\t\t\t\t\t\t\t\t\t\titem.key === binding?.args?.key\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Menu.ItemLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t{ item?.label }\n\t\t\t\t\t\t\t\t\t\t\t</Menu.ItemLabel>\n\t\t\t\t\t\t\t\t\t\t\t<Menu.ItemHelpText>\n\t\t\t\t\t\t\t\t\t\t\t\t{ values[ attribute ] }\n\t\t\t\t\t\t\t\t\t\t\t</Menu.ItemHelpText>\n\t\t\t\t\t\t\t\t\t\t</Menu.CheckboxItem>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</Menu.Group>\n\t\t\t\t\t\t</Menu.Popover>\n\t\t\t\t\t</Menu>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Menu>\n\t);\n}\n\nfunction BlockBindingsAttribute( { attribute, binding, sources, blockName } ) {\n\tconst { source: sourceName, args } = binding || {};\n\tconst source = sources?.[ sourceName ];\n\n\tlet displayText;\n\tlet isValid = true;\n\tconst isNotBound = binding === undefined;\n\n\tif ( isNotBound ) {\n\t\t// Check if there are any compatible sources for this attribute type.\n\t\tconst attributeType = getAttributeType( blockName, attribute );\n\n\t\tconst hasCompatibleSources = Object.values( sources ).some( ( src ) =>\n\t\t\tsrc.data?.some( ( item ) => item?.type === attributeType )\n\t\t);\n\n\t\tif ( ! hasCompatibleSources ) {\n\t\t\tdisplayText = __( 'No sources available' );\n\t\t} else {\n\t\t\tdisplayText = __( 'Not connected' );\n\t\t}\n\t\tisValid = true;\n\t} else if ( ! source ) {\n\t\t// If there's a binding but the source is not found, it's invalid.\n\t\tisValid = false;\n\t\tdisplayText = __( 'Source not registered' );\n\t\tif ( Object.keys( sources ).length === 0 ) {\n\t\t\tdisplayText = __( 'No sources available' );\n\t\t}\n\t} else {\n\t\tdisplayText =\n\t\t\tsource.data?.find( ( item ) => fastDeepEqual( item.args, args ) )\n\t\t\t\t?.label ||\n\t\t\tsource.label ||\n\t\t\tsourceName;\n\t}\n\n\treturn (\n\t\t<VStack className=\"block-editor-bindings__item\" spacing={ 0 }>\n\t\t\t<Text truncate>{ attribute }</Text>\n\t\t\t<Text\n\t\t\t\ttruncate\n\t\t\t\tvariant={ isValid ? 'muted' : undefined }\n\t\t\t\tisDestructive={ ! isValid }\n\t\t\t>\n\t\t\t\t{ displayText }\n\t\t\t</Text>\n\t\t</VStack>\n\t);\n}\n\nfunction ReadOnlyBlockBindingsPanelItem( {\n\tattribute,\n\tbinding,\n\tsources,\n\tblockName,\n} ) {\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\n\treturn (\n\t\t<ToolsPanelItem hasValue={ () => !! binding } label={ attribute }>\n\t\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t\t<Menu.TriggerButton render={ <Item /> } disabled>\n\t\t\t\t\t<BlockBindingsAttribute\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.TriggerButton>\n\t\t\t</Menu>\n\t\t</ToolsPanelItem>\n\t);\n}\n\nfunction EditableBlockBindingsPanelItem( {\n\tattribute,\n\tbinding,\n\tsources,\n\tblockName,\n} ) {\n\tconst { updateBlockBindings } = useBlockBindingsUtils();\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\n\treturn (\n\t\t<ToolsPanelItem\n\t\t\thasValue={ () => !! binding }\n\t\t\tlabel={ attribute }\n\t\t\tonDeselect={ () => {\n\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t[ attribute ]: undefined,\n\t\t\t\t} );\n\t\t\t} }\n\t\t>\n\t\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t\t<Menu.TriggerButton render={ <Item /> }>\n\t\t\t\t\t<BlockBindingsAttribute\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.TriggerButton>\n\t\t\t\t<Menu.Popover gutter={ isMobile ? 8 : 36 }>\n\t\t\t\t\t<BlockBindingsPanelMenuContent\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.Popover>\n\t\t\t</Menu>\n\t\t</ToolsPanelItem>\n\t);\n}\n\nexport const BlockBindingsPanel = ( { name: blockName, metadata } ) => {\n\tconst blockContext = useContext( BlockContext );\n\tconst { removeAllBlockBindings } = useBlockBindingsUtils();\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\n\t// Use useSelect to ensure sources are updated whenever there are updates in block context\n\t// or when underlying data changes.\n\t// Still needs a fix regarding _sources scope.\n\tconst _sources = {};\n\tconst { sources, canUpdateBlockBindings, bindableAttributes } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { __experimentalBlockBindingsSupportedAttributes } =\n\t\t\t\tselect( blockEditorStore ).getSettings();\n\t\t\tconst _bindableAttributes =\n\t\t\t\t__experimentalBlockBindingsSupportedAttributes?.[ blockName ];\n\t\t\tif ( ! _bindableAttributes || _bindableAttributes.length === 0 ) {\n\t\t\t\treturn EMPTY_OBJECT;\n\t\t\t}\n\n\t\t\tconst registeredSources = getBlockBindingsSources();\n\t\t\tObject.entries( registeredSources ).forEach(\n\t\t\t\t( [\n\t\t\t\t\tsourceName,\n\t\t\t\t\t{ getFieldsList, usesContext, label, getValues },\n\t\t\t\t] ) => {\n\t\t\t\t\t// Populate context.\n\t\t\t\t\tconst context = {};\n\t\t\t\t\tif ( usesContext?.length ) {\n\t\t\t\t\t\tfor ( const key of usesContext ) {\n\t\t\t\t\t\t\tcontext[ key ] = blockContext[ key ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( getFieldsList ) {\n\t\t\t\t\t\tconst fieldsListResult = getFieldsList( {\n\t\t\t\t\t\t\tselect,\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t} );\n\t\t\t\t\t\t_sources[ sourceName ] = {\n\t\t\t\t\t\t\tdata: fieldsListResult || [],\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tgetValues,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Include sources without getFieldsList if they are already used in a binding.\n\t\t\t\t\t\t * This allows them to be displayed in read-only mode.\n\t\t\t\t\t\t */\n\t\t\t\t\t\t_sources[ sourceName ] = {\n\t\t\t\t\t\t\tdata: [],\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tgetValues,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tsources:\n\t\t\t\t\tObject.values( _sources ).length > 0\n\t\t\t\t\t\t? _sources\n\t\t\t\t\t\t: EMPTY_OBJECT,\n\t\t\t\tcanUpdateBlockBindings:\n\t\t\t\t\tselect( blockEditorStore ).getSettings()\n\t\t\t\t\t\t.canUpdateBlockBindings,\n\t\t\t\tbindableAttributes: _bindableAttributes,\n\t\t\t};\n\t\t},\n\t\t[ blockContext, blockName ]\n\t);\n\t// Return early if there are no bindable attributes.\n\tif ( ! bindableAttributes || bindableAttributes.length === 0 ) {\n\t\treturn null;\n\t}\n\n\tconst { bindings } = metadata || {};\n\n\t// Check if all sources have empty data arrays.\n\tconst hasCompatibleData = Object.values( sources ).some(\n\t\t( source ) => source.data && source.data.length > 0\n\t);\n\n\t// Lock the UI when the user can't update bindings or there are no fields to connect to.\n\tconst readOnly = ! canUpdateBlockBindings || ! hasCompatibleData;\n\n\tif ( bindings === undefined && ! hasCompatibleData ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<InspectorControls group=\"bindings\">\n\t\t\t<ToolsPanel\n\t\t\t\tlabel={ __( 'Attributes' ) }\n\t\t\t\tresetAll={ () => {\n\t\t\t\t\tremoveAllBlockBindings();\n\t\t\t\t} }\n\t\t\t\tdropdownMenuProps={ dropdownMenuProps }\n\t\t\t\tclassName=\"block-editor-bindings__panel\"\n\t\t\t>\n\t\t\t\t<ItemGroup isBordered isSeparated>\n\t\t\t\t\t{ bindableAttributes.map( ( attribute ) => {\n\t\t\t\t\t\tconst binding = bindings?.[ attribute ];\n\n\t\t\t\t\t\t// Check if this specific attribute has compatible data from any source.\n\t\t\t\t\t\tconst attributeType = getAttributeType(\n\t\t\t\t\t\t\tblockName,\n\t\t\t\t\t\t\tattribute\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst hasCompatibleDataForAttribute = Object.values(\n\t\t\t\t\t\t\tsources\n\t\t\t\t\t\t).some( ( source ) =>\n\t\t\t\t\t\t\tsource.data?.some(\n\t\t\t\t\t\t\t\t( item ) => item?.type === attributeType\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst isAttributeReadOnly =\n\t\t\t\t\t\t\treadOnly || ! hasCompatibleDataForAttribute;\n\n\t\t\t\t\t\treturn isAttributeReadOnly ? (\n\t\t\t\t\t\t\t<ReadOnlyBlockBindingsPanelItem\n\t\t\t\t\t\t\t\tkey={ attribute }\n\t\t\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<EditableBlockBindingsPanelItem\n\t\t\t\t\t\t\t\tkey={ attribute }\n\t\t\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</ItemGroup>\n\t\t\t\t{ /*\n\t\t\t\t\tUse a div element to make the ToolsPanelHiddenInnerWrapper\n\t\t\t\t\ttoggle the visibility of this help text automatically.\n\t\t\t\t*/ }\n\t\t\t\t<Text as=\"div\" variant=\"muted\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'Attributes connected to custom fields or other dynamic data.'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t</Text>\n\t\t\t</ToolsPanel>\n\t\t</InspectorControls>\n\t);\n};\n\nexport default {\n\tedit: BlockBindingsPanel,\n\tattributeKeys: [ 'metadata' ],\n\thasSupport() {\n\t\treturn true;\n\t},\n};\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { getBlockBindingsSources, getBlockType } from '@wordpress/blocks';\nimport {\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalItem as Item,\n\t__experimentalText as Text,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalVStack as VStack,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { useContext } from '@wordpress/element';\nimport { useViewportMatch } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { useBlockBindingsUtils } from '../utils/block-bindings';\nimport { unlock } from '../lock-unlock';\nimport InspectorControls from '../components/inspector-controls';\nimport BlockContext from '../components/block-context';\nimport { useBlockEditContext } from '../components/block-edit';\nimport { store as blockEditorStore } from '../store';\n\nconst { Menu } = unlock( componentsPrivateApis );\n\nconst EMPTY_OBJECT = {};\n\n/**\n * Get the normalized attribute type for block bindings.\n * Converts 'rich-text' to 'string' since rich-text is stored as string.\n *\n * @param {string} blockName The block name.\n * @param {string} attribute The attribute name.\n * @return {string} The normalized attribute type.\n */\nconst getAttributeType = ( blockName, attribute ) => {\n\tconst _attributeType =\n\t\tgetBlockType( blockName ).attributes?.[ attribute ]?.type;\n\treturn _attributeType === 'rich-text' ? 'string' : _attributeType;\n};\n\nconst useToolsPanelDropdownMenuProps = () => {\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\treturn ! isMobile\n\t\t? {\n\t\t\t\tpopoverProps: {\n\t\t\t\t\tplacement: 'left-start',\n\t\t\t\t\t// For non-mobile, inner sidebar width (248px) - button width (24px) - border (1px) + padding (16px) + spacing (20px)\n\t\t\t\t\toffset: 259,\n\t\t\t\t},\n\t\t }\n\t\t: {};\n};\n\nfunction BlockBindingsPanelMenuContent( { attribute, binding, sources } ) {\n\tconst { clientId } = useBlockEditContext();\n\tconst { updateBlockBindings } = useBlockBindingsUtils();\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\tconst blockContext = useContext( BlockContext );\n\tconst { attributeType, select } = useSelect(\n\t\t( _select ) => {\n\t\t\tconst { name: blockName } =\n\t\t\t\t_select( blockEditorStore ).getBlock( clientId );\n\t\t\treturn {\n\t\t\t\tattributeType: getAttributeType( blockName, attribute ),\n\t\t\t\tselect: _select,\n\t\t\t};\n\t\t},\n\t\t[ clientId, attribute ]\n\t);\n\treturn (\n\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t{ Object.entries( sources ).map( ( [ sourceKey, source ] ) => {\n\t\t\t\t// Only show sources that have compatible data for this specific attribute.\n\t\t\t\tconst sourceDataItems = source.data?.filter(\n\t\t\t\t\t( item ) => item?.type === attributeType\n\t\t\t\t);\n\n\t\t\t\tconst noItemsAvailable =\n\t\t\t\t\t! sourceDataItems || sourceDataItems.length === 0;\n\n\t\t\t\tif ( noItemsAvailable ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<Menu\n\t\t\t\t\t\tkey={ sourceKey }\n\t\t\t\t\t\tplacement={ isMobile ? 'bottom-start' : 'left-start' }\n\t\t\t\t\t>\n\t\t\t\t\t\t<Menu.SubmenuTriggerItem>\n\t\t\t\t\t\t\t<Menu.ItemLabel>{ source.label }</Menu.ItemLabel>\n\t\t\t\t\t\t</Menu.SubmenuTriggerItem>\n\t\t\t\t\t\t<Menu.Popover gutter={ 8 }>\n\t\t\t\t\t\t\t<Menu.Group>\n\t\t\t\t\t\t\t\t{ sourceDataItems.map( ( item ) => {\n\t\t\t\t\t\t\t\t\tconst itemBindings = {\n\t\t\t\t\t\t\t\t\t\tsource: sourceKey,\n\t\t\t\t\t\t\t\t\t\targs: item?.args || {\n\t\t\t\t\t\t\t\t\t\t\tkey: item.key,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tconst values = source.getValues( {\n\t\t\t\t\t\t\t\t\t\tselect,\n\t\t\t\t\t\t\t\t\t\tcontext: blockContext,\n\t\t\t\t\t\t\t\t\t\tbindings: {\n\t\t\t\t\t\t\t\t\t\t\t[ attribute ]: itemBindings,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Menu.CheckboxItem\n\t\t\t\t\t\t\t\t\t\t\tkey={\n\t\t\t\t\t\t\t\t\t\t\t\tsourceKey +\n\t\t\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t\t) || item.key\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst isCurrentlySelected =\n\t\t\t\t\t\t\t\t\t\t\t\t\tfastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t\t) ??\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Deprecate key dependency in 7.0.\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.key ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args?.key;\n\n\t\t\t\t\t\t\t\t\t\t\t\tif ( isCurrentlySelected ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Unset if the same item is selected again.\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ attribute ]:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[ attribute ]:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\titemBindings,\n\t\t\t\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t\t\tname={ attribute + '-binding' }\n\t\t\t\t\t\t\t\t\t\t\tvalue={ values[ attribute ] }\n\t\t\t\t\t\t\t\t\t\t\tchecked={\n\t\t\t\t\t\t\t\t\t\t\t\tfastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\t\t\tbinding?.args,\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.args\n\t\t\t\t\t\t\t\t\t\t\t\t) ??\n\t\t\t\t\t\t\t\t\t\t\t\t// Deprecate key dependency in 7.0.\n\t\t\t\t\t\t\t\t\t\t\t\titem.key === binding?.args?.key\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Menu.ItemLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t{ item?.label }\n\t\t\t\t\t\t\t\t\t\t\t</Menu.ItemLabel>\n\t\t\t\t\t\t\t\t\t\t\t<Menu.ItemHelpText>\n\t\t\t\t\t\t\t\t\t\t\t\t{ values[ attribute ] }\n\t\t\t\t\t\t\t\t\t\t\t</Menu.ItemHelpText>\n\t\t\t\t\t\t\t\t\t\t</Menu.CheckboxItem>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</Menu.Group>\n\t\t\t\t\t\t</Menu.Popover>\n\t\t\t\t\t</Menu>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Menu>\n\t);\n}\n\nfunction BlockBindingsAttribute( { attribute, binding, sources, blockName } ) {\n\tconst { source: sourceName, args } = binding || {};\n\tconst source = sources?.[ sourceName ];\n\n\tlet displayText;\n\tlet isValid = true;\n\tconst isNotBound = binding === undefined;\n\n\tif ( isNotBound ) {\n\t\t// Check if there are any compatible sources for this attribute type.\n\t\tconst attributeType = getAttributeType( blockName, attribute );\n\n\t\tconst hasCompatibleSources = Object.values( sources ).some( ( src ) =>\n\t\t\tsrc.data?.some( ( item ) => item?.type === attributeType )\n\t\t);\n\n\t\tif ( ! hasCompatibleSources ) {\n\t\t\tdisplayText = __( 'No sources available' );\n\t\t} else {\n\t\t\tdisplayText = __( 'Not connected' );\n\t\t}\n\t\tisValid = true;\n\t} else if ( ! source ) {\n\t\t// If there's a binding but the source is not found, it's invalid.\n\t\tisValid = false;\n\t\tdisplayText = __( 'Source not registered' );\n\t\tif ( Object.keys( sources ).length === 0 ) {\n\t\t\tdisplayText = __( 'No sources available' );\n\t\t}\n\t} else {\n\t\tdisplayText =\n\t\t\tsource.data?.find( ( item ) => fastDeepEqual( item.args, args ) )\n\t\t\t\t?.label ||\n\t\t\tsource.label ||\n\t\t\tsourceName;\n\t}\n\n\treturn (\n\t\t<VStack className=\"block-editor-bindings__item\" spacing={ 0 }>\n\t\t\t<Text truncate>{ attribute }</Text>\n\t\t\t<Text\n\t\t\t\ttruncate\n\t\t\t\tvariant={ isValid ? 'muted' : undefined }\n\t\t\t\tisDestructive={ ! isValid }\n\t\t\t>\n\t\t\t\t{ displayText }\n\t\t\t</Text>\n\t\t</VStack>\n\t);\n}\n\nfunction ReadOnlyBlockBindingsPanelItem( {\n\tattribute,\n\tbinding,\n\tsources,\n\tblockName,\n} ) {\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\n\treturn (\n\t\t<ToolsPanelItem hasValue={ () => !! binding } label={ attribute }>\n\t\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t\t<Menu.TriggerButton render={ <Item /> } disabled>\n\t\t\t\t\t<BlockBindingsAttribute\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.TriggerButton>\n\t\t\t</Menu>\n\t\t</ToolsPanelItem>\n\t);\n}\n\nfunction EditableBlockBindingsPanelItem( {\n\tattribute,\n\tbinding,\n\tsources,\n\tblockName,\n} ) {\n\tconst { updateBlockBindings } = useBlockBindingsUtils();\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\n\treturn (\n\t\t<ToolsPanelItem\n\t\t\thasValue={ () => !! binding }\n\t\t\tlabel={ attribute }\n\t\t\tonDeselect={ () => {\n\t\t\t\tupdateBlockBindings( {\n\t\t\t\t\t[ attribute ]: undefined,\n\t\t\t\t} );\n\t\t\t} }\n\t\t>\n\t\t\t<Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>\n\t\t\t\t<Menu.TriggerButton render={ <Item /> }>\n\t\t\t\t\t<BlockBindingsAttribute\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.TriggerButton>\n\t\t\t\t<Menu.Popover gutter={ isMobile ? 8 : 36 }>\n\t\t\t\t\t<BlockBindingsPanelMenuContent\n\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t/>\n\t\t\t\t</Menu.Popover>\n\t\t\t</Menu>\n\t\t</ToolsPanelItem>\n\t);\n}\n\nexport const BlockBindingsPanel = ( { name: blockName, metadata } ) => {\n\tconst blockContext = useContext( BlockContext );\n\tconst { removeAllBlockBindings } = useBlockBindingsUtils();\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\n\t// Use useSelect to ensure sources are updated whenever there are updates in block context\n\t// or when underlying data changes.\n\t// Still needs a fix regarding _sources scope.\n\tconst _sources = {};\n\tconst { sources, canUpdateBlockBindings, bindableAttributes } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { __experimentalBlockBindingsSupportedAttributes } =\n\t\t\t\tselect( blockEditorStore ).getSettings();\n\t\t\tconst _bindableAttributes =\n\t\t\t\t__experimentalBlockBindingsSupportedAttributes?.[ blockName ];\n\t\t\tif ( ! _bindableAttributes || _bindableAttributes.length === 0 ) {\n\t\t\t\treturn EMPTY_OBJECT;\n\t\t\t}\n\n\t\t\tconst registeredSources = getBlockBindingsSources();\n\t\t\tObject.entries( registeredSources ).forEach(\n\t\t\t\t( [\n\t\t\t\t\tsourceName,\n\t\t\t\t\t{ getFieldsList, usesContext, label, getValues },\n\t\t\t\t] ) => {\n\t\t\t\t\t// Populate context.\n\t\t\t\t\tconst context = {};\n\t\t\t\t\tif ( usesContext?.length ) {\n\t\t\t\t\t\tfor ( const key of usesContext ) {\n\t\t\t\t\t\t\tcontext[ key ] = blockContext[ key ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( getFieldsList ) {\n\t\t\t\t\t\tconst fieldsListResult = getFieldsList( {\n\t\t\t\t\t\t\tselect,\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t} );\n\t\t\t\t\t\t_sources[ sourceName ] = {\n\t\t\t\t\t\t\tdata: fieldsListResult || [],\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tgetValues,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Include sources without getFieldsList if they are already used in a binding.\n\t\t\t\t\t\t * This allows them to be displayed in read-only mode.\n\t\t\t\t\t\t */\n\t\t\t\t\t\t_sources[ sourceName ] = {\n\t\t\t\t\t\t\tdata: [],\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tgetValues,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tsources:\n\t\t\t\t\tObject.values( _sources ).length > 0\n\t\t\t\t\t\t? _sources\n\t\t\t\t\t\t: EMPTY_OBJECT,\n\t\t\t\tcanUpdateBlockBindings:\n\t\t\t\t\tselect( blockEditorStore ).getSettings()\n\t\t\t\t\t\t.canUpdateBlockBindings,\n\t\t\t\tbindableAttributes: _bindableAttributes,\n\t\t\t};\n\t\t},\n\t\t[ blockContext, blockName ]\n\t);\n\t// Return early if there are no bindable attributes.\n\tif ( ! bindableAttributes || bindableAttributes.length === 0 ) {\n\t\treturn null;\n\t}\n\n\tconst { bindings } = metadata || {};\n\n\t// Check if all sources have empty data arrays.\n\tconst hasCompatibleData = Object.values( sources ).some(\n\t\t( source ) => source.data && source.data.length > 0\n\t);\n\n\t// Lock the UI when the user can't update bindings or there are no fields to connect to.\n\tconst readOnly = ! canUpdateBlockBindings || ! hasCompatibleData;\n\n\tif ( bindings === undefined && ! hasCompatibleData ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<InspectorControls group=\"bindings\">\n\t\t\t<ToolsPanel\n\t\t\t\tlabel={ __( 'Attributes' ) }\n\t\t\t\tresetAll={ () => {\n\t\t\t\t\tremoveAllBlockBindings();\n\t\t\t\t} }\n\t\t\t\tdropdownMenuProps={ dropdownMenuProps }\n\t\t\t\tclassName=\"block-editor-bindings__panel\"\n\t\t\t>\n\t\t\t\t<ItemGroup isBordered isSeparated>\n\t\t\t\t\t{ bindableAttributes.map( ( attribute ) => {\n\t\t\t\t\t\tconst binding = bindings?.[ attribute ];\n\n\t\t\t\t\t\t// Check if this specific attribute has compatible data from any source.\n\t\t\t\t\t\tconst attributeType = getAttributeType(\n\t\t\t\t\t\t\tblockName,\n\t\t\t\t\t\t\tattribute\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst hasCompatibleDataForAttribute = Object.values(\n\t\t\t\t\t\t\tsources\n\t\t\t\t\t\t).some( ( source ) =>\n\t\t\t\t\t\t\tsource.data?.some(\n\t\t\t\t\t\t\t\t( item ) => item?.type === attributeType\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst isAttributeReadOnly =\n\t\t\t\t\t\t\treadOnly || ! hasCompatibleDataForAttribute;\n\n\t\t\t\t\t\treturn isAttributeReadOnly ? (\n\t\t\t\t\t\t\t<ReadOnlyBlockBindingsPanelItem\n\t\t\t\t\t\t\t\tkey={ attribute }\n\t\t\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<EditableBlockBindingsPanelItem\n\t\t\t\t\t\t\t\tkey={ attribute }\n\t\t\t\t\t\t\t\tattribute={ attribute }\n\t\t\t\t\t\t\t\tbinding={ binding }\n\t\t\t\t\t\t\t\tsources={ sources }\n\t\t\t\t\t\t\t\tblockName={ blockName }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</ItemGroup>\n\t\t\t\t{ /*\n\t\t\t\t\tUse a div element to make the ToolsPanelHiddenInnerWrapper\n\t\t\t\t\ttoggle the visibility of this help text automatically.\n\t\t\t\t*/ }\n\t\t\t\t<Text as=\"div\" variant=\"muted\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'Attributes connected to custom fields or other dynamic data.'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t</Text>\n\t\t\t</ToolsPanel>\n\t\t</InspectorControls>\n\t);\n};\n\nexport default {\n\tedit: BlockBindingsPanel,\n\tattributeKeys: [ 'metadata' ],\n\thasSupport( name ) {\n\t\treturn ! [\n\t\t\t'core/post-date',\n\t\t\t'core/navigation-link',\n\t\t\t'core/navigation-submenu',\n\t\t].includes( name );\n\t},\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -63,14 +63,35 @@ function useFitText({ fitText, name, clientId }) {
|
|
|
63
63
|
if (!fitText || !blockElement || !clientId || !hasFitTextSupport2) {
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
|
-
applyFitText();
|
|
67
66
|
const currentElement = blockElement;
|
|
67
|
+
const previousVisibility = currentElement.style.visibility;
|
|
68
|
+
let hideFrameId = null;
|
|
69
|
+
let calculateFrameId = null;
|
|
70
|
+
let showTimeoutId = null;
|
|
71
|
+
hideFrameId = window.requestAnimationFrame(() => {
|
|
72
|
+
currentElement.style.visibility = "hidden";
|
|
73
|
+
calculateFrameId = window.requestAnimationFrame(() => {
|
|
74
|
+
applyFitText();
|
|
75
|
+
showTimeoutId = setTimeout(() => {
|
|
76
|
+
currentElement.style.visibility = previousVisibility;
|
|
77
|
+
}, 10);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
68
80
|
let resizeObserver;
|
|
69
81
|
if (window.ResizeObserver && currentElement.parentElement) {
|
|
70
82
|
resizeObserver = new window.ResizeObserver(applyFitText);
|
|
71
83
|
resizeObserver.observe(currentElement.parentElement);
|
|
72
84
|
}
|
|
73
85
|
return () => {
|
|
86
|
+
if (hideFrameId !== null) {
|
|
87
|
+
window.cancelAnimationFrame(hideFrameId);
|
|
88
|
+
}
|
|
89
|
+
if (calculateFrameId !== null) {
|
|
90
|
+
window.cancelAnimationFrame(calculateFrameId);
|
|
91
|
+
}
|
|
92
|
+
if (showTimeoutId !== null) {
|
|
93
|
+
clearTimeout(showTimeoutId);
|
|
94
|
+
}
|
|
74
95
|
if (resizeObserver) {
|
|
75
96
|
resizeObserver.disconnect();
|
|
76
97
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/fit-text.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { addFilter } from '@wordpress/hooks';\nimport { hasBlockSupport } from '@wordpress/blocks';\nimport { useEffect, useCallback } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport {\n\tToggleControl,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport { optimizeFitText } from '../utils/fit-text-utils';\nimport { store as blockEditorStore } from '../store';\nimport { useBlockElement } from '../components/block-list/use-block-props/use-block-refs';\nimport InspectorControls from '../components/inspector-controls';\n\nexport const FIT_TEXT_SUPPORT_KEY = 'typography.fitText';\n\n/**\n * Filters registered block settings, extending attributes to include\n * the `fitText` attribute.\n *\n * @param {Object} settings Original block settings.\n * @return {Object} Filtered block settings.\n */\nfunction addAttributes( settings ) {\n\tif ( ! hasBlockSupport( settings, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn settings;\n\t}\n\n\t// Allow blocks to specify their own attribute definition.\n\tif ( settings.attributes?.fitText ) {\n\t\treturn settings;\n\t}\n\n\t// Add fitText attribute.\n\treturn {\n\t\t...settings,\n\t\tattributes: {\n\t\t\t...settings.attributes,\n\t\t\tfitText: {\n\t\t\t\ttype: 'boolean',\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Custom hook to handle fit text functionality in the editor.\n *\n * @param {Object} props Component props.\n * @param {?boolean} props.fitText Fit text attribute.\n * @param {string} props.name Block name.\n * @param {string} props.clientId Block client ID.\n */\nfunction useFitText( { fitText, name, clientId } ) {\n\tconst hasFitTextSupport = hasBlockSupport( name, FIT_TEXT_SUPPORT_KEY );\n\tconst blockElement = useBlockElement( clientId );\n\n\t// Monitor block attribute changes\n\t// Any attribute may change the available space.\n\tconst blockAttributes = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! clientId || ! hasFitTextSupport || ! fitText ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn select( blockEditorStore ).getBlockAttributes( clientId );\n\t\t},\n\t\t[ clientId, hasFitTextSupport, fitText ]\n\t);\n\n\tconst applyFitText = useCallback( () => {\n\t\tif ( ! blockElement || ! hasFitTextSupport || ! fitText ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get or create style element with unique ID\n\t\tconst styleId = `fit-text-${ clientId }`;\n\t\tlet styleElement = blockElement.ownerDocument.getElementById( styleId );\n\t\tif ( ! styleElement ) {\n\t\t\tstyleElement = blockElement.ownerDocument.createElement( 'style' );\n\t\t\tstyleElement.id = styleId;\n\t\t\tblockElement.ownerDocument.head.appendChild( styleElement );\n\t\t}\n\n\t\tconst blockSelector = `#block-${ clientId }`;\n\n\t\tconst applyStylesFn = ( css ) => {\n\t\t\tstyleElement.textContent = css;\n\t\t};\n\n\t\toptimizeFitText( blockElement, blockSelector, applyStylesFn );\n\t}, [ blockElement, clientId, hasFitTextSupport, fitText ] );\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! fitText ||\n\t\t\t! blockElement ||\n\t\t\t! clientId ||\n\t\t\t! hasFitTextSupport\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t//
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { addFilter } from '@wordpress/hooks';\nimport { hasBlockSupport } from '@wordpress/blocks';\nimport { useEffect, useCallback } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport {\n\tToggleControl,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport { optimizeFitText } from '../utils/fit-text-utils';\nimport { store as blockEditorStore } from '../store';\nimport { useBlockElement } from '../components/block-list/use-block-props/use-block-refs';\nimport InspectorControls from '../components/inspector-controls';\n\nexport const FIT_TEXT_SUPPORT_KEY = 'typography.fitText';\n\n/**\n * Filters registered block settings, extending attributes to include\n * the `fitText` attribute.\n *\n * @param {Object} settings Original block settings.\n * @return {Object} Filtered block settings.\n */\nfunction addAttributes( settings ) {\n\tif ( ! hasBlockSupport( settings, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn settings;\n\t}\n\n\t// Allow blocks to specify their own attribute definition.\n\tif ( settings.attributes?.fitText ) {\n\t\treturn settings;\n\t}\n\n\t// Add fitText attribute.\n\treturn {\n\t\t...settings,\n\t\tattributes: {\n\t\t\t...settings.attributes,\n\t\t\tfitText: {\n\t\t\t\ttype: 'boolean',\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Custom hook to handle fit text functionality in the editor.\n *\n * @param {Object} props Component props.\n * @param {?boolean} props.fitText Fit text attribute.\n * @param {string} props.name Block name.\n * @param {string} props.clientId Block client ID.\n */\nfunction useFitText( { fitText, name, clientId } ) {\n\tconst hasFitTextSupport = hasBlockSupport( name, FIT_TEXT_SUPPORT_KEY );\n\tconst blockElement = useBlockElement( clientId );\n\n\t// Monitor block attribute changes\n\t// Any attribute may change the available space.\n\tconst blockAttributes = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! clientId || ! hasFitTextSupport || ! fitText ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn select( blockEditorStore ).getBlockAttributes( clientId );\n\t\t},\n\t\t[ clientId, hasFitTextSupport, fitText ]\n\t);\n\n\tconst applyFitText = useCallback( () => {\n\t\tif ( ! blockElement || ! hasFitTextSupport || ! fitText ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get or create style element with unique ID\n\t\tconst styleId = `fit-text-${ clientId }`;\n\t\tlet styleElement = blockElement.ownerDocument.getElementById( styleId );\n\t\tif ( ! styleElement ) {\n\t\t\tstyleElement = blockElement.ownerDocument.createElement( 'style' );\n\t\t\tstyleElement.id = styleId;\n\t\t\tblockElement.ownerDocument.head.appendChild( styleElement );\n\t\t}\n\n\t\tconst blockSelector = `#block-${ clientId }`;\n\n\t\tconst applyStylesFn = ( css ) => {\n\t\t\tstyleElement.textContent = css;\n\t\t};\n\n\t\toptimizeFitText( blockElement, blockSelector, applyStylesFn );\n\t}, [ blockElement, clientId, hasFitTextSupport, fitText ] );\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! fitText ||\n\t\t\t! blockElement ||\n\t\t\t! clientId ||\n\t\t\t! hasFitTextSupport\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Store current element value for cleanup\n\t\tconst currentElement = blockElement;\n\t\tconst previousVisibility = currentElement.style.visibility;\n\n\t\t// Store IDs for cleanup\n\t\tlet hideFrameId = null;\n\t\tlet calculateFrameId = null;\n\t\tlet showTimeoutId = null;\n\n\t\t// We are hiding the element doing the calculation of fit text\n\t\t// and then showing it again to avoid the user noticing a flash of potentially\n\t\t// big fitText while the binary search is happening.\n\t\thideFrameId = window.requestAnimationFrame( () => {\n\t\t\tcurrentElement.style.visibility = 'hidden';\n\t\t\t// Wait for browser to render the hidden state\n\t\t\tcalculateFrameId = window.requestAnimationFrame( () => {\n\t\t\t\tapplyFitText();\n\n\t\t\t\t// Using a timeout instead of requestAnimationFrame, because\n\t\t\t\t// with requestAnimationFrame a flash of very high size\n\t\t\t\t// can still occur although rare.\n\t\t\t\tshowTimeoutId = setTimeout( () => {\n\t\t\t\t\tcurrentElement.style.visibility = previousVisibility;\n\t\t\t\t}, 10 );\n\t\t\t} );\n\t\t} );\n\n\t\t// Watch for size changes\n\t\tlet resizeObserver;\n\t\tif ( window.ResizeObserver && currentElement.parentElement ) {\n\t\t\tresizeObserver = new window.ResizeObserver( applyFitText );\n\t\t\tresizeObserver.observe( currentElement.parentElement );\n\t\t}\n\n\t\t// Cleanup function\n\t\treturn () => {\n\t\t\t// Cancel pending async operations\n\t\t\tif ( hideFrameId !== null ) {\n\t\t\t\twindow.cancelAnimationFrame( hideFrameId );\n\t\t\t}\n\t\t\tif ( calculateFrameId !== null ) {\n\t\t\t\twindow.cancelAnimationFrame( calculateFrameId );\n\t\t\t}\n\t\t\tif ( showTimeoutId !== null ) {\n\t\t\t\tclearTimeout( showTimeoutId );\n\t\t\t}\n\n\t\t\tif ( resizeObserver ) {\n\t\t\t\tresizeObserver.disconnect();\n\t\t\t}\n\n\t\t\tconst styleId = `fit-text-${ clientId }`;\n\t\t\tconst styleElement =\n\t\t\t\tcurrentElement.ownerDocument.getElementById( styleId );\n\t\t\tif ( styleElement ) {\n\t\t\t\tstyleElement.remove();\n\t\t\t}\n\t\t};\n\t}, [ fitText, clientId, applyFitText, blockElement, hasFitTextSupport ] );\n\n\t// Trigger fit text recalculation when content changes\n\tuseEffect( () => {\n\t\tif ( fitText && blockElement && hasFitTextSupport ) {\n\t\t\t// Wait for next frame to ensure DOM has updated after content changes\n\t\t\tconst frameId = window.requestAnimationFrame( () => {\n\t\t\t\tif ( blockElement ) {\n\t\t\t\t\tapplyFitText();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn () => window.cancelAnimationFrame( frameId );\n\t\t}\n\t}, [\n\t\tblockAttributes,\n\t\tfitText,\n\t\tapplyFitText,\n\t\tblockElement,\n\t\thasFitTextSupport,\n\t] );\n}\n\n/**\n * Fit text control component for the typography panel.\n *\n * @param {Object} props Component props.\n * @param {string} props.clientId Block client ID.\n * @param {Function} props.setAttributes Function to set block attributes.\n * @param {string} props.name Block name.\n * @param {boolean} props.fitText Whether fit text is enabled.\n * @param {string} props.fontSize Font size slug.\n * @param {Object} props.style Block style object.\n */\nexport function FitTextControl( {\n\tclientId,\n\tfitText = false,\n\tsetAttributes,\n\tname,\n\tfontSize,\n\tstyle,\n} ) {\n\tif ( ! hasBlockSupport( name, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<InspectorControls group=\"typography\">\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => fitText }\n\t\t\t\tlabel={ __( 'Fit text' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { fitText: undefined } ) }\n\t\t\t\tresetAllFilter={ () => ( { fitText: undefined } ) }\n\t\t\t\tpanelId={ clientId }\n\t\t\t>\n\t\t\t\t<ToggleControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Fit text' ) }\n\t\t\t\t\tchecked={ fitText }\n\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\tconst newFitText = ! fitText || undefined;\n\t\t\t\t\t\tconst updates = { fitText: newFitText };\n\n\t\t\t\t\t\t// When enabling fit text, clear font size if it has a value\n\t\t\t\t\t\tif ( newFitText ) {\n\t\t\t\t\t\t\tif ( fontSize ) {\n\t\t\t\t\t\t\t\tupdates.fontSize = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( style?.typography?.fontSize ) {\n\t\t\t\t\t\t\t\tupdates.style = {\n\t\t\t\t\t\t\t\t\t...style,\n\t\t\t\t\t\t\t\t\ttypography: {\n\t\t\t\t\t\t\t\t\t\t...style?.typography,\n\t\t\t\t\t\t\t\t\t\tfontSize: undefined,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetAttributes( updates );\n\t\t\t\t\t} }\n\t\t\t\t\thelp={\n\t\t\t\t\t\tfitText\n\t\t\t\t\t\t\t? __( 'Text will resize to fit its container.' )\n\t\t\t\t\t\t\t: __(\n\t\t\t\t\t\t\t\t\t'The text will resize to fit its container, resetting other font size settings.'\n\t\t\t\t\t\t\t )\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\t\t</InspectorControls>\n\t);\n}\n\n/**\n * Override props applied to the block element on save.\n *\n * @param {Object} props Additional props applied to the block element.\n * @param {Object} blockType Block type.\n * @param {Object} attributes Block attributes.\n * @return {Object} Filtered props applied to the block element.\n */\nfunction addSaveProps( props, blockType, attributes ) {\n\tif ( ! hasBlockSupport( blockType, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn props;\n\t}\n\n\tconst { fitText } = attributes;\n\n\tif ( ! fitText ) {\n\t\treturn props;\n\t}\n\n\t// Add CSS class for frontend detection and styling\n\tconst className = props.className\n\t\t? `${ props.className } has-fit-text`\n\t\t: 'has-fit-text';\n\n\treturn {\n\t\t...props,\n\t\tclassName,\n\t};\n}\n/**\n * Override props applied to the block element in the editor.\n *\n * @param {Object} props Component props including block attributes.\n * @param {string} props.name Block name.\n * @param {boolean} props.fitText Whether fit text is enabled.\n * @param {string} props.clientId Block client ID.\n * @return {Object} Filtered props applied to the block element.\n */\nfunction useBlockProps( { name, fitText, clientId } ) {\n\tuseFitText( { fitText, name, clientId } );\n\tif ( ! fitText || ! hasBlockSupport( name, FIT_TEXT_SUPPORT_KEY ) ) {\n\t\treturn {};\n\t}\n\treturn {\n\t\tclassName: 'has-fit-text',\n\t};\n}\n\naddFilter(\n\t'blocks.registerBlockType',\n\t'core/fit-text/addAttribute',\n\taddAttributes\n);\n\nconst hasFitTextSupport = ( blockNameOrType ) => {\n\treturn hasBlockSupport( blockNameOrType, FIT_TEXT_SUPPORT_KEY );\n};\n\nexport default {\n\tuseBlockProps,\n\taddSaveProps,\n\tattributeKeys: [ 'fitText', 'fontSize', 'style' ],\n\thasSupport: hasFitTextSupport,\n\tedit: FitTextControl,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["hasFitTextSupport"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wordpress/block-editor",
|
|
3
|
-
"version": "15.6.
|
|
3
|
+
"version": "15.6.3",
|
|
4
4
|
"description": "Generic block editor.",
|
|
5
5
|
"author": "The WordPress Contributors",
|
|
6
6
|
"license": "GPL-2.0-or-later",
|
|
@@ -111,5 +111,5 @@
|
|
|
111
111
|
"publishConfig": {
|
|
112
112
|
"access": "public"
|
|
113
113
|
},
|
|
114
|
-
"gitHead": "
|
|
114
|
+
"gitHead": "b54bd3285e50e409580bdfa2c47bc81f0000a0c9"
|
|
115
115
|
}
|
|
@@ -449,7 +449,11 @@ export const BlockBindingsPanel = ( { name: blockName, metadata } ) => {
|
|
|
449
449
|
export default {
|
|
450
450
|
edit: BlockBindingsPanel,
|
|
451
451
|
attributeKeys: [ 'metadata' ],
|
|
452
|
-
hasSupport() {
|
|
453
|
-
return
|
|
452
|
+
hasSupport( name ) {
|
|
453
|
+
return ! [
|
|
454
|
+
'core/post-date',
|
|
455
|
+
'core/navigation-link',
|
|
456
|
+
'core/navigation-submenu',
|
|
457
|
+
].includes( name );
|
|
454
458
|
},
|
|
455
459
|
};
|
package/src/hooks/fit-text.js
CHANGED
|
@@ -107,11 +107,32 @@ function useFitText( { fitText, name, clientId } ) {
|
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
// Apply initially
|
|
111
|
-
applyFitText();
|
|
112
|
-
|
|
113
110
|
// Store current element value for cleanup
|
|
114
111
|
const currentElement = blockElement;
|
|
112
|
+
const previousVisibility = currentElement.style.visibility;
|
|
113
|
+
|
|
114
|
+
// Store IDs for cleanup
|
|
115
|
+
let hideFrameId = null;
|
|
116
|
+
let calculateFrameId = null;
|
|
117
|
+
let showTimeoutId = null;
|
|
118
|
+
|
|
119
|
+
// We are hiding the element doing the calculation of fit text
|
|
120
|
+
// and then showing it again to avoid the user noticing a flash of potentially
|
|
121
|
+
// big fitText while the binary search is happening.
|
|
122
|
+
hideFrameId = window.requestAnimationFrame( () => {
|
|
123
|
+
currentElement.style.visibility = 'hidden';
|
|
124
|
+
// Wait for browser to render the hidden state
|
|
125
|
+
calculateFrameId = window.requestAnimationFrame( () => {
|
|
126
|
+
applyFitText();
|
|
127
|
+
|
|
128
|
+
// Using a timeout instead of requestAnimationFrame, because
|
|
129
|
+
// with requestAnimationFrame a flash of very high size
|
|
130
|
+
// can still occur although rare.
|
|
131
|
+
showTimeoutId = setTimeout( () => {
|
|
132
|
+
currentElement.style.visibility = previousVisibility;
|
|
133
|
+
}, 10 );
|
|
134
|
+
} );
|
|
135
|
+
} );
|
|
115
136
|
|
|
116
137
|
// Watch for size changes
|
|
117
138
|
let resizeObserver;
|
|
@@ -122,6 +143,17 @@ function useFitText( { fitText, name, clientId } ) {
|
|
|
122
143
|
|
|
123
144
|
// Cleanup function
|
|
124
145
|
return () => {
|
|
146
|
+
// Cancel pending async operations
|
|
147
|
+
if ( hideFrameId !== null ) {
|
|
148
|
+
window.cancelAnimationFrame( hideFrameId );
|
|
149
|
+
}
|
|
150
|
+
if ( calculateFrameId !== null ) {
|
|
151
|
+
window.cancelAnimationFrame( calculateFrameId );
|
|
152
|
+
}
|
|
153
|
+
if ( showTimeoutId !== null ) {
|
|
154
|
+
clearTimeout( showTimeoutId );
|
|
155
|
+
}
|
|
156
|
+
|
|
125
157
|
if ( resizeObserver ) {
|
|
126
158
|
resizeObserver.disconnect();
|
|
127
159
|
}
|