@wordpress/block-editor 15.23.0 → 16.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 (684) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/build/autocompleters/block.cjs +10 -2
  3. package/build/autocompleters/block.cjs.map +2 -2
  4. package/build/components/background-image-control/index.cjs +0 -2
  5. package/build/components/background-image-control/index.cjs.map +2 -2
  6. package/build/components/block-canvas/index.cjs +6 -1
  7. package/build/components/block-canvas/index.cjs.map +2 -2
  8. package/build/components/block-controls/groups.cjs +3 -1
  9. package/build/components/block-controls/groups.cjs.map +2 -2
  10. package/build/components/block-edit/edit.cjs +10 -18
  11. package/build/components/block-edit/edit.cjs.map +2 -2
  12. package/build/components/block-inspector/edit-contents.cjs +3 -0
  13. package/build/components/block-inspector/edit-contents.cjs.map +3 -3
  14. package/build/components/block-inspector/index.cjs +2 -3
  15. package/build/components/block-inspector/index.cjs.map +2 -2
  16. package/build/components/block-list/block-invalid-warning.cjs +8 -19
  17. package/build/components/block-list/block-invalid-warning.cjs.map +2 -2
  18. package/build/components/block-list/block.cjs +9 -3
  19. package/build/components/block-list/block.cjs.map +3 -3
  20. package/build/components/block-list/index.cjs +1 -3
  21. package/build/components/block-list/index.cjs.map +2 -2
  22. package/build/components/block-list/use-block-props/index.cjs +3 -1
  23. package/build/components/block-list/use-block-props/index.cjs.map +2 -2
  24. package/build/components/block-list/use-block-props/use-focus-first-element.cjs +9 -4
  25. package/build/components/block-list/use-block-props/use-focus-first-element.cjs.map +2 -2
  26. package/build/components/block-list/use-block-props/use-focus-handler.cjs +12 -4
  27. package/build/components/block-list/use-block-props/use-focus-handler.cjs.map +2 -2
  28. package/build/components/block-styles/use-styles-for-block.cjs +2 -1
  29. package/build/components/block-styles/use-styles-for-block.cjs.map +2 -2
  30. package/build/components/block-title/use-block-display-title.cjs +7 -2
  31. package/build/components/block-title/use-block-display-title.cjs.map +2 -2
  32. package/build/components/block-toolbar/block-toolbar-icon.cjs +10 -14
  33. package/build/components/block-toolbar/block-toolbar-icon.cjs.map +2 -2
  34. package/build/components/block-toolbar/index.cjs +43 -24
  35. package/build/components/block-toolbar/index.cjs.map +2 -2
  36. package/build/components/block-tools/index.cjs +7 -2
  37. package/build/components/block-tools/index.cjs.map +2 -2
  38. package/build/components/block-variation-transforms/index.cjs +0 -1
  39. package/build/components/block-variation-transforms/index.cjs.map +2 -2
  40. package/build/components/block-visibility/modal.cjs +20 -6
  41. package/build/components/block-visibility/modal.cjs.map +2 -2
  42. package/build/components/block-visibility/use-block-visibility.cjs +16 -6
  43. package/build/components/block-visibility/use-block-visibility.cjs.map +3 -3
  44. package/build/components/block-visibility/utils.cjs +15 -2
  45. package/build/components/block-visibility/utils.cjs.map +3 -3
  46. package/build/components/block-visibility/viewport-menu-item.cjs +7 -1
  47. package/build/components/block-visibility/viewport-menu-item.cjs.map +2 -2
  48. package/build/components/block-visibility/viewport-toolbar.cjs +5 -0
  49. package/build/components/block-visibility/viewport-toolbar.cjs.map +2 -2
  50. package/build/components/block-visibility/viewport-visibility-info.cjs +5 -1
  51. package/build/components/block-visibility/viewport-visibility-info.cjs.map +2 -2
  52. package/build/components/child-layout-control/index.cjs +0 -6
  53. package/build/components/child-layout-control/index.cjs.map +2 -2
  54. package/build/components/colors-gradients/control.cjs +5 -5
  55. package/build/components/colors-gradients/control.cjs.map +2 -2
  56. package/build/components/date-format-picker/index.cjs +0 -1
  57. package/build/components/date-format-picker/index.cjs.map +2 -2
  58. package/build/components/dimensions-tool/aspect-ratio-tool.cjs +1 -2
  59. package/build/components/dimensions-tool/aspect-ratio-tool.cjs.map +2 -2
  60. package/build/components/dimensions-tool/scale-tool.cjs +0 -1
  61. package/build/components/dimensions-tool/scale-tool.cjs.map +2 -2
  62. package/build/components/dimensions-tool/width-height-tool.cjs +2 -4
  63. package/build/components/dimensions-tool/width-height-tool.cjs.map +2 -2
  64. package/build/components/font-appearance-control/index.cjs +6 -25
  65. package/build/components/font-appearance-control/index.cjs.map +3 -3
  66. package/build/components/font-family/index.cjs +6 -15
  67. package/build/components/font-family/index.cjs.map +3 -3
  68. package/build/components/font-sizes/font-size-picker.cjs +1 -2
  69. package/build/components/font-sizes/font-size-picker.cjs.map +2 -2
  70. package/build/components/global-styles/border-panel.cjs +0 -1
  71. package/build/components/global-styles/border-panel.cjs.map +2 -2
  72. package/build/components/global-styles/dimensions-panel.cjs +0 -3
  73. package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
  74. package/build/components/global-styles/state-control-badges.cjs +39 -3
  75. package/build/components/global-styles/state-control-badges.cjs.map +2 -2
  76. package/build/components/global-styles/typography-panel.cjs +4 -11
  77. package/build/components/global-styles/typography-panel.cjs.map +2 -2
  78. package/build/components/height-control/index.cjs +0 -2
  79. package/build/components/height-control/index.cjs.map +2 -2
  80. package/build/components/html-element-control/index.cjs +0 -1
  81. package/build/components/html-element-control/index.cjs.map +2 -2
  82. package/build/components/image-editor/index.cjs +5 -0
  83. package/build/components/image-editor/index.cjs.map +3 -3
  84. package/build/components/image-editor/zoom-dropdown.cjs +0 -1
  85. package/build/components/image-editor/zoom-dropdown.cjs.map +2 -2
  86. package/build/components/image-size-control/index.cjs +3 -7
  87. package/build/components/image-size-control/index.cjs.map +2 -2
  88. package/build/components/inner-content/index.cjs +107 -0
  89. package/build/components/inner-content/index.cjs.map +7 -0
  90. package/build/components/inserter/hooks/use-block-types-state.cjs +10 -2
  91. package/build/components/inserter/hooks/use-block-types-state.cjs.map +2 -2
  92. package/build/components/inserter/media-tab/hooks.cjs +67 -12
  93. package/build/components/inserter/media-tab/hooks.cjs.map +2 -2
  94. package/build/components/inserter/media-tab/media-list.cjs +3 -1
  95. package/build/components/inserter/media-tab/media-list.cjs.map +2 -2
  96. package/build/components/inserter/media-tab/media-panel.cjs +287 -28
  97. package/build/components/inserter/media-tab/media-panel.cjs.map +3 -3
  98. package/build/components/inserter/media-tab/media-preview.cjs +32 -17
  99. package/build/components/inserter/media-tab/media-preview.cjs.map +2 -2
  100. package/build/components/inserter/media-tab/media-tab.cjs +26 -6
  101. package/build/components/inserter/media-tab/media-tab.cjs.map +2 -2
  102. package/build/components/inserter/mobile-tab-navigation.cjs +6 -1
  103. package/build/components/inserter/mobile-tab-navigation.cjs.map +2 -2
  104. package/build/components/inserter/no-results.cjs +2 -2
  105. package/build/components/inserter/no-results.cjs.map +2 -2
  106. package/build/components/inserter/preview-panel.cjs +2 -1
  107. package/build/components/inserter/preview-panel.cjs.map +2 -2
  108. package/build/components/inserter-list-item/index.cjs +8 -2
  109. package/build/components/inserter-list-item/index.cjs.map +2 -2
  110. package/build/components/keyboard-shortcuts/index.cjs +19 -11
  111. package/build/components/keyboard-shortcuts/index.cjs.map +2 -2
  112. package/build/components/letter-spacing-control/index.cjs +0 -24
  113. package/build/components/letter-spacing-control/index.cjs.map +3 -3
  114. package/build/components/line-height-control/index.cjs +6 -22
  115. package/build/components/line-height-control/index.cjs.map +3 -3
  116. package/build/components/list-view/block-select-button.cjs +90 -84
  117. package/build/components/list-view/block-select-button.cjs.map +2 -2
  118. package/build/components/list-view/block.cjs +61 -21
  119. package/build/components/list-view/block.cjs.map +2 -2
  120. package/build/components/list-view/expander.cjs +1 -1
  121. package/build/components/list-view/expander.cjs.map +2 -2
  122. package/build/components/list-view/use-list-view-client-ids.cjs +2 -2
  123. package/build/components/list-view/use-list-view-client-ids.cjs.map +2 -2
  124. package/build/components/media-placeholder/index.cjs +0 -1
  125. package/build/components/media-placeholder/index.cjs.map +2 -2
  126. package/build/components/observe-typing/index.cjs +4 -3
  127. package/build/components/observe-typing/index.cjs.map +2 -2
  128. package/build/components/preset-input-control/custom-value-controls.cjs +1 -3
  129. package/build/components/preset-input-control/custom-value-controls.cjs.map +2 -2
  130. package/build/components/preset-input-control/index.cjs +1 -3
  131. package/build/components/preset-input-control/index.cjs.map +2 -2
  132. package/build/components/resolution-tool/index.cjs +1 -2
  133. package/build/components/resolution-tool/index.cjs.map +2 -2
  134. package/build/components/rich-text/event-listeners/before-input-rules.cjs +3 -4
  135. package/build/components/rich-text/event-listeners/before-input-rules.cjs.map +3 -3
  136. package/build/components/rich-text/event-listeners/delete.cjs +2 -3
  137. package/build/components/rich-text/event-listeners/delete.cjs.map +3 -3
  138. package/build/components/rich-text/event-listeners/enter.cjs +3 -2
  139. package/build/components/rich-text/event-listeners/enter.cjs.map +3 -3
  140. package/build/components/rich-text/event-listeners/input-events.cjs +3 -3
  141. package/build/components/rich-text/event-listeners/input-events.cjs.map +3 -3
  142. package/build/components/rich-text/event-listeners/input-rules.cjs +3 -4
  143. package/build/components/rich-text/event-listeners/input-rules.cjs.map +3 -3
  144. package/build/components/rich-text/event-listeners/insert-replacement-text.cjs +3 -3
  145. package/build/components/rich-text/event-listeners/insert-replacement-text.cjs.map +3 -3
  146. package/build/components/rich-text/event-listeners/paste-handler.cjs +2 -1
  147. package/build/components/rich-text/event-listeners/paste-handler.cjs.map +3 -3
  148. package/build/components/rich-text/event-listeners/remove-browser-shortcuts.cjs +3 -3
  149. package/build/components/rich-text/event-listeners/remove-browser-shortcuts.cjs.map +3 -3
  150. package/build/components/rich-text/event-listeners/shortcuts.cjs +3 -3
  151. package/build/components/rich-text/event-listeners/shortcuts.cjs.map +3 -3
  152. package/build/components/rich-text/event-listeners/undo-automatic-change.cjs +3 -3
  153. package/build/components/rich-text/event-listeners/undo-automatic-change.cjs.map +3 -3
  154. package/build/components/rich-text/index.cjs +66 -17
  155. package/build/components/rich-text/index.cjs.map +2 -2
  156. package/build/components/text-alignment-control/index.cjs +0 -1
  157. package/build/components/text-alignment-control/index.cjs.map +2 -2
  158. package/build/components/text-decoration-control/index.cjs +0 -1
  159. package/build/components/text-decoration-control/index.cjs.map +2 -2
  160. package/build/components/text-indent-control/index.cjs +0 -8
  161. package/build/components/text-indent-control/index.cjs.map +2 -2
  162. package/build/components/text-transform-control/index.cjs +0 -1
  163. package/build/components/text-transform-control/index.cjs.map +2 -2
  164. package/build/components/typewriter/index.cjs +129 -136
  165. package/build/components/typewriter/index.cjs.map +3 -3
  166. package/build/components/use-block-commands/index.cjs +21 -17
  167. package/build/components/use-block-commands/index.cjs.map +2 -2
  168. package/build/components/use-block-display-information/index.cjs +10 -8
  169. package/build/components/use-block-display-information/index.cjs.map +2 -2
  170. package/build/components/use-on-block-drop/index.cjs +3 -7
  171. package/build/components/use-on-block-drop/index.cjs.map +2 -2
  172. package/build/components/writing-flow/index.cjs +12 -1
  173. package/build/components/writing-flow/index.cjs.map +3 -3
  174. package/build/components/writing-flow/use-arrow-nav.cjs +18 -5
  175. package/build/components/writing-flow/use-arrow-nav.cjs.map +2 -2
  176. package/build/components/writing-flow/use-click-selection.cjs +2 -2
  177. package/build/components/writing-flow/use-click-selection.cjs.map +2 -2
  178. package/build/components/writing-flow/use-clipboard-handler.cjs +4 -1
  179. package/build/components/writing-flow/use-clipboard-handler.cjs.map +2 -2
  180. package/build/components/writing-flow/use-drag-selection.cjs +3 -8
  181. package/build/components/writing-flow/use-drag-selection.cjs.map +2 -2
  182. package/build/components/writing-flow/use-editable-root.cjs +112 -0
  183. package/build/components/writing-flow/use-editable-root.cjs.map +7 -0
  184. package/build/components/writing-flow/use-home-end.cjs +64 -0
  185. package/build/components/writing-flow/use-home-end.cjs.map +7 -0
  186. package/build/components/writing-flow/use-input.cjs +15 -5
  187. package/build/components/writing-flow/use-input.cjs.map +2 -2
  188. package/build/components/writing-flow/use-multi-selection.cjs +2 -2
  189. package/build/components/writing-flow/use-multi-selection.cjs.map +2 -2
  190. package/build/components/writing-flow/use-select-all.cjs +14 -2
  191. package/build/components/writing-flow/use-select-all.cjs.map +2 -2
  192. package/build/components/writing-flow/use-selection-observer.cjs +126 -20
  193. package/build/components/writing-flow/use-selection-observer.cjs.map +3 -3
  194. package/build/components/writing-flow/utils.cjs +39 -2
  195. package/build/components/writing-flow/utils.cjs.map +2 -2
  196. package/build/components/writing-mode-control/index.cjs +0 -1
  197. package/build/components/writing-mode-control/index.cjs.map +2 -2
  198. package/build/hooks/background.cjs +3 -2
  199. package/build/hooks/background.cjs.map +2 -2
  200. package/build/hooks/block-fields/rich-text/index.cjs +2 -3
  201. package/build/hooks/block-fields/rich-text/index.cjs.map +3 -3
  202. package/build/hooks/elements.cjs +1 -1
  203. package/build/hooks/elements.cjs.map +2 -2
  204. package/build/hooks/font-size.cjs +1 -2
  205. package/build/hooks/font-size.cjs.map +2 -2
  206. package/build/hooks/grid-visualizer.cjs +5 -3
  207. package/build/hooks/grid-visualizer.cjs.map +2 -2
  208. package/build/hooks/layout-child.cjs +22 -12
  209. package/build/hooks/layout-child.cjs.map +3 -3
  210. package/build/hooks/layout.cjs +33 -16
  211. package/build/hooks/layout.cjs.map +3 -3
  212. package/build/hooks/position.cjs +36 -16
  213. package/build/hooks/position.cjs.map +2 -2
  214. package/build/hooks/states.cjs +29 -12
  215. package/build/hooks/states.cjs.map +3 -3
  216. package/build/hooks/style.cjs +31 -9
  217. package/build/hooks/style.cjs.map +3 -3
  218. package/build/hooks/text-align.cjs +36 -6
  219. package/build/hooks/text-align.cjs.map +3 -3
  220. package/build/hooks/typography.cjs +1 -1
  221. package/build/hooks/typography.cjs.map +2 -2
  222. package/build/layouts/constrained.cjs +35 -27
  223. package/build/layouts/constrained.cjs.map +2 -2
  224. package/build/layouts/flex.cjs +27 -22
  225. package/build/layouts/flex.cjs.map +2 -2
  226. package/build/layouts/grid.cjs +51 -11
  227. package/build/layouts/grid.cjs.map +2 -2
  228. package/build/private-apis.cjs +4 -1
  229. package/build/private-apis.cjs.map +3 -3
  230. package/build/store/actions.cjs +2 -2
  231. package/build/store/actions.cjs.map +2 -2
  232. package/build/store/private-keys.cjs +3 -0
  233. package/build/store/private-keys.cjs.map +2 -2
  234. package/build/store/private-selectors.cjs +85 -6
  235. package/build/store/private-selectors.cjs.map +3 -3
  236. package/build/store/selectors.cjs +13 -0
  237. package/build/store/selectors.cjs.map +2 -2
  238. package/build/utils/block-bindings.cjs +29 -0
  239. package/build/utils/block-bindings.cjs.map +2 -2
  240. package/build/utils/dom.cjs +14 -0
  241. package/build/utils/dom.cjs.map +2 -2
  242. package/build-module/autocompleters/block.mjs +10 -2
  243. package/build-module/autocompleters/block.mjs.map +2 -2
  244. package/build-module/components/background-image-control/index.mjs +0 -2
  245. package/build-module/components/background-image-control/index.mjs.map +2 -2
  246. package/build-module/components/block-canvas/index.mjs +7 -2
  247. package/build-module/components/block-canvas/index.mjs.map +2 -2
  248. package/build-module/components/block-controls/groups.mjs +3 -1
  249. package/build-module/components/block-controls/groups.mjs.map +2 -2
  250. package/build-module/components/block-edit/edit.mjs +11 -18
  251. package/build-module/components/block-edit/edit.mjs.map +2 -2
  252. package/build-module/components/block-inspector/edit-contents.mjs +4 -1
  253. package/build-module/components/block-inspector/edit-contents.mjs.map +2 -2
  254. package/build-module/components/block-inspector/index.mjs +2 -3
  255. package/build-module/components/block-inspector/index.mjs.map +2 -2
  256. package/build-module/components/block-list/block-invalid-warning.mjs +8 -19
  257. package/build-module/components/block-list/block-invalid-warning.mjs.map +2 -2
  258. package/build-module/components/block-list/block.mjs +9 -3
  259. package/build-module/components/block-list/block.mjs.map +3 -3
  260. package/build-module/components/block-list/index.mjs +1 -3
  261. package/build-module/components/block-list/index.mjs.map +2 -2
  262. package/build-module/components/block-list/use-block-props/index.mjs +3 -1
  263. package/build-module/components/block-list/use-block-props/index.mjs.map +2 -2
  264. package/build-module/components/block-list/use-block-props/use-focus-first-element.mjs +9 -4
  265. package/build-module/components/block-list/use-block-props/use-focus-first-element.mjs.map +2 -2
  266. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs +12 -4
  267. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs.map +2 -2
  268. package/build-module/components/block-styles/use-styles-for-block.mjs +2 -1
  269. package/build-module/components/block-styles/use-styles-for-block.mjs.map +2 -2
  270. package/build-module/components/block-title/use-block-display-title.mjs +7 -2
  271. package/build-module/components/block-title/use-block-display-title.mjs.map +2 -2
  272. package/build-module/components/block-toolbar/block-toolbar-icon.mjs +10 -14
  273. package/build-module/components/block-toolbar/block-toolbar-icon.mjs.map +2 -2
  274. package/build-module/components/block-toolbar/index.mjs +43 -24
  275. package/build-module/components/block-toolbar/index.mjs.map +2 -2
  276. package/build-module/components/block-tools/index.mjs +7 -2
  277. package/build-module/components/block-tools/index.mjs.map +2 -2
  278. package/build-module/components/block-variation-transforms/index.mjs +0 -1
  279. package/build-module/components/block-variation-transforms/index.mjs.map +2 -2
  280. package/build-module/components/block-visibility/modal.mjs +22 -10
  281. package/build-module/components/block-visibility/modal.mjs.map +2 -2
  282. package/build-module/components/block-visibility/use-block-visibility.mjs +17 -7
  283. package/build-module/components/block-visibility/use-block-visibility.mjs.map +2 -2
  284. package/build-module/components/block-visibility/utils.mjs +18 -3
  285. package/build-module/components/block-visibility/utils.mjs.map +2 -2
  286. package/build-module/components/block-visibility/viewport-menu-item.mjs +7 -1
  287. package/build-module/components/block-visibility/viewport-menu-item.mjs.map +2 -2
  288. package/build-module/components/block-visibility/viewport-toolbar.mjs +5 -0
  289. package/build-module/components/block-visibility/viewport-toolbar.mjs.map +2 -2
  290. package/build-module/components/block-visibility/viewport-visibility-info.mjs +5 -1
  291. package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
  292. package/build-module/components/child-layout-control/index.mjs +0 -6
  293. package/build-module/components/child-layout-control/index.mjs.map +2 -2
  294. package/build-module/components/colors-gradients/control.mjs +5 -5
  295. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  296. package/build-module/components/date-format-picker/index.mjs +0 -1
  297. package/build-module/components/date-format-picker/index.mjs.map +2 -2
  298. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs +1 -2
  299. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs.map +2 -2
  300. package/build-module/components/dimensions-tool/scale-tool.mjs +0 -1
  301. package/build-module/components/dimensions-tool/scale-tool.mjs.map +2 -2
  302. package/build-module/components/dimensions-tool/width-height-tool.mjs +2 -4
  303. package/build-module/components/dimensions-tool/width-height-tool.mjs.map +2 -2
  304. package/build-module/components/font-appearance-control/index.mjs +6 -15
  305. package/build-module/components/font-appearance-control/index.mjs.map +2 -2
  306. package/build-module/components/font-family/index.mjs +6 -15
  307. package/build-module/components/font-family/index.mjs.map +2 -2
  308. package/build-module/components/font-sizes/font-size-picker.mjs +1 -2
  309. package/build-module/components/font-sizes/font-size-picker.mjs.map +2 -2
  310. package/build-module/components/global-styles/border-panel.mjs +0 -1
  311. package/build-module/components/global-styles/border-panel.mjs.map +2 -2
  312. package/build-module/components/global-styles/dimensions-panel.mjs +0 -3
  313. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  314. package/build-module/components/global-styles/state-control-badges.mjs +41 -5
  315. package/build-module/components/global-styles/state-control-badges.mjs.map +2 -2
  316. package/build-module/components/global-styles/typography-panel.mjs +4 -11
  317. package/build-module/components/global-styles/typography-panel.mjs.map +2 -2
  318. package/build-module/components/height-control/index.mjs +0 -2
  319. package/build-module/components/height-control/index.mjs.map +2 -2
  320. package/build-module/components/html-element-control/index.mjs +0 -1
  321. package/build-module/components/html-element-control/index.mjs.map +2 -2
  322. package/build-module/components/image-editor/index.mjs +5 -0
  323. package/build-module/components/image-editor/index.mjs.map +2 -2
  324. package/build-module/components/image-editor/zoom-dropdown.mjs +0 -1
  325. package/build-module/components/image-editor/zoom-dropdown.mjs.map +2 -2
  326. package/build-module/components/image-size-control/index.mjs +3 -7
  327. package/build-module/components/image-size-control/index.mjs.map +2 -2
  328. package/build-module/components/inner-content/index.mjs +82 -0
  329. package/build-module/components/inner-content/index.mjs.map +7 -0
  330. package/build-module/components/inserter/hooks/use-block-types-state.mjs +10 -2
  331. package/build-module/components/inserter/hooks/use-block-types-state.mjs.map +2 -2
  332. package/build-module/components/inserter/media-tab/hooks.mjs +66 -12
  333. package/build-module/components/inserter/media-tab/hooks.mjs.map +2 -2
  334. package/build-module/components/inserter/media-tab/media-list.mjs +3 -1
  335. package/build-module/components/inserter/media-tab/media-list.mjs.map +2 -2
  336. package/build-module/components/inserter/media-tab/media-panel.mjs +297 -32
  337. package/build-module/components/inserter/media-tab/media-panel.mjs.map +2 -2
  338. package/build-module/components/inserter/media-tab/media-preview.mjs +33 -18
  339. package/build-module/components/inserter/media-tab/media-preview.mjs.map +2 -2
  340. package/build-module/components/inserter/media-tab/media-tab.mjs +27 -7
  341. package/build-module/components/inserter/media-tab/media-tab.mjs.map +2 -2
  342. package/build-module/components/inserter/mobile-tab-navigation.mjs +6 -1
  343. package/build-module/components/inserter/mobile-tab-navigation.mjs.map +2 -2
  344. package/build-module/components/inserter/no-results.mjs +2 -2
  345. package/build-module/components/inserter/no-results.mjs.map +2 -2
  346. package/build-module/components/inserter/preview-panel.mjs +2 -1
  347. package/build-module/components/inserter/preview-panel.mjs.map +2 -2
  348. package/build-module/components/inserter-list-item/index.mjs +8 -2
  349. package/build-module/components/inserter-list-item/index.mjs.map +2 -2
  350. package/build-module/components/keyboard-shortcuts/index.mjs +19 -11
  351. package/build-module/components/keyboard-shortcuts/index.mjs.map +2 -2
  352. package/build-module/components/letter-spacing-control/index.mjs +0 -14
  353. package/build-module/components/letter-spacing-control/index.mjs.map +2 -2
  354. package/build-module/components/line-height-control/index.mjs +6 -12
  355. package/build-module/components/line-height-control/index.mjs.map +2 -2
  356. package/build-module/components/list-view/block-select-button.mjs +90 -84
  357. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  358. package/build-module/components/list-view/block.mjs +61 -21
  359. package/build-module/components/list-view/block.mjs.map +2 -2
  360. package/build-module/components/list-view/expander.mjs +1 -1
  361. package/build-module/components/list-view/expander.mjs.map +2 -2
  362. package/build-module/components/list-view/use-list-view-client-ids.mjs +2 -2
  363. package/build-module/components/list-view/use-list-view-client-ids.mjs.map +2 -2
  364. package/build-module/components/media-placeholder/index.mjs +0 -1
  365. package/build-module/components/media-placeholder/index.mjs.map +2 -2
  366. package/build-module/components/observe-typing/index.mjs +4 -3
  367. package/build-module/components/observe-typing/index.mjs.map +2 -2
  368. package/build-module/components/preset-input-control/custom-value-controls.mjs +1 -3
  369. package/build-module/components/preset-input-control/custom-value-controls.mjs.map +2 -2
  370. package/build-module/components/preset-input-control/index.mjs +1 -3
  371. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  372. package/build-module/components/resolution-tool/index.mjs +1 -2
  373. package/build-module/components/resolution-tool/index.mjs.map +2 -2
  374. package/build-module/components/rich-text/event-listeners/before-input-rules.mjs +8 -5
  375. package/build-module/components/rich-text/event-listeners/before-input-rules.mjs.map +2 -2
  376. package/build-module/components/rich-text/event-listeners/delete.mjs +7 -4
  377. package/build-module/components/rich-text/event-listeners/delete.mjs.map +2 -2
  378. package/build-module/components/rich-text/event-listeners/enter.mjs +8 -3
  379. package/build-module/components/rich-text/event-listeners/enter.mjs.map +2 -2
  380. package/build-module/components/rich-text/event-listeners/input-events.mjs +3 -3
  381. package/build-module/components/rich-text/event-listeners/input-events.mjs.map +2 -2
  382. package/build-module/components/rich-text/event-listeners/input-rules.mjs +8 -5
  383. package/build-module/components/rich-text/event-listeners/input-rules.mjs.map +2 -2
  384. package/build-module/components/rich-text/event-listeners/insert-replacement-text.mjs +3 -3
  385. package/build-module/components/rich-text/event-listeners/insert-replacement-text.mjs.map +2 -2
  386. package/build-module/components/rich-text/event-listeners/paste-handler.mjs +8 -2
  387. package/build-module/components/rich-text/event-listeners/paste-handler.mjs.map +2 -2
  388. package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.mjs +3 -3
  389. package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.mjs.map +2 -2
  390. package/build-module/components/rich-text/event-listeners/shortcuts.mjs +3 -3
  391. package/build-module/components/rich-text/event-listeners/shortcuts.mjs.map +2 -2
  392. package/build-module/components/rich-text/event-listeners/undo-automatic-change.mjs +3 -3
  393. package/build-module/components/rich-text/event-listeners/undo-automatic-change.mjs.map +2 -2
  394. package/build-module/components/rich-text/index.mjs +64 -13
  395. package/build-module/components/rich-text/index.mjs.map +2 -2
  396. package/build-module/components/text-alignment-control/index.mjs +0 -1
  397. package/build-module/components/text-alignment-control/index.mjs.map +2 -2
  398. package/build-module/components/text-decoration-control/index.mjs +0 -1
  399. package/build-module/components/text-decoration-control/index.mjs.map +2 -2
  400. package/build-module/components/text-indent-control/index.mjs +0 -8
  401. package/build-module/components/text-indent-control/index.mjs.map +2 -2
  402. package/build-module/components/text-transform-control/index.mjs +0 -1
  403. package/build-module/components/text-transform-control/index.mjs.map +2 -2
  404. package/build-module/components/typewriter/index.mjs +129 -136
  405. package/build-module/components/typewriter/index.mjs.map +2 -2
  406. package/build-module/components/use-block-commands/index.mjs +21 -17
  407. package/build-module/components/use-block-commands/index.mjs.map +2 -2
  408. package/build-module/components/use-block-display-information/index.mjs +10 -8
  409. package/build-module/components/use-block-display-information/index.mjs.map +2 -2
  410. package/build-module/components/use-on-block-drop/index.mjs +4 -7
  411. package/build-module/components/use-on-block-drop/index.mjs.map +2 -2
  412. package/build-module/components/writing-flow/index.mjs +12 -1
  413. package/build-module/components/writing-flow/index.mjs.map +2 -2
  414. package/build-module/components/writing-flow/use-arrow-nav.mjs +19 -6
  415. package/build-module/components/writing-flow/use-arrow-nav.mjs.map +2 -2
  416. package/build-module/components/writing-flow/use-click-selection.mjs +2 -2
  417. package/build-module/components/writing-flow/use-click-selection.mjs.map +2 -2
  418. package/build-module/components/writing-flow/use-clipboard-handler.mjs +5 -2
  419. package/build-module/components/writing-flow/use-clipboard-handler.mjs.map +2 -2
  420. package/build-module/components/writing-flow/use-drag-selection.mjs +1 -6
  421. package/build-module/components/writing-flow/use-drag-selection.mjs.map +2 -2
  422. package/build-module/components/writing-flow/use-editable-root.mjs +86 -0
  423. package/build-module/components/writing-flow/use-editable-root.mjs.map +7 -0
  424. package/build-module/components/writing-flow/use-home-end.mjs +43 -0
  425. package/build-module/components/writing-flow/use-home-end.mjs.map +7 -0
  426. package/build-module/components/writing-flow/use-input.mjs +15 -5
  427. package/build-module/components/writing-flow/use-input.mjs.map +2 -2
  428. package/build-module/components/writing-flow/use-multi-selection.mjs +2 -2
  429. package/build-module/components/writing-flow/use-multi-selection.mjs.map +2 -2
  430. package/build-module/components/writing-flow/use-select-all.mjs +19 -3
  431. package/build-module/components/writing-flow/use-select-all.mjs.map +2 -2
  432. package/build-module/components/writing-flow/use-selection-observer.mjs +128 -19
  433. package/build-module/components/writing-flow/use-selection-observer.mjs.map +2 -2
  434. package/build-module/components/writing-flow/utils.mjs +35 -1
  435. package/build-module/components/writing-flow/utils.mjs.map +2 -2
  436. package/build-module/components/writing-mode-control/index.mjs +0 -1
  437. package/build-module/components/writing-mode-control/index.mjs.map +2 -2
  438. package/build-module/hooks/background.mjs +3 -2
  439. package/build-module/hooks/background.mjs.map +2 -2
  440. package/build-module/hooks/block-fields/rich-text/index.mjs +2 -6
  441. package/build-module/hooks/block-fields/rich-text/index.mjs.map +2 -2
  442. package/build-module/hooks/elements.mjs +1 -1
  443. package/build-module/hooks/elements.mjs.map +2 -2
  444. package/build-module/hooks/font-size.mjs +1 -2
  445. package/build-module/hooks/font-size.mjs.map +2 -2
  446. package/build-module/hooks/grid-visualizer.mjs +5 -3
  447. package/build-module/hooks/grid-visualizer.mjs.map +2 -2
  448. package/build-module/hooks/layout-child.mjs +22 -12
  449. package/build-module/hooks/layout-child.mjs.map +2 -2
  450. package/build-module/hooks/layout.mjs +32 -16
  451. package/build-module/hooks/layout.mjs.map +2 -2
  452. package/build-module/hooks/position.mjs +38 -18
  453. package/build-module/hooks/position.mjs.map +2 -2
  454. package/build-module/hooks/states.mjs +29 -12
  455. package/build-module/hooks/states.mjs.map +2 -2
  456. package/build-module/hooks/style.mjs +40 -11
  457. package/build-module/hooks/style.mjs.map +2 -2
  458. package/build-module/hooks/text-align.mjs +39 -10
  459. package/build-module/hooks/text-align.mjs.map +2 -2
  460. package/build-module/hooks/typography.mjs +1 -1
  461. package/build-module/hooks/typography.mjs.map +2 -2
  462. package/build-module/layouts/constrained.mjs +35 -27
  463. package/build-module/layouts/constrained.mjs.map +2 -2
  464. package/build-module/layouts/flex.mjs +27 -22
  465. package/build-module/layouts/flex.mjs.map +2 -2
  466. package/build-module/layouts/grid.mjs +52 -11
  467. package/build-module/layouts/grid.mjs.map +2 -2
  468. package/build-module/private-apis.mjs +5 -1
  469. package/build-module/private-apis.mjs.map +2 -2
  470. package/build-module/store/actions.mjs +3 -3
  471. package/build-module/store/actions.mjs.map +2 -2
  472. package/build-module/store/private-keys.mjs +2 -0
  473. package/build-module/store/private-keys.mjs.map +2 -2
  474. package/build-module/store/private-selectors.mjs +84 -6
  475. package/build-module/store/private-selectors.mjs.map +2 -2
  476. package/build-module/store/selectors.mjs +13 -0
  477. package/build-module/store/selectors.mjs.map +2 -2
  478. package/build-module/utils/block-bindings.mjs +28 -0
  479. package/build-module/utils/block-bindings.mjs.map +2 -2
  480. package/build-module/utils/dom.mjs +13 -0
  481. package/build-module/utils/dom.mjs.map +2 -2
  482. package/build-style/content-rtl.css +15 -14
  483. package/build-style/content.css +15 -14
  484. package/build-style/default-editor-styles-rtl.css +1 -1
  485. package/build-style/default-editor-styles.css +1 -1
  486. package/build-style/style-rtl.css +144 -47
  487. package/build-style/style.css +144 -47
  488. package/build-types/components/block-context/index.d.ts +7 -0
  489. package/build-types/components/block-context/index.d.ts.map +1 -1
  490. package/build-types/utils/block-bindings.d.ts +19 -0
  491. package/build-types/utils/block-bindings.d.ts.map +1 -1
  492. package/build-types/utils/dom.d.ts +11 -0
  493. package/build-types/utils/dom.d.ts.map +1 -1
  494. package/build-types/utils/get-px-from-css-unit.d.ts +2 -2
  495. package/build-types/utils/get-px-from-css-unit.d.ts.map +1 -1
  496. package/build-types/utils/pasting.d.ts +1 -1
  497. package/build-types/utils/pasting.d.ts.map +1 -1
  498. package/package.json +46 -44
  499. package/src/autocompleters/block.js +10 -3
  500. package/src/autocompleters/test/block.js +53 -0
  501. package/src/components/background-image-control/index.js +0 -2
  502. package/src/components/block-canvas/index.js +9 -2
  503. package/src/components/block-card/style.scss +1 -1
  504. package/src/components/block-controls/groups.js +2 -0
  505. package/src/components/block-edit/edit.js +13 -31
  506. package/src/components/block-inspector/edit-contents.js +5 -1
  507. package/src/components/block-inspector/index.js +3 -2
  508. package/src/components/block-list/block-invalid-warning.js +8 -19
  509. package/src/components/block-list/block.js +6 -0
  510. package/src/components/block-list/index.js +0 -2
  511. package/src/components/block-list/use-block-props/index.js +2 -0
  512. package/src/components/block-list/use-block-props/use-focus-first-element.js +23 -4
  513. package/src/components/block-list/use-block-props/use-focus-handler.js +34 -9
  514. package/src/components/block-lock/style.scss +1 -1
  515. package/src/components/block-manager/style.scss +1 -1
  516. package/src/components/block-navigation/style.scss +1 -1
  517. package/src/components/block-patterns-list/stories/index.story.jsx +1 -1
  518. package/src/components/block-quick-navigation/style.scss +1 -3
  519. package/src/components/block-styles/style.scss +2 -2
  520. package/src/components/block-styles/use-styles-for-block.js +1 -0
  521. package/src/components/block-title/use-block-display-title.js +7 -2
  522. package/src/components/block-toolbar/block-toolbar-icon.js +11 -16
  523. package/src/components/block-toolbar/index.js +41 -18
  524. package/src/components/block-toolbar/test/block-toolbar-icon.js +32 -9
  525. package/src/components/block-tools/index.js +7 -0
  526. package/src/components/block-types-list/style.scss +0 -1
  527. package/src/components/block-variation-transforms/index.js +0 -1
  528. package/src/components/block-visibility/modal.js +24 -10
  529. package/src/components/block-visibility/style.scss +1 -1
  530. package/src/components/block-visibility/test/use-block-visibility.js +128 -35
  531. package/src/components/block-visibility/test/utils.js +11 -0
  532. package/src/components/block-visibility/use-block-visibility.js +33 -11
  533. package/src/components/block-visibility/utils.js +31 -6
  534. package/src/components/block-visibility/viewport-menu-item.js +10 -1
  535. package/src/components/block-visibility/viewport-toolbar.js +6 -0
  536. package/src/components/block-visibility/viewport-visibility-info.js +5 -1
  537. package/src/components/button-block-appender/content.scss +1 -7
  538. package/src/components/child-layout-control/index.js +0 -6
  539. package/src/components/color-palette/test/__snapshots__/control.js.snap +13 -108
  540. package/src/components/colors-gradients/control.js +4 -4
  541. package/src/components/colors-gradients/style.scss +2 -2
  542. package/src/components/date-format-picker/index.js +0 -1
  543. package/src/components/dimensions-tool/aspect-ratio-tool.js +0 -1
  544. package/src/components/dimensions-tool/scale-tool.js +0 -1
  545. package/src/components/dimensions-tool/width-height-tool.js +0 -2
  546. package/src/components/font-appearance-control/index.js +6 -19
  547. package/src/components/font-family/README.md +0 -9
  548. package/src/components/font-family/index.js +6 -19
  549. package/src/components/font-family/stories/index.story.jsx +1 -2
  550. package/src/components/font-sizes/font-size-picker.js +0 -1
  551. package/src/components/global-styles/border-panel.js +0 -1
  552. package/src/components/global-styles/dimensions-panel.js +0 -3
  553. package/src/components/global-styles/state-control-badges.js +45 -6
  554. package/src/components/global-styles/style.scss +5 -0
  555. package/src/components/global-styles/test/state-control-badges.js +65 -0
  556. package/src/components/global-styles/typography-panel.js +0 -7
  557. package/src/components/height-control/index.js +0 -2
  558. package/src/components/html-element-control/index.js +0 -1
  559. package/src/components/iframe/content.scss +3 -3
  560. package/src/components/image-editor/index.js +22 -0
  561. package/src/components/image-editor/zoom-dropdown.js +0 -1
  562. package/src/components/image-size-control/index.js +0 -4
  563. package/src/components/inner-content/index.js +119 -0
  564. package/src/components/inner-content/test/index.js +81 -0
  565. package/src/components/inserter/hooks/use-block-types-state.js +10 -2
  566. package/src/components/inserter/media-tab/hooks.js +114 -16
  567. package/src/components/inserter/media-tab/media-list.js +2 -0
  568. package/src/components/inserter/media-tab/media-panel.js +354 -19
  569. package/src/components/inserter/media-tab/media-preview.js +34 -17
  570. package/src/components/inserter/media-tab/media-tab.js +20 -2
  571. package/src/components/inserter/media-tab/test/hooks.js +267 -0
  572. package/src/components/inserter/media-tab/test/media-panel.js +127 -0
  573. package/src/components/inserter/mobile-tab-navigation.js +6 -1
  574. package/src/components/inserter/no-results.js +2 -2
  575. package/src/components/inserter/preview-panel.js +1 -0
  576. package/src/components/inserter/style.scss +115 -3
  577. package/src/components/inserter-list-item/index.js +8 -2
  578. package/src/components/inserter-list-item/style.scss +0 -15
  579. package/src/components/keyboard-shortcuts/index.js +28 -11
  580. package/src/components/letter-spacing-control/README.md +0 -8
  581. package/src/components/letter-spacing-control/index.js +5 -23
  582. package/src/components/letter-spacing-control/stories/index.story.jsx +0 -12
  583. package/src/components/line-height-control/README.md +0 -8
  584. package/src/components/line-height-control/index.js +6 -16
  585. package/src/components/line-height-control/stories/index.story.jsx +0 -1
  586. package/src/components/line-height-control/test/index.js +1 -7
  587. package/src/components/link-control/style.scss +2 -2
  588. package/src/components/link-control/test/index.js +6 -6
  589. package/src/components/link-picker/style.scss +1 -2
  590. package/src/components/link-picker/test/index.js +3 -1
  591. package/src/components/list-view/block-select-button.js +5 -1
  592. package/src/components/list-view/block.js +69 -23
  593. package/src/components/list-view/expander.js +5 -1
  594. package/src/components/list-view/style.scss +23 -5
  595. package/src/components/list-view/use-list-view-client-ids.js +2 -2
  596. package/src/components/media-placeholder/index.js +0 -1
  597. package/src/components/multi-selection-inspector/style.scss +1 -1
  598. package/src/components/observe-typing/index.js +9 -4
  599. package/src/components/preset-input-control/custom-value-controls.js +0 -2
  600. package/src/components/preset-input-control/index.js +0 -2
  601. package/src/components/resolution-tool/index.js +0 -1
  602. package/src/components/responsive-block-control/style.scss +1 -1
  603. package/src/components/responsive-block-control/test/index.js +1 -5
  604. package/src/components/rich-text/event-listeners/before-input-rules.js +8 -5
  605. package/src/components/rich-text/event-listeners/delete.js +7 -4
  606. package/src/components/rich-text/event-listeners/enter.js +10 -4
  607. package/src/components/rich-text/event-listeners/input-events.js +4 -3
  608. package/src/components/rich-text/event-listeners/input-rules.js +8 -5
  609. package/src/components/rich-text/event-listeners/insert-replacement-text.js +4 -3
  610. package/src/components/rich-text/event-listeners/paste-handler.js +15 -3
  611. package/src/components/rich-text/event-listeners/remove-browser-shortcuts.js +4 -3
  612. package/src/components/rich-text/event-listeners/shortcuts.js +4 -3
  613. package/src/components/rich-text/event-listeners/undo-automatic-change.js +4 -3
  614. package/src/components/rich-text/index.js +94 -25
  615. package/src/components/skip-to-selected-block/style.scss +1 -1
  616. package/src/components/text-alignment-control/index.js +0 -1
  617. package/src/components/text-decoration-control/index.js +0 -1
  618. package/src/components/text-indent-control/index.js +7 -16
  619. package/src/components/text-transform-control/index.js +0 -1
  620. package/src/components/typewriter/index.js +228 -224
  621. package/src/components/use-block-commands/index.js +27 -17
  622. package/src/components/use-block-display-information/index.js +9 -13
  623. package/src/components/use-block-display-information/test/index.js +47 -9
  624. package/src/components/use-on-block-drop/index.js +4 -7
  625. package/src/components/writing-flow/index.js +15 -1
  626. package/src/components/writing-flow/use-arrow-nav.js +39 -12
  627. package/src/components/writing-flow/use-click-selection.js +2 -3
  628. package/src/components/writing-flow/use-clipboard-handler.js +5 -2
  629. package/src/components/writing-flow/use-drag-selection.js +1 -14
  630. package/src/components/writing-flow/use-editable-root.js +182 -0
  631. package/src/components/writing-flow/use-home-end.js +63 -0
  632. package/src/components/writing-flow/use-input.js +25 -8
  633. package/src/components/writing-flow/use-multi-selection.js +2 -3
  634. package/src/components/writing-flow/use-select-all.js +33 -3
  635. package/src/components/writing-flow/use-selection-observer.js +197 -38
  636. package/src/components/writing-flow/utils.js +83 -0
  637. package/src/components/writing-mode-control/index.js +0 -1
  638. package/src/hooks/background.js +7 -9
  639. package/src/hooks/block-fields/link/styles.scss +1 -6
  640. package/src/hooks/block-fields/media/styles.scss +1 -6
  641. package/src/hooks/block-fields/rich-text/index.js +6 -9
  642. package/src/hooks/block-hooks.scss +15 -0
  643. package/src/hooks/elements.js +0 -1
  644. package/src/hooks/font-size.js +0 -1
  645. package/src/hooks/grid-visualizer.js +40 -36
  646. package/src/hooks/layout-child.js +19 -9
  647. package/src/hooks/layout.js +53 -35
  648. package/src/hooks/position.js +44 -23
  649. package/src/hooks/states.js +36 -13
  650. package/src/hooks/style.js +67 -17
  651. package/src/hooks/test/cross-origin-isolation.js +0 -4
  652. package/src/hooks/test/layout.js +75 -1
  653. package/src/hooks/test/style.js +29 -0
  654. package/src/hooks/test/text-align.js +34 -1
  655. package/src/hooks/text-align.js +41 -10
  656. package/src/hooks/typography.js +0 -1
  657. package/src/layouts/constrained.js +56 -29
  658. package/src/layouts/flex.js +5 -4
  659. package/src/layouts/grid.js +59 -9
  660. package/src/layouts/test/constrained.js +91 -0
  661. package/src/layouts/test/grid.js +71 -0
  662. package/src/private-apis.js +4 -0
  663. package/src/store/actions.js +43 -14
  664. package/src/store/private-keys.js +1 -0
  665. package/src/store/private-selectors.js +166 -9
  666. package/src/store/selectors.js +41 -0
  667. package/src/store/test/actions.js +1 -1
  668. package/src/store/test/private-selectors.js +533 -0
  669. package/src/store/test/reducer.js +11 -11
  670. package/src/store/test/selectors.js +133 -0
  671. package/src/style.scss +1 -0
  672. package/src/utils/block-bindings.ts +50 -0
  673. package/src/utils/dom.ts +33 -0
  674. package/src/utils/test/block-bindings.js +181 -0
  675. package/build/components/rich-text/input-event.cjs +0 -50
  676. package/build/components/rich-text/input-event.cjs.map +0 -7
  677. package/build/components/rich-text/shortcut.cjs +0 -51
  678. package/build/components/rich-text/shortcut.cjs.map +0 -7
  679. package/build-module/components/rich-text/input-event.mjs +0 -25
  680. package/build-module/components/rich-text/input-event.mjs.map +0 -7
  681. package/build-module/components/rich-text/shortcut.mjs +0 -26
  682. package/build-module/components/rich-text/shortcut.mjs.map +0 -7
  683. package/src/components/rich-text/input-event.js +0 -31
  684. package/src/components/rich-text/shortcut.js +0 -32
@@ -10,7 +10,11 @@ import { useRefEffect } from '@wordpress/compose';
10
10
  * Internal dependencies
11
11
  */
12
12
  import { store as blockEditorStore } from '../../store';
13
- import { isInsideRootBlock, getBlockClientId } from '../../utils/dom';
13
+ import {
14
+ isInsideRootBlock,
15
+ getBlockClientId,
16
+ getSelectionEditableElement,
17
+ } from '../../utils/dom';
14
18
 
15
19
  export default function useSelectAll() {
16
20
  const { getBlockOrder, getSelectedBlockClientIds, getBlockRootClientId } =
@@ -25,17 +29,43 @@ export default function useSelectAll() {
25
29
  }
26
30
 
27
31
  const selectedClientIds = getSelectedBlockClientIds();
32
+ const { ownerDocument } = node;
33
+ const selection = ownerDocument.defaultView.getSelection();
34
+ // When the wrapper is contentEditable and holds focus (the
35
+ // selected block supports `editableRoot`), the event targets the
36
+ // wrapper; resolve the editable element containing the selection.
37
+ const editable =
38
+ ( event.target === node &&
39
+ getSelectionEditableElement( selection, node ) ) ||
40
+ event.target;
28
41
 
29
42
  if (
30
43
  selectedClientIds.length < 2 &&
31
- ! isEntirelySelected( event.target )
44
+ ! isEntirelySelected( editable )
32
45
  ) {
46
+ // While the wrapper is contentEditable, the browser default
47
+ // would select the entire canvas. Select the contents of the
48
+ // editable element instead, like the default does when the
49
+ // element itself holds focus.
50
+ if ( event.target === node && editable !== node ) {
51
+ event.preventDefault();
52
+ const range = ownerDocument.createRange();
53
+ range.selectNodeContents( editable );
54
+ selection.removeAllRanges();
55
+ selection.addRange( range );
56
+ // The native `selectionchange` event is asynchronous;
57
+ // dispatch it synchronously so that listeners depending
58
+ // on it (e.g. the rich text internal record sync) run
59
+ // before any event following this one.
60
+ ownerDocument.dispatchEvent(
61
+ new Event( 'selectionchange' )
62
+ );
63
+ }
33
64
  return;
34
65
  }
35
66
 
36
67
  event.preventDefault();
37
68
 
38
- const { ownerDocument } = event.target;
39
69
  const [ firstSelectedClientId ] = selectedClientIds;
40
70
  const activeClientId = getBlockClientId(
41
71
  ownerDocument.activeElement
@@ -3,7 +3,10 @@
3
3
  */
4
4
  import { useSelect, useDispatch } from '@wordpress/data';
5
5
  import { useRefEffect } from '@wordpress/compose';
6
- import { create } from '@wordpress/rich-text';
6
+ import {
7
+ create,
8
+ privateApis as richTextPrivateApis,
9
+ } from '@wordpress/rich-text';
7
10
  import { isSelectionForward } from '@wordpress/dom';
8
11
 
9
12
  /**
@@ -11,6 +14,11 @@ import { isSelectionForward } from '@wordpress/dom';
11
14
  */
12
15
  import { store as blockEditorStore } from '../../store';
13
16
  import { getBlockClientId } from '../../utils/dom';
17
+ import { canHostEditableRoot } from './use-editable-root';
18
+ import { setContentEditableWrapper, setShiftClickInProgress } from './utils';
19
+ import { unlock } from '../../lock-unlock';
20
+
21
+ const { ownsSelection } = unlock( richTextPrivateApis );
14
22
 
15
23
  /**
16
24
  * Extract the selection start node from the selection. When the anchor node is
@@ -39,11 +47,13 @@ function extractSelectionStartNode( selection ) {
39
47
  * a text node, the selection offset is the index of a child node. The selection
40
48
  * reaches up to but excluding that child node.
41
49
  *
42
- * @param {Selection} selection The selection.
50
+ * @param {Selection} selection The selection.
51
+ * @param {boolean} isTripleClick Whether the selection comes from a triple
52
+ * click.
43
53
  *
44
54
  * @return {Element} The selection start node.
45
55
  */
46
- function extractSelectionEndNode( selection ) {
56
+ function extractSelectionEndNode( selection, isTripleClick ) {
47
57
  const { focusNode, focusOffset } = selection;
48
58
 
49
59
  if ( focusNode.nodeType === focusNode.TEXT_NODE ) {
@@ -54,11 +64,18 @@ function extractSelectionEndNode( selection ) {
54
64
  return focusNode;
55
65
  }
56
66
 
57
- // When the selection is forward (the selection ends with the focus node),
58
- // the selection may extend into the next element with an offset of 0. This
59
- // may trigger multi selection even though the selection does not visually
60
- // end in the next block.
61
- if ( focusOffset === 0 && isSelectionForward( selection ) ) {
67
+ // A triple click selects the paragraph, but the browser extends the
68
+ // forward selection into the next element at an offset of 0. This may
69
+ // trigger multi selection even though the selection does not visually end
70
+ // in the next block. Keyboard selections that legitimately extend to the
71
+ // same boundary (e.g. Shift+ArrowDown into a focusable block, where the
72
+ // browser reports the boundary at the element instead of its first text
73
+ // position) must not be corrected, so only do this for triple clicks.
74
+ if (
75
+ focusOffset === 0 &&
76
+ isSelectionForward( selection ) &&
77
+ isTripleClick
78
+ ) {
62
79
  return focusNode.previousSibling ?? focusNode.parentElement;
63
80
  }
64
81
 
@@ -75,26 +92,6 @@ function findDepth( a, b ) {
75
92
  return depth;
76
93
  }
77
94
 
78
- /**
79
- * Sets the `contenteditable` wrapper element to `value`.
80
- *
81
- * @param {HTMLElement} node Block element.
82
- * @param {boolean} value `contentEditable` value (true or false)
83
- */
84
- function setContentEditableWrapper( node, value ) {
85
- // Since we are calling this on every selection change, check if the value
86
- // needs to be updated first because it trigger the browser to recalculate
87
- // style.
88
- if ( node.contentEditable !== String( value ) ) {
89
- node.contentEditable = value;
90
-
91
- // Firefox doesn't automatically move focus.
92
- if ( value ) {
93
- node.focus();
94
- }
95
- }
96
- }
97
-
98
95
  function getRichTextElement( node ) {
99
96
  const element =
100
97
  node.nodeType === node.ELEMENT_NODE ? node : node.parentElement;
@@ -107,13 +104,32 @@ function getRichTextElement( node ) {
107
104
  export default function useSelectionObserver() {
108
105
  const { multiSelect, selectBlock, selectionChange } =
109
106
  useDispatch( blockEditorStore );
110
- const { getBlockParents, getBlockSelectionStart, isMultiSelecting } =
111
- useSelect( blockEditorStore );
107
+ const blockEditorSelectors = useSelect( blockEditorStore );
108
+ const {
109
+ getBlockParents,
110
+ getBlockSelectionStart,
111
+ isMultiSelecting,
112
+ getSelectionStart,
113
+ getSelectionEnd,
114
+ getSelectedBlockClientId,
115
+ } = blockEditorSelectors;
112
116
  return useRefEffect(
113
117
  ( node ) => {
114
118
  const { ownerDocument } = node;
115
119
  const { defaultView } = ownerDocument;
116
120
 
121
+ let isTripleClick = false;
122
+
123
+ function onMouseDown( event ) {
124
+ isTripleClick = event.detail === 3;
125
+ setShiftClickInProgress( event.shiftKey );
126
+ }
127
+
128
+ function onKeyDown() {
129
+ isTripleClick = false;
130
+ setShiftClickInProgress( false );
131
+ }
132
+
117
133
  function onSelectionChange( event ) {
118
134
  const selection = defaultView.getSelection();
119
135
 
@@ -122,7 +138,10 @@ export default function useSelectionObserver() {
122
138
  }
123
139
 
124
140
  const startNode = extractSelectionStartNode( selection );
125
- const endNode = extractSelectionEndNode( selection );
141
+ const endNode = extractSelectionEndNode(
142
+ selection,
143
+ isTripleClick
144
+ );
126
145
 
127
146
  if (
128
147
  ! node.contains( startNode ) ||
@@ -139,6 +158,49 @@ export default function useSelectionObserver() {
139
158
  // For now we check if the event is a `mouse` event.
140
159
  const isClickShift = event.shiftKey && event.type === 'mouseup';
141
160
  if ( selection.isCollapsed && ! isClickShift ) {
161
+ const collapsedClientId = getBlockClientId( startNode );
162
+
163
+ // If the block supports an editable root, keep (or make)
164
+ // the wrapper contentEditable so the native selection can
165
+ // extend across blocks. The wrapper holds focus, so rich
166
+ // text instances don't sync the selection; do it here.
167
+ if (
168
+ ! isMultiSelecting() &&
169
+ collapsedClientId &&
170
+ // Only keep the wrapper editable when the collapsed
171
+ // selection is in the block that is actually selected.
172
+ // A stale native selection may linger in a previously
173
+ // selected editable root block (e.g. Firefox does not
174
+ // always move it), which must not re-enable the wrapper
175
+ // after another block has been selected.
176
+ collapsedClientId === getSelectedBlockClientId() &&
177
+ canHostEditableRoot(
178
+ blockEditorSelectors,
179
+ collapsedClientId
180
+ )
181
+ ) {
182
+ setContentEditableWrapper( node, true );
183
+
184
+ // While the wrapper is editable it must hold focus: a
185
+ // nested editable element cannot retain it (the first
186
+ // DOM mutation moves focus to the host, inconsistently
187
+ // across browsers). Don't steal focus from UI elements
188
+ // (e.g. buttons) or editables outside the block (e.g.
189
+ // the post title). The rich text instance owning the
190
+ // selection syncs it to the store itself.
191
+ const { activeElement } = ownerDocument;
192
+ if (
193
+ activeElement !== node &&
194
+ activeElement?.isContentEditable &&
195
+ node.contains( activeElement ) &&
196
+ getBlockClientId( activeElement ) ===
197
+ collapsedClientId
198
+ ) {
199
+ node.focus();
200
+ }
201
+ return;
202
+ }
203
+
142
204
  if (
143
205
  node.contentEditable === 'true' &&
144
206
  ! isMultiSelecting()
@@ -210,7 +272,6 @@ export default function useSelectionObserver() {
210
272
  return;
211
273
  }
212
274
  }
213
-
214
275
  const isSingularSelection = startClientId === endClientId;
215
276
  if ( isSingularSelection ) {
216
277
  if ( ! isMultiSelecting() ) {
@@ -226,7 +287,16 @@ export default function useSelectionObserver() {
226
287
 
227
288
  if (
228
289
  richTextElement &&
229
- ownerDocument.activeElement !== richTextElement
290
+ // The rich text instance syncs the selection
291
+ // itself when its element is editable and owns the
292
+ // selection (also through a focused editing host).
293
+ // It may be temporarily non-editable while a drag
294
+ // that started outside it is in progress (see
295
+ // rich-text's preventFocusCapture).
296
+ ( richTextElement.contentEditable !== 'true' ||
297
+ ( ownerDocument.activeElement !==
298
+ richTextElement &&
299
+ ! ownsSelection( richTextElement ) ) )
230
300
  ) {
231
301
  const range = selection.getRangeAt( 0 );
232
302
  const richTextData = create( {
@@ -234,7 +304,7 @@ export default function useSelectionObserver() {
234
304
  range,
235
305
  __unstableIsEditableTree: true,
236
306
  } );
237
- selectionChange( {
307
+ const selectionUpdate = {
238
308
  start: {
239
309
  clientId: startClientId,
240
310
  attributeKey:
@@ -247,9 +317,34 @@ export default function useSelectionObserver() {
247
317
  attributeKey:
248
318
  richTextElement.dataset
249
319
  .wpBlockAttributeKey,
250
- offset: richTextData.end,
320
+ // Clamp the end offset to the element. A
321
+ // forward selection can overshoot past the
322
+ // rich text (e.g. a triple click extends
323
+ // into the next block at offset 0), leaving
324
+ // `end` undefined; that means the selection
325
+ // reaches through the end of this element's
326
+ // content.
327
+ offset:
328
+ richTextData.end ??
329
+ richTextData.text.length,
251
330
  },
252
- } );
331
+ };
332
+ const { start, end } = selectionUpdate;
333
+ const selectionStart = getSelectionStart();
334
+ const selectionEnd = getSelectionEnd();
335
+
336
+ // Skip the dispatch when the store already holds
337
+ // the same selection.
338
+ if (
339
+ selectionStart.clientId !== start.clientId ||
340
+ selectionEnd.clientId !== end.clientId ||
341
+ selectionStart.attributeKey !==
342
+ start.attributeKey ||
343
+ selectionStart.offset !== start.offset ||
344
+ selectionEnd.offset !== end.offset
345
+ ) {
346
+ selectionChange( selectionUpdate );
347
+ }
253
348
  } else {
254
349
  selectBlock( startClientId );
255
350
  }
@@ -318,17 +413,81 @@ export default function useSelectionObserver() {
318
413
  }
319
414
  }
320
415
 
416
+ // Native `selectionchange` events are asynchronous: a clipboard
417
+ // event may fire before the store has been updated with a cross
418
+ // block selection that was just made. Sync it before the clipboard
419
+ // handlers (bubble phase) read the store.
420
+ function ensureMultiBlockSelectionSync( event ) {
421
+ const selection = defaultView.getSelection();
422
+
423
+ if ( ! selection.rangeCount || selection.isCollapsed ) {
424
+ return;
425
+ }
426
+
427
+ // Only a selection across different blocks needs to be synced
428
+ // here; rich text owns selections within a single block.
429
+ const startClientId = getBlockClientId(
430
+ extractSelectionStartNode( selection )
431
+ );
432
+ const endClientId = getBlockClientId(
433
+ extractSelectionEndNode( selection, isTripleClick )
434
+ );
435
+
436
+ if ( startClientId !== endClientId ) {
437
+ onSelectionChange( event );
438
+ }
439
+ }
440
+
321
441
  ownerDocument.addEventListener(
322
442
  'selectionchange',
323
443
  onSelectionChange
324
444
  );
325
- defaultView.addEventListener( 'mouseup', onSelectionChange );
445
+ function onMouseUp( event ) {
446
+ onSelectionChange( event );
447
+ setShiftClickInProgress( false );
448
+ }
449
+
450
+ defaultView.addEventListener( 'mouseup', onMouseUp );
451
+ node.addEventListener( 'mousedown', onMouseDown );
452
+ node.addEventListener( 'keydown', onKeyDown );
453
+ ownerDocument.addEventListener(
454
+ 'copy',
455
+ ensureMultiBlockSelectionSync,
456
+ true
457
+ );
458
+ ownerDocument.addEventListener(
459
+ 'cut',
460
+ ensureMultiBlockSelectionSync,
461
+ true
462
+ );
463
+ ownerDocument.addEventListener(
464
+ 'paste',
465
+ ensureMultiBlockSelectionSync,
466
+ true
467
+ );
326
468
  return () => {
327
469
  ownerDocument.removeEventListener(
328
470
  'selectionchange',
329
471
  onSelectionChange
330
472
  );
331
- defaultView.removeEventListener( 'mouseup', onSelectionChange );
473
+ defaultView.removeEventListener( 'mouseup', onMouseUp );
474
+ node.removeEventListener( 'mousedown', onMouseDown );
475
+ node.removeEventListener( 'keydown', onKeyDown );
476
+ ownerDocument.removeEventListener(
477
+ 'copy',
478
+ ensureMultiBlockSelectionSync,
479
+ true
480
+ );
481
+ ownerDocument.removeEventListener(
482
+ 'cut',
483
+ ensureMultiBlockSelectionSync,
484
+ true
485
+ );
486
+ ownerDocument.removeEventListener(
487
+ 'paste',
488
+ ensureMultiBlockSelectionSync,
489
+ true
490
+ );
332
491
  };
333
492
  },
334
493
  [ multiSelect, selectBlock, selectionChange, getBlockParents ]
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
+ import { __ } from '@wordpress/i18n';
4
5
  import { __unstableStripHTML as stripHTML } from '@wordpress/dom';
5
6
  import {
6
7
  serialize,
@@ -116,3 +117,85 @@ function toPlainText( html ) {
116
117
  // Merge any consecutive line breaks
117
118
  return plainText.replace( /\n\n+/g, '\n\n' );
118
119
  }
120
+
121
+ let shiftClickInProgress = false;
122
+
123
+ /**
124
+ * Tracks whether a shift+click gesture is in progress, from the shift held
125
+ * mousedown until its mouseup. Maintained by the selection observer; read by
126
+ * the block focus handler, since the focus event fired between the two
127
+ * carries no modifier keys.
128
+ *
129
+ * @param {boolean} value Whether a shift+click gesture is in progress.
130
+ */
131
+ export function setShiftClickInProgress( value ) {
132
+ shiftClickInProgress = value;
133
+ }
134
+
135
+ /**
136
+ * Returns whether a shift+click gesture is in progress.
137
+ *
138
+ * @return {boolean} Whether a shift+click gesture is in progress.
139
+ */
140
+ export function isShiftClickInProgress() {
141
+ return shiftClickInProgress;
142
+ }
143
+
144
+ /**
145
+ * Makes the wrapper element an editing host, or stops it from being one. The
146
+ * ARIA attributes travel with the editability: while the wrapper is the
147
+ * active editing host it must present as a named multiline textbox, per the
148
+ * WAI-ARIA textbox role, which requires an accessible name.
149
+ *
150
+ * @param {HTMLElement} node Wrapper element.
151
+ * @param {boolean} value Whether the wrapper should be an
152
+ * editing host.
153
+ * @param {Object} options
154
+ * @param {boolean} options.focus Move focus to the wrapper when it
155
+ * becomes an editing host (Firefox does
156
+ * not automatically move it). Default
157
+ * true.
158
+ *
159
+ * @return {boolean} Whether the wrapper is an editing host now.
160
+ */
161
+ export function setContentEditableWrapper(
162
+ node,
163
+ value,
164
+ { focus = true } = {}
165
+ ) {
166
+ // Check first: this is called on every selection change, and setting
167
+ // contentEditable triggers a style recalculation.
168
+ if ( node.contentEditable === String( value ) ) {
169
+ return value;
170
+ }
171
+
172
+ node.contentEditable = value;
173
+
174
+ if ( ! value ) {
175
+ node.removeAttribute( 'role' );
176
+ node.removeAttribute( 'aria-multiline' );
177
+ node.removeAttribute( 'aria-label' );
178
+ return false;
179
+ }
180
+
181
+ // Only act as an editing host if the environment supports it (JSDOM
182
+ // does not implement contentEditable): without editing host semantics
183
+ // the wrapper must not claim focus or textbox semantics.
184
+ if ( ! node.isContentEditable ) {
185
+ node.removeAttribute( 'contenteditable' );
186
+ return false;
187
+ }
188
+
189
+ // Expose the host as a named multiline textbox so it has a role and
190
+ // accessible name once it takes focus. The label is generic because the
191
+ // host can span several blocks.
192
+ node.setAttribute( 'role', 'textbox' );
193
+ node.setAttribute( 'aria-multiline', 'true' );
194
+ node.setAttribute( 'aria-label', __( 'Editor canvas' ) );
195
+
196
+ if ( focus ) {
197
+ node.focus();
198
+ }
199
+
200
+ return true;
201
+ }
@@ -40,7 +40,6 @@ export default function WritingModeControl( { className, value, onChange } ) {
40
40
  return (
41
41
  <ToggleGroupControl
42
42
  isDeselectable
43
- __next40pxDefaultSize
44
43
  label={ __( 'Orientation' ) }
45
44
  className={ clsx( 'block-editor-writing-mode-control', className ) }
46
45
  value={ value }
@@ -234,13 +234,15 @@ export function BackgroundImagePanel( {
234
234
  },
235
235
  } ),
236
236
  };
237
+ const value = isStateSelected
238
+ ? getStyleForState( style, selectedState )
239
+ : styleValue;
237
240
 
238
241
  // Skipped for gradients, which can't be reliably evaluated for contrast.
239
242
  const enableContrastChecking =
240
- ! isStateSelected &&
241
- ! styleValue?.color?.gradient &&
242
- ! styleValue?.background?.gradient &&
243
- !! styleValue?.color?.background &&
243
+ ! value?.color?.gradient &&
244
+ ! value?.background?.gradient &&
245
+ !! value?.color?.background &&
244
246
  ( settings?.color?.text || settings?.color?.link ) &&
245
247
  false !== getBlockSupport( name, [ 'color', 'enableContrastChecker' ] );
246
248
 
@@ -386,11 +388,7 @@ export function BackgroundImagePanel( {
386
388
  settings={ updatedSettings }
387
389
  onChange={ onChange }
388
390
  defaultControls={ defaultControls }
389
- value={
390
- isStateSelected
391
- ? getStyleForState( style, selectedState )
392
- : styleValue
393
- }
391
+ value={ value }
394
392
  contrastWarning={ contrastWarning }
395
393
  />
396
394
  );
@@ -3,12 +3,7 @@
3
3
 
4
4
  .block-editor-content-only-controls__link {
5
5
  width: 100%;
6
- box-shadow: inset 0 0 0 $border-width $gray-400;
7
-
8
- &:focus:not(:disabled) {
9
- // Allow smooth transition between focused and unfocused box-shadow states.
10
- box-shadow: 0 0 0 currentColor inset, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
11
- }
6
+ border-color: $gray-400;
12
7
  }
13
8
 
14
9
  .block-editor-content-only-controls__link-row {
@@ -3,13 +3,8 @@
3
3
 
4
4
  .block-editor-content-only-controls__media {
5
5
  width: 100%;
6
- box-shadow: inset 0 0 0 $border-width $gray-400;
6
+ border-color: $gray-400;
7
7
  padding-right: $grid-unit-40;
8
-
9
- &:focus:not(:disabled) {
10
- // Allow smooth transition between focused and unfocused box-shadow states.
11
- box-shadow: 0 0 0 currentColor inset, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
12
- }
13
8
  }
14
9
 
15
10
  .block-editor-content-only-controls__media-replace-flow {
@@ -13,13 +13,10 @@ import { privateApis as richTextPrivateApis } from '@wordpress/rich-text';
13
13
  import { getAllowedFormats } from '../../../components/rich-text/utils';
14
14
  import { useEventListeners } from '../../../components/rich-text/event-listeners';
15
15
  import FormatEdit from '../../../components/rich-text/format-edit';
16
- import {
17
- keyboardShortcutContext,
18
- inputEventContext,
19
- } from '../../../components/rich-text';
20
16
  import { unlock } from '../../../lock-unlock';
21
17
 
22
- const { useRichText } = unlock( richTextPrivateApis );
18
+ const { useRichText, KeyboardShortcutContext, InputEventContext } =
19
+ unlock( richTextPrivateApis );
23
20
 
24
21
  export default function RichTextControl( {
25
22
  data,
@@ -84,8 +81,8 @@ export default function RichTextControl( {
84
81
  return (
85
82
  <>
86
83
  { isSelected && (
87
- <keyboardShortcutContext.Provider value={ keyboardShortcuts }>
88
- <inputEventContext.Provider value={ inputEvents }>
84
+ <KeyboardShortcutContext.Provider value={ keyboardShortcuts }>
85
+ <InputEventContext.Provider value={ inputEvents }>
89
86
  <div>
90
87
  <FormatEdit
91
88
  value={ value }
@@ -96,8 +93,8 @@ export default function RichTextControl( {
96
93
  isVisible={ false }
97
94
  />
98
95
  </div>
99
- </inputEventContext.Provider>
100
- </keyboardShortcutContext.Provider>
96
+ </InputEventContext.Provider>
97
+ </KeyboardShortcutContext.Provider>
101
98
  ) }
102
99
  <BaseControl { ...baseControlProps }>
103
100
  <div
@@ -2,6 +2,7 @@
2
2
  @use "@wordpress/base-styles/colors" as *;
3
3
 
4
4
  .block-editor-hooks__block-hooks {
5
+
5
6
  /**
6
7
  * Un-reverse the flex direction for the toggle's label.
7
8
  */
@@ -15,3 +16,17 @@
15
16
  margin-bottom: $grid-unit-20;
16
17
  }
17
18
  }
19
+
20
+ .block-editor-hooks__position-control-item {
21
+
22
+ /**
23
+ * Try to make items match the width of the anchor, subtract any margin on
24
+ * items to calculate the correct inner width.
25
+ */
26
+ max-inline-size: max(calc(var(--anchor-width) - (2 * var(--wp-ui-popup-padding))), 223px);
27
+ }
28
+
29
+ .block-editor-hooks__position-control-item-hint {
30
+ color: var(--wpds-color-foreground-content-neutral-weak);
31
+ margin-block-start: $grid-unit-05;
32
+ }
@@ -93,7 +93,6 @@ export function ElementsEdit( {
93
93
  // Text and background color failures are reported by the Typography and
94
94
  // Background panels, which own those selections.
95
95
  const enableContrastChecking =
96
- ! isStateSelected &&
97
96
  !! value?.elements?.link?.color?.text &&
98
97
  settings?.color?.link &&
99
98
  false !==
@@ -131,7 +131,6 @@ export function FontSizeEdit( props ) {
131
131
  valueMode={ fontSize ? 'slug' : 'literal' }
132
132
  withReset={ false }
133
133
  withSlider
134
- size="__unstable-large"
135
134
  />
136
135
  );
137
136
  }