@wordpress/block-editor 7.0.4 → 8.0.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 (347) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +31 -0
  3. package/build/components/alignment-control/ui.js +1 -2
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/block-icon/index.js +5 -1
  6. package/build/components/block-icon/index.js.map +1 -1
  7. package/build/components/block-inspector/index.js +4 -0
  8. package/build/components/block-inspector/index.js.map +1 -1
  9. package/build/components/block-list/index.native.js +1 -1
  10. package/build/components/block-list/index.native.js.map +1 -1
  11. package/build/components/block-list/use-block-props/use-multi-selection.js +21 -8
  12. package/build/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  13. package/build/components/block-navigation/dropdown.js +0 -1
  14. package/build/components/block-navigation/dropdown.js.map +1 -1
  15. package/build/components/block-patterns-list/index.js +1 -8
  16. package/build/components/block-patterns-list/index.js.map +1 -1
  17. package/build/components/block-settings/container.native.js +5 -2
  18. package/build/components/block-settings/container.native.js.map +1 -1
  19. package/build/components/block-settings-menu/block-settings-dropdown.js +22 -2
  20. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  21. package/build/components/block-styles/preview.native.js +2 -2
  22. package/build/components/block-styles/preview.native.js.map +1 -1
  23. package/build/components/colors-gradients/control.js +8 -47
  24. package/build/components/colors-gradients/control.js.map +1 -1
  25. package/build/components/colors-gradients/panel-color-gradient-settings.js +81 -6
  26. package/build/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  27. package/build/components/duotone-control/index.js +5 -2
  28. package/build/components/duotone-control/index.js.map +1 -1
  29. package/build/components/font-appearance-control/index.js +27 -15
  30. package/build/components/font-appearance-control/index.js.map +1 -1
  31. package/build/components/iframe/index.js +1 -1
  32. package/build/components/iframe/index.js.map +1 -1
  33. package/build/components/index.js +20 -2
  34. package/build/components/index.js.map +1 -1
  35. package/build/components/index.native.js +2 -2
  36. package/build/components/index.native.js.map +1 -1
  37. package/build/components/inner-blocks/index.js +5 -4
  38. package/build/components/inner-blocks/index.js.map +1 -1
  39. package/build/components/inner-blocks/index.native.js +4 -3
  40. package/build/components/inner-blocks/index.native.js.map +1 -1
  41. package/build/components/inserter/block-patterns-explorer/explorer.js +62 -0
  42. package/build/components/inserter/block-patterns-explorer/explorer.js.map +1 -0
  43. package/build/components/inserter/block-patterns-explorer/patterns-list.js +111 -0
  44. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -0
  45. package/build/components/inserter/block-patterns-explorer/sidebar.js +78 -0
  46. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -0
  47. package/build/components/inserter/block-patterns-tab.js +74 -45
  48. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  49. package/build/components/inserter/hooks/use-block-type-impressions.native.js +4 -7
  50. package/build/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  51. package/build/components/inserter/pattern-panel.js +19 -10
  52. package/build/components/inserter/pattern-panel.js.map +1 -1
  53. package/build/components/inspector-controls/groups.js +3 -1
  54. package/build/components/inspector-controls/groups.js.map +1 -1
  55. package/build/components/letter-spacing-control/index.js +9 -6
  56. package/build/components/letter-spacing-control/index.js.map +1 -1
  57. package/build/components/link-control/index.js +88 -35
  58. package/build/components/link-control/index.js.map +1 -1
  59. package/build/components/link-control/link-preview.js +19 -6
  60. package/build/components/link-control/link-preview.js.map +1 -1
  61. package/build/components/link-control/search-input.js +12 -3
  62. package/build/components/link-control/search-input.js.map +1 -1
  63. package/build/components/list-view/block.js +49 -23
  64. package/build/components/list-view/block.js.map +1 -1
  65. package/build/components/list-view/branch.js +92 -73
  66. package/build/components/list-view/branch.js.map +1 -1
  67. package/build/components/list-view/index.js +39 -16
  68. package/build/components/list-view/index.js.map +1 -1
  69. package/build/components/list-view/leaf.js +1 -1
  70. package/build/components/list-view/leaf.js.map +1 -1
  71. package/build/components/list-view/use-list-view-client-ids.js +8 -58
  72. package/build/components/list-view/use-list-view-client-ids.js.map +1 -1
  73. package/build/components/rich-text/embed-handler-picker.native.js +1 -0
  74. package/build/components/rich-text/embed-handler-picker.native.js.map +1 -1
  75. package/build/components/rich-text/format-edit.js +28 -2
  76. package/build/components/rich-text/format-edit.js.map +1 -1
  77. package/build/components/rich-text/format-toolbar/index.js +2 -1
  78. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  79. package/build/components/url-input/index.js +11 -4
  80. package/build/components/url-input/index.js.map +1 -1
  81. package/build/components/use-setting/index.js +48 -9
  82. package/build/components/use-setting/index.js.map +1 -1
  83. package/build/hooks/border.js +5 -5
  84. package/build/hooks/border.js.map +1 -1
  85. package/build/hooks/color-panel.js +2 -1
  86. package/build/hooks/color-panel.js.map +1 -1
  87. package/build/hooks/duotone.js +16 -5
  88. package/build/hooks/duotone.js.map +1 -1
  89. package/build/hooks/font-appearance.js +49 -6
  90. package/build/hooks/font-appearance.js.map +1 -1
  91. package/build/hooks/font-family.js +37 -16
  92. package/build/hooks/font-family.js.map +1 -1
  93. package/build/hooks/font-size.js +51 -9
  94. package/build/hooks/font-size.js.map +1 -1
  95. package/build/hooks/index.js +8 -0
  96. package/build/hooks/index.js.map +1 -1
  97. package/build/hooks/index.native.js +8 -0
  98. package/build/hooks/index.native.js.map +1 -1
  99. package/build/hooks/letter-spacing.js +44 -7
  100. package/build/hooks/letter-spacing.js.map +1 -1
  101. package/build/hooks/line-height.js +45 -8
  102. package/build/hooks/line-height.js.map +1 -1
  103. package/build/hooks/margin.js +1 -1
  104. package/build/hooks/margin.js.map +1 -1
  105. package/build/hooks/padding.js +1 -1
  106. package/build/hooks/padding.js.map +1 -1
  107. package/build/hooks/text-decoration.js +42 -6
  108. package/build/hooks/text-decoration.js.map +1 -1
  109. package/build/hooks/text-transform.js +42 -6
  110. package/build/hooks/text-transform.js.map +1 -1
  111. package/build/hooks/typography.js +108 -8
  112. package/build/hooks/typography.js.map +1 -1
  113. package/build/hooks/use-cached-truthy.js +29 -0
  114. package/build/hooks/use-cached-truthy.js.map +1 -0
  115. package/build/index.js +7 -0
  116. package/build/index.js.map +1 -1
  117. package/build/layouts/flex.js +120 -28
  118. package/build/layouts/flex.js.map +1 -1
  119. package/build/store/actions.js +303 -265
  120. package/build/store/actions.js.map +1 -1
  121. package/build/store/index.js +1 -3
  122. package/build/store/index.js.map +1 -1
  123. package/build/store/reducer.js +23 -22
  124. package/build/store/reducer.js.map +1 -1
  125. package/build/store/selectors.js +44 -35
  126. package/build/store/selectors.js.map +1 -1
  127. package/build-module/components/alignment-control/ui.js +1 -2
  128. package/build-module/components/alignment-control/ui.js.map +1 -1
  129. package/build-module/components/block-icon/index.js +5 -1
  130. package/build-module/components/block-icon/index.js.map +1 -1
  131. package/build-module/components/block-inspector/index.js +4 -0
  132. package/build-module/components/block-inspector/index.js.map +1 -1
  133. package/build-module/components/block-list/index.native.js +1 -1
  134. package/build-module/components/block-list/index.native.js.map +1 -1
  135. package/build-module/components/block-list/use-block-props/use-multi-selection.js +21 -8
  136. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  137. package/build-module/components/block-navigation/dropdown.js +0 -1
  138. package/build-module/components/block-navigation/dropdown.js.map +1 -1
  139. package/build-module/components/block-patterns-list/index.js +1 -6
  140. package/build-module/components/block-patterns-list/index.js.map +1 -1
  141. package/build-module/components/block-settings/container.native.js +6 -3
  142. package/build-module/components/block-settings/container.native.js.map +1 -1
  143. package/build-module/components/block-settings-menu/block-settings-dropdown.js +24 -4
  144. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  145. package/build-module/components/block-styles/preview.native.js +2 -2
  146. package/build-module/components/block-styles/preview.native.js.map +1 -1
  147. package/build-module/components/colors-gradients/control.js +12 -53
  148. package/build-module/components/colors-gradients/control.js.map +1 -1
  149. package/build-module/components/colors-gradients/panel-color-gradient-settings.js +82 -6
  150. package/build-module/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  151. package/build-module/components/duotone-control/index.js +5 -2
  152. package/build-module/components/duotone-control/index.js.map +1 -1
  153. package/build-module/components/font-appearance-control/index.js +23 -15
  154. package/build-module/components/font-appearance-control/index.js.map +1 -1
  155. package/build-module/components/iframe/index.js +1 -1
  156. package/build-module/components/iframe/index.js.map +1 -1
  157. package/build-module/components/index.js +3 -1
  158. package/build-module/components/index.js.map +1 -1
  159. package/build-module/components/index.native.js +1 -1
  160. package/build-module/components/index.native.js.map +1 -1
  161. package/build-module/components/inner-blocks/index.js +6 -5
  162. package/build-module/components/inner-blocks/index.js.map +1 -1
  163. package/build-module/components/inner-blocks/index.native.js +5 -4
  164. package/build-module/components/inner-blocks/index.native.js.map +1 -1
  165. package/build-module/components/inserter/block-patterns-explorer/explorer.js +50 -0
  166. package/build-module/components/inserter/block-patterns-explorer/explorer.js.map +1 -0
  167. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +92 -0
  168. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -0
  169. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +69 -0
  170. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -0
  171. package/build-module/components/inserter/block-patterns-tab.js +75 -46
  172. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  173. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js +4 -7
  174. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  175. package/build-module/components/inserter/pattern-panel.js +21 -13
  176. package/build-module/components/inserter/pattern-panel.js.map +1 -1
  177. package/build-module/components/inspector-controls/groups.js +3 -1
  178. package/build-module/components/inspector-controls/groups.js.map +1 -1
  179. package/build-module/components/letter-spacing-control/index.js +9 -6
  180. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  181. package/build-module/components/link-control/index.js +88 -36
  182. package/build-module/components/link-control/index.js.map +1 -1
  183. package/build-module/components/link-control/link-preview.js +19 -7
  184. package/build-module/components/link-control/link-preview.js.map +1 -1
  185. package/build-module/components/link-control/search-input.js +11 -3
  186. package/build-module/components/link-control/search-input.js.map +1 -1
  187. package/build-module/components/list-view/block.js +49 -24
  188. package/build-module/components/list-view/block.js.map +1 -1
  189. package/build-module/components/list-view/branch.js +92 -73
  190. package/build-module/components/list-view/branch.js.map +1 -1
  191. package/build-module/components/list-view/index.js +41 -18
  192. package/build-module/components/list-view/index.js.map +1 -1
  193. package/build-module/components/list-view/leaf.js +1 -1
  194. package/build-module/components/list-view/leaf.js.map +1 -1
  195. package/build-module/components/list-view/use-list-view-client-ids.js +8 -58
  196. package/build-module/components/list-view/use-list-view-client-ids.js.map +1 -1
  197. package/build-module/components/rich-text/embed-handler-picker.native.js +1 -0
  198. package/build-module/components/rich-text/embed-handler-picker.native.js.map +1 -1
  199. package/build-module/components/rich-text/format-edit.js +28 -3
  200. package/build-module/components/rich-text/format-edit.js.map +1 -1
  201. package/build-module/components/rich-text/format-toolbar/index.js +2 -1
  202. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  203. package/build-module/components/url-input/index.js +11 -4
  204. package/build-module/components/url-input/index.js.map +1 -1
  205. package/build-module/components/use-setting/index.js +48 -9
  206. package/build-module/components/use-setting/index.js.map +1 -1
  207. package/build-module/hooks/border.js +5 -5
  208. package/build-module/hooks/border.js.map +1 -1
  209. package/build-module/hooks/color-panel.js +2 -1
  210. package/build-module/hooks/color-panel.js.map +1 -1
  211. package/build-module/hooks/duotone.js +16 -5
  212. package/build-module/hooks/duotone.js.map +1 -1
  213. package/build-module/hooks/font-appearance.js +45 -6
  214. package/build-module/hooks/font-appearance.js.map +1 -1
  215. package/build-module/hooks/font-family.js +33 -16
  216. package/build-module/hooks/font-family.js.map +1 -1
  217. package/build-module/hooks/font-size.js +47 -9
  218. package/build-module/hooks/font-size.js.map +1 -1
  219. package/build-module/hooks/index.js +1 -0
  220. package/build-module/hooks/index.js.map +1 -1
  221. package/build-module/hooks/index.native.js +1 -0
  222. package/build-module/hooks/index.native.js.map +1 -1
  223. package/build-module/hooks/letter-spacing.js +40 -7
  224. package/build-module/hooks/letter-spacing.js.map +1 -1
  225. package/build-module/hooks/line-height.js +41 -8
  226. package/build-module/hooks/line-height.js.map +1 -1
  227. package/build-module/hooks/margin.js +1 -1
  228. package/build-module/hooks/margin.js.map +1 -1
  229. package/build-module/hooks/padding.js +1 -1
  230. package/build-module/hooks/padding.js.map +1 -1
  231. package/build-module/hooks/text-decoration.js +38 -6
  232. package/build-module/hooks/text-decoration.js.map +1 -1
  233. package/build-module/hooks/text-transform.js +38 -6
  234. package/build-module/hooks/text-transform.js.map +1 -1
  235. package/build-module/hooks/typography.js +117 -17
  236. package/build-module/hooks/typography.js.map +1 -1
  237. package/build-module/hooks/use-cached-truthy.js +21 -0
  238. package/build-module/hooks/use-cached-truthy.js.map +1 -0
  239. package/build-module/index.js +1 -1
  240. package/build-module/index.js.map +1 -1
  241. package/build-module/layouts/flex.js +124 -32
  242. package/build-module/layouts/flex.js.map +1 -1
  243. package/build-module/store/actions.js +266 -241
  244. package/build-module/store/actions.js.map +1 -1
  245. package/build-module/store/index.js +1 -2
  246. package/build-module/store/index.js.map +1 -1
  247. package/build-module/store/reducer.js +23 -22
  248. package/build-module/store/reducer.js.map +1 -1
  249. package/build-module/store/selectors.js +42 -30
  250. package/build-module/store/selectors.js.map +1 -1
  251. package/build-style/style-rtl.css +160 -57
  252. package/build-style/style.css +160 -57
  253. package/package.json +13 -14
  254. package/src/components/alignment-control/test/__snapshots__/index.js.snap +0 -2
  255. package/src/components/alignment-control/ui.js +1 -4
  256. package/src/components/block-draggable/style.scss +19 -4
  257. package/src/components/block-icon/index.js +4 -1
  258. package/src/components/block-inspector/index.js +5 -0
  259. package/src/components/block-list/index.native.js +1 -1
  260. package/src/components/block-list/use-block-props/use-multi-selection.js +27 -7
  261. package/src/components/block-navigation/dropdown.js +0 -1
  262. package/src/components/block-patterns-list/index.js +1 -8
  263. package/src/components/block-patterns-list/style.scss +22 -12
  264. package/src/components/block-settings/container.native.js +7 -0
  265. package/src/components/block-settings-menu/block-settings-dropdown.js +19 -7
  266. package/src/components/block-styles/preview.native.js +2 -2
  267. package/src/components/block-switcher/test/__snapshots__/index.js.snap +1 -1
  268. package/src/components/color-palette/test/__snapshots__/control.js.snap +88 -63
  269. package/src/components/colors-gradients/control.js +19 -62
  270. package/src/components/colors-gradients/panel-color-gradient-settings.js +76 -6
  271. package/src/components/colors-gradients/style.scss +3 -14
  272. package/src/components/colors-gradients/test/control.js +0 -16
  273. package/src/components/duotone-control/index.js +6 -0
  274. package/src/components/duotone-control/style.scss +27 -12
  275. package/src/components/font-appearance-control/index.js +22 -14
  276. package/src/components/iframe/index.js +1 -1
  277. package/src/components/index.js +3 -4
  278. package/src/components/index.native.js +1 -4
  279. package/src/components/inner-blocks/index.js +4 -4
  280. package/src/components/inner-blocks/index.native.js +7 -4
  281. package/src/components/inserter/block-patterns-explorer/explorer.js +50 -0
  282. package/src/components/inserter/block-patterns-explorer/patterns-list.js +122 -0
  283. package/src/components/inserter/block-patterns-explorer/sidebar.js +73 -0
  284. package/src/components/inserter/block-patterns-tab.js +107 -80
  285. package/src/components/inserter/hooks/use-block-type-impressions.native.js +14 -21
  286. package/src/components/inserter/pattern-panel.js +33 -16
  287. package/src/components/inserter/style.scss +64 -1
  288. package/src/components/inserter/test/block-types-tab.native.js +1 -1
  289. package/src/components/inserter/test/fixtures/index.native.js +12 -0
  290. package/src/components/inspector-controls/groups.js +4 -0
  291. package/src/components/letter-spacing-control/index.js +12 -6
  292. package/src/components/link-control/README.md +7 -0
  293. package/src/components/link-control/index.js +99 -34
  294. package/src/components/link-control/link-preview.js +21 -9
  295. package/src/components/link-control/search-input.js +9 -3
  296. package/src/components/link-control/style.scss +32 -16
  297. package/src/components/link-control/test/index.js +179 -4
  298. package/src/components/list-view/block.js +67 -23
  299. package/src/components/list-view/branch.js +113 -91
  300. package/src/components/list-view/index.js +58 -19
  301. package/src/components/list-view/leaf.js +1 -1
  302. package/src/components/list-view/style.scss +14 -3
  303. package/src/components/list-view/use-list-view-client-ids.js +7 -66
  304. package/src/components/rich-text/embed-handler-picker.native.js +1 -0
  305. package/src/components/rich-text/format-edit.js +36 -2
  306. package/src/components/rich-text/format-toolbar/index.js +3 -0
  307. package/src/components/url-input/index.js +14 -4
  308. package/src/components/use-setting/index.js +49 -11
  309. package/src/hooks/border.js +8 -11
  310. package/src/hooks/color-panel.js +1 -0
  311. package/src/hooks/duotone.js +21 -7
  312. package/src/hooks/font-appearance.js +38 -7
  313. package/src/hooks/font-family.js +29 -13
  314. package/src/hooks/font-size.js +42 -6
  315. package/src/hooks/index.js +1 -0
  316. package/src/hooks/index.native.js +1 -0
  317. package/src/hooks/layout.scss +3 -1
  318. package/src/hooks/letter-spacing.js +35 -7
  319. package/src/hooks/line-height.js +37 -9
  320. package/src/hooks/margin.js +1 -1
  321. package/src/hooks/padding.js +1 -1
  322. package/src/hooks/text-decoration.js +34 -6
  323. package/src/hooks/text-transform.js +34 -6
  324. package/src/hooks/typography.js +165 -15
  325. package/src/hooks/typography.scss +16 -0
  326. package/src/hooks/use-cached-truthy.js +20 -0
  327. package/src/index.js +1 -0
  328. package/src/layouts/flex.js +137 -41
  329. package/src/store/actions.js +223 -391
  330. package/src/store/index.js +1 -2
  331. package/src/store/reducer.js +36 -18
  332. package/src/store/selectors.js +52 -47
  333. package/src/store/test/actions.js +395 -694
  334. package/src/store/test/selectors.js +79 -21
  335. package/src/style.scss +1 -1
  336. package/src/utils/test/parse-css-unit-to-px.js +127 -167
  337. package/build/components/text-decoration-and-transform/index.js +0 -39
  338. package/build/components/text-decoration-and-transform/index.js.map +0 -1
  339. package/build/store/controls.js +0 -44
  340. package/build/store/controls.js.map +0 -1
  341. package/build-module/components/text-decoration-and-transform/index.js +0 -30
  342. package/build-module/components/text-decoration-and-transform/index.js.map +0 -1
  343. package/build-module/store/controls.js +0 -32
  344. package/build-module/store/controls.js.map +0 -1
  345. package/src/components/text-decoration-and-transform/index.js +0 -36
  346. package/src/components/text-decoration-and-transform/style.scss +0 -3
  347. package/src/store/controls.js +0 -39
@@ -30,24 +30,46 @@ $preview-image-height: 140px;
30
30
  position: relative;
31
31
  }
32
32
 
33
- // LinkControl popover.
34
- .block-editor-link-control .block-editor-link-control__search-input {
35
- // Specificity override.
36
- &.block-editor-link-control__search-input input[type="text"] {
33
+ // Provides positioning context for search actions
34
+ .block-editor-link-control__search-input-container {
35
+ position: relative;
36
+ }
37
+
38
+ // If the input doesn't have a visible label then
39
+ // we need to expand the input itself to occupy
40
+ // the full available horizontal space.
41
+ .block-editor-link-control__search-input.has-no-label .block-editor-url-input__input {
42
+ flex: 1;
43
+ }
44
+
45
+ .block-editor-link-control__field {
46
+ margin: $grid-unit-20; // allow margin collapse for vertical spacing.
47
+
48
+ // Element wrapping the label and input.
49
+ > .components-base-control__field {
50
+ display: flex;
51
+ align-items: center;
52
+ margin: 0;
53
+ }
54
+
55
+ .components-base-control__label {
56
+ margin-right: $grid-unit-20;
57
+ margin-bottom: 0;
58
+ }
59
+
60
+ input[type="text"],
61
+ // Specificity overide of URLInput defaults.
62
+ &.block-editor-url-input input[type="text"].block-editor-url-input__input {
37
63
  @include input-control;
38
64
  width: calc(100% - #{$grid-unit-20*2});
39
65
  display: block;
40
66
  padding: 11px $grid-unit-20;
41
67
  padding-right: ( $button-size * $block-editor-link-control-number-of-actions ); // width of reset and submit buttons
42
- margin: $grid-unit-20;
68
+ margin: 0;
43
69
  position: relative;
44
70
  border: 1px solid $gray-300;
45
71
  border-radius: $radius-block-ui;
46
72
  }
47
-
48
- .components-base-control__field {
49
- margin-bottom: 0;
50
- }
51
73
  }
52
74
 
53
75
  .block-editor-link-control__search-error {
@@ -61,14 +83,13 @@ $preview-image-height: 140px;
61
83
  * when suggestions are rendered.
62
84
  *
63
85
  * Compensate for:
64
- * - Input margin ($grid-unit-20)
65
86
  * - Border (1px)
66
87
  * - Vertically, for the difference in height between the input (40px) and
67
88
  * the icon buttons.
68
89
  * - Horizontally, pad to the minimum of: default input padding, or the
69
90
  * equivalent of the vertical padding.
70
91
  */
71
- top: $grid-unit-20 + 1px + ( ( 40px - $button-size ) * 0.5 );
92
+ top: 1px + ( ( 40px - $button-size ) * 0.5 );
72
93
  right: $grid-unit-20 + 1px + min($grid-unit-10, ( 40px - $button-size ) * 0.5);
73
94
  }
74
95
 
@@ -171,7 +192,6 @@ $preview-image-height: 140px;
171
192
  flex-direction: row;
172
193
  align-items: flex-start;
173
194
  margin-right: $grid-unit-10;
174
- overflow: hidden;
175
195
 
176
196
  // Force text to wrap to improve UX when encountering long lines
177
197
  // of text, particular those with no spaces.
@@ -189,10 +209,6 @@ $preview-image-height: 140px;
189
209
  align-items: center;
190
210
  }
191
211
 
192
- .block-editor-link-control__search-item-details {
193
- overflow: hidden; // clip to force text ellipsis.
194
- }
195
-
196
212
  .block-editor-link-control__search-item-icon {
197
213
  position: relative;
198
214
  top: 0.2em;
@@ -202,9 +202,9 @@ describe( 'Basic rendering', () => {
202
202
  } );
203
203
 
204
204
  // Click the "Edit" button to trigger into the editing mode.
205
- const editButton = Array.from(
206
- container.querySelectorAll( 'button' )
207
- ).find( ( button ) => button.innerHTML.includes( 'Edit' ) );
205
+ const editButton = queryByRole( container, 'button', {
206
+ name: 'Edit',
207
+ } );
208
208
 
209
209
  act( () => {
210
210
  Simulate.click( editButton );
@@ -1653,7 +1653,7 @@ describe( 'Selecting links', () => {
1653
1653
  );
1654
1654
  }
1655
1655
 
1656
- // Commit the selected item as the current link
1656
+ // Submit the selected item as the current link
1657
1657
  act( () => {
1658
1658
  Simulate.keyDown( searchInput, { keyCode: ENTER } );
1659
1659
  } );
@@ -2274,3 +2274,178 @@ describe( 'Rich link previews', () => {
2274
2274
  mockFetchRichUrlData = undefined;
2275
2275
  } );
2276
2276
  } );
2277
+
2278
+ describe( 'Controlling link title text', () => {
2279
+ const selectedLink = first( fauxEntitySuggestions );
2280
+
2281
+ it( 'should not show a means to alter the link title text by default', async () => {
2282
+ act( () => {
2283
+ render(
2284
+ <LinkControl value={ selectedLink } forceIsEditingLink />,
2285
+ container
2286
+ );
2287
+ } );
2288
+
2289
+ expect(
2290
+ queryByRole( container, 'textbox', { name: 'Text' } )
2291
+ ).toBeFalsy();
2292
+ } );
2293
+
2294
+ it.each( [ null, undefined, ' ' ] )(
2295
+ 'should not show the link title text input when the URL is `%s`',
2296
+ async ( urlValue ) => {
2297
+ const selectedLinkWithoutURL = {
2298
+ ...first( fauxEntitySuggestions ),
2299
+ url: urlValue,
2300
+ };
2301
+
2302
+ act( () => {
2303
+ render(
2304
+ <LinkControl
2305
+ value={ selectedLinkWithoutURL }
2306
+ forceIsEditingLink
2307
+ hasTextControl
2308
+ />,
2309
+ container
2310
+ );
2311
+ } );
2312
+
2313
+ expect(
2314
+ queryByRole( container, 'textbox', { name: 'Text' } )
2315
+ ).toBeFalsy();
2316
+ }
2317
+ );
2318
+
2319
+ it( 'should show a text input to alter the link title text when hasTextControl prop is truthy', async () => {
2320
+ act( () => {
2321
+ render(
2322
+ <LinkControl
2323
+ value={ selectedLink }
2324
+ forceIsEditingLink
2325
+ hasTextControl
2326
+ />,
2327
+ container
2328
+ );
2329
+ } );
2330
+
2331
+ expect(
2332
+ queryByRole( container, 'textbox', { name: 'Text' } )
2333
+ ).toBeTruthy();
2334
+ } );
2335
+
2336
+ it.each( [
2337
+ [ '', 'Testing' ],
2338
+ [ '(with leading and traling whitespace)', ' Testing ' ],
2339
+ [
2340
+ // Note: link control should always preserve the original value.
2341
+ // The consumer is responsible for filtering or otherwise handling the value.
2342
+ '(when containing HTML)',
2343
+ '<strong>Yes this</strong> <em>is</em> expected behaviour',
2344
+ ],
2345
+ ] )(
2346
+ "should ensure text input reflects the current link value's `title` property %s",
2347
+ async ( _unused, titleValue ) => {
2348
+ const linkWithTitle = { ...selectedLink, title: titleValue };
2349
+ act( () => {
2350
+ render(
2351
+ <LinkControl
2352
+ value={ linkWithTitle }
2353
+ forceIsEditingLink
2354
+ hasTextControl
2355
+ />,
2356
+ container
2357
+ );
2358
+ } );
2359
+
2360
+ const textInput = queryByRole( container, 'textbox', {
2361
+ name: 'Text',
2362
+ } );
2363
+
2364
+ expect( textInput.value ).toEqual( titleValue );
2365
+ }
2366
+ );
2367
+
2368
+ it( "should ensure title value matching the text input's current value is included in onChange handler value on submit", async () => {
2369
+ const mockOnChange = jest.fn();
2370
+ const textValue = 'My new text value';
2371
+
2372
+ act( () => {
2373
+ render(
2374
+ <LinkControl
2375
+ value={ selectedLink }
2376
+ forceIsEditingLink
2377
+ hasTextControl
2378
+ onChange={ mockOnChange }
2379
+ />,
2380
+ container
2381
+ );
2382
+ } );
2383
+
2384
+ let textInput = queryByRole( container, 'textbox', { name: 'Text' } );
2385
+
2386
+ act( () => {
2387
+ Simulate.change( textInput, {
2388
+ target: { value: textValue },
2389
+ } );
2390
+ } );
2391
+
2392
+ textInput = queryByRole( container, 'textbox', { name: 'Text' } );
2393
+
2394
+ expect( textInput.value ).toEqual( textValue );
2395
+
2396
+ const submitButton = queryByRole( container, 'button', {
2397
+ name: 'Submit',
2398
+ } );
2399
+
2400
+ act( () => {
2401
+ Simulate.click( submitButton );
2402
+ } );
2403
+
2404
+ expect( mockOnChange ).toHaveBeenCalledWith(
2405
+ expect.objectContaining( {
2406
+ title: textValue,
2407
+ } )
2408
+ );
2409
+ } );
2410
+
2411
+ it( 'should allow `ENTER` keypress within the text field to trigger submission of value', async () => {
2412
+ const textValue = 'My new text value';
2413
+ const mockOnChange = jest.fn();
2414
+ act( () => {
2415
+ render(
2416
+ <LinkControl
2417
+ value={ selectedLink }
2418
+ forceIsEditingLink
2419
+ hasTextControl
2420
+ onChange={ mockOnChange }
2421
+ />,
2422
+ container
2423
+ );
2424
+ } );
2425
+
2426
+ const textInput = queryByRole( container, 'textbox', { name: 'Text' } );
2427
+
2428
+ expect( textInput ).toBeTruthy();
2429
+
2430
+ act( () => {
2431
+ Simulate.change( textInput, {
2432
+ target: { value: textValue },
2433
+ } );
2434
+ } );
2435
+
2436
+ // Attempt to submit the empty search value in the input.
2437
+ act( () => {
2438
+ Simulate.keyDown( textInput, { keyCode: ENTER } );
2439
+ } );
2440
+
2441
+ expect( mockOnChange ).toHaveBeenCalledWith( {
2442
+ title: textValue,
2443
+ url: selectedLink.url,
2444
+ } );
2445
+
2446
+ // The text input should not be showing as the form is submitted.
2447
+ expect(
2448
+ queryByRole( container, 'textbox', { name: 'Text' } )
2449
+ ).toBeFalsy();
2450
+ } );
2451
+ } );
@@ -11,7 +11,13 @@ import {
11
11
  __experimentalTreeGridItem as TreeGridItem,
12
12
  } from '@wordpress/components';
13
13
  import { moreVertical } from '@wordpress/icons';
14
- import { useState, useRef, useEffect } from '@wordpress/element';
14
+ import {
15
+ useState,
16
+ useRef,
17
+ useEffect,
18
+ useCallback,
19
+ memo,
20
+ } from '@wordpress/element';
15
21
  import { useDispatch } from '@wordpress/data';
16
22
 
17
23
  /**
@@ -27,14 +33,12 @@ import BlockSettingsDropdown from '../block-settings-menu/block-settings-dropdow
27
33
  import { useListViewContext } from './context';
28
34
  import { store as blockEditorStore } from '../../store';
29
35
 
30
- export default function ListViewBlock( {
36
+ function ListViewBlock( {
31
37
  block,
32
- isSelected,
33
38
  isDragged,
39
+ isSelected,
34
40
  isBranchSelected,
35
- isLastOfSelectedBranch,
36
- onClick,
37
- onToggleExpanded,
41
+ selectBlock,
38
42
  position,
39
43
  level,
40
44
  rowCount,
@@ -49,17 +53,22 @@ export default function ListViewBlock( {
49
53
 
50
54
  const { toggleBlockHighlight } = useDispatch( blockEditorStore );
51
55
 
56
+ const {
57
+ __experimentalFeatures: withExperimentalFeatures,
58
+ __experimentalPersistentListViewFeatures: withExperimentalPersistentListViewFeatures,
59
+ __experimentalHideContainerBlockActions: hideContainerBlockActions,
60
+ isTreeGridMounted,
61
+ expand,
62
+ collapse,
63
+ } = useListViewContext();
64
+
52
65
  const hasSiblings = siblingBlockCount > 0;
53
66
  const hasRenderedMovers = showBlockMovers && hasSiblings;
54
67
  const moverCellClassName = classnames(
55
68
  'block-editor-list-view-block__mover-cell',
56
69
  { 'is-visible': isHovered || isSelected }
57
70
  );
58
- const {
59
- __experimentalFeatures: withExperimentalFeatures,
60
- __experimentalPersistentListViewFeatures: withExperimentalPersistentListViewFeatures,
61
- isTreeGridMounted,
62
- } = useListViewContext();
71
+
63
72
  const listViewBlockSettingsClassName = classnames(
64
73
  'block-editor-list-view-block__menu-cell',
65
74
  { 'is-visible': isHovered || isSelected }
@@ -82,23 +91,56 @@ export default function ListViewBlock( {
82
91
  ? toggleBlockHighlight
83
92
  : () => {};
84
93
 
85
- const onMouseEnter = () => {
94
+ const onMouseEnter = useCallback( () => {
86
95
  setIsHovered( true );
87
96
  highlightBlock( clientId, true );
88
- };
89
- const onMouseLeave = () => {
97
+ }, [ clientId, setIsHovered, highlightBlock ] );
98
+ const onMouseLeave = useCallback( () => {
90
99
  setIsHovered( false );
91
100
  highlightBlock( clientId, false );
92
- };
101
+ }, [ clientId, setIsHovered, highlightBlock ] );
102
+
103
+ const selectEditorBlock = useCallback(
104
+ ( event ) => {
105
+ event.stopPropagation();
106
+ selectBlock( clientId );
107
+ },
108
+ [ clientId, selectBlock ]
109
+ );
110
+
111
+ const toggleExpanded = useCallback(
112
+ ( event ) => {
113
+ event.stopPropagation();
114
+ if ( isExpanded === true ) {
115
+ collapse( clientId );
116
+ } else if ( isExpanded === false ) {
117
+ expand( clientId );
118
+ }
119
+ },
120
+ [ clientId, expand, collapse, isExpanded ]
121
+ );
122
+
123
+ const showBlockActions =
124
+ withExperimentalFeatures &&
125
+ //hide actions for blocks like core/widget-areas
126
+ ( ! hideContainerBlockActions ||
127
+ ( hideContainerBlockActions && level > 1 ) );
128
+
129
+ const hideBlockActions = withExperimentalFeatures && ! showBlockActions;
130
+
131
+ let colSpan;
132
+ if ( hasRenderedMovers ) {
133
+ colSpan = 2;
134
+ } else if ( hideBlockActions ) {
135
+ colSpan = 3;
136
+ }
93
137
 
94
138
  const classes = classnames( {
95
139
  'is-selected': isSelected,
96
140
  'is-branch-selected':
97
141
  withExperimentalPersistentListViewFeatures && isBranchSelected,
98
- 'is-last-of-selected-branch':
99
- withExperimentalPersistentListViewFeatures &&
100
- isLastOfSelectedBranch,
101
142
  'is-dragging': isDragged,
143
+ 'has-single-cell': hideBlockActions,
102
144
  } );
103
145
 
104
146
  return (
@@ -118,15 +160,15 @@ export default function ListViewBlock( {
118
160
  >
119
161
  <TreeGridCell
120
162
  className="block-editor-list-view-block__contents-cell"
121
- colSpan={ hasRenderedMovers ? undefined : 2 }
163
+ colSpan={ colSpan }
122
164
  ref={ cellRef }
123
165
  >
124
166
  { ( { ref, tabIndex, onFocus } ) => (
125
167
  <div className="block-editor-list-view-block__contents-container">
126
168
  <ListViewBlockContents
127
169
  block={ block }
128
- onClick={ onClick }
129
- onToggleExpanded={ onToggleExpanded }
170
+ onClick={ selectEditorBlock }
171
+ onToggleExpanded={ toggleExpanded }
130
172
  isSelected={ isSelected }
131
173
  position={ position }
132
174
  siblingBlockCount={ siblingBlockCount }
@@ -170,7 +212,7 @@ export default function ListViewBlock( {
170
212
  </>
171
213
  ) }
172
214
 
173
- { withExperimentalFeatures && (
215
+ { showBlockActions && (
174
216
  <TreeGridCell className={ listViewBlockSettingsClassName }>
175
217
  { ( { ref, tabIndex, onFocus } ) => (
176
218
  <BlockSettingsDropdown
@@ -183,7 +225,7 @@ export default function ListViewBlock( {
183
225
  onFocus,
184
226
  } }
185
227
  disableOpenOnArrowDown
186
- __experimentalSelectBlock={ onClick }
228
+ __experimentalSelectBlock={ selectEditorBlock }
187
229
  />
188
230
  ) }
189
231
  </TreeGridCell>
@@ -191,3 +233,5 @@ export default function ListViewBlock( {
191
233
  </ListViewLeaf>
192
234
  );
193
235
  }
236
+
237
+ export default memo( ListViewBlock );