@wordpress/block-editor 12.3.1 → 12.3.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 (102) hide show
  1. package/README.md +1 -0
  2. package/build/components/block-lock/toolbar.js +25 -6
  3. package/build/components/block-lock/toolbar.js.map +1 -1
  4. package/build/components/block-toolbar/index.js +8 -5
  5. package/build/components/block-toolbar/index.js.map +1 -1
  6. package/build/components/dimensions-tool/aspect-ratio-tool.js +99 -0
  7. package/build/components/dimensions-tool/aspect-ratio-tool.js.map +1 -0
  8. package/build/components/dimensions-tool/index.js +207 -0
  9. package/build/components/dimensions-tool/index.js.map +1 -0
  10. package/build/components/dimensions-tool/scale-tool.js +111 -0
  11. package/build/components/dimensions-tool/scale-tool.js.map +1 -0
  12. package/build/components/dimensions-tool/width-height-tool.js +125 -0
  13. package/build/components/dimensions-tool/width-height-tool.js.map +1 -0
  14. package/build/components/image-editor/aspect-ratio-dropdown.js +1 -1
  15. package/build/components/image-editor/aspect-ratio-dropdown.js.map +1 -1
  16. package/build/components/image-editor/use-save-image.js +1 -2
  17. package/build/components/image-editor/use-save-image.js.map +1 -1
  18. package/build/components/image-size-control/index.js +6 -0
  19. package/build/components/image-size-control/index.js.map +1 -1
  20. package/build/components/link-control/index.js +17 -15
  21. package/build/components/link-control/index.js.map +1 -1
  22. package/build/components/link-control/search-input.js +4 -4
  23. package/build/components/link-control/search-input.js.map +1 -1
  24. package/build/components/link-control/settings-drawer.js +2 -3
  25. package/build/components/link-control/settings-drawer.js.map +1 -1
  26. package/build/components/provider/use-block-sync.js +21 -0
  27. package/build/components/provider/use-block-sync.js.map +1 -1
  28. package/build/components/resolution-tool/index.js +55 -0
  29. package/build/components/resolution-tool/index.js.map +1 -0
  30. package/build/components/url-input/index.js +4 -2
  31. package/build/components/url-input/index.js.map +1 -1
  32. package/build/private-apis.js +7 -1
  33. package/build/private-apis.js.map +1 -1
  34. package/build/store/defaults.js +1 -0
  35. package/build/store/defaults.js.map +1 -1
  36. package/build-module/components/block-lock/toolbar.js +25 -7
  37. package/build-module/components/block-lock/toolbar.js.map +1 -1
  38. package/build-module/components/block-toolbar/index.js +8 -5
  39. package/build-module/components/block-toolbar/index.js.map +1 -1
  40. package/build-module/components/dimensions-tool/aspect-ratio-tool.js +87 -0
  41. package/build-module/components/dimensions-tool/aspect-ratio-tool.js.map +1 -0
  42. package/build-module/components/dimensions-tool/index.js +195 -0
  43. package/build-module/components/dimensions-tool/index.js.map +1 -0
  44. package/build-module/components/dimensions-tool/scale-tool.js +103 -0
  45. package/build-module/components/dimensions-tool/scale-tool.js.map +1 -0
  46. package/build-module/components/dimensions-tool/width-height-tool.js +122 -0
  47. package/build-module/components/dimensions-tool/width-height-tool.js.map +1 -0
  48. package/build-module/components/image-editor/aspect-ratio-dropdown.js +1 -1
  49. package/build-module/components/image-editor/aspect-ratio-dropdown.js.map +1 -1
  50. package/build-module/components/image-editor/use-save-image.js +1 -2
  51. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  52. package/build-module/components/image-size-control/index.js +5 -0
  53. package/build-module/components/image-size-control/index.js.map +1 -1
  54. package/build-module/components/link-control/index.js +17 -15
  55. package/build-module/components/link-control/index.js.map +1 -1
  56. package/build-module/components/link-control/search-input.js +4 -4
  57. package/build-module/components/link-control/search-input.js.map +1 -1
  58. package/build-module/components/link-control/settings-drawer.js +4 -5
  59. package/build-module/components/link-control/settings-drawer.js.map +1 -1
  60. package/build-module/components/provider/use-block-sync.js +21 -0
  61. package/build-module/components/provider/use-block-sync.js.map +1 -1
  62. package/build-module/components/resolution-tool/index.js +45 -0
  63. package/build-module/components/resolution-tool/index.js.map +1 -0
  64. package/build-module/components/url-input/index.js +4 -2
  65. package/build-module/components/url-input/index.js.map +1 -1
  66. package/build-module/private-apis.js +5 -1
  67. package/build-module/private-apis.js.map +1 -1
  68. package/build-module/store/defaults.js +1 -0
  69. package/build-module/store/defaults.js.map +1 -1
  70. package/build-style/style-rtl.css +42 -46
  71. package/build-style/style.css +42 -46
  72. package/package.json +6 -5
  73. package/src/components/alignment-control/test/__snapshots__/index.js.snap +6 -6
  74. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +5 -5
  75. package/src/components/block-lock/toolbar.js +34 -6
  76. package/src/components/block-toolbar/index.js +9 -6
  77. package/src/components/block-tools/style.scss +4 -0
  78. package/src/components/dimensions-tool/aspect-ratio-tool.js +124 -0
  79. package/src/components/dimensions-tool/index.js +212 -0
  80. package/src/components/dimensions-tool/scale-tool.js +124 -0
  81. package/src/components/dimensions-tool/stories/aspect-ratio-tool.js +52 -0
  82. package/src/components/dimensions-tool/stories/index.js +54 -0
  83. package/src/components/dimensions-tool/stories/scale-tool.js +48 -0
  84. package/src/components/dimensions-tool/stories/width-height-tool.js +54 -0
  85. package/src/components/dimensions-tool/test/index.js +641 -0
  86. package/src/components/dimensions-tool/width-height-tool.js +113 -0
  87. package/src/components/image-editor/aspect-ratio-dropdown.js +1 -1
  88. package/src/components/image-editor/use-save-image.js +0 -1
  89. package/src/components/image-size-control/index.js +6 -0
  90. package/src/components/link-control/index.js +32 -28
  91. package/src/components/link-control/search-input.js +4 -3
  92. package/src/components/link-control/settings-drawer.js +6 -5
  93. package/src/components/link-control/style.scss +33 -55
  94. package/src/components/link-control/test/index.js +129 -116
  95. package/src/components/media-replace-flow/test/index.js +1 -1
  96. package/src/components/provider/test/use-block-sync.js +21 -6
  97. package/src/components/provider/use-block-sync.js +19 -0
  98. package/src/components/resolution-tool/index.js +56 -0
  99. package/src/components/resolution-tool/stories/index.js +48 -0
  100. package/src/components/url-input/index.js +2 -0
  101. package/src/private-apis.js +4 -0
  102. package/src/store/defaults.js +1 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/toolbar.js"],"names":["__","ToolbarButton","ToolbarGroup","useReducer","lock","BlockLockModal","useBlockLock","BlockLockToolbar","clientId","canEdit","canMove","canRemove","canLock","isModalOpen","toggleModal","isActive"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,QAAmB,iBAAnB;AACA,SAASC,aAAT,EAAwBC,YAAxB,QAA4C,uBAA5C;AACA,SAASC,UAAT,QAA2B,oBAA3B;AACA,SAASC,IAAT,QAAqB,kBAArB;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,SAA3B;AACA,OAAOC,YAAP,MAAyB,kBAAzB;AAEA,eAAe,SAASC,gBAAT,CAA2B;AAAEC,EAAAA;AAAF,CAA3B,EAA0C;AACxD,QAAM;AAAEC,IAAAA,OAAF;AAAWC,IAAAA,OAAX;AAAoBC,IAAAA,SAApB;AAA+BC,IAAAA;AAA/B,MAA2CN,YAAY,CAAEE,QAAF,CAA7D;AAEA,QAAM,CAAEK,WAAF,EAAeC,WAAf,IAA+BX,UAAU,CAC5CY,QAAF,IAAgB,CAAEA,QAD4B,EAE9C,KAF8C,CAA/C;;AAKA,MAAK,CAAEH,OAAP,EAAiB;AAChB,WAAO,IAAP;AACA;;AAED,MAAKH,OAAO,IAAIC,OAAX,IAAsBC,SAA3B,EAAuC;AACtC,WAAO,IAAP;AACA;;AAED,SACC,8BACC,cAAC,YAAD;AAAc,IAAA,SAAS,EAAC;AAAxB,KACC,cAAC,aAAD;AACC,IAAA,IAAI,EAAGP,IADR;AAEC,IAAA,KAAK,EAAGJ,EAAE,CAAE,QAAF,CAFX;AAGC,IAAA,OAAO,EAAGc;AAHX,IADD,CADD,EAQGD,WAAW,IACZ,cAAC,cAAD;AAAgB,IAAA,QAAQ,EAAGL,QAA3B;AAAsC,IAAA,OAAO,EAAGM;AAAhD,IATF,CADD;AAcA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { ToolbarButton, ToolbarGroup } from '@wordpress/components';\nimport { useReducer } from '@wordpress/element';\nimport { lock } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport BlockLockModal from './modal';\nimport useBlockLock from './use-block-lock';\n\nexport default function BlockLockToolbar( { clientId } ) {\n\tconst { canEdit, canMove, canRemove, canLock } = useBlockLock( clientId );\n\n\tconst [ isModalOpen, toggleModal ] = useReducer(\n\t\t( isActive ) => ! isActive,\n\t\tfalse\n\t);\n\n\tif ( ! canLock ) {\n\t\treturn null;\n\t}\n\n\tif ( canEdit && canMove && canRemove ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<ToolbarGroup className=\"block-editor-block-lock-toolbar\">\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ticon={ lock }\n\t\t\t\t\tlabel={ __( 'Unlock' ) }\n\t\t\t\t\tonClick={ toggleModal }\n\t\t\t\t/>\n\t\t\t</ToolbarGroup>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<BlockLockModal clientId={ clientId } onClose={ toggleModal } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-lock/toolbar.js"],"names":["__","ToolbarButton","ToolbarGroup","focus","useReducer","useRef","useEffect","lock","BlockLockModal","useBlockLock","BlockLockToolbar","clientId","wrapperRef","canEdit","canMove","canRemove","canLock","isModalOpen","toggleModal","isActive","lockButtonRef","isFirstRender","shouldHideBlockLockUI","current","focusable","find","sequential","element","tagName"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,QAAmB,iBAAnB;AACA,SAASC,aAAT,EAAwBC,YAAxB,QAA4C,uBAA5C;AACA,SAASC,KAAT,QAAsB,gBAAtB;AACA,SAASC,UAAT,EAAqBC,MAArB,EAA6BC,SAA7B,QAA8C,oBAA9C;AACA,SAASC,IAAT,QAAqB,kBAArB;AAEA;AACA;AACA;;AACA,OAAOC,cAAP,MAA2B,SAA3B;AACA,OAAOC,YAAP,MAAyB,kBAAzB;AAEA,eAAe,SAASC,gBAAT,CAA2B;AAAEC,EAAAA,QAAF;AAAYC,EAAAA;AAAZ,CAA3B,EAAsD;AACpE,QAAM;AAAEC,IAAAA,OAAF;AAAWC,IAAAA,OAAX;AAAoBC,IAAAA,SAApB;AAA+BC,IAAAA;AAA/B,MAA2CP,YAAY,CAAEE,QAAF,CAA7D;AAEA,QAAM,CAAEM,WAAF,EAAeC,WAAf,IAA+Bd,UAAU,CAC5Ce,QAAF,IAAgB,CAAEA,QAD4B,EAE9C,KAF8C,CAA/C;AAKA,QAAMC,aAAa,GAAGf,MAAM,CAAE,IAAF,CAA5B;AACA,QAAMgB,aAAa,GAAGhB,MAAM,CAAE,IAAF,CAA5B;AAEA,QAAMiB,qBAAqB,GAC1B,CAAEN,OAAF,IAAeH,OAAO,IAAIC,OAAX,IAAsBC,SADtC,CAXoE,CAcpE;AACA;AACA;;AACAT,EAAAA,SAAS,CAAE,MAAM;AAChB,QAAKe,aAAa,CAACE,OAAnB,EAA6B;AAC5BF,MAAAA,aAAa,CAACE,OAAd,GAAwB,KAAxB;AACA;AACA;;AAED,QAAK,CAAEN,WAAF,IAAiBK,qBAAtB,EAA8C;AAC7CnB,MAAAA,KAAK,CAACqB,SAAN,CACEC,IADF,CACQb,UAAU,CAACW,OADnB,EAC4B;AAC1BG,QAAAA,UAAU,EAAE;AADc,OAD5B,EAIED,IAJF,CAKIE,OAAF,IACCA,OAAO,CAACC,OAAR,KAAoB,QAApB,IACAD,OAAO,KAAKP,aAAa,CAACG,OAP7B,GASGpB,KATH;AAUA,KAjBe,CAkBhB;;AACA,GAnBQ,EAmBN,CAAEc,WAAF,EAAeK,qBAAf,EAAsCV,UAAtC,CAnBM,CAAT;;AAqBA,MAAKU,qBAAL,EAA6B;AAC5B,WAAO,IAAP;AACA;;AAED,SACC,8BACC,cAAC,YAAD;AAAc,IAAA,SAAS,EAAC;AAAxB,KACC,cAAC,aAAD;AACC,IAAA,IAAI,EAAGf,IADR;AAEC,IAAA,KAAK,EAAGP,EAAE,CAAE,QAAF,CAFX;AAGC,IAAA,OAAO,EAAGkB,WAHX;AAIC,IAAA,GAAG,EAAGE;AAJP,IADD,CADD,EASGH,WAAW,IACZ,cAAC,cAAD;AAAgB,IAAA,QAAQ,EAAGN,QAA3B;AAAsC,IAAA,OAAO,EAAGO;AAAhD,IAVF,CADD;AAeA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { ToolbarButton, ToolbarGroup } from '@wordpress/components';\nimport { focus } from '@wordpress/dom';\nimport { useReducer, useRef, useEffect } from '@wordpress/element';\nimport { lock } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport BlockLockModal from './modal';\nimport useBlockLock from './use-block-lock';\n\nexport default function BlockLockToolbar( { clientId, wrapperRef } ) {\n\tconst { canEdit, canMove, canRemove, canLock } = useBlockLock( clientId );\n\n\tconst [ isModalOpen, toggleModal ] = useReducer(\n\t\t( isActive ) => ! isActive,\n\t\tfalse\n\t);\n\n\tconst lockButtonRef = useRef( null );\n\tconst isFirstRender = useRef( true );\n\n\tconst shouldHideBlockLockUI =\n\t\t! canLock || ( canEdit && canMove && canRemove );\n\n\t// Restore focus manually on the first focusable element in the toolbar\n\t// when the block lock modal is closed and the block is not locked anymore.\n\t// See https://github.com/WordPress/gutenberg/issues/51447\n\tuseEffect( () => {\n\t\tif ( isFirstRender.current ) {\n\t\t\tisFirstRender.current = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! isModalOpen && shouldHideBlockLockUI ) {\n\t\t\tfocus.focusable\n\t\t\t\t.find( wrapperRef.current, {\n\t\t\t\t\tsequential: false,\n\t\t\t\t} )\n\t\t\t\t.find(\n\t\t\t\t\t( element ) =>\n\t\t\t\t\t\telement.tagName === 'BUTTON' &&\n\t\t\t\t\t\telement !== lockButtonRef.current\n\t\t\t\t)\n\t\t\t\t?.focus();\n\t\t}\n\t\t// wrapperRef is a reference object and should be stable\n\t}, [ isModalOpen, shouldHideBlockLockUI, wrapperRef ] );\n\n\tif ( shouldHideBlockLockUI ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<ToolbarGroup className=\"block-editor-block-lock-toolbar\">\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ticon={ lock }\n\t\t\t\t\tlabel={ __( 'Unlock' ) }\n\t\t\t\t\tonClick={ toggleModal }\n\t\t\t\t\tref={ lockButtonRef }\n\t\t\t\t/>\n\t\t\t</ToolbarGroup>\n\t\t\t{ isModalOpen && (\n\t\t\t\t<BlockLockModal clientId={ clientId } onClose={ toggleModal } />\n\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
@@ -68,7 +68,8 @@ const BlockToolbar = ({
68
68
  isVisual: selectedBlockClientIds.every(id => getBlockMode(id) === 'visual'),
69
69
  blockEditingMode: getBlockEditingMode(selectedBlockClientId)
70
70
  };
71
- }, []); // Handles highlighting the current block outline on hover or focus of the
71
+ }, []);
72
+ const toolbarWrapperRef = useRef(null); // Handles highlighting the current block outline on hover or focus of the
72
73
  // block type toolbar area.
73
74
 
74
75
  const {
@@ -115,16 +116,18 @@ const BlockToolbar = ({
115
116
  'is-synced': isSynced
116
117
  });
117
118
  return createElement("div", {
118
- className: classes
119
- }, !isMultiToolbar && isLargeViewport && blockEditingMode === 'default' && createElement(BlockParentSelector, null), createElement("div", {
119
+ className: classes,
120
+ ref: toolbarWrapperRef
121
+ }, !isMultiToolbar && isLargeViewport && blockEditingMode === 'default' && createElement(BlockParentSelector, null), (shouldShowVisualToolbar || isMultiToolbar) && blockEditingMode === 'default' && createElement("div", {
120
122
  ref: nodeRef,
121
123
  ...showMoversGestures
122
- }, (shouldShowVisualToolbar || isMultiToolbar) && blockEditingMode === 'default' && createElement(ToolbarGroup, {
124
+ }, createElement(ToolbarGroup, {
123
125
  className: "block-editor-block-toolbar__block-controls"
124
126
  }, createElement(BlockSwitcher, {
125
127
  clientIds: blockClientIds
126
128
  }), !isMultiToolbar && createElement(BlockLockToolbar, {
127
- clientId: blockClientIds[0]
129
+ clientId: blockClientIds[0],
130
+ wrapperRef: toolbarWrapperRef
128
131
  }), createElement(BlockMover, {
129
132
  clientIds: blockClientIds,
130
133
  hideDragHandle: hideDragHandle
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/block-toolbar/index.js"],"names":["classnames","useSelect","useDispatch","useRef","useViewportMatch","getBlockType","hasBlockSupport","isReusableBlock","isTemplatePart","ToolbarGroup","BlockMover","BlockParentSelector","BlockSwitcher","BlockControls","__unstableBlockToolbarLastItem","BlockSettingsMenu","BlockLockToolbar","BlockGroupToolbar","BlockEditVisuallyButton","useShowMoversGestures","store","blockEditorStore","__unstableBlockNameContext","unlock","BlockToolbar","hideDragHandle","blockClientIds","blockClientId","blockType","hasFixedToolbar","isDistractionFree","isValid","isVisual","blockEditingMode","select","getBlockName","getBlockMode","getSelectedBlockClientIds","isBlockValid","getBlockRootClientId","getSettings","getBlockEditingMode","selectedBlockClientIds","selectedBlockClientId","blockRootClientId","settings","rootClientId","every","id","toggleBlockHighlight","nodeRef","showMovers","gestures","showMoversGestures","ref","onChange","isFocused","displayHeaderToolbar","isLargeViewport","shouldShowMovers","length","shouldShowVisualToolbar","isMultiToolbar","isSynced","classes","name"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRef } from '@wordpress/element';\nimport { useViewportMatch } from '@wordpress/compose';\nimport {\n\tgetBlockType,\n\thasBlockSupport,\n\tisReusableBlock,\n\tisTemplatePart,\n} from '@wordpress/blocks';\nimport { ToolbarGroup } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport BlockMover from '../block-mover';\nimport BlockParentSelector from '../block-parent-selector';\nimport BlockSwitcher from '../block-switcher';\nimport BlockControls from '../block-controls';\nimport __unstableBlockToolbarLastItem from './block-toolbar-last-item';\nimport BlockSettingsMenu from '../block-settings-menu';\nimport { BlockLockToolbar } from '../block-lock';\nimport { BlockGroupToolbar } from '../convert-to-group-buttons';\nimport BlockEditVisuallyButton from '../block-edit-visually-button';\nimport { useShowMoversGestures } from './utils';\nimport { store as blockEditorStore } from '../../store';\nimport __unstableBlockNameContext from './block-name-context';\nimport { unlock } from '../../lock-unlock';\n\nconst BlockToolbar = ( { hideDragHandle } ) => {\n\tconst {\n\t\tblockClientIds,\n\t\tblockClientId,\n\t\tblockType,\n\t\thasFixedToolbar,\n\t\tisDistractionFree,\n\t\tisValid,\n\t\tisVisual,\n\t\tblockEditingMode,\n\t} = useSelect( ( select ) => {\n\t\tconst {\n\t\t\tgetBlockName,\n\t\t\tgetBlockMode,\n\t\t\tgetSelectedBlockClientIds,\n\t\t\tisBlockValid,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetSettings,\n\t\t\tgetBlockEditingMode,\n\t\t} = unlock( select( blockEditorStore ) );\n\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\t\tconst selectedBlockClientId = selectedBlockClientIds[ 0 ];\n\t\tconst blockRootClientId = getBlockRootClientId( selectedBlockClientId );\n\t\tconst settings = getSettings();\n\n\t\treturn {\n\t\t\tblockClientIds: selectedBlockClientIds,\n\t\t\tblockClientId: selectedBlockClientId,\n\t\t\tblockType:\n\t\t\t\tselectedBlockClientId &&\n\t\t\t\tgetBlockType( getBlockName( selectedBlockClientId ) ),\n\t\t\thasFixedToolbar: settings.hasFixedToolbar,\n\t\t\tisDistractionFree: settings.isDistractionFree,\n\t\t\trootClientId: blockRootClientId,\n\t\t\tisValid: selectedBlockClientIds.every( ( id ) =>\n\t\t\t\tisBlockValid( id )\n\t\t\t),\n\t\t\tisVisual: selectedBlockClientIds.every(\n\t\t\t\t( id ) => getBlockMode( id ) === 'visual'\n\t\t\t),\n\t\t\tblockEditingMode: getBlockEditingMode( selectedBlockClientId ),\n\t\t};\n\t}, [] );\n\n\t// Handles highlighting the current block outline on hover or focus of the\n\t// block type toolbar area.\n\tconst { toggleBlockHighlight } = useDispatch( blockEditorStore );\n\tconst nodeRef = useRef();\n\tconst { showMovers, gestures: showMoversGestures } = useShowMoversGestures(\n\t\t{\n\t\t\tref: nodeRef,\n\t\t\tonChange( isFocused ) {\n\t\t\t\tif ( isFocused && isDistractionFree ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttoggleBlockHighlight( blockClientId, isFocused );\n\t\t\t},\n\t\t}\n\t);\n\n\t// Account for the cases where the block toolbar is rendered within the\n\t// header area and not contextually to the block.\n\tconst displayHeaderToolbar =\n\t\tuseViewportMatch( 'medium', '<' ) || hasFixedToolbar;\n\tconst isLargeViewport = ! useViewportMatch( 'medium', '<' );\n\n\tif ( blockType ) {\n\t\tif ( ! hasBlockSupport( blockType, '__experimentalToolbar', true ) ) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tconst shouldShowMovers = displayHeaderToolbar || showMovers;\n\n\tif ( blockClientIds.length === 0 ) {\n\t\treturn null;\n\t}\n\n\tconst shouldShowVisualToolbar = isValid && isVisual;\n\tconst isMultiToolbar = blockClientIds.length > 1;\n\tconst isSynced =\n\t\tisReusableBlock( blockType ) || isTemplatePart( blockType );\n\n\tconst classes = classnames( 'block-editor-block-toolbar', {\n\t\t'is-showing-movers': shouldShowMovers,\n\t\t'is-synced': isSynced,\n\t} );\n\n\treturn (\n\t\t<div className={ classes }>\n\t\t\t{ ! isMultiToolbar &&\n\t\t\t\tisLargeViewport &&\n\t\t\t\tblockEditingMode === 'default' && <BlockParentSelector /> }\n\t\t\t<div ref={ nodeRef } { ...showMoversGestures }>\n\t\t\t\t{ ( shouldShowVisualToolbar || isMultiToolbar ) &&\n\t\t\t\t\tblockEditingMode === 'default' && (\n\t\t\t\t\t\t<ToolbarGroup className=\"block-editor-block-toolbar__block-controls\">\n\t\t\t\t\t\t\t<BlockSwitcher clientIds={ blockClientIds } />\n\t\t\t\t\t\t\t{ ! isMultiToolbar && (\n\t\t\t\t\t\t\t\t<BlockLockToolbar\n\t\t\t\t\t\t\t\t\tclientId={ blockClientIds[ 0 ] }\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<BlockMover\n\t\t\t\t\t\t\t\tclientIds={ blockClientIds }\n\t\t\t\t\t\t\t\thideDragHandle={ hideDragHandle }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t\t) }\n\t\t\t</div>\n\t\t\t{ shouldShowVisualToolbar && isMultiToolbar && (\n\t\t\t\t<BlockGroupToolbar />\n\t\t\t) }\n\t\t\t{ shouldShowVisualToolbar && (\n\t\t\t\t<>\n\t\t\t\t\t<BlockControls.Slot\n\t\t\t\t\t\tgroup=\"parent\"\n\t\t\t\t\t\tclassName=\"block-editor-block-toolbar__slot\"\n\t\t\t\t\t/>\n\t\t\t\t\t<BlockControls.Slot\n\t\t\t\t\t\tgroup=\"block\"\n\t\t\t\t\t\tclassName=\"block-editor-block-toolbar__slot\"\n\t\t\t\t\t/>\n\t\t\t\t\t<BlockControls.Slot className=\"block-editor-block-toolbar__slot\" />\n\t\t\t\t\t<BlockControls.Slot\n\t\t\t\t\t\tgroup=\"inline\"\n\t\t\t\t\t\tclassName=\"block-editor-block-toolbar__slot\"\n\t\t\t\t\t/>\n\t\t\t\t\t<BlockControls.Slot\n\t\t\t\t\t\tgroup=\"other\"\n\t\t\t\t\t\tclassName=\"block-editor-block-toolbar__slot\"\n\t\t\t\t\t/>\n\t\t\t\t\t<__unstableBlockNameContext.Provider\n\t\t\t\t\t\tvalue={ blockType?.name }\n\t\t\t\t\t>\n\t\t\t\t\t\t<__unstableBlockToolbarLastItem.Slot />\n\t\t\t\t\t</__unstableBlockNameContext.Provider>\n\t\t\t\t</>\n\t\t\t) }\n\t\t\t<BlockEditVisuallyButton clientIds={ blockClientIds } />\n\t\t\t{ blockEditingMode === 'default' && (\n\t\t\t\t<BlockSettingsMenu clientIds={ blockClientIds } />\n\t\t\t) }\n\t\t</div>\n\t);\n};\n\n/**\n * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-toolbar/README.md\n */\nexport default BlockToolbar;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/block-toolbar/index.js"],"names":["classnames","useSelect","useDispatch","useRef","useViewportMatch","getBlockType","hasBlockSupport","isReusableBlock","isTemplatePart","ToolbarGroup","BlockMover","BlockParentSelector","BlockSwitcher","BlockControls","__unstableBlockToolbarLastItem","BlockSettingsMenu","BlockLockToolbar","BlockGroupToolbar","BlockEditVisuallyButton","useShowMoversGestures","store","blockEditorStore","__unstableBlockNameContext","unlock","BlockToolbar","hideDragHandle","blockClientIds","blockClientId","blockType","hasFixedToolbar","isDistractionFree","isValid","isVisual","blockEditingMode","select","getBlockName","getBlockMode","getSelectedBlockClientIds","isBlockValid","getBlockRootClientId","getSettings","getBlockEditingMode","selectedBlockClientIds","selectedBlockClientId","blockRootClientId","settings","rootClientId","every","id","toolbarWrapperRef","toggleBlockHighlight","nodeRef","showMovers","gestures","showMoversGestures","ref","onChange","isFocused","displayHeaderToolbar","isLargeViewport","shouldShowMovers","length","shouldShowVisualToolbar","isMultiToolbar","isSynced","classes","name"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useRef } from '@wordpress/element';\nimport { useViewportMatch } from '@wordpress/compose';\nimport {\n\tgetBlockType,\n\thasBlockSupport,\n\tisReusableBlock,\n\tisTemplatePart,\n} from '@wordpress/blocks';\nimport { ToolbarGroup } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport BlockMover from '../block-mover';\nimport BlockParentSelector from '../block-parent-selector';\nimport BlockSwitcher from '../block-switcher';\nimport BlockControls from '../block-controls';\nimport __unstableBlockToolbarLastItem from './block-toolbar-last-item';\nimport BlockSettingsMenu from '../block-settings-menu';\nimport { BlockLockToolbar } from '../block-lock';\nimport { BlockGroupToolbar } from '../convert-to-group-buttons';\nimport BlockEditVisuallyButton from '../block-edit-visually-button';\nimport { useShowMoversGestures } from './utils';\nimport { store as blockEditorStore } from '../../store';\nimport __unstableBlockNameContext from './block-name-context';\nimport { unlock } from '../../lock-unlock';\n\nconst BlockToolbar = ( { hideDragHandle } ) => {\n\tconst {\n\t\tblockClientIds,\n\t\tblockClientId,\n\t\tblockType,\n\t\thasFixedToolbar,\n\t\tisDistractionFree,\n\t\tisValid,\n\t\tisVisual,\n\t\tblockEditingMode,\n\t} = useSelect( ( select ) => {\n\t\tconst {\n\t\t\tgetBlockName,\n\t\t\tgetBlockMode,\n\t\t\tgetSelectedBlockClientIds,\n\t\t\tisBlockValid,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetSettings,\n\t\t\tgetBlockEditingMode,\n\t\t} = unlock( select( blockEditorStore ) );\n\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\t\tconst selectedBlockClientId = selectedBlockClientIds[ 0 ];\n\t\tconst blockRootClientId = getBlockRootClientId( selectedBlockClientId );\n\t\tconst settings = getSettings();\n\n\t\treturn {\n\t\t\tblockClientIds: selectedBlockClientIds,\n\t\t\tblockClientId: selectedBlockClientId,\n\t\t\tblockType:\n\t\t\t\tselectedBlockClientId &&\n\t\t\t\tgetBlockType( getBlockName( selectedBlockClientId ) ),\n\t\t\thasFixedToolbar: settings.hasFixedToolbar,\n\t\t\tisDistractionFree: settings.isDistractionFree,\n\t\t\trootClientId: blockRootClientId,\n\t\t\tisValid: selectedBlockClientIds.every( ( id ) =>\n\t\t\t\tisBlockValid( id )\n\t\t\t),\n\t\t\tisVisual: selectedBlockClientIds.every(\n\t\t\t\t( id ) => getBlockMode( id ) === 'visual'\n\t\t\t),\n\t\t\tblockEditingMode: getBlockEditingMode( selectedBlockClientId ),\n\t\t};\n\t}, [] );\n\n\tconst toolbarWrapperRef = useRef( null );\n\n\t// Handles highlighting the current block outline on hover or focus of the\n\t// block type toolbar area.\n\tconst { toggleBlockHighlight } = useDispatch( blockEditorStore );\n\tconst nodeRef = useRef();\n\tconst { showMovers, gestures: showMoversGestures } = useShowMoversGestures(\n\t\t{\n\t\t\tref: nodeRef,\n\t\t\tonChange( isFocused ) {\n\t\t\t\tif ( isFocused && isDistractionFree ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttoggleBlockHighlight( blockClientId, isFocused );\n\t\t\t},\n\t\t}\n\t);\n\n\t// Account for the cases where the block toolbar is rendered within the\n\t// header area and not contextually to the block.\n\tconst displayHeaderToolbar =\n\t\tuseViewportMatch( 'medium', '<' ) || hasFixedToolbar;\n\tconst isLargeViewport = ! useViewportMatch( 'medium', '<' );\n\n\tif ( blockType ) {\n\t\tif ( ! hasBlockSupport( blockType, '__experimentalToolbar', true ) ) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tconst shouldShowMovers = displayHeaderToolbar || showMovers;\n\n\tif ( blockClientIds.length === 0 ) {\n\t\treturn null;\n\t}\n\n\tconst shouldShowVisualToolbar = isValid && isVisual;\n\tconst isMultiToolbar = blockClientIds.length > 1;\n\tconst isSynced =\n\t\tisReusableBlock( blockType ) || isTemplatePart( blockType );\n\n\tconst classes = classnames( 'block-editor-block-toolbar', {\n\t\t'is-showing-movers': shouldShowMovers,\n\t\t'is-synced': isSynced,\n\t} );\n\n\treturn (\n\t\t<div className={ classes } ref={ toolbarWrapperRef }>\n\t\t\t{ ! isMultiToolbar &&\n\t\t\t\tisLargeViewport &&\n\t\t\t\tblockEditingMode === 'default' && <BlockParentSelector /> }\n\t\t\t{ ( shouldShowVisualToolbar || isMultiToolbar ) &&\n\t\t\t\tblockEditingMode === 'default' && (\n\t\t\t\t\t<div ref={ nodeRef } { ...showMoversGestures }>\n\t\t\t\t\t\t<ToolbarGroup className=\"block-editor-block-toolbar__block-controls\">\n\t\t\t\t\t\t\t<BlockSwitcher clientIds={ blockClientIds } />\n\t\t\t\t\t\t\t{ ! isMultiToolbar && (\n\t\t\t\t\t\t\t\t<BlockLockToolbar\n\t\t\t\t\t\t\t\t\tclientId={ blockClientIds[ 0 ] }\n\t\t\t\t\t\t\t\t\twrapperRef={ toolbarWrapperRef }\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<BlockMover\n\t\t\t\t\t\t\t\tclientIds={ blockClientIds }\n\t\t\t\t\t\t\t\thideDragHandle={ hideDragHandle }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t\t</div>\n\t\t\t\t) }\n\t\t\t{ shouldShowVisualToolbar && isMultiToolbar && (\n\t\t\t\t<BlockGroupToolbar />\n\t\t\t) }\n\t\t\t{ shouldShowVisualToolbar && (\n\t\t\t\t<>\n\t\t\t\t\t<BlockControls.Slot\n\t\t\t\t\t\tgroup=\"parent\"\n\t\t\t\t\t\tclassName=\"block-editor-block-toolbar__slot\"\n\t\t\t\t\t/>\n\t\t\t\t\t<BlockControls.Slot\n\t\t\t\t\t\tgroup=\"block\"\n\t\t\t\t\t\tclassName=\"block-editor-block-toolbar__slot\"\n\t\t\t\t\t/>\n\t\t\t\t\t<BlockControls.Slot className=\"block-editor-block-toolbar__slot\" />\n\t\t\t\t\t<BlockControls.Slot\n\t\t\t\t\t\tgroup=\"inline\"\n\t\t\t\t\t\tclassName=\"block-editor-block-toolbar__slot\"\n\t\t\t\t\t/>\n\t\t\t\t\t<BlockControls.Slot\n\t\t\t\t\t\tgroup=\"other\"\n\t\t\t\t\t\tclassName=\"block-editor-block-toolbar__slot\"\n\t\t\t\t\t/>\n\t\t\t\t\t<__unstableBlockNameContext.Provider\n\t\t\t\t\t\tvalue={ blockType?.name }\n\t\t\t\t\t>\n\t\t\t\t\t\t<__unstableBlockToolbarLastItem.Slot />\n\t\t\t\t\t</__unstableBlockNameContext.Provider>\n\t\t\t\t</>\n\t\t\t) }\n\t\t\t<BlockEditVisuallyButton clientIds={ blockClientIds } />\n\t\t\t{ blockEditingMode === 'default' && (\n\t\t\t\t<BlockSettingsMenu clientIds={ blockClientIds } />\n\t\t\t) }\n\t\t</div>\n\t);\n};\n\n/**\n * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/block-toolbar/README.md\n */\nexport default BlockToolbar;\n"]}
@@ -0,0 +1,87 @@
1
+ import { createElement } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { SelectControl, __experimentalToolsPanelItem as ToolsPanelItem } from '@wordpress/components';
7
+ import { __, _x } from '@wordpress/i18n';
8
+ /**
9
+ * @typedef {import('@wordpress/components/build-types/select-control/types').SelectControlProps} SelectControlProps
10
+ */
11
+
12
+ /**
13
+ * @type {SelectControlProps[]}
14
+ */
15
+
16
+ export const DEFAULT_ASPECT_RATIO_OPTIONS = [{
17
+ label: _x('Original', 'Aspect ratio option for dimensions control'),
18
+ value: 'auto'
19
+ }, {
20
+ label: _x('Square - 1:1', 'Aspect ratio option for dimensions control'),
21
+ value: '1'
22
+ }, {
23
+ label: _x('Standard - 4:3', 'Aspect ratio option for dimensions control'),
24
+ value: '4/3'
25
+ }, {
26
+ label: _x('Portrait - 3:4', 'Aspect ratio option for dimensions control'),
27
+ value: '3/4'
28
+ }, {
29
+ label: _x('Classic - 3:2', 'Aspect ratio option for dimensions control'),
30
+ value: '3/2'
31
+ }, {
32
+ label: _x('Classic Portrait - 2:3', 'Aspect ratio option for dimensions control'),
33
+ value: '2/3'
34
+ }, {
35
+ label: _x('Wide - 16:9', 'Aspect ratio option for dimensions control'),
36
+ value: '16/9'
37
+ }, {
38
+ label: _x('Tall - 9:16', 'Aspect ratio option for dimensions control'),
39
+ value: '9/16'
40
+ }, {
41
+ label: _x('Custom', 'Aspect ratio option for dimensions control'),
42
+ value: 'custom',
43
+ disabled: true,
44
+ hidden: true
45
+ }];
46
+ /**
47
+ * @callback AspectRatioToolPropsOnChange
48
+ * @param {string} [value] New aspect ratio value.
49
+ * @return {void} No return.
50
+ */
51
+
52
+ /**
53
+ * @typedef {Object} AspectRatioToolProps
54
+ * @property {string} [panelId] ID of the panel this tool is associated with.
55
+ * @property {string} [value] Current aspect ratio value.
56
+ * @property {AspectRatioToolPropsOnChange} [onChange] Callback to update the aspect ratio value.
57
+ * @property {SelectControlProps[]} [options] Aspect ratio options.
58
+ * @property {string} [defaultValue] Default aspect ratio value.
59
+ * @property {boolean} [isShownByDefault] Whether the tool is shown by default.
60
+ */
61
+
62
+ export default function AspectRatioTool({
63
+ panelId,
64
+ value,
65
+ onChange = () => {},
66
+ options = DEFAULT_ASPECT_RATIO_OPTIONS,
67
+ defaultValue = DEFAULT_ASPECT_RATIO_OPTIONS[0].value,
68
+ isShownByDefault = true
69
+ }) {
70
+ // Match the CSS default so if the value is used directly in CSS it will look correct in the control.
71
+ const displayValue = value !== null && value !== void 0 ? value : 'auto';
72
+ return createElement(ToolsPanelItem, {
73
+ hasValue: () => displayValue !== defaultValue,
74
+ label: __('Aspect ratio'),
75
+ onDeselect: () => onChange(undefined),
76
+ isShownByDefault: isShownByDefault,
77
+ panelId: panelId
78
+ }, createElement(SelectControl, {
79
+ label: __('Aspect ratio'),
80
+ value: displayValue,
81
+ options: options,
82
+ onChange: onChange,
83
+ size: '__unstable-large',
84
+ __nextHasNoMarginBottom: true
85
+ }));
86
+ }
87
+ //# sourceMappingURL=aspect-ratio-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/dimensions-tool/aspect-ratio-tool.js"],"names":["SelectControl","__experimentalToolsPanelItem","ToolsPanelItem","__","_x","DEFAULT_ASPECT_RATIO_OPTIONS","label","value","disabled","hidden","AspectRatioTool","panelId","onChange","options","defaultValue","isShownByDefault","displayValue","undefined"],"mappings":";;AAAA;AACA;AACA;AACA,SACCA,aADD,EAECC,4BAA4B,IAAIC,cAFjC,QAGO,uBAHP;AAIA,SAASC,EAAT,EAAaC,EAAb,QAAuB,iBAAvB;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AACA,OAAO,MAAMC,4BAA4B,GAAG,CAC3C;AACCC,EAAAA,KAAK,EAAEF,EAAE,CAAE,UAAF,EAAc,4CAAd,CADV;AAECG,EAAAA,KAAK,EAAE;AAFR,CAD2C,EAK3C;AACCD,EAAAA,KAAK,EAAEF,EAAE,CACR,cADQ,EAER,4CAFQ,CADV;AAKCG,EAAAA,KAAK,EAAE;AALR,CAL2C,EAY3C;AACCD,EAAAA,KAAK,EAAEF,EAAE,CACR,gBADQ,EAER,4CAFQ,CADV;AAKCG,EAAAA,KAAK,EAAE;AALR,CAZ2C,EAmB3C;AACCD,EAAAA,KAAK,EAAEF,EAAE,CACR,gBADQ,EAER,4CAFQ,CADV;AAKCG,EAAAA,KAAK,EAAE;AALR,CAnB2C,EA0B3C;AACCD,EAAAA,KAAK,EAAEF,EAAE,CACR,eADQ,EAER,4CAFQ,CADV;AAKCG,EAAAA,KAAK,EAAE;AALR,CA1B2C,EAiC3C;AACCD,EAAAA,KAAK,EAAEF,EAAE,CACR,wBADQ,EAER,4CAFQ,CADV;AAKCG,EAAAA,KAAK,EAAE;AALR,CAjC2C,EAwC3C;AACCD,EAAAA,KAAK,EAAEF,EAAE,CACR,aADQ,EAER,4CAFQ,CADV;AAKCG,EAAAA,KAAK,EAAE;AALR,CAxC2C,EA+C3C;AACCD,EAAAA,KAAK,EAAEF,EAAE,CACR,aADQ,EAER,4CAFQ,CADV;AAKCG,EAAAA,KAAK,EAAE;AALR,CA/C2C,EAsD3C;AACCD,EAAAA,KAAK,EAAEF,EAAE,CAAE,QAAF,EAAY,4CAAZ,CADV;AAECG,EAAAA,KAAK,EAAE,QAFR;AAGCC,EAAAA,QAAQ,EAAE,IAHX;AAICC,EAAAA,MAAM,EAAE;AAJT,CAtD2C,CAArC;AA8DP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,SAASC,eAAT,CAA0B;AACxCC,EAAAA,OADwC;AAExCJ,EAAAA,KAFwC;AAGxCK,EAAAA,QAAQ,GAAG,MAAM,CAAE,CAHqB;AAIxCC,EAAAA,OAAO,GAAGR,4BAJ8B;AAKxCS,EAAAA,YAAY,GAAGT,4BAA4B,CAAE,CAAF,CAA5B,CAAkCE,KALT;AAMxCQ,EAAAA,gBAAgB,GAAG;AANqB,CAA1B,EAOX;AACH;AACA,QAAMC,YAAY,GAAGT,KAAH,aAAGA,KAAH,cAAGA,KAAH,GAAY,MAA9B;AAEA,SACC,cAAC,cAAD;AACC,IAAA,QAAQ,EAAG,MAAMS,YAAY,KAAKF,YADnC;AAEC,IAAA,KAAK,EAAGX,EAAE,CAAE,cAAF,CAFX;AAGC,IAAA,UAAU,EAAG,MAAMS,QAAQ,CAAEK,SAAF,CAH5B;AAIC,IAAA,gBAAgB,EAAGF,gBAJpB;AAKC,IAAA,OAAO,EAAGJ;AALX,KAOC,cAAC,aAAD;AACC,IAAA,KAAK,EAAGR,EAAE,CAAE,cAAF,CADX;AAEC,IAAA,KAAK,EAAGa,YAFT;AAGC,IAAA,OAAO,EAAGH,OAHX;AAIC,IAAA,QAAQ,EAAGD,QAJZ;AAKC,IAAA,IAAI,EAAG,kBALR;AAMC,IAAA,uBAAuB;AANxB,IAPD,CADD;AAkBA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tSelectControl,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\nimport { __, _x } from '@wordpress/i18n';\n\n/**\n * @typedef {import('@wordpress/components/build-types/select-control/types').SelectControlProps} SelectControlProps\n */\n\n/**\n * @type {SelectControlProps[]}\n */\nexport const DEFAULT_ASPECT_RATIO_OPTIONS = [\n\t{\n\t\tlabel: _x( 'Original', 'Aspect ratio option for dimensions control' ),\n\t\tvalue: 'auto',\n\t},\n\t{\n\t\tlabel: _x(\n\t\t\t'Square - 1:1',\n\t\t\t'Aspect ratio option for dimensions control'\n\t\t),\n\t\tvalue: '1',\n\t},\n\t{\n\t\tlabel: _x(\n\t\t\t'Standard - 4:3',\n\t\t\t'Aspect ratio option for dimensions control'\n\t\t),\n\t\tvalue: '4/3',\n\t},\n\t{\n\t\tlabel: _x(\n\t\t\t'Portrait - 3:4',\n\t\t\t'Aspect ratio option for dimensions control'\n\t\t),\n\t\tvalue: '3/4',\n\t},\n\t{\n\t\tlabel: _x(\n\t\t\t'Classic - 3:2',\n\t\t\t'Aspect ratio option for dimensions control'\n\t\t),\n\t\tvalue: '3/2',\n\t},\n\t{\n\t\tlabel: _x(\n\t\t\t'Classic Portrait - 2:3',\n\t\t\t'Aspect ratio option for dimensions control'\n\t\t),\n\t\tvalue: '2/3',\n\t},\n\t{\n\t\tlabel: _x(\n\t\t\t'Wide - 16:9',\n\t\t\t'Aspect ratio option for dimensions control'\n\t\t),\n\t\tvalue: '16/9',\n\t},\n\t{\n\t\tlabel: _x(\n\t\t\t'Tall - 9:16',\n\t\t\t'Aspect ratio option for dimensions control'\n\t\t),\n\t\tvalue: '9/16',\n\t},\n\t{\n\t\tlabel: _x( 'Custom', 'Aspect ratio option for dimensions control' ),\n\t\tvalue: 'custom',\n\t\tdisabled: true,\n\t\thidden: true,\n\t},\n];\n\n/**\n * @callback AspectRatioToolPropsOnChange\n * @param {string} [value] New aspect ratio value.\n * @return {void} No return.\n */\n\n/**\n * @typedef {Object} AspectRatioToolProps\n * @property {string} [panelId] ID of the panel this tool is associated with.\n * @property {string} [value] Current aspect ratio value.\n * @property {AspectRatioToolPropsOnChange} [onChange] Callback to update the aspect ratio value.\n * @property {SelectControlProps[]} [options] Aspect ratio options.\n * @property {string} [defaultValue] Default aspect ratio value.\n * @property {boolean} [isShownByDefault] Whether the tool is shown by default.\n */\n\nexport default function AspectRatioTool( {\n\tpanelId,\n\tvalue,\n\tonChange = () => {},\n\toptions = DEFAULT_ASPECT_RATIO_OPTIONS,\n\tdefaultValue = DEFAULT_ASPECT_RATIO_OPTIONS[ 0 ].value,\n\tisShownByDefault = true,\n} ) {\n\t// Match the CSS default so if the value is used directly in CSS it will look correct in the control.\n\tconst displayValue = value ?? 'auto';\n\n\treturn (\n\t\t<ToolsPanelItem\n\t\t\thasValue={ () => displayValue !== defaultValue }\n\t\t\tlabel={ __( 'Aspect ratio' ) }\n\t\t\tonDeselect={ () => onChange( undefined ) }\n\t\t\tisShownByDefault={ isShownByDefault }\n\t\t\tpanelId={ panelId }\n\t\t>\n\t\t\t<SelectControl\n\t\t\t\tlabel={ __( 'Aspect ratio' ) }\n\t\t\t\tvalue={ displayValue }\n\t\t\t\toptions={ options }\n\t\t\t\tonChange={ onChange }\n\t\t\t\tsize={ '__unstable-large' }\n\t\t\t\t__nextHasNoMarginBottom\n\t\t\t/>\n\t\t</ToolsPanelItem>\n\t);\n}\n"]}
@@ -0,0 +1,195 @@
1
+ import { createElement, Fragment } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { useState } from '@wordpress/element';
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+
11
+ import AspectRatioTool from './aspect-ratio-tool';
12
+ import ScaleTool from './scale-tool';
13
+ import WidthHeightTool from './width-height-tool';
14
+ /**
15
+ * @typedef {import('@wordpress/components/build-types/select-control/types').SelectControlProps} SelectControlProps
16
+ */
17
+
18
+ /**
19
+ * @typedef {import('@wordpress/components/build-types/unit-control/types').WPUnitControlUnit} WPUnitControlUnit
20
+ */
21
+
22
+ /**
23
+ * @typedef {Object} Dimensions
24
+ * @property {string} [width] CSS width property.
25
+ * @property {string} [height] CSS height property.
26
+ * @property {string} [scale] CSS object-fit property.
27
+ * @property {string} [aspectRatio] CSS aspect-ratio property.
28
+ */
29
+
30
+ /**
31
+ * @callback DimensionsControlsOnChange
32
+ * @param {Dimensions} nextValue
33
+ * @return {void}
34
+ */
35
+
36
+ /**
37
+ * @typedef {Object} DimensionsControlsProps
38
+ * @property {string} [panelId] ID of the panel that contains the controls.
39
+ * @property {Dimensions} [value] Current dimensions values.
40
+ * @property {DimensionsControlsOnChange} [onChange] Callback to update the dimensions values.
41
+ * @property {SelectControlProps[]} [aspectRatioOptions] Aspect ratio options.
42
+ * @property {SelectControlProps[]} [scaleOptions] Scale options.
43
+ * @property {WPUnitControlUnit[]} [unitsOptions] Units options.
44
+ */
45
+
46
+ /**
47
+ * Component that renders controls to edit the dimensions of an image or container.
48
+ *
49
+ * @param {DimensionsControlsProps} props The component props.
50
+ *
51
+ * @return {WPElement} The dimensions controls.
52
+ */
53
+
54
+ function DimensionsTool({
55
+ panelId,
56
+ value = {},
57
+ onChange = () => {},
58
+ aspectRatioOptions,
59
+ // Default options handled by AspectRatioTool.
60
+ defaultAspectRatio = 'auto',
61
+ // Match CSS default value for aspect-ratio.
62
+ scaleOptions,
63
+ // Default options handled by ScaleTool.
64
+ defaultScale = 'fill',
65
+ // Match CSS default value for object-fit.
66
+ unitsOptions // Default options handled by UnitControl.
67
+
68
+ }) {
69
+ // Coerce undefined and CSS default values to be null.
70
+ const width = value.width === undefined || value.width === 'auto' ? null : value.width;
71
+ const height = value.height === undefined || value.height === 'auto' ? null : value.height;
72
+ const aspectRatio = value.aspectRatio === undefined || value.aspectRatio === 'auto' ? null : value.aspectRatio;
73
+ const scale = value.scale === undefined || value.scale === 'fill' ? null : value.scale; // Keep track of state internally, so when the value is cleared by means
74
+ // other than directly editing that field, it's easier to restore the
75
+ // previous value.
76
+
77
+ const [lastScale, setLastScale] = useState(scale);
78
+ const [lastAspectRatio, setLastAspectRatio] = useState(aspectRatio); // 'custom' is not a valid value for CSS aspect-ratio, but it is used in the
79
+ // dropdown to indicate that setting both the width and height is the same
80
+ // as a custom aspect ratio.
81
+
82
+ const aspectRatioValue = width && height ? 'custom' : lastAspectRatio;
83
+ const showScaleControl = aspectRatio || width && height;
84
+ return createElement(Fragment, null, createElement(AspectRatioTool, {
85
+ panelId: panelId,
86
+ options: aspectRatioOptions,
87
+ defaultValue: defaultAspectRatio,
88
+ value: aspectRatioValue,
89
+ onChange: nextAspectRatio => {
90
+ const nextValue = { ...value
91
+ }; // 'auto' is CSS default, so it gets treated as null.
92
+
93
+ nextAspectRatio = nextAspectRatio === 'auto' ? null : nextAspectRatio;
94
+ setLastAspectRatio(nextAspectRatio); // Update aspectRatio.
95
+
96
+ if (!nextAspectRatio) {
97
+ delete nextValue.aspectRatio;
98
+ } else {
99
+ nextValue.aspectRatio = nextAspectRatio;
100
+ } // Auto-update scale.
101
+
102
+
103
+ if (!nextAspectRatio) {
104
+ delete nextValue.scale;
105
+ } else if (lastScale) {
106
+ nextValue.scale = lastScale;
107
+ } else {
108
+ nextValue.scale = defaultScale;
109
+ setLastScale(defaultScale);
110
+ } // Auto-update width and height.
111
+
112
+
113
+ if (nextAspectRatio && width && height) {
114
+ delete nextValue.height;
115
+ }
116
+
117
+ onChange(nextValue);
118
+ }
119
+ }), showScaleControl && createElement(ScaleTool, {
120
+ panelId: panelId,
121
+ options: scaleOptions,
122
+ defaultValue: defaultScale,
123
+ value: lastScale,
124
+ onChange: nextScale => {
125
+ const nextValue = { ...value
126
+ }; // 'fill' is CSS default, so it gets treated as null.
127
+
128
+ nextScale = nextScale === 'fill' ? null : nextScale;
129
+ setLastScale(nextScale); // Update scale.
130
+
131
+ if (!nextScale) {
132
+ delete nextValue.scale;
133
+ } else {
134
+ nextValue.scale = nextScale;
135
+ }
136
+
137
+ onChange(nextValue);
138
+ }
139
+ }), createElement(WidthHeightTool, {
140
+ panelId: panelId,
141
+ units: unitsOptions,
142
+ value: {
143
+ width,
144
+ height
145
+ },
146
+ onChange: ({
147
+ width: nextWidth,
148
+ height: nextHeight
149
+ }) => {
150
+ const nextValue = { ...value
151
+ }; // 'auto' is CSS default, so it gets treated as null.
152
+
153
+ nextWidth = nextWidth === 'auto' ? null : nextWidth;
154
+ nextHeight = nextHeight === 'auto' ? null : nextHeight; // Update width.
155
+
156
+ if (!nextWidth) {
157
+ delete nextValue.width;
158
+ } else {
159
+ nextValue.width = nextWidth;
160
+ } // Update height.
161
+
162
+
163
+ if (!nextHeight) {
164
+ delete nextValue.height;
165
+ } else {
166
+ nextValue.height = nextHeight;
167
+ } // Auto-update aspectRatio.
168
+
169
+
170
+ if (nextWidth && nextHeight) {
171
+ delete nextValue.aspectRatio;
172
+ } else if (lastAspectRatio) {
173
+ nextValue.aspectRatio = lastAspectRatio;
174
+ } else {// No setting defaultAspectRatio here, because
175
+ // aspectRatio is optional in this scenario,
176
+ // unlike scale.
177
+ } // Auto-update scale.
178
+
179
+
180
+ if (!lastAspectRatio && !!nextWidth !== !!nextHeight) {
181
+ delete nextValue.scale;
182
+ } else if (lastScale) {
183
+ nextValue.scale = lastScale;
184
+ } else {
185
+ nextValue.scale = defaultScale;
186
+ setLastScale(defaultScale);
187
+ }
188
+
189
+ onChange(nextValue);
190
+ }
191
+ }));
192
+ }
193
+
194
+ export default DimensionsTool;
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/dimensions-tool/index.js"],"names":["useState","AspectRatioTool","ScaleTool","WidthHeightTool","DimensionsTool","panelId","value","onChange","aspectRatioOptions","defaultAspectRatio","scaleOptions","defaultScale","unitsOptions","width","undefined","height","aspectRatio","scale","lastScale","setLastScale","lastAspectRatio","setLastAspectRatio","aspectRatioValue","showScaleControl","nextAspectRatio","nextValue","nextScale","nextWidth","nextHeight"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useState } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport AspectRatioTool from './aspect-ratio-tool';\nimport ScaleTool from './scale-tool';\nimport WidthHeightTool from './width-height-tool';\n\n/**\n * @typedef {import('@wordpress/components/build-types/select-control/types').SelectControlProps} SelectControlProps\n */\n\n/**\n * @typedef {import('@wordpress/components/build-types/unit-control/types').WPUnitControlUnit} WPUnitControlUnit\n */\n\n/**\n * @typedef {Object} Dimensions\n * @property {string} [width] CSS width property.\n * @property {string} [height] CSS height property.\n * @property {string} [scale] CSS object-fit property.\n * @property {string} [aspectRatio] CSS aspect-ratio property.\n */\n\n/**\n * @callback DimensionsControlsOnChange\n * @param {Dimensions} nextValue\n * @return {void}\n */\n\n/**\n * @typedef {Object} DimensionsControlsProps\n * @property {string} [panelId] ID of the panel that contains the controls.\n * @property {Dimensions} [value] Current dimensions values.\n * @property {DimensionsControlsOnChange} [onChange] Callback to update the dimensions values.\n * @property {SelectControlProps[]} [aspectRatioOptions] Aspect ratio options.\n * @property {SelectControlProps[]} [scaleOptions] Scale options.\n * @property {WPUnitControlUnit[]} [unitsOptions] Units options.\n */\n\n/**\n * Component that renders controls to edit the dimensions of an image or container.\n *\n * @param {DimensionsControlsProps} props The component props.\n *\n * @return {WPElement} The dimensions controls.\n */\nfunction DimensionsTool( {\n\tpanelId,\n\tvalue = {},\n\tonChange = () => {},\n\taspectRatioOptions, // Default options handled by AspectRatioTool.\n\tdefaultAspectRatio = 'auto', // Match CSS default value for aspect-ratio.\n\tscaleOptions, // Default options handled by ScaleTool.\n\tdefaultScale = 'fill', // Match CSS default value for object-fit.\n\tunitsOptions, // Default options handled by UnitControl.\n} ) {\n\t// Coerce undefined and CSS default values to be null.\n\tconst width =\n\t\tvalue.width === undefined || value.width === 'auto'\n\t\t\t? null\n\t\t\t: value.width;\n\tconst height =\n\t\tvalue.height === undefined || value.height === 'auto'\n\t\t\t? null\n\t\t\t: value.height;\n\tconst aspectRatio =\n\t\tvalue.aspectRatio === undefined || value.aspectRatio === 'auto'\n\t\t\t? null\n\t\t\t: value.aspectRatio;\n\tconst scale =\n\t\tvalue.scale === undefined || value.scale === 'fill'\n\t\t\t? null\n\t\t\t: value.scale;\n\n\t// Keep track of state internally, so when the value is cleared by means\n\t// other than directly editing that field, it's easier to restore the\n\t// previous value.\n\tconst [ lastScale, setLastScale ] = useState( scale );\n\tconst [ lastAspectRatio, setLastAspectRatio ] = useState( aspectRatio );\n\n\t// 'custom' is not a valid value for CSS aspect-ratio, but it is used in the\n\t// dropdown to indicate that setting both the width and height is the same\n\t// as a custom aspect ratio.\n\tconst aspectRatioValue = width && height ? 'custom' : lastAspectRatio;\n\n\tconst showScaleControl = aspectRatio || ( width && height );\n\n\treturn (\n\t\t<>\n\t\t\t<AspectRatioTool\n\t\t\t\tpanelId={ panelId }\n\t\t\t\toptions={ aspectRatioOptions }\n\t\t\t\tdefaultValue={ defaultAspectRatio }\n\t\t\t\tvalue={ aspectRatioValue }\n\t\t\t\tonChange={ ( nextAspectRatio ) => {\n\t\t\t\t\tconst nextValue = { ...value };\n\n\t\t\t\t\t// 'auto' is CSS default, so it gets treated as null.\n\t\t\t\t\tnextAspectRatio =\n\t\t\t\t\t\tnextAspectRatio === 'auto' ? null : nextAspectRatio;\n\n\t\t\t\t\tsetLastAspectRatio( nextAspectRatio );\n\n\t\t\t\t\t// Update aspectRatio.\n\t\t\t\t\tif ( ! nextAspectRatio ) {\n\t\t\t\t\t\tdelete nextValue.aspectRatio;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnextValue.aspectRatio = nextAspectRatio;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Auto-update scale.\n\t\t\t\t\tif ( ! nextAspectRatio ) {\n\t\t\t\t\t\tdelete nextValue.scale;\n\t\t\t\t\t} else if ( lastScale ) {\n\t\t\t\t\t\tnextValue.scale = lastScale;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnextValue.scale = defaultScale;\n\t\t\t\t\t\tsetLastScale( defaultScale );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Auto-update width and height.\n\t\t\t\t\tif ( nextAspectRatio && width && height ) {\n\t\t\t\t\t\tdelete nextValue.height;\n\t\t\t\t\t}\n\n\t\t\t\t\tonChange( nextValue );\n\t\t\t\t} }\n\t\t\t/>\n\t\t\t{ showScaleControl && (\n\t\t\t\t<ScaleTool\n\t\t\t\t\tpanelId={ panelId }\n\t\t\t\t\toptions={ scaleOptions }\n\t\t\t\t\tdefaultValue={ defaultScale }\n\t\t\t\t\tvalue={ lastScale }\n\t\t\t\t\tonChange={ ( nextScale ) => {\n\t\t\t\t\t\tconst nextValue = { ...value };\n\n\t\t\t\t\t\t// 'fill' is CSS default, so it gets treated as null.\n\t\t\t\t\t\tnextScale = nextScale === 'fill' ? null : nextScale;\n\n\t\t\t\t\t\tsetLastScale( nextScale );\n\n\t\t\t\t\t\t// Update scale.\n\t\t\t\t\t\tif ( ! nextScale ) {\n\t\t\t\t\t\t\tdelete nextValue.scale;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnextValue.scale = nextScale;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonChange( nextValue );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t<WidthHeightTool\n\t\t\t\tpanelId={ panelId }\n\t\t\t\tunits={ unitsOptions }\n\t\t\t\tvalue={ { width, height } }\n\t\t\t\tonChange={ ( { width: nextWidth, height: nextHeight } ) => {\n\t\t\t\t\tconst nextValue = { ...value };\n\n\t\t\t\t\t// 'auto' is CSS default, so it gets treated as null.\n\t\t\t\t\tnextWidth = nextWidth === 'auto' ? null : nextWidth;\n\t\t\t\t\tnextHeight = nextHeight === 'auto' ? null : nextHeight;\n\n\t\t\t\t\t// Update width.\n\t\t\t\t\tif ( ! nextWidth ) {\n\t\t\t\t\t\tdelete nextValue.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnextValue.width = nextWidth;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update height.\n\t\t\t\t\tif ( ! nextHeight ) {\n\t\t\t\t\t\tdelete nextValue.height;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnextValue.height = nextHeight;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Auto-update aspectRatio.\n\t\t\t\t\tif ( nextWidth && nextHeight ) {\n\t\t\t\t\t\tdelete nextValue.aspectRatio;\n\t\t\t\t\t} else if ( lastAspectRatio ) {\n\t\t\t\t\t\tnextValue.aspectRatio = lastAspectRatio;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No setting defaultAspectRatio here, because\n\t\t\t\t\t\t// aspectRatio is optional in this scenario,\n\t\t\t\t\t\t// unlike scale.\n\t\t\t\t\t}\n\n\t\t\t\t\t// Auto-update scale.\n\t\t\t\t\tif ( ! lastAspectRatio && !! nextWidth !== !! nextHeight ) {\n\t\t\t\t\t\tdelete nextValue.scale;\n\t\t\t\t\t} else if ( lastScale ) {\n\t\t\t\t\t\tnextValue.scale = lastScale;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnextValue.scale = defaultScale;\n\t\t\t\t\t\tsetLastScale( defaultScale );\n\t\t\t\t\t}\n\n\t\t\t\t\tonChange( nextValue );\n\t\t\t\t} }\n\t\t\t/>\n\t\t</>\n\t);\n}\n\nexport default DimensionsTool;\n"]}
@@ -0,0 +1,103 @@
1
+ import { createElement } from "@wordpress/element";
2
+
3
+ /**
4
+ * WordPress dependencies
5
+ */
6
+ import { __experimentalToolsPanelItem as ToolsPanelItem, __experimentalToggleGroupControl as ToggleGroupControl, __experimentalToggleGroupControlOption as ToggleGroupControlOption } from '@wordpress/components';
7
+ import { useMemo } from '@wordpress/element';
8
+ import { __, _x } from '@wordpress/i18n';
9
+ /**
10
+ * @typedef {import('@wordpress/components/build-types/select-control/types').SelectControlProps} SelectControlProps
11
+ */
12
+
13
+ /**
14
+ * The descriptions are purposely made generic as object-fit could be used for
15
+ * any replaced element. Provide your own set of options if you need different
16
+ * help text or labels.
17
+ *
18
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Replaced_element
19
+ *
20
+ * @type {SelectControlProps[]}
21
+ */
22
+
23
+ const DEFAULT_SCALE_OPTIONS = [{
24
+ value: 'fill',
25
+ label: _x('Fill', 'Scale option for dimensions control'),
26
+ help: __('Fill the space by stretching the content.')
27
+ }, {
28
+ value: 'contain',
29
+ label: _x('Contain', 'Scale option for dimensions control'),
30
+ help: __('Fit the content to the space without clipping.')
31
+ }, {
32
+ value: 'cover',
33
+ label: _x('Cover', 'Scale option for dimensions control'),
34
+ help: __("Fill the space by clipping what doesn't fit.")
35
+ }, {
36
+ value: 'none',
37
+ label: _x('None', 'Scale option for dimensions control'),
38
+ help: __('Do not adjust the sizing of the content. Content that is too large will be clipped, and content that is too small will have additional padding.')
39
+ }, {
40
+ value: 'scale-down',
41
+ label: _x('Scale down', 'Scale option for dimensions control'),
42
+ help: __('Scale down the content to fit the space if it is too big. Content that is too small will have additional padding.')
43
+ }];
44
+ /**
45
+ * @callback ScaleToolPropsOnChange
46
+ * @param {string} nextValue New scale value.
47
+ * @return {void}
48
+ */
49
+
50
+ /**
51
+ * @typedef {Object} ScaleToolProps
52
+ * @property {string} [panelId] ID of the panel that contains the controls.
53
+ * @property {string} [value] Current scale value.
54
+ * @property {ScaleToolPropsOnChange} [onChange] Callback to update the scale value.
55
+ * @property {SelectControlProps[]} [options] Scale options.
56
+ * @property {string} [defaultValue] Default scale value.
57
+ * @property {boolean} [showControl=true] Whether to show the control.
58
+ * @property {boolean} [isShownByDefault=true] Whether the tool panel is shown by default.
59
+ */
60
+
61
+ /**
62
+ * A tool to select the CSS object-fit property for the image.
63
+ *
64
+ * @param {ScaleToolProps} props
65
+ *
66
+ * @return {import('@wordpress/element').WPElement} The scale tool.
67
+ */
68
+
69
+ export default function ScaleTool({
70
+ panelId,
71
+ value,
72
+ onChange,
73
+ options = DEFAULT_SCALE_OPTIONS,
74
+ defaultValue = DEFAULT_SCALE_OPTIONS[0].value,
75
+ isShownByDefault = true
76
+ }) {
77
+ // Match the CSS default so if the value is used directly in CSS it will look correct in the control.
78
+ const displayValue = value !== null && value !== void 0 ? value : 'fill';
79
+ const scaleHelp = useMemo(() => {
80
+ return options.reduce((acc, option) => {
81
+ acc[option.value] = option.help;
82
+ return acc;
83
+ }, {});
84
+ }, [options]);
85
+ return createElement(ToolsPanelItem, {
86
+ label: __('Scale'),
87
+ isShownByDefault: isShownByDefault,
88
+ hasValue: () => displayValue !== defaultValue,
89
+ onDeselect: () => onChange(defaultValue),
90
+ panelId: panelId
91
+ }, createElement(ToggleGroupControl, {
92
+ label: __('Scale'),
93
+ isBlock: true,
94
+ help: scaleHelp[displayValue],
95
+ value: displayValue,
96
+ onChange: onChange,
97
+ __nextHasNoMarginBottom: true
98
+ }, options.map(option => createElement(ToggleGroupControlOption, {
99
+ key: option.value,
100
+ ...option
101
+ }))));
102
+ }
103
+ //# sourceMappingURL=scale-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/dimensions-tool/scale-tool.js"],"names":["__experimentalToolsPanelItem","ToolsPanelItem","__experimentalToggleGroupControl","ToggleGroupControl","__experimentalToggleGroupControlOption","ToggleGroupControlOption","useMemo","__","_x","DEFAULT_SCALE_OPTIONS","value","label","help","ScaleTool","panelId","onChange","options","defaultValue","isShownByDefault","displayValue","scaleHelp","reduce","acc","option","map"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalToggleGroupControl as ToggleGroupControl,\n\t__experimentalToggleGroupControlOption as ToggleGroupControlOption,\n} from '@wordpress/components';\nimport { useMemo } from '@wordpress/element';\nimport { __, _x } from '@wordpress/i18n';\n\n/**\n * @typedef {import('@wordpress/components/build-types/select-control/types').SelectControlProps} SelectControlProps\n */\n\n/**\n * The descriptions are purposely made generic as object-fit could be used for\n * any replaced element. Provide your own set of options if you need different\n * help text or labels.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Replaced_element\n *\n * @type {SelectControlProps[]}\n */\nconst DEFAULT_SCALE_OPTIONS = [\n\t{\n\t\tvalue: 'fill',\n\t\tlabel: _x( 'Fill', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Fill the space by stretching the content.' ),\n\t},\n\t{\n\t\tvalue: 'contain',\n\t\tlabel: _x( 'Contain', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Fit the content to the space without clipping.' ),\n\t},\n\t{\n\t\tvalue: 'cover',\n\t\tlabel: _x( 'Cover', 'Scale option for dimensions control' ),\n\t\thelp: __( \"Fill the space by clipping what doesn't fit.\" ),\n\t},\n\t{\n\t\tvalue: 'none',\n\t\tlabel: _x( 'None', 'Scale option for dimensions control' ),\n\t\thelp: __(\n\t\t\t'Do not adjust the sizing of the content. Content that is too large will be clipped, and content that is too small will have additional padding.'\n\t\t),\n\t},\n\t{\n\t\tvalue: 'scale-down',\n\t\tlabel: _x( 'Scale down', 'Scale option for dimensions control' ),\n\t\thelp: __(\n\t\t\t'Scale down the content to fit the space if it is too big. Content that is too small will have additional padding.'\n\t\t),\n\t},\n];\n\n/**\n * @callback ScaleToolPropsOnChange\n * @param {string} nextValue New scale value.\n * @return {void}\n */\n\n/**\n * @typedef {Object} ScaleToolProps\n * @property {string} [panelId] ID of the panel that contains the controls.\n * @property {string} [value] Current scale value.\n * @property {ScaleToolPropsOnChange} [onChange] Callback to update the scale value.\n * @property {SelectControlProps[]} [options] Scale options.\n * @property {string} [defaultValue] Default scale value.\n * @property {boolean} [showControl=true] Whether to show the control.\n * @property {boolean} [isShownByDefault=true] Whether the tool panel is shown by default.\n */\n\n/**\n * A tool to select the CSS object-fit property for the image.\n *\n * @param {ScaleToolProps} props\n *\n * @return {import('@wordpress/element').WPElement} The scale tool.\n */\nexport default function ScaleTool( {\n\tpanelId,\n\tvalue,\n\tonChange,\n\toptions = DEFAULT_SCALE_OPTIONS,\n\tdefaultValue = DEFAULT_SCALE_OPTIONS[ 0 ].value,\n\tisShownByDefault = true,\n} ) {\n\t// Match the CSS default so if the value is used directly in CSS it will look correct in the control.\n\tconst displayValue = value ?? 'fill';\n\n\tconst scaleHelp = useMemo( () => {\n\t\treturn options.reduce( ( acc, option ) => {\n\t\t\tacc[ option.value ] = option.help;\n\t\t\treturn acc;\n\t\t}, {} );\n\t}, [ options ] );\n\n\treturn (\n\t\t<ToolsPanelItem\n\t\t\tlabel={ __( 'Scale' ) }\n\t\t\tisShownByDefault={ isShownByDefault }\n\t\t\thasValue={ () => displayValue !== defaultValue }\n\t\t\tonDeselect={ () => onChange( defaultValue ) }\n\t\t\tpanelId={ panelId }\n\t\t>\n\t\t\t<ToggleGroupControl\n\t\t\t\tlabel={ __( 'Scale' ) }\n\t\t\t\tisBlock\n\t\t\t\thelp={ scaleHelp[ displayValue ] }\n\t\t\t\tvalue={ displayValue }\n\t\t\t\tonChange={ onChange }\n\t\t\t\t__nextHasNoMarginBottom\n\t\t\t>\n\t\t\t\t{ options.map( ( option ) => (\n\t\t\t\t\t<ToggleGroupControlOption\n\t\t\t\t\t\tkey={ option.value }\n\t\t\t\t\t\t{ ...option }\n\t\t\t\t\t/>\n\t\t\t\t) ) }\n\t\t\t</ToggleGroupControl>\n\t\t</ToolsPanelItem>\n\t);\n}\n"]}