@wordpress/block-library 8.12.1 → 8.12.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.
Files changed (44) hide show
  1. package/build/avatar/index.js +1 -1
  2. package/build/buttons/edit.js +5 -1
  3. package/build/buttons/edit.js.map +1 -1
  4. package/build/image/edit.js +0 -4
  5. package/build/image/edit.js.map +1 -1
  6. package/build/image/image.js +96 -43
  7. package/build/image/image.js.map +1 -1
  8. package/build/image/index.js +6 -0
  9. package/build/image/index.js.map +1 -1
  10. package/build/image/save.js +6 -1
  11. package/build/image/save.js.map +1 -1
  12. package/build/image/utils.js +18 -0
  13. package/build/image/utils.js.map +1 -1
  14. package/build/query-pagination-numbers/index.js +1 -1
  15. package/build/site-tagline/icon.js +1 -1
  16. package/build/site-tagline/icon.js.map +1 -1
  17. package/build-module/avatar/index.js +1 -1
  18. package/build-module/buttons/edit.js +5 -1
  19. package/build-module/buttons/edit.js.map +1 -1
  20. package/build-module/image/edit.js +0 -4
  21. package/build-module/image/edit.js.map +1 -1
  22. package/build-module/image/image.js +96 -46
  23. package/build-module/image/image.js.map +1 -1
  24. package/build-module/image/index.js +6 -0
  25. package/build-module/image/index.js.map +1 -1
  26. package/build-module/image/save.js +6 -1
  27. package/build-module/image/save.js.map +1 -1
  28. package/build-module/image/utils.js +16 -0
  29. package/build-module/image/utils.js.map +1 -1
  30. package/build-module/query-pagination-numbers/index.js +1 -1
  31. package/build-module/site-tagline/icon.js +1 -1
  32. package/build-module/site-tagline/icon.js.map +1 -1
  33. package/package.json +8 -8
  34. package/src/avatar/block.json +1 -1
  35. package/src/buttons/edit.js +2 -2
  36. package/src/image/block.json +6 -0
  37. package/src/image/edit.js +0 -4
  38. package/src/image/image.js +130 -62
  39. package/src/image/save.js +7 -1
  40. package/src/image/utils.js +16 -0
  41. package/src/latest-posts/index.php +1 -1
  42. package/src/navigation/index.php +24 -10
  43. package/src/query-pagination-numbers/block.json +1 -1
  44. package/src/site-tagline/icon.js +1 -1
@@ -70,7 +70,7 @@ const metadata = {
70
70
  __experimentalDuotone: "img"
71
71
  }
72
72
  },
73
- editorStyle: "wp-block-avatar",
73
+ editorStyle: "wp-block-avatar-editor",
74
74
  style: "wp-block-avatar"
75
75
  };
76
76
  exports.metadata = metadata;
@@ -38,8 +38,11 @@ function ButtonsEdit({
38
38
  attributes,
39
39
  className
40
40
  }) {
41
+ var _layout$orientation;
42
+
41
43
  const {
42
44
  fontSize,
45
+ layout,
43
46
  style
44
47
  } = attributes;
45
48
  const blockProps = (0, _blockEditor.useBlockProps)({
@@ -59,7 +62,8 @@ function ButtonsEdit({
59
62
  template: [[_button.name, {
60
63
  className: preferredStyle && `is-style-${preferredStyle}`
61
64
  }]],
62
- templateInsertUpdatesSelection: true
65
+ templateInsertUpdatesSelection: true,
66
+ orientation: (_layout$orientation = layout?.orientation) !== null && _layout$orientation !== void 0 ? _layout$orientation : 'horizontal'
63
67
  });
64
68
  return (0, _element.createElement)("div", { ...innerBlocksProps
65
69
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/buttons/edit.js"],"names":["ALLOWED_BLOCKS","buttonBlockName","DEFAULT_BLOCK","name","attributesToCopy","ButtonsEdit","attributes","className","fontSize","style","blockProps","typography","preferredStyle","select","preferredStyleVariations","blockEditorStore","getSettings","__experimentalPreferredStyleVariations","value","innerBlocksProps","allowedBlocks","__experimentalDefaultBlock","__experimentalDirectInsert","template","templateInsertUpdatesSelection"],"mappings":";;;;;;;;;;;AAGA;;AAKA;;AAKA;;AAKA;;AAlBA;AACA;AACA;;AAGA;AACA;AACA;;AAQA;AACA;AACA;AAGA,MAAMA,cAAc,GAAG,CAAEC,YAAF,CAAvB;AAEA,MAAMC,aAAa,GAAG;AACrBC,EAAAA,IAAI,EAAEF,YADe;AAErBG,EAAAA,gBAAgB,EAAE,CACjB,iBADiB,EAEjB,QAFiB,EAGjB,WAHiB,EAIjB,YAJiB,EAKjB,UALiB,EAMjB,UANiB,EAOjB,OAPiB,EAQjB,WARiB,EASjB,OATiB;AAFG,CAAtB;;AAeA,SAASC,WAAT,CAAsB;AAAEC,EAAAA,UAAF;AAAcC,EAAAA;AAAd,CAAtB,EAAkD;AACjD,QAAM;AAAEC,IAAAA,QAAF;AAAYC,IAAAA;AAAZ,MAAsBH,UAA5B;AACA,QAAMI,UAAU,GAAG,gCAAe;AACjCH,IAAAA,SAAS,EAAE,yBAAYA,SAAZ,EAAuB;AACjC,8BAAwBC,QAAQ,IAAIC,KAAK,EAAEE,UAAP,EAAmBH;AADtB,KAAvB;AADsB,GAAf,CAAnB;AAKA,QAAMI,cAAc,GAAG,qBAAaC,MAAF,IAAc;AAC/C,UAAMC,wBAAwB,GAC7BD,MAAM,CAAEE,kBAAF,CAAN,CAA2BC,WAA3B,GACEC,sCAFH;;AAGA,WAAOH,wBAAwB,EAAEI,KAA1B,GAAmCjB,YAAnC,CAAP;AACA,GALsB,EAKpB,EALoB,CAAvB;AAOA,QAAMkB,gBAAgB,GAAG,sCAAqBT,UAArB,EAAiC;AACzDU,IAAAA,aAAa,EAAEpB,cAD0C;AAEzDqB,IAAAA,0BAA0B,EAAEnB,aAF6B;AAGzDoB,IAAAA,0BAA0B,EAAE,IAH6B;AAIzDC,IAAAA,QAAQ,EAAE,CACT,CACCtB,YADD,EAEC;AAAEM,MAAAA,SAAS,EAAEK,cAAc,IAAK,YAAYA,cAAgB;AAA5D,KAFD,CADS,CAJ+C;AAWzDY,IAAAA,8BAA8B,EAAE;AAXyB,GAAjC,CAAzB;AAcA,SAAO,wCAAUL;AAAV,IAAP;AACA;;eAEcd,W","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tuseBlockProps,\n\tuseInnerBlocksProps,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { name as buttonBlockName } from '../button';\n\nconst ALLOWED_BLOCKS = [ buttonBlockName ];\n\nconst DEFAULT_BLOCK = {\n\tname: buttonBlockName,\n\tattributesToCopy: [\n\t\t'backgroundColor',\n\t\t'border',\n\t\t'className',\n\t\t'fontFamily',\n\t\t'fontSize',\n\t\t'gradient',\n\t\t'style',\n\t\t'textColor',\n\t\t'width',\n\t],\n};\n\nfunction ButtonsEdit( { attributes, className } ) {\n\tconst { fontSize, style } = attributes;\n\tconst blockProps = useBlockProps( {\n\t\tclassName: classnames( className, {\n\t\t\t'has-custom-font-size': fontSize || style?.typography?.fontSize,\n\t\t} ),\n\t} );\n\tconst preferredStyle = useSelect( ( select ) => {\n\t\tconst preferredStyleVariations =\n\t\t\tselect( blockEditorStore ).getSettings()\n\t\t\t\t.__experimentalPreferredStyleVariations;\n\t\treturn preferredStyleVariations?.value?.[ buttonBlockName ];\n\t}, [] );\n\n\tconst innerBlocksProps = useInnerBlocksProps( blockProps, {\n\t\tallowedBlocks: ALLOWED_BLOCKS,\n\t\t__experimentalDefaultBlock: DEFAULT_BLOCK,\n\t\t__experimentalDirectInsert: true,\n\t\ttemplate: [\n\t\t\t[\n\t\t\t\tbuttonBlockName,\n\t\t\t\t{ className: preferredStyle && `is-style-${ preferredStyle }` },\n\t\t\t],\n\t\t],\n\n\t\ttemplateInsertUpdatesSelection: true,\n\t} );\n\n\treturn <div { ...innerBlocksProps } />;\n}\n\nexport default ButtonsEdit;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/buttons/edit.js"],"names":["ALLOWED_BLOCKS","buttonBlockName","DEFAULT_BLOCK","name","attributesToCopy","ButtonsEdit","attributes","className","fontSize","layout","style","blockProps","typography","preferredStyle","select","preferredStyleVariations","blockEditorStore","getSettings","__experimentalPreferredStyleVariations","value","innerBlocksProps","allowedBlocks","__experimentalDefaultBlock","__experimentalDirectInsert","template","templateInsertUpdatesSelection","orientation"],"mappings":";;;;;;;;;;;AAGA;;AAKA;;AAKA;;AAKA;;AAlBA;AACA;AACA;;AAGA;AACA;AACA;;AAQA;AACA;AACA;AAGA,MAAMA,cAAc,GAAG,CAAEC,YAAF,CAAvB;AAEA,MAAMC,aAAa,GAAG;AACrBC,EAAAA,IAAI,EAAEF,YADe;AAErBG,EAAAA,gBAAgB,EAAE,CACjB,iBADiB,EAEjB,QAFiB,EAGjB,WAHiB,EAIjB,YAJiB,EAKjB,UALiB,EAMjB,UANiB,EAOjB,OAPiB,EAQjB,WARiB,EASjB,OATiB;AAFG,CAAtB;;AAeA,SAASC,WAAT,CAAsB;AAAEC,EAAAA,UAAF;AAAcC,EAAAA;AAAd,CAAtB,EAAkD;AAAA;;AACjD,QAAM;AAAEC,IAAAA,QAAF;AAAYC,IAAAA,MAAZ;AAAoBC,IAAAA;AAApB,MAA8BJ,UAApC;AACA,QAAMK,UAAU,GAAG,gCAAe;AACjCJ,IAAAA,SAAS,EAAE,yBAAYA,SAAZ,EAAuB;AACjC,8BAAwBC,QAAQ,IAAIE,KAAK,EAAEE,UAAP,EAAmBJ;AADtB,KAAvB;AADsB,GAAf,CAAnB;AAKA,QAAMK,cAAc,GAAG,qBAAaC,MAAF,IAAc;AAC/C,UAAMC,wBAAwB,GAC7BD,MAAM,CAAEE,kBAAF,CAAN,CAA2BC,WAA3B,GACEC,sCAFH;;AAGA,WAAOH,wBAAwB,EAAEI,KAA1B,GAAmClB,YAAnC,CAAP;AACA,GALsB,EAKpB,EALoB,CAAvB;AAOA,QAAMmB,gBAAgB,GAAG,sCAAqBT,UAArB,EAAiC;AACzDU,IAAAA,aAAa,EAAErB,cAD0C;AAEzDsB,IAAAA,0BAA0B,EAAEpB,aAF6B;AAGzDqB,IAAAA,0BAA0B,EAAE,IAH6B;AAIzDC,IAAAA,QAAQ,EAAE,CACT,CACCvB,YADD,EAEC;AAAEM,MAAAA,SAAS,EAAEM,cAAc,IAAK,YAAYA,cAAgB;AAA5D,KAFD,CADS,CAJ+C;AAUzDY,IAAAA,8BAA8B,EAAE,IAVyB;AAWzDC,IAAAA,WAAW,yBAAEjB,MAAM,EAAEiB,WAAV,qEAAyB;AAXqB,GAAjC,CAAzB;AAcA,SAAO,wCAAUN;AAAV,IAAP;AACA;;eAEcf,W","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tuseBlockProps,\n\tuseInnerBlocksProps,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { name as buttonBlockName } from '../button';\n\nconst ALLOWED_BLOCKS = [ buttonBlockName ];\n\nconst DEFAULT_BLOCK = {\n\tname: buttonBlockName,\n\tattributesToCopy: [\n\t\t'backgroundColor',\n\t\t'border',\n\t\t'className',\n\t\t'fontFamily',\n\t\t'fontSize',\n\t\t'gradient',\n\t\t'style',\n\t\t'textColor',\n\t\t'width',\n\t],\n};\n\nfunction ButtonsEdit( { attributes, className } ) {\n\tconst { fontSize, layout, style } = attributes;\n\tconst blockProps = useBlockProps( {\n\t\tclassName: classnames( className, {\n\t\t\t'has-custom-font-size': fontSize || style?.typography?.fontSize,\n\t\t} ),\n\t} );\n\tconst preferredStyle = useSelect( ( select ) => {\n\t\tconst preferredStyleVariations =\n\t\t\tselect( blockEditorStore ).getSettings()\n\t\t\t\t.__experimentalPreferredStyleVariations;\n\t\treturn preferredStyleVariations?.value?.[ buttonBlockName ];\n\t}, [] );\n\n\tconst innerBlocksProps = useInnerBlocksProps( blockProps, {\n\t\tallowedBlocks: ALLOWED_BLOCKS,\n\t\t__experimentalDefaultBlock: DEFAULT_BLOCK,\n\t\t__experimentalDirectInsert: true,\n\t\ttemplate: [\n\t\t\t[\n\t\t\t\tbuttonBlockName,\n\t\t\t\t{ className: preferredStyle && `is-style-${ preferredStyle }` },\n\t\t\t],\n\t\t],\n\t\ttemplateInsertUpdatesSelection: true,\n\t\torientation: layout?.orientation ?? 'horizontal',\n\t} );\n\n\treturn <div { ...innerBlocksProps } />;\n}\n\nexport default ButtonsEdit;\n"]}
@@ -194,8 +194,6 @@ function ImageEdit({
194
194
 
195
195
  if (!media.id || media.id !== id) {
196
196
  additionalAttributes = {
197
- width: undefined,
198
- height: undefined,
199
197
  // Fallback to size "full" if there's no default image size.
200
198
  // It means the image is smaller, and the block will use a full-size URL.
201
199
  sizeSlug: hasDefaultSize(media, imageDefaultSize) ? imageDefaultSize : 'full'
@@ -261,8 +259,6 @@ function ImageEdit({
261
259
  setAttributes({
262
260
  url: newURL,
263
261
  id: undefined,
264
- width: undefined,
265
- height: undefined,
266
262
  sizeSlug: imageDefaultSize
267
263
  });
268
264
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/image/edit.js"],"names":["useBlockEditingMode","blockEditorPrivateApis","pickRelevantMediaFiles","image","size","imageProps","Object","fromEntries","entries","filter","key","includes","url","sizes","media_details","source_url","isTemporaryImage","id","isExternalImage","hasDefaultSize","defaultSize","ImageEdit","attributes","setAttributes","isSelected","className","insertBlocksAfter","onReplace","context","clientId","alt","caption","align","width","height","sizeSlug","temporaryURL","setTemporaryURL","altRef","current","captionRef","ref","imageDefaultSize","mediaUpload","select","getSettings","blockEditorStore","settings","blockEditingMode","createErrorNotice","noticesStore","onUploadError","message","type","src","undefined","onSelectImage","media","title","mediaAttributes","omittedCaption","restMediaAttributes","additionalAttributes","linkDestination","window","wp","view","defaultProps","link","LINK_DESTINATION_NONE","LINK_DESTINATION_MEDIA","LINK_DESTINATION_ATTACHMENT","LINK_DESTINATION_CUSTOM","href","onSelectURL","newURL","updateAlignment","nextAlign","extraUpdatedAttributes","isTemp","file","filesList","onFileChange","img","allowedTypes","ALLOWED_MEDIA_TYPES","onError","isExternal","mediaPreview","borderProps","classes","style","keys","length","blockProps","placeholder","content","icon"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { getBlobByURL, isBlobURL, revokeBlobURL } from '@wordpress/blob';\nimport { Placeholder } from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport {\n\tBlockAlignmentControl,\n\tBlockControls,\n\tBlockIcon,\n\tMediaPlaceholder,\n\tuseBlockProps,\n\tstore as blockEditorStore,\n\t__experimentalUseBorderProps as useBorderProps,\n\tprivateApis as blockEditorPrivateApis,\n} from '@wordpress/block-editor';\nimport { useEffect, useRef, useState } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { image as icon } from '@wordpress/icons';\nimport { store as noticesStore } from '@wordpress/notices';\n\n/**\n * Internal dependencies\n */\nimport Image from './image';\nimport { unlock } from '../lock-unlock';\n\n/**\n * Module constants\n */\nimport {\n\tLINK_DESTINATION_ATTACHMENT,\n\tLINK_DESTINATION_CUSTOM,\n\tLINK_DESTINATION_MEDIA,\n\tLINK_DESTINATION_NONE,\n\tALLOWED_MEDIA_TYPES,\n} from './constants';\n\nconst { useBlockEditingMode } = unlock( blockEditorPrivateApis );\n\nexport const pickRelevantMediaFiles = ( image, size ) => {\n\tconst imageProps = Object.fromEntries(\n\t\tObject.entries( image ?? {} ).filter( ( [ key ] ) =>\n\t\t\t[ 'alt', 'id', 'link', 'caption' ].includes( key )\n\t\t)\n\t);\n\n\timageProps.url =\n\t\timage?.sizes?.[ size ]?.url ||\n\t\timage?.media_details?.sizes?.[ size ]?.source_url ||\n\t\timage.url;\n\treturn imageProps;\n};\n\n/**\n * Is the URL a temporary blob URL? A blob URL is one that is used temporarily\n * while the image is being uploaded and will not have an id yet allocated.\n *\n * @param {number=} id The id of the image.\n * @param {string=} url The url of the image.\n *\n * @return {boolean} Is the URL a Blob URL\n */\nconst isTemporaryImage = ( id, url ) => ! id && isBlobURL( url );\n\n/**\n * Is the url for the image hosted externally. An externally hosted image has no\n * id and is not a blob url.\n *\n * @param {number=} id The id of the image.\n * @param {string=} url The url of the image.\n *\n * @return {boolean} Is the url an externally hosted url?\n */\nexport const isExternalImage = ( id, url ) => url && ! id && ! isBlobURL( url );\n\n/**\n * Checks if WP generated default image size. Size generation is skipped\n * when the image is smaller than the said size.\n *\n * @param {Object} image\n * @param {string} defaultSize\n *\n * @return {boolean} Whether or not it has default image size.\n */\nfunction hasDefaultSize( image, defaultSize ) {\n\treturn (\n\t\t'url' in ( image?.sizes?.[ defaultSize ] ?? {} ) ||\n\t\t'source_url' in ( image?.media_details?.sizes?.[ defaultSize ] ?? {} )\n\t);\n}\n\nexport function ImageEdit( {\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tclassName,\n\tinsertBlocksAfter,\n\tonReplace,\n\tcontext,\n\tclientId,\n} ) {\n\tconst {\n\t\turl = '',\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\tid,\n\t\twidth,\n\t\theight,\n\t\tsizeSlug,\n\t} = attributes;\n\tconst [ temporaryURL, setTemporaryURL ] = useState();\n\n\tconst altRef = useRef();\n\tuseEffect( () => {\n\t\taltRef.current = alt;\n\t}, [ alt ] );\n\n\tconst captionRef = useRef();\n\tuseEffect( () => {\n\t\tcaptionRef.current = caption;\n\t}, [ caption ] );\n\n\tconst ref = useRef();\n\tconst { imageDefaultSize, mediaUpload } = useSelect( ( select ) => {\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\tconst settings = getSettings();\n\t\treturn {\n\t\t\timageDefaultSize: settings.imageDefaultSize,\n\t\t\tmediaUpload: settings.mediaUpload,\n\t\t};\n\t}, [] );\n\tconst blockEditingMode = useBlockEditingMode();\n\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\tfunction onUploadError( message ) {\n\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t\tsetAttributes( {\n\t\t\tsrc: undefined,\n\t\t\tid: undefined,\n\t\t\turl: undefined,\n\t\t} );\n\t\tsetTemporaryURL( undefined );\n\t}\n\n\tfunction onSelectImage( media ) {\n\t\tif ( ! media || ! media.url ) {\n\t\t\tsetAttributes( {\n\t\t\t\turl: undefined,\n\t\t\t\talt: undefined,\n\t\t\t\tid: undefined,\n\t\t\t\ttitle: undefined,\n\t\t\t\tcaption: undefined,\n\t\t\t} );\n\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isBlobURL( media.url ) ) {\n\t\t\tsetTemporaryURL( media.url );\n\t\t\treturn;\n\t\t}\n\n\t\tsetTemporaryURL();\n\n\t\tlet mediaAttributes = pickRelevantMediaFiles( media, imageDefaultSize );\n\n\t\t// If a caption text was meanwhile written by the user,\n\t\t// make sure the text is not overwritten by empty captions.\n\t\tif ( captionRef.current && ! mediaAttributes.caption ) {\n\t\t\tconst { caption: omittedCaption, ...restMediaAttributes } =\n\t\t\t\tmediaAttributes;\n\t\t\tmediaAttributes = restMediaAttributes;\n\t\t}\n\n\t\tlet additionalAttributes;\n\t\t// Reset the dimension attributes if changing to a different image.\n\t\tif ( ! media.id || media.id !== id ) {\n\t\t\tadditionalAttributes = {\n\t\t\t\twidth: undefined,\n\t\t\t\theight: undefined,\n\t\t\t\t// Fallback to size \"full\" if there's no default image size.\n\t\t\t\t// It means the image is smaller, and the block will use a full-size URL.\n\t\t\t\tsizeSlug: hasDefaultSize( media, imageDefaultSize )\n\t\t\t\t\t? imageDefaultSize\n\t\t\t\t\t: 'full',\n\t\t\t};\n\t\t} else {\n\t\t\t// Keep the same url when selecting the same file, so \"Resolution\"\n\t\t\t// option is not changed.\n\t\t\tadditionalAttributes = { url };\n\t\t}\n\n\t\t// Check if default link setting should be used.\n\t\tlet linkDestination = attributes.linkDestination;\n\t\tif ( ! linkDestination ) {\n\t\t\t// Use the WordPress option to determine the proper default.\n\t\t\t// The constants used in Gutenberg do not match WP options so a little more complicated than ideal.\n\t\t\t// TODO: fix this in a follow up PR, requires updating media-text and ui component.\n\t\t\tswitch (\n\t\t\t\twindow?.wp?.media?.view?.settings?.defaultProps?.link ||\n\t\t\t\tLINK_DESTINATION_NONE\n\t\t\t) {\n\t\t\t\tcase 'file':\n\t\t\t\tcase LINK_DESTINATION_MEDIA:\n\t\t\t\t\tlinkDestination = LINK_DESTINATION_MEDIA;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'post':\n\t\t\t\tcase LINK_DESTINATION_ATTACHMENT:\n\t\t\t\t\tlinkDestination = LINK_DESTINATION_ATTACHMENT;\n\t\t\t\t\tbreak;\n\t\t\t\tcase LINK_DESTINATION_CUSTOM:\n\t\t\t\t\tlinkDestination = LINK_DESTINATION_CUSTOM;\n\t\t\t\t\tbreak;\n\t\t\t\tcase LINK_DESTINATION_NONE:\n\t\t\t\t\tlinkDestination = LINK_DESTINATION_NONE;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Check if the image is linked to it's media.\n\t\tlet href;\n\t\tswitch ( linkDestination ) {\n\t\t\tcase LINK_DESTINATION_MEDIA:\n\t\t\t\thref = media.url;\n\t\t\t\tbreak;\n\t\t\tcase LINK_DESTINATION_ATTACHMENT:\n\t\t\t\thref = media.link;\n\t\t\t\tbreak;\n\t\t}\n\t\tmediaAttributes.href = href;\n\n\t\tsetAttributes( {\n\t\t\t...mediaAttributes,\n\t\t\t...additionalAttributes,\n\t\t\tlinkDestination,\n\t\t} );\n\t}\n\n\tfunction onSelectURL( newURL ) {\n\t\tif ( newURL !== url ) {\n\t\t\tsetAttributes( {\n\t\t\t\turl: newURL,\n\t\t\t\tid: undefined,\n\t\t\t\twidth: undefined,\n\t\t\t\theight: undefined,\n\t\t\t\tsizeSlug: imageDefaultSize,\n\t\t\t} );\n\t\t}\n\t}\n\n\tfunction updateAlignment( nextAlign ) {\n\t\tconst extraUpdatedAttributes = [ 'wide', 'full' ].includes( nextAlign )\n\t\t\t? { width: undefined, height: undefined }\n\t\t\t: {};\n\t\tsetAttributes( {\n\t\t\t...extraUpdatedAttributes,\n\t\t\talign: nextAlign,\n\t\t} );\n\t}\n\n\tlet isTemp = isTemporaryImage( id, url );\n\n\t// Upload a temporary image on mount.\n\tuseEffect( () => {\n\t\tif ( ! isTemp ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst file = getBlobByURL( url );\n\n\t\tif ( file ) {\n\t\t\tmediaUpload( {\n\t\t\t\tfilesList: [ file ],\n\t\t\t\tonFileChange: ( [ img ] ) => {\n\t\t\t\t\tonSelectImage( img );\n\t\t\t\t},\n\t\t\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\t\t\tonError: ( message ) => {\n\t\t\t\t\tisTemp = false;\n\t\t\t\t\tonUploadError( message );\n\t\t\t\t},\n\t\t\t} );\n\t\t}\n\t}, [] );\n\n\t// If an image is temporary, revoke the Blob url when it is uploaded (and is\n\t// no longer temporary).\n\tuseEffect( () => {\n\t\tif ( isTemp ) {\n\t\t\tsetTemporaryURL( url );\n\t\t\treturn;\n\t\t}\n\t\trevokeBlobURL( temporaryURL );\n\t}, [ isTemp, url ] );\n\n\tconst isExternal = isExternalImage( id, url );\n\tconst src = isExternal ? url : undefined;\n\tconst mediaPreview = !! url && (\n\t\t<img\n\t\t\talt={ __( 'Edit image' ) }\n\t\t\ttitle={ __( 'Edit image' ) }\n\t\t\tclassName={ 'edit-image-preview' }\n\t\t\tsrc={ url }\n\t\t/>\n\t);\n\n\tconst borderProps = useBorderProps( attributes );\n\n\tconst classes = classnames( className, {\n\t\t'is-transient': temporaryURL,\n\t\t'is-resized': !! width || !! height,\n\t\t[ `size-${ sizeSlug }` ]: sizeSlug,\n\t\t'has-custom-border':\n\t\t\t!! borderProps.className ||\n\t\t\t( borderProps.style &&\n\t\t\t\tObject.keys( borderProps.style ).length > 0 ),\n\t} );\n\n\tconst blockProps = useBlockProps( {\n\t\tref,\n\t\tclassName: classes,\n\t} );\n\n\t// Much of this description is duplicated from MediaPlaceholder.\n\tconst placeholder = ( content ) => {\n\t\treturn (\n\t\t\t<Placeholder\n\t\t\t\tclassName={ classnames( 'block-editor-media-placeholder', {\n\t\t\t\t\t[ borderProps.className ]:\n\t\t\t\t\t\t!! borderProps.className && ! isSelected,\n\t\t\t\t} ) }\n\t\t\t\twithIllustration={ true }\n\t\t\t\ticon={ icon }\n\t\t\t\tlabel={ __( 'Image' ) }\n\t\t\t\tinstructions={ __(\n\t\t\t\t\t'Upload an image file, pick one from your media library, or add one with a URL.'\n\t\t\t\t) }\n\t\t\t\tstyle={ isSelected ? undefined : borderProps.style }\n\t\t\t>\n\t\t\t\t{ content }\n\t\t\t</Placeholder>\n\t\t);\n\t};\n\n\treturn (\n\t\t<figure { ...blockProps }>\n\t\t\t{ ( temporaryURL || url ) && (\n\t\t\t\t<Image\n\t\t\t\t\ttemporaryURL={ temporaryURL }\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\tinsertBlocksAfter={ insertBlocksAfter }\n\t\t\t\t\tonReplace={ onReplace }\n\t\t\t\t\tonSelectImage={ onSelectImage }\n\t\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\t\tonUploadError={ onUploadError }\n\t\t\t\t\tcontainerRef={ ref }\n\t\t\t\t\tcontext={ context }\n\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\tblockEditingMode={ blockEditingMode }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! url && blockEditingMode === 'default' && (\n\t\t\t\t<BlockControls group=\"block\">\n\t\t\t\t\t<BlockAlignmentControl\n\t\t\t\t\t\tvalue={ align }\n\t\t\t\t\t\tonChange={ updateAlignment }\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t<MediaPlaceholder\n\t\t\t\ticon={ <BlockIcon icon={ icon } /> }\n\t\t\t\tonSelect={ onSelectImage }\n\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\tonError={ onUploadError }\n\t\t\t\tplaceholder={ placeholder }\n\t\t\t\taccept=\"image/*\"\n\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\tvalue={ { id, src } }\n\t\t\t\tmediaPreview={ mediaPreview }\n\t\t\t\tdisableMediaButtons={ temporaryURL || url }\n\t\t\t/>\n\t\t</figure>\n\t);\n}\n\nexport default ImageEdit;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/image/edit.js"],"names":["useBlockEditingMode","blockEditorPrivateApis","pickRelevantMediaFiles","image","size","imageProps","Object","fromEntries","entries","filter","key","includes","url","sizes","media_details","source_url","isTemporaryImage","id","isExternalImage","hasDefaultSize","defaultSize","ImageEdit","attributes","setAttributes","isSelected","className","insertBlocksAfter","onReplace","context","clientId","alt","caption","align","width","height","sizeSlug","temporaryURL","setTemporaryURL","altRef","current","captionRef","ref","imageDefaultSize","mediaUpload","select","getSettings","blockEditorStore","settings","blockEditingMode","createErrorNotice","noticesStore","onUploadError","message","type","src","undefined","onSelectImage","media","title","mediaAttributes","omittedCaption","restMediaAttributes","additionalAttributes","linkDestination","window","wp","view","defaultProps","link","LINK_DESTINATION_NONE","LINK_DESTINATION_MEDIA","LINK_DESTINATION_ATTACHMENT","LINK_DESTINATION_CUSTOM","href","onSelectURL","newURL","updateAlignment","nextAlign","extraUpdatedAttributes","isTemp","file","filesList","onFileChange","img","allowedTypes","ALLOWED_MEDIA_TYPES","onError","isExternal","mediaPreview","borderProps","classes","style","keys","length","blockProps","placeholder","content","icon"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { getBlobByURL, isBlobURL, revokeBlobURL } from '@wordpress/blob';\nimport { Placeholder } from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport {\n\tBlockAlignmentControl,\n\tBlockControls,\n\tBlockIcon,\n\tMediaPlaceholder,\n\tuseBlockProps,\n\tstore as blockEditorStore,\n\t__experimentalUseBorderProps as useBorderProps,\n\tprivateApis as blockEditorPrivateApis,\n} from '@wordpress/block-editor';\nimport { useEffect, useRef, useState } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { image as icon } from '@wordpress/icons';\nimport { store as noticesStore } from '@wordpress/notices';\n\n/**\n * Internal dependencies\n */\nimport Image from './image';\nimport { unlock } from '../lock-unlock';\n\n/**\n * Module constants\n */\nimport {\n\tLINK_DESTINATION_ATTACHMENT,\n\tLINK_DESTINATION_CUSTOM,\n\tLINK_DESTINATION_MEDIA,\n\tLINK_DESTINATION_NONE,\n\tALLOWED_MEDIA_TYPES,\n} from './constants';\n\nconst { useBlockEditingMode } = unlock( blockEditorPrivateApis );\n\nexport const pickRelevantMediaFiles = ( image, size ) => {\n\tconst imageProps = Object.fromEntries(\n\t\tObject.entries( image ?? {} ).filter( ( [ key ] ) =>\n\t\t\t[ 'alt', 'id', 'link', 'caption' ].includes( key )\n\t\t)\n\t);\n\n\timageProps.url =\n\t\timage?.sizes?.[ size ]?.url ||\n\t\timage?.media_details?.sizes?.[ size ]?.source_url ||\n\t\timage.url;\n\treturn imageProps;\n};\n\n/**\n * Is the URL a temporary blob URL? A blob URL is one that is used temporarily\n * while the image is being uploaded and will not have an id yet allocated.\n *\n * @param {number=} id The id of the image.\n * @param {string=} url The url of the image.\n *\n * @return {boolean} Is the URL a Blob URL\n */\nconst isTemporaryImage = ( id, url ) => ! id && isBlobURL( url );\n\n/**\n * Is the url for the image hosted externally. An externally hosted image has no\n * id and is not a blob url.\n *\n * @param {number=} id The id of the image.\n * @param {string=} url The url of the image.\n *\n * @return {boolean} Is the url an externally hosted url?\n */\nexport const isExternalImage = ( id, url ) => url && ! id && ! isBlobURL( url );\n\n/**\n * Checks if WP generated default image size. Size generation is skipped\n * when the image is smaller than the said size.\n *\n * @param {Object} image\n * @param {string} defaultSize\n *\n * @return {boolean} Whether or not it has default image size.\n */\nfunction hasDefaultSize( image, defaultSize ) {\n\treturn (\n\t\t'url' in ( image?.sizes?.[ defaultSize ] ?? {} ) ||\n\t\t'source_url' in ( image?.media_details?.sizes?.[ defaultSize ] ?? {} )\n\t);\n}\n\nexport function ImageEdit( {\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tclassName,\n\tinsertBlocksAfter,\n\tonReplace,\n\tcontext,\n\tclientId,\n} ) {\n\tconst {\n\t\turl = '',\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\tid,\n\t\twidth,\n\t\theight,\n\t\tsizeSlug,\n\t} = attributes;\n\tconst [ temporaryURL, setTemporaryURL ] = useState();\n\n\tconst altRef = useRef();\n\tuseEffect( () => {\n\t\taltRef.current = alt;\n\t}, [ alt ] );\n\n\tconst captionRef = useRef();\n\tuseEffect( () => {\n\t\tcaptionRef.current = caption;\n\t}, [ caption ] );\n\n\tconst ref = useRef();\n\tconst { imageDefaultSize, mediaUpload } = useSelect( ( select ) => {\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\tconst settings = getSettings();\n\t\treturn {\n\t\t\timageDefaultSize: settings.imageDefaultSize,\n\t\t\tmediaUpload: settings.mediaUpload,\n\t\t};\n\t}, [] );\n\tconst blockEditingMode = useBlockEditingMode();\n\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\tfunction onUploadError( message ) {\n\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t\tsetAttributes( {\n\t\t\tsrc: undefined,\n\t\t\tid: undefined,\n\t\t\turl: undefined,\n\t\t} );\n\t\tsetTemporaryURL( undefined );\n\t}\n\n\tfunction onSelectImage( media ) {\n\t\tif ( ! media || ! media.url ) {\n\t\t\tsetAttributes( {\n\t\t\t\turl: undefined,\n\t\t\t\talt: undefined,\n\t\t\t\tid: undefined,\n\t\t\t\ttitle: undefined,\n\t\t\t\tcaption: undefined,\n\t\t\t} );\n\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isBlobURL( media.url ) ) {\n\t\t\tsetTemporaryURL( media.url );\n\t\t\treturn;\n\t\t}\n\n\t\tsetTemporaryURL();\n\n\t\tlet mediaAttributes = pickRelevantMediaFiles( media, imageDefaultSize );\n\n\t\t// If a caption text was meanwhile written by the user,\n\t\t// make sure the text is not overwritten by empty captions.\n\t\tif ( captionRef.current && ! mediaAttributes.caption ) {\n\t\t\tconst { caption: omittedCaption, ...restMediaAttributes } =\n\t\t\t\tmediaAttributes;\n\t\t\tmediaAttributes = restMediaAttributes;\n\t\t}\n\n\t\tlet additionalAttributes;\n\t\t// Reset the dimension attributes if changing to a different image.\n\t\tif ( ! media.id || media.id !== id ) {\n\t\t\tadditionalAttributes = {\n\t\t\t\t// Fallback to size \"full\" if there's no default image size.\n\t\t\t\t// It means the image is smaller, and the block will use a full-size URL.\n\t\t\t\tsizeSlug: hasDefaultSize( media, imageDefaultSize )\n\t\t\t\t\t? imageDefaultSize\n\t\t\t\t\t: 'full',\n\t\t\t};\n\t\t} else {\n\t\t\t// Keep the same url when selecting the same file, so \"Resolution\"\n\t\t\t// option is not changed.\n\t\t\tadditionalAttributes = { url };\n\t\t}\n\n\t\t// Check if default link setting should be used.\n\t\tlet linkDestination = attributes.linkDestination;\n\t\tif ( ! linkDestination ) {\n\t\t\t// Use the WordPress option to determine the proper default.\n\t\t\t// The constants used in Gutenberg do not match WP options so a little more complicated than ideal.\n\t\t\t// TODO: fix this in a follow up PR, requires updating media-text and ui component.\n\t\t\tswitch (\n\t\t\t\twindow?.wp?.media?.view?.settings?.defaultProps?.link ||\n\t\t\t\tLINK_DESTINATION_NONE\n\t\t\t) {\n\t\t\t\tcase 'file':\n\t\t\t\tcase LINK_DESTINATION_MEDIA:\n\t\t\t\t\tlinkDestination = LINK_DESTINATION_MEDIA;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'post':\n\t\t\t\tcase LINK_DESTINATION_ATTACHMENT:\n\t\t\t\t\tlinkDestination = LINK_DESTINATION_ATTACHMENT;\n\t\t\t\t\tbreak;\n\t\t\t\tcase LINK_DESTINATION_CUSTOM:\n\t\t\t\t\tlinkDestination = LINK_DESTINATION_CUSTOM;\n\t\t\t\t\tbreak;\n\t\t\t\tcase LINK_DESTINATION_NONE:\n\t\t\t\t\tlinkDestination = LINK_DESTINATION_NONE;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Check if the image is linked to it's media.\n\t\tlet href;\n\t\tswitch ( linkDestination ) {\n\t\t\tcase LINK_DESTINATION_MEDIA:\n\t\t\t\thref = media.url;\n\t\t\t\tbreak;\n\t\t\tcase LINK_DESTINATION_ATTACHMENT:\n\t\t\t\thref = media.link;\n\t\t\t\tbreak;\n\t\t}\n\t\tmediaAttributes.href = href;\n\n\t\tsetAttributes( {\n\t\t\t...mediaAttributes,\n\t\t\t...additionalAttributes,\n\t\t\tlinkDestination,\n\t\t} );\n\t}\n\n\tfunction onSelectURL( newURL ) {\n\t\tif ( newURL !== url ) {\n\t\t\tsetAttributes( {\n\t\t\t\turl: newURL,\n\t\t\t\tid: undefined,\n\t\t\t\tsizeSlug: imageDefaultSize,\n\t\t\t} );\n\t\t}\n\t}\n\n\tfunction updateAlignment( nextAlign ) {\n\t\tconst extraUpdatedAttributes = [ 'wide', 'full' ].includes( nextAlign )\n\t\t\t? { width: undefined, height: undefined }\n\t\t\t: {};\n\t\tsetAttributes( {\n\t\t\t...extraUpdatedAttributes,\n\t\t\talign: nextAlign,\n\t\t} );\n\t}\n\n\tlet isTemp = isTemporaryImage( id, url );\n\n\t// Upload a temporary image on mount.\n\tuseEffect( () => {\n\t\tif ( ! isTemp ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst file = getBlobByURL( url );\n\n\t\tif ( file ) {\n\t\t\tmediaUpload( {\n\t\t\t\tfilesList: [ file ],\n\t\t\t\tonFileChange: ( [ img ] ) => {\n\t\t\t\t\tonSelectImage( img );\n\t\t\t\t},\n\t\t\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\t\t\tonError: ( message ) => {\n\t\t\t\t\tisTemp = false;\n\t\t\t\t\tonUploadError( message );\n\t\t\t\t},\n\t\t\t} );\n\t\t}\n\t}, [] );\n\n\t// If an image is temporary, revoke the Blob url when it is uploaded (and is\n\t// no longer temporary).\n\tuseEffect( () => {\n\t\tif ( isTemp ) {\n\t\t\tsetTemporaryURL( url );\n\t\t\treturn;\n\t\t}\n\t\trevokeBlobURL( temporaryURL );\n\t}, [ isTemp, url ] );\n\n\tconst isExternal = isExternalImage( id, url );\n\tconst src = isExternal ? url : undefined;\n\tconst mediaPreview = !! url && (\n\t\t<img\n\t\t\talt={ __( 'Edit image' ) }\n\t\t\ttitle={ __( 'Edit image' ) }\n\t\t\tclassName={ 'edit-image-preview' }\n\t\t\tsrc={ url }\n\t\t/>\n\t);\n\n\tconst borderProps = useBorderProps( attributes );\n\n\tconst classes = classnames( className, {\n\t\t'is-transient': temporaryURL,\n\t\t'is-resized': !! width || !! height,\n\t\t[ `size-${ sizeSlug }` ]: sizeSlug,\n\t\t'has-custom-border':\n\t\t\t!! borderProps.className ||\n\t\t\t( borderProps.style &&\n\t\t\t\tObject.keys( borderProps.style ).length > 0 ),\n\t} );\n\n\tconst blockProps = useBlockProps( {\n\t\tref,\n\t\tclassName: classes,\n\t} );\n\n\t// Much of this description is duplicated from MediaPlaceholder.\n\tconst placeholder = ( content ) => {\n\t\treturn (\n\t\t\t<Placeholder\n\t\t\t\tclassName={ classnames( 'block-editor-media-placeholder', {\n\t\t\t\t\t[ borderProps.className ]:\n\t\t\t\t\t\t!! borderProps.className && ! isSelected,\n\t\t\t\t} ) }\n\t\t\t\twithIllustration={ true }\n\t\t\t\ticon={ icon }\n\t\t\t\tlabel={ __( 'Image' ) }\n\t\t\t\tinstructions={ __(\n\t\t\t\t\t'Upload an image file, pick one from your media library, or add one with a URL.'\n\t\t\t\t) }\n\t\t\t\tstyle={ isSelected ? undefined : borderProps.style }\n\t\t\t>\n\t\t\t\t{ content }\n\t\t\t</Placeholder>\n\t\t);\n\t};\n\n\treturn (\n\t\t<figure { ...blockProps }>\n\t\t\t{ ( temporaryURL || url ) && (\n\t\t\t\t<Image\n\t\t\t\t\ttemporaryURL={ temporaryURL }\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\tinsertBlocksAfter={ insertBlocksAfter }\n\t\t\t\t\tonReplace={ onReplace }\n\t\t\t\t\tonSelectImage={ onSelectImage }\n\t\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\t\tonUploadError={ onUploadError }\n\t\t\t\t\tcontainerRef={ ref }\n\t\t\t\t\tcontext={ context }\n\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\tblockEditingMode={ blockEditingMode }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! url && blockEditingMode === 'default' && (\n\t\t\t\t<BlockControls group=\"block\">\n\t\t\t\t\t<BlockAlignmentControl\n\t\t\t\t\t\tvalue={ align }\n\t\t\t\t\t\tonChange={ updateAlignment }\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t<MediaPlaceholder\n\t\t\t\ticon={ <BlockIcon icon={ icon } /> }\n\t\t\t\tonSelect={ onSelectImage }\n\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\tonError={ onUploadError }\n\t\t\t\tplaceholder={ placeholder }\n\t\t\t\taccept=\"image/*\"\n\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\tvalue={ { id, src } }\n\t\t\t\tmediaPreview={ mediaPreview }\n\t\t\t\tdisableMediaButtons={ temporaryURL || url }\n\t\t\t/>\n\t\t</figure>\n\t);\n}\n\nexport default ImageEdit;\n"]}
@@ -31,6 +31,8 @@ var _notices = require("@wordpress/notices");
31
31
 
32
32
  var _coreData = require("@wordpress/core-data");
33
33
 
34
+ var _lockUnlock = require("../lock-unlock");
35
+
34
36
  var _util = require("../embed/util");
35
37
 
36
38
  var _useClientWidth = _interopRequireDefault(require("./use-client-width"));
@@ -39,6 +41,8 @@ var _edit = require("./edit");
39
41
 
40
42
  var _constants = require("./constants");
41
43
 
44
+ var _utils = require("./utils");
45
+
42
46
  /**
43
47
  * WordPress dependencies
44
48
  */
@@ -50,6 +54,20 @@ var _constants = require("./constants");
50
54
  /**
51
55
  * Module constants
52
56
  */
57
+ const {
58
+ DimensionsTool,
59
+ ResolutionTool
60
+ } = (0, _lockUnlock.unlock)(_blockEditor.privateApis);
61
+ const scaleOptions = [{
62
+ value: 'cover',
63
+ label: (0, _i18n._x)('Cover', 'Scale option for dimensions control'),
64
+ help: (0, _i18n.__)('Image covers the space evenly.')
65
+ }, {
66
+ value: 'contain',
67
+ label: (0, _i18n._x)('Contain', 'Scale option for dimensions control'),
68
+ help: (0, _i18n.__)('Image is contained without distortion.')
69
+ }];
70
+
53
71
  function Image({
54
72
  temporaryURL,
55
73
  attributes,
@@ -78,6 +96,8 @@ function Image({
78
96
  title,
79
97
  width,
80
98
  height,
99
+ aspectRatio,
100
+ scale,
81
101
  linkTarget,
82
102
  sizeSlug
83
103
  } = attributes;
@@ -250,8 +270,6 @@ function Image({
250
270
 
251
271
  setAttributes({
252
272
  url: newUrl,
253
- width: undefined,
254
- height: undefined,
255
273
  sizeSlug: newSizeSlug
256
274
  });
257
275
  }
@@ -308,8 +326,14 @@ function Image({
308
326
 
309
327
  function switchToCover() {
310
328
  replaceBlocks(clientId, (0, _blocks.switchToBlockType)(getBlock(clientId), 'core/cover'));
311
- }
329
+ } // TODO: Can allow more units after figuring out how they should interact
330
+ // with the ResizableBox and ImageEditor components. Calculations later on
331
+ // for those components are currently assuming px units.
332
+
312
333
 
334
+ const dimensionsUnitsOptions = (0, _components.__experimentalUseCustomUnits)({
335
+ availableUnits: ['px']
336
+ });
313
337
  const controls = (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_blockEditor.BlockControls, {
314
338
  group: "block"
315
339
  }, hasNonContentControls && (0, _element.createElement)(_blockEditor.BlockAlignmentControl, {
@@ -359,27 +383,55 @@ function Image({
359
383
  onClick: uploadExternal,
360
384
  icon: _icons.upload,
361
385
  label: (0, _i18n.__)('Upload external image')
362
- }))), (0, _element.createElement)(_blockEditor.InspectorControls, null, (0, _element.createElement)(_components.PanelBody, {
363
- title: (0, _i18n.__)('Settings')
364
- }, !multiImageSelection && (0, _element.createElement)(_components.TextareaControl, {
365
- __nextHasNoMarginBottom: true,
386
+ }))), (0, _element.createElement)(_blockEditor.InspectorControls, null, (0, _element.createElement)(_components.__experimentalToolsPanel, {
387
+ label: (0, _i18n.__)('Settings'),
388
+ resetAll: () => setAttributes({
389
+ width: undefined,
390
+ height: undefined,
391
+ scale: undefined,
392
+ aspectRatio: undefined
393
+ })
394
+ }, !multiImageSelection && (0, _element.createElement)(_components.__experimentalToolsPanelItem, {
395
+ label: (0, _i18n.__)('Alternative text'),
396
+ isShownByDefault: true,
397
+ hasValue: () => alt !== '',
398
+ onDeselect: () => setAttributes({
399
+ alt: undefined
400
+ })
401
+ }, (0, _element.createElement)(_components.TextareaControl, {
366
402
  label: (0, _i18n.__)('Alternative text'),
367
403
  value: alt,
368
404
  onChange: updateAlt,
369
405
  help: (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_components.ExternalLink, {
370
406
  href: "https://www.w3.org/WAI/tutorials/images/decision-tree"
371
- }, (0, _i18n.__)('Describe the purpose of the image.')), (0, _element.createElement)("br", null), (0, _i18n.__)('Leave empty if decorative.'))
372
- }), (0, _element.createElement)(_blockEditor.__experimentalImageSizeControl, {
373
- onChangeImage: updateImage,
374
- onChange: value => setAttributes(value),
375
- slug: sizeSlug,
376
- width: width,
377
- height: height,
378
- imageSizeOptions: imageSizeOptions,
379
- isResizable: isResizable,
380
- imageWidth: naturalWidth,
381
- imageHeight: naturalHeight,
382
- imageSizeHelp: (0, _i18n.__)('Select the size of the source image.')
407
+ }, (0, _i18n.__)('Describe the purpose of the image.')), (0, _element.createElement)("br", null), (0, _i18n.__)('Leave empty if decorative.')),
408
+ __nextHasNoMarginBottom: true
409
+ })), (0, _element.createElement)(DimensionsTool, {
410
+ value: {
411
+ width: width && `${width}px`,
412
+ height: height && `${height}px`,
413
+ scale,
414
+ aspectRatio
415
+ },
416
+ onChange: newValue => {
417
+ // Rebuilding the object forces setting `undefined`
418
+ // for values that are removed since setAttributes
419
+ // doesn't do anything with keys that aren't set.
420
+ setAttributes({
421
+ width: newValue.width && parseInt(newValue.width, 10),
422
+ height: newValue.height && parseInt(newValue.height, 10),
423
+ scale: newValue.scale,
424
+ aspectRatio: newValue.aspectRatio
425
+ });
426
+ },
427
+ defaultScale: "cover",
428
+ defaultAspectRatio: "auto",
429
+ scaleOptions: scaleOptions,
430
+ unitsOptions: dimensionsUnitsOptions
431
+ }), (0, _element.createElement)(ResolutionTool, {
432
+ value: sizeSlug,
433
+ onChange: updateImage,
434
+ options: imageSizeOptions
383
435
  }))), (0, _element.createElement)(_blockEditor.InspectorControls, {
384
436
  group: "advanced"
385
437
  }, (0, _element.createElement)(_components.TextControl, {
@@ -406,7 +458,6 @@ function Image({
406
458
 
407
459
  const borderProps = (0, _blockEditor.__experimentalUseBorderProps)(attributes);
408
460
  const isRounded = attributes.className?.includes('is-style-rounded');
409
- const hasCustomBorder = !!borderProps.className || borderProps.style && Object.keys(borderProps.style).length > 0;
410
461
  let img = // Disable reason: Image itself is not meant to be interactive, but
411
462
  // should direct focus to block.
412
463
 
@@ -423,22 +474,17 @@ function Image({
423
474
  },
424
475
  ref: imageRef,
425
476
  className: borderProps.className,
426
- style: borderProps.style
477
+ style: {
478
+ width: width && height || aspectRatio ? '100%' : 'inherit',
479
+ height: width && height || aspectRatio ? '100%' : 'inherit',
480
+ objectFit: scale,
481
+ ...borderProps.style
482
+ }
427
483
  }), temporaryURL && (0, _element.createElement)(_components.Spinner, null))
428
484
  /* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
429
- ;
430
- let imageWidthWithinContainer;
431
- let imageHeightWithinContainer;
432
-
433
- if (clientWidth && naturalWidth && naturalHeight) {
434
- const exceedMaxWidth = naturalWidth > clientWidth;
435
- const ratio = naturalHeight / naturalWidth;
436
- imageWidthWithinContainer = exceedMaxWidth ? clientWidth : naturalWidth;
437
- imageHeightWithinContainer = exceedMaxWidth ? clientWidth * ratio : naturalHeight;
438
- } // clientWidth needs to be a number for the image Cropper to work, but sometimes it's 0
485
+ ; // clientWidth needs to be a number for the image Cropper to work, but sometimes it's 0
439
486
  // So we try using the imageRef width first and fallback to clientWidth.
440
487
 
441
-
442
488
  const fallbackClientWidth = imageRef.current?.width || clientWidth;
443
489
 
444
490
  if (canEditImage && isEditingImage) {
@@ -456,17 +502,18 @@ function Image({
456
502
  },
457
503
  borderProps: isRounded ? undefined : borderProps
458
504
  });
459
- } else if (!isResizable || !imageWidthWithinContainer) {
505
+ } else if (!isResizable) {
460
506
  img = (0, _element.createElement)("div", {
461
507
  style: {
462
508
  width,
463
- height
509
+ height,
510
+ aspectRatio
464
511
  }
465
512
  }, img);
466
513
  } else {
467
- const currentWidth = width || imageWidthWithinContainer;
468
- const currentHeight = height || imageHeightWithinContainer;
469
- const ratio = naturalWidth / naturalHeight;
514
+ const ratio = aspectRatio && (0, _utils.evalAspectRatio)(aspectRatio) || width && height && width / height || naturalWidth / naturalHeight;
515
+ const currentWidth = !width && height ? height * ratio : width;
516
+ const currentHeight = !height && width ? width / ratio : height;
470
517
  const minWidth = naturalWidth < naturalHeight ? _constants.MIN_SIZE : _constants.MIN_SIZE * ratio;
471
518
  const minHeight = naturalHeight < naturalWidth ? _constants.MIN_SIZE : _constants.MIN_SIZE / ratio; // With the current implementation of ResizableBox, an image needs an
472
519
  // explicit pixel value for the max-width. In absence of being able to
@@ -510,16 +557,21 @@ function Image({
510
557
 
511
558
 
512
559
  img = (0, _element.createElement)(_components.ResizableBox, {
560
+ style: {
561
+ display: 'block',
562
+ objectFit: scale,
563
+ aspectRatio: !width && !height && aspectRatio ? aspectRatio : undefined
564
+ },
513
565
  size: {
514
- width: width !== null && width !== void 0 ? width : 'auto',
515
- height: height && !hasCustomBorder ? height : 'auto'
566
+ width: currentWidth !== null && currentWidth !== void 0 ? currentWidth : 'auto',
567
+ height: currentHeight !== null && currentHeight !== void 0 ? currentHeight : 'auto'
516
568
  },
517
569
  showHandle: isSelected,
518
570
  minWidth: minWidth,
519
571
  maxWidth: maxWidthBuffer,
520
572
  minHeight: minHeight,
521
573
  maxHeight: maxWidthBuffer / ratio,
522
- lockAspectRatio: true,
574
+ lockAspectRatio: ratio,
523
575
  enable: {
524
576
  top: false,
525
577
  right: showRightHandle,
@@ -527,11 +579,12 @@ function Image({
527
579
  left: showLeftHandle
528
580
  },
529
581
  onResizeStart: onResizeStart,
530
- onResizeStop: (event, direction, elt, delta) => {
582
+ onResizeStop: (event, direction, elt) => {
531
583
  onResizeStop();
532
584
  setAttributes({
533
- width: parseInt(currentWidth + delta.width, 10),
534
- height: parseInt(currentHeight + delta.height, 10)
585
+ width: elt.offsetWidth,
586
+ height: elt.offsetHeight,
587
+ aspectRatio: undefined
535
588
  });
536
589
  },
537
590
  resizeRatio: align === 'center' ? 2 : 1
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/image/image.js"],"names":["Image","temporaryURL","attributes","setAttributes","isSelected","insertBlocksAfter","onReplace","onSelectImage","onSelectURL","onUploadError","containerRef","context","clientId","blockEditingMode","url","alt","caption","align","id","href","rel","linkClass","linkDestination","title","width","height","linkTarget","sizeSlug","imageRef","prevCaption","showCaption","setShowCaption","allowResize","getBlock","blockEditorStore","image","multiImageSelection","select","getMedia","coreStore","getMultiSelectedBlockClientIds","getBlockName","multiSelectedClientIds","length","every","_clientId","canInsertCover","imageEditing","imageSizes","maxWidth","mediaUpload","getBlockRootClientId","getSettings","canInsertBlockType","rootClientId","settings","replaceBlocks","toggleSelection","createErrorNotice","createSuccessNotice","noticesStore","isLargeViewport","isWideAligned","includes","loadedNaturalWidth","loadedNaturalHeight","setLoadedNaturalSize","isEditingImage","setIsEditingImage","externalBlob","setExternalBlob","clientWidth","hasNonContentControls","isResizable","imageSizeOptions","filter","slug","media_details","sizes","source_url","map","name","value","label","canUploadMedia","window","fetch","then","response","blob","catch","captionRef","node","focus","naturalWidth","naturalHeight","current","undefined","complete","onResizeStart","onResizeStop","onImageError","embedBlock","onSetHref","props","onSetTitle","updateAlt","newAlt","updateImage","newSizeSlug","newUrl","uploadExternal","filesList","onFileChange","img","type","allowedTypes","ALLOWED_MEDIA_TYPES","onError","message","updateAlignment","nextAlign","extraUpdatedAttributes","canEditImage","allowCrop","switchToCover","controls","captionIcon","link","crop","overlayText","upload","filename","defaultedAlt","borderProps","isRounded","className","hasCustomBorder","style","Object","keys","event","target","imageWidthWithinContainer","imageHeightWithinContainer","exceedMaxWidth","ratio","fallbackClientWidth","imageAttributes","currentWidth","currentHeight","minWidth","MIN_SIZE","minHeight","maxWidthBuffer","showRightHandle","showLeftHandle","top","right","bottom","left","direction","elt","delta","parseInt","RichText","isEmpty"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { isBlobURL } from '@wordpress/blob';\nimport {\n\tExternalLink,\n\tPanelBody,\n\tResizableBox,\n\tSpinner,\n\tTextareaControl,\n\tTextControl,\n\tToolbarButton,\n\tToolbarGroup,\n} from '@wordpress/components';\nimport { useViewportMatch, usePrevious } from '@wordpress/compose';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport {\n\tBlockControls,\n\tInspectorControls,\n\tRichText,\n\t__experimentalImageSizeControl as ImageSizeControl,\n\t__experimentalImageURLInputUI as ImageURLInputUI,\n\tMediaReplaceFlow,\n\tstore as blockEditorStore,\n\tBlockAlignmentControl,\n\t__experimentalImageEditor as ImageEditor,\n\t__experimentalGetElementClassName,\n\t__experimentalUseBorderProps as useBorderProps,\n} from '@wordpress/block-editor';\nimport {\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseRef,\n\tuseCallback,\n} from '@wordpress/element';\nimport { __, sprintf, isRTL } from '@wordpress/i18n';\nimport { getFilename } from '@wordpress/url';\nimport {\n\tcreateBlock,\n\tgetDefaultBlockName,\n\tswitchToBlockType,\n} from '@wordpress/blocks';\nimport {\n\tcrop,\n\toverlayText,\n\tupload,\n\tcaption as captionIcon,\n} from '@wordpress/icons';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { createUpgradedEmbedBlock } from '../embed/util';\nimport useClientWidth from './use-client-width';\nimport { isExternalImage } from './edit';\n\n/**\n * Module constants\n */\nimport { MIN_SIZE, ALLOWED_MEDIA_TYPES } from './constants';\n\nexport default function Image( {\n\ttemporaryURL,\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tinsertBlocksAfter,\n\tonReplace,\n\tonSelectImage,\n\tonSelectURL,\n\tonUploadError,\n\tcontainerRef,\n\tcontext,\n\tclientId,\n\tblockEditingMode,\n} ) {\n\tconst {\n\t\turl = '',\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\tid,\n\t\thref,\n\t\trel,\n\t\tlinkClass,\n\t\tlinkDestination,\n\t\ttitle,\n\t\twidth,\n\t\theight,\n\t\tlinkTarget,\n\t\tsizeSlug,\n\t} = attributes;\n\tconst imageRef = useRef();\n\tconst prevCaption = usePrevious( caption );\n\tconst [ showCaption, setShowCaption ] = useState( !! caption );\n\tconst { allowResize = true } = context;\n\tconst { getBlock } = useSelect( blockEditorStore );\n\n\tconst { image, multiImageSelection } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getMedia } = select( coreStore );\n\t\t\tconst { getMultiSelectedBlockClientIds, getBlockName } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst multiSelectedClientIds = getMultiSelectedBlockClientIds();\n\t\t\treturn {\n\t\t\t\timage:\n\t\t\t\t\tid && isSelected\n\t\t\t\t\t\t? getMedia( id, { context: 'view' } )\n\t\t\t\t\t\t: null,\n\t\t\t\tmultiImageSelection:\n\t\t\t\t\tmultiSelectedClientIds.length &&\n\t\t\t\t\tmultiSelectedClientIds.every(\n\t\t\t\t\t\t( _clientId ) =>\n\t\t\t\t\t\t\tgetBlockName( _clientId ) === 'core/image'\n\t\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ id, isSelected ]\n\t);\n\tconst { canInsertCover, imageEditing, imageSizes, maxWidth, mediaUpload } =\n\t\tuseSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst {\n\t\t\t\t\tgetBlockRootClientId,\n\t\t\t\t\tgetSettings,\n\t\t\t\t\tcanInsertBlockType,\n\t\t\t\t} = select( blockEditorStore );\n\n\t\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\t\t\t\tconst settings = getSettings();\n\n\t\t\t\treturn {\n\t\t\t\t\timageEditing: settings.imageEditing,\n\t\t\t\t\timageSizes: settings.imageSizes,\n\t\t\t\t\tmaxWidth: settings.maxWidth,\n\t\t\t\t\tmediaUpload: settings.mediaUpload,\n\t\t\t\t\tcanInsertCover: canInsertBlockType(\n\t\t\t\t\t\t'core/cover',\n\t\t\t\t\t\trootClientId\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\tconst { replaceBlocks, toggleSelection } = useDispatch( blockEditorStore );\n\tconst { createErrorNotice, createSuccessNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst isLargeViewport = useViewportMatch( 'medium' );\n\tconst isWideAligned = [ 'wide', 'full' ].includes( align );\n\tconst [\n\t\t{ loadedNaturalWidth, loadedNaturalHeight },\n\t\tsetLoadedNaturalSize,\n\t] = useState( {} );\n\tconst [ isEditingImage, setIsEditingImage ] = useState( false );\n\tconst [ externalBlob, setExternalBlob ] = useState();\n\tconst clientWidth = useClientWidth( containerRef, [ align ] );\n\tconst hasNonContentControls = blockEditingMode === 'default';\n\tconst isResizable =\n\t\tallowResize &&\n\t\thasNonContentControls &&\n\t\t! ( isWideAligned && isLargeViewport );\n\tconst imageSizeOptions = imageSizes\n\t\t.filter(\n\t\t\t( { slug } ) => image?.media_details?.sizes?.[ slug ]?.source_url\n\t\t)\n\t\t.map( ( { name, slug } ) => ( { value: slug, label: name } ) );\n\tconst canUploadMedia = !! mediaUpload;\n\n\t// If an image is externally hosted, try to fetch the image data. This may\n\t// fail if the image host doesn't allow CORS with the domain. If it works,\n\t// we can enable a button in the toolbar to upload the image.\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! isExternalImage( id, url ) ||\n\t\t\t! isSelected ||\n\t\t\t! canUploadMedia\n\t\t) {\n\t\t\tsetExternalBlob();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( externalBlob ) return;\n\n\t\twindow\n\t\t\t// Avoid cache, which seems to help avoid CORS problems.\n\t\t\t.fetch( url.includes( '?' ) ? url : url + '?' )\n\t\t\t.then( ( response ) => response.blob() )\n\t\t\t.then( ( blob ) => setExternalBlob( blob ) )\n\t\t\t// Do nothing, cannot upload.\n\t\t\t.catch( () => {} );\n\t}, [ id, url, isSelected, externalBlob, canUploadMedia ] );\n\n\t// We need to show the caption when changes come from\n\t// history navigation(undo/redo).\n\tuseEffect( () => {\n\t\tif ( caption && ! prevCaption ) {\n\t\t\tsetShowCaption( true );\n\t\t}\n\t}, [ caption, prevCaption ] );\n\n\t// Focus the caption when we click to add one.\n\tconst captionRef = useCallback(\n\t\t( node ) => {\n\t\t\tif ( node && ! caption ) {\n\t\t\t\tnode.focus();\n\t\t\t}\n\t\t},\n\t\t[ caption ]\n\t);\n\n\t// Get naturalWidth and naturalHeight from image ref, and fall back to loaded natural\n\t// width and height. This resolves an issue in Safari where the loaded natural\n\t// width and height is otherwise lost when switching between alignments.\n\t// See: https://github.com/WordPress/gutenberg/pull/37210.\n\tconst { naturalWidth, naturalHeight } = useMemo( () => {\n\t\treturn {\n\t\t\tnaturalWidth:\n\t\t\t\timageRef.current?.naturalWidth ||\n\t\t\t\tloadedNaturalWidth ||\n\t\t\t\tundefined,\n\t\t\tnaturalHeight:\n\t\t\t\timageRef.current?.naturalHeight ||\n\t\t\t\tloadedNaturalHeight ||\n\t\t\t\tundefined,\n\t\t};\n\t}, [\n\t\tloadedNaturalWidth,\n\t\tloadedNaturalHeight,\n\t\timageRef.current?.complete,\n\t] );\n\n\tfunction onResizeStart() {\n\t\ttoggleSelection( false );\n\t}\n\n\tfunction onResizeStop() {\n\t\ttoggleSelection( true );\n\t}\n\n\tfunction onImageError() {\n\t\t// Check if there's an embed block that handles this URL, e.g., instagram URL.\n\t\t// See: https://github.com/WordPress/gutenberg/pull/11472\n\t\tconst embedBlock = createUpgradedEmbedBlock( { attributes: { url } } );\n\n\t\tif ( undefined !== embedBlock ) {\n\t\t\tonReplace( embedBlock );\n\t\t}\n\t}\n\n\tfunction onSetHref( props ) {\n\t\tsetAttributes( props );\n\t}\n\n\tfunction onSetTitle( value ) {\n\t\t// This is the HTML title attribute, separate from the media object\n\t\t// title.\n\t\tsetAttributes( { title: value } );\n\t}\n\n\tfunction updateAlt( newAlt ) {\n\t\tsetAttributes( { alt: newAlt } );\n\t}\n\n\tfunction updateImage( newSizeSlug ) {\n\t\tconst newUrl = image?.media_details?.sizes?.[ newSizeSlug ]?.source_url;\n\t\tif ( ! newUrl ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tsetAttributes( {\n\t\t\turl: newUrl,\n\t\t\twidth: undefined,\n\t\t\theight: undefined,\n\t\t\tsizeSlug: newSizeSlug,\n\t\t} );\n\t}\n\n\tfunction uploadExternal() {\n\t\tmediaUpload( {\n\t\t\tfilesList: [ externalBlob ],\n\t\t\tonFileChange( [ img ] ) {\n\t\t\t\tonSelectImage( img );\n\n\t\t\t\tif ( isBlobURL( img.url ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetExternalBlob();\n\t\t\t\tcreateSuccessNotice( __( 'Image uploaded.' ), {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t} );\n\t\t\t},\n\t\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\t\tonError( message ) {\n\t\t\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t\t\t},\n\t\t} );\n\t}\n\n\tfunction updateAlignment( nextAlign ) {\n\t\tconst extraUpdatedAttributes = [ 'wide', 'full' ].includes( nextAlign )\n\t\t\t? { width: undefined, height: undefined }\n\t\t\t: {};\n\t\tsetAttributes( {\n\t\t\t...extraUpdatedAttributes,\n\t\t\talign: nextAlign,\n\t\t} );\n\t}\n\n\tuseEffect( () => {\n\t\tif ( ! isSelected ) {\n\t\t\tsetIsEditingImage( false );\n\t\t\tif ( ! caption ) {\n\t\t\t\tsetShowCaption( false );\n\t\t\t}\n\t\t}\n\t}, [ isSelected, caption ] );\n\n\tconst canEditImage = id && naturalWidth && naturalHeight && imageEditing;\n\tconst allowCrop = ! multiImageSelection && canEditImage && ! isEditingImage;\n\n\tfunction switchToCover() {\n\t\treplaceBlocks(\n\t\t\tclientId,\n\t\t\tswitchToBlockType( getBlock( clientId ), 'core/cover' )\n\t\t);\n\t}\n\n\tconst controls = (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<BlockAlignmentControl\n\t\t\t\t\t\tvalue={ align }\n\t\t\t\t\t\tonChange={ updateAlignment }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tsetShowCaption( ! showCaption );\n\t\t\t\t\t\t\tif ( showCaption && caption ) {\n\t\t\t\t\t\t\t\tsetAttributes( { caption: undefined } );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} }\n\t\t\t\t\t\ticon={ captionIcon }\n\t\t\t\t\t\tisPressed={ showCaption }\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\tshowCaption\n\t\t\t\t\t\t\t\t? __( 'Remove caption' )\n\t\t\t\t\t\t\t\t: __( 'Add caption' )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t\t<ImageURLInputUI\n\t\t\t\t\t\turl={ href || '' }\n\t\t\t\t\t\tonChangeUrl={ onSetHref }\n\t\t\t\t\t\tlinkDestination={ linkDestination }\n\t\t\t\t\t\tmediaUrl={ ( image && image.source_url ) || url }\n\t\t\t\t\t\tmediaLink={ image && image.link }\n\t\t\t\t\t\tlinkTarget={ linkTarget }\n\t\t\t\t\t\tlinkClass={ linkClass }\n\t\t\t\t\t\trel={ rel }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ allowCrop && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => setIsEditingImage( true ) }\n\t\t\t\t\t\ticon={ crop }\n\t\t\t\t\t\tlabel={ __( 'Crop' ) }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && canInsertCover && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\ticon={ overlayText }\n\t\t\t\t\t\tlabel={ __( 'Add text over image' ) }\n\t\t\t\t\t\tonClick={ switchToCover }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</BlockControls>\n\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t<BlockControls group=\"other\">\n\t\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\t\tmediaId={ id }\n\t\t\t\t\t\tmediaURL={ url }\n\t\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\t\tonSelect={ onSelectImage }\n\t\t\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ ! multiImageSelection && externalBlob && (\n\t\t\t\t<BlockControls>\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\tonClick={ uploadExternal }\n\t\t\t\t\t\t\ticon={ upload }\n\t\t\t\t\t\t\tlabel={ __( 'Upload external image' ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t<InspectorControls>\n\t\t\t\t<PanelBody title={ __( 'Settings' ) }>\n\t\t\t\t\t{ ! multiImageSelection && (\n\t\t\t\t\t\t<TextareaControl\n\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\tvalue={ alt }\n\t\t\t\t\t\t\tonChange={ updateAlt }\n\t\t\t\t\t\t\thelp={\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/WAI/tutorials/images/decision-tree\">\n\t\t\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t\t\t'Describe the purpose of the image.'\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t{ __( 'Leave empty if decorative.' ) }\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) }\n\t\t\t\t\t<ImageSizeControl\n\t\t\t\t\t\tonChangeImage={ updateImage }\n\t\t\t\t\t\tonChange={ ( value ) => setAttributes( value ) }\n\t\t\t\t\t\tslug={ sizeSlug }\n\t\t\t\t\t\twidth={ width }\n\t\t\t\t\t\theight={ height }\n\t\t\t\t\t\timageSizeOptions={ imageSizeOptions }\n\t\t\t\t\t\tisResizable={ isResizable }\n\t\t\t\t\t\timageWidth={ naturalWidth }\n\t\t\t\t\t\timageHeight={ naturalHeight }\n\t\t\t\t\t\timageSizeHelp={ __(\n\t\t\t\t\t\t\t'Select the size of the source image.'\n\t\t\t\t\t\t) }\n\t\t\t\t\t/>\n\t\t\t\t</PanelBody>\n\t\t\t</InspectorControls>\n\t\t\t<InspectorControls group=\"advanced\">\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Title attribute' ) }\n\t\t\t\t\tvalue={ title || '' }\n\t\t\t\t\tonChange={ onSetTitle }\n\t\t\t\t\thelp={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Describe the role of this image on the page.'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/TR/html52/dom.html#the-title-attribute\">\n\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t'(Note: many devices and browsers do not display this text.)'\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</InspectorControls>\n\t\t</>\n\t);\n\n\tconst filename = getFilename( url );\n\tlet defaultedAlt;\n\n\tif ( alt ) {\n\t\tdefaultedAlt = alt;\n\t} else if ( filename ) {\n\t\tdefaultedAlt = sprintf(\n\t\t\t/* translators: %s: file name */\n\t\t\t__( 'This image has an empty alt attribute; its file name is %s' ),\n\t\t\tfilename\n\t\t);\n\t} else {\n\t\tdefaultedAlt = __( 'This image has an empty alt attribute' );\n\t}\n\n\tconst borderProps = useBorderProps( attributes );\n\tconst isRounded = attributes.className?.includes( 'is-style-rounded' );\n\tconst hasCustomBorder =\n\t\t!! borderProps.className ||\n\t\t( borderProps.style && Object.keys( borderProps.style ).length > 0 );\n\n\tlet img = (\n\t\t// Disable reason: Image itself is not meant to be interactive, but\n\t\t// should direct focus to block.\n\t\t/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t\t<>\n\t\t\t<img\n\t\t\t\tsrc={ temporaryURL || url }\n\t\t\t\talt={ defaultedAlt }\n\t\t\t\tonError={ () => onImageError() }\n\t\t\t\tonLoad={ ( event ) => {\n\t\t\t\t\tsetLoadedNaturalSize( {\n\t\t\t\t\t\tloadedNaturalWidth: event.target?.naturalWidth,\n\t\t\t\t\t\tloadedNaturalHeight: event.target?.naturalHeight,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tref={ imageRef }\n\t\t\t\tclassName={ borderProps.className }\n\t\t\t\tstyle={ borderProps.style }\n\t\t\t/>\n\t\t\t{ temporaryURL && <Spinner /> }\n\t\t</>\n\t\t/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t);\n\n\tlet imageWidthWithinContainer;\n\tlet imageHeightWithinContainer;\n\n\tif ( clientWidth && naturalWidth && naturalHeight ) {\n\t\tconst exceedMaxWidth = naturalWidth > clientWidth;\n\t\tconst ratio = naturalHeight / naturalWidth;\n\t\timageWidthWithinContainer = exceedMaxWidth ? clientWidth : naturalWidth;\n\t\timageHeightWithinContainer = exceedMaxWidth\n\t\t\t? clientWidth * ratio\n\t\t\t: naturalHeight;\n\t}\n\n\t// clientWidth needs to be a number for the image Cropper to work, but sometimes it's 0\n\t// So we try using the imageRef width first and fallback to clientWidth.\n\tconst fallbackClientWidth = imageRef.current?.width || clientWidth;\n\n\tif ( canEditImage && isEditingImage ) {\n\t\timg = (\n\t\t\t<ImageEditor\n\t\t\t\tid={ id }\n\t\t\t\turl={ url }\n\t\t\t\twidth={ width }\n\t\t\t\theight={ height }\n\t\t\t\tclientWidth={ fallbackClientWidth }\n\t\t\t\tnaturalHeight={ naturalHeight }\n\t\t\t\tnaturalWidth={ naturalWidth }\n\t\t\t\tonSaveImage={ ( imageAttributes ) =>\n\t\t\t\t\tsetAttributes( imageAttributes )\n\t\t\t\t}\n\t\t\t\tonFinishEditing={ () => {\n\t\t\t\t\tsetIsEditingImage( false );\n\t\t\t\t} }\n\t\t\t\tborderProps={ isRounded ? undefined : borderProps }\n\t\t\t/>\n\t\t);\n\t} else if ( ! isResizable || ! imageWidthWithinContainer ) {\n\t\timg = <div style={ { width, height } }>{ img }</div>;\n\t} else {\n\t\tconst currentWidth = width || imageWidthWithinContainer;\n\t\tconst currentHeight = height || imageHeightWithinContainer;\n\n\t\tconst ratio = naturalWidth / naturalHeight;\n\t\tconst minWidth =\n\t\t\tnaturalWidth < naturalHeight ? MIN_SIZE : MIN_SIZE * ratio;\n\t\tconst minHeight =\n\t\t\tnaturalHeight < naturalWidth ? MIN_SIZE : MIN_SIZE / ratio;\n\n\t\t// With the current implementation of ResizableBox, an image needs an\n\t\t// explicit pixel value for the max-width. In absence of being able to\n\t\t// set the content-width, this max-width is currently dictated by the\n\t\t// vanilla editor style. The following variable adds a buffer to this\n\t\t// vanilla style, so 3rd party themes have some wiggleroom. This does,\n\t\t// in most cases, allow you to scale the image beyond the width of the\n\t\t// main column, though not infinitely.\n\t\t// @todo It would be good to revisit this once a content-width variable\n\t\t// becomes available.\n\t\tconst maxWidthBuffer = maxWidth * 2.5;\n\n\t\tlet showRightHandle = false;\n\t\tlet showLeftHandle = false;\n\n\t\t/* eslint-disable no-lonely-if */\n\t\t// See https://github.com/WordPress/gutenberg/issues/7584.\n\t\tif ( align === 'center' ) {\n\t\t\t// When the image is centered, show both handles.\n\t\t\tshowRightHandle = true;\n\t\t\tshowLeftHandle = true;\n\t\t} else if ( isRTL() ) {\n\t\t\t// In RTL mode the image is on the right by default.\n\t\t\t// Show the right handle and hide the left handle only when it is\n\t\t\t// aligned left. Otherwise always show the left handle.\n\t\t\tif ( align === 'left' ) {\n\t\t\t\tshowRightHandle = true;\n\t\t\t} else {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// Show the left handle and hide the right handle only when the\n\t\t\t// image is aligned right. Otherwise always show the right handle.\n\t\t\tif ( align === 'right' ) {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t} else {\n\t\t\t\tshowRightHandle = true;\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-lonely-if */\n\n\t\timg = (\n\t\t\t<ResizableBox\n\t\t\t\tsize={ {\n\t\t\t\t\twidth: width ?? 'auto',\n\t\t\t\t\theight: height && ! hasCustomBorder ? height : 'auto',\n\t\t\t\t} }\n\t\t\t\tshowHandle={ isSelected }\n\t\t\t\tminWidth={ minWidth }\n\t\t\t\tmaxWidth={ maxWidthBuffer }\n\t\t\t\tminHeight={ minHeight }\n\t\t\t\tmaxHeight={ maxWidthBuffer / ratio }\n\t\t\t\tlockAspectRatio\n\t\t\t\tenable={ {\n\t\t\t\t\ttop: false,\n\t\t\t\t\tright: showRightHandle,\n\t\t\t\t\tbottom: true,\n\t\t\t\t\tleft: showLeftHandle,\n\t\t\t\t} }\n\t\t\t\tonResizeStart={ onResizeStart }\n\t\t\t\tonResizeStop={ ( event, direction, elt, delta ) => {\n\t\t\t\t\tonResizeStop();\n\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\twidth: parseInt( currentWidth + delta.width, 10 ),\n\t\t\t\t\t\theight: parseInt( currentHeight + delta.height, 10 ),\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tresizeRatio={ align === 'center' ? 2 : 1 }\n\t\t\t>\n\t\t\t\t{ img }\n\t\t\t</ResizableBox>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ /* Hide controls during upload to avoid component remount,\n\t\t\t\twhich causes duplicated image upload. */ }\n\t\t\t{ ! temporaryURL && controls }\n\t\t\t{ img }\n\t\t\t{ showCaption &&\n\t\t\t\t( ! RichText.isEmpty( caption ) || isSelected ) && (\n\t\t\t\t\t<RichText\n\t\t\t\t\t\tidentifier=\"caption\"\n\t\t\t\t\t\tclassName={ __experimentalGetElementClassName(\n\t\t\t\t\t\t\t'caption'\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tref={ captionRef }\n\t\t\t\t\t\ttagName=\"figcaption\"\n\t\t\t\t\t\taria-label={ __( 'Image caption text' ) }\n\t\t\t\t\t\tplaceholder={ __( 'Add caption' ) }\n\t\t\t\t\t\tvalue={ caption }\n\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\tsetAttributes( { caption: value } )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinlineToolbar\n\t\t\t\t\t\t__unstableOnSplitAtEnd={ () =>\n\t\t\t\t\t\t\tinsertBlocksAfter(\n\t\t\t\t\t\t\t\tcreateBlock( getDefaultBlockName() )\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) }\n\t\t</>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/image/image.js"],"names":["DimensionsTool","ResolutionTool","blockEditorPrivateApis","scaleOptions","value","label","help","Image","temporaryURL","attributes","setAttributes","isSelected","insertBlocksAfter","onReplace","onSelectImage","onSelectURL","onUploadError","containerRef","context","clientId","blockEditingMode","url","alt","caption","align","id","href","rel","linkClass","linkDestination","title","width","height","aspectRatio","scale","linkTarget","sizeSlug","imageRef","prevCaption","showCaption","setShowCaption","allowResize","getBlock","blockEditorStore","image","multiImageSelection","select","getMedia","coreStore","getMultiSelectedBlockClientIds","getBlockName","multiSelectedClientIds","length","every","_clientId","canInsertCover","imageEditing","imageSizes","maxWidth","mediaUpload","getBlockRootClientId","getSettings","canInsertBlockType","rootClientId","settings","replaceBlocks","toggleSelection","createErrorNotice","createSuccessNotice","noticesStore","isLargeViewport","isWideAligned","includes","loadedNaturalWidth","loadedNaturalHeight","setLoadedNaturalSize","isEditingImage","setIsEditingImage","externalBlob","setExternalBlob","clientWidth","hasNonContentControls","isResizable","imageSizeOptions","filter","slug","media_details","sizes","source_url","map","name","canUploadMedia","window","fetch","then","response","blob","catch","captionRef","node","focus","naturalWidth","naturalHeight","current","undefined","complete","onResizeStart","onResizeStop","onImageError","embedBlock","onSetHref","props","onSetTitle","updateAlt","newAlt","updateImage","newSizeSlug","newUrl","uploadExternal","filesList","onFileChange","img","type","allowedTypes","ALLOWED_MEDIA_TYPES","onError","message","updateAlignment","nextAlign","extraUpdatedAttributes","canEditImage","allowCrop","switchToCover","dimensionsUnitsOptions","availableUnits","controls","captionIcon","link","crop","overlayText","upload","newValue","parseInt","filename","defaultedAlt","borderProps","isRounded","className","event","target","objectFit","style","fallbackClientWidth","imageAttributes","ratio","currentWidth","currentHeight","minWidth","MIN_SIZE","minHeight","maxWidthBuffer","showRightHandle","showLeftHandle","display","top","right","bottom","left","direction","elt","offsetWidth","offsetHeight","RichText","isEmpty"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { isBlobURL } from '@wordpress/blob';\nimport {\n\tExternalLink,\n\tResizableBox,\n\tSpinner,\n\tTextareaControl,\n\tTextControl,\n\tToolbarButton,\n\tToolbarGroup,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalUseCustomUnits as useCustomUnits,\n} from '@wordpress/components';\nimport { useViewportMatch, usePrevious } from '@wordpress/compose';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport {\n\tBlockControls,\n\tInspectorControls,\n\tRichText,\n\t__experimentalImageURLInputUI as ImageURLInputUI,\n\tMediaReplaceFlow,\n\tstore as blockEditorStore,\n\tBlockAlignmentControl,\n\t__experimentalImageEditor as ImageEditor,\n\t__experimentalGetElementClassName,\n\t__experimentalUseBorderProps as useBorderProps,\n\tprivateApis as blockEditorPrivateApis,\n} from '@wordpress/block-editor';\nimport {\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseRef,\n\tuseCallback,\n} from '@wordpress/element';\nimport { __, _x, sprintf, isRTL } from '@wordpress/i18n';\nimport { getFilename } from '@wordpress/url';\nimport {\n\tcreateBlock,\n\tgetDefaultBlockName,\n\tswitchToBlockType,\n} from '@wordpress/blocks';\nimport {\n\tcrop,\n\toverlayText,\n\tupload,\n\tcaption as captionIcon,\n} from '@wordpress/icons';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\nimport { createUpgradedEmbedBlock } from '../embed/util';\nimport useClientWidth from './use-client-width';\nimport { isExternalImage } from './edit';\n\n/**\n * Module constants\n */\nimport { MIN_SIZE, ALLOWED_MEDIA_TYPES } from './constants';\nimport { evalAspectRatio } from './utils';\n\nconst { DimensionsTool, ResolutionTool } = unlock( blockEditorPrivateApis );\n\nconst scaleOptions = [\n\t{\n\t\tvalue: 'cover',\n\t\tlabel: _x( 'Cover', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Image covers the space evenly.' ),\n\t},\n\t{\n\t\tvalue: 'contain',\n\t\tlabel: _x( 'Contain', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Image is contained without distortion.' ),\n\t},\n];\n\nexport default function Image( {\n\ttemporaryURL,\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tinsertBlocksAfter,\n\tonReplace,\n\tonSelectImage,\n\tonSelectURL,\n\tonUploadError,\n\tcontainerRef,\n\tcontext,\n\tclientId,\n\tblockEditingMode,\n} ) {\n\tconst {\n\t\turl = '',\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\tid,\n\t\thref,\n\t\trel,\n\t\tlinkClass,\n\t\tlinkDestination,\n\t\ttitle,\n\t\twidth,\n\t\theight,\n\t\taspectRatio,\n\t\tscale,\n\t\tlinkTarget,\n\t\tsizeSlug,\n\t} = attributes;\n\tconst imageRef = useRef();\n\tconst prevCaption = usePrevious( caption );\n\tconst [ showCaption, setShowCaption ] = useState( !! caption );\n\tconst { allowResize = true } = context;\n\tconst { getBlock } = useSelect( blockEditorStore );\n\n\tconst { image, multiImageSelection } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getMedia } = select( coreStore );\n\t\t\tconst { getMultiSelectedBlockClientIds, getBlockName } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst multiSelectedClientIds = getMultiSelectedBlockClientIds();\n\t\t\treturn {\n\t\t\t\timage:\n\t\t\t\t\tid && isSelected\n\t\t\t\t\t\t? getMedia( id, { context: 'view' } )\n\t\t\t\t\t\t: null,\n\t\t\t\tmultiImageSelection:\n\t\t\t\t\tmultiSelectedClientIds.length &&\n\t\t\t\t\tmultiSelectedClientIds.every(\n\t\t\t\t\t\t( _clientId ) =>\n\t\t\t\t\t\t\tgetBlockName( _clientId ) === 'core/image'\n\t\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ id, isSelected ]\n\t);\n\tconst { canInsertCover, imageEditing, imageSizes, maxWidth, mediaUpload } =\n\t\tuseSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst {\n\t\t\t\t\tgetBlockRootClientId,\n\t\t\t\t\tgetSettings,\n\t\t\t\t\tcanInsertBlockType,\n\t\t\t\t} = select( blockEditorStore );\n\n\t\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\t\t\t\tconst settings = getSettings();\n\n\t\t\t\treturn {\n\t\t\t\t\timageEditing: settings.imageEditing,\n\t\t\t\t\timageSizes: settings.imageSizes,\n\t\t\t\t\tmaxWidth: settings.maxWidth,\n\t\t\t\t\tmediaUpload: settings.mediaUpload,\n\t\t\t\t\tcanInsertCover: canInsertBlockType(\n\t\t\t\t\t\t'core/cover',\n\t\t\t\t\t\trootClientId\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\tconst { replaceBlocks, toggleSelection } = useDispatch( blockEditorStore );\n\tconst { createErrorNotice, createSuccessNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst isLargeViewport = useViewportMatch( 'medium' );\n\tconst isWideAligned = [ 'wide', 'full' ].includes( align );\n\tconst [\n\t\t{ loadedNaturalWidth, loadedNaturalHeight },\n\t\tsetLoadedNaturalSize,\n\t] = useState( {} );\n\tconst [ isEditingImage, setIsEditingImage ] = useState( false );\n\tconst [ externalBlob, setExternalBlob ] = useState();\n\tconst clientWidth = useClientWidth( containerRef, [ align ] );\n\tconst hasNonContentControls = blockEditingMode === 'default';\n\tconst isResizable =\n\t\tallowResize &&\n\t\thasNonContentControls &&\n\t\t! ( isWideAligned && isLargeViewport );\n\tconst imageSizeOptions = imageSizes\n\t\t.filter(\n\t\t\t( { slug } ) => image?.media_details?.sizes?.[ slug ]?.source_url\n\t\t)\n\t\t.map( ( { name, slug } ) => ( { value: slug, label: name } ) );\n\tconst canUploadMedia = !! mediaUpload;\n\n\t// If an image is externally hosted, try to fetch the image data. This may\n\t// fail if the image host doesn't allow CORS with the domain. If it works,\n\t// we can enable a button in the toolbar to upload the image.\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! isExternalImage( id, url ) ||\n\t\t\t! isSelected ||\n\t\t\t! canUploadMedia\n\t\t) {\n\t\t\tsetExternalBlob();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( externalBlob ) return;\n\n\t\twindow\n\t\t\t// Avoid cache, which seems to help avoid CORS problems.\n\t\t\t.fetch( url.includes( '?' ) ? url : url + '?' )\n\t\t\t.then( ( response ) => response.blob() )\n\t\t\t.then( ( blob ) => setExternalBlob( blob ) )\n\t\t\t// Do nothing, cannot upload.\n\t\t\t.catch( () => {} );\n\t}, [ id, url, isSelected, externalBlob, canUploadMedia ] );\n\n\t// We need to show the caption when changes come from\n\t// history navigation(undo/redo).\n\tuseEffect( () => {\n\t\tif ( caption && ! prevCaption ) {\n\t\t\tsetShowCaption( true );\n\t\t}\n\t}, [ caption, prevCaption ] );\n\n\t// Focus the caption when we click to add one.\n\tconst captionRef = useCallback(\n\t\t( node ) => {\n\t\t\tif ( node && ! caption ) {\n\t\t\t\tnode.focus();\n\t\t\t}\n\t\t},\n\t\t[ caption ]\n\t);\n\n\t// Get naturalWidth and naturalHeight from image ref, and fall back to loaded natural\n\t// width and height. This resolves an issue in Safari where the loaded natural\n\t// width and height is otherwise lost when switching between alignments.\n\t// See: https://github.com/WordPress/gutenberg/pull/37210.\n\tconst { naturalWidth, naturalHeight } = useMemo( () => {\n\t\treturn {\n\t\t\tnaturalWidth:\n\t\t\t\timageRef.current?.naturalWidth ||\n\t\t\t\tloadedNaturalWidth ||\n\t\t\t\tundefined,\n\t\t\tnaturalHeight:\n\t\t\t\timageRef.current?.naturalHeight ||\n\t\t\t\tloadedNaturalHeight ||\n\t\t\t\tundefined,\n\t\t};\n\t}, [\n\t\tloadedNaturalWidth,\n\t\tloadedNaturalHeight,\n\t\timageRef.current?.complete,\n\t] );\n\n\tfunction onResizeStart() {\n\t\ttoggleSelection( false );\n\t}\n\n\tfunction onResizeStop() {\n\t\ttoggleSelection( true );\n\t}\n\n\tfunction onImageError() {\n\t\t// Check if there's an embed block that handles this URL, e.g., instagram URL.\n\t\t// See: https://github.com/WordPress/gutenberg/pull/11472\n\t\tconst embedBlock = createUpgradedEmbedBlock( { attributes: { url } } );\n\n\t\tif ( undefined !== embedBlock ) {\n\t\t\tonReplace( embedBlock );\n\t\t}\n\t}\n\n\tfunction onSetHref( props ) {\n\t\tsetAttributes( props );\n\t}\n\n\tfunction onSetTitle( value ) {\n\t\t// This is the HTML title attribute, separate from the media object\n\t\t// title.\n\t\tsetAttributes( { title: value } );\n\t}\n\n\tfunction updateAlt( newAlt ) {\n\t\tsetAttributes( { alt: newAlt } );\n\t}\n\n\tfunction updateImage( newSizeSlug ) {\n\t\tconst newUrl = image?.media_details?.sizes?.[ newSizeSlug ]?.source_url;\n\t\tif ( ! newUrl ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tsetAttributes( {\n\t\t\turl: newUrl,\n\t\t\tsizeSlug: newSizeSlug,\n\t\t} );\n\t}\n\n\tfunction uploadExternal() {\n\t\tmediaUpload( {\n\t\t\tfilesList: [ externalBlob ],\n\t\t\tonFileChange( [ img ] ) {\n\t\t\t\tonSelectImage( img );\n\n\t\t\t\tif ( isBlobURL( img.url ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetExternalBlob();\n\t\t\t\tcreateSuccessNotice( __( 'Image uploaded.' ), {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t} );\n\t\t\t},\n\t\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\t\tonError( message ) {\n\t\t\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t\t\t},\n\t\t} );\n\t}\n\n\tfunction updateAlignment( nextAlign ) {\n\t\tconst extraUpdatedAttributes = [ 'wide', 'full' ].includes( nextAlign )\n\t\t\t? { width: undefined, height: undefined }\n\t\t\t: {};\n\t\tsetAttributes( {\n\t\t\t...extraUpdatedAttributes,\n\t\t\talign: nextAlign,\n\t\t} );\n\t}\n\n\tuseEffect( () => {\n\t\tif ( ! isSelected ) {\n\t\t\tsetIsEditingImage( false );\n\t\t\tif ( ! caption ) {\n\t\t\t\tsetShowCaption( false );\n\t\t\t}\n\t\t}\n\t}, [ isSelected, caption ] );\n\n\tconst canEditImage = id && naturalWidth && naturalHeight && imageEditing;\n\tconst allowCrop = ! multiImageSelection && canEditImage && ! isEditingImage;\n\n\tfunction switchToCover() {\n\t\treplaceBlocks(\n\t\t\tclientId,\n\t\t\tswitchToBlockType( getBlock( clientId ), 'core/cover' )\n\t\t);\n\t}\n\n\t// TODO: Can allow more units after figuring out how they should interact\n\t// with the ResizableBox and ImageEditor components. Calculations later on\n\t// for those components are currently assuming px units.\n\tconst dimensionsUnitsOptions = useCustomUnits( {\n\t\tavailableUnits: [ 'px' ],\n\t} );\n\n\tconst controls = (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<BlockAlignmentControl\n\t\t\t\t\t\tvalue={ align }\n\t\t\t\t\t\tonChange={ updateAlignment }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tsetShowCaption( ! showCaption );\n\t\t\t\t\t\t\tif ( showCaption && caption ) {\n\t\t\t\t\t\t\t\tsetAttributes( { caption: undefined } );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} }\n\t\t\t\t\t\ticon={ captionIcon }\n\t\t\t\t\t\tisPressed={ showCaption }\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\tshowCaption\n\t\t\t\t\t\t\t\t? __( 'Remove caption' )\n\t\t\t\t\t\t\t\t: __( 'Add caption' )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t\t<ImageURLInputUI\n\t\t\t\t\t\turl={ href || '' }\n\t\t\t\t\t\tonChangeUrl={ onSetHref }\n\t\t\t\t\t\tlinkDestination={ linkDestination }\n\t\t\t\t\t\tmediaUrl={ ( image && image.source_url ) || url }\n\t\t\t\t\t\tmediaLink={ image && image.link }\n\t\t\t\t\t\tlinkTarget={ linkTarget }\n\t\t\t\t\t\tlinkClass={ linkClass }\n\t\t\t\t\t\trel={ rel }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ allowCrop && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => setIsEditingImage( true ) }\n\t\t\t\t\t\ticon={ crop }\n\t\t\t\t\t\tlabel={ __( 'Crop' ) }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && canInsertCover && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\ticon={ overlayText }\n\t\t\t\t\t\tlabel={ __( 'Add text over image' ) }\n\t\t\t\t\t\tonClick={ switchToCover }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</BlockControls>\n\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t<BlockControls group=\"other\">\n\t\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\t\tmediaId={ id }\n\t\t\t\t\t\tmediaURL={ url }\n\t\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\t\tonSelect={ onSelectImage }\n\t\t\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ ! multiImageSelection && externalBlob && (\n\t\t\t\t<BlockControls>\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\tonClick={ uploadExternal }\n\t\t\t\t\t\t\ticon={ upload }\n\t\t\t\t\t\t\tlabel={ __( 'Upload external image' ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t<InspectorControls>\n\t\t\t\t<ToolsPanel\n\t\t\t\t\tlabel={ __( 'Settings' ) }\n\t\t\t\t\tresetAll={ () =>\n\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\twidth: undefined,\n\t\t\t\t\t\t\theight: undefined,\n\t\t\t\t\t\t\tscale: undefined,\n\t\t\t\t\t\t\taspectRatio: undefined,\n\t\t\t\t\t\t} )\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{ ! multiImageSelection && (\n\t\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\tisShownByDefault={ true }\n\t\t\t\t\t\t\thasValue={ () => alt !== '' }\n\t\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\t\tsetAttributes( { alt: undefined } )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<TextareaControl\n\t\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\t\tvalue={ alt }\n\t\t\t\t\t\t\t\tonChange={ updateAlt }\n\t\t\t\t\t\t\t\thelp={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/WAI/tutorials/images/decision-tree\">\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'Describe the purpose of the image.'\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t{ __( 'Leave empty if decorative.' ) }\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__nextHasNoMarginBottom\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t) }\n\t\t\t\t\t<DimensionsTool\n\t\t\t\t\t\tvalue={ {\n\t\t\t\t\t\t\twidth: width && `${ width }px`,\n\t\t\t\t\t\t\theight: height && `${ height }px`,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\taspectRatio,\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tonChange={ ( newValue ) => {\n\t\t\t\t\t\t\t// Rebuilding the object forces setting `undefined`\n\t\t\t\t\t\t\t// for values that are removed since setAttributes\n\t\t\t\t\t\t\t// doesn't do anything with keys that aren't set.\n\t\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\t\twidth:\n\t\t\t\t\t\t\t\t\tnewValue.width &&\n\t\t\t\t\t\t\t\t\tparseInt( newValue.width, 10 ),\n\t\t\t\t\t\t\t\theight:\n\t\t\t\t\t\t\t\t\tnewValue.height &&\n\t\t\t\t\t\t\t\t\tparseInt( newValue.height, 10 ),\n\t\t\t\t\t\t\t\tscale: newValue.scale,\n\t\t\t\t\t\t\t\taspectRatio: newValue.aspectRatio,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tdefaultScale=\"cover\"\n\t\t\t\t\t\tdefaultAspectRatio=\"auto\"\n\t\t\t\t\t\tscaleOptions={ scaleOptions }\n\t\t\t\t\t\tunitsOptions={ dimensionsUnitsOptions }\n\t\t\t\t\t/>\n\t\t\t\t\t<ResolutionTool\n\t\t\t\t\t\tvalue={ sizeSlug }\n\t\t\t\t\t\tonChange={ updateImage }\n\t\t\t\t\t\toptions={ imageSizeOptions }\n\t\t\t\t\t/>\n\t\t\t\t</ToolsPanel>\n\t\t\t</InspectorControls>\n\t\t\t<InspectorControls group=\"advanced\">\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Title attribute' ) }\n\t\t\t\t\tvalue={ title || '' }\n\t\t\t\t\tonChange={ onSetTitle }\n\t\t\t\t\thelp={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Describe the role of this image on the page.'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/TR/html52/dom.html#the-title-attribute\">\n\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t'(Note: many devices and browsers do not display this text.)'\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</InspectorControls>\n\t\t</>\n\t);\n\n\tconst filename = getFilename( url );\n\tlet defaultedAlt;\n\n\tif ( alt ) {\n\t\tdefaultedAlt = alt;\n\t} else if ( filename ) {\n\t\tdefaultedAlt = sprintf(\n\t\t\t/* translators: %s: file name */\n\t\t\t__( 'This image has an empty alt attribute; its file name is %s' ),\n\t\t\tfilename\n\t\t);\n\t} else {\n\t\tdefaultedAlt = __( 'This image has an empty alt attribute' );\n\t}\n\n\tconst borderProps = useBorderProps( attributes );\n\tconst isRounded = attributes.className?.includes( 'is-style-rounded' );\n\n\tlet img = (\n\t\t// Disable reason: Image itself is not meant to be interactive, but\n\t\t// should direct focus to block.\n\t\t/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t\t<>\n\t\t\t<img\n\t\t\t\tsrc={ temporaryURL || url }\n\t\t\t\talt={ defaultedAlt }\n\t\t\t\tonError={ () => onImageError() }\n\t\t\t\tonLoad={ ( event ) => {\n\t\t\t\t\tsetLoadedNaturalSize( {\n\t\t\t\t\t\tloadedNaturalWidth: event.target?.naturalWidth,\n\t\t\t\t\t\tloadedNaturalHeight: event.target?.naturalHeight,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tref={ imageRef }\n\t\t\t\tclassName={ borderProps.className }\n\t\t\t\tstyle={ {\n\t\t\t\t\twidth:\n\t\t\t\t\t\t( width && height ) || aspectRatio ? '100%' : 'inherit',\n\t\t\t\t\theight:\n\t\t\t\t\t\t( width && height ) || aspectRatio ? '100%' : 'inherit',\n\t\t\t\t\tobjectFit: scale,\n\t\t\t\t\t...borderProps.style,\n\t\t\t\t} }\n\t\t\t/>\n\t\t\t{ temporaryURL && <Spinner /> }\n\t\t</>\n\t\t/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t);\n\n\t// clientWidth needs to be a number for the image Cropper to work, but sometimes it's 0\n\t// So we try using the imageRef width first and fallback to clientWidth.\n\tconst fallbackClientWidth = imageRef.current?.width || clientWidth;\n\n\tif ( canEditImage && isEditingImage ) {\n\t\timg = (\n\t\t\t<ImageEditor\n\t\t\t\tid={ id }\n\t\t\t\turl={ url }\n\t\t\t\twidth={ width }\n\t\t\t\theight={ height }\n\t\t\t\tclientWidth={ fallbackClientWidth }\n\t\t\t\tnaturalHeight={ naturalHeight }\n\t\t\t\tnaturalWidth={ naturalWidth }\n\t\t\t\tonSaveImage={ ( imageAttributes ) =>\n\t\t\t\t\tsetAttributes( imageAttributes )\n\t\t\t\t}\n\t\t\t\tonFinishEditing={ () => {\n\t\t\t\t\tsetIsEditingImage( false );\n\t\t\t\t} }\n\t\t\t\tborderProps={ isRounded ? undefined : borderProps }\n\t\t\t/>\n\t\t);\n\t} else if ( ! isResizable ) {\n\t\timg = <div style={ { width, height, aspectRatio } }>{ img }</div>;\n\t} else {\n\t\tconst ratio =\n\t\t\t( aspectRatio && evalAspectRatio( aspectRatio ) ) ||\n\t\t\t( width && height && width / height ) ||\n\t\t\tnaturalWidth / naturalHeight;\n\n\t\tconst currentWidth = ! width && height ? height * ratio : width;\n\t\tconst currentHeight = ! height && width ? width / ratio : height;\n\n\t\tconst minWidth =\n\t\t\tnaturalWidth < naturalHeight ? MIN_SIZE : MIN_SIZE * ratio;\n\t\tconst minHeight =\n\t\t\tnaturalHeight < naturalWidth ? MIN_SIZE : MIN_SIZE / ratio;\n\n\t\t// With the current implementation of ResizableBox, an image needs an\n\t\t// explicit pixel value for the max-width. In absence of being able to\n\t\t// set the content-width, this max-width is currently dictated by the\n\t\t// vanilla editor style. The following variable adds a buffer to this\n\t\t// vanilla style, so 3rd party themes have some wiggleroom. This does,\n\t\t// in most cases, allow you to scale the image beyond the width of the\n\t\t// main column, though not infinitely.\n\t\t// @todo It would be good to revisit this once a content-width variable\n\t\t// becomes available.\n\t\tconst maxWidthBuffer = maxWidth * 2.5;\n\n\t\tlet showRightHandle = false;\n\t\tlet showLeftHandle = false;\n\n\t\t/* eslint-disable no-lonely-if */\n\t\t// See https://github.com/WordPress/gutenberg/issues/7584.\n\t\tif ( align === 'center' ) {\n\t\t\t// When the image is centered, show both handles.\n\t\t\tshowRightHandle = true;\n\t\t\tshowLeftHandle = true;\n\t\t} else if ( isRTL() ) {\n\t\t\t// In RTL mode the image is on the right by default.\n\t\t\t// Show the right handle and hide the left handle only when it is\n\t\t\t// aligned left. Otherwise always show the left handle.\n\t\t\tif ( align === 'left' ) {\n\t\t\t\tshowRightHandle = true;\n\t\t\t} else {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// Show the left handle and hide the right handle only when the\n\t\t\t// image is aligned right. Otherwise always show the right handle.\n\t\t\tif ( align === 'right' ) {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t} else {\n\t\t\t\tshowRightHandle = true;\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-lonely-if */\n\n\t\timg = (\n\t\t\t<ResizableBox\n\t\t\t\tstyle={ {\n\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\tobjectFit: scale,\n\t\t\t\t\taspectRatio:\n\t\t\t\t\t\t! width && ! height && aspectRatio\n\t\t\t\t\t\t\t? aspectRatio\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t} }\n\t\t\t\tsize={ {\n\t\t\t\t\twidth: currentWidth ?? 'auto',\n\t\t\t\t\theight: currentHeight ?? 'auto',\n\t\t\t\t} }\n\t\t\t\tshowHandle={ isSelected }\n\t\t\t\tminWidth={ minWidth }\n\t\t\t\tmaxWidth={ maxWidthBuffer }\n\t\t\t\tminHeight={ minHeight }\n\t\t\t\tmaxHeight={ maxWidthBuffer / ratio }\n\t\t\t\tlockAspectRatio={ ratio }\n\t\t\t\tenable={ {\n\t\t\t\t\ttop: false,\n\t\t\t\t\tright: showRightHandle,\n\t\t\t\t\tbottom: true,\n\t\t\t\t\tleft: showLeftHandle,\n\t\t\t\t} }\n\t\t\t\tonResizeStart={ onResizeStart }\n\t\t\t\tonResizeStop={ ( event, direction, elt ) => {\n\t\t\t\t\tonResizeStop();\n\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\twidth: elt.offsetWidth,\n\t\t\t\t\t\theight: elt.offsetHeight,\n\t\t\t\t\t\taspectRatio: undefined,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tresizeRatio={ align === 'center' ? 2 : 1 }\n\t\t\t>\n\t\t\t\t{ img }\n\t\t\t</ResizableBox>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ /* Hide controls during upload to avoid component remount,\n\t\t\t\twhich causes duplicated image upload. */ }\n\t\t\t{ ! temporaryURL && controls }\n\t\t\t{ img }\n\t\t\t{ showCaption &&\n\t\t\t\t( ! RichText.isEmpty( caption ) || isSelected ) && (\n\t\t\t\t\t<RichText\n\t\t\t\t\t\tidentifier=\"caption\"\n\t\t\t\t\t\tclassName={ __experimentalGetElementClassName(\n\t\t\t\t\t\t\t'caption'\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tref={ captionRef }\n\t\t\t\t\t\ttagName=\"figcaption\"\n\t\t\t\t\t\taria-label={ __( 'Image caption text' ) }\n\t\t\t\t\t\tplaceholder={ __( 'Add caption' ) }\n\t\t\t\t\t\tvalue={ caption }\n\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\tsetAttributes( { caption: value } )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinlineToolbar\n\t\t\t\t\t\t__unstableOnSplitAtEnd={ () =>\n\t\t\t\t\t\t\tinsertBlocksAfter(\n\t\t\t\t\t\t\t\tcreateBlock( getDefaultBlockName() )\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) }\n\t\t</>\n\t);\n}\n"]}
@@ -99,6 +99,12 @@ const metadata = {
99
99
  height: {
100
100
  type: "number"
101
101
  },
102
+ aspectRatio: {
103
+ type: "string"
104
+ },
105
+ scale: {
106
+ type: "string"
107
+ },
102
108
  sizeSlug: {
103
109
  type: "string"
104
110
  },