@wordpress/block-editor 14.1.0 → 14.2.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 (630) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +1 -10
  3. package/build/components/block-alignment-matrix-control/index.js +2 -2
  4. package/build/components/block-alignment-matrix-control/index.js.map +1 -1
  5. package/build/components/block-breadcrumb/index.js +8 -2
  6. package/build/components/block-breadcrumb/index.js.map +1 -1
  7. package/build/components/block-canvas/index.js +8 -1
  8. package/build/components/block-canvas/index.js.map +1 -1
  9. package/build/components/block-compare/block-view.js +4 -1
  10. package/build/components/block-compare/block-view.js.map +1 -1
  11. package/build/components/block-draggable/index.js +4 -4
  12. package/build/components/block-draggable/index.js.map +1 -1
  13. package/build/components/block-draggable/use-scroll-when-dragging.js +25 -25
  14. package/build/components/block-draggable/use-scroll-when-dragging.js.map +1 -1
  15. package/build/components/block-edit/multiple-usage-warning.js +8 -2
  16. package/build/components/block-edit/multiple-usage-warning.js.map +1 -1
  17. package/build/components/block-inspector/index.js +27 -9
  18. package/build/components/block-inspector/index.js.map +1 -1
  19. package/build/components/block-list/block-invalid-warning.js +6 -3
  20. package/build/components/block-list/block-invalid-warning.js.map +1 -1
  21. package/build/components/block-list/block.js +5 -1
  22. package/build/components/block-list/block.js.map +1 -1
  23. package/build/components/block-list/use-block-props/index.js +5 -1
  24. package/build/components/block-list/use-block-props/index.js.map +1 -1
  25. package/build/components/block-list/use-block-props/use-focus-first-element.js +1 -0
  26. package/build/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  27. package/build/components/block-list/use-block-props/use-zoom-out-mode-exit.js +46 -0
  28. package/build/components/block-list/use-block-props/use-zoom-out-mode-exit.js.map +1 -0
  29. package/build/components/block-lock/toolbar.js +3 -3
  30. package/build/components/block-lock/toolbar.js.map +1 -1
  31. package/build/components/block-mover/button.js +4 -1
  32. package/build/components/block-mover/button.js.map +1 -1
  33. package/build/components/block-mover/index.js +4 -1
  34. package/build/components/block-mover/index.js.map +1 -1
  35. package/build/components/block-navigation/dropdown.js +4 -1
  36. package/build/components/block-navigation/dropdown.js.map +1 -1
  37. package/build/components/block-pattern-setup/index.js +1 -4
  38. package/build/components/block-pattern-setup/index.js.map +1 -1
  39. package/build/components/block-pattern-setup/setup-toolbar.js +22 -7
  40. package/build/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  41. package/build/components/block-patterns-list/index.js +11 -14
  42. package/build/components/block-patterns-list/index.js.map +1 -1
  43. package/build/components/block-patterns-paging/index.js +12 -3
  44. package/build/components/block-patterns-paging/index.js.map +1 -1
  45. package/build/components/block-popover/index.js +2 -15
  46. package/build/components/block-popover/index.js.map +1 -1
  47. package/build/components/block-quick-navigation/index.js +4 -1
  48. package/build/components/block-quick-navigation/index.js.map +1 -1
  49. package/build/components/block-settings-menu-controls/index.js +4 -0
  50. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  51. package/build/components/block-switcher/index.js +22 -17
  52. package/build/components/block-switcher/index.js.map +1 -1
  53. package/build/components/block-switcher/pattern-transformations-menu.js +1 -4
  54. package/build/components/block-switcher/pattern-transformations-menu.js.map +1 -1
  55. package/build/components/block-toolbar/index.js +12 -11
  56. package/build/components/block-toolbar/index.js.map +1 -1
  57. package/build/components/block-toolbar/shuffle.js +6 -2
  58. package/build/components/block-toolbar/shuffle.js.map +1 -1
  59. package/build/components/block-tools/block-selection-button.js +8 -2
  60. package/build/components/block-tools/block-selection-button.js.map +1 -1
  61. package/build/components/block-tools/block-toolbar-popover.js +10 -6
  62. package/build/components/block-tools/block-toolbar-popover.js.map +1 -1
  63. package/build/components/block-tools/use-block-toolbar-popover-props.js +2 -1
  64. package/build/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  65. package/build/components/block-tools/zoom-out-mode-inserters.js +4 -9
  66. package/build/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  67. package/build/components/block-tools/zoom-out-popover.js +3 -4
  68. package/build/components/block-tools/zoom-out-popover.js.map +1 -1
  69. package/build/components/block-tools/zoom-out-toolbar.js +14 -5
  70. package/build/components/block-tools/zoom-out-toolbar.js.map +1 -1
  71. package/build/components/block-variation-picker/index.js +4 -1
  72. package/build/components/block-variation-picker/index.js.map +1 -1
  73. package/build/components/block-variation-transforms/index.js +4 -1
  74. package/build/components/block-variation-transforms/index.js.map +1 -1
  75. package/build/components/button-block-appender/index.js +14 -3
  76. package/build/components/button-block-appender/index.js.map +1 -1
  77. package/build/components/colors-gradients/dropdown.js +4 -1
  78. package/build/components/colors-gradients/dropdown.js.map +1 -1
  79. package/build/components/content-lock/index.js +13 -0
  80. package/build/components/content-lock/index.js.map +1 -0
  81. package/build/components/content-lock/modify-content-lock-menu-item.js +64 -0
  82. package/build/components/content-lock/modify-content-lock-menu-item.js.map +1 -0
  83. package/build/components/editor-styles/index.js +4 -3
  84. package/build/components/editor-styles/index.js.map +1 -1
  85. package/build/components/global-styles/background-panel.js +8 -12
  86. package/build/components/global-styles/background-panel.js.map +1 -1
  87. package/build/components/global-styles/color-panel.js +8 -5
  88. package/build/components/global-styles/color-panel.js.map +1 -1
  89. package/build/components/global-styles/color-panel.native.js +1 -1
  90. package/build/components/global-styles/color-panel.native.js.map +1 -1
  91. package/build/components/global-styles/dimensions-panel.js +34 -37
  92. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  93. package/build/components/global-styles/filters-panel.js +4 -1
  94. package/build/components/global-styles/filters-panel.js.map +1 -1
  95. package/build/components/global-styles/shadow-panel-components.js +13 -7
  96. package/build/components/global-styles/shadow-panel-components.js.map +1 -1
  97. package/build/components/global-styles/typography-utils.js +17 -6
  98. package/build/components/global-styles/typography-utils.js.map +1 -1
  99. package/build/components/global-styles/utils.js +4 -6
  100. package/build/components/global-styles/utils.js.map +1 -1
  101. package/build/components/grid/grid-item-movers.js +2 -2
  102. package/build/components/grid/grid-item-movers.js.map +1 -1
  103. package/build/components/iframe/index.js +5 -5
  104. package/build/components/iframe/index.js.map +1 -1
  105. package/build/components/inner-blocks/index.js +2 -4
  106. package/build/components/inner-blocks/index.js.map +1 -1
  107. package/build/components/inner-blocks/use-inner-block-template-sync.js +3 -3
  108. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  109. package/build/components/inserter/block-patterns-explorer/pattern-explorer-sidebar.js +4 -1
  110. package/build/components/inserter/block-patterns-explorer/pattern-explorer-sidebar.js.map +1 -1
  111. package/build/components/inserter/block-patterns-tab/index.js +4 -1
  112. package/build/components/inserter/block-patterns-tab/index.js.map +1 -1
  113. package/build/components/inserter/library.js +2 -4
  114. package/build/components/inserter/library.js.map +1 -1
  115. package/build/components/inserter/media-tab/hooks.js +3 -3
  116. package/build/components/inserter/media-tab/hooks.js.map +1 -1
  117. package/build/components/inserter/media-tab/media-list.js +1 -4
  118. package/build/components/inserter/media-tab/media-list.js.map +1 -1
  119. package/build/components/inserter/media-tab/media-preview.js +8 -2
  120. package/build/components/inserter/media-tab/media-preview.js.map +1 -1
  121. package/build/components/inserter/media-tab/media-tab.js +4 -1
  122. package/build/components/inserter/media-tab/media-tab.js.map +1 -1
  123. package/build/components/inserter/menu.js +7 -24
  124. package/build/components/inserter/menu.js.map +1 -1
  125. package/build/components/inserter/quick-inserter.js +4 -1
  126. package/build/components/inserter/quick-inserter.js.map +1 -1
  127. package/build/components/inserter-list-item/index.js +4 -4
  128. package/build/components/inserter-list-item/index.js.map +1 -1
  129. package/build/components/inserter-listbox/index.js +3 -7
  130. package/build/components/inserter-listbox/index.js.map +1 -1
  131. package/build/components/inserter-listbox/item.js +4 -1
  132. package/build/components/inserter-listbox/item.js.map +1 -1
  133. package/build/components/inspector-controls/groups.js +2 -0
  134. package/build/components/inspector-controls/groups.js.map +1 -1
  135. package/build/components/inspector-controls-tabs/index.js +4 -1
  136. package/build/components/inspector-controls-tabs/index.js.map +1 -1
  137. package/build/components/inspector-controls-tabs/settings-tab.js +3 -1
  138. package/build/components/inspector-controls-tabs/settings-tab.js.map +1 -1
  139. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js +2 -1
  140. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -1
  141. package/build/components/inspector-popover-header/index.js +8 -2
  142. package/build/components/inspector-popover-header/index.js.map +1 -1
  143. package/build/components/letter-spacing-control/index.js +7 -4
  144. package/build/components/letter-spacing-control/index.js.map +1 -1
  145. package/build/components/link-control/index.js +19 -10
  146. package/build/components/link-control/index.js.map +1 -1
  147. package/build/components/link-control/settings-drawer.js +4 -1
  148. package/build/components/link-control/settings-drawer.js.map +1 -1
  149. package/build/components/list-view/block-select-button.js +4 -1
  150. package/build/components/list-view/block-select-button.js.map +1 -1
  151. package/build/components/media-placeholder/index.js +28 -7
  152. package/build/components/media-placeholder/index.js.map +1 -1
  153. package/build/components/media-replace-flow/index.js +8 -1
  154. package/build/components/media-replace-flow/index.js.map +1 -1
  155. package/build/components/provider/use-block-sync.js +19 -19
  156. package/build/components/provider/use-block-sync.js.map +1 -1
  157. package/build/components/rich-text/event-listeners/paste-handler.js +12 -1
  158. package/build/components/rich-text/event-listeners/paste-handler.js.map +1 -1
  159. package/build/components/rich-text/index.js +38 -30
  160. package/build/components/rich-text/index.js.map +1 -1
  161. package/build/components/rich-text/use-mark-persistent.js +5 -5
  162. package/build/components/rich-text/use-mark-persistent.js.map +1 -1
  163. package/build/components/skip-to-selected-block/index.js +4 -1
  164. package/build/components/skip-to-selected-block/index.js.map +1 -1
  165. package/build/components/tool-selector/index.js +4 -1
  166. package/build/components/tool-selector/index.js.map +1 -1
  167. package/build/components/url-input/button.js +12 -3
  168. package/build/components/url-input/button.js.map +1 -1
  169. package/build/components/url-input/index.js +4 -1
  170. package/build/components/url-input/index.js.map +1 -1
  171. package/build/components/use-block-drop-zone/index.js +4 -6
  172. package/build/components/use-block-drop-zone/index.js.map +1 -1
  173. package/build/components/writing-flow/index.js +2 -1
  174. package/build/components/writing-flow/index.js.map +1 -1
  175. package/build/components/writing-flow/use-arrow-nav.js +4 -1
  176. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  177. package/build/components/writing-flow/use-event-redirect.js +66 -0
  178. package/build/components/writing-flow/use-event-redirect.js.map +1 -0
  179. package/build/components/writing-flow/use-input.js +31 -1
  180. package/build/components/writing-flow/use-input.js.map +1 -1
  181. package/build/components/writing-flow/use-select-all.js +14 -1
  182. package/build/components/writing-flow/use-select-all.js.map +1 -1
  183. package/build/components/writing-flow/use-selection-observer.js +20 -6
  184. package/build/components/writing-flow/use-selection-observer.js.map +1 -1
  185. package/build/components/writing-flow/use-tab-nav.js +4 -4
  186. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  187. package/build/components/writing-flow/utils.js +27 -0
  188. package/build/components/writing-flow/utils.js.map +1 -1
  189. package/build/hooks/block-bindings.js +32 -29
  190. package/build/hooks/block-bindings.js.map +1 -1
  191. package/build/hooks/content-lock-ui.js +8 -26
  192. package/build/hooks/content-lock-ui.js.map +1 -1
  193. package/build/hooks/duotone.js +0 -4
  194. package/build/hooks/duotone.js.map +1 -1
  195. package/build/hooks/layout.js +4 -1
  196. package/build/hooks/layout.js.map +1 -1
  197. package/build/hooks/spacing-visualizer.js +3 -3
  198. package/build/hooks/spacing-visualizer.js.map +1 -1
  199. package/build/hooks/style.js +1 -5
  200. package/build/hooks/style.js.map +1 -1
  201. package/build/hooks/use-bindings-attributes.js +19 -20
  202. package/build/hooks/use-bindings-attributes.js.map +1 -1
  203. package/build/hooks/use-zoom-out.js +7 -7
  204. package/build/hooks/use-zoom-out.js.map +1 -1
  205. package/build/layouts/constrained.js +41 -41
  206. package/build/layouts/constrained.js.map +1 -1
  207. package/build/layouts/flex.js +4 -1
  208. package/build/layouts/flex.js.map +1 -1
  209. package/build/layouts/utils.js +1 -7
  210. package/build/layouts/utils.js.map +1 -1
  211. package/build/private-apis.js +2 -1
  212. package/build/private-apis.js.map +1 -1
  213. package/build/store/actions.js +2 -7
  214. package/build/store/actions.js.map +1 -1
  215. package/build/store/private-actions.js +1 -0
  216. package/build/store/private-actions.js.map +1 -1
  217. package/build/store/private-keys.js +2 -1
  218. package/build/store/private-keys.js.map +1 -1
  219. package/build/store/private-selectors.js +13 -15
  220. package/build/store/private-selectors.js.map +1 -1
  221. package/build/store/reducer.js +1 -8
  222. package/build/store/reducer.js.map +1 -1
  223. package/build/store/selectors.js +19 -43
  224. package/build/store/selectors.js.map +1 -1
  225. package/build/store/utils.js +48 -0
  226. package/build/store/utils.js.map +1 -1
  227. package/build/utils/block-bindings.js +16 -11
  228. package/build/utils/block-bindings.js.map +1 -1
  229. package/build/utils/dom.js +101 -0
  230. package/build/utils/dom.js.map +1 -1
  231. package/build/utils/get-font-styles-and-weights.js +4 -4
  232. package/build/utils/get-font-styles-and-weights.js.map +1 -1
  233. package/build/utils/transform-styles/index.js +120 -16
  234. package/build/utils/transform-styles/index.js.map +1 -1
  235. package/build-module/components/block-alignment-matrix-control/index.js +1 -1
  236. package/build-module/components/block-alignment-matrix-control/index.js.map +1 -1
  237. package/build-module/components/block-breadcrumb/index.js +8 -2
  238. package/build-module/components/block-breadcrumb/index.js.map +1 -1
  239. package/build-module/components/block-canvas/index.js +9 -1
  240. package/build-module/components/block-canvas/index.js.map +1 -1
  241. package/build-module/components/block-compare/block-view.js +4 -1
  242. package/build-module/components/block-compare/block-view.js.map +1 -1
  243. package/build-module/components/block-draggable/index.js +4 -4
  244. package/build-module/components/block-draggable/index.js.map +1 -1
  245. package/build-module/components/block-draggable/use-scroll-when-dragging.js +25 -25
  246. package/build-module/components/block-draggable/use-scroll-when-dragging.js.map +1 -1
  247. package/build-module/components/block-edit/multiple-usage-warning.js +8 -2
  248. package/build-module/components/block-edit/multiple-usage-warning.js.map +1 -1
  249. package/build-module/components/block-inspector/index.js +27 -9
  250. package/build-module/components/block-inspector/index.js.map +1 -1
  251. package/build-module/components/block-list/block-invalid-warning.js +6 -3
  252. package/build-module/components/block-list/block-invalid-warning.js.map +1 -1
  253. package/build-module/components/block-list/block.js +5 -1
  254. package/build-module/components/block-list/block.js.map +1 -1
  255. package/build-module/components/block-list/use-block-props/index.js +5 -1
  256. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  257. package/build-module/components/block-list/use-block-props/use-focus-first-element.js +1 -0
  258. package/build-module/components/block-list/use-block-props/use-focus-first-element.js.map +1 -1
  259. package/build-module/components/block-list/use-block-props/use-zoom-out-mode-exit.js +40 -0
  260. package/build-module/components/block-list/use-block-props/use-zoom-out-mode-exit.js.map +1 -0
  261. package/build-module/components/block-lock/toolbar.js +3 -3
  262. package/build-module/components/block-lock/toolbar.js.map +1 -1
  263. package/build-module/components/block-mover/button.js +4 -1
  264. package/build-module/components/block-mover/button.js.map +1 -1
  265. package/build-module/components/block-mover/index.js +4 -1
  266. package/build-module/components/block-mover/index.js.map +1 -1
  267. package/build-module/components/block-navigation/dropdown.js +4 -1
  268. package/build-module/components/block-navigation/dropdown.js.map +1 -1
  269. package/build-module/components/block-pattern-setup/index.js +1 -4
  270. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  271. package/build-module/components/block-pattern-setup/setup-toolbar.js +23 -8
  272. package/build-module/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  273. package/build-module/components/block-patterns-list/index.js +11 -14
  274. package/build-module/components/block-patterns-list/index.js.map +1 -1
  275. package/build-module/components/block-patterns-paging/index.js +12 -3
  276. package/build-module/components/block-patterns-paging/index.js.map +1 -1
  277. package/build-module/components/block-popover/index.js +2 -15
  278. package/build-module/components/block-popover/index.js.map +1 -1
  279. package/build-module/components/block-quick-navigation/index.js +4 -1
  280. package/build-module/components/block-quick-navigation/index.js.map +1 -1
  281. package/build-module/components/block-settings-menu-controls/index.js +4 -0
  282. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  283. package/build-module/components/block-switcher/index.js +22 -17
  284. package/build-module/components/block-switcher/index.js.map +1 -1
  285. package/build-module/components/block-switcher/pattern-transformations-menu.js +1 -4
  286. package/build-module/components/block-switcher/pattern-transformations-menu.js.map +1 -1
  287. package/build-module/components/block-toolbar/index.js +12 -11
  288. package/build-module/components/block-toolbar/index.js.map +1 -1
  289. package/build-module/components/block-toolbar/shuffle.js +6 -2
  290. package/build-module/components/block-toolbar/shuffle.js.map +1 -1
  291. package/build-module/components/block-tools/block-selection-button.js +8 -2
  292. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  293. package/build-module/components/block-tools/block-toolbar-popover.js +10 -6
  294. package/build-module/components/block-tools/block-toolbar-popover.js.map +1 -1
  295. package/build-module/components/block-tools/use-block-toolbar-popover-props.js +2 -1
  296. package/build-module/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  297. package/build-module/components/block-tools/zoom-out-mode-inserters.js +4 -9
  298. package/build-module/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  299. package/build-module/components/block-tools/zoom-out-popover.js +3 -4
  300. package/build-module/components/block-tools/zoom-out-popover.js.map +1 -1
  301. package/build-module/components/block-tools/zoom-out-toolbar.js +15 -6
  302. package/build-module/components/block-tools/zoom-out-toolbar.js.map +1 -1
  303. package/build-module/components/block-variation-picker/index.js +4 -1
  304. package/build-module/components/block-variation-picker/index.js.map +1 -1
  305. package/build-module/components/block-variation-transforms/index.js +4 -1
  306. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  307. package/build-module/components/button-block-appender/index.js +15 -4
  308. package/build-module/components/button-block-appender/index.js.map +1 -1
  309. package/build-module/components/colors-gradients/dropdown.js +4 -1
  310. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  311. package/build-module/components/content-lock/index.js +2 -0
  312. package/build-module/components/content-lock/index.js.map +1 -0
  313. package/build-module/components/content-lock/modify-content-lock-menu-item.js +57 -0
  314. package/build-module/components/content-lock/modify-content-lock-menu-item.js.map +1 -0
  315. package/build-module/components/editor-styles/index.js +4 -3
  316. package/build-module/components/editor-styles/index.js.map +1 -1
  317. package/build-module/components/global-styles/background-panel.js +8 -12
  318. package/build-module/components/global-styles/background-panel.js.map +1 -1
  319. package/build-module/components/global-styles/color-panel.js +7 -4
  320. package/build-module/components/global-styles/color-panel.js.map +1 -1
  321. package/build-module/components/global-styles/color-panel.native.js +2 -2
  322. package/build-module/components/global-styles/color-panel.native.js.map +1 -1
  323. package/build-module/components/global-styles/dimensions-panel.js +36 -39
  324. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  325. package/build-module/components/global-styles/filters-panel.js +4 -1
  326. package/build-module/components/global-styles/filters-panel.js.map +1 -1
  327. package/build-module/components/global-styles/shadow-panel-components.js +13 -7
  328. package/build-module/components/global-styles/shadow-panel-components.js.map +1 -1
  329. package/build-module/components/global-styles/typography-utils.js +17 -6
  330. package/build-module/components/global-styles/typography-utils.js.map +1 -1
  331. package/build-module/components/global-styles/utils.js +4 -6
  332. package/build-module/components/global-styles/utils.js.map +1 -1
  333. package/build-module/components/grid/grid-item-movers.js +3 -3
  334. package/build-module/components/grid/grid-item-movers.js.map +1 -1
  335. package/build-module/components/iframe/index.js +5 -5
  336. package/build-module/components/iframe/index.js.map +1 -1
  337. package/build-module/components/inner-blocks/index.js +2 -4
  338. package/build-module/components/inner-blocks/index.js.map +1 -1
  339. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +3 -3
  340. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  341. package/build-module/components/inserter/block-patterns-explorer/pattern-explorer-sidebar.js +4 -1
  342. package/build-module/components/inserter/block-patterns-explorer/pattern-explorer-sidebar.js.map +1 -1
  343. package/build-module/components/inserter/block-patterns-tab/index.js +4 -1
  344. package/build-module/components/inserter/block-patterns-tab/index.js.map +1 -1
  345. package/build-module/components/inserter/library.js +2 -4
  346. package/build-module/components/inserter/library.js.map +1 -1
  347. package/build-module/components/inserter/media-tab/hooks.js +3 -3
  348. package/build-module/components/inserter/media-tab/hooks.js.map +1 -1
  349. package/build-module/components/inserter/media-tab/media-list.js +1 -4
  350. package/build-module/components/inserter/media-tab/media-list.js.map +1 -1
  351. package/build-module/components/inserter/media-tab/media-preview.js +8 -2
  352. package/build-module/components/inserter/media-tab/media-preview.js.map +1 -1
  353. package/build-module/components/inserter/media-tab/media-tab.js +4 -1
  354. package/build-module/components/inserter/media-tab/media-tab.js.map +1 -1
  355. package/build-module/components/inserter/menu.js +7 -24
  356. package/build-module/components/inserter/menu.js.map +1 -1
  357. package/build-module/components/inserter/quick-inserter.js +4 -1
  358. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  359. package/build-module/components/inserter-list-item/index.js +4 -4
  360. package/build-module/components/inserter-list-item/index.js.map +1 -1
  361. package/build-module/components/inserter-listbox/index.js +3 -7
  362. package/build-module/components/inserter-listbox/index.js.map +1 -1
  363. package/build-module/components/inserter-listbox/item.js +4 -1
  364. package/build-module/components/inserter-listbox/item.js.map +1 -1
  365. package/build-module/components/inspector-controls/groups.js +2 -0
  366. package/build-module/components/inspector-controls/groups.js.map +1 -1
  367. package/build-module/components/inspector-controls-tabs/index.js +4 -1
  368. package/build-module/components/inspector-controls-tabs/index.js.map +1 -1
  369. package/build-module/components/inspector-controls-tabs/settings-tab.js +3 -1
  370. package/build-module/components/inspector-controls-tabs/settings-tab.js.map +1 -1
  371. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js +2 -1
  372. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -1
  373. package/build-module/components/inspector-popover-header/index.js +8 -2
  374. package/build-module/components/inspector-popover-header/index.js.map +1 -1
  375. package/build-module/components/letter-spacing-control/index.js +7 -4
  376. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  377. package/build-module/components/link-control/index.js +19 -10
  378. package/build-module/components/link-control/index.js.map +1 -1
  379. package/build-module/components/link-control/settings-drawer.js +4 -1
  380. package/build-module/components/link-control/settings-drawer.js.map +1 -1
  381. package/build-module/components/list-view/block-select-button.js +4 -1
  382. package/build-module/components/list-view/block-select-button.js.map +1 -1
  383. package/build-module/components/media-placeholder/index.js +28 -7
  384. package/build-module/components/media-placeholder/index.js.map +1 -1
  385. package/build-module/components/media-replace-flow/index.js +8 -1
  386. package/build-module/components/media-replace-flow/index.js.map +1 -1
  387. package/build-module/components/provider/use-block-sync.js +19 -19
  388. package/build-module/components/provider/use-block-sync.js.map +1 -1
  389. package/build-module/components/rich-text/event-listeners/paste-handler.js +12 -1
  390. package/build-module/components/rich-text/event-listeners/paste-handler.js.map +1 -1
  391. package/build-module/components/rich-text/index.js +39 -31
  392. package/build-module/components/rich-text/index.js.map +1 -1
  393. package/build-module/components/rich-text/use-mark-persistent.js +5 -5
  394. package/build-module/components/rich-text/use-mark-persistent.js.map +1 -1
  395. package/build-module/components/skip-to-selected-block/index.js +4 -1
  396. package/build-module/components/skip-to-selected-block/index.js.map +1 -1
  397. package/build-module/components/tool-selector/index.js +4 -1
  398. package/build-module/components/tool-selector/index.js.map +1 -1
  399. package/build-module/components/url-input/button.js +12 -3
  400. package/build-module/components/url-input/button.js.map +1 -1
  401. package/build-module/components/url-input/index.js +4 -1
  402. package/build-module/components/url-input/index.js.map +1 -1
  403. package/build-module/components/use-block-drop-zone/index.js +4 -6
  404. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  405. package/build-module/components/writing-flow/index.js +2 -1
  406. package/build-module/components/writing-flow/index.js.map +1 -1
  407. package/build-module/components/writing-flow/use-arrow-nav.js +4 -1
  408. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  409. package/build-module/components/writing-flow/use-event-redirect.js +60 -0
  410. package/build-module/components/writing-flow/use-event-redirect.js.map +1 -0
  411. package/build-module/components/writing-flow/use-input.js +31 -1
  412. package/build-module/components/writing-flow/use-input.js.map +1 -1
  413. package/build-module/components/writing-flow/use-select-all.js +14 -1
  414. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  415. package/build-module/components/writing-flow/use-selection-observer.js +16 -2
  416. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -1
  417. package/build-module/components/writing-flow/use-tab-nav.js +4 -4
  418. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  419. package/build-module/components/writing-flow/utils.js +26 -0
  420. package/build-module/components/writing-flow/utils.js.map +1 -1
  421. package/build-module/hooks/block-bindings.js +34 -31
  422. package/build-module/hooks/block-bindings.js.map +1 -1
  423. package/build-module/hooks/content-lock-ui.js +10 -30
  424. package/build-module/hooks/content-lock-ui.js.map +1 -1
  425. package/build-module/hooks/duotone.js +0 -4
  426. package/build-module/hooks/duotone.js.map +1 -1
  427. package/build-module/hooks/layout.js +4 -1
  428. package/build-module/hooks/layout.js.map +1 -1
  429. package/build-module/hooks/spacing-visualizer.js +3 -3
  430. package/build-module/hooks/spacing-visualizer.js.map +1 -1
  431. package/build-module/hooks/style.js +1 -5
  432. package/build-module/hooks/style.js.map +1 -1
  433. package/build-module/hooks/use-bindings-attributes.js +19 -20
  434. package/build-module/hooks/use-bindings-attributes.js.map +1 -1
  435. package/build-module/hooks/use-zoom-out.js +7 -7
  436. package/build-module/hooks/use-zoom-out.js.map +1 -1
  437. package/build-module/layouts/constrained.js +43 -43
  438. package/build-module/layouts/constrained.js.map +1 -1
  439. package/build-module/layouts/flex.js +4 -1
  440. package/build-module/layouts/flex.js.map +1 -1
  441. package/build-module/layouts/utils.js +1 -7
  442. package/build-module/layouts/utils.js.map +1 -1
  443. package/build-module/private-apis.js +3 -2
  444. package/build-module/private-apis.js.map +1 -1
  445. package/build-module/store/actions.js +2 -7
  446. package/build-module/store/actions.js.map +1 -1
  447. package/build-module/store/private-actions.js +1 -0
  448. package/build-module/store/private-actions.js.map +1 -1
  449. package/build-module/store/private-keys.js +1 -0
  450. package/build-module/store/private-keys.js.map +1 -1
  451. package/build-module/store/private-selectors.js +12 -15
  452. package/build-module/store/private-selectors.js.map +1 -1
  453. package/build-module/store/reducer.js +1 -7
  454. package/build-module/store/reducer.js.map +1 -1
  455. package/build-module/store/selectors.js +22 -46
  456. package/build-module/store/selectors.js.map +1 -1
  457. package/build-module/store/utils.js +46 -0
  458. package/build-module/store/utils.js.map +1 -1
  459. package/build-module/utils/block-bindings.js +17 -12
  460. package/build-module/utils/block-bindings.js.map +1 -1
  461. package/build-module/utils/dom.js +99 -0
  462. package/build-module/utils/dom.js.map +1 -1
  463. package/build-module/utils/get-font-styles-and-weights.js +4 -4
  464. package/build-module/utils/get-font-styles-and-weights.js.map +1 -1
  465. package/build-module/utils/transform-styles/index.js +120 -16
  466. package/build-module/utils/transform-styles/index.js.map +1 -1
  467. package/build-style/content-rtl.css +2 -11
  468. package/build-style/content.css +2 -11
  469. package/build-style/style-rtl.css +17 -38
  470. package/build-style/style.css +17 -38
  471. package/build-types/utils/dom.d.ts +25 -0
  472. package/build-types/utils/dom.d.ts.map +1 -1
  473. package/package.json +34 -32
  474. package/src/components/block-alignment-matrix-control/index.js +1 -1
  475. package/src/components/block-breadcrumb/index.js +4 -0
  476. package/src/components/block-breadcrumb/style.scss +1 -1
  477. package/src/components/block-canvas/index.js +9 -1
  478. package/src/components/block-compare/block-view.js +7 -1
  479. package/src/components/block-draggable/content.scss +1 -1
  480. package/src/components/block-draggable/index.js +4 -4
  481. package/src/components/block-draggable/style.scss +1 -1
  482. package/src/components/block-draggable/use-scroll-when-dragging.js +25 -25
  483. package/src/components/block-edit/multiple-usage-warning.js +4 -0
  484. package/src/components/block-inspector/index.js +22 -6
  485. package/src/components/block-list/block-invalid-warning.js +4 -2
  486. package/src/components/block-list/block.js +6 -2
  487. package/src/components/block-list/content.scss +2 -3
  488. package/src/components/block-list/use-block-props/index.js +3 -0
  489. package/src/components/block-list/use-block-props/use-focus-first-element.js +1 -0
  490. package/src/components/block-list/use-block-props/use-zoom-out-mode-exit.js +44 -0
  491. package/src/components/block-lock/style.scss +1 -1
  492. package/src/components/block-lock/toolbar.js +3 -3
  493. package/src/components/block-mover/button.js +2 -0
  494. package/src/components/block-mover/index.js +2 -0
  495. package/src/components/block-mover/style.scss +1 -1
  496. package/src/components/block-navigation/dropdown.js +2 -0
  497. package/src/components/block-pattern-setup/index.js +3 -7
  498. package/src/components/block-pattern-setup/setup-toolbar.js +17 -4
  499. package/src/components/block-pattern-setup/style.scss +2 -2
  500. package/src/components/block-patterns-list/index.js +15 -13
  501. package/src/components/block-patterns-list/style.scss +2 -2
  502. package/src/components/block-patterns-paging/index.js +6 -0
  503. package/src/components/block-popover/index.js +7 -28
  504. package/src/components/block-popover/style.scss +1 -1
  505. package/src/components/block-quick-navigation/index.js +2 -0
  506. package/src/components/block-settings-menu-controls/index.js +7 -1
  507. package/src/components/block-switcher/index.js +26 -20
  508. package/src/components/block-switcher/pattern-transformations-menu.js +3 -7
  509. package/src/components/block-switcher/style.scss +5 -6
  510. package/src/components/block-toolbar/index.js +17 -8
  511. package/src/components/block-toolbar/shuffle.js +9 -7
  512. package/src/components/block-tools/block-selection-button.js +4 -0
  513. package/src/components/block-tools/block-toolbar-popover.js +10 -6
  514. package/src/components/block-tools/style.scss +3 -4
  515. package/src/components/block-tools/use-block-toolbar-popover-props.js +2 -1
  516. package/src/components/block-tools/zoom-out-mode-inserters.js +2 -5
  517. package/src/components/block-tools/zoom-out-popover.js +3 -7
  518. package/src/components/block-tools/zoom-out-toolbar.js +20 -6
  519. package/src/components/block-variation-picker/README.md +2 -2
  520. package/src/components/block-variation-picker/index.js +6 -1
  521. package/src/components/block-variation-transforms/index.js +2 -0
  522. package/src/components/block-variation-transforms/style.scss +1 -1
  523. package/src/components/button-block-appender/content.scss +0 -1
  524. package/src/components/button-block-appender/index.js +14 -3
  525. package/src/components/color-palette/test/control.js +15 -2
  526. package/src/components/colors-gradients/dropdown.js +5 -1
  527. package/src/components/colors-gradients/style.scss +4 -4
  528. package/src/components/content-lock/index.js +1 -0
  529. package/src/components/content-lock/modify-content-lock-menu-item.js +58 -0
  530. package/src/components/default-block-appender/content.scss +0 -1
  531. package/src/components/editor-styles/index.js +4 -3
  532. package/src/components/global-styles/background-panel.js +6 -14
  533. package/src/components/global-styles/color-panel.js +8 -4
  534. package/src/components/global-styles/color-panel.native.js +2 -2
  535. package/src/components/global-styles/dimensions-panel.js +40 -40
  536. package/src/components/global-styles/filters-panel.js +5 -1
  537. package/src/components/global-styles/shadow-panel-components.js +12 -8
  538. package/src/components/global-styles/style.scss +3 -4
  539. package/src/components/global-styles/test/typography-utils.js +96 -5
  540. package/src/components/global-styles/test/utils.js +10 -0
  541. package/src/components/global-styles/typography-utils.js +22 -6
  542. package/src/components/global-styles/utils.js +4 -6
  543. package/src/components/grid/grid-item-movers.js +3 -3
  544. package/src/components/grid/style.scss +1 -1
  545. package/src/components/iframe/index.js +5 -5
  546. package/src/components/inner-blocks/index.js +2 -2
  547. package/src/components/inner-blocks/use-inner-block-template-sync.js +3 -3
  548. package/src/components/inserter/block-patterns-explorer/pattern-explorer-sidebar.js +2 -0
  549. package/src/components/inserter/block-patterns-tab/index.js +2 -0
  550. package/src/components/inserter/library.js +0 -2
  551. package/src/components/inserter/media-tab/hooks.js +3 -3
  552. package/src/components/inserter/media-tab/media-list.js +1 -4
  553. package/src/components/inserter/media-tab/media-preview.js +12 -2
  554. package/src/components/inserter/media-tab/media-tab.js +2 -0
  555. package/src/components/inserter/menu.js +15 -29
  556. package/src/components/inserter/quick-inserter.js +2 -0
  557. package/src/components/inserter/style.scss +6 -8
  558. package/src/components/inserter-list-item/index.js +4 -4
  559. package/src/components/inserter-list-item/style.scss +1 -3
  560. package/src/components/inserter-listbox/index.js +2 -8
  561. package/src/components/inserter-listbox/item.js +9 -1
  562. package/src/components/inspector-controls/groups.js +2 -0
  563. package/src/components/inspector-controls-tabs/index.js +2 -0
  564. package/src/components/inspector-controls-tabs/settings-tab.js +1 -0
  565. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +5 -2
  566. package/src/components/inspector-popover-header/index.js +4 -0
  567. package/src/components/letter-spacing-control/README.md +8 -1
  568. package/src/components/letter-spacing-control/index.js +7 -4
  569. package/src/components/link-control/index.js +17 -8
  570. package/src/components/link-control/settings-drawer.js +2 -0
  571. package/src/components/link-control/style.scss +1 -3
  572. package/src/components/list-view/block-select-button.js +2 -0
  573. package/src/components/list-view/style.scss +14 -16
  574. package/src/components/media-placeholder/index.js +14 -0
  575. package/src/components/media-replace-flow/index.js +12 -1
  576. package/src/components/provider/use-block-sync.js +20 -20
  577. package/src/components/responsive-block-control/README.md +3 -27
  578. package/src/components/rich-text/content.scss +1 -1
  579. package/src/components/rich-text/event-listeners/paste-handler.js +6 -1
  580. package/src/components/rich-text/index.js +54 -41
  581. package/src/components/rich-text/style.scss +1 -1
  582. package/src/components/rich-text/use-mark-persistent.js +5 -5
  583. package/src/components/skip-to-selected-block/index.js +2 -0
  584. package/src/components/spacing-sizes-control/style.scss +1 -0
  585. package/src/components/tool-selector/index.js +2 -0
  586. package/src/components/url-input/button.js +6 -0
  587. package/src/components/url-input/index.js +2 -0
  588. package/src/components/url-popover/stories/index.story.js +7 -1
  589. package/src/components/use-block-drop-zone/index.js +4 -4
  590. package/src/components/warning/content.scss +3 -10
  591. package/src/components/writing-flow/index.js +2 -0
  592. package/src/components/writing-flow/use-arrow-nav.js +9 -2
  593. package/src/components/writing-flow/use-event-redirect.js +72 -0
  594. package/src/components/writing-flow/use-input.js +36 -1
  595. package/src/components/writing-flow/use-select-all.js +18 -1
  596. package/src/components/writing-flow/use-selection-observer.js +23 -3
  597. package/src/components/writing-flow/use-tab-nav.js +4 -4
  598. package/src/components/writing-flow/utils.js +30 -0
  599. package/src/hooks/block-bindings.js +42 -43
  600. package/src/hooks/block-bindings.scss +1 -9
  601. package/src/hooks/content-lock-ui.js +11 -36
  602. package/src/hooks/duotone.js +0 -4
  603. package/src/hooks/layout.js +2 -0
  604. package/src/hooks/layout.scss +3 -11
  605. package/src/hooks/spacing-visualizer.js +3 -3
  606. package/src/hooks/style.js +1 -4
  607. package/src/hooks/use-bindings-attributes.js +23 -24
  608. package/src/hooks/use-zoom-out.js +7 -7
  609. package/src/layouts/constrained.js +50 -47
  610. package/src/layouts/flex.js +2 -0
  611. package/src/layouts/test/grid.js +2 -2
  612. package/src/layouts/test/utils.js +6 -8
  613. package/src/layouts/utils.js +1 -9
  614. package/src/private-apis.js +2 -0
  615. package/src/store/actions.js +4 -6
  616. package/src/store/private-actions.js +1 -0
  617. package/src/store/private-keys.js +1 -0
  618. package/src/store/private-selectors.js +12 -11
  619. package/src/store/reducer.js +0 -5
  620. package/src/store/selectors.js +32 -51
  621. package/src/store/utils.js +50 -0
  622. package/src/utils/block-bindings.js +15 -16
  623. package/src/utils/dom.js +117 -0
  624. package/src/utils/get-font-styles-and-weights.js +12 -4
  625. package/src/utils/test/get-font-styles-and-weights.js +148 -0
  626. package/src/utils/test/transform-styles.js +259 -50
  627. package/src/utils/transform-styles/index.js +132 -21
  628. package/tsconfig.json +1 -0
  629. package/tsconfig.tsbuildinfo +1 -1
  630. package/src/utils/test/__snapshots__/transform-styles.js.snap +0 -109
@@ -62,14 +62,16 @@ describe( 'transformStyles', () => {
62
62
  ],
63
63
  '.my-namespace'
64
64
  );
65
+ const expected =
66
+ ':root :where(body) .my-namespace { color: pink; } :root :where(body) .my-namespace { color: orange; }';
65
67
 
66
- expect( output ).toMatchSnapshot();
68
+ expect( output ).toEqual( [ expected ] );
67
69
  } );
68
70
  } );
69
71
 
70
- describe( 'selector wrap', () => {
71
- it( 'should wrap regular selectors', () => {
72
- const input = `h1 { color: red; }`;
72
+ describe( 'root selectors', () => {
73
+ it( 'should append prefix after `:root :where(body)` selectors', () => {
74
+ const input = ':root :where(body) { color: red; }';
73
75
  const output = transformStyles(
74
76
  [
75
77
  {
@@ -78,12 +80,13 @@ describe( 'transformStyles', () => {
78
80
  ],
79
81
  '.my-namespace'
80
82
  );
83
+ const expected = ':root :where(body) .my-namespace { color: red; }';
81
84
 
82
- expect( output ).toMatchSnapshot();
85
+ expect( output ).toEqual( [ expected ] );
83
86
  } );
84
87
 
85
- it( 'should wrap multiple selectors', () => {
86
- const input = `h1, h2 { color: red; }`;
88
+ it( 'should append prefix after `:where(body)` selectors', () => {
89
+ const input = ':where(body) { color: red; }';
87
90
  const output = transformStyles(
88
91
  [
89
92
  {
@@ -92,27 +95,142 @@ describe( 'transformStyles', () => {
92
95
  ],
93
96
  '.my-namespace'
94
97
  );
98
+ const expected = ':where(body) .my-namespace { color: red; }';
95
99
 
96
- expect( output ).toMatchSnapshot();
100
+ expect( output ).toEqual( [ expected ] );
97
101
  } );
98
102
 
99
- it( 'should ignore selectors', () => {
100
- const input = `h1, body { color: red; }`;
103
+ it( 'should append prefix after body selectors', () => {
104
+ const input = `body { color: red; }`;
105
+ const output = transformStyles(
106
+ [
107
+ {
108
+ css: input,
109
+ },
110
+ ],
111
+ '.my-namespace'
112
+ );
113
+ const expected = 'body .my-namespace { color: red; }';
114
+
115
+ expect( output ).toEqual( [ expected ] );
116
+ } );
117
+
118
+ it( 'should append prefix after html selectors', () => {
119
+ const input = `html { color: red; }`;
120
+ const output = transformStyles(
121
+ [
122
+ {
123
+ css: input,
124
+ },
125
+ ],
126
+ '.my-namespace'
127
+ );
128
+ const expected = 'html .my-namespace { color: red; }';
129
+
130
+ expect( output ).toEqual( [ expected ] );
131
+ } );
132
+
133
+ it( 'should append prefix after html selectors, but before selectors that contain the word html', () => {
134
+ const input = `html [data-type="core/html"] .test { color: red; }`;
135
+ const output = transformStyles(
136
+ [
137
+ {
138
+ css: input,
139
+ },
140
+ ],
141
+ '.my-namespace'
142
+ );
143
+ const expected =
144
+ 'html .my-namespace [data-type="core/html"] .test { color: red; }';
145
+
146
+ expect( output ).toEqual( [ expected ] );
147
+ } );
148
+
149
+ it( 'should append prefix after :root selectors', () => {
150
+ const input = ':root { color: red; }';
151
+ const output = transformStyles(
152
+ [
153
+ {
154
+ css: input,
155
+ },
156
+ ],
157
+ '.my-namespace'
158
+ );
159
+ const expected = ':root .my-namespace { color: red; }';
160
+
161
+ expect( output ).toEqual( [ expected ] );
162
+ } );
163
+
164
+ it( 'should append prefix after root selector when the selector contains a combinator without spaces around it', () => {
165
+ const input = `
166
+ body> .some-style { color: red; }
167
+ body>.some-style { color: blue; }
168
+ body >.some-style { color: yellow; }
169
+ html body > .some-style { color: purple; }
170
+ html body.with-class+.some-style { color: silver; }
171
+ html body.with-class~.some-style { color: goldenrod; }
172
+ `;
173
+ const output = transformStyles(
174
+ [
175
+ {
176
+ css: input,
177
+ },
178
+ ],
179
+ '.my-namespace'
180
+ );
181
+ const expected = `
182
+ body .my-namespace>.some-style { color: red; }
183
+ body .my-namespace>.some-style { color: blue; }
184
+ body .my-namespace>.some-style { color: yellow; }
185
+ html body .my-namespace>.some-style { color: purple; }
186
+ html body.with-class .my-namespace+.some-style { color: silver; }
187
+ html body.with-class .my-namespace~.some-style { color: goldenrod; }
188
+ `;
189
+
190
+ expect( output ).toEqual( [ expected ] );
191
+ } );
192
+
193
+ it( 'appends after multiple root selectors', () => {
194
+ const input = `
195
+ :root html[lang="th"] body { color: red; }
196
+ :root html[lang="th"] { color: orange; }
197
+ :root html[lang="th"] body .some-class { color: green; }
198
+ `;
199
+ const output = transformStyles(
200
+ [
201
+ {
202
+ css: input,
203
+ },
204
+ ],
205
+ '.my-namespace'
206
+ );
207
+ const expected = `
208
+ :root html[lang="th"] body .my-namespace { color: red; }
209
+ :root html[lang="th"] .my-namespace { color: orange; }
210
+ :root html[lang="th"] body .my-namespace .some-class { color: green; }
211
+ `;
212
+
213
+ expect( output ).toEqual( [ expected ] );
214
+ } );
215
+
216
+ it( 'should not double prefix a root selector', () => {
217
+ const input = 'body .my-namespace h1 { color: goldenrod; }';
101
218
  const output = transformStyles(
102
219
  [
103
220
  {
104
221
  css: input,
105
- ignoredSelectors: [ 'body' ],
106
222
  },
107
223
  ],
108
224
  '.my-namespace'
109
225
  );
110
226
 
111
- expect( output ).toMatchSnapshot();
227
+ expect( output ).toEqual( [ input ] );
112
228
  } );
229
+ } );
113
230
 
114
- it( 'should replace root tags', () => {
115
- const input = `body, h1 { color: red; }`;
231
+ describe( 'selector wrap', () => {
232
+ it( 'should wrap regular selectors', () => {
233
+ const input = `h1 { color: red; }`;
116
234
  const output = transformStyles(
117
235
  [
118
236
  {
@@ -121,23 +239,56 @@ describe( 'transformStyles', () => {
121
239
  ],
122
240
  '.my-namespace'
123
241
  );
242
+ const expected = '.my-namespace h1 { color: red; }';
124
243
 
125
- expect( output ).toMatchSnapshot();
244
+ expect( output ).toEqual( [ expected ] );
245
+ } );
246
+
247
+ it( 'should wrap multiple selectors', () => {
248
+ const input = `h1, h2 { color: red; }`;
249
+ const output = transformStyles(
250
+ [
251
+ {
252
+ css: input,
253
+ },
254
+ ],
255
+ '.my-namespace'
256
+ );
257
+ const expected =
258
+ '.my-namespace h1, .my-namespace h2 { color: red; }';
259
+
260
+ expect( output ).toEqual( [ expected ] );
261
+ } );
262
+
263
+ it( 'should ignore ignored selectors', () => {
264
+ const input = `h1, body { color: red; }`;
265
+ const output = transformStyles(
266
+ [
267
+ {
268
+ css: input,
269
+ ignoredSelectors: [ 'body' ],
270
+ },
271
+ ],
272
+ '.my-namespace'
273
+ );
274
+ const expected = '.my-namespace h1, body { color: red; }';
275
+
276
+ expect( output ).toEqual( [ expected ] );
126
277
  } );
127
278
 
128
279
  it( `should not try to replace 'body' in the middle of a classname`, () => {
129
- const prefix = '.my-namespace';
130
- const input = `.has-body-text { color: red; }`;
280
+ const input = '.has-body-text { color: red; }';
131
281
  const output = transformStyles(
132
282
  [
133
283
  {
134
284
  css: input,
135
285
  },
136
286
  ],
137
- prefix
287
+ '.my-namespace'
138
288
  );
289
+ const expected = '.my-namespace .has-body-text { color: red; }';
139
290
 
140
- expect( output ).toEqual( [ `${ prefix } ${ input }` ] );
291
+ expect( output ).toEqual( [ expected ] );
141
292
  } );
142
293
 
143
294
  it( 'should ignore keyframes', () => {
@@ -156,7 +307,7 @@ describe( 'transformStyles', () => {
156
307
  '.my-namespace'
157
308
  );
158
309
 
159
- expect( output ).toMatchSnapshot();
310
+ expect( output ).toEqual( [ input ] );
160
311
  } );
161
312
 
162
313
  it( 'should wrap selectors inside container queries', () => {
@@ -172,8 +323,12 @@ describe( 'transformStyles', () => {
172
323
  ],
173
324
  '.my-namespace'
174
325
  );
326
+ const expected = `
327
+ @container (width > 400px) {
328
+ .my-namespace h1 { color: red; }
329
+ }`;
175
330
 
176
- expect( output ).toMatchSnapshot();
331
+ expect( output ).toEqual( [ expected ] );
177
332
  } );
178
333
 
179
334
  it( 'should ignore font-face selectors', () => {
@@ -191,14 +346,11 @@ describe( 'transformStyles', () => {
191
346
  '.my-namespace'
192
347
  );
193
348
 
194
- expect( output ).toMatchSnapshot();
349
+ expect( output ).toEqual( [ input ] );
195
350
  } );
196
351
 
197
- it( 'should replace :root selectors', () => {
198
- const input = `
199
- :root {
200
- --my-color: #ff0000;
201
- }`;
352
+ it( 'should not double wrap selectors', () => {
353
+ const input = ' .my-namespace h1, .red { color: red; }';
202
354
  const output = transformStyles(
203
355
  [
204
356
  {
@@ -207,57 +359,111 @@ describe( 'transformStyles', () => {
207
359
  ],
208
360
  '.my-namespace'
209
361
  );
362
+ const expected = ` .my-namespace h1, .my-namespace .red { color: red; }`;
210
363
 
211
- expect( output ).toMatchSnapshot();
364
+ expect( output ).toEqual( [ expected ] );
212
365
  } );
213
366
 
214
- it( 'should not double wrap selectors', () => {
215
- const input = ` .my-namespace h1, .red { color: red; }`;
367
+ it( 'should not double wrap selectors when the prefix can be misinterpreted as a regular expression', () => {
368
+ const input =
369
+ ' :where(.editor-styles-wrapper) h1, .red { color: red; }';
370
+ const output = transformStyles(
371
+ [
372
+ {
373
+ css: input,
374
+ },
375
+ ],
376
+ ':where(.editor-styles-wrapper)'
377
+ );
378
+ const expected = ` :where(.editor-styles-wrapper) h1, :where(.editor-styles-wrapper) .red { color: red; }`;
379
+
380
+ expect( output ).toEqual( [ expected ] );
381
+ } );
216
382
 
383
+ it( 'should allow specification of ignoredSelectors per css input', () => {
384
+ const input = '.ignored { color: red; }';
217
385
  const output = transformStyles(
218
386
  [
387
+ {
388
+ css: input,
389
+ ignoredSelectors: [ '.ignored' ],
390
+ },
391
+ {
392
+ css: input,
393
+ ignoredSelectors: [ /^\.ignored/ ],
394
+ },
219
395
  {
220
396
  css: input,
221
397
  },
222
398
  ],
223
- '.my-namespace'
399
+ '.not'
224
400
  );
401
+ const expected1 = input;
402
+ const expected2 = input;
403
+ const expected3 = '.not .ignored { color: red; }';
225
404
 
226
- expect( output ).toMatchSnapshot();
405
+ expect( output ).toEqual( [ expected1, expected2, expected3 ] );
227
406
  } );
228
407
 
229
- it( 'should not try to wrap items within `:where` selectors', () => {
230
- const input = `:where(.wp-element-button:active, .wp-block-button__link:active) { color: blue; }`;
231
- const prefix = '.my-namespace';
232
- const expected = [ `${ prefix } ${ input }` ];
408
+ it( 'allows specification of ignoredSelectors globally via the transformOptions param', () => {
409
+ const input1 = '.ignored { color: red; }';
410
+ const input2 = '.modified { color: red; }';
411
+ const input3 = '.regexed { color: red; }';
412
+ const output = transformStyles(
413
+ [
414
+ {
415
+ css: input1,
416
+ },
417
+ {
418
+ css: input2,
419
+ },
420
+ {
421
+ css: input3,
422
+ },
423
+ ],
424
+ '.prefix',
425
+ { ignoredSelectors: [ '.ignored', /\.regexed/ ] }
426
+ );
233
427
 
428
+ expect( output ).toEqual( [
429
+ input1,
430
+ '.prefix .modified { color: red; }',
431
+ input3,
432
+ ] );
433
+ } );
434
+
435
+ it( 'should not try to wrap items within `:where` selectors', () => {
436
+ const input =
437
+ ':where(.wp-element-button:active, .wp-block-button__link:active) { color: blue; }';
234
438
  const output = transformStyles(
235
439
  [
236
440
  {
237
441
  css: input,
238
442
  },
239
443
  ],
240
- prefix
444
+ '.my-namespace'
241
445
  );
446
+ const expected =
447
+ '.my-namespace :where(.wp-element-button:active, .wp-block-button__link:active) { color: blue; }';
242
448
 
243
- expect( output ).toEqual( expected );
449
+ expect( output ).toEqual( [ expected ] );
244
450
  } );
245
451
 
246
452
  it( 'should not try to prefix pseudo elements on `:where` selectors', () => {
247
- const input = `:where(.wp-element-button, .wp-block-button__link)::before { color: blue; }`;
248
- const prefix = '.my-namespace';
249
- const expected = [ `${ prefix } ${ input }` ];
250
-
453
+ const input =
454
+ ':where(.wp-element-button, .wp-block-button__link)::before { color: blue; }';
251
455
  const output = transformStyles(
252
456
  [
253
457
  {
254
458
  css: input,
255
459
  },
256
460
  ],
257
- prefix
461
+ '.my-namespace'
258
462
  );
463
+ const expected =
464
+ '.my-namespace :where(.wp-element-button, .wp-block-button__link)::before { color: blue; }';
259
465
 
260
- expect( output ).toEqual( expected );
466
+ expect( output ).toEqual( [ expected ] );
261
467
  } );
262
468
  } );
263
469
 
@@ -274,7 +480,7 @@ describe( 'transformStyles', () => {
274
480
  },
275
481
  ] );
276
482
 
277
- expect( output ).toMatchSnapshot();
483
+ expect( output ).toEqual( [ input ] );
278
484
  } );
279
485
 
280
486
  describe( 'URL rewrite', () => {
@@ -286,8 +492,10 @@ describe( 'transformStyles', () => {
286
492
  baseURL: 'http://wp-site.local/themes/gut/css/',
287
493
  },
288
494
  ] );
495
+ const expected =
496
+ 'h1 { background: url(http://wp-site.local/themes/gut/css/images/test.png); }';
289
497
 
290
- expect( output ).toMatchSnapshot();
498
+ expect( output ).toEqual( [ expected ] );
291
499
  } );
292
500
 
293
501
  it( 'should replace complex relative paths', () => {
@@ -298,8 +506,10 @@ describe( 'transformStyles', () => {
298
506
  baseURL: 'http://wp-site.local/themes/gut/css/',
299
507
  },
300
508
  ] );
509
+ const expected =
510
+ 'h1 { background: url(http://wp-site.local/themes/gut/images/test.png); }';
301
511
 
302
- expect( output ).toMatchSnapshot();
512
+ expect( output ).toEqual( [ expected ] );
303
513
  } );
304
514
 
305
515
  it( 'should not replace absolute paths', () => {
@@ -310,8 +520,7 @@ describe( 'transformStyles', () => {
310
520
  baseURL: 'http://wp-site.local/themes/gut/css/',
311
521
  },
312
522
  ] );
313
-
314
- expect( output ).toMatchSnapshot();
523
+ expect( output ).toEqual( [ input ] );
315
524
  } );
316
525
 
317
526
  it( 'should not replace remote paths', () => {
@@ -323,7 +532,7 @@ describe( 'transformStyles', () => {
323
532
  },
324
533
  ] );
325
534
 
326
- expect( output ).toMatchSnapshot();
535
+ expect( output ).toEqual( [ input ] );
327
536
  } );
328
537
  } );
329
538
  } );
@@ -1,39 +1,142 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
+ import * as parsel from 'parsel-js';
4
5
  import postcss, { CssSyntaxError } from 'postcss';
5
- import wrap from 'postcss-prefixwrap';
6
+ import prefixSelector from 'postcss-prefix-selector';
6
7
  import rebaseUrl from 'postcss-urlrebase';
7
8
 
8
9
  const cacheByWrapperSelector = new Map();
9
10
 
11
+ const ROOT_SELECTOR_TOKENS = [
12
+ { type: 'type', content: 'body' },
13
+ { type: 'type', content: 'html' },
14
+ { type: 'pseudo-class', content: ':root' },
15
+ { type: 'pseudo-class', content: ':where(body)' },
16
+ { type: 'pseudo-class', content: ':where(:root)' },
17
+ { type: 'pseudo-class', content: ':where(html)' },
18
+ ];
19
+
20
+ /**
21
+ * Prefixes root selectors in a way that ensures consistent specificity.
22
+ * This requires special handling, since prefixing a classname before
23
+ * html, body, or :root will generally result in an invalid selector.
24
+ *
25
+ * Some libraries will simply replace the root selector with the prefix
26
+ * instead, but this results in inconsistent specificity.
27
+ *
28
+ * This function instead inserts the prefix after the root tags but before
29
+ * any other part of the selector. This results in consistent specificity:
30
+ * - If a `:where()` selector is used for the prefix, all selectors output
31
+ * by `transformStyles` will have no specificity increase.
32
+ * - If a classname, id, or something else is used as the prefix, all selectors
33
+ * will have the same specificity bump when transformed.
34
+ *
35
+ * @param {string} prefix The prefix.
36
+ * @param {string} selector The selector.
37
+ *
38
+ * @return {string} The prefixed root selector.
39
+ */
40
+ function prefixRootSelector( prefix, selector ) {
41
+ // Use a tokenizer, since regular expressions are unreliable.
42
+ const tokenized = parsel.tokenize( selector );
43
+
44
+ // Find the last token that contains a root selector by walking back
45
+ // through the tokens.
46
+ const lastRootIndex = tokenized.findLastIndex( ( { content, type } ) => {
47
+ return ROOT_SELECTOR_TOKENS.some(
48
+ ( rootSelector ) =>
49
+ content === rootSelector.content && type === rootSelector.type
50
+ );
51
+ } );
52
+
53
+ // Walk forwards to find the combinator after the last root.
54
+ // This is where the root ends and the rest of the selector begins,
55
+ // and the index to insert before.
56
+ // Doing it this way takes into account that a root selector like
57
+ // 'body' may have additional id/class/pseudo-class/attribute-selector
58
+ // parts chained to it, which is difficult to quantify using a regex.
59
+ let insertionPoint = -1;
60
+ for ( let i = lastRootIndex + 1; i < tokenized.length; i++ ) {
61
+ if ( tokenized[ i ].type === 'combinator' ) {
62
+ insertionPoint = i;
63
+ break;
64
+ }
65
+ }
66
+
67
+ // Tokenize and insert the prefix with a ' ' combinator before it.
68
+ const tokenizedPrefix = parsel.tokenize( prefix );
69
+ tokenized.splice(
70
+ // Insert at the insertion point, or the end.
71
+ insertionPoint === -1 ? tokenized.length : insertionPoint,
72
+ 0,
73
+ {
74
+ type: 'combinator',
75
+ content: ' ',
76
+ },
77
+ ...tokenizedPrefix
78
+ );
79
+
80
+ return parsel.stringify( tokenized );
81
+ }
82
+
10
83
  function transformStyle(
11
84
  { css, ignoredSelectors = [], baseURL },
12
- wrapperSelector = ''
85
+ wrapperSelector = '',
86
+ transformOptions
13
87
  ) {
14
- // When there is no wrapper selector or base URL, there is no need
88
+ // When there is no wrapper selector and no base URL, there is no need
15
89
  // to transform the CSS. This is most cases because in the default
16
90
  // iframed editor, no wrapping is needed, and not many styles
17
91
  // provide a base URL.
18
92
  if ( ! wrapperSelector && ! baseURL ) {
19
93
  return css;
20
94
  }
21
- const postcssFriendlyCSS = css
22
- .replace( /:root :where\(body\)/g, 'body' )
23
- .replace( /:where\(body\)/g, 'body' );
95
+
24
96
  try {
97
+ const excludedSelectors = [
98
+ ...ignoredSelectors,
99
+ ...( transformOptions?.ignoredSelectors ?? [] ),
100
+ wrapperSelector,
101
+ ];
102
+
25
103
  return postcss(
26
104
  [
27
105
  wrapperSelector &&
28
- wrap( wrapperSelector, {
29
- ignoredSelectors: [
30
- ...ignoredSelectors,
31
- wrapperSelector,
32
- ],
106
+ prefixSelector( {
107
+ prefix: wrapperSelector,
108
+ transform( prefix, selector, prefixedSelector ) {
109
+ // For backwards compatibility, don't use the `exclude` option
110
+ // of postcss-prefix-selector, instead handle it here to match
111
+ // the behavior of the old library (postcss-prefix-wrap) that
112
+ // `transformStyle` previously used.
113
+ if (
114
+ excludedSelectors.some( ( excludedSelector ) =>
115
+ excludedSelector instanceof RegExp
116
+ ? selector.match( excludedSelector )
117
+ : selector.includes( excludedSelector )
118
+ )
119
+ ) {
120
+ return selector;
121
+ }
122
+
123
+ const hasRootSelector = ROOT_SELECTOR_TOKENS.some(
124
+ ( rootSelector ) =>
125
+ selector.startsWith( rootSelector.content )
126
+ );
127
+
128
+ // Reorganize root selectors such that the root part comes before the prefix,
129
+ // but the prefix still comes before the remaining part of the selector.
130
+ if ( hasRootSelector ) {
131
+ return prefixRootSelector( prefix, selector );
132
+ }
133
+
134
+ return prefixedSelector;
135
+ },
33
136
  } ),
34
137
  baseURL && rebaseUrl( { rootUrl: baseURL } ),
35
138
  ].filter( Boolean )
36
- ).process( postcssFriendlyCSS, {} ).css; // use sync PostCSS API
139
+ ).process( css, {} ).css; // use sync PostCSS API
37
140
  } catch ( error ) {
38
141
  if ( error instanceof CssSyntaxError ) {
39
142
  // eslint-disable-next-line no-console
@@ -54,18 +157,26 @@ function transformStyle(
54
157
  }
55
158
 
56
159
  /**
57
- * Applies a series of CSS rule transforms to wrap selectors inside a given class and/or rewrite URLs depending on the parameters passed.
58
- *
59
160
  * @typedef {Object} EditorStyle
60
- * @property {string} css the CSS block(s), as a single string.
61
- * @property {?string} baseURL the base URL to be used as the reference when rewritting urls.
62
- * @property {?string[]} ignoredSelectors the selectors not to wrap.
161
+ * @property {string} css the CSS block(s), as a single string.
162
+ * @property {?string} baseURL the base URL to be used as the reference when rewritting urls.
163
+ * @property {?string[]} ignoredSelectors the selectors not to wrap.
164
+ */
165
+
166
+ /**
167
+ * @typedef {Object} TransformOptions
168
+ * @property {?string[]} ignoredSelectors the selectors not to wrap.
169
+ */
170
+
171
+ /**
172
+ * Applies a series of CSS rule transforms to wrap selectors inside a given class and/or rewrite URLs depending on the parameters passed.
63
173
  *
64
- * @param {EditorStyle[]} styles CSS rules.
65
- * @param {string} wrapperSelector Wrapper selector.
174
+ * @param {EditorStyle[]} styles CSS rules.
175
+ * @param {string} wrapperSelector Wrapper selector.
176
+ * @param {TransformOptions} transformOptions Additional options for style transformation.
66
177
  * @return {Array} converted rules.
67
178
  */
68
- const transformStyles = ( styles, wrapperSelector = '' ) => {
179
+ const transformStyles = ( styles, wrapperSelector = '', transformOptions ) => {
69
180
  let cache = cacheByWrapperSelector.get( wrapperSelector );
70
181
  if ( ! cache ) {
71
182
  cache = new WeakMap();
@@ -74,7 +185,7 @@ const transformStyles = ( styles, wrapperSelector = '' ) => {
74
185
  return styles.map( ( style ) => {
75
186
  let css = cache.get( style );
76
187
  if ( ! css ) {
77
- css = transformStyle( style, wrapperSelector );
188
+ css = transformStyle( style, wrapperSelector, transformOptions );
78
189
  cache.set( style, css );
79
190
  }
80
191
  return css;
package/tsconfig.json CHANGED
@@ -8,6 +8,7 @@
8
8
  "references": [
9
9
  { "path": "../a11y" },
10
10
  { "path": "../api-fetch" },
11
+ { "path": "../block-serialization-default-parser" },
11
12
  { "path": "../blob" },
12
13
  { "path": "../components" },
13
14
  { "path": "../compose" },