@wordpress/block-editor 12.4.0 → 12.5.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 (316) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +5 -0
  3. package/build/components/block-heading-level-dropdown/heading-level-icon.js +10 -2
  4. package/build/components/block-heading-level-dropdown/heading-level-icon.js.map +1 -1
  5. package/build/components/block-heading-level-dropdown/index.native.js +4 -3
  6. package/build/components/block-heading-level-dropdown/index.native.js.map +1 -1
  7. package/build/components/block-lock/toolbar.js +25 -6
  8. package/build/components/block-lock/toolbar.js.map +1 -1
  9. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +3 -6
  10. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  11. package/build/components/block-parent-selector/index.js +8 -5
  12. package/build/components/block-parent-selector/index.js.map +1 -1
  13. package/build/components/block-removal-warning-modal/index.js +18 -25
  14. package/build/components/block-removal-warning-modal/index.js.map +1 -1
  15. package/build/components/block-toolbar/index.js +8 -5
  16. package/build/components/block-toolbar/index.js.map +1 -1
  17. package/build/components/block-tools/block-contextual-toolbar.js +7 -11
  18. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  19. package/build/components/dimensions-tool/aspect-ratio-tool.js +99 -0
  20. package/build/components/dimensions-tool/aspect-ratio-tool.js.map +1 -0
  21. package/build/components/dimensions-tool/index.js +207 -0
  22. package/build/components/dimensions-tool/index.js.map +1 -0
  23. package/build/components/dimensions-tool/scale-tool.js +111 -0
  24. package/build/components/dimensions-tool/scale-tool.js.map +1 -0
  25. package/build/components/dimensions-tool/width-height-tool.js +125 -0
  26. package/build/components/dimensions-tool/width-height-tool.js.map +1 -0
  27. package/build/components/global-styles/color-panel.js +1 -1
  28. package/build/components/global-styles/color-panel.js.map +1 -1
  29. package/build/components/global-styles/filters-panel.js +1 -1
  30. package/build/components/global-styles/filters-panel.js.map +1 -1
  31. package/build/components/global-styles/hooks.js +2 -2
  32. package/build/components/global-styles/hooks.js.map +1 -1
  33. package/build/components/global-styles/typography-panel.js +34 -2
  34. package/build/components/global-styles/typography-panel.js.map +1 -1
  35. package/build/components/image-editor/aspect-ratio-dropdown.js +1 -1
  36. package/build/components/image-editor/aspect-ratio-dropdown.js.map +1 -1
  37. package/build/components/image-editor/use-save-image.js +1 -2
  38. package/build/components/image-editor/use-save-image.js.map +1 -1
  39. package/build/components/image-size-control/index.js +6 -0
  40. package/build/components/image-size-control/index.js.map +1 -1
  41. package/build/components/index.js +19 -1
  42. package/build/components/index.js.map +1 -1
  43. package/build/components/inserter/block-patterns-explorer/patterns-list.js +2 -2
  44. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  45. package/build/components/inserter/block-patterns-tab.js +7 -35
  46. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  47. package/build/components/inserter/hooks/use-block-types-state.js +3 -4
  48. package/build/components/inserter/hooks/use-block-types-state.js.map +1 -1
  49. package/build/components/inserter/hooks/use-patterns-state.js +9 -3
  50. package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
  51. package/build/components/inserter/media-tab/hooks.js +2 -21
  52. package/build/components/inserter/media-tab/hooks.js.map +1 -1
  53. package/build/components/inserter/reusable-block-rename-hint.js +62 -0
  54. package/build/components/inserter/reusable-block-rename-hint.js.map +1 -0
  55. package/build/components/inserter/reusable-blocks-tab.js +6 -2
  56. package/build/components/inserter/reusable-blocks-tab.js.map +1 -1
  57. package/build/components/inserter/reusable-blocks-tab.native.js +2 -2
  58. package/build/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  59. package/build/components/inserter/tabs.native.js +1 -1
  60. package/build/components/inserter/tabs.native.js.map +1 -1
  61. package/build/components/inserter-draggable-blocks/index.js +9 -1
  62. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  63. package/build/components/link-control/constants.js +1 -1
  64. package/build/components/link-control/constants.js.map +1 -1
  65. package/build/components/link-control/index.js +17 -15
  66. package/build/components/link-control/index.js.map +1 -1
  67. package/build/components/link-control/search-create-button.js +5 -21
  68. package/build/components/link-control/search-create-button.js.map +1 -1
  69. package/build/components/link-control/search-input.js +4 -4
  70. package/build/components/link-control/search-input.js.map +1 -1
  71. package/build/components/link-control/search-item.js +13 -30
  72. package/build/components/link-control/search-item.js.map +1 -1
  73. package/build/components/link-control/search-results.js +2 -2
  74. package/build/components/link-control/search-results.js.map +1 -1
  75. package/build/components/link-control/settings-drawer.js +2 -3
  76. package/build/components/link-control/settings-drawer.js.map +1 -1
  77. package/build/components/list-view/appender.js +2 -6
  78. package/build/components/list-view/appender.js.map +1 -1
  79. package/build/components/provider/index.js +5 -2
  80. package/build/components/provider/index.js.map +1 -1
  81. package/build/components/provider/use-block-sync.js +21 -0
  82. package/build/components/provider/use-block-sync.js.map +1 -1
  83. package/build/components/resolution-tool/index.js +55 -0
  84. package/build/components/resolution-tool/index.js.map +1 -0
  85. package/build/components/url-input/index.js +4 -2
  86. package/build/components/url-input/index.js.map +1 -1
  87. package/build/components/writing-flow/use-tab-nav.js +10 -27
  88. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  89. package/build/components/writing-mode-control/index.js +70 -0
  90. package/build/components/writing-mode-control/index.js.map +1 -0
  91. package/build/hooks/behaviors.js +25 -20
  92. package/build/hooks/behaviors.js.map +1 -1
  93. package/build/hooks/supports.js +7 -1
  94. package/build/hooks/supports.js.map +1 -1
  95. package/build/hooks/typography.js +2 -1
  96. package/build/hooks/typography.js.map +1 -1
  97. package/build/hooks/utils.js +4 -2
  98. package/build/hooks/utils.js.map +1 -1
  99. package/build/private-apis.js +10 -1
  100. package/build/private-apis.js.map +1 -1
  101. package/build/private-apis.native.js +3 -0
  102. package/build/private-apis.native.js.map +1 -1
  103. package/build/store/actions.js +195 -1
  104. package/build/store/actions.js.map +1 -1
  105. package/build/store/defaults.js +1 -0
  106. package/build/store/defaults.js.map +1 -1
  107. package/build/store/index.js +10 -1
  108. package/build/store/index.js.map +1 -1
  109. package/build/store/private-actions.js +46 -40
  110. package/build/store/private-actions.js.map +1 -1
  111. package/build/store/private-selectors.js +3 -3
  112. package/build/store/private-selectors.js.map +1 -1
  113. package/build/store/reducer.js +22 -8
  114. package/build/store/reducer.js.map +1 -1
  115. package/build/store/selectors.js +33 -15
  116. package/build/store/selectors.js.map +1 -1
  117. package/build-module/components/block-heading-level-dropdown/heading-level-icon.js +9 -2
  118. package/build-module/components/block-heading-level-dropdown/heading-level-icon.js.map +1 -1
  119. package/build-module/components/block-heading-level-dropdown/index.native.js +4 -3
  120. package/build-module/components/block-heading-level-dropdown/index.native.js.map +1 -1
  121. package/build-module/components/block-lock/toolbar.js +25 -7
  122. package/build-module/components/block-lock/toolbar.js.map +1 -1
  123. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +4 -6
  124. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  125. package/build-module/components/block-parent-selector/index.js +7 -5
  126. package/build-module/components/block-parent-selector/index.js.map +1 -1
  127. package/build-module/components/block-removal-warning-modal/index.js +20 -24
  128. package/build-module/components/block-removal-warning-modal/index.js.map +1 -1
  129. package/build-module/components/block-toolbar/index.js +8 -5
  130. package/build-module/components/block-toolbar/index.js.map +1 -1
  131. package/build-module/components/block-tools/block-contextual-toolbar.js +8 -11
  132. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  133. package/build-module/components/dimensions-tool/aspect-ratio-tool.js +87 -0
  134. package/build-module/components/dimensions-tool/aspect-ratio-tool.js.map +1 -0
  135. package/build-module/components/dimensions-tool/index.js +195 -0
  136. package/build-module/components/dimensions-tool/index.js.map +1 -0
  137. package/build-module/components/dimensions-tool/scale-tool.js +103 -0
  138. package/build-module/components/dimensions-tool/scale-tool.js.map +1 -0
  139. package/build-module/components/dimensions-tool/width-height-tool.js +122 -0
  140. package/build-module/components/dimensions-tool/width-height-tool.js.map +1 -0
  141. package/build-module/components/global-styles/color-panel.js +1 -1
  142. package/build-module/components/global-styles/color-panel.js.map +1 -1
  143. package/build-module/components/global-styles/filters-panel.js +2 -2
  144. package/build-module/components/global-styles/filters-panel.js.map +1 -1
  145. package/build-module/components/global-styles/hooks.js +2 -2
  146. package/build-module/components/global-styles/hooks.js.map +1 -1
  147. package/build-module/components/global-styles/typography-panel.js +33 -2
  148. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  149. package/build-module/components/image-editor/aspect-ratio-dropdown.js +1 -1
  150. package/build-module/components/image-editor/aspect-ratio-dropdown.js.map +1 -1
  151. package/build-module/components/image-editor/use-save-image.js +1 -2
  152. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  153. package/build-module/components/image-size-control/index.js +5 -0
  154. package/build-module/components/image-size-control/index.js.map +1 -1
  155. package/build-module/components/index.js +6 -0
  156. package/build-module/components/index.js.map +1 -1
  157. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +2 -2
  158. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  159. package/build-module/components/inserter/block-patterns-tab.js +7 -33
  160. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  161. package/build-module/components/inserter/hooks/use-block-types-state.js +3 -4
  162. package/build-module/components/inserter/hooks/use-block-types-state.js.map +1 -1
  163. package/build-module/components/inserter/hooks/use-patterns-state.js +9 -3
  164. package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
  165. package/build-module/components/inserter/media-tab/hooks.js +2 -21
  166. package/build-module/components/inserter/media-tab/hooks.js.map +1 -1
  167. package/build-module/components/inserter/reusable-block-rename-hint.js +48 -0
  168. package/build-module/components/inserter/reusable-block-rename-hint.js.map +1 -0
  169. package/build-module/components/inserter/reusable-blocks-tab.js +5 -2
  170. package/build-module/components/inserter/reusable-blocks-tab.js.map +1 -1
  171. package/build-module/components/inserter/reusable-blocks-tab.native.js +2 -2
  172. package/build-module/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  173. package/build-module/components/inserter/tabs.native.js +1 -1
  174. package/build-module/components/inserter/tabs.native.js.map +1 -1
  175. package/build-module/components/inserter-draggable-blocks/index.js +9 -2
  176. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  177. package/build-module/components/link-control/constants.js +1 -1
  178. package/build-module/components/link-control/constants.js.map +1 -1
  179. package/build-module/components/link-control/index.js +17 -15
  180. package/build-module/components/link-control/index.js.map +1 -1
  181. package/build-module/components/link-control/search-create-button.js +7 -20
  182. package/build-module/components/link-control/search-create-button.js.map +1 -1
  183. package/build-module/components/link-control/search-input.js +4 -4
  184. package/build-module/components/link-control/search-input.js.map +1 -1
  185. package/build-module/components/link-control/search-item.js +14 -28
  186. package/build-module/components/link-control/search-item.js.map +1 -1
  187. package/build-module/components/link-control/search-results.js +3 -3
  188. package/build-module/components/link-control/search-results.js.map +1 -1
  189. package/build-module/components/link-control/settings-drawer.js +4 -5
  190. package/build-module/components/link-control/settings-drawer.js.map +1 -1
  191. package/build-module/components/list-view/appender.js +2 -6
  192. package/build-module/components/list-view/appender.js.map +1 -1
  193. package/build-module/components/provider/index.js +5 -2
  194. package/build-module/components/provider/index.js.map +1 -1
  195. package/build-module/components/provider/use-block-sync.js +21 -0
  196. package/build-module/components/provider/use-block-sync.js.map +1 -1
  197. package/build-module/components/resolution-tool/index.js +45 -0
  198. package/build-module/components/resolution-tool/index.js.map +1 -0
  199. package/build-module/components/url-input/index.js +4 -2
  200. package/build-module/components/url-input/index.js.map +1 -1
  201. package/build-module/components/writing-flow/use-tab-nav.js +8 -26
  202. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  203. package/build-module/components/writing-mode-control/index.js +57 -0
  204. package/build-module/components/writing-mode-control/index.js.map +1 -0
  205. package/build-module/hooks/behaviors.js +26 -20
  206. package/build-module/hooks/behaviors.js.map +1 -1
  207. package/build-module/hooks/supports.js +7 -1
  208. package/build-module/hooks/supports.js.map +1 -1
  209. package/build-module/hooks/typography.js +2 -1
  210. package/build-module/hooks/typography.js.map +1 -1
  211. package/build-module/hooks/utils.js +4 -2
  212. package/build-module/hooks/utils.js.map +1 -1
  213. package/build-module/private-apis.js +7 -1
  214. package/build-module/private-apis.js.map +1 -1
  215. package/build-module/private-apis.native.js +2 -0
  216. package/build-module/private-apis.native.js.map +1 -1
  217. package/build-module/store/actions.js +191 -1
  218. package/build-module/store/actions.js.map +1 -1
  219. package/build-module/store/defaults.js +1 -0
  220. package/build-module/store/defaults.js.map +1 -1
  221. package/build-module/store/index.js +10 -1
  222. package/build-module/store/index.js.map +1 -1
  223. package/build-module/store/private-actions.js +45 -36
  224. package/build-module/store/private-actions.js.map +1 -1
  225. package/build-module/store/private-selectors.js +2 -2
  226. package/build-module/store/private-selectors.js.map +1 -1
  227. package/build-module/store/reducer.js +22 -8
  228. package/build-module/store/reducer.js.map +1 -1
  229. package/build-module/store/selectors.js +33 -15
  230. package/build-module/store/selectors.js.map +1 -1
  231. package/build-style/content-rtl.css +3 -0
  232. package/build-style/content.css +3 -0
  233. package/build-style/style-rtl.css +131 -129
  234. package/build-style/style.css +131 -129
  235. package/package.json +32 -31
  236. package/src/components/alignment-control/test/__snapshots__/index.js.snap +6 -6
  237. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +5 -5
  238. package/src/components/block-draggable/style.scss +1 -0
  239. package/src/components/block-heading-level-dropdown/heading-level-icon.js +6 -1
  240. package/src/components/block-heading-level-dropdown/index.native.js +8 -4
  241. package/src/components/block-inspector/style.scss +2 -1
  242. package/src/components/block-lock/toolbar.js +34 -6
  243. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +4 -8
  244. package/src/components/block-parent-selector/index.js +13 -8
  245. package/src/components/block-removal-warning-modal/index.js +20 -33
  246. package/src/components/block-toolbar/index.js +9 -6
  247. package/src/components/block-tools/block-contextual-toolbar.js +5 -11
  248. package/src/components/block-tools/style.scss +73 -26
  249. package/src/components/default-block-appender/content.scss +11 -0
  250. package/src/components/dimensions-tool/aspect-ratio-tool.js +124 -0
  251. package/src/components/dimensions-tool/index.js +212 -0
  252. package/src/components/dimensions-tool/scale-tool.js +124 -0
  253. package/src/components/dimensions-tool/stories/aspect-ratio-tool.js +52 -0
  254. package/src/components/dimensions-tool/stories/index.js +54 -0
  255. package/src/components/dimensions-tool/stories/scale-tool.js +48 -0
  256. package/src/components/dimensions-tool/stories/width-height-tool.js +54 -0
  257. package/src/components/dimensions-tool/test/index.js +641 -0
  258. package/src/components/dimensions-tool/width-height-tool.js +113 -0
  259. package/src/components/font-family/README.md +71 -0
  260. package/src/components/global-styles/color-panel.js +1 -1
  261. package/src/components/global-styles/filters-panel.js +2 -2
  262. package/src/components/global-styles/hooks.js +2 -0
  263. package/src/components/global-styles/typography-panel.js +40 -0
  264. package/src/components/image-editor/aspect-ratio-dropdown.js +1 -1
  265. package/src/components/image-editor/use-save-image.js +0 -1
  266. package/src/components/image-size-control/index.js +6 -0
  267. package/src/components/index.js +6 -0
  268. package/src/components/inserter/block-patterns-explorer/patterns-list.js +8 -2
  269. package/src/components/inserter/block-patterns-tab.js +8 -56
  270. package/src/components/inserter/hooks/use-block-types-state.js +3 -4
  271. package/src/components/inserter/hooks/use-patterns-state.js +35 -19
  272. package/src/components/inserter/media-tab/hooks.js +2 -22
  273. package/src/components/inserter/reusable-block-rename-hint.js +52 -0
  274. package/src/components/inserter/reusable-blocks-tab.js +5 -1
  275. package/src/components/inserter/reusable-blocks-tab.native.js +2 -2
  276. package/src/components/inserter/style.scss +28 -0
  277. package/src/components/inserter/tabs.native.js +5 -1
  278. package/src/components/inserter-draggable-blocks/index.js +13 -2
  279. package/src/components/link-control/constants.js +1 -1
  280. package/src/components/link-control/index.js +32 -28
  281. package/src/components/link-control/search-create-button.js +8 -26
  282. package/src/components/link-control/search-input.js +4 -3
  283. package/src/components/link-control/search-item.js +21 -43
  284. package/src/components/link-control/search-results.js +48 -46
  285. package/src/components/link-control/settings-drawer.js +6 -5
  286. package/src/components/link-control/style.scss +51 -123
  287. package/src/components/link-control/test/index.js +135 -123
  288. package/src/components/list-view/appender.js +5 -6
  289. package/src/components/list-view/style.scss +1 -2
  290. package/src/components/media-replace-flow/test/index.js +1 -1
  291. package/src/components/panel-color-settings/README.md +98 -0
  292. package/src/components/provider/index.js +9 -2
  293. package/src/components/provider/test/use-block-sync.js +21 -6
  294. package/src/components/provider/use-block-sync.js +19 -0
  295. package/src/components/recursion-provider/README.md +101 -0
  296. package/src/components/resolution-tool/index.js +56 -0
  297. package/src/components/resolution-tool/stories/index.js +48 -0
  298. package/src/components/url-input/index.js +2 -0
  299. package/src/components/writing-flow/use-tab-nav.js +10 -33
  300. package/src/components/writing-mode-control/index.js +68 -0
  301. package/src/components/writing-mode-control/style.scss +18 -0
  302. package/src/hooks/behaviors.js +25 -16
  303. package/src/hooks/supports.js +7 -0
  304. package/src/hooks/typography.js +2 -0
  305. package/src/hooks/utils.js +3 -0
  306. package/src/private-apis.js +6 -0
  307. package/src/private-apis.native.js +2 -0
  308. package/src/store/actions.js +194 -1
  309. package/src/store/defaults.js +1 -0
  310. package/src/store/index.js +10 -0
  311. package/src/store/private-actions.js +39 -39
  312. package/src/store/private-selectors.js +2 -2
  313. package/src/store/reducer.js +22 -8
  314. package/src/store/selectors.js +54 -20
  315. package/src/store/test/actions.js +111 -0
  316. package/src/store/test/private-actions.js +56 -0
@@ -4,9 +4,9 @@ import { createElement } from "@wordpress/element";
4
4
  * WordPress dependencies
5
5
  */
6
6
  import { Button, __unstableMotion as motion, __unstableAnimatePresence as AnimatePresence } from '@wordpress/components';
7
- import { settings as settingsIcon } from '@wordpress/icons';
7
+ import { chevronLeftSmall, chevronRightSmall } from '@wordpress/icons';
8
8
  import { useReducedMotion, useInstanceId } from '@wordpress/compose';
9
- import { __ } from '@wordpress/i18n';
9
+ import { _x, isRTL } from '@wordpress/i18n';
10
10
  import { Fragment } from '@wordpress/element';
11
11
 
12
12
  function LinkSettingsDrawer({
@@ -23,10 +23,9 @@ function LinkSettingsDrawer({
23
23
  className: "block-editor-link-control__drawer-toggle",
24
24
  "aria-expanded": settingsOpen,
25
25
  onClick: () => setSettingsOpen(!settingsOpen),
26
- icon: settingsIcon,
27
- label: __('Link Settings'),
26
+ icon: isRTL() ? chevronLeftSmall : chevronRightSmall,
28
27
  "aria-controls": settingsDrawerId
29
- }), createElement(MaybeAnimatePresence, null, settingsOpen && createElement(MaybeMotionDiv, {
28
+ }, _x('Advanced', 'Additional link settings')), createElement(MaybeAnimatePresence, null, settingsOpen && createElement(MaybeMotionDiv, {
30
29
  className: "block-editor-link-control__drawer",
31
30
  hidden: !settingsOpen,
32
31
  id: settingsDrawerId,
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/link-control/settings-drawer.js"],"names":["Button","__unstableMotion","motion","__unstableAnimatePresence","AnimatePresence","settings","settingsIcon","useReducedMotion","useInstanceId","__","Fragment","LinkSettingsDrawer","children","settingsOpen","setSettingsOpen","prefersReducedMotion","MaybeAnimatePresence","MaybeMotionDiv","div","id","settingsDrawerId","open","opacity","height","collapsed","duration"],"mappings":";;AAAA;AACA;AACA;AACA,SACCA,MADD,EAECC,gBAAgB,IAAIC,MAFrB,EAGCC,yBAAyB,IAAIC,eAH9B,QAIO,uBAJP;AAKA,SAASC,QAAQ,IAAIC,YAArB,QAAyC,kBAAzC;AACA,SAASC,gBAAT,EAA2BC,aAA3B,QAAgD,oBAAhD;AACA,SAASC,EAAT,QAAmB,iBAAnB;AACA,SAASC,QAAT,QAAyB,oBAAzB;;AAEA,SAASC,kBAAT,CAA6B;AAAEC,EAAAA,QAAF;AAAYC,EAAAA,YAAZ;AAA0BC,EAAAA;AAA1B,CAA7B,EAA2E;AAC1E,QAAMC,oBAAoB,GAAGR,gBAAgB,EAA7C;AACA,QAAMS,oBAAoB,GAAGD,oBAAoB,GAC9CL,QAD8C,GAE9CN,eAFH;AAGA,QAAMa,cAAc,GAAGF,oBAAoB,GAAG,KAAH,GAAWb,MAAM,CAACgB,GAA7D;AAEA,QAAMC,EAAE,GAAGX,aAAa,CAAEG,kBAAF,CAAxB;AAEA,QAAMS,gBAAgB,GAAI,gCAAgCD,EAAI,EAA9D;AAEA,SACC,8BACC,cAAC,MAAD;AACC,IAAA,SAAS,EAAC,0CADX;AAEC,qBAAgBN,YAFjB;AAGC,IAAA,OAAO,EAAG,MAAMC,eAAe,CAAE,CAAED,YAAJ,CAHhC;AAIC,IAAA,IAAI,EAAGP,YAJR;AAKC,IAAA,KAAK,EAAGG,EAAE,CAAE,eAAF,CALX;AAMC,qBAAgBW;AANjB,IADD,EASC,cAAC,oBAAD,QACGP,YAAY,IACb,cAAC,cAAD;AACC,IAAA,SAAS,EAAC,mCADX;AAEC,IAAA,MAAM,EAAG,CAAEA,YAFZ;AAGC,IAAA,EAAE,EAAGO,gBAHN;AAIC,IAAA,OAAO,EAAC,WAJT;AAKC,IAAA,OAAO,EAAC,MALT;AAMC,IAAA,IAAI,EAAC,WANN;AAOC,IAAA,QAAQ,EAAG;AACVC,MAAAA,IAAI,EAAE;AAAEC,QAAAA,OAAO,EAAE,CAAX;AAAcC,QAAAA,MAAM,EAAE;AAAtB,OADI;AAEVC,MAAAA,SAAS,EAAE;AAAEF,QAAAA,OAAO,EAAE,CAAX;AAAcC,QAAAA,MAAM,EAAE;AAAtB;AAFD,KAPZ;AAWC,IAAA,UAAU,EAAG;AACZE,MAAAA,QAAQ,EAAE;AADE;AAXd,KAeC;AAAK,IAAA,SAAS,EAAC;AAAf,KACGb,QADH,CAfD,CAFF,CATD,CADD;AAmCA;;AAED,eAAeD,kBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tButton,\n\t__unstableMotion as motion,\n\t__unstableAnimatePresence as AnimatePresence,\n} from '@wordpress/components';\nimport { settings as settingsIcon } from '@wordpress/icons';\nimport { useReducedMotion, useInstanceId } from '@wordpress/compose';\nimport { __ } from '@wordpress/i18n';\nimport { Fragment } from '@wordpress/element';\n\nfunction LinkSettingsDrawer( { children, settingsOpen, setSettingsOpen } ) {\n\tconst prefersReducedMotion = useReducedMotion();\n\tconst MaybeAnimatePresence = prefersReducedMotion\n\t\t? Fragment\n\t\t: AnimatePresence;\n\tconst MaybeMotionDiv = prefersReducedMotion ? 'div' : motion.div;\n\n\tconst id = useInstanceId( LinkSettingsDrawer );\n\n\tconst settingsDrawerId = `link-control-settings-drawer-${ id }`;\n\n\treturn (\n\t\t<>\n\t\t\t<Button\n\t\t\t\tclassName=\"block-editor-link-control__drawer-toggle\"\n\t\t\t\taria-expanded={ settingsOpen }\n\t\t\t\tonClick={ () => setSettingsOpen( ! settingsOpen ) }\n\t\t\t\ticon={ settingsIcon }\n\t\t\t\tlabel={ __( 'Link Settings' ) }\n\t\t\t\taria-controls={ settingsDrawerId }\n\t\t\t/>\n\t\t\t<MaybeAnimatePresence>\n\t\t\t\t{ settingsOpen && (\n\t\t\t\t\t<MaybeMotionDiv\n\t\t\t\t\t\tclassName=\"block-editor-link-control__drawer\"\n\t\t\t\t\t\thidden={ ! settingsOpen }\n\t\t\t\t\t\tid={ settingsDrawerId }\n\t\t\t\t\t\tinitial=\"collapsed\"\n\t\t\t\t\t\tanimate=\"open\"\n\t\t\t\t\t\texit=\"collapsed\"\n\t\t\t\t\t\tvariants={ {\n\t\t\t\t\t\t\topen: { opacity: 1, height: 'auto' },\n\t\t\t\t\t\t\tcollapsed: { opacity: 0, height: 0 },\n\t\t\t\t\t\t} }\n\t\t\t\t\t\ttransition={ {\n\t\t\t\t\t\t\tduration: 0.1,\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"block-editor-link-control__drawer-inner\">\n\t\t\t\t\t\t\t{ children }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MaybeMotionDiv>\n\t\t\t\t) }\n\t\t\t</MaybeAnimatePresence>\n\t\t</>\n\t);\n}\n\nexport default LinkSettingsDrawer;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/link-control/settings-drawer.js"],"names":["Button","__unstableMotion","motion","__unstableAnimatePresence","AnimatePresence","chevronLeftSmall","chevronRightSmall","useReducedMotion","useInstanceId","_x","isRTL","Fragment","LinkSettingsDrawer","children","settingsOpen","setSettingsOpen","prefersReducedMotion","MaybeAnimatePresence","MaybeMotionDiv","div","id","settingsDrawerId","open","opacity","height","collapsed","duration"],"mappings":";;AAAA;AACA;AACA;AACA,SACCA,MADD,EAECC,gBAAgB,IAAIC,MAFrB,EAGCC,yBAAyB,IAAIC,eAH9B,QAIO,uBAJP;AAKA,SAASC,gBAAT,EAA2BC,iBAA3B,QAAoD,kBAApD;AACA,SAASC,gBAAT,EAA2BC,aAA3B,QAAgD,oBAAhD;AACA,SAASC,EAAT,EAAaC,KAAb,QAA0B,iBAA1B;AACA,SAASC,QAAT,QAAyB,oBAAzB;;AAEA,SAASC,kBAAT,CAA6B;AAAEC,EAAAA,QAAF;AAAYC,EAAAA,YAAZ;AAA0BC,EAAAA;AAA1B,CAA7B,EAA2E;AAC1E,QAAMC,oBAAoB,GAAGT,gBAAgB,EAA7C;AACA,QAAMU,oBAAoB,GAAGD,oBAAoB,GAC9CL,QAD8C,GAE9CP,eAFH;AAGA,QAAMc,cAAc,GAAGF,oBAAoB,GAAG,KAAH,GAAWd,MAAM,CAACiB,GAA7D;AAEA,QAAMC,EAAE,GAAGZ,aAAa,CAAEI,kBAAF,CAAxB;AAEA,QAAMS,gBAAgB,GAAI,gCAAgCD,EAAI,EAA9D;AAEA,SACC,8BACC,cAAC,MAAD;AACC,IAAA,SAAS,EAAC,0CADX;AAEC,qBAAgBN,YAFjB;AAGC,IAAA,OAAO,EAAG,MAAMC,eAAe,CAAE,CAAED,YAAJ,CAHhC;AAIC,IAAA,IAAI,EAAGJ,KAAK,KAAKL,gBAAL,GAAwBC,iBAJrC;AAKC,qBAAgBe;AALjB,KAOGZ,EAAE,CAAE,UAAF,EAAc,0BAAd,CAPL,CADD,EAUC,cAAC,oBAAD,QACGK,YAAY,IACb,cAAC,cAAD;AACC,IAAA,SAAS,EAAC,mCADX;AAEC,IAAA,MAAM,EAAG,CAAEA,YAFZ;AAGC,IAAA,EAAE,EAAGO,gBAHN;AAIC,IAAA,OAAO,EAAC,WAJT;AAKC,IAAA,OAAO,EAAC,MALT;AAMC,IAAA,IAAI,EAAC,WANN;AAOC,IAAA,QAAQ,EAAG;AACVC,MAAAA,IAAI,EAAE;AAAEC,QAAAA,OAAO,EAAE,CAAX;AAAcC,QAAAA,MAAM,EAAE;AAAtB,OADI;AAEVC,MAAAA,SAAS,EAAE;AAAEF,QAAAA,OAAO,EAAE,CAAX;AAAcC,QAAAA,MAAM,EAAE;AAAtB;AAFD,KAPZ;AAWC,IAAA,UAAU,EAAG;AACZE,MAAAA,QAAQ,EAAE;AADE;AAXd,KAeC;AAAK,IAAA,SAAS,EAAC;AAAf,KACGb,QADH,CAfD,CAFF,CAVD,CADD;AAoCA;;AAED,eAAeD,kBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tButton,\n\t__unstableMotion as motion,\n\t__unstableAnimatePresence as AnimatePresence,\n} from '@wordpress/components';\nimport { chevronLeftSmall, chevronRightSmall } from '@wordpress/icons';\nimport { useReducedMotion, useInstanceId } from '@wordpress/compose';\nimport { _x, isRTL } from '@wordpress/i18n';\nimport { Fragment } from '@wordpress/element';\n\nfunction LinkSettingsDrawer( { children, settingsOpen, setSettingsOpen } ) {\n\tconst prefersReducedMotion = useReducedMotion();\n\tconst MaybeAnimatePresence = prefersReducedMotion\n\t\t? Fragment\n\t\t: AnimatePresence;\n\tconst MaybeMotionDiv = prefersReducedMotion ? 'div' : motion.div;\n\n\tconst id = useInstanceId( LinkSettingsDrawer );\n\n\tconst settingsDrawerId = `link-control-settings-drawer-${ id }`;\n\n\treturn (\n\t\t<>\n\t\t\t<Button\n\t\t\t\tclassName=\"block-editor-link-control__drawer-toggle\"\n\t\t\t\taria-expanded={ settingsOpen }\n\t\t\t\tonClick={ () => setSettingsOpen( ! settingsOpen ) }\n\t\t\t\ticon={ isRTL() ? chevronLeftSmall : chevronRightSmall }\n\t\t\t\taria-controls={ settingsDrawerId }\n\t\t\t>\n\t\t\t\t{ _x( 'Advanced', 'Additional link settings' ) }\n\t\t\t</Button>\n\t\t\t<MaybeAnimatePresence>\n\t\t\t\t{ settingsOpen && (\n\t\t\t\t\t<MaybeMotionDiv\n\t\t\t\t\t\tclassName=\"block-editor-link-control__drawer\"\n\t\t\t\t\t\thidden={ ! settingsOpen }\n\t\t\t\t\t\tid={ settingsDrawerId }\n\t\t\t\t\t\tinitial=\"collapsed\"\n\t\t\t\t\t\tanimate=\"open\"\n\t\t\t\t\t\texit=\"collapsed\"\n\t\t\t\t\t\tvariants={ {\n\t\t\t\t\t\t\topen: { opacity: 1, height: 'auto' },\n\t\t\t\t\t\t\tcollapsed: { opacity: 0, height: 0 },\n\t\t\t\t\t\t} }\n\t\t\t\t\t\ttransition={ {\n\t\t\t\t\t\t\tduration: 0.1,\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"block-editor-link-control__drawer-inner\">\n\t\t\t\t\t\t\t{ children }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MaybeMotionDiv>\n\t\t\t\t) }\n\t\t\t</MaybeAnimatePresence>\n\t\t</>\n\t);\n}\n\nexport default LinkSettingsDrawer;\n"]}
@@ -28,16 +28,12 @@ export const Appender = forwardRef(({
28
28
  setInsertedBlock
29
29
  } = useListViewContext();
30
30
  const instanceId = useInstanceId(Appender);
31
- const {
32
- hideInserter
33
- } = useSelect(select => {
31
+ const hideInserter = useSelect(select => {
34
32
  const {
35
33
  getTemplateLock,
36
34
  __unstableGetEditorMode
37
35
  } = select(blockEditorStore);
38
- return {
39
- hideInserter: !!getTemplateLock(clientId) || __unstableGetEditorMode() === 'zoom-out'
40
- };
36
+ return !!getTemplateLock(clientId) || __unstableGetEditorMode() === 'zoom-out';
41
37
  }, [clientId]);
42
38
  const blockTitle = useBlockDisplayTitle({
43
39
  clientId,
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/list-view/appender.js"],"names":["useInstanceId","speak","useSelect","forwardRef","useEffect","__","sprintf","store","blockEditorStore","useBlockDisplayTitle","useListViewContext","Inserter","AriaReferencedText","Appender","nestingLevel","blockCount","clientId","props","ref","insertedBlock","setInsertedBlock","instanceId","hideInserter","select","getTemplateLock","__unstableGetEditorMode","blockTitle","context","insertedBlockTitle","length","descriptionId","description","maybeInsertedBlock"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useInstanceId } from '@wordpress/compose';\nimport { speak } from '@wordpress/a11y';\nimport { useSelect } from '@wordpress/data';\nimport { forwardRef, useEffect } from '@wordpress/element';\nimport { __, sprintf } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport useBlockDisplayTitle from '../block-title/use-block-display-title';\nimport { useListViewContext } from './context';\nimport Inserter from '../inserter';\nimport AriaReferencedText from './aria-referenced-text';\n\nexport const Appender = forwardRef(\n\t( { nestingLevel, blockCount, clientId, ...props }, ref ) => {\n\t\tconst { insertedBlock, setInsertedBlock } = useListViewContext();\n\n\t\tconst instanceId = useInstanceId( Appender );\n\t\tconst { hideInserter } = useSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst { getTemplateLock, __unstableGetEditorMode } =\n\t\t\t\t\tselect( blockEditorStore );\n\n\t\t\t\treturn {\n\t\t\t\t\thideInserter:\n\t\t\t\t\t\t!! getTemplateLock( clientId ) ||\n\t\t\t\t\t\t__unstableGetEditorMode() === 'zoom-out',\n\t\t\t\t};\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\n\t\tconst blockTitle = useBlockDisplayTitle( {\n\t\t\tclientId,\n\t\t\tcontext: 'list-view',\n\t\t} );\n\n\t\tconst insertedBlockTitle = useBlockDisplayTitle( {\n\t\t\tclientId: insertedBlock?.clientId,\n\t\t\tcontext: 'list-view',\n\t\t} );\n\n\t\tuseEffect( () => {\n\t\t\tif ( ! insertedBlockTitle?.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tspeak(\n\t\t\t\tsprintf(\n\t\t\t\t\t// translators: %s: name of block being inserted (i.e. Paragraph, Image, Group etc)\n\t\t\t\t\t__( '%s block inserted' ),\n\t\t\t\t\tinsertedBlockTitle\n\t\t\t\t),\n\t\t\t\t'assertive'\n\t\t\t);\n\t\t}, [ insertedBlockTitle ] );\n\n\t\tif ( hideInserter ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst descriptionId = `list-view-appender__${ instanceId }`;\n\t\tconst description = sprintf(\n\t\t\t/* translators: 1: The name of the block. 2: The numerical position of the block. 3: The level of nesting for the block. */\n\t\t\t__( 'Append to %1$s block at position %2$d, Level %3$d' ),\n\t\t\tblockTitle,\n\t\t\tblockCount + 1,\n\t\t\tnestingLevel\n\t\t);\n\n\t\treturn (\n\t\t\t<div className=\"list-view-appender\">\n\t\t\t\t<Inserter\n\t\t\t\t\tref={ ref }\n\t\t\t\t\trootClientId={ clientId }\n\t\t\t\t\tposition=\"bottom right\"\n\t\t\t\t\tisAppender\n\t\t\t\t\tselectBlockOnInsert={ false }\n\t\t\t\t\tshouldDirectInsert={ false }\n\t\t\t\t\t__experimentalIsQuick\n\t\t\t\t\t{ ...props }\n\t\t\t\t\ttoggleProps={ { 'aria-describedby': descriptionId } }\n\t\t\t\t\tonSelectOrClose={ ( maybeInsertedBlock ) => {\n\t\t\t\t\t\tif ( maybeInsertedBlock?.clientId ) {\n\t\t\t\t\t\t\tsetInsertedBlock( maybeInsertedBlock );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t\t<AriaReferencedText id={ descriptionId }>\n\t\t\t\t\t{ description }\n\t\t\t\t</AriaReferencedText>\n\t\t\t</div>\n\t\t);\n\t}\n);\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/list-view/appender.js"],"names":["useInstanceId","speak","useSelect","forwardRef","useEffect","__","sprintf","store","blockEditorStore","useBlockDisplayTitle","useListViewContext","Inserter","AriaReferencedText","Appender","nestingLevel","blockCount","clientId","props","ref","insertedBlock","setInsertedBlock","instanceId","hideInserter","select","getTemplateLock","__unstableGetEditorMode","blockTitle","context","insertedBlockTitle","length","descriptionId","description","maybeInsertedBlock"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,aAAT,QAA8B,oBAA9B;AACA,SAASC,KAAT,QAAsB,iBAAtB;AACA,SAASC,SAAT,QAA0B,iBAA1B;AACA,SAASC,UAAT,EAAqBC,SAArB,QAAsC,oBAAtC;AACA,SAASC,EAAT,EAAaC,OAAb,QAA4B,iBAA5B;AAEA;AACA;AACA;;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AACA,OAAOC,oBAAP,MAAiC,wCAAjC;AACA,SAASC,kBAAT,QAAmC,WAAnC;AACA,OAAOC,QAAP,MAAqB,aAArB;AACA,OAAOC,kBAAP,MAA+B,wBAA/B;AAEA,OAAO,MAAMC,QAAQ,GAAGV,UAAU,CACjC,CAAE;AAAEW,EAAAA,YAAF;AAAgBC,EAAAA,UAAhB;AAA4BC,EAAAA,QAA5B;AAAsC,KAAGC;AAAzC,CAAF,EAAoDC,GAApD,KAA6D;AAC5D,QAAM;AAAEC,IAAAA,aAAF;AAAiBC,IAAAA;AAAjB,MAAsCV,kBAAkB,EAA9D;AAEA,QAAMW,UAAU,GAAGrB,aAAa,CAAEa,QAAF,CAAhC;AACA,QAAMS,YAAY,GAAGpB,SAAS,CAC3BqB,MAAF,IAAc;AACb,UAAM;AAAEC,MAAAA,eAAF;AAAmBC,MAAAA;AAAnB,QACLF,MAAM,CAAEf,gBAAF,CADP;AAGA,WACC,CAAC,CAAEgB,eAAe,CAAER,QAAF,CAAlB,IACAS,uBAAuB,OAAO,UAF/B;AAIA,GAT4B,EAU7B,CAAET,QAAF,CAV6B,CAA9B;AAaA,QAAMU,UAAU,GAAGjB,oBAAoB,CAAE;AACxCO,IAAAA,QADwC;AAExCW,IAAAA,OAAO,EAAE;AAF+B,GAAF,CAAvC;AAKA,QAAMC,kBAAkB,GAAGnB,oBAAoB,CAAE;AAChDO,IAAAA,QAAQ,EAAEG,aAAa,EAAEH,QADuB;AAEhDW,IAAAA,OAAO,EAAE;AAFuC,GAAF,CAA/C;AAKAvB,EAAAA,SAAS,CAAE,MAAM;AAChB,QAAK,CAAEwB,kBAAkB,EAAEC,MAA3B,EAAoC;AACnC;AACA;;AAED5B,IAAAA,KAAK,CACJK,OAAO,EACN;AACAD,IAAAA,EAAE,CAAE,mBAAF,CAFI,EAGNuB,kBAHM,CADH,EAMJ,WANI,CAAL;AAQA,GAbQ,EAaN,CAAEA,kBAAF,CAbM,CAAT;;AAeA,MAAKN,YAAL,EAAoB;AACnB,WAAO,IAAP;AACA;;AAED,QAAMQ,aAAa,GAAI,uBAAuBT,UAAY,EAA1D;AACA,QAAMU,WAAW,GAAGzB,OAAO;AAC1B;AACAD,EAAAA,EAAE,CAAE,mDAAF,CAFwB,EAG1BqB,UAH0B,EAI1BX,UAAU,GAAG,CAJa,EAK1BD,YAL0B,CAA3B;AAQA,SACC;AAAK,IAAA,SAAS,EAAC;AAAf,KACC,cAAC,QAAD;AACC,IAAA,GAAG,EAAGI,GADP;AAEC,IAAA,YAAY,EAAGF,QAFhB;AAGC,IAAA,QAAQ,EAAC,cAHV;AAIC,IAAA,UAAU,MAJX;AAKC,IAAA,mBAAmB,EAAG,KALvB;AAMC,IAAA,kBAAkB,EAAG,KANtB;AAOC,IAAA,qBAAqB,MAPtB;AAAA,OAQMC,KARN;AASC,IAAA,WAAW,EAAG;AAAE,0BAAoBa;AAAtB,KATf;AAUC,IAAA,eAAe,EAAKE,kBAAF,IAA0B;AAC3C,UAAKA,kBAAkB,EAAEhB,QAAzB,EAAoC;AACnCI,QAAAA,gBAAgB,CAAEY,kBAAF,CAAhB;AACA;AACD;AAdF,IADD,EAiBC,cAAC,kBAAD;AAAoB,IAAA,EAAE,EAAGF;AAAzB,KACGC,WADH,CAjBD,CADD;AAuBA,CA/EgC,CAA3B","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useInstanceId } from '@wordpress/compose';\nimport { speak } from '@wordpress/a11y';\nimport { useSelect } from '@wordpress/data';\nimport { forwardRef, useEffect } from '@wordpress/element';\nimport { __, sprintf } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport useBlockDisplayTitle from '../block-title/use-block-display-title';\nimport { useListViewContext } from './context';\nimport Inserter from '../inserter';\nimport AriaReferencedText from './aria-referenced-text';\n\nexport const Appender = forwardRef(\n\t( { nestingLevel, blockCount, clientId, ...props }, ref ) => {\n\t\tconst { insertedBlock, setInsertedBlock } = useListViewContext();\n\n\t\tconst instanceId = useInstanceId( Appender );\n\t\tconst hideInserter = useSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst { getTemplateLock, __unstableGetEditorMode } =\n\t\t\t\t\tselect( blockEditorStore );\n\n\t\t\t\treturn (\n\t\t\t\t\t!! getTemplateLock( clientId ) ||\n\t\t\t\t\t__unstableGetEditorMode() === 'zoom-out'\n\t\t\t\t);\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\n\t\tconst blockTitle = useBlockDisplayTitle( {\n\t\t\tclientId,\n\t\t\tcontext: 'list-view',\n\t\t} );\n\n\t\tconst insertedBlockTitle = useBlockDisplayTitle( {\n\t\t\tclientId: insertedBlock?.clientId,\n\t\t\tcontext: 'list-view',\n\t\t} );\n\n\t\tuseEffect( () => {\n\t\t\tif ( ! insertedBlockTitle?.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tspeak(\n\t\t\t\tsprintf(\n\t\t\t\t\t// translators: %s: name of block being inserted (i.e. Paragraph, Image, Group etc)\n\t\t\t\t\t__( '%s block inserted' ),\n\t\t\t\t\tinsertedBlockTitle\n\t\t\t\t),\n\t\t\t\t'assertive'\n\t\t\t);\n\t\t}, [ insertedBlockTitle ] );\n\n\t\tif ( hideInserter ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst descriptionId = `list-view-appender__${ instanceId }`;\n\t\tconst description = sprintf(\n\t\t\t/* translators: 1: The name of the block. 2: The numerical position of the block. 3: The level of nesting for the block. */\n\t\t\t__( 'Append to %1$s block at position %2$d, Level %3$d' ),\n\t\t\tblockTitle,\n\t\t\tblockCount + 1,\n\t\t\tnestingLevel\n\t\t);\n\n\t\treturn (\n\t\t\t<div className=\"list-view-appender\">\n\t\t\t\t<Inserter\n\t\t\t\t\tref={ ref }\n\t\t\t\t\trootClientId={ clientId }\n\t\t\t\t\tposition=\"bottom right\"\n\t\t\t\t\tisAppender\n\t\t\t\t\tselectBlockOnInsert={ false }\n\t\t\t\t\tshouldDirectInsert={ false }\n\t\t\t\t\t__experimentalIsQuick\n\t\t\t\t\t{ ...props }\n\t\t\t\t\ttoggleProps={ { 'aria-describedby': descriptionId } }\n\t\t\t\t\tonSelectOrClose={ ( maybeInsertedBlock ) => {\n\t\t\t\t\t\tif ( maybeInsertedBlock?.clientId ) {\n\t\t\t\t\t\t\tsetInsertedBlock( maybeInsertedBlock );\n\t\t\t\t\t\t}\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t\t<AriaReferencedText id={ descriptionId }>\n\t\t\t\t\t{ description }\n\t\t\t\t</AriaReferencedText>\n\t\t\t</div>\n\t\t);\n\t}\n);\n"]}
@@ -28,8 +28,11 @@ export const ExperimentalBlockEditorProvider = withRegistryProvider(props => {
28
28
  useEffect(() => {
29
29
  __experimentalUpdateSettings({ ...settings,
30
30
  __internalIsInitialized: true
31
- }, stripExperimentalSettings);
32
- }, [settings]); // Syncs the entity provider with changes in the block-editor store.
31
+ }, {
32
+ stripExperimentalSettings,
33
+ reset: true
34
+ });
35
+ }, [settings, stripExperimentalSettings, __experimentalUpdateSettings]); // Syncs the entity provider with changes in the block-editor store.
33
36
 
34
37
  useBlockSync(props);
35
38
  return createElement(BlockRefsProvider, null, children);
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/provider/index.js"],"names":["useDispatch","useEffect","withRegistryProvider","useBlockSync","store","blockEditorStore","BlockRefsProvider","unlock","ExperimentalBlockEditorProvider","props","children","settings","stripExperimentalSettings","__experimentalUpdateSettings","__internalIsInitialized","BlockEditorProvider"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,WAAT,QAA4B,iBAA5B;AACA,SAASC,SAAT,QAA0B,oBAA1B;AAEA;AACA;AACA;;AACA,OAAOC,oBAAP,MAAiC,0BAAjC;AACA,OAAOC,YAAP,MAAyB,kBAAzB;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AACA,SAASC,iBAAT,QAAkC,uBAAlC;AACA,SAASC,MAAT,QAAuB,mBAAvB;AAEA;;AAEA,OAAO,MAAMC,+BAA+B,GAAGN,oBAAoB,CAChEO,KAAF,IAAa;AACZ,QAAM;AAAEC,IAAAA,QAAF;AAAYC,IAAAA,QAAZ;AAAsBC,IAAAA,yBAAyB,GAAG;AAAlD,MAA4DH,KAAlE;AAEA,QAAM;AAAEI,IAAAA;AAAF,MAAmCN,MAAM,CAC9CP,WAAW,CAAEK,gBAAF,CADmC,CAA/C;AAGAJ,EAAAA,SAAS,CAAE,MAAM;AAChBY,IAAAA,4BAA4B,CAC3B,EACC,GAAGF,QADJ;AAECG,MAAAA,uBAAuB,EAAE;AAF1B,KAD2B,EAK3BF,yBAL2B,CAA5B;AAOA,GARQ,EAQN,CAAED,QAAF,CARM,CAAT,CANY,CAgBZ;;AACAR,EAAAA,YAAY,CAAEM,KAAF,CAAZ;AAEA,SAAO,cAAC,iBAAD,QAAqBC,QAArB,CAAP;AACA,CArBiE,CAA5D;AAwBP,OAAO,MAAMK,mBAAmB,GAAKN,KAAF,IAAa;AAC/C,SACC,cAAC,+BAAD,OACMA,KADN;AAEC,IAAA,yBAAyB,EAAG;AAF7B,KAIGA,KAAK,CAACC,QAJT,CADD;AAQA,CATM;AAWP,eAAeK,mBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useDispatch } from '@wordpress/data';\nimport { useEffect } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport withRegistryProvider from './with-registry-provider';\nimport useBlockSync from './use-block-sync';\nimport { store as blockEditorStore } from '../../store';\nimport { BlockRefsProvider } from './block-refs-provider';\nimport { unlock } from '../../lock-unlock';\n\n/** @typedef {import('@wordpress/data').WPDataRegistry} WPDataRegistry */\n\nexport const ExperimentalBlockEditorProvider = withRegistryProvider(\n\t( props ) => {\n\t\tconst { children, settings, stripExperimentalSettings = false } = props;\n\n\t\tconst { __experimentalUpdateSettings } = unlock(\n\t\t\tuseDispatch( blockEditorStore )\n\t\t);\n\t\tuseEffect( () => {\n\t\t\t__experimentalUpdateSettings(\n\t\t\t\t{\n\t\t\t\t\t...settings,\n\t\t\t\t\t__internalIsInitialized: true,\n\t\t\t\t},\n\t\t\t\tstripExperimentalSettings\n\t\t\t);\n\t\t}, [ settings ] );\n\n\t\t// Syncs the entity provider with changes in the block-editor store.\n\t\tuseBlockSync( props );\n\n\t\treturn <BlockRefsProvider>{ children }</BlockRefsProvider>;\n\t}\n);\n\nexport const BlockEditorProvider = ( props ) => {\n\treturn (\n\t\t<ExperimentalBlockEditorProvider\n\t\t\t{ ...props }\n\t\t\tstripExperimentalSettings={ true }\n\t\t>\n\t\t\t{ props.children }\n\t\t</ExperimentalBlockEditorProvider>\n\t);\n};\n\nexport default BlockEditorProvider;\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/provider/index.js"],"names":["useDispatch","useEffect","withRegistryProvider","useBlockSync","store","blockEditorStore","BlockRefsProvider","unlock","ExperimentalBlockEditorProvider","props","children","settings","stripExperimentalSettings","__experimentalUpdateSettings","__internalIsInitialized","reset","BlockEditorProvider"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,WAAT,QAA4B,iBAA5B;AACA,SAASC,SAAT,QAA0B,oBAA1B;AAEA;AACA;AACA;;AACA,OAAOC,oBAAP,MAAiC,0BAAjC;AACA,OAAOC,YAAP,MAAyB,kBAAzB;AACA,SAASC,KAAK,IAAIC,gBAAlB,QAA0C,aAA1C;AACA,SAASC,iBAAT,QAAkC,uBAAlC;AACA,SAASC,MAAT,QAAuB,mBAAvB;AAEA;;AAEA,OAAO,MAAMC,+BAA+B,GAAGN,oBAAoB,CAChEO,KAAF,IAAa;AACZ,QAAM;AAAEC,IAAAA,QAAF;AAAYC,IAAAA,QAAZ;AAAsBC,IAAAA,yBAAyB,GAAG;AAAlD,MAA4DH,KAAlE;AAEA,QAAM;AAAEI,IAAAA;AAAF,MAAmCN,MAAM,CAC9CP,WAAW,CAAEK,gBAAF,CADmC,CAA/C;AAGAJ,EAAAA,SAAS,CAAE,MAAM;AAChBY,IAAAA,4BAA4B,CAC3B,EACC,GAAGF,QADJ;AAECG,MAAAA,uBAAuB,EAAE;AAF1B,KAD2B,EAK3B;AACCF,MAAAA,yBADD;AAECG,MAAAA,KAAK,EAAE;AAFR,KAL2B,CAA5B;AAUA,GAXQ,EAWN,CACFJ,QADE,EAEFC,yBAFE,EAGFC,4BAHE,CAXM,CAAT,CANY,CAuBZ;;AACAV,EAAAA,YAAY,CAAEM,KAAF,CAAZ;AAEA,SAAO,cAAC,iBAAD,QAAqBC,QAArB,CAAP;AACA,CA5BiE,CAA5D;AA+BP,OAAO,MAAMM,mBAAmB,GAAKP,KAAF,IAAa;AAC/C,SACC,cAAC,+BAAD,OACMA,KADN;AAEC,IAAA,yBAAyB,EAAG;AAF7B,KAIGA,KAAK,CAACC,QAJT,CADD;AAQA,CATM;AAWP,eAAeM,mBAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useDispatch } from '@wordpress/data';\nimport { useEffect } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport withRegistryProvider from './with-registry-provider';\nimport useBlockSync from './use-block-sync';\nimport { store as blockEditorStore } from '../../store';\nimport { BlockRefsProvider } from './block-refs-provider';\nimport { unlock } from '../../lock-unlock';\n\n/** @typedef {import('@wordpress/data').WPDataRegistry} WPDataRegistry */\n\nexport const ExperimentalBlockEditorProvider = withRegistryProvider(\n\t( props ) => {\n\t\tconst { children, settings, stripExperimentalSettings = false } = props;\n\n\t\tconst { __experimentalUpdateSettings } = unlock(\n\t\t\tuseDispatch( blockEditorStore )\n\t\t);\n\t\tuseEffect( () => {\n\t\t\t__experimentalUpdateSettings(\n\t\t\t\t{\n\t\t\t\t\t...settings,\n\t\t\t\t\t__internalIsInitialized: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tstripExperimentalSettings,\n\t\t\t\t\treset: true,\n\t\t\t\t}\n\t\t\t);\n\t\t}, [\n\t\t\tsettings,\n\t\t\tstripExperimentalSettings,\n\t\t\t__experimentalUpdateSettings,\n\t\t] );\n\n\t\t// Syncs the entity provider with changes in the block-editor store.\n\t\tuseBlockSync( props );\n\n\t\treturn <BlockRefsProvider>{ children }</BlockRefsProvider>;\n\t}\n);\n\nexport const BlockEditorProvider = ( props ) => {\n\treturn (\n\t\t<ExperimentalBlockEditorProvider\n\t\t\t{ ...props }\n\t\t\tstripExperimentalSettings={ true }\n\t\t>\n\t\t\t{ props.children }\n\t\t</ExperimentalBlockEditorProvider>\n\t);\n};\n\nexport default BlockEditorProvider;\n"]}
@@ -131,6 +131,22 @@ export default function useBlockSync({
131
131
 
132
132
  resetBlocks(controlledBlocks);
133
133
  }
134
+ }; // Clean up the changes made by setControlledBlocks() when the component
135
+ // containing useBlockSync() unmounts.
136
+
137
+
138
+ const unsetControlledBlocks = () => {
139
+ __unstableMarkNextChangeAsNotPersistent();
140
+
141
+ if (clientId) {
142
+ setHasControlledInnerBlocks(clientId, false);
143
+
144
+ __unstableMarkNextChangeAsNotPersistent();
145
+
146
+ replaceInnerBlocks(clientId, []);
147
+ } else {
148
+ resetBlocks([]);
149
+ }
134
150
  }; // Add a subscription to the block-editor registry to detect when changes
135
151
  // have been made. This lets us inform the data source of changes. This
136
152
  // is an effect so that the subscriber can run synchronously without
@@ -259,5 +275,10 @@ export default function useBlockSync({
259
275
  unsubscribe();
260
276
  };
261
277
  }, [registry, clientId]);
278
+ useEffect(() => {
279
+ return () => {
280
+ unsetControlledBlocks();
281
+ };
282
+ }, []);
262
283
  }
263
284
  //# sourceMappingURL=use-block-sync.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/provider/use-block-sync.js"],"names":["useEffect","useRef","useRegistry","useSelect","cloneBlock","store","blockEditorStore","noop","useBlockSync","clientId","value","controlledBlocks","selection","controlledSelection","onChange","onInput","registry","resetBlocks","resetSelection","replaceInnerBlocks","selectBlock","setHasControlledInnerBlocks","__unstableMarkNextChangeAsNotPersistent","dispatch","hasSelectedBlock","getBlockName","getBlocks","getSelectionStart","getSelectionEnd","getBlock","select","isControlled","areInnerBlocksControlled","pendingChanges","incoming","outgoing","subscribed","setControlledBlocks","batch","storeBlocks","map","block","current","onInputRef","onChangeRef","includes","length","hadSelecton","selectionAnchor","selectionFocus","selectionStart","selectionEnd","initialPosition","selectionStillExists","getSelectedBlocksInitialCaretPosition","isLastBlockChangePersistent","__unstableIsLastBlockChangeIgnored","blocks","isPersistent","previousAreBlocksDifferent","unsubscribe","subscribe","isStillControlled","newIsPersistent","newBlocks","areBlocksDifferent","didPersistenceChange","push","updateParent"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useEffect, useRef } from '@wordpress/element';\nimport { useRegistry, useSelect } from '@wordpress/data';\nimport { cloneBlock } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\nconst noop = () => {};\n\n/**\n * A function to call when the block value has been updated in the block-editor\n * store.\n *\n * @callback onBlockUpdate\n * @param {Object[]} blocks The updated blocks.\n * @param {Object} options The updated block options, such as selectionStart\n * and selectionEnd.\n */\n\n/**\n * useBlockSync is a side effect which handles bidirectional sync between the\n * block-editor store and a controlling data source which provides blocks. This\n * is most commonly used by the BlockEditorProvider to synchronize the contents\n * of the block-editor store with the root entity, like a post.\n *\n * Another example would be the template part block, which provides blocks from\n * a separate entity data source than a root entity. This hook syncs edits to\n * the template part in the block editor back to the entity and vice-versa.\n *\n * Here are some of its basic functions:\n * - Initalizes the block-editor store for the given clientID to the blocks\n * given via props.\n * - Adds incoming changes (like undo) to the block-editor store.\n * - Adds outgoing changes (like editing content) to the controlling entity,\n * determining if a change should be considered persistent or not.\n * - Handles edge cases and race conditions which occur in those operations.\n * - Ignores changes which happen to other entities (like nested inner block\n * controllers.\n * - Passes selection state from the block-editor store to the controlling entity.\n *\n * @param {Object} props Props for the block sync hook\n * @param {string} props.clientId The client ID of the inner block controller.\n * If none is passed, then it is assumed to be a\n * root controller rather than an inner block\n * controller.\n * @param {Object[]} props.value The control value for the blocks. This value\n * is used to initalize the block-editor store\n * and for resetting the blocks to incoming\n * changes like undo.\n * @param {Object} props.selection The selection state responsible to restore the selection on undo/redo.\n * @param {onBlockUpdate} props.onChange Function to call when a persistent\n * change has been made in the block-editor blocks\n * for the given clientId. For example, after\n * this function is called, an entity is marked\n * dirty because it has changes to save.\n * @param {onBlockUpdate} props.onInput Function to call when a non-persistent\n * change has been made in the block-editor blocks\n * for the given clientId. When this is called,\n * controlling sources do not become dirty.\n */\nexport default function useBlockSync( {\n\tclientId = null,\n\tvalue: controlledBlocks,\n\tselection: controlledSelection,\n\tonChange = noop,\n\tonInput = noop,\n} ) {\n\tconst registry = useRegistry();\n\n\tconst {\n\t\tresetBlocks,\n\t\tresetSelection,\n\t\treplaceInnerBlocks,\n\t\tselectBlock,\n\t\tsetHasControlledInnerBlocks,\n\t\t__unstableMarkNextChangeAsNotPersistent,\n\t} = registry.dispatch( blockEditorStore );\n\tconst {\n\t\thasSelectedBlock,\n\t\tgetBlockName,\n\t\tgetBlocks,\n\t\tgetSelectionStart,\n\t\tgetSelectionEnd,\n\t\tgetBlock,\n\t} = registry.select( blockEditorStore );\n\tconst isControlled = useSelect(\n\t\t( select ) => {\n\t\t\treturn (\n\t\t\t\t! clientId ||\n\t\t\t\tselect( blockEditorStore ).areInnerBlocksControlled( clientId )\n\t\t\t);\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst pendingChanges = useRef( { incoming: null, outgoing: [] } );\n\tconst subscribed = useRef( false );\n\n\tconst setControlledBlocks = () => {\n\t\tif ( ! controlledBlocks ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We don't need to persist this change because we only replace\n\t\t// controlled inner blocks when the change was caused by an entity,\n\t\t// and so it would already be persisted.\n\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\tif ( clientId ) {\n\t\t\t// It is important to batch here because otherwise,\n\t\t\t// as soon as `setHasControlledInnerBlocks` is called\n\t\t\t// the effect to restore might be triggered\n\t\t\t// before the actual blocks get set properly in state.\n\t\t\tregistry.batch( () => {\n\t\t\t\tsetHasControlledInnerBlocks( clientId, true );\n\t\t\t\tconst storeBlocks = controlledBlocks.map( ( block ) =>\n\t\t\t\t\tcloneBlock( block )\n\t\t\t\t);\n\t\t\t\tif ( subscribed.current ) {\n\t\t\t\t\tpendingChanges.current.incoming = storeBlocks;\n\t\t\t\t}\n\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\treplaceInnerBlocks( clientId, storeBlocks );\n\t\t\t} );\n\t\t} else {\n\t\t\tif ( subscribed.current ) {\n\t\t\t\tpendingChanges.current.incoming = controlledBlocks;\n\t\t\t}\n\t\t\tresetBlocks( controlledBlocks );\n\t\t}\n\t};\n\n\t// Add a subscription to the block-editor registry to detect when changes\n\t// have been made. This lets us inform the data source of changes. This\n\t// is an effect so that the subscriber can run synchronously without\n\t// waiting for React renders for changes.\n\tconst onInputRef = useRef( onInput );\n\tconst onChangeRef = useRef( onChange );\n\tuseEffect( () => {\n\t\tonInputRef.current = onInput;\n\t\tonChangeRef.current = onChange;\n\t}, [ onInput, onChange ] );\n\n\t// Determine if blocks need to be reset when they change.\n\tuseEffect( () => {\n\t\tif ( pendingChanges.current.outgoing.includes( controlledBlocks ) ) {\n\t\t\t// Skip block reset if the value matches expected outbound sync\n\t\t\t// triggered by this component by a preceding change detection.\n\t\t\t// Only skip if the value matches expectation, since a reset should\n\t\t\t// still occur if the value is modified (not equal by reference),\n\t\t\t// to allow that the consumer may apply modifications to reflect\n\t\t\t// back on the editor.\n\t\t\tif (\n\t\t\t\tpendingChanges.current.outgoing[\n\t\t\t\t\tpendingChanges.current.outgoing.length - 1\n\t\t\t\t] === controlledBlocks\n\t\t\t) {\n\t\t\t\tpendingChanges.current.outgoing = [];\n\t\t\t}\n\t\t} else if ( getBlocks( clientId ) !== controlledBlocks ) {\n\t\t\t// Reset changing value in all other cases than the sync described\n\t\t\t// above. Since this can be reached in an update following an out-\n\t\t\t// bound sync, unset the outbound value to avoid considering it in\n\t\t\t// subsequent renders.\n\t\t\tpendingChanges.current.outgoing = [];\n\t\t\tconst hadSelecton = hasSelectedBlock();\n\t\t\tconst selectionAnchor = getSelectionStart();\n\t\t\tconst selectionFocus = getSelectionEnd();\n\t\t\tsetControlledBlocks();\n\n\t\t\tif ( controlledSelection ) {\n\t\t\t\tresetSelection(\n\t\t\t\t\tcontrolledSelection.selectionStart,\n\t\t\t\t\tcontrolledSelection.selectionEnd,\n\t\t\t\t\tcontrolledSelection.initialPosition\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst selectionStillExists = getBlock(\n\t\t\t\t\tselectionAnchor.clientId\n\t\t\t\t);\n\t\t\t\tif ( hadSelecton && ! selectionStillExists ) {\n\t\t\t\t\tselectBlock( clientId );\n\t\t\t\t} else {\n\t\t\t\t\tresetSelection( selectionAnchor, selectionFocus );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [ controlledBlocks, clientId ] );\n\n\tuseEffect( () => {\n\t\t// When the block becomes uncontrolled, it means its inner state has been reset\n\t\t// we need to take the blocks again from the external value property.\n\t\tif ( ! isControlled ) {\n\t\t\tpendingChanges.current.outgoing = [];\n\t\t\tsetControlledBlocks();\n\t\t}\n\t}, [ isControlled ] );\n\n\tuseEffect( () => {\n\t\tconst {\n\t\t\tgetSelectedBlocksInitialCaretPosition,\n\t\t\tisLastBlockChangePersistent,\n\t\t\t__unstableIsLastBlockChangeIgnored,\n\t\t\tareInnerBlocksControlled,\n\t\t} = registry.select( blockEditorStore );\n\n\t\tlet blocks = getBlocks( clientId );\n\t\tlet isPersistent = isLastBlockChangePersistent();\n\t\tlet previousAreBlocksDifferent = false;\n\n\t\tsubscribed.current = true;\n\t\tconst unsubscribe = registry.subscribe( () => {\n\t\t\t// Sometimes, when changing block lists, lingering subscriptions\n\t\t\t// might trigger before they are cleaned up. If the block for which\n\t\t\t// the subscription runs is no longer in the store, this would clear\n\t\t\t// its parent entity's block list. To avoid this, we bail out if\n\t\t\t// the subscription is triggering for a block (`clientId !== null`)\n\t\t\t// and its block name can't be found because it's not on the list.\n\t\t\t// (`getBlockName( clientId ) === null`).\n\t\t\tif ( clientId !== null && getBlockName( clientId ) === null )\n\t\t\t\treturn;\n\n\t\t\t// When RESET_BLOCKS on parent blocks get called, the controlled blocks\n\t\t\t// can reset to uncontrolled, in these situations, it means we need to populate\n\t\t\t// the blocks again from the external blocks (the value property here)\n\t\t\t// and we should stop triggering onChange\n\t\t\tconst isStillControlled =\n\t\t\t\t! clientId || areInnerBlocksControlled( clientId );\n\t\t\tif ( ! isStillControlled ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newIsPersistent = isLastBlockChangePersistent();\n\t\t\tconst newBlocks = getBlocks( clientId );\n\t\t\tconst areBlocksDifferent = newBlocks !== blocks;\n\t\t\tblocks = newBlocks;\n\t\t\tif (\n\t\t\t\tareBlocksDifferent &&\n\t\t\t\t( pendingChanges.current.incoming ||\n\t\t\t\t\t__unstableIsLastBlockChangeIgnored() )\n\t\t\t) {\n\t\t\t\tpendingChanges.current.incoming = null;\n\t\t\t\tisPersistent = newIsPersistent;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Since we often dispatch an action to mark the previous action as\n\t\t\t// persistent, we need to make sure that the blocks changed on the\n\t\t\t// previous action before committing the change.\n\t\t\tconst didPersistenceChange =\n\t\t\t\tpreviousAreBlocksDifferent &&\n\t\t\t\t! areBlocksDifferent &&\n\t\t\t\tnewIsPersistent &&\n\t\t\t\t! isPersistent;\n\n\t\t\tif ( areBlocksDifferent || didPersistenceChange ) {\n\t\t\t\tisPersistent = newIsPersistent;\n\t\t\t\t// We know that onChange/onInput will update controlledBlocks.\n\t\t\t\t// We need to be aware that it was caused by an outgoing change\n\t\t\t\t// so that we do not treat it as an incoming change later on,\n\t\t\t\t// which would cause a block reset.\n\t\t\t\tpendingChanges.current.outgoing.push( blocks );\n\n\t\t\t\t// Inform the controlling entity that changes have been made to\n\t\t\t\t// the block-editor store they should be aware about.\n\t\t\t\tconst updateParent = isPersistent\n\t\t\t\t\t? onChangeRef.current\n\t\t\t\t\t: onInputRef.current;\n\t\t\t\tupdateParent( blocks, {\n\t\t\t\t\tselection: {\n\t\t\t\t\t\tselectionStart: getSelectionStart(),\n\t\t\t\t\t\tselectionEnd: getSelectionEnd(),\n\t\t\t\t\t\tinitialPosition:\n\t\t\t\t\t\t\tgetSelectedBlocksInitialCaretPosition(),\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t\tpreviousAreBlocksDifferent = areBlocksDifferent;\n\t\t} );\n\n\t\treturn () => {\n\t\t\tsubscribed.current = false;\n\t\t\tunsubscribe();\n\t\t};\n\t}, [ registry, clientId ] );\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/provider/use-block-sync.js"],"names":["useEffect","useRef","useRegistry","useSelect","cloneBlock","store","blockEditorStore","noop","useBlockSync","clientId","value","controlledBlocks","selection","controlledSelection","onChange","onInput","registry","resetBlocks","resetSelection","replaceInnerBlocks","selectBlock","setHasControlledInnerBlocks","__unstableMarkNextChangeAsNotPersistent","dispatch","hasSelectedBlock","getBlockName","getBlocks","getSelectionStart","getSelectionEnd","getBlock","select","isControlled","areInnerBlocksControlled","pendingChanges","incoming","outgoing","subscribed","setControlledBlocks","batch","storeBlocks","map","block","current","unsetControlledBlocks","onInputRef","onChangeRef","includes","length","hadSelecton","selectionAnchor","selectionFocus","selectionStart","selectionEnd","initialPosition","selectionStillExists","getSelectedBlocksInitialCaretPosition","isLastBlockChangePersistent","__unstableIsLastBlockChangeIgnored","blocks","isPersistent","previousAreBlocksDifferent","unsubscribe","subscribe","isStillControlled","newIsPersistent","newBlocks","areBlocksDifferent","didPersistenceChange","push","updateParent"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useEffect, useRef } from '@wordpress/element';\nimport { useRegistry, useSelect } from '@wordpress/data';\nimport { cloneBlock } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\nconst noop = () => {};\n\n/**\n * A function to call when the block value has been updated in the block-editor\n * store.\n *\n * @callback onBlockUpdate\n * @param {Object[]} blocks The updated blocks.\n * @param {Object} options The updated block options, such as selectionStart\n * and selectionEnd.\n */\n\n/**\n * useBlockSync is a side effect which handles bidirectional sync between the\n * block-editor store and a controlling data source which provides blocks. This\n * is most commonly used by the BlockEditorProvider to synchronize the contents\n * of the block-editor store with the root entity, like a post.\n *\n * Another example would be the template part block, which provides blocks from\n * a separate entity data source than a root entity. This hook syncs edits to\n * the template part in the block editor back to the entity and vice-versa.\n *\n * Here are some of its basic functions:\n * - Initalizes the block-editor store for the given clientID to the blocks\n * given via props.\n * - Adds incoming changes (like undo) to the block-editor store.\n * - Adds outgoing changes (like editing content) to the controlling entity,\n * determining if a change should be considered persistent or not.\n * - Handles edge cases and race conditions which occur in those operations.\n * - Ignores changes which happen to other entities (like nested inner block\n * controllers.\n * - Passes selection state from the block-editor store to the controlling entity.\n *\n * @param {Object} props Props for the block sync hook\n * @param {string} props.clientId The client ID of the inner block controller.\n * If none is passed, then it is assumed to be a\n * root controller rather than an inner block\n * controller.\n * @param {Object[]} props.value The control value for the blocks. This value\n * is used to initalize the block-editor store\n * and for resetting the blocks to incoming\n * changes like undo.\n * @param {Object} props.selection The selection state responsible to restore the selection on undo/redo.\n * @param {onBlockUpdate} props.onChange Function to call when a persistent\n * change has been made in the block-editor blocks\n * for the given clientId. For example, after\n * this function is called, an entity is marked\n * dirty because it has changes to save.\n * @param {onBlockUpdate} props.onInput Function to call when a non-persistent\n * change has been made in the block-editor blocks\n * for the given clientId. When this is called,\n * controlling sources do not become dirty.\n */\nexport default function useBlockSync( {\n\tclientId = null,\n\tvalue: controlledBlocks,\n\tselection: controlledSelection,\n\tonChange = noop,\n\tonInput = noop,\n} ) {\n\tconst registry = useRegistry();\n\n\tconst {\n\t\tresetBlocks,\n\t\tresetSelection,\n\t\treplaceInnerBlocks,\n\t\tselectBlock,\n\t\tsetHasControlledInnerBlocks,\n\t\t__unstableMarkNextChangeAsNotPersistent,\n\t} = registry.dispatch( blockEditorStore );\n\tconst {\n\t\thasSelectedBlock,\n\t\tgetBlockName,\n\t\tgetBlocks,\n\t\tgetSelectionStart,\n\t\tgetSelectionEnd,\n\t\tgetBlock,\n\t} = registry.select( blockEditorStore );\n\tconst isControlled = useSelect(\n\t\t( select ) => {\n\t\t\treturn (\n\t\t\t\t! clientId ||\n\t\t\t\tselect( blockEditorStore ).areInnerBlocksControlled( clientId )\n\t\t\t);\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst pendingChanges = useRef( { incoming: null, outgoing: [] } );\n\tconst subscribed = useRef( false );\n\n\tconst setControlledBlocks = () => {\n\t\tif ( ! controlledBlocks ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We don't need to persist this change because we only replace\n\t\t// controlled inner blocks when the change was caused by an entity,\n\t\t// and so it would already be persisted.\n\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\tif ( clientId ) {\n\t\t\t// It is important to batch here because otherwise,\n\t\t\t// as soon as `setHasControlledInnerBlocks` is called\n\t\t\t// the effect to restore might be triggered\n\t\t\t// before the actual blocks get set properly in state.\n\t\t\tregistry.batch( () => {\n\t\t\t\tsetHasControlledInnerBlocks( clientId, true );\n\t\t\t\tconst storeBlocks = controlledBlocks.map( ( block ) =>\n\t\t\t\t\tcloneBlock( block )\n\t\t\t\t);\n\t\t\t\tif ( subscribed.current ) {\n\t\t\t\t\tpendingChanges.current.incoming = storeBlocks;\n\t\t\t\t}\n\t\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\t\treplaceInnerBlocks( clientId, storeBlocks );\n\t\t\t} );\n\t\t} else {\n\t\t\tif ( subscribed.current ) {\n\t\t\t\tpendingChanges.current.incoming = controlledBlocks;\n\t\t\t}\n\t\t\tresetBlocks( controlledBlocks );\n\t\t}\n\t};\n\n\t// Clean up the changes made by setControlledBlocks() when the component\n\t// containing useBlockSync() unmounts.\n\tconst unsetControlledBlocks = () => {\n\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\tif ( clientId ) {\n\t\t\tsetHasControlledInnerBlocks( clientId, false );\n\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\treplaceInnerBlocks( clientId, [] );\n\t\t} else {\n\t\t\tresetBlocks( [] );\n\t\t}\n\t};\n\n\t// Add a subscription to the block-editor registry to detect when changes\n\t// have been made. This lets us inform the data source of changes. This\n\t// is an effect so that the subscriber can run synchronously without\n\t// waiting for React renders for changes.\n\tconst onInputRef = useRef( onInput );\n\tconst onChangeRef = useRef( onChange );\n\tuseEffect( () => {\n\t\tonInputRef.current = onInput;\n\t\tonChangeRef.current = onChange;\n\t}, [ onInput, onChange ] );\n\n\t// Determine if blocks need to be reset when they change.\n\tuseEffect( () => {\n\t\tif ( pendingChanges.current.outgoing.includes( controlledBlocks ) ) {\n\t\t\t// Skip block reset if the value matches expected outbound sync\n\t\t\t// triggered by this component by a preceding change detection.\n\t\t\t// Only skip if the value matches expectation, since a reset should\n\t\t\t// still occur if the value is modified (not equal by reference),\n\t\t\t// to allow that the consumer may apply modifications to reflect\n\t\t\t// back on the editor.\n\t\t\tif (\n\t\t\t\tpendingChanges.current.outgoing[\n\t\t\t\t\tpendingChanges.current.outgoing.length - 1\n\t\t\t\t] === controlledBlocks\n\t\t\t) {\n\t\t\t\tpendingChanges.current.outgoing = [];\n\t\t\t}\n\t\t} else if ( getBlocks( clientId ) !== controlledBlocks ) {\n\t\t\t// Reset changing value in all other cases than the sync described\n\t\t\t// above. Since this can be reached in an update following an out-\n\t\t\t// bound sync, unset the outbound value to avoid considering it in\n\t\t\t// subsequent renders.\n\t\t\tpendingChanges.current.outgoing = [];\n\t\t\tconst hadSelecton = hasSelectedBlock();\n\t\t\tconst selectionAnchor = getSelectionStart();\n\t\t\tconst selectionFocus = getSelectionEnd();\n\t\t\tsetControlledBlocks();\n\n\t\t\tif ( controlledSelection ) {\n\t\t\t\tresetSelection(\n\t\t\t\t\tcontrolledSelection.selectionStart,\n\t\t\t\t\tcontrolledSelection.selectionEnd,\n\t\t\t\t\tcontrolledSelection.initialPosition\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst selectionStillExists = getBlock(\n\t\t\t\t\tselectionAnchor.clientId\n\t\t\t\t);\n\t\t\t\tif ( hadSelecton && ! selectionStillExists ) {\n\t\t\t\t\tselectBlock( clientId );\n\t\t\t\t} else {\n\t\t\t\t\tresetSelection( selectionAnchor, selectionFocus );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [ controlledBlocks, clientId ] );\n\n\tuseEffect( () => {\n\t\t// When the block becomes uncontrolled, it means its inner state has been reset\n\t\t// we need to take the blocks again from the external value property.\n\t\tif ( ! isControlled ) {\n\t\t\tpendingChanges.current.outgoing = [];\n\t\t\tsetControlledBlocks();\n\t\t}\n\t}, [ isControlled ] );\n\n\tuseEffect( () => {\n\t\tconst {\n\t\t\tgetSelectedBlocksInitialCaretPosition,\n\t\t\tisLastBlockChangePersistent,\n\t\t\t__unstableIsLastBlockChangeIgnored,\n\t\t\tareInnerBlocksControlled,\n\t\t} = registry.select( blockEditorStore );\n\n\t\tlet blocks = getBlocks( clientId );\n\t\tlet isPersistent = isLastBlockChangePersistent();\n\t\tlet previousAreBlocksDifferent = false;\n\n\t\tsubscribed.current = true;\n\t\tconst unsubscribe = registry.subscribe( () => {\n\t\t\t// Sometimes, when changing block lists, lingering subscriptions\n\t\t\t// might trigger before they are cleaned up. If the block for which\n\t\t\t// the subscription runs is no longer in the store, this would clear\n\t\t\t// its parent entity's block list. To avoid this, we bail out if\n\t\t\t// the subscription is triggering for a block (`clientId !== null`)\n\t\t\t// and its block name can't be found because it's not on the list.\n\t\t\t// (`getBlockName( clientId ) === null`).\n\t\t\tif ( clientId !== null && getBlockName( clientId ) === null )\n\t\t\t\treturn;\n\n\t\t\t// When RESET_BLOCKS on parent blocks get called, the controlled blocks\n\t\t\t// can reset to uncontrolled, in these situations, it means we need to populate\n\t\t\t// the blocks again from the external blocks (the value property here)\n\t\t\t// and we should stop triggering onChange\n\t\t\tconst isStillControlled =\n\t\t\t\t! clientId || areInnerBlocksControlled( clientId );\n\t\t\tif ( ! isStillControlled ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newIsPersistent = isLastBlockChangePersistent();\n\t\t\tconst newBlocks = getBlocks( clientId );\n\t\t\tconst areBlocksDifferent = newBlocks !== blocks;\n\t\t\tblocks = newBlocks;\n\t\t\tif (\n\t\t\t\tareBlocksDifferent &&\n\t\t\t\t( pendingChanges.current.incoming ||\n\t\t\t\t\t__unstableIsLastBlockChangeIgnored() )\n\t\t\t) {\n\t\t\t\tpendingChanges.current.incoming = null;\n\t\t\t\tisPersistent = newIsPersistent;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Since we often dispatch an action to mark the previous action as\n\t\t\t// persistent, we need to make sure that the blocks changed on the\n\t\t\t// previous action before committing the change.\n\t\t\tconst didPersistenceChange =\n\t\t\t\tpreviousAreBlocksDifferent &&\n\t\t\t\t! areBlocksDifferent &&\n\t\t\t\tnewIsPersistent &&\n\t\t\t\t! isPersistent;\n\n\t\t\tif ( areBlocksDifferent || didPersistenceChange ) {\n\t\t\t\tisPersistent = newIsPersistent;\n\t\t\t\t// We know that onChange/onInput will update controlledBlocks.\n\t\t\t\t// We need to be aware that it was caused by an outgoing change\n\t\t\t\t// so that we do not treat it as an incoming change later on,\n\t\t\t\t// which would cause a block reset.\n\t\t\t\tpendingChanges.current.outgoing.push( blocks );\n\n\t\t\t\t// Inform the controlling entity that changes have been made to\n\t\t\t\t// the block-editor store they should be aware about.\n\t\t\t\tconst updateParent = isPersistent\n\t\t\t\t\t? onChangeRef.current\n\t\t\t\t\t: onInputRef.current;\n\t\t\t\tupdateParent( blocks, {\n\t\t\t\t\tselection: {\n\t\t\t\t\t\tselectionStart: getSelectionStart(),\n\t\t\t\t\t\tselectionEnd: getSelectionEnd(),\n\t\t\t\t\t\tinitialPosition:\n\t\t\t\t\t\t\tgetSelectedBlocksInitialCaretPosition(),\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t\tpreviousAreBlocksDifferent = areBlocksDifferent;\n\t\t} );\n\n\t\treturn () => {\n\t\t\tsubscribed.current = false;\n\t\t\tunsubscribe();\n\t\t};\n\t}, [ registry, clientId ] );\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\tunsetControlledBlocks();\n\t\t};\n\t}, [] );\n}\n"]}
@@ -0,0 +1,45 @@
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
+ const DEFAULT_SIZE_OPTIONS = [{
9
+ label: _x('Thumbnail', 'Image size option for resolution control'),
10
+ value: 'thumbnail'
11
+ }, {
12
+ label: _x('Medium', 'Image size option for resolution control'),
13
+ value: 'medium'
14
+ }, {
15
+ label: _x('Large', 'Image size option for resolution control'),
16
+ value: 'large'
17
+ }, {
18
+ label: _x('Full Size', 'Image size option for resolution control'),
19
+ value: 'full'
20
+ }];
21
+ export default function ResolutionTool({
22
+ panelId,
23
+ value,
24
+ onChange,
25
+ options = DEFAULT_SIZE_OPTIONS,
26
+ defaultValue = DEFAULT_SIZE_OPTIONS[0].value,
27
+ isShownByDefault = true
28
+ }) {
29
+ const displayValue = value !== null && value !== void 0 ? value : defaultValue;
30
+ return createElement(ToolsPanelItem, {
31
+ hasValue: () => displayValue !== defaultValue,
32
+ label: __('Resolution'),
33
+ onDeselect: () => onChange(defaultValue),
34
+ isShownByDefault: isShownByDefault,
35
+ panelId: panelId
36
+ }, createElement(SelectControl, {
37
+ label: __('Resolution'),
38
+ value: displayValue,
39
+ options: options,
40
+ onChange: onChange,
41
+ help: __('Select the size of the source image.'),
42
+ size: '__unstable-large'
43
+ }));
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/resolution-tool/index.js"],"names":["SelectControl","__experimentalToolsPanelItem","ToolsPanelItem","__","_x","DEFAULT_SIZE_OPTIONS","label","value","ResolutionTool","panelId","onChange","options","defaultValue","isShownByDefault","displayValue"],"mappings":";;AAAA;AACA;AACA;AACA,SACCA,aADD,EAECC,4BAA4B,IAAIC,cAFjC,QAGO,uBAHP;AAIA,SAASC,EAAT,EAAaC,EAAb,QAAuB,iBAAvB;AAEA,MAAMC,oBAAoB,GAAG,CAC5B;AACCC,EAAAA,KAAK,EAAEF,EAAE,CAAE,WAAF,EAAe,0CAAf,CADV;AAECG,EAAAA,KAAK,EAAE;AAFR,CAD4B,EAK5B;AACCD,EAAAA,KAAK,EAAEF,EAAE,CAAE,QAAF,EAAY,0CAAZ,CADV;AAECG,EAAAA,KAAK,EAAE;AAFR,CAL4B,EAS5B;AACCD,EAAAA,KAAK,EAAEF,EAAE,CAAE,OAAF,EAAW,0CAAX,CADV;AAECG,EAAAA,KAAK,EAAE;AAFR,CAT4B,EAa5B;AACCD,EAAAA,KAAK,EAAEF,EAAE,CAAE,WAAF,EAAe,0CAAf,CADV;AAECG,EAAAA,KAAK,EAAE;AAFR,CAb4B,CAA7B;AAmBA,eAAe,SAASC,cAAT,CAAyB;AACvCC,EAAAA,OADuC;AAEvCF,EAAAA,KAFuC;AAGvCG,EAAAA,QAHuC;AAIvCC,EAAAA,OAAO,GAAGN,oBAJ6B;AAKvCO,EAAAA,YAAY,GAAGP,oBAAoB,CAAE,CAAF,CAApB,CAA0BE,KALF;AAMvCM,EAAAA,gBAAgB,GAAG;AANoB,CAAzB,EAOX;AACH,QAAMC,YAAY,GAAGP,KAAH,aAAGA,KAAH,cAAGA,KAAH,GAAYK,YAA9B;AACA,SACC,cAAC,cAAD;AACC,IAAA,QAAQ,EAAG,MAAME,YAAY,KAAKF,YADnC;AAEC,IAAA,KAAK,EAAGT,EAAE,CAAE,YAAF,CAFX;AAGC,IAAA,UAAU,EAAG,MAAMO,QAAQ,CAAEE,YAAF,CAH5B;AAIC,IAAA,gBAAgB,EAAGC,gBAJpB;AAKC,IAAA,OAAO,EAAGJ;AALX,KAOC,cAAC,aAAD;AACC,IAAA,KAAK,EAAGN,EAAE,CAAE,YAAF,CADX;AAEC,IAAA,KAAK,EAAGW,YAFT;AAGC,IAAA,OAAO,EAAGH,OAHX;AAIC,IAAA,QAAQ,EAAGD,QAJZ;AAKC,IAAA,IAAI,EAAGP,EAAE,CAAE,sCAAF,CALV;AAMC,IAAA,IAAI,EAAG;AANR,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\nconst DEFAULT_SIZE_OPTIONS = [\n\t{\n\t\tlabel: _x( 'Thumbnail', 'Image size option for resolution control' ),\n\t\tvalue: 'thumbnail',\n\t},\n\t{\n\t\tlabel: _x( 'Medium', 'Image size option for resolution control' ),\n\t\tvalue: 'medium',\n\t},\n\t{\n\t\tlabel: _x( 'Large', 'Image size option for resolution control' ),\n\t\tvalue: 'large',\n\t},\n\t{\n\t\tlabel: _x( 'Full Size', 'Image size option for resolution control' ),\n\t\tvalue: 'full',\n\t},\n];\n\nexport default function ResolutionTool( {\n\tpanelId,\n\tvalue,\n\tonChange,\n\toptions = DEFAULT_SIZE_OPTIONS,\n\tdefaultValue = DEFAULT_SIZE_OPTIONS[ 0 ].value,\n\tisShownByDefault = true,\n} ) {\n\tconst displayValue = value ?? defaultValue;\n\treturn (\n\t\t<ToolsPanelItem\n\t\t\thasValue={ () => displayValue !== defaultValue }\n\t\t\tlabel={ __( 'Resolution' ) }\n\t\t\tonDeselect={ () => onChange( defaultValue ) }\n\t\t\tisShownByDefault={ isShownByDefault }\n\t\t\tpanelId={ panelId }\n\t\t>\n\t\t\t<SelectControl\n\t\t\t\tlabel={ __( 'Resolution' ) }\n\t\t\t\tvalue={ displayValue }\n\t\t\t\toptions={ options }\n\t\t\t\tonChange={ onChange }\n\t\t\t\thelp={ __( 'Select the size of the source image.' ) }\n\t\t\t\tsize={ '__unstable-large' }\n\t\t\t/>\n\t\t</ToolsPanelItem>\n\t);\n}\n"]}
@@ -380,7 +380,8 @@ class URLInput extends Component {
380
380
  instanceId,
381
381
  placeholder = __('Paste URL or type to search'),
382
382
  __experimentalRenderControl: renderControl,
383
- value = ''
383
+ value = '',
384
+ hideLabelFromVision = false
384
385
  } = this.props;
385
386
  const {
386
387
  loading,
@@ -396,7 +397,8 @@ class URLInput extends Component {
396
397
  label,
397
398
  className: classnames('block-editor-url-input', className, {
398
399
  'is-full-width': isFullWidth
399
- })
400
+ }),
401
+ hideLabelFromVision
400
402
  };
401
403
  const inputProps = {
402
404
  id: inputId,
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/url-input/index.js"],"names":["classnames","scrollIntoView","deprecated","__","sprintf","_n","Component","createRef","UP","DOWN","ENTER","TAB","BaseControl","Button","Spinner","withSpokenMessages","Popover","compose","debounce","withInstanceId","withSafeTimeout","withSelect","isURL","store","blockEditorStore","isFunction","maybeFunc","URLInput","constructor","props","onChange","bind","onFocus","onKeyDown","selectLink","handleOnClick","bindSuggestionNode","autocompleteRef","inputRef","updateSuggestions","suggestionNodes","suggestionsRequest","state","suggestions","showSuggestions","isUpdatingSuggestions","suggestionsValue","selectedSuggestion","suggestionsListboxId","suggestionOptionIdPrefix","componentDidUpdate","prevProps","value","__experimentalShowInitialSuggestions","scrollingIntoView","current","onlyScrollIfNeeded","setTimeout","disableSuggestions","length","componentDidMount","shouldShowInitialSuggestions","componentWillUnmount","cancel","index","ref","__experimentalFetchLinkSuggestions","fetchLinkSuggestions","__experimentalHandleURLSuggestions","handleURLSuggestions","isInitialSuggestions","trim","setState","loading","request","then","debouncedSpeak","catch","event","target","keyCode","selectionStart","preventDefault","setSelectionRange","onSubmit","suggestion","previousIndex","nextIndex","speak","url","focus","getDerivedStateFromProps","instanceId","shouldShowSuggestions","hasValue","render","renderControl","renderSuggestions","__nextHasNoMarginBottom","label","className","isFullWidth","placeholder","__experimentalRenderControl","inputId","controlProps","id","inputProps","required","type","role","undefined","since","version","hint","__experimentalRenderSuggestions","suggestionsListProps","buildSuggestionItemProps","tabIndex","isLoading","handleSuggestionClick","currentInputValue","map","title","select","getSettings"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n/**\n * WordPress dependencies\n */\nimport deprecated from '@wordpress/deprecated';\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\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 = 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\tisUpdatingSuggestions: 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\t! this.scrollingIntoView\n\t\t) {\n\t\t\tthis.scrollingIntoView = true;\n\t\t\tscrollIntoView(\n\t\t\t\tthis.suggestionNodes[ selectedSuggestion ],\n\t\t\t\tthis.autocompleteRef.current,\n\t\t\t\t{\n\t\t\t\t\tonlyScrollIfNeeded: true,\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tthis.props.setTimeout( () => {\n\t\t\t\tthis.scrollingIntoView = false;\n\t\t\t}, 100 );\n\t\t}\n\n\t\t// Update suggestions when the value changes.\n\t\tif (\n\t\t\tprevProps.value !== value &&\n\t\t\t! this.props.disableSuggestions &&\n\t\t\t! this.state.isUpdatingSuggestions\n\t\t) {\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\tisUpdatingSuggestions: true,\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\tisUpdatingSuggestions: false,\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: %s: 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\tisUpdatingSuggestions: false,\n\t\t\t\t\tloading: false,\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( event ) {\n\t\tthis.props.onChange( event.target.value );\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\tif (\n\t\t\tvalue &&\n\t\t\t! disableSuggestions &&\n\t\t\t! this.state.isUpdatingSuggestions &&\n\t\t\t! ( suggestions && suggestions.length )\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\t/** Start opting into the new margin-free styles that will become the default in a future version. */\n\t\t\t__nextHasNoMarginBottom = false,\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} = 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: classnames( 'block-editor-url-input', className, {\n\t\t\t\t'is-full-width': isFullWidth,\n\t\t\t} ),\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\tclassName: 'block-editor-url-input__input',\n\t\t\ttype: 'text',\n\t\t\tonChange: this.onChange,\n\t\t\tonFocus: this.onFocus,\n\t\t\tplaceholder,\n\t\t\tonKeyDown: this.onKeyDown,\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};\n\n\t\tif ( renderControl ) {\n\t\t\treturn renderControl( controlProps, inputProps, loading );\n\t\t}\n\n\t\tif ( ! __nextHasNoMarginBottom ) {\n\t\t\tdeprecated( 'Bottom margin styles for wp.blockEditor.URLInput', {\n\t\t\t\tsince: '6.2',\n\t\t\t\tversion: '6.5',\n\t\t\t\thint: 'Set the `__nextHasNoMarginBottom` prop to true to start opting into the new styles, which will become the default in a future version',\n\t\t\t} );\n\t\t}\n\n\t\treturn (\n\t\t\t<BaseControl\n\t\t\t\t__nextHasNoMarginBottom={ __nextHasNoMarginBottom }\n\t\t\t\t{ ...controlProps }\n\t\t\t>\n\t\t\t\t<input { ...inputProps } />\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={ classnames(\n\t\t\t\t\t\t'block-editor-url-input__suggestions',\n\t\t\t\t\t\t`${ className }__suggestions`\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{ ...buildSuggestionItemProps( suggestion, index ) }\n\t\t\t\t\t\t\tkey={ suggestion.id }\n\t\t\t\t\t\t\tclassName={ classnames(\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"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/url-input/index.js"],"names":["classnames","scrollIntoView","deprecated","__","sprintf","_n","Component","createRef","UP","DOWN","ENTER","TAB","BaseControl","Button","Spinner","withSpokenMessages","Popover","compose","debounce","withInstanceId","withSafeTimeout","withSelect","isURL","store","blockEditorStore","isFunction","maybeFunc","URLInput","constructor","props","onChange","bind","onFocus","onKeyDown","selectLink","handleOnClick","bindSuggestionNode","autocompleteRef","inputRef","updateSuggestions","suggestionNodes","suggestionsRequest","state","suggestions","showSuggestions","isUpdatingSuggestions","suggestionsValue","selectedSuggestion","suggestionsListboxId","suggestionOptionIdPrefix","componentDidUpdate","prevProps","value","__experimentalShowInitialSuggestions","scrollingIntoView","current","onlyScrollIfNeeded","setTimeout","disableSuggestions","length","componentDidMount","shouldShowInitialSuggestions","componentWillUnmount","cancel","index","ref","__experimentalFetchLinkSuggestions","fetchLinkSuggestions","__experimentalHandleURLSuggestions","handleURLSuggestions","isInitialSuggestions","trim","setState","loading","request","then","debouncedSpeak","catch","event","target","keyCode","selectionStart","preventDefault","setSelectionRange","onSubmit","suggestion","previousIndex","nextIndex","speak","url","focus","getDerivedStateFromProps","instanceId","shouldShowSuggestions","hasValue","render","renderControl","renderSuggestions","__nextHasNoMarginBottom","label","className","isFullWidth","placeholder","__experimentalRenderControl","hideLabelFromVision","inputId","controlProps","id","inputProps","required","type","role","undefined","since","version","hint","__experimentalRenderSuggestions","suggestionsListProps","buildSuggestionItemProps","tabIndex","isLoading","handleSuggestionClick","currentInputValue","map","title","select","getSettings"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n/**\n * WordPress dependencies\n */\nimport deprecated from '@wordpress/deprecated';\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\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 = 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\tisUpdatingSuggestions: 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\t! this.scrollingIntoView\n\t\t) {\n\t\t\tthis.scrollingIntoView = true;\n\t\t\tscrollIntoView(\n\t\t\t\tthis.suggestionNodes[ selectedSuggestion ],\n\t\t\t\tthis.autocompleteRef.current,\n\t\t\t\t{\n\t\t\t\t\tonlyScrollIfNeeded: true,\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tthis.props.setTimeout( () => {\n\t\t\t\tthis.scrollingIntoView = false;\n\t\t\t}, 100 );\n\t\t}\n\n\t\t// Update suggestions when the value changes.\n\t\tif (\n\t\t\tprevProps.value !== value &&\n\t\t\t! this.props.disableSuggestions &&\n\t\t\t! this.state.isUpdatingSuggestions\n\t\t) {\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\tisUpdatingSuggestions: true,\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\tisUpdatingSuggestions: false,\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: %s: 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\tisUpdatingSuggestions: false,\n\t\t\t\t\tloading: false,\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( event ) {\n\t\tthis.props.onChange( event.target.value );\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\tif (\n\t\t\tvalue &&\n\t\t\t! disableSuggestions &&\n\t\t\t! this.state.isUpdatingSuggestions &&\n\t\t\t! ( suggestions && suggestions.length )\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\t/** Start opting into the new margin-free styles that will become the default in a future version. */\n\t\t\t__nextHasNoMarginBottom = false,\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} = 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: classnames( '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\tclassName: 'block-editor-url-input__input',\n\t\t\ttype: 'text',\n\t\t\tonChange: this.onChange,\n\t\t\tonFocus: this.onFocus,\n\t\t\tplaceholder,\n\t\t\tonKeyDown: this.onKeyDown,\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};\n\n\t\tif ( renderControl ) {\n\t\t\treturn renderControl( controlProps, inputProps, loading );\n\t\t}\n\n\t\tif ( ! __nextHasNoMarginBottom ) {\n\t\t\tdeprecated( 'Bottom margin styles for wp.blockEditor.URLInput', {\n\t\t\t\tsince: '6.2',\n\t\t\t\tversion: '6.5',\n\t\t\t\thint: 'Set the `__nextHasNoMarginBottom` prop to true to start opting into the new styles, which will become the default in a future version',\n\t\t\t} );\n\t\t}\n\n\t\treturn (\n\t\t\t<BaseControl\n\t\t\t\t__nextHasNoMarginBottom={ __nextHasNoMarginBottom }\n\t\t\t\t{ ...controlProps }\n\t\t\t>\n\t\t\t\t<input { ...inputProps } />\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={ classnames(\n\t\t\t\t\t\t'block-editor-url-input__suggestions',\n\t\t\t\t\t\t`${ className }__suggestions`\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{ ...buildSuggestionItemProps( suggestion, index ) }\n\t\t\t\t\t\t\tkey={ suggestion.id }\n\t\t\t\t\t\t\tclassName={ classnames(\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"]}
@@ -13,6 +13,7 @@ import { useRef } from '@wordpress/element';
13
13
  */
14
14
 
15
15
  import { store as blockEditorStore } from '../../store';
16
+ import { isInSameBlock, isInsideRootBlock } from '../../utils/dom';
16
17
  export default function useTabNav() {
17
18
  const container = useRef();
18
19
  const focusCaptureBeforeRef = useRef();
@@ -99,42 +100,23 @@ export default function useTabNav() {
99
100
  // will no longer send focus through the focus capture element.
100
101
  if (event.target === node) setNavigationMode(true);
101
102
  return;
102
- } // We want to constrain the tabbing to the block and its child blocks.
103
+ }
104
+
105
+ const nextTabbable = focus.tabbable[direction](event.target); // We want to constrain the tabbing to the block and its child blocks.
103
106
  // If the preceding form element is within a different block,
104
107
  // such as two sibling image blocks in the placeholder state,
105
108
  // we want shift + tab from the first form element to move to the image
106
109
  // block toolbar and not the previous image block's form element.
107
- // TODO: Should this become a utility function?
108
-
109
- /**
110
- * Determine whether an element is part of or is the selected block.
111
- *
112
- * @param {Object} selectedBlockElement
113
- * @param {Object} element
114
- * @return {boolean} Whether the element is part of or is the selected block.
115
- */
116
-
117
-
118
- const isElementPartOfSelectedBlock = (selectedBlockElement, element) => {
119
- // Check if the element is or is within the selected block by finding the
120
- // closest element with a data-block attribute and seeing if
121
- // it matches our current selected block ID
122
- const elementBlockId = element.closest('[data-block]')?.getAttribute('data-block');
123
- const isElementSameBlock = elementBlockId === getSelectedBlockClientId(); // Check if the element is a child of the selected block. This could be a
124
- // child block in a group or column block, etc.
125
-
126
- const isElementChildOfBlock = selectedBlockElement.contains(element);
127
- return isElementSameBlock || isElementChildOfBlock;
128
- };
129
-
130
- const nextTabbable = focus.tabbable[direction](event.target); // Allow tabbing from the block wrapper to a form element,
110
+
111
+ const currentBlock = event.target.closest('[data-block]');
112
+ const isElementPartOfSelectedBlock = currentBlock && nextTabbable && (isInSameBlock(currentBlock, nextTabbable) || isInsideRootBlock(currentBlock, nextTabbable)); // Allow tabbing from the block wrapper to a form element,
131
113
  // and between form elements rendered in a block and its child blocks,
132
114
  // such as inside a placeholder. Form elements are generally
133
115
  // meant to be UI rather than part of the content. Ideally
134
116
  // these are not rendered in the content and perhaps in the
135
117
  // future they can be rendered in an iframe or shadow DOM.
136
118
 
137
- if (isFormElement(nextTabbable) && isElementPartOfSelectedBlock(event.target.closest('[data-block]'), nextTabbable)) {
119
+ if (isFormElement(nextTabbable) && isElementPartOfSelectedBlock) {
138
120
  return;
139
121
  }
140
122