@wordpress/block-editor 15.9.0 → 15.9.1-next.6deb34194.0

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 (144) hide show
  1. package/README.md +12 -0
  2. package/build/components/block-alignment-matrix-control/index.js +1 -8
  3. package/build/components/block-alignment-matrix-control/index.js.map +2 -2
  4. package/build/components/block-bindings/attribute-control.js +172 -0
  5. package/build/components/block-bindings/attribute-control.js.map +7 -0
  6. package/build/components/block-bindings/index.js +47 -0
  7. package/build/components/block-bindings/index.js.map +7 -0
  8. package/build/components/block-bindings/source-fields-list.js +135 -0
  9. package/build/components/block-bindings/source-fields-list.js.map +7 -0
  10. package/build/components/block-bindings/use-block-bindings-utils.js +66 -0
  11. package/build/components/block-bindings/use-block-bindings-utils.js.map +7 -0
  12. package/build/components/block-edit/edit.js +1 -3
  13. package/build/components/block-edit/edit.js.map +2 -2
  14. package/build/components/block-styles/preview-panel.js +3 -5
  15. package/build/components/block-styles/preview-panel.js.map +2 -2
  16. package/build/components/block-styles/use-styles-for-block.js +2 -2
  17. package/build/components/block-styles/use-styles-for-block.js.map +2 -2
  18. package/build/components/block-toolbar/index.js +1 -8
  19. package/build/components/block-toolbar/index.js.map +3 -3
  20. package/build/components/content-only-controls/index.js +2 -25
  21. package/build/components/content-only-controls/index.js.map +2 -2
  22. package/build/components/content-only-controls/link/index.js +3 -3
  23. package/build/components/content-only-controls/link/index.js.map +2 -2
  24. package/build/components/content-only-controls/media/index.js +3 -3
  25. package/build/components/content-only-controls/media/index.js.map +2 -2
  26. package/build/components/content-only-controls/rich-text/index.js +3 -2
  27. package/build/components/content-only-controls/rich-text/index.js.map +2 -2
  28. package/build/components/dimensions-tool/width-height-tool.js +4 -16
  29. package/build/components/dimensions-tool/width-height-tool.js.map +3 -3
  30. package/build/components/image-editor/cropper.js +3 -34
  31. package/build/components/image-editor/cropper.js.map +3 -3
  32. package/build/components/image-editor/index.js +9 -3
  33. package/build/components/image-editor/index.js.map +2 -2
  34. package/build/components/image-editor/use-transform-image.js +62 -32
  35. package/build/components/image-editor/use-transform-image.js.map +2 -2
  36. package/build/components/image-editor/zoom-dropdown.js +2 -2
  37. package/build/components/image-editor/zoom-dropdown.js.map +2 -2
  38. package/build/components/index.js +10 -3
  39. package/build/components/index.js.map +2 -2
  40. package/build/components/inserter-draggable-blocks/index.js +8 -4
  41. package/build/components/inserter-draggable-blocks/index.js.map +2 -2
  42. package/build/components/inspector-controls-tabs/content-tab.js +3 -2
  43. package/build/components/inspector-controls-tabs/content-tab.js.map +2 -2
  44. package/build/components/tool-selector/index.js +46 -0
  45. package/build/components/tool-selector/index.js.map +7 -0
  46. package/build/hooks/block-bindings.js +22 -260
  47. package/build/hooks/block-bindings.js.map +3 -3
  48. package/build/layouts/grid.js +23 -28
  49. package/build/layouts/grid.js.map +2 -2
  50. package/build/utils/block-bindings.js +2 -44
  51. package/build/utils/block-bindings.js.map +3 -3
  52. package/build/utils/index.js +2 -5
  53. package/build/utils/index.js.map +2 -2
  54. package/build-module/components/block-alignment-matrix-control/index.js +1 -8
  55. package/build-module/components/block-alignment-matrix-control/index.js.map +2 -2
  56. package/build-module/components/block-bindings/attribute-control.js +150 -0
  57. package/build-module/components/block-bindings/attribute-control.js.map +7 -0
  58. package/build-module/components/block-bindings/index.js +10 -0
  59. package/build-module/components/block-bindings/index.js.map +7 -0
  60. package/build-module/components/block-bindings/source-fields-list.js +104 -0
  61. package/build-module/components/block-bindings/source-fields-list.js.map +7 -0
  62. package/build-module/components/block-bindings/use-block-bindings-utils.js +45 -0
  63. package/build-module/components/block-bindings/use-block-bindings-utils.js.map +7 -0
  64. package/build-module/components/block-edit/edit.js +1 -3
  65. package/build-module/components/block-edit/edit.js.map +2 -2
  66. package/build-module/components/block-styles/preview-panel.js +3 -5
  67. package/build-module/components/block-styles/preview-panel.js.map +2 -2
  68. package/build-module/components/block-styles/use-styles-for-block.js +2 -2
  69. package/build-module/components/block-styles/use-styles-for-block.js.map +2 -2
  70. package/build-module/components/block-toolbar/index.js +1 -8
  71. package/build-module/components/block-toolbar/index.js.map +2 -2
  72. package/build-module/components/content-only-controls/index.js +2 -25
  73. package/build-module/components/content-only-controls/index.js.map +2 -2
  74. package/build-module/components/content-only-controls/link/index.js +3 -3
  75. package/build-module/components/content-only-controls/link/index.js.map +2 -2
  76. package/build-module/components/content-only-controls/media/index.js +3 -3
  77. package/build-module/components/content-only-controls/media/index.js.map +2 -2
  78. package/build-module/components/content-only-controls/rich-text/index.js +3 -2
  79. package/build-module/components/content-only-controls/rich-text/index.js.map +2 -2
  80. package/build-module/components/dimensions-tool/width-height-tool.js +4 -6
  81. package/build-module/components/dimensions-tool/width-height-tool.js.map +2 -2
  82. package/build-module/components/image-editor/cropper.js +3 -34
  83. package/build-module/components/image-editor/cropper.js.map +2 -2
  84. package/build-module/components/image-editor/index.js +9 -3
  85. package/build-module/components/image-editor/index.js.map +2 -2
  86. package/build-module/components/image-editor/use-transform-image.js +63 -33
  87. package/build-module/components/image-editor/use-transform-image.js.map +2 -2
  88. package/build-module/components/image-editor/zoom-dropdown.js +2 -2
  89. package/build-module/components/image-editor/zoom-dropdown.js.map +2 -2
  90. package/build-module/components/index.js +74 -66
  91. package/build-module/components/index.js.map +2 -2
  92. package/build-module/components/inserter-draggable-blocks/index.js +8 -4
  93. package/build-module/components/inserter-draggable-blocks/index.js.map +2 -2
  94. package/build-module/components/inspector-controls-tabs/content-tab.js +3 -2
  95. package/build-module/components/inspector-controls-tabs/content-tab.js.map +2 -2
  96. package/build-module/components/tool-selector/index.js +15 -0
  97. package/build-module/components/tool-selector/index.js.map +7 -0
  98. package/build-module/hooks/block-bindings.js +27 -270
  99. package/build-module/hooks/block-bindings.js.map +2 -2
  100. package/build-module/layouts/grid.js +23 -28
  101. package/build-module/layouts/grid.js.map +2 -2
  102. package/build-module/utils/block-bindings.js +1 -42
  103. package/build-module/utils/block-bindings.js.map +2 -2
  104. package/build-module/utils/index.js +1 -3
  105. package/build-module/utils/index.js.map +2 -2
  106. package/build-style/style-rtl.css +6 -6
  107. package/build-style/style.css +6 -6
  108. package/package.json +39 -40
  109. package/src/components/block-alignment-matrix-control/index.js +1 -5
  110. package/src/components/block-bindings/attribute-control.js +174 -0
  111. package/src/components/block-bindings/index.js +6 -0
  112. package/src/components/block-bindings/source-fields-list.js +130 -0
  113. package/src/components/block-bindings/use-block-bindings-utils.js +156 -0
  114. package/src/components/block-edit/edit.js +1 -3
  115. package/src/components/block-styles/preview-panel.js +3 -5
  116. package/src/components/block-styles/use-styles-for-block.js +2 -2
  117. package/src/components/block-toolbar/index.js +1 -6
  118. package/src/components/block-toolbar/style.scss +6 -6
  119. package/src/components/content-only-controls/index.js +2 -27
  120. package/src/components/content-only-controls/link/index.js +3 -3
  121. package/src/components/content-only-controls/media/index.js +3 -3
  122. package/src/components/content-only-controls/rich-text/index.js +3 -2
  123. package/src/components/dimensions-tool/width-height-tool.js +6 -13
  124. package/src/components/image-editor/cropper.js +3 -32
  125. package/src/components/image-editor/index.js +34 -29
  126. package/src/components/image-editor/use-transform-image.js +80 -34
  127. package/src/components/image-editor/zoom-dropdown.js +2 -2
  128. package/src/components/index.js +9 -1
  129. package/src/components/inserter/style.scss +1 -1
  130. package/src/components/inserter-draggable-blocks/index.js +19 -8
  131. package/src/components/inspector-controls-tabs/content-tab.js +6 -2
  132. package/src/components/tool-selector/index.js +19 -0
  133. package/src/hooks/block-bindings.js +27 -347
  134. package/src/layouts/grid.js +40 -72
  135. package/src/layouts/test/grid.js +14 -0
  136. package/src/utils/block-bindings.js +0 -157
  137. package/src/utils/index.js +0 -1
  138. package/tsconfig.json +1 -0
  139. package/build/components/block-toolbar/block-name-context.js +0 -30
  140. package/build/components/block-toolbar/block-name-context.js.map +0 -7
  141. package/build-module/components/block-toolbar/block-name-context.js +0 -9
  142. package/build-module/components/block-toolbar/block-name-context.js.map +0 -7
  143. package/src/components/block-toolbar/block-name-context.js +0 -9
  144. /package/src/{utils → components/block-bindings}/test/use-block-bindings-utils.js +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/content-only-controls/media/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tButton,\n\tIcon,\n\t__experimentalGrid as Grid,\n} from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport {\n\taudio as audioIcon,\n\timage as imageIcon,\n\tmedia as mediaIcon,\n\tvideo as videoIcon,\n} from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport MediaReplaceFlow from '../../media-replace-flow';\nimport MediaUploadCheck from '../../media-upload/check';\nimport { useInspectorPopoverPlacement } from '../use-inspector-popover-placement';\nimport { getMediaSelectKey } from '../../../store/private-keys';\nimport { store as blockEditorStore } from '../../../store';\n\nfunction MediaThumbnail( { data, field, attachment } ) {\n\tconst config = field.config || {};\n\tconst { allowedTypes = [], multiple = false } = config;\n\n\tif ( multiple ) {\n\t\treturn 'todo multiple';\n\t}\n\n\tif ( attachment?.media_type === 'image' || attachment?.poster ) {\n\t\treturn (\n\t\t\t<img\n\t\t\t\tclassName=\"block-editor-content-only-controls__media-thumbnail\"\n\t\t\t\talt=\"\"\n\t\t\t\twidth={ 24 }\n\t\t\t\theight={ 24 }\n\t\t\t\tsrc={\n\t\t\t\t\tattachment.media_type === 'image'\n\t\t\t\t\t\t? attachment.source_url\n\t\t\t\t\t\t: attachment.poster\n\t\t\t\t}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif ( allowedTypes.length === 1 ) {\n\t\tconst value = field.getValue( { item: data } );\n\t\tconst url = value?.url;\n\n\t\tif ( url ) {\n\t\t\treturn (\n\t\t\t\t<img\n\t\t\t\t\tclassName=\"block-editor-content-only-controls__media-thumbnail\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\twidth={ 24 }\n\t\t\t\t\theight={ 24 }\n\t\t\t\t\tsrc={ url }\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tlet icon;\n\t\tif ( allowedTypes[ 0 ] === 'image' ) {\n\t\t\ticon = imageIcon;\n\t\t} else if ( allowedTypes[ 0 ] === 'video' ) {\n\t\t\ticon = videoIcon;\n\t\t} else if ( allowedTypes[ 0 ] === 'audio' ) {\n\t\t\ticon = audioIcon;\n\t\t} else {\n\t\t\ticon = mediaIcon;\n\t\t}\n\n\t\tif ( icon ) {\n\t\t\treturn <Icon icon={ icon } size={ 24 } />;\n\t\t}\n\t}\n\n\treturn <Icon icon={ mediaIcon } size={ 24 } />;\n}\n\nexport default function Media( { data, field, config = {} } ) {\n\tconst { popoverProps } = useInspectorPopoverPlacement( {\n\t\tisControl: true,\n\t} );\n\tconst value = field.getValue( { item: data } );\n\tconst { allowedTypes = [], multiple = false } = field.config || {};\n\tconst { clientId, updateBlockAttributes, fieldDef } = config;\n\tconst updateAttributes = ( newFieldValue ) => {\n\t\tconst mappedChanges = field.setValue( {\n\t\t\titem: data,\n\t\t\tvalue: newFieldValue,\n\t\t} );\n\t\tupdateBlockAttributes( clientId, mappedChanges );\n\t};\n\n\t// Check if featured image is supported by checking if it's in the mapping\n\tconst hasFeaturedImageSupport =\n\t\tfieldDef?.mapping && 'featuredImage' in fieldDef.mapping;\n\n\tconst id = value?.id;\n\tconst url = value?.url;\n\n\tconst attachment = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! id ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst settings = select( blockEditorStore ).getSettings();\n\t\t\tconst getMedia = settings[ getMediaSelectKey ];\n\n\t\t\tif ( ! getMedia ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn getMedia( select, id );\n\t\t},\n\t\t[ id ]\n\t);\n\n\t// TODO - pluralize when multiple.\n\tlet chooseItemLabel;\n\tif ( allowedTypes.length === 1 ) {\n\t\tconst allowedType = allowedTypes[ 0 ];\n\t\tif ( allowedType === 'image' ) {\n\t\t\tchooseItemLabel = __( 'Choose an image\u2026' );\n\t\t} else if ( allowedType === 'video' ) {\n\t\t\tchooseItemLabel = __( 'Choose a video\u2026' );\n\t\t} else if ( allowedType === 'application' ) {\n\t\t\tchooseItemLabel = __( 'Choose a file\u2026' );\n\t\t} else {\n\t\t\tchooseItemLabel = __( 'Choose a media item\u2026' );\n\t\t}\n\t} else {\n\t\tchooseItemLabel = __( 'Choose a media item\u2026' );\n\t}\n\n\treturn (\n\t\t<MediaUploadCheck>\n\t\t\t<MediaReplaceFlow\n\t\t\t\tclassName=\"block-editor-content-only-controls__media-replace-flow\"\n\t\t\t\tallowedTypes={ allowedTypes }\n\t\t\t\tmediaId={ id }\n\t\t\t\tmediaURL={ url }\n\t\t\t\tmultiple={ multiple }\n\t\t\t\tpopoverProps={ popoverProps }\n\t\t\t\tonReset={ () => {\n\t\t\t\t\t// Build reset value dynamically based on mapping\n\t\t\t\t\tconst resetValue = {};\n\n\t\t\t\t\tif ( fieldDef?.mapping ) {\n\t\t\t\t\t\tObject.keys( fieldDef.mapping ).forEach( ( key ) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tkey === 'id' ||\n\t\t\t\t\t\t\t\tkey === 'src' ||\n\t\t\t\t\t\t\t\tkey === 'url'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tresetValue[ key ] = undefined;\n\t\t\t\t\t\t\t} else if ( key === 'caption' || key === 'alt' ) {\n\t\t\t\t\t\t\t\tresetValue[ key ] = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Turn off featured image when resetting (only if it's in the mapping)\n\t\t\t\t\tif ( hasFeaturedImageSupport ) {\n\t\t\t\t\t\tresetValue.featuredImage = false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Merge with existing value to preserve other field properties\n\t\t\t\t\tupdateAttributes( { ...value, ...resetValue } );\n\t\t\t\t} }\n\t\t\t\t{ ...( hasFeaturedImageSupport && {\n\t\t\t\t\tuseFeaturedImage: !! value?.featuredImage,\n\t\t\t\t\tonToggleFeaturedImage: () => {\n\t\t\t\t\t\tupdateAttributes( {\n\t\t\t\t\t\t\t...value,\n\t\t\t\t\t\t\tfeaturedImage: ! value?.featuredImage,\n\t\t\t\t\t\t} );\n\t\t\t\t\t},\n\t\t\t\t} ) }\n\t\t\t\tonSelect={ ( selectedMedia ) => {\n\t\t\t\t\tif ( selectedMedia.id && selectedMedia.url ) {\n\t\t\t\t\t\t// Determine mediaType from MIME type, not from object type\n\t\t\t\t\t\tlet mediaType = 'image'; // default\n\t\t\t\t\t\tif ( selectedMedia.mime_type ) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tselectedMedia.mime_type.startsWith( 'video/' )\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tmediaType = 'video';\n\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\tselectedMedia.mime_type.startsWith( 'audio/' )\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tmediaType = 'audio';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Build new value dynamically based on what's in the mapping\n\t\t\t\t\t\tconst newValue = {};\n\n\t\t\t\t\t\t// Iterate over mapping keys and set values for supported properties\n\t\t\t\t\t\tif ( fieldDef?.mapping ) {\n\t\t\t\t\t\t\tObject.keys( fieldDef.mapping ).forEach(\n\t\t\t\t\t\t\t\t( key ) => {\n\t\t\t\t\t\t\t\t\tif ( key === 'id' ) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.id;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'src' ||\n\t\t\t\t\t\t\t\t\t\tkey === 'url'\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.url;\n\t\t\t\t\t\t\t\t\t} else if ( key === 'type' ) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = mediaType;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'link' &&\n\t\t\t\t\t\t\t\t\t\tselectedMedia.link\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.link;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'caption' &&\n\t\t\t\t\t\t\t\t\t\t! value?.caption &&\n\t\t\t\t\t\t\t\t\t\tselectedMedia.caption\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.caption;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'alt' &&\n\t\t\t\t\t\t\t\t\t\t! value?.alt &&\n\t\t\t\t\t\t\t\t\t\tselectedMedia.alt\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.alt;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'poster' &&\n\t\t\t\t\t\t\t\t\t\tselectedMedia.poster\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.poster;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Turn off featured image when manually selecting media\n\t\t\t\t\t\tif ( hasFeaturedImageSupport ) {\n\t\t\t\t\t\t\tnewValue.featuredImage = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Merge with existing value to preserve other field properties\n\t\t\t\t\t\tconst finalValue = { ...value, ...newValue };\n\t\t\t\t\t\tupdateAttributes( finalValue );\n\t\t\t\t\t}\n\t\t\t\t} }\n\t\t\t\trenderToggle={ ( buttonProps ) => (\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tclassName=\"block-editor-content-only-controls__media\"\n\t\t\t\t\t\t{ ...buttonProps }\n\t\t\t\t\t>\n\t\t\t\t\t\t<Grid\n\t\t\t\t\t\t\trowGap={ 0 }\n\t\t\t\t\t\t\tcolumnGap={ 8 }\n\t\t\t\t\t\t\ttemplateColumns=\"24px 1fr\"\n\t\t\t\t\t\t\tclassName=\"block-editor-content-only-controls__media-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ url && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<MediaThumbnail\n\t\t\t\t\t\t\t\t\t\tattachment={ attachment }\n\t\t\t\t\t\t\t\t\t\tfield={ field }\n\t\t\t\t\t\t\t\t\t\tdata={ data }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span className=\"block-editor-content-only-controls__media-title\">\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t// TODO - truncate long titles or url smartly (e.g. show filename).\n\t\t\t\t\t\t\t\t\t\t\tattachment?.title?.raw &&\n\t\t\t\t\t\t\t\t\t\t\tattachment?.title?.raw !== ''\n\t\t\t\t\t\t\t\t\t\t\t\t? attachment?.title?.raw\n\t\t\t\t\t\t\t\t\t\t\t\t: url\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t{ ! url && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName=\"block-editor-content-only-controls__media-placeholder\"\n\t\t\t\t\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t\t\t\t\twidth: '24px',\n\t\t\t\t\t\t\t\t\t\t\theight: '24px',\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span className=\"block-editor-content-only-controls__media-title\">\n\t\t\t\t\t\t\t\t\t\t{ chooseItemLabel }\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Grid>\n\t\t\t\t\t</Button>\n\t\t\t\t) }\n\t\t\t/>\n\t\t</MediaUploadCheck>\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tButton,\n\tIcon,\n\t__experimentalGrid as Grid,\n} from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport {\n\taudio as audioIcon,\n\timage as imageIcon,\n\tmedia as mediaIcon,\n\tvideo as videoIcon,\n} from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport MediaReplaceFlow from '../../media-replace-flow';\nimport MediaUploadCheck from '../../media-upload/check';\nimport { useInspectorPopoverPlacement } from '../use-inspector-popover-placement';\nimport { getMediaSelectKey } from '../../../store/private-keys';\nimport { store as blockEditorStore } from '../../../store';\n\nfunction MediaThumbnail( { data, field, attachment } ) {\n\tconst config = field.config || {};\n\tconst { allowedTypes = [], multiple = false } = config;\n\n\tif ( multiple ) {\n\t\treturn 'todo multiple';\n\t}\n\n\tif ( attachment?.media_type === 'image' || attachment?.poster ) {\n\t\treturn (\n\t\t\t<img\n\t\t\t\tclassName=\"block-editor-content-only-controls__media-thumbnail\"\n\t\t\t\talt=\"\"\n\t\t\t\twidth={ 24 }\n\t\t\t\theight={ 24 }\n\t\t\t\tsrc={\n\t\t\t\t\tattachment.media_type === 'image'\n\t\t\t\t\t\t? attachment.source_url\n\t\t\t\t\t\t: attachment.poster\n\t\t\t\t}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif ( allowedTypes.length === 1 ) {\n\t\tconst value = field.getValue( { item: data } );\n\t\tconst url = value?.url;\n\n\t\tif ( url ) {\n\t\t\treturn (\n\t\t\t\t<img\n\t\t\t\t\tclassName=\"block-editor-content-only-controls__media-thumbnail\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\twidth={ 24 }\n\t\t\t\t\theight={ 24 }\n\t\t\t\t\tsrc={ url }\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tlet icon;\n\t\tif ( allowedTypes[ 0 ] === 'image' ) {\n\t\t\ticon = imageIcon;\n\t\t} else if ( allowedTypes[ 0 ] === 'video' ) {\n\t\t\ticon = videoIcon;\n\t\t} else if ( allowedTypes[ 0 ] === 'audio' ) {\n\t\t\ticon = audioIcon;\n\t\t} else {\n\t\t\ticon = mediaIcon;\n\t\t}\n\n\t\tif ( icon ) {\n\t\t\treturn <Icon icon={ icon } size={ 24 } />;\n\t\t}\n\t}\n\n\treturn <Icon icon={ mediaIcon } size={ 24 } />;\n}\n\nexport default function Media( { data, field, onChange, config = {} } ) {\n\tconst { popoverProps } = useInspectorPopoverPlacement( {\n\t\tisControl: true,\n\t} );\n\tconst value = field.getValue( { item: data } );\n\tconst { allowedTypes = [], multiple = false } = field.config || {};\n\tconst { fieldDef } = config;\n\tconst updateAttributes = ( newFieldValue ) => {\n\t\tconst mappedChanges = field.setValue( {\n\t\t\titem: data,\n\t\t\tvalue: newFieldValue,\n\t\t} );\n\t\tonChange( mappedChanges );\n\t};\n\n\t// Check if featured image is supported by checking if it's in the mapping\n\tconst hasFeaturedImageSupport =\n\t\tfieldDef?.mapping && 'featuredImage' in fieldDef.mapping;\n\n\tconst id = value?.id;\n\tconst url = value?.url;\n\n\tconst attachment = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! id ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst settings = select( blockEditorStore ).getSettings();\n\t\t\tconst getMedia = settings[ getMediaSelectKey ];\n\n\t\t\tif ( ! getMedia ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn getMedia( select, id );\n\t\t},\n\t\t[ id ]\n\t);\n\n\t// TODO - pluralize when multiple.\n\tlet chooseItemLabel;\n\tif ( allowedTypes.length === 1 ) {\n\t\tconst allowedType = allowedTypes[ 0 ];\n\t\tif ( allowedType === 'image' ) {\n\t\t\tchooseItemLabel = __( 'Choose an image\u2026' );\n\t\t} else if ( allowedType === 'video' ) {\n\t\t\tchooseItemLabel = __( 'Choose a video\u2026' );\n\t\t} else if ( allowedType === 'application' ) {\n\t\t\tchooseItemLabel = __( 'Choose a file\u2026' );\n\t\t} else {\n\t\t\tchooseItemLabel = __( 'Choose a media item\u2026' );\n\t\t}\n\t} else {\n\t\tchooseItemLabel = __( 'Choose a media item\u2026' );\n\t}\n\n\treturn (\n\t\t<MediaUploadCheck>\n\t\t\t<MediaReplaceFlow\n\t\t\t\tclassName=\"block-editor-content-only-controls__media-replace-flow\"\n\t\t\t\tallowedTypes={ allowedTypes }\n\t\t\t\tmediaId={ id }\n\t\t\t\tmediaURL={ url }\n\t\t\t\tmultiple={ multiple }\n\t\t\t\tpopoverProps={ popoverProps }\n\t\t\t\tonReset={ () => {\n\t\t\t\t\t// Build reset value dynamically based on mapping\n\t\t\t\t\tconst resetValue = {};\n\n\t\t\t\t\tif ( fieldDef?.mapping ) {\n\t\t\t\t\t\tObject.keys( fieldDef.mapping ).forEach( ( key ) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tkey === 'id' ||\n\t\t\t\t\t\t\t\tkey === 'src' ||\n\t\t\t\t\t\t\t\tkey === 'url'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tresetValue[ key ] = undefined;\n\t\t\t\t\t\t\t} else if ( key === 'caption' || key === 'alt' ) {\n\t\t\t\t\t\t\t\tresetValue[ key ] = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Turn off featured image when resetting (only if it's in the mapping)\n\t\t\t\t\tif ( hasFeaturedImageSupport ) {\n\t\t\t\t\t\tresetValue.featuredImage = false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Merge with existing value to preserve other field properties\n\t\t\t\t\tupdateAttributes( { ...value, ...resetValue } );\n\t\t\t\t} }\n\t\t\t\t{ ...( hasFeaturedImageSupport && {\n\t\t\t\t\tuseFeaturedImage: !! value?.featuredImage,\n\t\t\t\t\tonToggleFeaturedImage: () => {\n\t\t\t\t\t\tupdateAttributes( {\n\t\t\t\t\t\t\t...value,\n\t\t\t\t\t\t\tfeaturedImage: ! value?.featuredImage,\n\t\t\t\t\t\t} );\n\t\t\t\t\t},\n\t\t\t\t} ) }\n\t\t\t\tonSelect={ ( selectedMedia ) => {\n\t\t\t\t\tif ( selectedMedia.id && selectedMedia.url ) {\n\t\t\t\t\t\t// Determine mediaType from MIME type, not from object type\n\t\t\t\t\t\tlet mediaType = 'image'; // default\n\t\t\t\t\t\tif ( selectedMedia.mime_type ) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tselectedMedia.mime_type.startsWith( 'video/' )\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tmediaType = 'video';\n\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\tselectedMedia.mime_type.startsWith( 'audio/' )\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tmediaType = 'audio';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Build new value dynamically based on what's in the mapping\n\t\t\t\t\t\tconst newValue = {};\n\n\t\t\t\t\t\t// Iterate over mapping keys and set values for supported properties\n\t\t\t\t\t\tif ( fieldDef?.mapping ) {\n\t\t\t\t\t\t\tObject.keys( fieldDef.mapping ).forEach(\n\t\t\t\t\t\t\t\t( key ) => {\n\t\t\t\t\t\t\t\t\tif ( key === 'id' ) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.id;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'src' ||\n\t\t\t\t\t\t\t\t\t\tkey === 'url'\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.url;\n\t\t\t\t\t\t\t\t\t} else if ( key === 'type' ) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = mediaType;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'link' &&\n\t\t\t\t\t\t\t\t\t\tselectedMedia.link\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.link;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'caption' &&\n\t\t\t\t\t\t\t\t\t\t! value?.caption &&\n\t\t\t\t\t\t\t\t\t\tselectedMedia.caption\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.caption;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'alt' &&\n\t\t\t\t\t\t\t\t\t\t! value?.alt &&\n\t\t\t\t\t\t\t\t\t\tselectedMedia.alt\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.alt;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tkey === 'poster' &&\n\t\t\t\t\t\t\t\t\t\tselectedMedia.poster\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tnewValue[ key ] = selectedMedia.poster;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Turn off featured image when manually selecting media\n\t\t\t\t\t\tif ( hasFeaturedImageSupport ) {\n\t\t\t\t\t\t\tnewValue.featuredImage = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Merge with existing value to preserve other field properties\n\t\t\t\t\t\tconst finalValue = { ...value, ...newValue };\n\t\t\t\t\t\tupdateAttributes( finalValue );\n\t\t\t\t\t}\n\t\t\t\t} }\n\t\t\t\trenderToggle={ ( buttonProps ) => (\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tclassName=\"block-editor-content-only-controls__media\"\n\t\t\t\t\t\t{ ...buttonProps }\n\t\t\t\t\t>\n\t\t\t\t\t\t<Grid\n\t\t\t\t\t\t\trowGap={ 0 }\n\t\t\t\t\t\t\tcolumnGap={ 8 }\n\t\t\t\t\t\t\ttemplateColumns=\"24px 1fr\"\n\t\t\t\t\t\t\tclassName=\"block-editor-content-only-controls__media-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ url && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<MediaThumbnail\n\t\t\t\t\t\t\t\t\t\tattachment={ attachment }\n\t\t\t\t\t\t\t\t\t\tfield={ field }\n\t\t\t\t\t\t\t\t\t\tdata={ data }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span className=\"block-editor-content-only-controls__media-title\">\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t// TODO - truncate long titles or url smartly (e.g. show filename).\n\t\t\t\t\t\t\t\t\t\t\tattachment?.title?.raw &&\n\t\t\t\t\t\t\t\t\t\t\tattachment?.title?.raw !== ''\n\t\t\t\t\t\t\t\t\t\t\t\t? attachment?.title?.raw\n\t\t\t\t\t\t\t\t\t\t\t\t: url\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t{ ! url && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName=\"block-editor-content-only-controls__media-placeholder\"\n\t\t\t\t\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t\t\t\t\twidth: '24px',\n\t\t\t\t\t\t\t\t\t\t\theight: '24px',\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span className=\"block-editor-content-only-controls__media-title\">\n\t\t\t\t\t\t\t\t\t\t{ chooseItemLabel }\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Grid>\n\t\t\t\t\t</Button>\n\t\t\t\t) }\n\t\t\t/>\n\t\t</MediaUploadCheck>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["imageIcon", "videoIcon", "audioIcon", "mediaIcon", "blockEditorStore", "MediaUploadCheck", "MediaReplaceFlow", "Grid"]
7
7
  }
@@ -48,15 +48,16 @@ function RichTextControl({
48
48
  data,
49
49
  field,
50
50
  hideLabelFromVision,
51
+ onChange,
51
52
  config = {}
52
53
  }) {
53
54
  const registry = (0, import_data.useRegistry)();
54
55
  const attrValue = field.getValue({ item: data });
55
56
  const fieldConfig = field.config || {};
56
- const { clientId, updateBlockAttributes } = config;
57
+ const { clientId } = config;
57
58
  const updateAttributes = (html) => {
58
59
  const mappedChanges = field.setValue({ item: data, value: html });
59
- updateBlockAttributes(clientId, mappedChanges);
60
+ onChange(mappedChanges);
60
61
  };
61
62
  const [selection, setSelection] = (0, import_element.useState)({
62
63
  start: void 0,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/content-only-controls/rich-text/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { BaseControl, useBaseControlProps } from '@wordpress/components';\nimport { useMergeRefs } from '@wordpress/compose';\nimport { useRegistry } from '@wordpress/data';\nimport { useRef, useState } from '@wordpress/element';\nimport {\n\t__unstableUseRichText as useRichText,\n\tremoveFormat,\n} from '@wordpress/rich-text';\n\n/**\n * Internal dependencies\n */\nimport { useFormatTypes } from '../../rich-text/use-format-types';\nimport { getAllowedFormats } from '../../rich-text/utils';\nimport { useEventListeners } from '../../rich-text/event-listeners';\nimport FormatEdit from '../../rich-text/format-edit';\nimport { keyboardShortcutContext, inputEventContext } from '../../rich-text';\n\nexport default function RichTextControl( {\n\tdata,\n\tfield,\n\thideLabelFromVision,\n\tconfig = {},\n} ) {\n\tconst registry = useRegistry();\n\tconst attrValue = field.getValue( { item: data } );\n\tconst fieldConfig = field.config || {};\n\tconst { clientId, updateBlockAttributes } = config;\n\tconst updateAttributes = ( html ) => {\n\t\tconst mappedChanges = field.setValue( { item: data, value: html } );\n\t\tupdateBlockAttributes( clientId, mappedChanges );\n\t};\n\tconst [ selection, setSelection ] = useState( {\n\t\tstart: undefined,\n\t\tend: undefined,\n\t} );\n\tconst [ isSelected, setIsSelected ] = useState( false );\n\tconst anchorRef = useRef();\n\tconst inputEvents = useRef( new Set() );\n\tconst keyboardShortcuts = useRef( new Set() );\n\n\tconst adjustedAllowedFormats = getAllowedFormats( {\n\t\tallowedFormats: fieldConfig?.allowedFormats,\n\t\tdisableFormats: fieldConfig?.disableFormats,\n\t} );\n\n\tconst {\n\t\tformatTypes,\n\t\tprepareHandlers,\n\t\tvalueHandlers,\n\t\tchangeHandlers,\n\t\tdependencies,\n\t} = useFormatTypes( {\n\t\tclientId,\n\t\tidentifier: field.id,\n\t\tallowedFormats: adjustedAllowedFormats,\n\t\twithoutInteractiveFormatting: fieldConfig?.withoutInteractiveFormatting,\n\t\tdisableNoneEssentialFormatting: true,\n\t} );\n\n\tfunction addEditorOnlyFormats( value ) {\n\t\treturn valueHandlers.reduce(\n\t\t\t( accumulator, fn ) => fn( accumulator, value.text ),\n\t\t\tvalue.formats\n\t\t);\n\t}\n\n\tfunction removeEditorOnlyFormats( value ) {\n\t\tformatTypes.forEach( ( formatType ) => {\n\t\t\t// Remove formats created by prepareEditableTree, because they are editor only.\n\t\t\tif ( formatType.__experimentalCreatePrepareEditableTree ) {\n\t\t\t\tvalue = removeFormat(\n\t\t\t\t\tvalue,\n\t\t\t\t\tformatType.name,\n\t\t\t\t\t0,\n\t\t\t\t\tvalue.text.length\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t\treturn value.formats;\n\t}\n\n\tfunction addInvisibleFormats( value ) {\n\t\treturn prepareHandlers.reduce(\n\t\t\t( accumulator, fn ) => fn( accumulator, value.text ),\n\t\t\tvalue.formats\n\t\t);\n\t}\n\n\tfunction onFocus() {\n\t\tanchorRef.current?.focus();\n\t}\n\n\tconst {\n\t\tvalue,\n\t\tgetValue,\n\t\tonChange: onRichTextChange,\n\t\tref: richTextRef,\n\t} = useRichText( {\n\t\tvalue: attrValue,\n\t\tonChange( html, { __unstableFormats, __unstableText } ) {\n\t\t\tupdateAttributes( html );\n\t\t\tObject.values( changeHandlers ).forEach( ( changeHandler ) => {\n\t\t\t\tchangeHandler( __unstableFormats, __unstableText );\n\t\t\t} );\n\t\t},\n\t\tselectionStart: selection.start,\n\t\tselectionEnd: selection.end,\n\t\tonSelectionChange: ( start, end ) => setSelection( { start, end } ),\n\t\t__unstableIsSelected: isSelected,\n\t\tpreserveWhiteSpace: !! fieldConfig?.preserveWhiteSpace,\n\t\tplaceholder: fieldConfig?.placeholder,\n\t\t__unstableDisableFormats: fieldConfig?.disableFormats,\n\t\t__unstableDependencies: dependencies,\n\t\t__unstableAfterParse: addEditorOnlyFormats,\n\t\t__unstableBeforeSerialize: removeEditorOnlyFormats,\n\t\t__unstableAddInvisibleFormats: addInvisibleFormats,\n\t} );\n\n\tconst { baseControlProps, controlProps } = useBaseControlProps( {\n\t\thideLabelFromVision: hideLabelFromVision ?? field.hideLabelFromVision,\n\t\tlabel: field.label,\n\t} );\n\n\treturn (\n\t\t<>\n\t\t\t{ isSelected && (\n\t\t\t\t<keyboardShortcutContext.Provider value={ keyboardShortcuts }>\n\t\t\t\t\t<inputEventContext.Provider value={ inputEvents }>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<FormatEdit\n\t\t\t\t\t\t\t\tvalue={ value }\n\t\t\t\t\t\t\t\tonChange={ onRichTextChange }\n\t\t\t\t\t\t\t\tonFocus={ onFocus }\n\t\t\t\t\t\t\t\tformatTypes={ formatTypes }\n\t\t\t\t\t\t\t\tforwardedRef={ anchorRef }\n\t\t\t\t\t\t\t\tisVisible={ false }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</inputEventContext.Provider>\n\t\t\t\t</keyboardShortcutContext.Provider>\n\t\t\t) }\n\t\t\t<BaseControl __nextHasNoMarginBottom { ...baseControlProps }>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"block-editor-content-only-controls__rich-text\"\n\t\t\t\t\trole=\"textbox\"\n\t\t\t\t\taria-multiline={ ! fieldConfig?.disableLineBreaks }\n\t\t\t\t\tref={ useMergeRefs( [\n\t\t\t\t\t\trichTextRef,\n\t\t\t\t\t\tuseEventListeners( {\n\t\t\t\t\t\t\tregistry,\n\t\t\t\t\t\t\tgetValue,\n\t\t\t\t\t\t\tonChange: onRichTextChange,\n\t\t\t\t\t\t\tformatTypes,\n\t\t\t\t\t\t\tselectionChange: setSelection,\n\t\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\t\tdisableFormats: fieldConfig?.disableFormats,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\ttagName: 'div',\n\t\t\t\t\t\t\tremoveEditorOnlyFormats,\n\t\t\t\t\t\t\tdisableLineBreaks: fieldConfig?.disableLineBreaks,\n\t\t\t\t\t\t\tkeyboardShortcuts,\n\t\t\t\t\t\t\tinputEvents,\n\t\t\t\t\t\t} ),\n\t\t\t\t\t\tanchorRef,\n\t\t\t\t\t] ) }\n\t\t\t\t\tonFocus={ () => setIsSelected( true ) }\n\t\t\t\t\tonBlur={ () => setIsSelected( false ) }\n\t\t\t\t\tcontentEditable\n\t\t\t\t\t{ ...controlProps }\n\t\t\t\t/>\n\t\t\t</BaseControl>\n\t\t</>\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { BaseControl, useBaseControlProps } from '@wordpress/components';\nimport { useMergeRefs } from '@wordpress/compose';\nimport { useRegistry } from '@wordpress/data';\nimport { useRef, useState } from '@wordpress/element';\nimport {\n\t__unstableUseRichText as useRichText,\n\tremoveFormat,\n} from '@wordpress/rich-text';\n\n/**\n * Internal dependencies\n */\nimport { useFormatTypes } from '../../rich-text/use-format-types';\nimport { getAllowedFormats } from '../../rich-text/utils';\nimport { useEventListeners } from '../../rich-text/event-listeners';\nimport FormatEdit from '../../rich-text/format-edit';\nimport { keyboardShortcutContext, inputEventContext } from '../../rich-text';\n\nexport default function RichTextControl( {\n\tdata,\n\tfield,\n\thideLabelFromVision,\n\tonChange,\n\tconfig = {},\n} ) {\n\tconst registry = useRegistry();\n\tconst attrValue = field.getValue( { item: data } );\n\tconst fieldConfig = field.config || {};\n\tconst { clientId } = config;\n\tconst updateAttributes = ( html ) => {\n\t\tconst mappedChanges = field.setValue( { item: data, value: html } );\n\t\tonChange( mappedChanges );\n\t};\n\tconst [ selection, setSelection ] = useState( {\n\t\tstart: undefined,\n\t\tend: undefined,\n\t} );\n\tconst [ isSelected, setIsSelected ] = useState( false );\n\tconst anchorRef = useRef();\n\tconst inputEvents = useRef( new Set() );\n\tconst keyboardShortcuts = useRef( new Set() );\n\n\tconst adjustedAllowedFormats = getAllowedFormats( {\n\t\tallowedFormats: fieldConfig?.allowedFormats,\n\t\tdisableFormats: fieldConfig?.disableFormats,\n\t} );\n\n\tconst {\n\t\tformatTypes,\n\t\tprepareHandlers,\n\t\tvalueHandlers,\n\t\tchangeHandlers,\n\t\tdependencies,\n\t} = useFormatTypes( {\n\t\tclientId,\n\t\tidentifier: field.id,\n\t\tallowedFormats: adjustedAllowedFormats,\n\t\twithoutInteractiveFormatting: fieldConfig?.withoutInteractiveFormatting,\n\t\tdisableNoneEssentialFormatting: true,\n\t} );\n\n\tfunction addEditorOnlyFormats( value ) {\n\t\treturn valueHandlers.reduce(\n\t\t\t( accumulator, fn ) => fn( accumulator, value.text ),\n\t\t\tvalue.formats\n\t\t);\n\t}\n\n\tfunction removeEditorOnlyFormats( value ) {\n\t\tformatTypes.forEach( ( formatType ) => {\n\t\t\t// Remove formats created by prepareEditableTree, because they are editor only.\n\t\t\tif ( formatType.__experimentalCreatePrepareEditableTree ) {\n\t\t\t\tvalue = removeFormat(\n\t\t\t\t\tvalue,\n\t\t\t\t\tformatType.name,\n\t\t\t\t\t0,\n\t\t\t\t\tvalue.text.length\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t\treturn value.formats;\n\t}\n\n\tfunction addInvisibleFormats( value ) {\n\t\treturn prepareHandlers.reduce(\n\t\t\t( accumulator, fn ) => fn( accumulator, value.text ),\n\t\t\tvalue.formats\n\t\t);\n\t}\n\n\tfunction onFocus() {\n\t\tanchorRef.current?.focus();\n\t}\n\n\tconst {\n\t\tvalue,\n\t\tgetValue,\n\t\tonChange: onRichTextChange,\n\t\tref: richTextRef,\n\t} = useRichText( {\n\t\tvalue: attrValue,\n\t\tonChange( html, { __unstableFormats, __unstableText } ) {\n\t\t\tupdateAttributes( html );\n\t\t\tObject.values( changeHandlers ).forEach( ( changeHandler ) => {\n\t\t\t\tchangeHandler( __unstableFormats, __unstableText );\n\t\t\t} );\n\t\t},\n\t\tselectionStart: selection.start,\n\t\tselectionEnd: selection.end,\n\t\tonSelectionChange: ( start, end ) => setSelection( { start, end } ),\n\t\t__unstableIsSelected: isSelected,\n\t\tpreserveWhiteSpace: !! fieldConfig?.preserveWhiteSpace,\n\t\tplaceholder: fieldConfig?.placeholder,\n\t\t__unstableDisableFormats: fieldConfig?.disableFormats,\n\t\t__unstableDependencies: dependencies,\n\t\t__unstableAfterParse: addEditorOnlyFormats,\n\t\t__unstableBeforeSerialize: removeEditorOnlyFormats,\n\t\t__unstableAddInvisibleFormats: addInvisibleFormats,\n\t} );\n\n\tconst { baseControlProps, controlProps } = useBaseControlProps( {\n\t\thideLabelFromVision: hideLabelFromVision ?? field.hideLabelFromVision,\n\t\tlabel: field.label,\n\t} );\n\n\treturn (\n\t\t<>\n\t\t\t{ isSelected && (\n\t\t\t\t<keyboardShortcutContext.Provider value={ keyboardShortcuts }>\n\t\t\t\t\t<inputEventContext.Provider value={ inputEvents }>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<FormatEdit\n\t\t\t\t\t\t\t\tvalue={ value }\n\t\t\t\t\t\t\t\tonChange={ onRichTextChange }\n\t\t\t\t\t\t\t\tonFocus={ onFocus }\n\t\t\t\t\t\t\t\tformatTypes={ formatTypes }\n\t\t\t\t\t\t\t\tforwardedRef={ anchorRef }\n\t\t\t\t\t\t\t\tisVisible={ false }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</inputEventContext.Provider>\n\t\t\t\t</keyboardShortcutContext.Provider>\n\t\t\t) }\n\t\t\t<BaseControl __nextHasNoMarginBottom { ...baseControlProps }>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"block-editor-content-only-controls__rich-text\"\n\t\t\t\t\trole=\"textbox\"\n\t\t\t\t\taria-multiline={ ! fieldConfig?.disableLineBreaks }\n\t\t\t\t\tref={ useMergeRefs( [\n\t\t\t\t\t\trichTextRef,\n\t\t\t\t\t\tuseEventListeners( {\n\t\t\t\t\t\t\tregistry,\n\t\t\t\t\t\t\tgetValue,\n\t\t\t\t\t\t\tonChange: onRichTextChange,\n\t\t\t\t\t\t\tformatTypes,\n\t\t\t\t\t\t\tselectionChange: setSelection,\n\t\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\t\tdisableFormats: fieldConfig?.disableFormats,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\ttagName: 'div',\n\t\t\t\t\t\t\tremoveEditorOnlyFormats,\n\t\t\t\t\t\t\tdisableLineBreaks: fieldConfig?.disableLineBreaks,\n\t\t\t\t\t\t\tkeyboardShortcuts,\n\t\t\t\t\t\t\tinputEvents,\n\t\t\t\t\t\t} ),\n\t\t\t\t\t\tanchorRef,\n\t\t\t\t\t] ) }\n\t\t\t\t\tonFocus={ () => setIsSelected( true ) }\n\t\t\t\t\tonBlur={ () => setIsSelected( false ) }\n\t\t\t\t\tcontentEditable\n\t\t\t\t\t{ ...controlProps }\n\t\t\t\t/>\n\t\t\t</BaseControl>\n\t\t</>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_rich_text", "value", "useRichText", "FormatEdit"]
7
7
  }
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
 
30
20
  // packages/block-editor/src/components/dimensions-tool/width-height-tool.js
@@ -33,13 +23,9 @@ __export(width_height_tool_exports, {
33
23
  default: () => WidthHeightTool
34
24
  });
35
25
  module.exports = __toCommonJS(width_height_tool_exports);
36
- var import_styled = __toESM(require("@emotion/styled"));
37
26
  var import_components = require("@wordpress/components");
38
27
  var import_i18n = require("@wordpress/i18n");
39
28
  var import_jsx_runtime = require("react/jsx-runtime");
40
- var SingleColumnToolsPanelItem = (0, import_styled.default)(import_components.__experimentalToolsPanelItem)`
41
- grid-column: span 1;
42
- `;
43
29
  function WidthHeightTool({
44
30
  panelId,
45
31
  value = {},
@@ -61,8 +47,9 @@ function WidthHeightTool({
61
47
  };
62
48
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
63
49
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
64
- SingleColumnToolsPanelItem,
50
+ import_components.__experimentalToolsPanelItem,
65
51
  {
52
+ style: { gridColumn: "span 1" },
66
53
  label: (0, import_i18n.__)("Width"),
67
54
  isShownByDefault,
68
55
  hasValue: () => width !== "",
@@ -84,8 +71,9 @@ function WidthHeightTool({
84
71
  }
85
72
  ),
86
73
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
87
- SingleColumnToolsPanelItem,
74
+ import_components.__experimentalToolsPanelItem,
88
75
  {
76
+ style: { gridColumn: "span 1" },
89
77
  label: (0, import_i18n.__)("Height"),
90
78
  isShownByDefault,
91
79
  hasValue: () => height !== "",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/dimensions-tool/width-height-tool.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport styled from '@emotion/styled';\n\n/**\n * WordPress dependencies\n */\nimport {\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalUnitControl as UnitControl,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\n\nconst SingleColumnToolsPanelItem = styled( ToolsPanelItem )`\n\tgrid-column: span 1;\n`;\n\n/**\n * @typedef {import('@wordpress/components/build-types/unit-control/types').WPUnitControlUnit} WPUnitControlUnit\n */\n\n/**\n * @typedef {Object} WidthHeightToolValue\n * @property {string} [width] Width CSS value.\n * @property {string} [height] Height CSS value.\n */\n\n/**\n * @callback WidthHeightToolOnChange\n * @param {WidthHeightToolValue} nextValue Next dimensions value.\n * @return {void}\n */\n\n/**\n * @typedef {Object} WidthHeightToolProps\n * @property {string} [panelId] ID of the panel that contains the controls.\n * @property {WidthHeightToolValue} [value] Current dimensions values.\n * @property {WidthHeightToolOnChange} [onChange] Callback to update the dimensions values.\n * @property {WPUnitControlUnit[]} [units] Units options.\n * @property {boolean} [isShownByDefault] Whether the panel is shown by default.\n */\n\n/**\n * Component that renders controls to edit the dimensions of an image or container.\n *\n * @param {WidthHeightToolProps} props The component props.\n *\n * @return {import('react').ReactElement} The width and height tool.\n */\nexport default function WidthHeightTool( {\n\tpanelId,\n\tvalue = {},\n\tonChange = () => {},\n\tunits,\n\tisShownByDefault = true,\n} ) {\n\t// null, undefined, and 'auto' all represent the default value.\n\tconst width = value.width === 'auto' ? '' : value.width ?? '';\n\tconst height = value.height === 'auto' ? '' : value.height ?? '';\n\n\tconst onDimensionChange = ( dimension ) => ( nextDimension ) => {\n\t\tconst nextValue = { ...value };\n\t\t// Empty strings or undefined may be passed and both represent removing the value.\n\t\tif ( ! nextDimension ) {\n\t\t\tdelete nextValue[ dimension ];\n\t\t} else {\n\t\t\tnextValue[ dimension ] = nextDimension;\n\t\t}\n\t\tonChange( nextValue );\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<SingleColumnToolsPanelItem\n\t\t\t\tlabel={ __( 'Width' ) }\n\t\t\t\tisShownByDefault={ isShownByDefault }\n\t\t\t\thasValue={ () => width !== '' }\n\t\t\t\tonDeselect={ onDimensionChange( 'width' ) }\n\t\t\t\tpanelId={ panelId }\n\t\t\t>\n\t\t\t\t<UnitControl\n\t\t\t\t\tlabel={ __( 'Width' ) }\n\t\t\t\t\tplaceholder={ __( 'Auto' ) }\n\t\t\t\t\tlabelPosition=\"top\"\n\t\t\t\t\tunits={ units }\n\t\t\t\t\tmin={ 0 }\n\t\t\t\t\tvalue={ width }\n\t\t\t\t\tonChange={ onDimensionChange( 'width' ) }\n\t\t\t\t\tsize=\"__unstable-large\"\n\t\t\t\t/>\n\t\t\t</SingleColumnToolsPanelItem>\n\t\t\t<SingleColumnToolsPanelItem\n\t\t\t\tlabel={ __( 'Height' ) }\n\t\t\t\tisShownByDefault={ isShownByDefault }\n\t\t\t\thasValue={ () => height !== '' }\n\t\t\t\tonDeselect={ onDimensionChange( 'height' ) }\n\t\t\t\tpanelId={ panelId }\n\t\t\t>\n\t\t\t\t<UnitControl\n\t\t\t\t\tlabel={ __( 'Height' ) }\n\t\t\t\t\tplaceholder={ __( 'Auto' ) }\n\t\t\t\t\tlabelPosition=\"top\"\n\t\t\t\t\tunits={ units }\n\t\t\t\t\tmin={ 0 }\n\t\t\t\t\tvalue={ height }\n\t\t\t\t\tonChange={ onDimensionChange( 'height' ) }\n\t\t\t\t\tsize=\"__unstable-large\"\n\t\t\t\t/>\n\t\t\t</SingleColumnToolsPanelItem>\n\t\t</>\n\t);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,oBAAmB;AAKnB,wBAGO;AACP,kBAAmB;AA6DjB;AA3DF,IAAM,iCAA6B,cAAAA,SAAQ,kBAAAC,4BAAe;AAAA;AAAA;AAoC3C,SAAR,gBAAkC;AAAA,EACxC;AAAA,EACA,QAAQ,CAAC;AAAA,EACT,WAAW,MAAM;AAAA,EAAC;AAAA,EAClB;AAAA,EACA,mBAAmB;AACpB,GAAI;AAEH,QAAM,QAAQ,MAAM,UAAU,SAAS,KAAK,MAAM,SAAS;AAC3D,QAAM,SAAS,MAAM,WAAW,SAAS,KAAK,MAAM,UAAU;AAE9D,QAAM,oBAAoB,CAAE,cAAe,CAAE,kBAAmB;AAC/D,UAAM,YAAY,EAAE,GAAG,MAAM;AAE7B,QAAK,CAAE,eAAgB;AACtB,aAAO,UAAW,SAAU;AAAA,IAC7B,OAAO;AACN,gBAAW,SAAU,IAAI;AAAA,IAC1B;AACA,aAAU,SAAU;AAAA,EACrB;AAEA,SACC,4EACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,WAAQ,gBAAI,OAAQ;AAAA,QACpB;AAAA,QACA,UAAW,MAAM,UAAU;AAAA,QAC3B,YAAa,kBAAmB,OAAQ;AAAA,QACxC;AAAA,QAEA;AAAA,UAAC,kBAAAC;AAAA,UAAA;AAAA,YACA,WAAQ,gBAAI,OAAQ;AAAA,YACpB,iBAAc,gBAAI,MAAO;AAAA,YACzB,eAAc;AAAA,YACd;AAAA,YACA,KAAM;AAAA,YACN,OAAQ;AAAA,YACR,UAAW,kBAAmB,OAAQ;AAAA,YACtC,MAAK;AAAA;AAAA,QACN;AAAA;AAAA,IACD;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,WAAQ,gBAAI,QAAS;AAAA,QACrB;AAAA,QACA,UAAW,MAAM,WAAW;AAAA,QAC5B,YAAa,kBAAmB,QAAS;AAAA,QACzC;AAAA,QAEA;AAAA,UAAC,kBAAAA;AAAA,UAAA;AAAA,YACA,WAAQ,gBAAI,QAAS;AAAA,YACrB,iBAAc,gBAAI,MAAO;AAAA,YACzB,eAAc;AAAA,YACd;AAAA,YACA,KAAM;AAAA,YACN,OAAQ;AAAA,YACR,UAAW,kBAAmB,QAAS;AAAA,YACvC,MAAK;AAAA;AAAA,QACN;AAAA;AAAA,IACD;AAAA,KACD;AAEF;",
6
- "names": ["styled", "ToolsPanelItem", "UnitControl"]
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalUnitControl as UnitControl,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * @typedef {import('@wordpress/components/build-types/unit-control/types').WPUnitControlUnit} WPUnitControlUnit\n */\n\n/**\n * @typedef {Object} WidthHeightToolValue\n * @property {string} [width] Width CSS value.\n * @property {string} [height] Height CSS value.\n */\n\n/**\n * @callback WidthHeightToolOnChange\n * @param {WidthHeightToolValue} nextValue Next dimensions value.\n * @return {void}\n */\n\n/**\n * @typedef {Object} WidthHeightToolProps\n * @property {string} [panelId] ID of the panel that contains the controls.\n * @property {WidthHeightToolValue} [value] Current dimensions values.\n * @property {WidthHeightToolOnChange} [onChange] Callback to update the dimensions values.\n * @property {WPUnitControlUnit[]} [units] Units options.\n * @property {boolean} [isShownByDefault] Whether the panel is shown by default.\n */\n\n/**\n * Component that renders controls to edit the dimensions of an image or container.\n *\n * @param {WidthHeightToolProps} props The component props.\n *\n * @return {import('react').ReactElement} The width and height tool.\n */\nexport default function WidthHeightTool( {\n\tpanelId,\n\tvalue = {},\n\tonChange = () => {},\n\tunits,\n\tisShownByDefault = true,\n} ) {\n\t// null, undefined, and 'auto' all represent the default value.\n\tconst width = value.width === 'auto' ? '' : value.width ?? '';\n\tconst height = value.height === 'auto' ? '' : value.height ?? '';\n\n\tconst onDimensionChange = ( dimension ) => ( nextDimension ) => {\n\t\tconst nextValue = { ...value };\n\t\t// Empty strings or undefined may be passed and both represent removing the value.\n\t\tif ( ! nextDimension ) {\n\t\t\tdelete nextValue[ dimension ];\n\t\t} else {\n\t\t\tnextValue[ dimension ] = nextDimension;\n\t\t}\n\t\tonChange( nextValue );\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<ToolsPanelItem\n\t\t\t\tstyle={ { gridColumn: 'span 1' } }\n\t\t\t\tlabel={ __( 'Width' ) }\n\t\t\t\tisShownByDefault={ isShownByDefault }\n\t\t\t\thasValue={ () => width !== '' }\n\t\t\t\tonDeselect={ onDimensionChange( 'width' ) }\n\t\t\t\tpanelId={ panelId }\n\t\t\t>\n\t\t\t\t<UnitControl\n\t\t\t\t\tlabel={ __( 'Width' ) }\n\t\t\t\t\tplaceholder={ __( 'Auto' ) }\n\t\t\t\t\tlabelPosition=\"top\"\n\t\t\t\t\tunits={ units }\n\t\t\t\t\tmin={ 0 }\n\t\t\t\t\tvalue={ width }\n\t\t\t\t\tonChange={ onDimensionChange( 'width' ) }\n\t\t\t\t\tsize=\"__unstable-large\"\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\t\t\t<ToolsPanelItem\n\t\t\t\tstyle={ { gridColumn: 'span 1' } }\n\t\t\t\tlabel={ __( 'Height' ) }\n\t\t\t\tisShownByDefault={ isShownByDefault }\n\t\t\t\thasValue={ () => height !== '' }\n\t\t\t\tonDeselect={ onDimensionChange( 'height' ) }\n\t\t\t\tpanelId={ panelId }\n\t\t\t>\n\t\t\t\t<UnitControl\n\t\t\t\t\tlabel={ __( 'Height' ) }\n\t\t\t\t\tplaceholder={ __( 'Auto' ) }\n\t\t\t\t\tlabelPosition=\"top\"\n\t\t\t\t\tunits={ units }\n\t\t\t\t\tmin={ 0 }\n\t\t\t\t\tvalue={ height }\n\t\t\t\t\tonChange={ onDimensionChange( 'height' ) }\n\t\t\t\t\tsize=\"__unstable-large\"\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\t\t</>\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAGO;AACP,kBAAmB;AAyDjB;AAvBa,SAAR,gBAAkC;AAAA,EACxC;AAAA,EACA,QAAQ,CAAC;AAAA,EACT,WAAW,MAAM;AAAA,EAAC;AAAA,EAClB;AAAA,EACA,mBAAmB;AACpB,GAAI;AAEH,QAAM,QAAQ,MAAM,UAAU,SAAS,KAAK,MAAM,SAAS;AAC3D,QAAM,SAAS,MAAM,WAAW,SAAS,KAAK,MAAM,UAAU;AAE9D,QAAM,oBAAoB,CAAE,cAAe,CAAE,kBAAmB;AAC/D,UAAM,YAAY,EAAE,GAAG,MAAM;AAE7B,QAAK,CAAE,eAAgB;AACtB,aAAO,UAAW,SAAU;AAAA,IAC7B,OAAO;AACN,gBAAW,SAAU,IAAI;AAAA,IAC1B;AACA,aAAU,SAAU;AAAA,EACrB;AAEA,SACC,4EACC;AAAA;AAAA,MAAC,kBAAAA;AAAA,MAAA;AAAA,QACA,OAAQ,EAAE,YAAY,SAAS;AAAA,QAC/B,WAAQ,gBAAI,OAAQ;AAAA,QACpB;AAAA,QACA,UAAW,MAAM,UAAU;AAAA,QAC3B,YAAa,kBAAmB,OAAQ;AAAA,QACxC;AAAA,QAEA;AAAA,UAAC,kBAAAC;AAAA,UAAA;AAAA,YACA,WAAQ,gBAAI,OAAQ;AAAA,YACpB,iBAAc,gBAAI,MAAO;AAAA,YACzB,eAAc;AAAA,YACd;AAAA,YACA,KAAM;AAAA,YACN,OAAQ;AAAA,YACR,UAAW,kBAAmB,OAAQ;AAAA,YACtC,MAAK;AAAA;AAAA,QACN;AAAA;AAAA,IACD;AAAA,IACA;AAAA,MAAC,kBAAAD;AAAA,MAAA;AAAA,QACA,OAAQ,EAAE,YAAY,SAAS;AAAA,QAC/B,WAAQ,gBAAI,QAAS;AAAA,QACrB;AAAA,QACA,UAAW,MAAM,WAAW;AAAA,QAC5B,YAAa,kBAAmB,QAAS;AAAA,QACzC;AAAA,QAEA;AAAA,UAAC,kBAAAC;AAAA,UAAA;AAAA,YACA,WAAQ,gBAAI,QAAS;AAAA,YACrB,iBAAc,gBAAI,MAAO;AAAA,YACzB,eAAc;AAAA,YACd;AAAA,YACA,KAAM;AAAA,YACN,OAAQ;AAAA,YACR,UAAW,kBAAmB,QAAS;AAAA,YACvC,MAAK;AAAA;AAAA,QACN;AAAA;AAAA,IACD;AAAA,KACD;AAEF;",
6
+ "names": ["ToolsPanelItem", "UnitControl"]
7
7
  }
@@ -33,11 +33,10 @@ __export(cropper_exports, {
33
33
  default: () => ImageCropper
34
34
  });
35
35
  module.exports = __toCommonJS(cropper_exports);
36
- var import_react_easy_crop = __toESM(require("react-easy-crop"));
37
36
  var import_clsx = __toESM(require("clsx"));
38
37
  var import_components = require("@wordpress/components");
39
38
  var import_compose = require("@wordpress/compose");
40
- var import_constants = require("./constants");
39
+ var import_image_cropper = require("@wordpress/image-cropper");
41
40
  var import_context = require("./context");
42
41
  var import_jsx_runtime = require("react/jsx-runtime");
43
42
  function ImageCropper({
@@ -48,17 +47,7 @@ function ImageCropper({
48
47
  naturalWidth,
49
48
  borderProps
50
49
  }) {
51
- const {
52
- isInProgress,
53
- editedUrl,
54
- position,
55
- zoom,
56
- aspect,
57
- setPosition,
58
- setCrop,
59
- setZoom,
60
- rotation
61
- } = (0, import_context.useImageEditingContext)();
50
+ const { isInProgress, editedUrl, rotation } = (0, import_context.useImageEditingContext)();
62
51
  const [contentResizeListener, { width: clientWidth }] = (0, import_compose.useResizeObserver)();
63
52
  let editedHeight = height || clientWidth * naturalHeight / naturalWidth;
64
53
  if (rotation % 180 === 90) {
@@ -80,27 +69,7 @@ function ImageCropper({
80
69
  height: editedHeight
81
70
  },
82
71
  children: [
83
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
84
- import_react_easy_crop.default,
85
- {
86
- image: editedUrl || url,
87
- disabled: isInProgress,
88
- minZoom: import_constants.MIN_ZOOM / 100,
89
- maxZoom: import_constants.MAX_ZOOM / 100,
90
- crop: position,
91
- zoom: zoom / 100,
92
- aspect,
93
- onCropChange: (pos) => {
94
- setPosition(pos);
95
- },
96
- onCropComplete: (newCropPercent) => {
97
- setCrop(newCropPercent);
98
- },
99
- onZoomChange: (newZoom) => {
100
- setZoom(newZoom * 100);
101
- }
102
- }
103
- ),
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_image_cropper.ImageCropper, { src: editedUrl || url }),
104
73
  isInProgress && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Spinner, {})
105
74
  ]
106
75
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/image-editor/cropper.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport Cropper from 'react-easy-crop';\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { Spinner } from '@wordpress/components';\nimport { useResizeObserver } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { MIN_ZOOM, MAX_ZOOM } from './constants';\n\nimport { useImageEditingContext } from './context';\n\nexport default function ImageCropper( {\n\turl,\n\twidth,\n\theight,\n\tnaturalHeight,\n\tnaturalWidth,\n\tborderProps,\n} ) {\n\tconst {\n\t\tisInProgress,\n\t\teditedUrl,\n\t\tposition,\n\t\tzoom,\n\t\taspect,\n\t\tsetPosition,\n\t\tsetCrop,\n\t\tsetZoom,\n\t\trotation,\n\t} = useImageEditingContext();\n\tconst [ contentResizeListener, { width: clientWidth } ] =\n\t\tuseResizeObserver();\n\n\tlet editedHeight = height || ( clientWidth * naturalHeight ) / naturalWidth;\n\n\tif ( rotation % 180 === 90 ) {\n\t\teditedHeight = ( clientWidth * naturalWidth ) / naturalHeight;\n\t}\n\n\tconst area = (\n\t\t<div\n\t\t\tclassName={ clsx(\n\t\t\t\t'wp-block-image__crop-area',\n\t\t\t\tborderProps?.className,\n\t\t\t\t{\n\t\t\t\t\t'is-applying': isInProgress,\n\t\t\t\t}\n\t\t\t) }\n\t\t\tstyle={ {\n\t\t\t\t...borderProps?.style,\n\t\t\t\twidth: width || clientWidth,\n\t\t\t\theight: editedHeight,\n\t\t\t} }\n\t\t>\n\t\t\t<Cropper\n\t\t\t\timage={ editedUrl || url }\n\t\t\t\tdisabled={ isInProgress }\n\t\t\t\tminZoom={ MIN_ZOOM / 100 }\n\t\t\t\tmaxZoom={ MAX_ZOOM / 100 }\n\t\t\t\tcrop={ position }\n\t\t\t\tzoom={ zoom / 100 }\n\t\t\t\taspect={ aspect }\n\t\t\t\tonCropChange={ ( pos ) => {\n\t\t\t\t\tsetPosition( pos );\n\t\t\t\t} }\n\t\t\t\tonCropComplete={ ( newCropPercent ) => {\n\t\t\t\t\tsetCrop( newCropPercent );\n\t\t\t\t} }\n\t\t\t\tonZoomChange={ ( newZoom ) => {\n\t\t\t\t\tsetZoom( newZoom * 100 );\n\t\t\t\t} }\n\t\t\t/>\n\t\t\t{ isInProgress && <Spinner /> }\n\t\t</div>\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t{ contentResizeListener }\n\t\t\t{ area }\n\t\t</>\n\t);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,6BAAoB;AACpB,kBAAiB;AAKjB,wBAAwB;AACxB,qBAAkC;AAKlC,uBAAmC;AAEnC,qBAAuC;AA+BrC;AA7Ba,SAAR,aAA+B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAI;AACH,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,QAAI,uCAAuB;AAC3B,QAAM,CAAE,uBAAuB,EAAE,OAAO,YAAY,CAAE,QACrD,kCAAkB;AAEnB,MAAI,eAAe,UAAY,cAAc,gBAAkB;AAE/D,MAAK,WAAW,QAAQ,IAAK;AAC5B,mBAAiB,cAAc,eAAiB;AAAA,EACjD;AAEA,QAAM,OACL;AAAA,IAAC;AAAA;AAAA,MACA,eAAY,YAAAA;AAAA,QACX;AAAA,QACA,aAAa;AAAA,QACb;AAAA,UACC,eAAe;AAAA,QAChB;AAAA,MACD;AAAA,MACA,OAAQ;AAAA,QACP,GAAG,aAAa;AAAA,QAChB,OAAO,SAAS;AAAA,QAChB,QAAQ;AAAA,MACT;AAAA,MAEA;AAAA;AAAA,UAAC,uBAAAC;AAAA,UAAA;AAAA,YACA,OAAQ,aAAa;AAAA,YACrB,UAAW;AAAA,YACX,SAAU,4BAAW;AAAA,YACrB,SAAU,4BAAW;AAAA,YACrB,MAAO;AAAA,YACP,MAAO,OAAO;AAAA,YACd;AAAA,YACA,cAAe,CAAE,QAAS;AACzB,0BAAa,GAAI;AAAA,YAClB;AAAA,YACA,gBAAiB,CAAE,mBAAoB;AACtC,sBAAS,cAAe;AAAA,YACzB;AAAA,YACA,cAAe,CAAE,YAAa;AAC7B,sBAAS,UAAU,GAAI;AAAA,YACxB;AAAA;AAAA,QACD;AAAA,QACE,gBAAgB,4CAAC,6BAAQ;AAAA;AAAA;AAAA,EAC5B;AAGD,SACC,4EACG;AAAA;AAAA,IACA;AAAA,KACH;AAEF;",
6
- "names": ["clsx", "Cropper"]
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { Spinner } from '@wordpress/components';\nimport { useResizeObserver } from '@wordpress/compose';\nimport { ImageCropper as ImageCropperComponent } from '@wordpress/image-cropper';\n\n/**\n * Internal dependencies\n */\nimport { useImageEditingContext } from './context';\n\nexport default function ImageCropper( {\n\turl,\n\twidth,\n\theight,\n\tnaturalHeight,\n\tnaturalWidth,\n\tborderProps,\n} ) {\n\tconst { isInProgress, editedUrl, rotation } = useImageEditingContext();\n\tconst [ contentResizeListener, { width: clientWidth } ] =\n\t\tuseResizeObserver();\n\n\tlet editedHeight = height || ( clientWidth * naturalHeight ) / naturalWidth;\n\n\tif ( rotation % 180 === 90 ) {\n\t\teditedHeight = ( clientWidth * naturalWidth ) / naturalHeight;\n\t}\n\n\tconst area = (\n\t\t<div\n\t\t\tclassName={ clsx(\n\t\t\t\t'wp-block-image__crop-area',\n\t\t\t\tborderProps?.className,\n\t\t\t\t{\n\t\t\t\t\t'is-applying': isInProgress,\n\t\t\t\t}\n\t\t\t) }\n\t\t\tstyle={ {\n\t\t\t\t...borderProps?.style,\n\t\t\t\twidth: width || clientWidth,\n\t\t\t\theight: editedHeight,\n\t\t\t} }\n\t\t>\n\t\t\t<ImageCropperComponent src={ editedUrl || url } />\n\t\t\t{ isInProgress && <Spinner /> }\n\t\t</div>\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t{ contentResizeListener }\n\t\t\t{ area }\n\t\t</>\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAKjB,wBAAwB;AACxB,qBAAkC;AAClC,2BAAsD;AAKtD,qBAAuC;AAqBrC;AAnBa,SAAR,aAA+B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAI;AACH,QAAM,EAAE,cAAc,WAAW,SAAS,QAAI,uCAAuB;AACrE,QAAM,CAAE,uBAAuB,EAAE,OAAO,YAAY,CAAE,QACrD,kCAAkB;AAEnB,MAAI,eAAe,UAAY,cAAc,gBAAkB;AAE/D,MAAK,WAAW,QAAQ,IAAK;AAC5B,mBAAiB,cAAc,eAAiB;AAAA,EACjD;AAEA,QAAM,OACL;AAAA,IAAC;AAAA;AAAA,MACA,eAAY,YAAAA;AAAA,QACX;AAAA,QACA,aAAa;AAAA,QACb;AAAA,UACC,eAAe;AAAA,QAChB;AAAA,MACD;AAAA,MACA,OAAQ;AAAA,QACP,GAAG,aAAa;AAAA,QAChB,OAAO,SAAS;AAAA,QAChB,QAAQ;AAAA,MACT;AAAA,MAEA;AAAA,oDAAC,qBAAAC,cAAA,EAAsB,KAAM,aAAa,KAAM;AAAA,QAC9C,gBAAgB,4CAAC,6BAAQ;AAAA;AAAA;AAAA,EAC5B;AAGD,SACC,4EACG;AAAA;AAAA,IACA;AAAA,KACH;AAEF;",
6
+ "names": ["clsx", "ImageCropperComponent"]
7
7
  }
@@ -34,6 +34,7 @@ __export(image_editor_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(image_editor_exports);
36
36
  var import_components = require("@wordpress/components");
37
+ var import_image_cropper = require("@wordpress/image-cropper");
37
38
  var import_aspect_ratio_dropdown = __toESM(require("./aspect-ratio-dropdown"));
38
39
  var import_block_controls = __toESM(require("../block-controls"));
39
40
  var import_context = __toESM(require("./context"));
@@ -53,7 +54,7 @@ function ImageEditor({
53
54
  onFinishEditing,
54
55
  borderProps
55
56
  }) {
56
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
57
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_image_cropper.ImageCropperProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
57
58
  import_context.default,
58
59
  {
59
60
  id,
@@ -77,13 +78,18 @@ function ImageEditor({
77
78
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_block_controls.default, { children: [
78
79
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.ToolbarGroup, { children: [
79
80
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_zoom_dropdown.default, {}),
80
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.ToolbarItem, { children: (toggleProps) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_aspect_ratio_dropdown.default, { toggleProps }) }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.ToolbarItem, { children: (toggleProps) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
82
+ import_aspect_ratio_dropdown.default,
83
+ {
84
+ toggleProps
85
+ }
86
+ ) }),
81
87
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_rotation_button.default, {})
82
88
  ] }),
83
89
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.ToolbarGroup, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_controls.default, {}) })
84
90
  ] })
85
91
  ]
86
92
  }
87
- );
93
+ ) });
88
94
  }
89
95
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/image-editor/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { ToolbarGroup, ToolbarItem } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport AspectRatioDropdown from './aspect-ratio-dropdown';\nimport BlockControls from '../block-controls';\nimport ImageEditingProvider from './context';\nimport Cropper from './cropper';\nimport ZoomDropdown from './zoom-dropdown';\nimport RotationButton from './rotation-button';\nimport FormControls from './form-controls';\n\nexport default function ImageEditor( {\n\tid,\n\turl,\n\twidth,\n\theight,\n\tnaturalHeight,\n\tnaturalWidth,\n\tonSaveImage,\n\tonFinishEditing,\n\tborderProps,\n} ) {\n\treturn (\n\t\t<ImageEditingProvider\n\t\t\tid={ id }\n\t\t\turl={ url }\n\t\t\tnaturalWidth={ naturalWidth }\n\t\t\tnaturalHeight={ naturalHeight }\n\t\t\tonSaveImage={ onSaveImage }\n\t\t\tonFinishEditing={ onFinishEditing }\n\t\t>\n\t\t\t<Cropper\n\t\t\t\tborderProps={ borderProps }\n\t\t\t\turl={ url }\n\t\t\t\twidth={ width }\n\t\t\t\theight={ height }\n\t\t\t\tnaturalHeight={ naturalHeight }\n\t\t\t\tnaturalWidth={ naturalWidth }\n\t\t\t/>\n\t\t\t<BlockControls>\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<ZoomDropdown />\n\t\t\t\t\t<ToolbarItem>\n\t\t\t\t\t\t{ ( toggleProps ) => (\n\t\t\t\t\t\t\t<AspectRatioDropdown toggleProps={ toggleProps } />\n\t\t\t\t\t\t) }\n\t\t\t\t\t</ToolbarItem>\n\t\t\t\t\t<RotationButton />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<FormControls />\n\t\t\t\t</ToolbarGroup>\n\t\t\t</BlockControls>\n\t\t</ImageEditingProvider>\n\t);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAA0C;AAK1C,mCAAgC;AAChC,4BAA0B;AAC1B,qBAAiC;AACjC,qBAAoB;AACpB,2BAAyB;AACzB,6BAA2B;AAC3B,2BAAyB;AAsBtB;AApBY,SAAR,YAA8B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAI;AACH,SACC;AAAA,IAAC,eAAAA;AAAA,IAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA;AAAA,UAAC,eAAAC;AAAA,UAAA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACD;AAAA,QACA,6CAAC,sBAAAC,SAAA,EACA;AAAA,uDAAC,kCACA;AAAA,wDAAC,qBAAAC,SAAA,EAAa;AAAA,YACd,4CAAC,iCACE,WAAE,gBACH,4CAAC,6BAAAC,SAAA,EAAoB,aAA4B,GAEnD;AAAA,YACA,4CAAC,uBAAAC,SAAA,EAAe;AAAA,aACjB;AAAA,UACA,4CAAC,kCACA,sDAAC,qBAAAC,SAAA,EAAa,GACf;AAAA,WACD;AAAA;AAAA;AAAA,EACD;AAEF;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { ToolbarGroup, ToolbarItem } from '@wordpress/components';\nimport { ImageCropperProvider } from '@wordpress/image-cropper';\n\n/**\n * Internal dependencies\n */\nimport AspectRatioDropdown from './aspect-ratio-dropdown';\nimport BlockControls from '../block-controls';\nimport ImageEditingProvider from './context';\nimport Cropper from './cropper';\nimport ZoomDropdown from './zoom-dropdown';\nimport RotationButton from './rotation-button';\nimport FormControls from './form-controls';\n\nexport default function ImageEditor( {\n\tid,\n\turl,\n\twidth,\n\theight,\n\tnaturalHeight,\n\tnaturalWidth,\n\tonSaveImage,\n\tonFinishEditing,\n\tborderProps,\n} ) {\n\treturn (\n\t\t<ImageCropperProvider>\n\t\t\t<ImageEditingProvider\n\t\t\t\tid={ id }\n\t\t\t\turl={ url }\n\t\t\t\tnaturalWidth={ naturalWidth }\n\t\t\t\tnaturalHeight={ naturalHeight }\n\t\t\t\tonSaveImage={ onSaveImage }\n\t\t\t\tonFinishEditing={ onFinishEditing }\n\t\t\t>\n\t\t\t\t<Cropper\n\t\t\t\t\tborderProps={ borderProps }\n\t\t\t\t\turl={ url }\n\t\t\t\t\twidth={ width }\n\t\t\t\t\theight={ height }\n\t\t\t\t\tnaturalHeight={ naturalHeight }\n\t\t\t\t\tnaturalWidth={ naturalWidth }\n\t\t\t\t/>\n\t\t\t\t<BlockControls>\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ZoomDropdown />\n\t\t\t\t\t\t<ToolbarItem>\n\t\t\t\t\t\t\t{ ( toggleProps ) => (\n\t\t\t\t\t\t\t\t<AspectRatioDropdown\n\t\t\t\t\t\t\t\t\ttoggleProps={ toggleProps }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</ToolbarItem>\n\t\t\t\t\t\t<RotationButton />\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<FormControls />\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t</ImageEditingProvider>\n\t\t</ImageCropperProvider>\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAA0C;AAC1C,2BAAqC;AAKrC,mCAAgC;AAChC,4BAA0B;AAC1B,qBAAiC;AACjC,qBAAoB;AACpB,2BAAyB;AACzB,6BAA2B;AAC3B,2BAAyB;AAuBrB;AArBW,SAAR,YAA8B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAI;AACH,SACC,4CAAC,6CACA;AAAA,IAAC,eAAAA;AAAA,IAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA;AAAA,UAAC,eAAAC;AAAA,UAAA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACD;AAAA,QACA,6CAAC,sBAAAC,SAAA,EACA;AAAA,uDAAC,kCACA;AAAA,wDAAC,qBAAAC,SAAA,EAAa;AAAA,YACd,4CAAC,iCACE,WAAE,gBACH;AAAA,cAAC,6BAAAC;AAAA,cAAA;AAAA,gBACA;AAAA;AAAA,YACD,GAEF;AAAA,YACA,4CAAC,uBAAAC,SAAA,EAAe;AAAA,aACjB;AAAA,UACA,4CAAC,kCACA,sDAAC,qBAAAC,SAAA,EAAa,GACf;AAAA,WACD;AAAA;AAAA;AAAA,EACD,GACD;AAEF;",
6
6
  "names": ["ImageEditingProvider", "Cropper", "BlockControls", "ZoomDropdown", "AspectRatioDropdown", "RotationButton", "FormControls"]
7
7
  }
@@ -25,32 +25,52 @@ __export(use_transform_image_exports, {
25
25
  module.exports = __toCommonJS(use_transform_image_exports);
26
26
  var import_element = require("@wordpress/element");
27
27
  var import_hooks = require("@wordpress/hooks");
28
+ var import_image_cropper = require("@wordpress/image-cropper");
28
29
  function useTransformImage({
29
30
  url,
30
31
  naturalWidth,
31
32
  naturalHeight
32
33
  }) {
33
34
  const [editedUrl, setEditedUrl] = (0, import_element.useState)();
34
- const [crop, setCrop] = (0, import_element.useState)();
35
- const [position, setPosition] = (0, import_element.useState)({ x: 0, y: 0 });
36
- const [zoom, setZoom] = (0, import_element.useState)(100);
37
- const [rotation, setRotation] = (0, import_element.useState)(0);
35
+ const { cropperState, setCropperState } = (0, import_image_cropper.useImageCropper)();
36
+ const { zoom, aspectRatio, crop, croppedArea } = cropperState;
37
+ const setZoom = (0, import_element.useCallback)(
38
+ (newZoom) => {
39
+ setCropperState({ zoom: newZoom });
40
+ },
41
+ [setCropperState]
42
+ );
43
+ const setAspectRatio = (0, import_element.useCallback)(
44
+ (newAspect) => {
45
+ setCropperState({ aspectRatio: newAspect });
46
+ },
47
+ [setCropperState]
48
+ );
38
49
  const defaultAspect = naturalWidth / naturalHeight;
39
- const [aspect, setAspect] = (0, import_element.useState)(defaultAspect);
50
+ const rotatedAspect = naturalHeight / naturalWidth;
51
+ (0, import_element.useEffect)(() => {
52
+ setAspectRatio(defaultAspect);
53
+ }, []);
54
+ const [internalRotation, setInternalRotation] = (0, import_element.useState)(0);
40
55
  const rotateClockwise = (0, import_element.useCallback)(() => {
41
- const angle = (rotation + 90) % 360;
56
+ const angle = (internalRotation + 90) % 360;
42
57
  let naturalAspectRatio = defaultAspect;
43
- if (rotation % 180 === 90) {
58
+ const isDefaultAspect = defaultAspect === aspectRatio || rotatedAspect === aspectRatio;
59
+ const shouldResetAspect = zoom !== 1 || !isDefaultAspect;
60
+ if (internalRotation % 180 === 90) {
44
61
  naturalAspectRatio = 1 / defaultAspect;
45
62
  }
46
63
  if (angle === 0) {
47
64
  setEditedUrl();
48
- setRotation(angle);
49
- setAspect(defaultAspect);
50
- setPosition((prevPosition) => ({
51
- x: -(prevPosition.y * naturalAspectRatio),
52
- y: prevPosition.x * naturalAspectRatio
53
- }));
65
+ setInternalRotation(angle);
66
+ const newAspectRatio = shouldResetAspect ? aspectRatio : defaultAspect;
67
+ setCropperState({
68
+ aspectRatio: newAspectRatio,
69
+ crop: {
70
+ x: -(crop.y * naturalAspectRatio),
71
+ y: crop.x * naturalAspectRatio
72
+ }
73
+ });
54
74
  return;
55
75
  }
56
76
  function editImage(event) {
@@ -76,12 +96,15 @@ function useTransformImage({
76
96
  context.drawImage(event.target, 0, 0);
77
97
  canvas.toBlob((blob) => {
78
98
  setEditedUrl(URL.createObjectURL(blob));
79
- setRotation(angle);
80
- setAspect(canvas.width / canvas.height);
81
- setPosition((prevPosition) => ({
82
- x: -(prevPosition.y * naturalAspectRatio),
83
- y: prevPosition.x * naturalAspectRatio
84
- }));
99
+ setInternalRotation(angle);
100
+ const newAspectRatio = shouldResetAspect ? aspectRatio : canvas.width / canvas.height;
101
+ setCropperState({
102
+ aspectRatio: newAspectRatio,
103
+ crop: {
104
+ x: -(crop.y * naturalAspectRatio),
105
+ y: crop.x * naturalAspectRatio
106
+ }
107
+ });
85
108
  });
86
109
  }
87
110
  const el = new window.Image();
@@ -95,32 +118,39 @@ function useTransformImage({
95
118
  if (typeof imgCrossOrigin === "string") {
96
119
  el.crossOrigin = imgCrossOrigin;
97
120
  }
98
- }, [rotation, defaultAspect, url]);
121
+ }, [
122
+ internalRotation,
123
+ defaultAspect,
124
+ url,
125
+ setCropperState,
126
+ crop,
127
+ zoom,
128
+ aspectRatio,
129
+ rotatedAspect,
130
+ setInternalRotation
131
+ ]);
99
132
  return (0, import_element.useMemo)(
100
133
  () => ({
101
134
  editedUrl,
102
135
  setEditedUrl,
103
- crop,
104
- setCrop,
105
- position,
106
- setPosition,
136
+ crop: croppedArea,
107
137
  zoom,
108
138
  setZoom,
109
- rotation,
110
- setRotation,
139
+ rotation: internalRotation,
111
140
  rotateClockwise,
112
- aspect,
113
- setAspect,
141
+ aspect: aspectRatio,
142
+ setAspect: setAspectRatio,
114
143
  defaultAspect
115
144
  }),
116
145
  [
117
146
  editedUrl,
118
- crop,
119
- position,
147
+ croppedArea,
120
148
  zoom,
121
- rotation,
149
+ setZoom,
150
+ internalRotation,
122
151
  rotateClockwise,
123
- aspect,
152
+ aspectRatio,
153
+ setAspectRatio,
124
154
  defaultAspect
125
155
  ]
126
156
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/image-editor/use-transform-image.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useCallback, useMemo, useState } from '@wordpress/element';\nimport { applyFilters } from '@wordpress/hooks';\n\nexport default function useTransformImage( {\n\turl,\n\tnaturalWidth,\n\tnaturalHeight,\n} ) {\n\tconst [ editedUrl, setEditedUrl ] = useState();\n\tconst [ crop, setCrop ] = useState();\n\tconst [ position, setPosition ] = useState( { x: 0, y: 0 } );\n\tconst [ zoom, setZoom ] = useState( 100 );\n\tconst [ rotation, setRotation ] = useState( 0 );\n\tconst defaultAspect = naturalWidth / naturalHeight;\n\tconst [ aspect, setAspect ] = useState( defaultAspect );\n\n\tconst rotateClockwise = useCallback( () => {\n\t\tconst angle = ( rotation + 90 ) % 360;\n\n\t\tlet naturalAspectRatio = defaultAspect;\n\n\t\tif ( rotation % 180 === 90 ) {\n\t\t\tnaturalAspectRatio = 1 / defaultAspect;\n\t\t}\n\n\t\tif ( angle === 0 ) {\n\t\t\tsetEditedUrl();\n\t\t\tsetRotation( angle );\n\t\t\tsetAspect( defaultAspect );\n\t\t\tsetPosition( ( prevPosition ) => ( {\n\t\t\t\tx: -( prevPosition.y * naturalAspectRatio ),\n\t\t\t\ty: prevPosition.x * naturalAspectRatio,\n\t\t\t} ) );\n\t\t\treturn;\n\t\t}\n\n\t\tfunction editImage( event ) {\n\t\t\tconst canvas = document.createElement( 'canvas' );\n\n\t\t\tlet translateX = 0;\n\t\t\tlet translateY = 0;\n\n\t\t\tif ( angle % 180 ) {\n\t\t\t\tcanvas.width = event.target.height;\n\t\t\t\tcanvas.height = event.target.width;\n\t\t\t} else {\n\t\t\t\tcanvas.width = event.target.width;\n\t\t\t\tcanvas.height = event.target.height;\n\t\t\t}\n\n\t\t\tif ( angle === 90 || angle === 180 ) {\n\t\t\t\ttranslateX = canvas.width;\n\t\t\t}\n\n\t\t\tif ( angle === 270 || angle === 180 ) {\n\t\t\t\ttranslateY = canvas.height;\n\t\t\t}\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\n\t\t\tcontext.translate( translateX, translateY );\n\t\t\tcontext.rotate( ( angle * Math.PI ) / 180 );\n\t\t\tcontext.drawImage( event.target, 0, 0 );\n\n\t\t\tcanvas.toBlob( ( blob ) => {\n\t\t\t\tsetEditedUrl( URL.createObjectURL( blob ) );\n\t\t\t\tsetRotation( angle );\n\t\t\t\tsetAspect( canvas.width / canvas.height );\n\t\t\t\tsetPosition( ( prevPosition ) => ( {\n\t\t\t\t\tx: -( prevPosition.y * naturalAspectRatio ),\n\t\t\t\t\ty: prevPosition.x * naturalAspectRatio,\n\t\t\t\t} ) );\n\t\t\t} );\n\t\t}\n\n\t\tconst el = new window.Image();\n\t\tel.src = url;\n\t\tel.onload = editImage;\n\n\t\tconst imgCrossOrigin = applyFilters(\n\t\t\t'media.crossOrigin',\n\t\t\tundefined,\n\t\t\turl\n\t\t);\n\t\tif ( typeof imgCrossOrigin === 'string' ) {\n\t\t\tel.crossOrigin = imgCrossOrigin;\n\t\t}\n\t}, [ rotation, defaultAspect, url ] );\n\n\treturn useMemo(\n\t\t() => ( {\n\t\t\teditedUrl,\n\t\t\tsetEditedUrl,\n\t\t\tcrop,\n\t\t\tsetCrop,\n\t\t\tposition,\n\t\t\tsetPosition,\n\t\t\tzoom,\n\t\t\tsetZoom,\n\t\t\trotation,\n\t\t\tsetRotation,\n\t\t\trotateClockwise,\n\t\t\taspect,\n\t\t\tsetAspect,\n\t\t\tdefaultAspect,\n\t\t} ),\n\t\t[\n\t\t\teditedUrl,\n\t\t\tcrop,\n\t\t\tposition,\n\t\t\tzoom,\n\t\t\trotation,\n\t\t\trotateClockwise,\n\t\t\taspect,\n\t\t\tdefaultAspect,\n\t\t]\n\t);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAA+C;AAC/C,mBAA6B;AAEd,SAAR,kBAAoC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACD,GAAI;AACH,QAAM,CAAE,WAAW,YAAa,QAAI,yBAAS;AAC7C,QAAM,CAAE,MAAM,OAAQ,QAAI,yBAAS;AACnC,QAAM,CAAE,UAAU,WAAY,QAAI,yBAAU,EAAE,GAAG,GAAG,GAAG,EAAE,CAAE;AAC3D,QAAM,CAAE,MAAM,OAAQ,QAAI,yBAAU,GAAI;AACxC,QAAM,CAAE,UAAU,WAAY,QAAI,yBAAU,CAAE;AAC9C,QAAM,gBAAgB,eAAe;AACrC,QAAM,CAAE,QAAQ,SAAU,QAAI,yBAAU,aAAc;AAEtD,QAAM,sBAAkB,4BAAa,MAAM;AAC1C,UAAM,SAAU,WAAW,MAAO;AAElC,QAAI,qBAAqB;AAEzB,QAAK,WAAW,QAAQ,IAAK;AAC5B,2BAAqB,IAAI;AAAA,IAC1B;AAEA,QAAK,UAAU,GAAI;AAClB,mBAAa;AACb,kBAAa,KAAM;AACnB,gBAAW,aAAc;AACzB,kBAAa,CAAE,kBAAoB;AAAA,QAClC,GAAG,EAAG,aAAa,IAAI;AAAA,QACvB,GAAG,aAAa,IAAI;AAAA,MACrB,EAAI;AACJ;AAAA,IACD;AAEA,aAAS,UAAW,OAAQ;AAC3B,YAAM,SAAS,SAAS,cAAe,QAAS;AAEhD,UAAI,aAAa;AACjB,UAAI,aAAa;AAEjB,UAAK,QAAQ,KAAM;AAClB,eAAO,QAAQ,MAAM,OAAO;AAC5B,eAAO,SAAS,MAAM,OAAO;AAAA,MAC9B,OAAO;AACN,eAAO,QAAQ,MAAM,OAAO;AAC5B,eAAO,SAAS,MAAM,OAAO;AAAA,MAC9B;AAEA,UAAK,UAAU,MAAM,UAAU,KAAM;AACpC,qBAAa,OAAO;AAAA,MACrB;AAEA,UAAK,UAAU,OAAO,UAAU,KAAM;AACrC,qBAAa,OAAO;AAAA,MACrB;AAEA,YAAM,UAAU,OAAO,WAAY,IAAK;AAExC,cAAQ,UAAW,YAAY,UAAW;AAC1C,cAAQ,OAAU,QAAQ,KAAK,KAAO,GAAI;AAC1C,cAAQ,UAAW,MAAM,QAAQ,GAAG,CAAE;AAEtC,aAAO,OAAQ,CAAE,SAAU;AAC1B,qBAAc,IAAI,gBAAiB,IAAK,CAAE;AAC1C,oBAAa,KAAM;AACnB,kBAAW,OAAO,QAAQ,OAAO,MAAO;AACxC,oBAAa,CAAE,kBAAoB;AAAA,UAClC,GAAG,EAAG,aAAa,IAAI;AAAA,UACvB,GAAG,aAAa,IAAI;AAAA,QACrB,EAAI;AAAA,MACL,CAAE;AAAA,IACH;AAEA,UAAM,KAAK,IAAI,OAAO,MAAM;AAC5B,OAAG,MAAM;AACT,OAAG,SAAS;AAEZ,UAAM,qBAAiB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,QAAK,OAAO,mBAAmB,UAAW;AACzC,SAAG,cAAc;AAAA,IAClB;AAAA,EACD,GAAG,CAAE,UAAU,eAAe,GAAI,CAAE;AAEpC,aAAO;AAAA,IACN,OAAQ;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useCallback, useEffect, useMemo, useState } from '@wordpress/element';\nimport { applyFilters } from '@wordpress/hooks';\nimport { useImageCropper } from '@wordpress/image-cropper';\n\nexport default function useTransformImage( {\n\turl,\n\tnaturalWidth,\n\tnaturalHeight,\n} ) {\n\tconst [ editedUrl, setEditedUrl ] = useState();\n\tconst { cropperState, setCropperState } = useImageCropper();\n\tconst { zoom, aspectRatio, crop, croppedArea } = cropperState;\n\n\tconst setZoom = useCallback(\n\t\t( newZoom ) => {\n\t\t\tsetCropperState( { zoom: newZoom } );\n\t\t},\n\t\t[ setCropperState ]\n\t);\n\n\tconst setAspectRatio = useCallback(\n\t\t( newAspect ) => {\n\t\t\tsetCropperState( { aspectRatio: newAspect } );\n\t\t},\n\t\t[ setCropperState ]\n\t);\n\n\tconst defaultAspect = naturalWidth / naturalHeight;\n\tconst rotatedAspect = naturalHeight / naturalWidth;\n\n\t// Initialize aspect ratio on mount or when defaultAspect changes\n\tuseEffect( () => {\n\t\tsetAspectRatio( defaultAspect );\n\t}, [] ); // eslint-disable-line react-hooks/exhaustive-deps\n\n\t/**\n\t * rotateClockwise rotates the image by 90\u00B0 clockwise by drawing the original image onto a canvas with rotation applied,\n\t * then saves it as a new blob URL (editedUrl).\n\t * This creates a new rotated image file, bypassing the image-cropper\u2019s CSS transform rotation.\n\t * It's a bespoke solution to ensure that the rotated image fills the content width.\n\t */\n\tconst [ internalRotation, setInternalRotation ] = useState( 0 );\n\tconst rotateClockwise = useCallback( () => {\n\t\tconst angle = ( internalRotation + 90 ) % 360;\n\n\t\tlet naturalAspectRatio = defaultAspect;\n\t\tconst isDefaultAspect =\n\t\t\tdefaultAspect === aspectRatio || rotatedAspect === aspectRatio;\n\t\tconst shouldResetAspect = zoom !== 1 || ! isDefaultAspect;\n\n\t\tif ( internalRotation % 180 === 90 ) {\n\t\t\tnaturalAspectRatio = 1 / defaultAspect;\n\t\t}\n\n\t\tif ( angle === 0 ) {\n\t\t\tsetEditedUrl();\n\t\t\tsetInternalRotation( angle );\n\t\t\tconst newAspectRatio = shouldResetAspect\n\t\t\t\t? aspectRatio\n\t\t\t\t: defaultAspect;\n\t\t\tsetCropperState( {\n\t\t\t\taspectRatio: newAspectRatio,\n\t\t\t\tcrop: {\n\t\t\t\t\tx: -( crop.y * naturalAspectRatio ),\n\t\t\t\t\ty: crop.x * naturalAspectRatio,\n\t\t\t\t},\n\t\t\t} );\n\t\t\treturn;\n\t\t}\n\n\t\tfunction editImage( event ) {\n\t\t\tconst canvas = document.createElement( 'canvas' );\n\n\t\t\tlet translateX = 0;\n\t\t\tlet translateY = 0;\n\n\t\t\tif ( angle % 180 ) {\n\t\t\t\tcanvas.width = event.target.height;\n\t\t\t\tcanvas.height = event.target.width;\n\t\t\t} else {\n\t\t\t\tcanvas.width = event.target.width;\n\t\t\t\tcanvas.height = event.target.height;\n\t\t\t}\n\n\t\t\tif ( angle === 90 || angle === 180 ) {\n\t\t\t\ttranslateX = canvas.width;\n\t\t\t}\n\n\t\t\tif ( angle === 270 || angle === 180 ) {\n\t\t\t\ttranslateY = canvas.height;\n\t\t\t}\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\n\t\t\tcontext.translate( translateX, translateY );\n\t\t\tcontext.rotate( ( angle * Math.PI ) / 180 );\n\t\t\tcontext.drawImage( event.target, 0, 0 );\n\n\t\t\tcanvas.toBlob( ( blob ) => {\n\t\t\t\tsetEditedUrl( URL.createObjectURL( blob ) );\n\t\t\t\tsetInternalRotation( angle );\n\t\t\t\tconst newAspectRatio = shouldResetAspect\n\t\t\t\t\t? aspectRatio\n\t\t\t\t\t: canvas.width / canvas.height;\n\t\t\t\tsetCropperState( {\n\t\t\t\t\taspectRatio: newAspectRatio,\n\t\t\t\t\tcrop: {\n\t\t\t\t\t\tx: -( crop.y * naturalAspectRatio ),\n\t\t\t\t\t\ty: crop.x * naturalAspectRatio,\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t} );\n\t\t}\n\n\t\tconst el = new window.Image();\n\t\tel.src = url;\n\t\tel.onload = editImage;\n\n\t\tconst imgCrossOrigin = applyFilters(\n\t\t\t'media.crossOrigin',\n\t\t\tundefined,\n\t\t\turl\n\t\t);\n\t\tif ( typeof imgCrossOrigin === 'string' ) {\n\t\t\tel.crossOrigin = imgCrossOrigin;\n\t\t}\n\t}, [\n\t\tinternalRotation,\n\t\tdefaultAspect,\n\t\turl,\n\t\tsetCropperState,\n\t\tcrop,\n\t\tzoom,\n\t\taspectRatio,\n\t\trotatedAspect,\n\t\tsetInternalRotation,\n\t] );\n\n\treturn useMemo(\n\t\t() => ( {\n\t\t\teditedUrl,\n\t\t\tsetEditedUrl,\n\t\t\tcrop: croppedArea,\n\t\t\tzoom,\n\t\t\tsetZoom,\n\t\t\trotation: internalRotation,\n\t\t\trotateClockwise,\n\t\t\taspect: aspectRatio,\n\t\t\tsetAspect: setAspectRatio,\n\t\t\tdefaultAspect,\n\t\t} ),\n\t\t[\n\t\t\teditedUrl,\n\t\t\tcroppedArea,\n\t\t\tzoom,\n\t\t\tsetZoom,\n\t\t\tinternalRotation,\n\t\t\trotateClockwise,\n\t\t\taspectRatio,\n\t\t\tsetAspectRatio,\n\t\t\tdefaultAspect,\n\t\t]\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAA0D;AAC1D,mBAA6B;AAC7B,2BAAgC;AAEjB,SAAR,kBAAoC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACD,GAAI;AACH,QAAM,CAAE,WAAW,YAAa,QAAI,yBAAS;AAC7C,QAAM,EAAE,cAAc,gBAAgB,QAAI,sCAAgB;AAC1D,QAAM,EAAE,MAAM,aAAa,MAAM,YAAY,IAAI;AAEjD,QAAM,cAAU;AAAA,IACf,CAAE,YAAa;AACd,sBAAiB,EAAE,MAAM,QAAQ,CAAE;AAAA,IACpC;AAAA,IACA,CAAE,eAAgB;AAAA,EACnB;AAEA,QAAM,qBAAiB;AAAA,IACtB,CAAE,cAAe;AAChB,sBAAiB,EAAE,aAAa,UAAU,CAAE;AAAA,IAC7C;AAAA,IACA,CAAE,eAAgB;AAAA,EACnB;AAEA,QAAM,gBAAgB,eAAe;AACrC,QAAM,gBAAgB,gBAAgB;AAGtC,gCAAW,MAAM;AAChB,mBAAgB,aAAc;AAAA,EAC/B,GAAG,CAAC,CAAE;AAQN,QAAM,CAAE,kBAAkB,mBAAoB,QAAI,yBAAU,CAAE;AAC9D,QAAM,sBAAkB,4BAAa,MAAM;AAC1C,UAAM,SAAU,mBAAmB,MAAO;AAE1C,QAAI,qBAAqB;AACzB,UAAM,kBACL,kBAAkB,eAAe,kBAAkB;AACpD,UAAM,oBAAoB,SAAS,KAAK,CAAE;AAE1C,QAAK,mBAAmB,QAAQ,IAAK;AACpC,2BAAqB,IAAI;AAAA,IAC1B;AAEA,QAAK,UAAU,GAAI;AAClB,mBAAa;AACb,0BAAqB,KAAM;AAC3B,YAAM,iBAAiB,oBACpB,cACA;AACH,sBAAiB;AAAA,QAChB,aAAa;AAAA,QACb,MAAM;AAAA,UACL,GAAG,EAAG,KAAK,IAAI;AAAA,UACf,GAAG,KAAK,IAAI;AAAA,QACb;AAAA,MACD,CAAE;AACF;AAAA,IACD;AAEA,aAAS,UAAW,OAAQ;AAC3B,YAAM,SAAS,SAAS,cAAe,QAAS;AAEhD,UAAI,aAAa;AACjB,UAAI,aAAa;AAEjB,UAAK,QAAQ,KAAM;AAClB,eAAO,QAAQ,MAAM,OAAO;AAC5B,eAAO,SAAS,MAAM,OAAO;AAAA,MAC9B,OAAO;AACN,eAAO,QAAQ,MAAM,OAAO;AAC5B,eAAO,SAAS,MAAM,OAAO;AAAA,MAC9B;AAEA,UAAK,UAAU,MAAM,UAAU,KAAM;AACpC,qBAAa,OAAO;AAAA,MACrB;AAEA,UAAK,UAAU,OAAO,UAAU,KAAM;AACrC,qBAAa,OAAO;AAAA,MACrB;AAEA,YAAM,UAAU,OAAO,WAAY,IAAK;AAExC,cAAQ,UAAW,YAAY,UAAW;AAC1C,cAAQ,OAAU,QAAQ,KAAK,KAAO,GAAI;AAC1C,cAAQ,UAAW,MAAM,QAAQ,GAAG,CAAE;AAEtC,aAAO,OAAQ,CAAE,SAAU;AAC1B,qBAAc,IAAI,gBAAiB,IAAK,CAAE;AAC1C,4BAAqB,KAAM;AAC3B,cAAM,iBAAiB,oBACpB,cACA,OAAO,QAAQ,OAAO;AACzB,wBAAiB;AAAA,UAChB,aAAa;AAAA,UACb,MAAM;AAAA,YACL,GAAG,EAAG,KAAK,IAAI;AAAA,YACf,GAAG,KAAK,IAAI;AAAA,UACb;AAAA,QACD,CAAE;AAAA,MACH,CAAE;AAAA,IACH;AAEA,UAAM,KAAK,IAAI,OAAO,MAAM;AAC5B,OAAG,MAAM;AACT,OAAG,SAAS;AAEZ,UAAM,qBAAiB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,QAAK,OAAO,mBAAmB,UAAW;AACzC,SAAG,cAAc;AAAA,IAClB;AAAA,EACD,GAAG;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAE;AAEF,aAAO;AAAA,IACN,OAAQ;AAAA,MACP;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR,WAAW;AAAA,MACX;AAAA,IACD;AAAA,IACA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;",
6
6
  "names": []
7
7
  }
@@ -54,8 +54,8 @@ function ZoomDropdown() {
54
54
  label: (0, import_i18n.__)("Zoom"),
55
55
  min: import_constants.MIN_ZOOM,
56
56
  max: import_constants.MAX_ZOOM,
57
- value: Math.round(zoom),
58
- onChange: setZoom
57
+ value: Math.round(zoom * 100),
58
+ onChange: (newZoom) => setZoom(newZoom / 100)
59
59
  }
60
60
  ) })
61
61
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/image-editor/zoom-dropdown.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tToolbarButton,\n\tRangeControl,\n\tDropdown,\n\t__experimentalDropdownContentWrapper as DropdownContentWrapper,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { search } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport { MIN_ZOOM, MAX_ZOOM, POPOVER_PROPS } from './constants';\nimport { useImageEditingContext } from './context';\n\nexport default function ZoomDropdown() {\n\tconst { isInProgress, zoom, setZoom } = useImageEditingContext();\n\treturn (\n\t\t<Dropdown\n\t\t\tcontentClassName=\"wp-block-image__zoom\"\n\t\t\tpopoverProps={ POPOVER_PROPS }\n\t\t\trenderToggle={ ( { isOpen, onToggle } ) => (\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ticon={ search }\n\t\t\t\t\tlabel={ __( 'Zoom' ) }\n\t\t\t\t\tonClick={ onToggle }\n\t\t\t\t\taria-expanded={ isOpen }\n\t\t\t\t\tdisabled={ isInProgress }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\trenderContent={ () => (\n\t\t\t\t<DropdownContentWrapper paddingSize=\"medium\">\n\t\t\t\t\t<RangeControl\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\tlabel={ __( 'Zoom' ) }\n\t\t\t\t\t\tmin={ MIN_ZOOM }\n\t\t\t\t\t\tmax={ MAX_ZOOM }\n\t\t\t\t\t\tvalue={ Math.round( zoom ) }\n\t\t\t\t\t\tonChange={ setZoom }\n\t\t\t\t\t/>\n\t\t\t\t</DropdownContentWrapper>\n\t\t\t) }\n\t\t/>\n\t);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAKO;AACP,kBAAmB;AACnB,mBAAuB;AAKvB,uBAAkD;AAClD,qBAAuC;AASnC;AAPW,SAAR,eAAgC;AACtC,QAAM,EAAE,cAAc,MAAM,QAAQ,QAAI,uCAAuB;AAC/D,SACC;AAAA,IAAC;AAAA;AAAA,MACA,kBAAiB;AAAA,MACjB,cAAe;AAAA,MACf,cAAe,CAAE,EAAE,QAAQ,SAAS,MACnC;AAAA,QAAC;AAAA;AAAA,UACA,MAAO;AAAA,UACP,WAAQ,gBAAI,MAAO;AAAA,UACnB,SAAU;AAAA,UACV,iBAAgB;AAAA,UAChB,UAAW;AAAA;AAAA,MACZ;AAAA,MAED,eAAgB,MACf,4CAAC,kBAAAA,sCAAA,EAAuB,aAAY,UACnC;AAAA,QAAC;AAAA;AAAA,UACA,uBAAqB;AAAA,UACrB,yBAAuB;AAAA,UACvB,WAAQ,gBAAI,MAAO;AAAA,UACnB,KAAM;AAAA,UACN,KAAM;AAAA,UACN,OAAQ,KAAK,MAAO,IAAK;AAAA,UACzB,UAAW;AAAA;AAAA,MACZ,GACD;AAAA;AAAA,EAEF;AAEF;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tToolbarButton,\n\tRangeControl,\n\tDropdown,\n\t__experimentalDropdownContentWrapper as DropdownContentWrapper,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { search } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport { MIN_ZOOM, MAX_ZOOM, POPOVER_PROPS } from './constants';\nimport { useImageEditingContext } from './context';\n\nexport default function ZoomDropdown() {\n\tconst { isInProgress, zoom, setZoom } = useImageEditingContext();\n\treturn (\n\t\t<Dropdown\n\t\t\tcontentClassName=\"wp-block-image__zoom\"\n\t\t\tpopoverProps={ POPOVER_PROPS }\n\t\t\trenderToggle={ ( { isOpen, onToggle } ) => (\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ticon={ search }\n\t\t\t\t\tlabel={ __( 'Zoom' ) }\n\t\t\t\t\tonClick={ onToggle }\n\t\t\t\t\taria-expanded={ isOpen }\n\t\t\t\t\tdisabled={ isInProgress }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\trenderContent={ () => (\n\t\t\t\t<DropdownContentWrapper paddingSize=\"medium\">\n\t\t\t\t\t<RangeControl\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\tlabel={ __( 'Zoom' ) }\n\t\t\t\t\t\tmin={ MIN_ZOOM }\n\t\t\t\t\t\tmax={ MAX_ZOOM }\n\t\t\t\t\t\tvalue={ Math.round( zoom * 100 ) }\n\t\t\t\t\t\tonChange={ ( newZoom ) => setZoom( newZoom / 100 ) }\n\t\t\t\t\t/>\n\t\t\t\t</DropdownContentWrapper>\n\t\t\t) }\n\t\t/>\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAKO;AACP,kBAAmB;AACnB,mBAAuB;AAKvB,uBAAkD;AAClD,qBAAuC;AASnC;AAPW,SAAR,eAAgC;AACtC,QAAM,EAAE,cAAc,MAAM,QAAQ,QAAI,uCAAuB;AAC/D,SACC;AAAA,IAAC;AAAA;AAAA,MACA,kBAAiB;AAAA,MACjB,cAAe;AAAA,MACf,cAAe,CAAE,EAAE,QAAQ,SAAS,MACnC;AAAA,QAAC;AAAA;AAAA,UACA,MAAO;AAAA,UACP,WAAQ,gBAAI,MAAO;AAAA,UACnB,SAAU;AAAA,UACV,iBAAgB;AAAA,UAChB,UAAW;AAAA;AAAA,MACZ;AAAA,MAED,eAAgB,MACf,4CAAC,kBAAAA,sCAAA,EAAuB,aAAY,UACnC;AAAA,QAAC;AAAA;AAAA,UACA,uBAAqB;AAAA,UACrB,yBAAuB;AAAA,UACvB,WAAQ,gBAAI,MAAO;AAAA,UACnB,KAAM;AAAA,UACN,KAAM;AAAA,UACN,OAAQ,KAAK,MAAO,OAAO,GAAI;AAAA,UAC/B,UAAW,CAAE,YAAa,QAAS,UAAU,GAAI;AAAA;AAAA,MAClD,GACD;AAAA;AAAA,EAEF;AAEF;",
6
6
  "names": ["DropdownContentWrapper"]
7
7
  }