@wordpress/block-editor 15.10.1-next.ba3aee3a2.0 → 15.11.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 (214) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/block-bindings/attribute-control.cjs +1 -1
  3. package/build/components/block-bindings/attribute-control.cjs.map +1 -1
  4. package/build/components/block-bindings/source-fields-list.cjs +1 -1
  5. package/build/components/block-bindings/source-fields-list.cjs.map +1 -1
  6. package/build/components/block-edit/context.cjs +5 -0
  7. package/build/components/block-edit/context.cjs.map +2 -2
  8. package/build/components/block-edit/index.cjs +3 -0
  9. package/build/components/block-edit/index.cjs.map +2 -2
  10. package/build/components/block-inspector/index.cjs +2 -9
  11. package/build/components/block-inspector/index.cjs.map +2 -2
  12. package/build/components/block-list/block.cjs +3 -0
  13. package/build/components/block-list/block.cjs.map +2 -2
  14. package/build/components/block-tools/index.cjs +82 -70
  15. package/build/components/block-tools/index.cjs.map +2 -2
  16. package/build/components/block-visibility/block-visibility-info.cjs +0 -59
  17. package/build/components/block-visibility/block-visibility-info.cjs.map +3 -3
  18. package/build/components/block-visibility/constants.cjs +10 -5
  19. package/build/components/block-visibility/constants.cjs.map +2 -2
  20. package/build/components/block-visibility/index.cjs +13 -5
  21. package/build/components/block-visibility/index.cjs.map +3 -3
  22. package/build/components/block-visibility/modal.cjs +397 -0
  23. package/build/components/block-visibility/modal.cjs.map +7 -0
  24. package/build/components/block-visibility/toolbar.cjs +1 -1
  25. package/build/components/block-visibility/toolbar.cjs.map +2 -2
  26. package/build/components/block-visibility/use-block-visibility.cjs +13 -17
  27. package/build/components/block-visibility/use-block-visibility.cjs.map +2 -2
  28. package/build/components/block-visibility/utils.cjs +81 -0
  29. package/build/components/block-visibility/utils.cjs.map +7 -0
  30. package/build/components/block-visibility/viewport-menu-item.cjs +61 -0
  31. package/build/components/block-visibility/viewport-menu-item.cjs.map +7 -0
  32. package/build/components/block-visibility/viewport-toolbar.cjs +89 -0
  33. package/build/components/block-visibility/viewport-toolbar.cjs.map +7 -0
  34. package/build/components/button-block-appender/index.cjs +23 -19
  35. package/build/components/button-block-appender/index.cjs.map +2 -2
  36. package/build/components/font-sizes/font-size-picker.cjs +2 -1
  37. package/build/components/font-sizes/font-size-picker.cjs.map +2 -2
  38. package/build/components/inner-blocks/use-inner-block-template-sync.cjs +1 -1
  39. package/build/components/inner-blocks/use-inner-block-template-sync.cjs.map +1 -1
  40. package/build/components/inserter/menu.cjs +6 -2
  41. package/build/components/inserter/menu.cjs.map +2 -2
  42. package/build/components/inspector-controls/fill.cjs +4 -25
  43. package/build/components/inspector-controls/fill.cjs.map +2 -2
  44. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs +6 -6
  45. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs.map +2 -2
  46. package/build/components/list-view/block-select-button.cjs +2 -2
  47. package/build/components/list-view/block-select-button.cjs.map +2 -2
  48. package/build/components/list-view/block.cjs +39 -22
  49. package/build/components/list-view/block.cjs.map +2 -2
  50. package/build/components/rich-text/index.cjs +1 -1
  51. package/build/components/rich-text/index.cjs.map +1 -1
  52. package/build/components/url-input/index.cjs +2 -0
  53. package/build/components/url-input/index.cjs.map +2 -2
  54. package/build/components/use-block-commands/index.cjs +1 -1
  55. package/build/components/use-block-commands/index.cjs.map +2 -2
  56. package/build/hooks/block-fields/index.cjs +92 -217
  57. package/build/hooks/block-fields/index.cjs.map +3 -3
  58. package/build/hooks/block-fields/link/index.cjs +13 -32
  59. package/build/hooks/block-fields/link/index.cjs.map +2 -2
  60. package/build/hooks/block-fields/media/index.cjs +36 -67
  61. package/build/hooks/block-fields/media/index.cjs.map +2 -2
  62. package/build/hooks/block-fields/rich-text/index.cjs +1 -5
  63. package/build/hooks/block-fields/rich-text/index.cjs.map +2 -2
  64. package/build/hooks/cross-origin-isolation.cjs +102 -0
  65. package/build/hooks/cross-origin-isolation.cjs.map +7 -0
  66. package/build/hooks/index.cjs +3 -1
  67. package/build/hooks/index.cjs.map +3 -3
  68. package/build/hooks/list-view.cjs +27 -10
  69. package/build/hooks/list-view.cjs.map +2 -2
  70. package/build/hooks/utils.cjs +3 -2
  71. package/build/hooks/utils.cjs.map +2 -2
  72. package/build/layouts/flex.cjs +6 -2
  73. package/build/layouts/flex.cjs.map +2 -2
  74. package/build/store/private-selectors.cjs +33 -1
  75. package/build/store/private-selectors.cjs.map +3 -3
  76. package/build/store/reducer.cjs +1 -1
  77. package/build/store/reducer.cjs.map +1 -1
  78. package/build/store/selectors.cjs +14 -9
  79. package/build/store/selectors.cjs.map +2 -2
  80. package/build-module/components/block-bindings/attribute-control.mjs +1 -1
  81. package/build-module/components/block-bindings/attribute-control.mjs.map +1 -1
  82. package/build-module/components/block-bindings/source-fields-list.mjs +1 -1
  83. package/build-module/components/block-bindings/source-fields-list.mjs.map +1 -1
  84. package/build-module/components/block-edit/context.mjs +4 -0
  85. package/build-module/components/block-edit/context.mjs.map +2 -2
  86. package/build-module/components/block-edit/index.mjs +4 -0
  87. package/build-module/components/block-edit/index.mjs.map +2 -2
  88. package/build-module/components/block-inspector/index.mjs +2 -9
  89. package/build-module/components/block-inspector/index.mjs.map +2 -2
  90. package/build-module/components/block-list/block.mjs +3 -0
  91. package/build-module/components/block-list/block.mjs.map +2 -2
  92. package/build-module/components/block-tools/index.mjs +85 -73
  93. package/build-module/components/block-tools/index.mjs.map +2 -2
  94. package/build-module/components/block-visibility/block-visibility-info.mjs +0 -59
  95. package/build-module/components/block-visibility/block-visibility-info.mjs.map +3 -3
  96. package/build-module/components/block-visibility/constants.mjs +8 -4
  97. package/build-module/components/block-visibility/constants.mjs.map +2 -2
  98. package/build-module/components/block-visibility/index.mjs +13 -6
  99. package/build-module/components/block-visibility/index.mjs.map +2 -2
  100. package/build-module/components/block-visibility/modal.mjs +384 -0
  101. package/build-module/components/block-visibility/modal.mjs.map +7 -0
  102. package/build-module/components/block-visibility/toolbar.mjs +1 -1
  103. package/build-module/components/block-visibility/toolbar.mjs.map +2 -2
  104. package/build-module/components/block-visibility/use-block-visibility.mjs +13 -13
  105. package/build-module/components/block-visibility/use-block-visibility.mjs.map +2 -2
  106. package/build-module/components/block-visibility/utils.mjs +55 -0
  107. package/build-module/components/block-visibility/utils.mjs.map +7 -0
  108. package/build-module/components/block-visibility/viewport-menu-item.mjs +40 -0
  109. package/build-module/components/block-visibility/viewport-menu-item.mjs.map +7 -0
  110. package/build-module/components/block-visibility/viewport-toolbar.mjs +68 -0
  111. package/build-module/components/block-visibility/viewport-toolbar.mjs.map +7 -0
  112. package/build-module/components/button-block-appender/index.mjs +23 -19
  113. package/build-module/components/button-block-appender/index.mjs.map +2 -2
  114. package/build-module/components/font-sizes/font-size-picker.mjs +2 -1
  115. package/build-module/components/font-sizes/font-size-picker.mjs.map +2 -2
  116. package/build-module/components/inner-blocks/use-inner-block-template-sync.mjs +1 -1
  117. package/build-module/components/inner-blocks/use-inner-block-template-sync.mjs.map +1 -1
  118. package/build-module/components/inserter/menu.mjs +6 -2
  119. package/build-module/components/inserter/menu.mjs.map +2 -2
  120. package/build-module/components/inspector-controls/fill.mjs +6 -22
  121. package/build-module/components/inspector-controls/fill.mjs.map +2 -2
  122. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs +6 -6
  123. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs.map +2 -2
  124. package/build-module/components/list-view/block-select-button.mjs +2 -2
  125. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  126. package/build-module/components/list-view/block.mjs +39 -22
  127. package/build-module/components/list-view/block.mjs.map +2 -2
  128. package/build-module/components/rich-text/index.mjs +1 -1
  129. package/build-module/components/rich-text/index.mjs.map +1 -1
  130. package/build-module/components/url-input/index.mjs +2 -0
  131. package/build-module/components/url-input/index.mjs.map +2 -2
  132. package/build-module/components/use-block-commands/index.mjs +1 -1
  133. package/build-module/components/use-block-commands/index.mjs.map +2 -2
  134. package/build-module/hooks/block-fields/index.mjs +85 -218
  135. package/build-module/hooks/block-fields/index.mjs.map +2 -2
  136. package/build-module/hooks/block-fields/link/index.mjs +13 -32
  137. package/build-module/hooks/block-fields/link/index.mjs.map +2 -2
  138. package/build-module/hooks/block-fields/media/index.mjs +36 -67
  139. package/build-module/hooks/block-fields/media/index.mjs.map +2 -2
  140. package/build-module/hooks/block-fields/rich-text/index.mjs +1 -5
  141. package/build-module/hooks/block-fields/rich-text/index.mjs.map +2 -2
  142. package/build-module/hooks/cross-origin-isolation.mjs +100 -0
  143. package/build-module/hooks/cross-origin-isolation.mjs.map +7 -0
  144. package/build-module/hooks/index.mjs +3 -1
  145. package/build-module/hooks/index.mjs.map +2 -2
  146. package/build-module/hooks/list-view.mjs +27 -10
  147. package/build-module/hooks/list-view.mjs.map +2 -2
  148. package/build-module/hooks/utils.mjs +5 -3
  149. package/build-module/hooks/utils.mjs.map +2 -2
  150. package/build-module/layouts/flex.mjs +6 -2
  151. package/build-module/layouts/flex.mjs.map +2 -2
  152. package/build-module/store/private-selectors.mjs +34 -1
  153. package/build-module/store/private-selectors.mjs.map +2 -2
  154. package/build-module/store/reducer.mjs +1 -1
  155. package/build-module/store/reducer.mjs.map +1 -1
  156. package/build-module/store/selectors.mjs +14 -9
  157. package/build-module/store/selectors.mjs.map +2 -2
  158. package/build-style/content-rtl.css +4 -1
  159. package/build-style/content.css +4 -1
  160. package/build-style/style-rtl.css +48 -0
  161. package/build-style/style.css +48 -0
  162. package/package.json +39 -39
  163. package/src/components/block-bindings/attribute-control.js +1 -1
  164. package/src/components/block-bindings/source-fields-list.js +1 -1
  165. package/src/components/block-edit/context.js +3 -0
  166. package/src/components/block-edit/index.js +6 -0
  167. package/src/components/block-inspector/index.js +2 -6
  168. package/src/components/block-list/block.js +3 -0
  169. package/src/components/block-list/block.native.js +5 -0
  170. package/src/components/block-list/content.scss +4 -1
  171. package/src/components/block-patterns-list/stories/index.story.jsx +1 -1
  172. package/src/components/block-tools/index.js +45 -33
  173. package/src/components/block-visibility/block-visibility-info.js +0 -1
  174. package/src/components/block-visibility/constants.js +7 -3
  175. package/src/components/block-visibility/index.js +21 -3
  176. package/src/components/block-visibility/modal.js +358 -0
  177. package/src/components/block-visibility/style.scss +58 -0
  178. package/src/components/block-visibility/test/use-block-visibility.js +12 -56
  179. package/src/components/block-visibility/test/utils.js +266 -0
  180. package/src/components/block-visibility/toolbar.js +1 -1
  181. package/src/components/block-visibility/use-block-visibility.js +18 -21
  182. package/src/components/block-visibility/utils.js +95 -0
  183. package/src/components/block-visibility/viewport-menu-item.js +42 -0
  184. package/src/components/block-visibility/viewport-toolbar.js +88 -0
  185. package/src/components/button-block-appender/index.js +2 -2
  186. package/src/components/font-sizes/font-size-picker.js +1 -0
  187. package/src/components/inner-blocks/use-inner-block-template-sync.js +1 -1
  188. package/src/components/inserter/menu.js +6 -2
  189. package/src/components/inspector-controls/fill.js +10 -20
  190. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +11 -8
  191. package/src/components/list-view/block-select-button.js +2 -2
  192. package/src/components/list-view/block.js +47 -25
  193. package/src/components/rich-text/index.js +1 -1
  194. package/src/components/url-input/index.js +2 -0
  195. package/src/components/use-block-commands/index.js +4 -3
  196. package/src/hooks/block-fields/index.js +127 -292
  197. package/src/hooks/block-fields/link/index.js +13 -51
  198. package/src/hooks/block-fields/media/index.js +35 -106
  199. package/src/hooks/block-fields/rich-text/index.js +1 -5
  200. package/src/hooks/block-fields/styles.scss +2 -0
  201. package/src/hooks/cross-origin-isolation.js +143 -0
  202. package/src/hooks/index.js +3 -1
  203. package/src/hooks/list-view.js +40 -10
  204. package/src/hooks/utils.js +4 -0
  205. package/src/layouts/flex.js +8 -3
  206. package/src/layouts/test/flex.js +53 -0
  207. package/src/store/private-selectors.js +64 -1
  208. package/src/store/reducer.js +1 -1
  209. package/src/store/selectors.js +21 -15
  210. package/src/store/test/private-selectors.js +80 -0
  211. package/src/style.scss +1 -0
  212. package/src/components/block-visibility/styles.scss +0 -10
  213. /package/src/components/block-icon/stories/{index.story.js → index.story.ts} +0 -0
  214. /package/src/components/contrast-checker/stories/{index.story.js → index.story.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/url-input/index.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { __, sprintf, _n } from '@wordpress/i18n';\nimport { Component, createRef } from '@wordpress/element';\nimport { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes';\nimport {\n\tBaseControl,\n\tButton,\n\t__experimentalInputControl as InputControl,\n\tSpinner,\n\twithSpokenMessages,\n\tPopover,\n} from '@wordpress/components';\nimport {\n\tcompose,\n\tdebounce,\n\twithInstanceId,\n\twithSafeTimeout,\n} from '@wordpress/compose';\nimport { withSelect } from '@wordpress/data';\nimport { isURL } from '@wordpress/url';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\n/**\n * Whether the argument is a function.\n *\n * @param {*} maybeFunc The argument to check.\n * @return {boolean} True if the argument is a function, false otherwise.\n */\nfunction isFunction( maybeFunc ) {\n\treturn typeof maybeFunc === 'function';\n}\n\nclass URLInput extends Component {\n\tconstructor( props ) {\n\t\tsuper( props );\n\n\t\tthis.onChange = this.onChange.bind( this );\n\t\tthis.onFocus = this.onFocus.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\t\tthis.selectLink = this.selectLink.bind( this );\n\t\tthis.handleOnClick = this.handleOnClick.bind( this );\n\t\tthis.bindSuggestionNode = this.bindSuggestionNode.bind( this );\n\t\tthis.autocompleteRef = props.autocompleteRef || createRef();\n\t\tthis.inputRef = props.inputRef || createRef();\n\t\tthis.updateSuggestions = debounce(\n\t\t\tthis.updateSuggestions.bind( this ),\n\t\t\t200\n\t\t);\n\n\t\tthis.suggestionNodes = [];\n\n\t\tthis.suggestionsRequest = null;\n\n\t\tthis.state = {\n\t\t\tsuggestions: [],\n\t\t\tshowSuggestions: false,\n\t\t\tsuggestionsValue: null,\n\t\t\tselectedSuggestion: null,\n\t\t\tsuggestionsListboxId: '',\n\t\t\tsuggestionOptionIdPrefix: '',\n\t\t};\n\t}\n\n\tcomponentDidUpdate( prevProps ) {\n\t\tconst { showSuggestions, selectedSuggestion } = this.state;\n\t\tconst { value, __experimentalShowInitialSuggestions = false } =\n\t\t\tthis.props;\n\n\t\t// Only have to worry about scrolling selected suggestion into view\n\t\t// when already expanded.\n\t\tif (\n\t\t\tshowSuggestions &&\n\t\t\tselectedSuggestion !== null &&\n\t\t\tthis.suggestionNodes[ selectedSuggestion ]\n\t\t) {\n\t\t\tthis.suggestionNodes[ selectedSuggestion ].scrollIntoView( {\n\t\t\t\tbehavior: 'instant',\n\t\t\t\tblock: 'nearest',\n\t\t\t\tinline: 'nearest',\n\t\t\t} );\n\t\t}\n\n\t\t// Update suggestions when the value changes.\n\t\tif ( prevProps.value !== value && ! this.props.disableSuggestions ) {\n\t\t\tif ( value?.length ) {\n\t\t\t\t// If the new value is not empty we need to update with suggestions for it.\n\t\t\t\tthis.updateSuggestions( value );\n\t\t\t} else if ( __experimentalShowInitialSuggestions ) {\n\t\t\t\t// If the new value is empty and we can show initial suggestions, then show initial suggestions.\n\t\t\t\tthis.updateSuggestions();\n\t\t\t}\n\t\t}\n\t}\n\n\tcomponentDidMount() {\n\t\tif ( this.shouldShowInitialSuggestions() ) {\n\t\t\tthis.updateSuggestions();\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis.suggestionsRequest?.cancel?.();\n\t\tthis.suggestionsRequest = null;\n\t}\n\n\tbindSuggestionNode( index ) {\n\t\treturn ( ref ) => {\n\t\t\tthis.suggestionNodes[ index ] = ref;\n\t\t};\n\t}\n\n\tshouldShowInitialSuggestions() {\n\t\tconst { __experimentalShowInitialSuggestions = false, value } =\n\t\t\tthis.props;\n\t\treturn (\n\t\t\t__experimentalShowInitialSuggestions && ! ( value && value.length )\n\t\t);\n\t}\n\n\tupdateSuggestions( value = '' ) {\n\t\tconst {\n\t\t\t__experimentalFetchLinkSuggestions: fetchLinkSuggestions,\n\t\t\t__experimentalHandleURLSuggestions: handleURLSuggestions,\n\t\t} = this.props;\n\n\t\tif ( ! fetchLinkSuggestions ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initial suggestions may only show if there is no value\n\t\t// (note: this includes whitespace).\n\t\tconst isInitialSuggestions = ! value?.length;\n\n\t\t// Trim only now we've determined whether or not it originally had a \"length\"\n\t\t// (even if that value was all whitespace).\n\t\tvalue = value.trim();\n\n\t\t// Allow a suggestions request if:\n\t\t// - there are at least 2 characters in the search input (except manual searches where\n\t\t// search input length is not required to trigger a fetch)\n\t\t// - this is a direct entry (eg: a URL)\n\t\tif (\n\t\t\t! isInitialSuggestions &&\n\t\t\t( value.length < 2 || ( ! handleURLSuggestions && isURL( value ) ) )\n\t\t) {\n\t\t\tthis.suggestionsRequest?.cancel?.();\n\t\t\tthis.suggestionsRequest = null;\n\n\t\t\tthis.setState( {\n\t\t\t\tsuggestions: [],\n\t\t\t\tshowSuggestions: false,\n\t\t\t\tsuggestionsValue: value,\n\t\t\t\tselectedSuggestion: null,\n\t\t\t\tloading: false,\n\t\t\t} );\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState( {\n\t\t\tselectedSuggestion: null,\n\t\t\tloading: true,\n\t\t} );\n\n\t\tconst request = fetchLinkSuggestions( value, {\n\t\t\tisInitialSuggestions,\n\t\t} );\n\n\t\trequest\n\t\t\t.then( ( suggestions ) => {\n\t\t\t\t// A fetch Promise doesn't have an abort option. It's mimicked by\n\t\t\t\t// comparing the request reference in on the instance, which is\n\t\t\t\t// reset or deleted on subsequent requests or unmounting.\n\t\t\t\tif ( this.suggestionsRequest !== request ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.setState( {\n\t\t\t\t\tsuggestions,\n\t\t\t\t\tsuggestionsValue: value,\n\t\t\t\t\tloading: false,\n\t\t\t\t\tshowSuggestions: !! suggestions.length,\n\t\t\t\t} );\n\n\t\t\t\tif ( !! suggestions.length ) {\n\t\t\t\t\tthis.props.debouncedSpeak(\n\t\t\t\t\t\tsprintf(\n\t\t\t\t\t\t\t/* translators: %d: number of results. */\n\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t'%d result found, use up and down arrow keys to navigate.',\n\t\t\t\t\t\t\t\t'%d results found, use up and down arrow keys to navigate.',\n\t\t\t\t\t\t\t\tsuggestions.length\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tsuggestions.length\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'assertive'\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.props.debouncedSpeak(\n\t\t\t\t\t\t__( 'No results.' ),\n\t\t\t\t\t\t'assertive'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.catch( () => {\n\t\t\t\tif ( this.suggestionsRequest !== request ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.setState( {\n\t\t\t\t\tloading: false,\n\t\t\t\t} );\n\t\t\t} )\n\t\t\t.finally( () => {\n\t\t\t\t// If this is the current promise then reset the reference\n\t\t\t\t// to allow for checking if a new request is made.\n\t\t\t\tif ( this.suggestionsRequest === request ) {\n\t\t\t\t\tthis.suggestionsRequest = null;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// Note that this assignment is handled *before* the async search request\n\t\t// as a Promise always resolves on the next tick of the event loop.\n\t\tthis.suggestionsRequest = request;\n\t}\n\n\tonChange( newValue ) {\n\t\tthis.props.onChange( newValue );\n\t}\n\n\tonFocus() {\n\t\tconst { suggestions } = this.state;\n\t\tconst { disableSuggestions, value } = this.props;\n\n\t\t// When opening the link editor, if there's a value present, we want to load the suggestions pane with the results for this input search value\n\t\t// Don't re-run the suggestions on focus if there are already suggestions present (prevents searching again when tabbing between the input and buttons)\n\t\t// or there is already a request in progress.\n\t\tif (\n\t\t\tvalue &&\n\t\t\t! disableSuggestions &&\n\t\t\t! ( suggestions && suggestions.length ) &&\n\t\t\tthis.suggestionsRequest === null\n\t\t) {\n\t\t\t// Ensure the suggestions are updated with the current input value.\n\t\t\tthis.updateSuggestions( value );\n\t\t}\n\t}\n\n\tonKeyDown( event ) {\n\t\tthis.props.onKeyDown?.( event );\n\t\tconst { showSuggestions, selectedSuggestion, suggestions, loading } =\n\t\t\tthis.state;\n\n\t\t// If the suggestions are not shown or loading, we shouldn't handle the arrow keys\n\t\t// We shouldn't preventDefault to allow block arrow keys navigation.\n\t\tif ( ! showSuggestions || ! suggestions.length || loading ) {\n\t\t\t// In the Windows version of Firefox the up and down arrows don't move the caret\n\t\t\t// within an input field like they do for Mac Firefox/Chrome/Safari. This causes\n\t\t\t// a form of focus trapping that is disruptive to the user experience. This disruption\n\t\t\t// only happens if the caret is not in the first or last position in the text input.\n\t\t\t// See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\t// When UP is pressed, if the caret is at the start of the text, move it to the 0\n\t\t\t\t// position.\n\t\t\t\tcase UP: {\n\t\t\t\t\tif ( 0 !== event.target.selectionStart ) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to position 0.\n\t\t\t\t\t\tevent.target.setSelectionRange( 0, 0 );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// When DOWN is pressed, if the caret is not at the end of the text, move it to the\n\t\t\t\t// last position.\n\t\t\t\tcase DOWN: {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.props.value.length !== event.target.selectionStart\n\t\t\t\t\t) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to the last position.\n\t\t\t\t\t\tevent.target.setSelectionRange(\n\t\t\t\t\t\t\tthis.props.value.length,\n\t\t\t\t\t\t\tthis.props.value.length\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Submitting while loading should trigger onSubmit.\n\t\t\t\tcase ENTER: {\n\t\t\t\t\tif ( this.props.onSubmit ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis.props.onSubmit( null, event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst suggestion =\n\t\t\tthis.state.suggestions[ this.state.selectedSuggestion ];\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase UP: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst previousIndex = ! selectedSuggestion\n\t\t\t\t\t? suggestions.length - 1\n\t\t\t\t\t: selectedSuggestion - 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: previousIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DOWN: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst nextIndex =\n\t\t\t\t\tselectedSuggestion === null ||\n\t\t\t\t\tselectedSuggestion === suggestions.length - 1\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: selectedSuggestion + 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: nextIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAB: {\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tthis.selectLink( suggestion );\n\t\t\t\t\t// Announce a link has been selected when tabbing away from the input field.\n\t\t\t\t\tthis.props.speak( __( 'Link selected.' ) );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ENTER: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tthis.selectLink( suggestion );\n\n\t\t\t\t\tif ( this.props.onSubmit ) {\n\t\t\t\t\t\tthis.props.onSubmit( suggestion, event );\n\t\t\t\t\t}\n\t\t\t\t} else if ( this.props.onSubmit ) {\n\t\t\t\t\tthis.props.onSubmit( null, event );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tselectLink( suggestion ) {\n\t\tthis.props.onChange( suggestion.url, suggestion );\n\t\tthis.setState( {\n\t\t\tselectedSuggestion: null,\n\t\t\tshowSuggestions: false,\n\t\t} );\n\t}\n\n\thandleOnClick( suggestion ) {\n\t\tthis.selectLink( suggestion );\n\t\t// Move focus to the input field when a link suggestion is clicked.\n\t\tthis.inputRef.current.focus();\n\t}\n\n\tstatic getDerivedStateFromProps(\n\t\t{\n\t\t\tvalue,\n\t\t\tinstanceId,\n\t\t\tdisableSuggestions,\n\t\t\t__experimentalShowInitialSuggestions = false,\n\t\t},\n\t\t{ showSuggestions }\n\t) {\n\t\tlet shouldShowSuggestions = showSuggestions;\n\n\t\tconst hasValue = value && value.length;\n\n\t\tif ( ! __experimentalShowInitialSuggestions && ! hasValue ) {\n\t\t\tshouldShowSuggestions = false;\n\t\t}\n\n\t\tif ( disableSuggestions === true ) {\n\t\t\tshouldShowSuggestions = false;\n\t\t}\n\n\t\treturn {\n\t\t\tshowSuggestions: shouldShowSuggestions,\n\t\t\tsuggestionsListboxId: `block-editor-url-input-suggestions-${ instanceId }`,\n\t\t\tsuggestionOptionIdPrefix: `block-editor-url-input-suggestion-${ instanceId }`,\n\t\t};\n\t}\n\n\trender() {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{ this.renderControl() }\n\t\t\t\t{ this.renderSuggestions() }\n\t\t\t</>\n\t\t);\n\t}\n\n\trenderControl() {\n\t\tconst {\n\t\t\tlabel = null,\n\t\t\tclassName,\n\t\t\tisFullWidth,\n\t\t\tinstanceId,\n\t\t\tplaceholder = __( 'Paste URL or type to search' ),\n\t\t\t__experimentalRenderControl: renderControl,\n\t\t\tvalue = '',\n\t\t\thideLabelFromVision = false,\n\t\t\thelp = null,\n\t\t\tdisabled = false,\n\t\t} = this.props;\n\n\t\tconst {\n\t\t\tloading,\n\t\t\tshowSuggestions,\n\t\t\tselectedSuggestion,\n\t\t\tsuggestionsListboxId,\n\t\t\tsuggestionOptionIdPrefix,\n\t\t} = this.state;\n\n\t\tconst inputId = `url-input-control-${ instanceId }`;\n\n\t\tconst controlProps = {\n\t\t\tid: inputId, // Passes attribute to label for the for attribute\n\t\t\tlabel,\n\t\t\tclassName: clsx( 'block-editor-url-input', className, {\n\t\t\t\t'is-full-width': isFullWidth,\n\t\t\t} ),\n\t\t\thideLabelFromVision,\n\t\t};\n\n\t\tconst inputProps = {\n\t\t\tid: inputId,\n\t\t\tvalue,\n\t\t\trequired: true,\n\t\t\ttype: 'text',\n\t\t\tonChange: disabled ? () => {} : this.onChange, // Disable onChange when disabled\n\t\t\tonFocus: disabled ? () => {} : this.onFocus, // Disable onFocus when disabled\n\t\t\tplaceholder,\n\t\t\tonKeyDown: disabled ? () => {} : this.onKeyDown, // Disable onKeyDown when disabled\n\t\t\trole: 'combobox',\n\t\t\t'aria-label': label ? undefined : __( 'URL' ), // Ensure input always has an accessible label\n\t\t\t'aria-expanded': showSuggestions,\n\t\t\t'aria-autocomplete': 'list',\n\t\t\t'aria-owns': suggestionsListboxId,\n\t\t\t'aria-activedescendant':\n\t\t\t\tselectedSuggestion !== null\n\t\t\t\t\t? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }`\n\t\t\t\t\t: undefined,\n\t\t\tref: this.inputRef,\n\t\t\tdisabled,\n\t\t\tsuffix: this.props.suffix,\n\t\t\thelp,\n\t\t};\n\n\t\tif ( renderControl ) {\n\t\t\treturn renderControl( controlProps, inputProps, loading );\n\t\t}\n\n\t\treturn (\n\t\t\t<BaseControl { ...controlProps }>\n\t\t\t\t<InputControl { ...inputProps } __next40pxDefaultSize />\n\t\t\t\t{ loading && <Spinner /> }\n\t\t\t</BaseControl>\n\t\t);\n\t}\n\n\trenderSuggestions() {\n\t\tconst {\n\t\t\tclassName,\n\t\t\t__experimentalRenderSuggestions: renderSuggestions,\n\t\t} = this.props;\n\n\t\tconst {\n\t\t\tshowSuggestions,\n\t\t\tsuggestions,\n\t\t\tsuggestionsValue,\n\t\t\tselectedSuggestion,\n\t\t\tsuggestionsListboxId,\n\t\t\tsuggestionOptionIdPrefix,\n\t\t\tloading,\n\t\t} = this.state;\n\n\t\tif ( ! showSuggestions || suggestions.length === 0 ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst suggestionsListProps = {\n\t\t\tid: suggestionsListboxId,\n\t\t\tref: this.autocompleteRef,\n\t\t\trole: 'listbox',\n\t\t};\n\n\t\tconst buildSuggestionItemProps = ( suggestion, index ) => {\n\t\t\treturn {\n\t\t\t\trole: 'option',\n\t\t\t\ttabIndex: '-1',\n\t\t\t\tid: `${ suggestionOptionIdPrefix }-${ index }`,\n\t\t\t\tref: this.bindSuggestionNode( index ),\n\t\t\t\t'aria-selected':\n\t\t\t\t\tindex === selectedSuggestion ? true : undefined,\n\t\t\t};\n\t\t};\n\n\t\tif ( isFunction( renderSuggestions ) ) {\n\t\t\treturn renderSuggestions( {\n\t\t\t\tsuggestions,\n\t\t\t\tselectedSuggestion,\n\t\t\t\tsuggestionsListProps,\n\t\t\t\tbuildSuggestionItemProps,\n\t\t\t\tisLoading: loading,\n\t\t\t\thandleSuggestionClick: this.handleOnClick,\n\t\t\t\tisInitialSuggestions: ! suggestionsValue?.length,\n\t\t\t\tcurrentInputValue: suggestionsValue,\n\t\t\t} );\n\t\t}\n\n\t\treturn (\n\t\t\t<Popover placement=\"bottom\" focusOnMount={ false }>\n\t\t\t\t<div\n\t\t\t\t\t{ ...suggestionsListProps }\n\t\t\t\t\tclassName={ clsx( 'block-editor-url-input__suggestions', {\n\t\t\t\t\t\t[ `${ className }__suggestions` ]: className,\n\t\t\t\t\t} ) }\n\t\t\t\t>\n\t\t\t\t\t{ suggestions.map( ( suggestion, index ) => (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t{ ...buildSuggestionItemProps( suggestion, index ) }\n\t\t\t\t\t\t\tkey={ suggestion.id }\n\t\t\t\t\t\t\tclassName={ clsx(\n\t\t\t\t\t\t\t\t'block-editor-url-input__suggestion',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'is-selected': index === selectedSuggestion,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\tonClick={ () => this.handleOnClick( suggestion ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ suggestion.title }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t) ) }\n\t\t\t\t</div>\n\t\t\t</Popover>\n\t\t);\n\t}\n}\n\n/**\n * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/url-input/README.md\n */\nexport default compose(\n\twithSafeTimeout,\n\twithSpokenMessages,\n\twithInstanceId,\n\twithSelect( ( select, props ) => {\n\t\t// If a link suggestions handler is already provided then\n\t\t// bail.\n\t\tif ( isFunction( props.__experimentalFetchLinkSuggestions ) ) {\n\t\t\treturn;\n\t\t}\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\treturn {\n\t\t\t__experimentalFetchLinkSuggestions:\n\t\t\t\tgetSettings().__experimentalFetchLinkSuggestions,\n\t\t};\n\t} )\n)( URLInput );\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { __, sprintf, _n } from '@wordpress/i18n';\nimport { Component, createRef } from '@wordpress/element';\nimport { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes';\nimport {\n\tBaseControl,\n\tButton,\n\t__experimentalInputControl as InputControl,\n\tSpinner,\n\twithSpokenMessages,\n\tPopover,\n} from '@wordpress/components';\nimport {\n\tcompose,\n\tdebounce,\n\twithInstanceId,\n\twithSafeTimeout,\n} from '@wordpress/compose';\nimport { withSelect } from '@wordpress/data';\nimport { isURL } from '@wordpress/url';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\n/**\n * Whether the argument is a function.\n *\n * @param {*} maybeFunc The argument to check.\n * @return {boolean} True if the argument is a function, false otherwise.\n */\nfunction isFunction( maybeFunc ) {\n\treturn typeof maybeFunc === 'function';\n}\n\nclass URLInput extends Component {\n\tconstructor( props ) {\n\t\tsuper( props );\n\n\t\tthis.onChange = this.onChange.bind( this );\n\t\tthis.onFocus = this.onFocus.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\t\tthis.selectLink = this.selectLink.bind( this );\n\t\tthis.handleOnClick = this.handleOnClick.bind( this );\n\t\tthis.bindSuggestionNode = this.bindSuggestionNode.bind( this );\n\t\tthis.autocompleteRef = props.autocompleteRef || createRef();\n\t\tthis.inputRef = props.inputRef || createRef();\n\t\tthis.updateSuggestions = debounce(\n\t\t\tthis.updateSuggestions.bind( this ),\n\t\t\t200\n\t\t);\n\n\t\tthis.suggestionNodes = [];\n\n\t\tthis.suggestionsRequest = null;\n\n\t\tthis.state = {\n\t\t\tsuggestions: [],\n\t\t\tshowSuggestions: false,\n\t\t\tsuggestionsValue: null,\n\t\t\tselectedSuggestion: null,\n\t\t\tsuggestionsListboxId: '',\n\t\t\tsuggestionOptionIdPrefix: '',\n\t\t};\n\t}\n\n\tcomponentDidUpdate( prevProps ) {\n\t\tconst { showSuggestions, selectedSuggestion } = this.state;\n\t\tconst { value, __experimentalShowInitialSuggestions = false } =\n\t\t\tthis.props;\n\n\t\t// Only have to worry about scrolling selected suggestion into view\n\t\t// when already expanded.\n\t\tif (\n\t\t\tshowSuggestions &&\n\t\t\tselectedSuggestion !== null &&\n\t\t\tthis.suggestionNodes[ selectedSuggestion ]\n\t\t) {\n\t\t\tthis.suggestionNodes[ selectedSuggestion ].scrollIntoView( {\n\t\t\t\tbehavior: 'instant',\n\t\t\t\tblock: 'nearest',\n\t\t\t\tinline: 'nearest',\n\t\t\t} );\n\t\t}\n\n\t\t// Update suggestions when the value changes.\n\t\tif ( prevProps.value !== value && ! this.props.disableSuggestions ) {\n\t\t\tif ( value?.length ) {\n\t\t\t\t// If the new value is not empty we need to update with suggestions for it.\n\t\t\t\tthis.updateSuggestions( value );\n\t\t\t} else if ( __experimentalShowInitialSuggestions ) {\n\t\t\t\t// If the new value is empty and we can show initial suggestions, then show initial suggestions.\n\t\t\t\tthis.updateSuggestions();\n\t\t\t}\n\t\t}\n\t}\n\n\tcomponentDidMount() {\n\t\tif ( this.shouldShowInitialSuggestions() ) {\n\t\t\tthis.updateSuggestions();\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis.suggestionsRequest?.cancel?.();\n\t\tthis.suggestionsRequest = null;\n\t}\n\n\tbindSuggestionNode( index ) {\n\t\treturn ( ref ) => {\n\t\t\tthis.suggestionNodes[ index ] = ref;\n\t\t};\n\t}\n\n\tshouldShowInitialSuggestions() {\n\t\tconst { __experimentalShowInitialSuggestions = false, value } =\n\t\t\tthis.props;\n\t\treturn (\n\t\t\t__experimentalShowInitialSuggestions && ! ( value && value.length )\n\t\t);\n\t}\n\n\tupdateSuggestions( value = '' ) {\n\t\tconst {\n\t\t\t__experimentalFetchLinkSuggestions: fetchLinkSuggestions,\n\t\t\t__experimentalHandleURLSuggestions: handleURLSuggestions,\n\t\t} = this.props;\n\n\t\tif ( ! fetchLinkSuggestions ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initial suggestions may only show if there is no value\n\t\t// (note: this includes whitespace).\n\t\tconst isInitialSuggestions = ! value?.length;\n\n\t\t// Trim only now we've determined whether or not it originally had a \"length\"\n\t\t// (even if that value was all whitespace).\n\t\tvalue = value.trim();\n\n\t\t// Allow a suggestions request if:\n\t\t// - there are at least 2 characters in the search input (except manual searches where\n\t\t// search input length is not required to trigger a fetch)\n\t\t// - this is a direct entry (eg: a URL)\n\t\tif (\n\t\t\t! isInitialSuggestions &&\n\t\t\t( value.length < 2 || ( ! handleURLSuggestions && isURL( value ) ) )\n\t\t) {\n\t\t\tthis.suggestionsRequest?.cancel?.();\n\t\t\tthis.suggestionsRequest = null;\n\n\t\t\tthis.setState( {\n\t\t\t\tsuggestions: [],\n\t\t\t\tshowSuggestions: false,\n\t\t\t\tsuggestionsValue: value,\n\t\t\t\tselectedSuggestion: null,\n\t\t\t\tloading: false,\n\t\t\t} );\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState( {\n\t\t\tselectedSuggestion: null,\n\t\t\tloading: true,\n\t\t} );\n\n\t\tconst request = fetchLinkSuggestions( value, {\n\t\t\tisInitialSuggestions,\n\t\t} );\n\n\t\trequest\n\t\t\t.then( ( suggestions ) => {\n\t\t\t\t// A fetch Promise doesn't have an abort option. It's mimicked by\n\t\t\t\t// comparing the request reference in on the instance, which is\n\t\t\t\t// reset or deleted on subsequent requests or unmounting.\n\t\t\t\tif ( this.suggestionsRequest !== request ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.setState( {\n\t\t\t\t\tsuggestions,\n\t\t\t\t\tsuggestionsValue: value,\n\t\t\t\t\tloading: false,\n\t\t\t\t\tshowSuggestions: !! suggestions.length,\n\t\t\t\t} );\n\n\t\t\t\tif ( !! suggestions.length ) {\n\t\t\t\t\tthis.props.debouncedSpeak(\n\t\t\t\t\t\tsprintf(\n\t\t\t\t\t\t\t/* translators: %d: number of results. */\n\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t'%d result found, use up and down arrow keys to navigate.',\n\t\t\t\t\t\t\t\t'%d results found, use up and down arrow keys to navigate.',\n\t\t\t\t\t\t\t\tsuggestions.length\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tsuggestions.length\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'assertive'\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.props.debouncedSpeak(\n\t\t\t\t\t\t__( 'No results.' ),\n\t\t\t\t\t\t'assertive'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.catch( () => {\n\t\t\t\tif ( this.suggestionsRequest !== request ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.setState( {\n\t\t\t\t\tloading: false,\n\t\t\t\t} );\n\t\t\t} )\n\t\t\t.finally( () => {\n\t\t\t\t// If this is the current promise then reset the reference\n\t\t\t\t// to allow for checking if a new request is made.\n\t\t\t\tif ( this.suggestionsRequest === request ) {\n\t\t\t\t\tthis.suggestionsRequest = null;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// Note that this assignment is handled *before* the async search request\n\t\t// as a Promise always resolves on the next tick of the event loop.\n\t\tthis.suggestionsRequest = request;\n\t}\n\n\tonChange( newValue ) {\n\t\tthis.props.onChange( newValue );\n\t}\n\n\tonFocus() {\n\t\tconst { suggestions } = this.state;\n\t\tconst { disableSuggestions, value } = this.props;\n\n\t\t// When opening the link editor, if there's a value present, we want to load the suggestions pane with the results for this input search value\n\t\t// Don't re-run the suggestions on focus if there are already suggestions present (prevents searching again when tabbing between the input and buttons)\n\t\t// or there is already a request in progress.\n\t\tif (\n\t\t\tvalue &&\n\t\t\t! disableSuggestions &&\n\t\t\t! ( suggestions && suggestions.length ) &&\n\t\t\tthis.suggestionsRequest === null\n\t\t) {\n\t\t\t// Ensure the suggestions are updated with the current input value.\n\t\t\tthis.updateSuggestions( value );\n\t\t}\n\t}\n\n\tonKeyDown( event ) {\n\t\tthis.props.onKeyDown?.( event );\n\t\tconst { showSuggestions, selectedSuggestion, suggestions, loading } =\n\t\t\tthis.state;\n\n\t\t// If the suggestions are not shown or loading, we shouldn't handle the arrow keys\n\t\t// We shouldn't preventDefault to allow block arrow keys navigation.\n\t\tif ( ! showSuggestions || ! suggestions.length || loading ) {\n\t\t\t// In the Windows version of Firefox the up and down arrows don't move the caret\n\t\t\t// within an input field like they do for Mac Firefox/Chrome/Safari. This causes\n\t\t\t// a form of focus trapping that is disruptive to the user experience. This disruption\n\t\t\t// only happens if the caret is not in the first or last position in the text input.\n\t\t\t// See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\t// When UP is pressed, if the caret is at the start of the text, move it to the 0\n\t\t\t\t// position.\n\t\t\t\tcase UP: {\n\t\t\t\t\tif ( 0 !== event.target.selectionStart ) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to position 0.\n\t\t\t\t\t\tevent.target.setSelectionRange( 0, 0 );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// When DOWN is pressed, if the caret is not at the end of the text, move it to the\n\t\t\t\t// last position.\n\t\t\t\tcase DOWN: {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.props.value.length !== event.target.selectionStart\n\t\t\t\t\t) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to the last position.\n\t\t\t\t\t\tevent.target.setSelectionRange(\n\t\t\t\t\t\t\tthis.props.value.length,\n\t\t\t\t\t\t\tthis.props.value.length\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Submitting while loading should trigger onSubmit.\n\t\t\t\tcase ENTER: {\n\t\t\t\t\tif ( this.props.onSubmit ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis.props.onSubmit( null, event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst suggestion =\n\t\t\tthis.state.suggestions[ this.state.selectedSuggestion ];\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase UP: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst previousIndex = ! selectedSuggestion\n\t\t\t\t\t? suggestions.length - 1\n\t\t\t\t\t: selectedSuggestion - 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: previousIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DOWN: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst nextIndex =\n\t\t\t\t\tselectedSuggestion === null ||\n\t\t\t\t\tselectedSuggestion === suggestions.length - 1\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: selectedSuggestion + 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: nextIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAB: {\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tthis.selectLink( suggestion );\n\t\t\t\t\t// Announce a link has been selected when tabbing away from the input field.\n\t\t\t\t\tthis.props.speak( __( 'Link selected.' ) );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ENTER: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tthis.selectLink( suggestion );\n\n\t\t\t\t\tif ( this.props.onSubmit ) {\n\t\t\t\t\t\tthis.props.onSubmit( suggestion, event );\n\t\t\t\t\t}\n\t\t\t\t} else if ( this.props.onSubmit ) {\n\t\t\t\t\tthis.props.onSubmit( null, event );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tselectLink( suggestion ) {\n\t\tthis.props.onChange( suggestion.url, suggestion );\n\t\tthis.setState( {\n\t\t\tselectedSuggestion: null,\n\t\t\tshowSuggestions: false,\n\t\t} );\n\t}\n\n\thandleOnClick( suggestion ) {\n\t\tthis.selectLink( suggestion );\n\t\t// Move focus to the input field when a link suggestion is clicked.\n\t\tthis.inputRef.current.focus();\n\t}\n\n\tstatic getDerivedStateFromProps(\n\t\t{\n\t\t\tvalue,\n\t\t\tinstanceId,\n\t\t\tdisableSuggestions,\n\t\t\t__experimentalShowInitialSuggestions = false,\n\t\t},\n\t\t{ showSuggestions }\n\t) {\n\t\tlet shouldShowSuggestions = showSuggestions;\n\n\t\tconst hasValue = value && value.length;\n\n\t\tif ( ! __experimentalShowInitialSuggestions && ! hasValue ) {\n\t\t\tshouldShowSuggestions = false;\n\t\t}\n\n\t\tif ( disableSuggestions === true ) {\n\t\t\tshouldShowSuggestions = false;\n\t\t}\n\n\t\treturn {\n\t\t\tshowSuggestions: shouldShowSuggestions,\n\t\t\tsuggestionsListboxId: `block-editor-url-input-suggestions-${ instanceId }`,\n\t\t\tsuggestionOptionIdPrefix: `block-editor-url-input-suggestion-${ instanceId }`,\n\t\t};\n\t}\n\n\trender() {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{ this.renderControl() }\n\t\t\t\t{ this.renderSuggestions() }\n\t\t\t</>\n\t\t);\n\t}\n\n\trenderControl() {\n\t\tconst {\n\t\t\tlabel = null,\n\t\t\tclassName,\n\t\t\tisFullWidth,\n\t\t\tinstanceId,\n\t\t\tplaceholder = __( 'Paste URL or type to search' ),\n\t\t\t__experimentalRenderControl: renderControl,\n\t\t\tvalue = '',\n\t\t\thideLabelFromVision = false,\n\t\t\thelp = null,\n\t\t\tdisabled = false,\n\t\t} = this.props;\n\n\t\tconst {\n\t\t\tloading,\n\t\t\tshowSuggestions,\n\t\t\tselectedSuggestion,\n\t\t\tsuggestionsListboxId,\n\t\t\tsuggestionOptionIdPrefix,\n\t\t} = this.state;\n\n\t\tconst inputId = `url-input-control-${ instanceId }`;\n\n\t\tconst controlProps = {\n\t\t\tid: inputId, // Passes attribute to label for the for attribute\n\t\t\tlabel,\n\t\t\tclassName: clsx( 'block-editor-url-input', className, {\n\t\t\t\t'is-full-width': isFullWidth,\n\t\t\t} ),\n\t\t\thideLabelFromVision,\n\t\t};\n\n\t\tconst inputProps = {\n\t\t\tid: inputId,\n\t\t\tvalue,\n\t\t\trequired: true,\n\t\t\ttype: 'text',\n\t\t\tname: inputId,\n\t\t\tautoComplete: 'off',\n\t\t\tonChange: disabled ? () => {} : this.onChange, // Disable onChange when disabled\n\t\t\tonFocus: disabled ? () => {} : this.onFocus, // Disable onFocus when disabled\n\t\t\tplaceholder,\n\t\t\tonKeyDown: disabled ? () => {} : this.onKeyDown, // Disable onKeyDown when disabled\n\t\t\trole: 'combobox',\n\t\t\t'aria-label': label ? undefined : __( 'URL' ), // Ensure input always has an accessible label\n\t\t\t'aria-expanded': showSuggestions,\n\t\t\t'aria-autocomplete': 'list',\n\t\t\t'aria-owns': suggestionsListboxId,\n\t\t\t'aria-activedescendant':\n\t\t\t\tselectedSuggestion !== null\n\t\t\t\t\t? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }`\n\t\t\t\t\t: undefined,\n\t\t\tref: this.inputRef,\n\t\t\tdisabled,\n\t\t\tsuffix: this.props.suffix,\n\t\t\thelp,\n\t\t};\n\n\t\tif ( renderControl ) {\n\t\t\treturn renderControl( controlProps, inputProps, loading );\n\t\t}\n\n\t\treturn (\n\t\t\t<BaseControl { ...controlProps }>\n\t\t\t\t<InputControl { ...inputProps } __next40pxDefaultSize />\n\t\t\t\t{ loading && <Spinner /> }\n\t\t\t</BaseControl>\n\t\t);\n\t}\n\n\trenderSuggestions() {\n\t\tconst {\n\t\t\tclassName,\n\t\t\t__experimentalRenderSuggestions: renderSuggestions,\n\t\t} = this.props;\n\n\t\tconst {\n\t\t\tshowSuggestions,\n\t\t\tsuggestions,\n\t\t\tsuggestionsValue,\n\t\t\tselectedSuggestion,\n\t\t\tsuggestionsListboxId,\n\t\t\tsuggestionOptionIdPrefix,\n\t\t\tloading,\n\t\t} = this.state;\n\n\t\tif ( ! showSuggestions || suggestions.length === 0 ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst suggestionsListProps = {\n\t\t\tid: suggestionsListboxId,\n\t\t\tref: this.autocompleteRef,\n\t\t\trole: 'listbox',\n\t\t};\n\n\t\tconst buildSuggestionItemProps = ( suggestion, index ) => {\n\t\t\treturn {\n\t\t\t\trole: 'option',\n\t\t\t\ttabIndex: '-1',\n\t\t\t\tid: `${ suggestionOptionIdPrefix }-${ index }`,\n\t\t\t\tref: this.bindSuggestionNode( index ),\n\t\t\t\t'aria-selected':\n\t\t\t\t\tindex === selectedSuggestion ? true : undefined,\n\t\t\t};\n\t\t};\n\n\t\tif ( isFunction( renderSuggestions ) ) {\n\t\t\treturn renderSuggestions( {\n\t\t\t\tsuggestions,\n\t\t\t\tselectedSuggestion,\n\t\t\t\tsuggestionsListProps,\n\t\t\t\tbuildSuggestionItemProps,\n\t\t\t\tisLoading: loading,\n\t\t\t\thandleSuggestionClick: this.handleOnClick,\n\t\t\t\tisInitialSuggestions: ! suggestionsValue?.length,\n\t\t\t\tcurrentInputValue: suggestionsValue,\n\t\t\t} );\n\t\t}\n\n\t\treturn (\n\t\t\t<Popover placement=\"bottom\" focusOnMount={ false }>\n\t\t\t\t<div\n\t\t\t\t\t{ ...suggestionsListProps }\n\t\t\t\t\tclassName={ clsx( 'block-editor-url-input__suggestions', {\n\t\t\t\t\t\t[ `${ className }__suggestions` ]: className,\n\t\t\t\t\t} ) }\n\t\t\t\t>\n\t\t\t\t\t{ suggestions.map( ( suggestion, index ) => (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t{ ...buildSuggestionItemProps( suggestion, index ) }\n\t\t\t\t\t\t\tkey={ suggestion.id }\n\t\t\t\t\t\t\tclassName={ clsx(\n\t\t\t\t\t\t\t\t'block-editor-url-input__suggestion',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'is-selected': index === selectedSuggestion,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\tonClick={ () => this.handleOnClick( suggestion ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ suggestion.title }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t) ) }\n\t\t\t\t</div>\n\t\t\t</Popover>\n\t\t);\n\t}\n}\n\n/**\n * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/url-input/README.md\n */\nexport default compose(\n\twithSafeTimeout,\n\twithSpokenMessages,\n\twithInstanceId,\n\twithSelect( ( select, props ) => {\n\t\t// If a link suggestions handler is already provided then\n\t\t// bail.\n\t\tif ( isFunction( props.__experimentalFetchLinkSuggestions ) ) {\n\t\t\treturn;\n\t\t}\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\treturn {\n\t\t\t__experimentalFetchLinkSuggestions:\n\t\t\t\tgetSettings().__experimentalFetchLinkSuggestions,\n\t\t};\n\t} )\n)( URLInput );\n"],
5
+ "mappings": "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",
6
6
  "names": ["clsx", "InputControl", "blockEditorStore"]
7
7
  }
@@ -191,7 +191,7 @@ var getQuickActionsCommands = () => function useQuickActionsCommands() {
191
191
  const canRemove = canRemoveBlocks(clientIds);
192
192
  const canToggleBlockVisibility = blocks.every(
193
193
  ({ clientId }) => (0, import_blocks.hasBlockSupport)(getBlockName(clientId), "visibility", true)
194
- );
194
+ ) && !window.__experimentalHideBlocksBasedOnScreenSize;
195
195
  const commands = [];
196
196
  if (canDuplicate) {
197
197
  commands.push({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/use-block-commands/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport {\n\thasBlockSupport,\n\tstore as blocksStore,\n\tswitchToBlockType,\n\tisTemplatePart,\n} from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useCommandLoader } from '@wordpress/commands';\nimport {\n\tcopy,\n\ttrash as remove,\n\tplus as add,\n\tgroup,\n\tungroup,\n\tseen,\n\tunseen,\n} from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport BlockIcon from '../block-icon';\nimport { store as blockEditorStore } from '../../store';\nimport { cleanEmptyObject } from '../../hooks/utils';\n\nconst getTransformCommands = () =>\n\tfunction useTransformCommands() {\n\t\tconst { replaceBlocks, multiSelect } = useDispatch( blockEditorStore );\n\t\tconst {\n\t\t\tblocks,\n\t\t\tclientIds,\n\t\t\tcanRemove,\n\t\t\tpossibleBlockTransformations,\n\t\t\tinvalidSelection,\n\t\t} = useSelect( ( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\tgetBlockTransformItems,\n\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\tgetBlocksByClientId,\n\t\t\t\tcanRemoveBlocks,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\t\t\tconst selectedBlocks = getBlocksByClientId(\n\t\t\t\tselectedBlockClientIds\n\t\t\t);\n\n\t\t\t// selectedBlocks can have `null`s when something tries to call `selectBlock` with an inexistent clientId.\n\t\t\t// These nulls will cause fatal errors down the line.\n\t\t\t// In order to prevent discrepancies between selectedBlockClientIds and selectedBlocks, we effectively treat the entire selection as invalid.\n\t\t\t// @see https://github.com/WordPress/gutenberg/pull/59410#issuecomment-2006304536\n\t\t\tif ( selectedBlocks.filter( ( block ) => ! block ).length > 0 ) {\n\t\t\t\treturn {\n\t\t\t\t\tinvalidSelection: true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst rootClientId = getBlockRootClientId(\n\t\t\t\tselectedBlockClientIds[ 0 ]\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tblocks: selectedBlocks,\n\t\t\t\tclientIds: selectedBlockClientIds,\n\t\t\t\tpossibleBlockTransformations: getBlockTransformItems(\n\t\t\t\t\tselectedBlocks,\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t\tcanRemove: canRemoveBlocks( selectedBlockClientIds ),\n\t\t\t\tinvalidSelection: false,\n\t\t\t};\n\t\t}, [] );\n\n\t\tif ( invalidSelection ) {\n\t\t\treturn {\n\t\t\t\tisLoading: false,\n\t\t\t\tcommands: [],\n\t\t\t};\n\t\t}\n\t\tconst isTemplate = blocks.length === 1 && isTemplatePart( blocks[ 0 ] );\n\n\t\tfunction selectForMultipleBlocks( insertedBlocks ) {\n\t\t\tif ( insertedBlocks.length > 1 ) {\n\t\t\t\tmultiSelect(\n\t\t\t\t\tinsertedBlocks[ 0 ].clientId,\n\t\t\t\t\tinsertedBlocks[ insertedBlocks.length - 1 ].clientId\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Simple block transformation based on the `Block Transforms` API.\n\t\tfunction onBlockTransform( name ) {\n\t\t\tconst newBlocks = switchToBlockType( blocks, name );\n\t\t\treplaceBlocks( clientIds, newBlocks );\n\t\t\tselectForMultipleBlocks( newBlocks );\n\t\t}\n\n\t\t/**\n\t\t * The `isTemplate` check is a stopgap solution here.\n\t\t * Ideally, the Transforms API should handle this\n\t\t * by allowing to exclude blocks from wildcard transformations.\n\t\t */\n\t\tconst hasPossibleBlockTransformations =\n\t\t\t!! possibleBlockTransformations.length && canRemove && ! isTemplate;\n\n\t\tif (\n\t\t\t! clientIds ||\n\t\t\tclientIds.length < 1 ||\n\t\t\t! hasPossibleBlockTransformations\n\t\t) {\n\t\t\treturn { isLoading: false, commands: [] };\n\t\t}\n\n\t\tconst commands = possibleBlockTransformations.map(\n\t\t\t( transformation ) => {\n\t\t\t\tconst { name, title, icon } = transformation;\n\t\t\t\treturn {\n\t\t\t\t\tname:\n\t\t\t\t\t\t'core/block-editor/transform-to-' +\n\t\t\t\t\t\tname.replace( '/', '-' ),\n\t\t\t\t\t/* translators: %s: Block or block variation name. */\n\t\t\t\t\tlabel: sprintf( __( 'Transform to %s' ), title ),\n\t\t\t\t\ticon: <BlockIcon icon={ icon } />,\n\t\t\t\t\tcallback: ( { close } ) => {\n\t\t\t\t\t\tonBlockTransform( name );\n\t\t\t\t\t\tclose();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t);\n\n\t\treturn { isLoading: false, commands };\n\t};\n\nconst getQuickActionsCommands = () =>\n\tfunction useQuickActionsCommands() {\n\t\tconst { clientIds, isUngroupable, isGroupable } = useSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst {\n\t\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\t\tisUngroupable: _isUngroupable,\n\t\t\t\t\tisGroupable: _isGroupable,\n\t\t\t\t} = select( blockEditorStore );\n\t\t\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\n\t\t\t\treturn {\n\t\t\t\t\tclientIds: selectedBlockClientIds,\n\t\t\t\t\tisUngroupable: _isUngroupable(),\n\t\t\t\t\tisGroupable: _isGroupable(),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[]\n\t\t);\n\t\tconst {\n\t\t\tcanInsertBlockType,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetBlocksByClientId,\n\t\t\tcanRemoveBlocks,\n\t\t\tgetBlockName,\n\t\t} = useSelect( blockEditorStore );\n\t\tconst { getDefaultBlockName, getGroupingBlockName } =\n\t\t\tuseSelect( blocksStore );\n\n\t\tconst blocks = getBlocksByClientId( clientIds );\n\n\t\tconst {\n\t\t\tremoveBlocks,\n\t\t\treplaceBlocks,\n\t\t\tduplicateBlocks,\n\t\t\tinsertAfterBlock,\n\t\t\tinsertBeforeBlock,\n\t\t\tupdateBlockAttributes,\n\t\t} = useDispatch( blockEditorStore );\n\n\t\tconst onGroup = () => {\n\t\t\tif ( ! blocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst groupingBlockName = getGroupingBlockName();\n\n\t\t\t// Activate the `transform` on `core/group` which does the conversion.\n\t\t\tconst newBlocks = switchToBlockType( blocks, groupingBlockName );\n\n\t\t\tif ( ! newBlocks ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treplaceBlocks( clientIds, newBlocks );\n\t\t};\n\t\tconst onUngroup = () => {\n\t\t\tif ( ! blocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst innerBlocks = blocks[ 0 ].innerBlocks;\n\n\t\t\tif ( ! innerBlocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treplaceBlocks( clientIds, innerBlocks );\n\t\t};\n\n\t\tif ( ! clientIds || clientIds.length < 1 ) {\n\t\t\treturn { isLoading: false, commands: [] };\n\t\t}\n\n\t\tconst rootClientId = getBlockRootClientId( clientIds[ 0 ] );\n\t\tconst canInsertDefaultBlock = canInsertBlockType(\n\t\t\tgetDefaultBlockName(),\n\t\t\trootClientId\n\t\t);\n\t\tconst canDuplicate = blocks.every( ( block ) => {\n\t\t\treturn (\n\t\t\t\t!! block &&\n\t\t\t\thasBlockSupport( block.name, 'multiple', true ) &&\n\t\t\t\tcanInsertBlockType( block.name, rootClientId )\n\t\t\t);\n\t\t} );\n\t\tconst canRemove = canRemoveBlocks( clientIds );\n\n\t\tconst canToggleBlockVisibility = blocks.every( ( { clientId } ) =>\n\t\t\thasBlockSupport( getBlockName( clientId ), 'visibility', true )\n\t\t);\n\n\t\tconst commands = [];\n\n\t\tif ( canDuplicate ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'duplicate',\n\t\t\t\tlabel: __( 'Duplicate' ),\n\t\t\t\tcallback: () => duplicateBlocks( clientIds, true ),\n\t\t\t\ticon: copy,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canInsertDefaultBlock ) {\n\t\t\tcommands.push(\n\t\t\t\t{\n\t\t\t\t\tname: 'add-before',\n\t\t\t\t\tlabel: __( 'Add before' ),\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tconst clientId = Array.isArray( clientIds )\n\t\t\t\t\t\t\t? clientIds[ 0 ]\n\t\t\t\t\t\t\t: clientId;\n\t\t\t\t\t\tinsertBeforeBlock( clientId );\n\t\t\t\t\t},\n\t\t\t\t\ticon: add,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'add-after',\n\t\t\t\t\tlabel: __( 'Add after' ),\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tconst clientId = Array.isArray( clientIds )\n\t\t\t\t\t\t\t? clientIds[ clientIds.length - 1 ]\n\t\t\t\t\t\t\t: clientId;\n\t\t\t\t\t\tinsertAfterBlock( clientId );\n\t\t\t\t\t},\n\t\t\t\t\ticon: add,\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tif ( isGroupable ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'Group',\n\t\t\t\tlabel: __( 'Group' ),\n\t\t\t\tcallback: onGroup,\n\t\t\t\ticon: group,\n\t\t\t} );\n\t\t}\n\n\t\tif ( isUngroupable ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'ungroup',\n\t\t\t\tlabel: __( 'Ungroup' ),\n\t\t\t\tcallback: onUngroup,\n\t\t\t\ticon: ungroup,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canRemove ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'remove',\n\t\t\t\tlabel: __( 'Delete' ),\n\t\t\t\tcallback: () => removeBlocks( clientIds, true ),\n\t\t\t\ticon: remove,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canToggleBlockVisibility ) {\n\t\t\tconst hasHiddenBlock = blocks.some(\n\t\t\t\t( block ) =>\n\t\t\t\t\tblock.attributes.metadata?.blockVisibility === false\n\t\t\t);\n\n\t\t\tcommands.push( {\n\t\t\t\tname: 'core/toggle-block-visibility',\n\t\t\t\tlabel: hasHiddenBlock ? __( 'Show' ) : __( 'Hide' ),\n\t\t\t\tcallback: () => {\n\t\t\t\t\tconst attributesByClientId = Object.fromEntries(\n\t\t\t\t\t\tblocks?.map( ( { clientId, attributes } ) => [\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmetadata: cleanEmptyObject( {\n\t\t\t\t\t\t\t\t\t...attributes?.metadata,\n\t\t\t\t\t\t\t\t\tblockVisibility: hasHiddenBlock\n\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t: false,\n\t\t\t\t\t\t\t\t} ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t] )\n\t\t\t\t\t);\n\t\t\t\t\tupdateBlockAttributes( clientIds, attributesByClientId, {\n\t\t\t\t\t\tuniqueByBlock: true,\n\t\t\t\t\t} );\n\t\t\t\t},\n\t\t\t\ticon: hasHiddenBlock ? seen : unseen,\n\t\t\t} );\n\t\t}\n\n\t\treturn {\n\t\t\tisLoading: false,\n\t\t\tcommands: commands.map( ( command ) => ( {\n\t\t\t\t...command,\n\t\t\t\tname: 'core/block-editor/action-' + command.name,\n\t\t\t\tcallback: ( { close } ) => {\n\t\t\t\t\tcommand.callback();\n\t\t\t\t\tclose();\n\t\t\t\t},\n\t\t\t} ) ),\n\t\t};\n\t};\n\nexport const useBlockCommands = () => {\n\tuseCommandLoader( {\n\t\tname: 'core/block-editor/blockTransforms',\n\t\thook: getTransformCommands(),\n\t} );\n\tuseCommandLoader( {\n\t\tname: 'core/block-editor/blockQuickActions',\n\t\thook: getQuickActionsCommands(),\n\t\tcontext: 'block-selection-edit',\n\t} );\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport {\n\thasBlockSupport,\n\tstore as blocksStore,\n\tswitchToBlockType,\n\tisTemplatePart,\n} from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useCommandLoader } from '@wordpress/commands';\nimport {\n\tcopy,\n\ttrash as remove,\n\tplus as add,\n\tgroup,\n\tungroup,\n\tseen,\n\tunseen,\n} from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport BlockIcon from '../block-icon';\nimport { store as blockEditorStore } from '../../store';\nimport { cleanEmptyObject } from '../../hooks/utils';\n\nconst getTransformCommands = () =>\n\tfunction useTransformCommands() {\n\t\tconst { replaceBlocks, multiSelect } = useDispatch( blockEditorStore );\n\t\tconst {\n\t\t\tblocks,\n\t\t\tclientIds,\n\t\t\tcanRemove,\n\t\t\tpossibleBlockTransformations,\n\t\t\tinvalidSelection,\n\t\t} = useSelect( ( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\tgetBlockTransformItems,\n\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\tgetBlocksByClientId,\n\t\t\t\tcanRemoveBlocks,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\t\t\tconst selectedBlocks = getBlocksByClientId(\n\t\t\t\tselectedBlockClientIds\n\t\t\t);\n\n\t\t\t// selectedBlocks can have `null`s when something tries to call `selectBlock` with an inexistent clientId.\n\t\t\t// These nulls will cause fatal errors down the line.\n\t\t\t// In order to prevent discrepancies between selectedBlockClientIds and selectedBlocks, we effectively treat the entire selection as invalid.\n\t\t\t// @see https://github.com/WordPress/gutenberg/pull/59410#issuecomment-2006304536\n\t\t\tif ( selectedBlocks.filter( ( block ) => ! block ).length > 0 ) {\n\t\t\t\treturn {\n\t\t\t\t\tinvalidSelection: true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst rootClientId = getBlockRootClientId(\n\t\t\t\tselectedBlockClientIds[ 0 ]\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tblocks: selectedBlocks,\n\t\t\t\tclientIds: selectedBlockClientIds,\n\t\t\t\tpossibleBlockTransformations: getBlockTransformItems(\n\t\t\t\t\tselectedBlocks,\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t\tcanRemove: canRemoveBlocks( selectedBlockClientIds ),\n\t\t\t\tinvalidSelection: false,\n\t\t\t};\n\t\t}, [] );\n\n\t\tif ( invalidSelection ) {\n\t\t\treturn {\n\t\t\t\tisLoading: false,\n\t\t\t\tcommands: [],\n\t\t\t};\n\t\t}\n\t\tconst isTemplate = blocks.length === 1 && isTemplatePart( blocks[ 0 ] );\n\n\t\tfunction selectForMultipleBlocks( insertedBlocks ) {\n\t\t\tif ( insertedBlocks.length > 1 ) {\n\t\t\t\tmultiSelect(\n\t\t\t\t\tinsertedBlocks[ 0 ].clientId,\n\t\t\t\t\tinsertedBlocks[ insertedBlocks.length - 1 ].clientId\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Simple block transformation based on the `Block Transforms` API.\n\t\tfunction onBlockTransform( name ) {\n\t\t\tconst newBlocks = switchToBlockType( blocks, name );\n\t\t\treplaceBlocks( clientIds, newBlocks );\n\t\t\tselectForMultipleBlocks( newBlocks );\n\t\t}\n\n\t\t/**\n\t\t * The `isTemplate` check is a stopgap solution here.\n\t\t * Ideally, the Transforms API should handle this\n\t\t * by allowing to exclude blocks from wildcard transformations.\n\t\t */\n\t\tconst hasPossibleBlockTransformations =\n\t\t\t!! possibleBlockTransformations.length && canRemove && ! isTemplate;\n\n\t\tif (\n\t\t\t! clientIds ||\n\t\t\tclientIds.length < 1 ||\n\t\t\t! hasPossibleBlockTransformations\n\t\t) {\n\t\t\treturn { isLoading: false, commands: [] };\n\t\t}\n\n\t\tconst commands = possibleBlockTransformations.map(\n\t\t\t( transformation ) => {\n\t\t\t\tconst { name, title, icon } = transformation;\n\t\t\t\treturn {\n\t\t\t\t\tname:\n\t\t\t\t\t\t'core/block-editor/transform-to-' +\n\t\t\t\t\t\tname.replace( '/', '-' ),\n\t\t\t\t\t/* translators: %s: Block or block variation name. */\n\t\t\t\t\tlabel: sprintf( __( 'Transform to %s' ), title ),\n\t\t\t\t\ticon: <BlockIcon icon={ icon } />,\n\t\t\t\t\tcallback: ( { close } ) => {\n\t\t\t\t\t\tonBlockTransform( name );\n\t\t\t\t\t\tclose();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t);\n\n\t\treturn { isLoading: false, commands };\n\t};\n\nconst getQuickActionsCommands = () =>\n\tfunction useQuickActionsCommands() {\n\t\tconst { clientIds, isUngroupable, isGroupable } = useSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst {\n\t\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\t\tisUngroupable: _isUngroupable,\n\t\t\t\t\tisGroupable: _isGroupable,\n\t\t\t\t} = select( blockEditorStore );\n\t\t\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\n\t\t\t\treturn {\n\t\t\t\t\tclientIds: selectedBlockClientIds,\n\t\t\t\t\tisUngroupable: _isUngroupable(),\n\t\t\t\t\tisGroupable: _isGroupable(),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[]\n\t\t);\n\t\tconst {\n\t\t\tcanInsertBlockType,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetBlocksByClientId,\n\t\t\tcanRemoveBlocks,\n\t\t\tgetBlockName,\n\t\t} = useSelect( blockEditorStore );\n\t\tconst { getDefaultBlockName, getGroupingBlockName } =\n\t\t\tuseSelect( blocksStore );\n\n\t\tconst blocks = getBlocksByClientId( clientIds );\n\n\t\tconst {\n\t\t\tremoveBlocks,\n\t\t\treplaceBlocks,\n\t\t\tduplicateBlocks,\n\t\t\tinsertAfterBlock,\n\t\t\tinsertBeforeBlock,\n\t\t\tupdateBlockAttributes,\n\t\t} = useDispatch( blockEditorStore );\n\n\t\tconst onGroup = () => {\n\t\t\tif ( ! blocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst groupingBlockName = getGroupingBlockName();\n\n\t\t\t// Activate the `transform` on `core/group` which does the conversion.\n\t\t\tconst newBlocks = switchToBlockType( blocks, groupingBlockName );\n\n\t\t\tif ( ! newBlocks ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treplaceBlocks( clientIds, newBlocks );\n\t\t};\n\t\tconst onUngroup = () => {\n\t\t\tif ( ! blocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst innerBlocks = blocks[ 0 ].innerBlocks;\n\n\t\t\tif ( ! innerBlocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treplaceBlocks( clientIds, innerBlocks );\n\t\t};\n\n\t\tif ( ! clientIds || clientIds.length < 1 ) {\n\t\t\treturn { isLoading: false, commands: [] };\n\t\t}\n\n\t\tconst rootClientId = getBlockRootClientId( clientIds[ 0 ] );\n\t\tconst canInsertDefaultBlock = canInsertBlockType(\n\t\t\tgetDefaultBlockName(),\n\t\t\trootClientId\n\t\t);\n\t\tconst canDuplicate = blocks.every( ( block ) => {\n\t\t\treturn (\n\t\t\t\t!! block &&\n\t\t\t\thasBlockSupport( block.name, 'multiple', true ) &&\n\t\t\t\tcanInsertBlockType( block.name, rootClientId )\n\t\t\t);\n\t\t} );\n\t\tconst canRemove = canRemoveBlocks( clientIds );\n\n\t\tconst canToggleBlockVisibility =\n\t\t\tblocks.every( ( { clientId } ) =>\n\t\t\t\thasBlockSupport( getBlockName( clientId ), 'visibility', true )\n\t\t\t) && ! window.__experimentalHideBlocksBasedOnScreenSize;\n\n\t\tconst commands = [];\n\n\t\tif ( canDuplicate ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'duplicate',\n\t\t\t\tlabel: __( 'Duplicate' ),\n\t\t\t\tcallback: () => duplicateBlocks( clientIds, true ),\n\t\t\t\ticon: copy,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canInsertDefaultBlock ) {\n\t\t\tcommands.push(\n\t\t\t\t{\n\t\t\t\t\tname: 'add-before',\n\t\t\t\t\tlabel: __( 'Add before' ),\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tconst clientId = Array.isArray( clientIds )\n\t\t\t\t\t\t\t? clientIds[ 0 ]\n\t\t\t\t\t\t\t: clientId;\n\t\t\t\t\t\tinsertBeforeBlock( clientId );\n\t\t\t\t\t},\n\t\t\t\t\ticon: add,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'add-after',\n\t\t\t\t\tlabel: __( 'Add after' ),\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tconst clientId = Array.isArray( clientIds )\n\t\t\t\t\t\t\t? clientIds[ clientIds.length - 1 ]\n\t\t\t\t\t\t\t: clientId;\n\t\t\t\t\t\tinsertAfterBlock( clientId );\n\t\t\t\t\t},\n\t\t\t\t\ticon: add,\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tif ( isGroupable ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'Group',\n\t\t\t\tlabel: __( 'Group' ),\n\t\t\t\tcallback: onGroup,\n\t\t\t\ticon: group,\n\t\t\t} );\n\t\t}\n\n\t\tif ( isUngroupable ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'ungroup',\n\t\t\t\tlabel: __( 'Ungroup' ),\n\t\t\t\tcallback: onUngroup,\n\t\t\t\ticon: ungroup,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canRemove ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'remove',\n\t\t\t\tlabel: __( 'Delete' ),\n\t\t\t\tcallback: () => removeBlocks( clientIds, true ),\n\t\t\t\ticon: remove,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canToggleBlockVisibility ) {\n\t\t\tconst hasHiddenBlock = blocks.some(\n\t\t\t\t( block ) =>\n\t\t\t\t\tblock.attributes.metadata?.blockVisibility === false\n\t\t\t);\n\n\t\t\tcommands.push( {\n\t\t\t\tname: 'core/toggle-block-visibility',\n\t\t\t\tlabel: hasHiddenBlock ? __( 'Show' ) : __( 'Hide' ),\n\t\t\t\tcallback: () => {\n\t\t\t\t\tconst attributesByClientId = Object.fromEntries(\n\t\t\t\t\t\tblocks?.map( ( { clientId, attributes } ) => [\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmetadata: cleanEmptyObject( {\n\t\t\t\t\t\t\t\t\t...attributes?.metadata,\n\t\t\t\t\t\t\t\t\tblockVisibility: hasHiddenBlock\n\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t: false,\n\t\t\t\t\t\t\t\t} ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t] )\n\t\t\t\t\t);\n\t\t\t\t\tupdateBlockAttributes( clientIds, attributesByClientId, {\n\t\t\t\t\t\tuniqueByBlock: true,\n\t\t\t\t\t} );\n\t\t\t\t},\n\t\t\t\ticon: hasHiddenBlock ? seen : unseen,\n\t\t\t} );\n\t\t}\n\n\t\treturn {\n\t\t\tisLoading: false,\n\t\t\tcommands: commands.map( ( command ) => ( {\n\t\t\t\t...command,\n\t\t\t\tname: 'core/block-editor/action-' + command.name,\n\t\t\t\tcallback: ( { close } ) => {\n\t\t\t\t\tcommand.callback();\n\t\t\t\t\tclose();\n\t\t\t\t},\n\t\t\t} ) ),\n\t\t};\n\t};\n\nexport const useBlockCommands = () => {\n\tuseCommandLoader( {\n\t\tname: 'core/block-editor/blockTransforms',\n\t\thook: getTransformCommands(),\n\t} );\n\tuseCommandLoader( {\n\t\tname: 'core/block-editor/blockQuickActions',\n\t\thook: getQuickActionsCommands(),\n\t\tcontext: 'block-selection-edit',\n\t} );\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["blockEditorStore", "BlockIcon", "blocksStore", "add", "remove"]
7
7
  }
@@ -5,6 +5,10 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
8
12
  var __copyProps = (to, from, except, desc) => {
9
13
  if (from && typeof from === "object" || typeof from === "function") {
10
14
  for (let key of __getOwnPropNames(from))
@@ -21,196 +25,90 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
29
 
25
30
  // packages/block-editor/src/hooks/block-fields/index.js
26
- var import_hooks = require("@wordpress/hooks");
31
+ var block_fields_exports = {};
32
+ __export(block_fields_exports, {
33
+ BlockFieldsPanel: () => BlockFieldsPanel,
34
+ default: () => block_fields_default
35
+ });
36
+ module.exports = __toCommonJS(block_fields_exports);
27
37
  var import_blocks = require("@wordpress/blocks");
28
38
  var import_components = require("@wordpress/components");
29
- var import_compose = require("@wordpress/compose");
39
+ var import_data = require("@wordpress/data");
30
40
  var import_dataviews = require("@wordpress/dataviews");
31
41
  var import_element = require("@wordpress/element");
42
+ var import_i18n = require("@wordpress/i18n");
43
+ var import_store = require("../../store/index.cjs");
32
44
  var import_lock_unlock = require("../../lock-unlock.cjs");
33
45
  var import_block_icon = __toESM(require("../../components/block-icon/index.cjs"));
34
46
  var import_use_block_display_title = __toESM(require("../../components/block-title/use-block-display-title.cjs"));
35
47
  var import_use_block_display_information = __toESM(require("../../components/use-block-display-information/index.cjs"));
36
48
  var import_fields_dropdown_menu = __toESM(require("./fields-dropdown-menu.cjs"));
37
49
  var import_private_block_context = require("../../components/block-list/private-block-context.cjs");
38
- var import_fill = require("../../components/inspector-controls/fill.cjs");
50
+ var import_fill = __toESM(require("../../components/inspector-controls/fill.cjs"));
39
51
  var import_rich_text = __toESM(require("./rich-text/index.cjs"));
40
52
  var import_media = __toESM(require("./media/index.cjs"));
41
53
  var import_link = __toESM(require("./link/index.cjs"));
42
54
  var import_jsx_runtime = require("react/jsx-runtime");
43
55
  var { fieldsKey, formKey } = (0, import_lock_unlock.unlock)(import_blocks.privateApis);
44
- var CONTROLS = {
45
- richtext: import_rich_text.default,
46
- media: import_media.default,
47
- link: import_link.default
48
- };
49
- function createConfiguredControl(config) {
50
- const { control, ...controlConfig } = config;
51
- const ControlComponent = CONTROLS[control];
52
- if (!ControlComponent) {
53
- throw new Error(`Control type "${control}" not found`);
54
- }
56
+ function createConfiguredControl(ControlComponent, config = {}) {
55
57
  return function ConfiguredControl(props) {
56
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ControlComponent, { ...props, config: controlConfig });
57
- };
58
- }
59
- function normalizeMediaValue(value, fieldDef) {
60
- const defaults = {
61
- id: null,
62
- url: "",
63
- caption: "",
64
- alt: "",
65
- type: "image",
66
- poster: "",
67
- featuredImage: false,
68
- link: ""
69
- };
70
- const result = {};
71
- if (fieldDef?.mapping) {
72
- Object.keys(fieldDef.mapping).forEach((key) => {
73
- result[key] = value?.[key] ?? defaults[key] ?? "";
74
- });
75
- return result;
76
- }
77
- Object.keys(defaults).forEach((key) => {
78
- result[key] = value?.[key] ?? defaults[key];
79
- });
80
- return result;
81
- }
82
- function denormalizeMediaValue(value, fieldDef) {
83
- if (!fieldDef.mapping) {
84
- return value;
85
- }
86
- const result = {};
87
- Object.entries(fieldDef.mapping).forEach(([key]) => {
88
- if (key in value) {
89
- result[key] = value[key];
90
- }
91
- });
92
- return result;
93
- }
94
- function normalizeLinkValue(value, fieldDef) {
95
- const defaults = {
96
- url: "",
97
- rel: "",
98
- linkTarget: "",
99
- destination: ""
58
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ControlComponent, { ...props, config });
100
59
  };
101
- const result = {};
102
- if (fieldDef?.mapping) {
103
- Object.keys(fieldDef.mapping).forEach((key) => {
104
- result[key] = value?.[key] ?? defaults[key] ?? "";
105
- });
106
- return result;
107
- }
108
- Object.keys(defaults).forEach((key) => {
109
- result[key] = value?.[key] ?? defaults[key];
110
- });
111
- return result;
112
- }
113
- function denormalizeLinkValue(value, fieldDef) {
114
- if (!fieldDef.mapping) {
115
- return value;
116
- }
117
- const result = {};
118
- Object.entries(fieldDef.mapping).forEach(([key]) => {
119
- if (key in value) {
120
- result[key] = value[key];
121
- }
122
- });
123
- return result;
124
60
  }
125
- function BlockFields({ clientId, blockType, attributes, setAttributes }) {
61
+ function BlockFields({
62
+ clientId,
63
+ blockType,
64
+ setAttributes,
65
+ isCollapsed = false
66
+ }) {
126
67
  const blockTitle = (0, import_use_block_display_title.default)({
127
68
  clientId,
128
69
  context: "list-view"
129
70
  });
130
71
  const blockInformation = (0, import_use_block_display_information.default)(clientId);
131
72
  const blockTypeFields = blockType?.[fieldsKey];
132
- const [form, setForm] = (0, import_element.useState)(() => {
133
- return blockType?.[formKey];
134
- });
73
+ const attributes = (0, import_data.useSelect)(
74
+ (select) => select(import_store.store).getBlockAttributes(clientId),
75
+ [clientId]
76
+ );
77
+ const computedForm = (0, import_element.useMemo)(() => {
78
+ if (!isCollapsed) {
79
+ return blockType?.[formKey];
80
+ }
81
+ return {
82
+ ...blockType?.[formKey],
83
+ fields: [blockType?.[formKey]?.fields?.[0]]
84
+ };
85
+ }, [blockType, isCollapsed]);
86
+ const [form, setForm] = (0, import_element.useState)(computedForm);
135
87
  const dataFormFields = (0, import_element.useMemo)(() => {
136
88
  if (!blockTypeFields?.length) {
137
89
  return [];
138
90
  }
139
91
  return blockTypeFields.map((fieldDef) => {
140
- const ControlComponent = CONTROLS[fieldDef.type];
141
- const defaultValues = {};
142
- if (fieldDef.mapping && blockType?.attributes) {
143
- Object.entries(fieldDef.mapping).forEach(
144
- ([key, attrKey]) => {
145
- defaultValues[key] = blockType.attributes[attrKey]?.defaultValue ?? void 0;
146
- }
147
- );
148
- }
149
92
  const field = {
150
- id: fieldDef.id,
151
- label: fieldDef.label,
152
- type: fieldDef.type,
153
- // Use the field's type; DataForm will use built-in or custom Edit
154
- config: { ...fieldDef.args, defaultValues },
155
- hideLabelFromVision: fieldDef.id === "content",
156
- // getValue and setValue handle the mapping to block attributes
157
- getValue: ({ item }) => {
158
- if (fieldDef.mapping) {
159
- const mappedValue = {};
160
- Object.entries(fieldDef.mapping).forEach(
161
- ([key, attrKey]) => {
162
- mappedValue[key] = item[attrKey];
163
- }
164
- );
165
- if (fieldDef.type === "media") {
166
- return normalizeMediaValue(mappedValue, fieldDef);
167
- }
168
- if (fieldDef.type === "link") {
169
- return normalizeLinkValue(mappedValue, fieldDef);
170
- }
171
- return mappedValue;
172
- }
173
- return item[fieldDef.id];
174
- },
175
- setValue: ({ item, value }) => {
176
- if (fieldDef.mapping) {
177
- let denormalizedValue = value;
178
- if (fieldDef.type === "media") {
179
- denormalizedValue = denormalizeMediaValue(
180
- value,
181
- fieldDef
182
- );
183
- } else if (fieldDef.type === "link") {
184
- denormalizedValue = denormalizeLinkValue(
185
- value,
186
- fieldDef
187
- );
188
- }
189
- const updates = {};
190
- Object.entries(fieldDef.mapping).forEach(
191
- ([key, attrKey]) => {
192
- if (key in denormalizedValue) {
193
- updates[attrKey] = denormalizedValue[key];
194
- } else {
195
- updates[attrKey] = item[attrKey];
196
- }
197
- }
198
- );
199
- return updates;
200
- }
201
- return { [fieldDef.id]: value };
202
- }
93
+ ...fieldDef
203
94
  };
204
- if (ControlComponent) {
205
- field.Edit = createConfiguredControl({
206
- control: fieldDef.type,
207
- clientId,
208
- fieldDef
95
+ if ("string" === typeof fieldDef.Edit && fieldDef.Edit === "rich-text") {
96
+ field.Edit = createConfiguredControl(import_rich_text.default, {
97
+ clientId
98
+ });
99
+ } else if ("string" === typeof fieldDef.Edit && fieldDef.Edit === "link") {
100
+ field.Edit = createConfiguredControl(import_link.default);
101
+ } else if ("object" === typeof fieldDef.Edit && fieldDef.Edit.control === "media") {
102
+ field.Edit = createConfiguredControl(import_media.default, {
103
+ ...fieldDef.Edit
209
104
  });
210
105
  }
211
106
  return field;
212
107
  });
213
- }, [blockTypeFields, blockType?.attributes, clientId]);
108
+ }, [blockTypeFields, clientId]);
109
+ if (!blockTypeFields?.length) {
110
+ return null;
111
+ }
214
112
  const handleToggleField = (fieldId) => {
215
113
  setForm((prev) => {
216
114
  if (prev.fields?.includes(fieldId)) {
@@ -225,34 +123,27 @@ function BlockFields({ clientId, blockType, attributes, setAttributes }) {
225
123
  };
226
124
  });
227
125
  };
228
- if (!blockTypeFields?.length) {
229
- return null;
230
- }
231
126
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "block-editor-block-fields__container", children: [
232
127
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "block-editor-block-fields__header", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_components.__experimentalHStack, { spacing: 1, children: [
233
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
234
- import_block_icon.default,
235
- {
236
- className: "block-editor-block-fields__header-icon",
237
- icon: blockInformation?.icon
238
- }
239
- ),
240
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
241
- import_components.__experimentalTruncate,
242
- {
243
- className: "block-editor-block-fields__header-title",
244
- numberOfLines: 1,
245
- children: blockTitle
246
- }
247
- ),
248
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
249
- import_fields_dropdown_menu.default,
250
- {
251
- fields: dataFormFields,
252
- visibleFields: form.fields,
253
- onToggleField: handleToggleField
254
- }
255
- )
128
+ isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
129
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
130
+ import_block_icon.default,
131
+ {
132
+ className: "block-editor-block-fields__header-icon",
133
+ icon: blockInformation?.icon
134
+ }
135
+ ),
136
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "block-editor-block-fields__header-title", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.__experimentalTruncate, { numberOfLines: 1, children: blockTitle }) }),
137
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
138
+ import_fields_dropdown_menu.default,
139
+ {
140
+ fields: dataFormFields,
141
+ visibleFields: form.fields,
142
+ onToggleField: handleToggleField
143
+ }
144
+ )
145
+ ] }),
146
+ !isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "block-editor-block-fields__header-title", children: (0, import_i18n.__)("Content") })
256
147
  ] }) }),
257
148
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
258
149
  import_dataviews.DataForm,
@@ -265,44 +156,28 @@ function BlockFields({ clientId, blockType, attributes, setAttributes }) {
265
156
  )
266
157
  ] });
267
158
  }
268
- var withBlockFields = (0, import_compose.createHigherOrderComponent)(
269
- (BlockEdit) => (props) => {
270
- const {
159
+ function hasBlockFieldsSupport(blockName) {
160
+ return !!(window?.__experimentalContentOnlyInspectorFields && (0, import_blocks.getBlockType)(blockName)?.[fieldsKey]);
161
+ }
162
+ function BlockFieldsPanel(props) {
163
+ const { blockType, isSelectionWithinCurrentSection } = (0, import_element.useContext)(import_private_block_context.PrivateBlockContext);
164
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fill.default, { group: "content", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
165
+ BlockFields,
166
+ {
167
+ ...props,
271
168
  blockType,
272
- isSelectionWithinCurrentSection,
273
- isSectionBlock,
274
- blockEditingMode,
275
- isSelected
276
- } = (0, import_element.useContext)(import_private_block_context.PrivateBlockContext);
277
- const shouldShowBlockFields = window?.__experimentalContentOnlyInspectorFields;
278
- const blockTypeFields = blockType?.[fieldsKey];
279
- if (!shouldShowBlockFields || !blockTypeFields?.length) {
280
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BlockEdit, { ...props }, "edit");
169
+ isCollapsed: isSelectionWithinCurrentSection
281
170
  }
282
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
283
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BlockEdit, { ...props }, "edit"),
284
- // Display the controls of all inner blocks for section/pattern editing.
285
- isSelectionWithinCurrentSection && (isSectionBlock || blockEditingMode === "contentOnly") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
286
- import_fill.PrivateInspectorControlsFill,
287
- {
288
- group: "content",
289
- forceDisplayControls: true,
290
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
291
- BlockFields,
292
- {
293
- ...props,
294
- blockType
295
- }
296
- )
297
- }
298
- ),
299
- !isSelectionWithinCurrentSection && isSelected && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fill.PrivateInspectorControlsFill, { group: "content", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BlockFields, { ...props, blockType }) })
300
- ] });
301
- }
302
- );
303
- (0, import_hooks.addFilter)(
304
- "editor.BlockEdit",
305
- "core/content-only-controls/block-fields",
306
- withBlockFields
307
- );
171
+ ) });
172
+ }
173
+ var block_fields_default = {
174
+ edit: BlockFieldsPanel,
175
+ hasSupport: hasBlockFieldsSupport,
176
+ attributeKeys: [],
177
+ supportsPatternEditing: true
178
+ };
179
+ // Annotate the CommonJS export names for ESM import in node:
180
+ 0 && (module.exports = {
181
+ BlockFieldsPanel
182
+ });
308
183
  //# sourceMappingURL=index.cjs.map