@wordpress/block-library 9.38.0 → 9.39.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 (470) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/block/block.json +2 -1
  3. package/build/breadcrumbs/edit.cjs +15 -5
  4. package/build/breadcrumbs/edit.cjs.map +2 -2
  5. package/build/breadcrumbs/index.cjs +1 -0
  6. package/build/breadcrumbs/index.cjs.map +2 -2
  7. package/build/button/index.cjs +3 -0
  8. package/build/button/index.cjs.map +2 -2
  9. package/build/comment-date/block.json +1 -0
  10. package/build/comment-edit-link/block.json +1 -3
  11. package/build/comment-edit-link/deprecated.cjs +91 -0
  12. package/build/comment-edit-link/deprecated.cjs.map +7 -0
  13. package/build/comment-edit-link/edit.cjs +6 -18
  14. package/build/comment-edit-link/edit.cjs.map +3 -3
  15. package/build/comment-edit-link/index.cjs +2 -0
  16. package/build/comment-edit-link/index.cjs.map +3 -3
  17. package/build/comment-reply-link/block.json +1 -5
  18. package/build/comment-reply-link/deprecated.cjs +84 -0
  19. package/build/comment-reply-link/deprecated.cjs.map +7 -0
  20. package/build/comment-reply-link/edit.cjs +10 -23
  21. package/build/comment-reply-link/edit.cjs.map +3 -3
  22. package/build/comment-reply-link/index.cjs +2 -0
  23. package/build/comment-reply-link/index.cjs.map +3 -3
  24. package/build/comments-title/block.json +1 -3
  25. package/build/comments-title/deprecated.cjs +148 -24
  26. package/build/comments-title/deprecated.cjs.map +3 -3
  27. package/build/comments-title/edit.cjs +17 -31
  28. package/build/comments-title/edit.cjs.map +3 -3
  29. package/build/cover/edit/block-controls.cjs +10 -2
  30. package/build/cover/edit/block-controls.cjs.map +2 -2
  31. package/build/cover/edit/embed-video-url-input.cjs +6 -2
  32. package/build/cover/edit/embed-video-url-input.cjs.map +2 -2
  33. package/build/cover/edit/inspector-controls.cjs +1 -1
  34. package/build/cover/edit/inspector-controls.cjs.map +2 -2
  35. package/build/details/index.cjs +3 -0
  36. package/build/details/index.cjs.map +2 -2
  37. package/build/embed/util.cjs +9 -0
  38. package/build/embed/util.cjs.map +2 -2
  39. package/build/freeform/block.json +2 -1
  40. package/build/heading/index.cjs +3 -0
  41. package/build/heading/index.cjs.map +2 -2
  42. package/build/html/block.json +2 -1
  43. package/build/image/image.cjs +43 -9
  44. package/build/image/image.cjs.map +2 -2
  45. package/build/image/index.cjs +1 -1
  46. package/build/image/index.cjs.map +2 -2
  47. package/build/index.cjs +6 -0
  48. package/build/index.cjs.map +2 -2
  49. package/build/list-item/index.cjs +12 -1
  50. package/build/list-item/index.cjs.map +2 -2
  51. package/build/missing/block.json +2 -1
  52. package/build/more/block.json +2 -1
  53. package/build/more/index.cjs +1 -1
  54. package/build/more/index.cjs.map +2 -2
  55. package/build/navigation/block.json +5 -4
  56. package/build/navigation/deprecated.cjs +133 -5
  57. package/build/navigation/deprecated.cjs.map +2 -2
  58. package/build/navigation/edit/deleted-overlay-warning.cjs +70 -0
  59. package/build/navigation/edit/deleted-overlay-warning.cjs.map +7 -0
  60. package/build/navigation/edit/index.cjs +143 -65
  61. package/build/navigation/edit/index.cjs.map +3 -3
  62. package/build/navigation/edit/overlay-panel.cjs +10 -1
  63. package/build/navigation/edit/overlay-panel.cjs.map +3 -3
  64. package/build/navigation/edit/overlay-preview.cjs +120 -0
  65. package/build/navigation/edit/overlay-preview.cjs.map +7 -0
  66. package/build/navigation/edit/overlay-template-part-selector.cjs +59 -24
  67. package/build/navigation/edit/overlay-template-part-selector.cjs.map +3 -3
  68. package/build/navigation/edit/responsive-wrapper.cjs +12 -1
  69. package/build/navigation/edit/responsive-wrapper.cjs.map +3 -3
  70. package/build/navigation/edit/use-create-overlay.cjs +19 -2
  71. package/build/navigation/edit/use-create-overlay.cjs.map +3 -3
  72. package/build/navigation/utils/get-submenu-visibility.cjs +37 -0
  73. package/build/navigation/utils/get-submenu-visibility.cjs.map +7 -0
  74. package/build/navigation-link/edit.cjs +2 -40
  75. package/build/navigation-link/edit.cjs.map +2 -2
  76. package/build/navigation-link/shared/index.cjs +6 -0
  77. package/build/navigation-link/shared/index.cjs.map +2 -2
  78. package/build/navigation-link/shared/select-label-text.cjs +40 -0
  79. package/build/navigation-link/shared/select-label-text.cjs.map +7 -0
  80. package/build/navigation-link/shared/use-is-dragging-within.cjs +59 -0
  81. package/build/navigation-link/shared/use-is-dragging-within.cjs.map +7 -0
  82. package/build/navigation-submenu/block.json +1 -1
  83. package/build/navigation-submenu/edit.cjs +8 -47
  84. package/build/navigation-submenu/edit.cjs.map +2 -2
  85. package/build/navigation-submenu/index.cjs +2 -2
  86. package/build/navigation-submenu/index.cjs.map +2 -2
  87. package/build/nextpage/block.json +2 -1
  88. package/build/paragraph/block.json +1 -0
  89. package/build/paragraph/index.cjs +1 -1
  90. package/build/paragraph/index.cjs.map +2 -2
  91. package/build/post-excerpt/edit.cjs +1 -1
  92. package/build/post-excerpt/edit.cjs.map +2 -2
  93. package/build/shortcode/block.json +2 -1
  94. package/build/tab/add-tab-toolbar-control.cjs +31 -9
  95. package/build/tab/add-tab-toolbar-control.cjs.map +2 -2
  96. package/build/tab/block.json +18 -4
  97. package/build/tab/controls.cjs +4 -8
  98. package/build/tab/controls.cjs.map +3 -3
  99. package/build/tab/edit.cjs +46 -118
  100. package/build/tab/edit.cjs.map +3 -3
  101. package/build/tab/remove-tab-toolbar-control.cjs +91 -0
  102. package/build/tab/remove-tab-toolbar-control.cjs.map +7 -0
  103. package/build/tab/save.cjs +2 -2
  104. package/build/tab/save.cjs.map +2 -2
  105. package/build/tab-panels/block.json +70 -0
  106. package/build/tab-panels/edit.cjs +63 -0
  107. package/build/tab-panels/edit.cjs.map +7 -0
  108. package/build/tab-panels/icon.cjs +29 -0
  109. package/build/tab-panels/icon.cjs.map +7 -0
  110. package/build/tab-panels/index.cjs +58 -0
  111. package/build/tab-panels/index.cjs.map +7 -0
  112. package/build/tab-panels/save.cjs +33 -0
  113. package/build/tab-panels/save.cjs.map +7 -0
  114. package/build/tabs/block.json +61 -90
  115. package/build/tabs/controls.cjs +19 -221
  116. package/build/tabs/controls.cjs.map +3 -3
  117. package/build/tabs/deprecated.cjs +179 -0
  118. package/build/tabs/deprecated.cjs.map +7 -0
  119. package/build/tabs/edit.cjs +84 -62
  120. package/build/tabs/edit.cjs.map +3 -3
  121. package/build/tabs/index.cjs +3 -1
  122. package/build/tabs/index.cjs.map +3 -3
  123. package/build/tabs/save.cjs +6 -9
  124. package/build/tabs/save.cjs.map +2 -2
  125. package/build/tabs-menu/block.json +77 -0
  126. package/build/tabs-menu/edit.cjs +204 -0
  127. package/build/tabs-menu/edit.cjs.map +7 -0
  128. package/build/tabs-menu/icon.cjs +29 -0
  129. package/build/tabs-menu/icon.cjs.map +7 -0
  130. package/build/tabs-menu/index.cjs +58 -0
  131. package/build/tabs-menu/index.cjs.map +7 -0
  132. package/build/tabs-menu/save.cjs +35 -0
  133. package/build/tabs-menu/save.cjs.map +7 -0
  134. package/build/tabs-menu-item/block.json +98 -0
  135. package/build/tabs-menu-item/controls.cjs +247 -0
  136. package/build/tabs-menu-item/controls.cjs.map +7 -0
  137. package/build/tabs-menu-item/edit.cjs +272 -0
  138. package/build/tabs-menu-item/edit.cjs.map +7 -0
  139. package/build/tabs-menu-item/icon.cjs +29 -0
  140. package/build/tabs-menu-item/icon.cjs.map +7 -0
  141. package/build/tabs-menu-item/index.cjs +58 -0
  142. package/build/tabs-menu-item/index.cjs.map +7 -0
  143. package/build/tabs-menu-item/save.cjs +50 -0
  144. package/build/tabs-menu-item/save.cjs.map +7 -0
  145. package/build/template-part/edit/index.cjs +2 -2
  146. package/build/template-part/edit/index.cjs.map +2 -2
  147. package/build/utils/caption.cjs +4 -6
  148. package/build/utils/caption.cjs.map +3 -3
  149. package/build/verse/block.json +1 -3
  150. package/build/verse/deprecated.cjs +74 -5
  151. package/build/verse/deprecated.cjs.map +3 -3
  152. package/build/verse/edit.cjs +33 -48
  153. package/build/verse/edit.cjs.map +3 -3
  154. package/build/verse/save.cjs +2 -16
  155. package/build/verse/save.cjs.map +3 -3
  156. package/build/video/edit.cjs +4 -2
  157. package/build/video/edit.cjs.map +2 -2
  158. package/build-module/block/block.json +2 -1
  159. package/build-module/breadcrumbs/edit.mjs +15 -5
  160. package/build-module/breadcrumbs/edit.mjs.map +2 -2
  161. package/build-module/breadcrumbs/index.mjs +1 -0
  162. package/build-module/breadcrumbs/index.mjs.map +2 -2
  163. package/build-module/button/index.mjs +3 -0
  164. package/build-module/button/index.mjs.map +2 -2
  165. package/build-module/comment-date/block.json +1 -0
  166. package/build-module/comment-edit-link/block.json +1 -3
  167. package/build-module/comment-edit-link/deprecated.mjs +60 -0
  168. package/build-module/comment-edit-link/deprecated.mjs.map +7 -0
  169. package/build-module/comment-edit-link/edit.mjs +7 -24
  170. package/build-module/comment-edit-link/edit.mjs.map +2 -2
  171. package/build-module/comment-edit-link/index.mjs +2 -0
  172. package/build-module/comment-edit-link/index.mjs.map +2 -2
  173. package/build-module/comment-reply-link/block.json +1 -5
  174. package/build-module/comment-reply-link/deprecated.mjs +53 -0
  175. package/build-module/comment-reply-link/deprecated.mjs.map +7 -0
  176. package/build-module/comment-reply-link/edit.mjs +12 -29
  177. package/build-module/comment-reply-link/edit.mjs.map +2 -2
  178. package/build-module/comment-reply-link/index.mjs +2 -0
  179. package/build-module/comment-reply-link/index.mjs.map +2 -2
  180. package/build-module/comments-title/block.json +1 -3
  181. package/build-module/comments-title/deprecated.mjs +148 -24
  182. package/build-module/comments-title/deprecated.mjs.map +2 -2
  183. package/build-module/comments-title/edit.mjs +17 -32
  184. package/build-module/comments-title/edit.mjs.map +2 -2
  185. package/build-module/cover/edit/block-controls.mjs +11 -3
  186. package/build-module/cover/edit/block-controls.mjs.map +2 -2
  187. package/build-module/cover/edit/embed-video-url-input.mjs +6 -2
  188. package/build-module/cover/edit/embed-video-url-input.mjs.map +2 -2
  189. package/build-module/cover/edit/inspector-controls.mjs +1 -1
  190. package/build-module/cover/edit/inspector-controls.mjs.map +2 -2
  191. package/build-module/details/index.mjs +3 -0
  192. package/build-module/details/index.mjs.map +2 -2
  193. package/build-module/embed/util.mjs +8 -0
  194. package/build-module/embed/util.mjs.map +2 -2
  195. package/build-module/freeform/block.json +2 -1
  196. package/build-module/heading/index.mjs +3 -0
  197. package/build-module/heading/index.mjs.map +2 -2
  198. package/build-module/html/block.json +2 -1
  199. package/build-module/image/image.mjs +43 -9
  200. package/build-module/image/image.mjs.map +2 -2
  201. package/build-module/image/index.mjs +1 -1
  202. package/build-module/image/index.mjs.map +2 -2
  203. package/build-module/index.mjs +6 -0
  204. package/build-module/index.mjs.map +2 -2
  205. package/build-module/list-item/index.mjs +12 -1
  206. package/build-module/list-item/index.mjs.map +2 -2
  207. package/build-module/missing/block.json +2 -1
  208. package/build-module/more/block.json +2 -1
  209. package/build-module/more/index.mjs +1 -1
  210. package/build-module/more/index.mjs.map +2 -2
  211. package/build-module/navigation/block.json +5 -4
  212. package/build-module/navigation/deprecated.mjs +133 -5
  213. package/build-module/navigation/deprecated.mjs.map +2 -2
  214. package/build-module/navigation/edit/deleted-overlay-warning.mjs +49 -0
  215. package/build-module/navigation/edit/deleted-overlay-warning.mjs.map +7 -0
  216. package/build-module/navigation/edit/index.mjs +145 -65
  217. package/build-module/navigation/edit/index.mjs.map +2 -2
  218. package/build-module/navigation/edit/overlay-panel.mjs +10 -1
  219. package/build-module/navigation/edit/overlay-panel.mjs.map +2 -2
  220. package/build-module/navigation/edit/overlay-preview.mjs +99 -0
  221. package/build-module/navigation/edit/overlay-preview.mjs.map +7 -0
  222. package/build-module/navigation/edit/overlay-template-part-selector.mjs +61 -26
  223. package/build-module/navigation/edit/overlay-template-part-selector.mjs.map +2 -2
  224. package/build-module/navigation/edit/responsive-wrapper.mjs +12 -1
  225. package/build-module/navigation/edit/responsive-wrapper.mjs.map +2 -2
  226. package/build-module/navigation/edit/use-create-overlay.mjs +21 -4
  227. package/build-module/navigation/edit/use-create-overlay.mjs.map +2 -2
  228. package/build-module/navigation/utils/get-submenu-visibility.mjs +12 -0
  229. package/build-module/navigation/utils/get-submenu-visibility.mjs.map +7 -0
  230. package/build-module/navigation-link/edit.mjs +4 -40
  231. package/build-module/navigation-link/edit.mjs.map +2 -2
  232. package/build-module/navigation-link/shared/index.mjs +4 -0
  233. package/build-module/navigation-link/shared/index.mjs.map +2 -2
  234. package/build-module/navigation-link/shared/select-label-text.mjs +15 -0
  235. package/build-module/navigation-link/shared/select-label-text.mjs.map +7 -0
  236. package/build-module/navigation-link/shared/use-is-dragging-within.mjs +34 -0
  237. package/build-module/navigation-link/shared/use-is-dragging-within.mjs.map +7 -0
  238. package/build-module/navigation-submenu/block.json +1 -1
  239. package/build-module/navigation-submenu/edit.mjs +10 -47
  240. package/build-module/navigation-submenu/edit.mjs.map +2 -2
  241. package/build-module/navigation-submenu/index.mjs +2 -2
  242. package/build-module/navigation-submenu/index.mjs.map +2 -2
  243. package/build-module/nextpage/block.json +2 -1
  244. package/build-module/paragraph/block.json +1 -0
  245. package/build-module/paragraph/index.mjs +1 -1
  246. package/build-module/paragraph/index.mjs.map +2 -2
  247. package/build-module/post-excerpt/edit.mjs +1 -1
  248. package/build-module/post-excerpt/edit.mjs.map +2 -2
  249. package/build-module/shortcode/block.json +2 -1
  250. package/build-module/tab/add-tab-toolbar-control.mjs +32 -10
  251. package/build-module/tab/add-tab-toolbar-control.mjs.map +2 -2
  252. package/build-module/tab/block.json +18 -4
  253. package/build-module/tab/controls.mjs +4 -8
  254. package/build-module/tab/controls.mjs.map +2 -2
  255. package/build-module/tab/edit.mjs +48 -128
  256. package/build-module/tab/edit.mjs.map +2 -2
  257. package/build-module/tab/remove-tab-toolbar-control.mjs +73 -0
  258. package/build-module/tab/remove-tab-toolbar-control.mjs.map +7 -0
  259. package/build-module/tab/save.mjs +2 -2
  260. package/build-module/tab/save.mjs.map +2 -2
  261. package/build-module/tab-panels/block.json +70 -0
  262. package/build-module/tab-panels/edit.mjs +36 -0
  263. package/build-module/tab-panels/edit.mjs.map +7 -0
  264. package/build-module/tab-panels/icon.mjs +8 -0
  265. package/build-module/tab-panels/icon.mjs.map +7 -0
  266. package/build-module/tab-panels/index.mjs +20 -0
  267. package/build-module/tab-panels/index.mjs.map +7 -0
  268. package/build-module/tab-panels/save.mjs +12 -0
  269. package/build-module/tab-panels/save.mjs.map +7 -0
  270. package/build-module/tabs/block.json +61 -90
  271. package/build-module/tabs/controls.mjs +21 -228
  272. package/build-module/tabs/controls.mjs.map +2 -2
  273. package/build-module/tabs/deprecated.mjs +158 -0
  274. package/build-module/tabs/deprecated.mjs.map +7 -0
  275. package/build-module/tabs/edit.mjs +87 -64
  276. package/build-module/tabs/edit.mjs.map +2 -2
  277. package/build-module/tabs/index.mjs +3 -1
  278. package/build-module/tabs/index.mjs.map +2 -2
  279. package/build-module/tabs/save.mjs +7 -10
  280. package/build-module/tabs/save.mjs.map +2 -2
  281. package/build-module/tabs-menu/block.json +77 -0
  282. package/build-module/tabs-menu/edit.mjs +186 -0
  283. package/build-module/tabs-menu/edit.mjs.map +7 -0
  284. package/build-module/tabs-menu/icon.mjs +8 -0
  285. package/build-module/tabs-menu/icon.mjs.map +7 -0
  286. package/build-module/tabs-menu/index.mjs +20 -0
  287. package/build-module/tabs-menu/index.mjs.map +7 -0
  288. package/build-module/tabs-menu/save.mjs +14 -0
  289. package/build-module/tabs-menu/save.mjs.map +7 -0
  290. package/build-module/tabs-menu-item/block.json +98 -0
  291. package/build-module/tabs-menu-item/controls.mjs +227 -0
  292. package/build-module/tabs-menu-item/controls.mjs.map +7 -0
  293. package/build-module/tabs-menu-item/edit.mjs +253 -0
  294. package/build-module/tabs-menu-item/edit.mjs.map +7 -0
  295. package/build-module/tabs-menu-item/icon.mjs +8 -0
  296. package/build-module/tabs-menu-item/icon.mjs.map +7 -0
  297. package/build-module/tabs-menu-item/index.mjs +20 -0
  298. package/build-module/tabs-menu-item/index.mjs.map +7 -0
  299. package/build-module/tabs-menu-item/save.mjs +29 -0
  300. package/build-module/tabs-menu-item/save.mjs.map +7 -0
  301. package/build-module/template-part/edit/index.mjs +2 -2
  302. package/build-module/template-part/edit/index.mjs.map +2 -2
  303. package/build-module/utils/caption.mjs +1 -3
  304. package/build-module/utils/caption.mjs.map +2 -2
  305. package/build-module/verse/block.json +1 -3
  306. package/build-module/verse/deprecated.mjs +74 -5
  307. package/build-module/verse/deprecated.mjs.map +2 -2
  308. package/build-module/verse/edit.mjs +35 -55
  309. package/build-module/verse/edit.mjs.map +2 -2
  310. package/build-module/verse/save.mjs +2 -6
  311. package/build-module/verse/save.mjs.map +2 -2
  312. package/build-module/video/edit.mjs +4 -2
  313. package/build-module/video/edit.mjs.map +2 -2
  314. package/build-style/editor-rtl.css +64 -21
  315. package/build-style/editor.css +64 -21
  316. package/build-style/gallery/style-rtl.css +1 -1
  317. package/build-style/gallery/style.css +1 -1
  318. package/build-style/media-text/style-rtl.css +2 -0
  319. package/build-style/media-text/style.css +2 -0
  320. package/build-style/navigation/editor-rtl.css +48 -0
  321. package/build-style/navigation/editor.css +48 -0
  322. package/build-style/navigation/style-rtl.css +64 -18
  323. package/build-style/navigation/style.css +64 -18
  324. package/build-style/style-rtl.css +109 -171
  325. package/build-style/style.css +109 -171
  326. package/build-style/tab/style-rtl.css +7 -1
  327. package/build-style/tab/style.css +7 -1
  328. package/build-style/tab-panels/style-rtl.css +4 -0
  329. package/build-style/tab-panels/style.css +4 -0
  330. package/build-style/tabs/style-rtl.css +1 -167
  331. package/build-style/tabs/style.css +1 -167
  332. package/build-style/tabs-menu/editor-rtl.css +4 -0
  333. package/build-style/tabs-menu/editor.css +4 -0
  334. package/build-style/tabs-menu/style-rtl.css +8 -0
  335. package/build-style/tabs-menu/style.css +8 -0
  336. package/build-style/tabs-menu-item/editor-rtl.css +16 -0
  337. package/build-style/tabs-menu-item/editor.css +16 -0
  338. package/build-style/tabs-menu-item/style-rtl.css +34 -0
  339. package/build-style/tabs-menu-item/style.css +34 -0
  340. package/build-style/verse/style-rtl.css +1 -0
  341. package/build-style/verse/style.css +1 -0
  342. package/package.json +37 -37
  343. package/src/block/block.json +2 -1
  344. package/src/breadcrumbs/edit.js +10 -2
  345. package/src/breadcrumbs/index.js +1 -0
  346. package/src/button/index.js +4 -0
  347. package/src/categories/index.php +5 -1
  348. package/src/comment-date/block.json +1 -0
  349. package/src/comment-edit-link/block.json +1 -3
  350. package/src/comment-edit-link/deprecated.js +63 -0
  351. package/src/comment-edit-link/edit.js +7 -31
  352. package/src/comment-edit-link/index.js +2 -0
  353. package/src/comment-reply-link/block.json +1 -5
  354. package/src/comment-reply-link/deprecated.js +56 -0
  355. package/src/comment-reply-link/edit.js +6 -35
  356. package/src/comment-reply-link/index.js +2 -0
  357. package/src/comments-title/block.json +1 -3
  358. package/src/comments-title/deprecated.js +153 -23
  359. package/src/comments-title/edit.js +9 -25
  360. package/src/cover/edit/block-controls.js +14 -3
  361. package/src/cover/edit/embed-video-url-input.js +6 -2
  362. package/src/cover/edit/inspector-controls.js +1 -3
  363. package/src/details/index.js +4 -0
  364. package/src/editor.scss +2 -1
  365. package/src/embed/test/index.js +49 -0
  366. package/src/embed/util.js +21 -0
  367. package/src/freeform/block.json +2 -1
  368. package/src/gallery/style.scss +1 -1
  369. package/src/heading/index.js +4 -0
  370. package/src/html/block.json +2 -1
  371. package/src/image/image.js +63 -11
  372. package/src/image/index.js +4 -1
  373. package/src/index.js +6 -0
  374. package/src/list-item/index.js +16 -0
  375. package/src/media-text/style.scss +2 -0
  376. package/src/missing/block.json +2 -1
  377. package/src/more/block.json +2 -1
  378. package/src/more/index.js +4 -1
  379. package/src/navigation/block.json +5 -4
  380. package/src/navigation/deprecated.js +144 -5
  381. package/src/navigation/edit/deleted-overlay-warning.js +56 -0
  382. package/src/navigation/edit/index.js +181 -70
  383. package/src/navigation/edit/overlay-panel.js +10 -0
  384. package/src/navigation/edit/overlay-preview.js +133 -0
  385. package/src/navigation/edit/overlay-template-part-selector.js +76 -26
  386. package/src/navigation/edit/responsive-wrapper.js +14 -1
  387. package/src/navigation/edit/test/overlay-template-part-selector.js +24 -16
  388. package/src/navigation/edit/test/responsive-wrapper.js +179 -0
  389. package/src/navigation/edit/test/use-create-overlay.js +129 -2
  390. package/src/navigation/edit/use-create-overlay.js +26 -4
  391. package/src/navigation/editor.scss +51 -0
  392. package/src/navigation/index.php +59 -11
  393. package/src/navigation/style.scss +140 -76
  394. package/src/navigation/utils/get-submenu-visibility.js +27 -0
  395. package/src/navigation/utils/test/get-submenu-visibility.js +47 -0
  396. package/src/navigation-link/edit.js +3 -67
  397. package/src/navigation-link/shared/index.js +2 -0
  398. package/src/navigation-link/shared/select-label-text.js +16 -0
  399. package/src/navigation-link/shared/use-is-dragging-within.js +55 -0
  400. package/src/navigation-submenu/block.json +1 -1
  401. package/src/navigation-submenu/edit.js +10 -73
  402. package/src/navigation-submenu/index.js +6 -3
  403. package/src/navigation-submenu/index.php +36 -5
  404. package/src/nextpage/block.json +2 -1
  405. package/src/paragraph/block.json +1 -0
  406. package/src/paragraph/index.js +4 -1
  407. package/src/post-excerpt/edit.js +1 -1
  408. package/src/post-excerpt/index.php +39 -16
  409. package/src/shortcode/block.json +2 -1
  410. package/src/style.scss +3 -0
  411. package/src/tab/add-tab-toolbar-control.js +36 -11
  412. package/src/tab/block.json +18 -4
  413. package/src/tab/controls.js +4 -5
  414. package/src/tab/edit.js +75 -150
  415. package/src/tab/index.php +5 -63
  416. package/src/tab/remove-tab-toolbar-control.js +103 -0
  417. package/src/tab/save.js +1 -3
  418. package/src/tab/style.scss +8 -1
  419. package/src/tab-panels/block.json +70 -0
  420. package/src/tab-panels/edit.js +44 -0
  421. package/src/tab-panels/icon.js +10 -0
  422. package/src/tab-panels/index.js +21 -0
  423. package/src/tab-panels/save.js +11 -0
  424. package/src/tab-panels/style.scss +4 -0
  425. package/src/tabs/block.json +61 -90
  426. package/src/tabs/controls.js +7 -221
  427. package/src/tabs/deprecated.js +214 -0
  428. package/src/tabs/edit.js +108 -68
  429. package/src/tabs/index.js +2 -0
  430. package/src/tabs/index.php +86 -191
  431. package/src/tabs/save.js +6 -13
  432. package/src/tabs/style.scss +1 -187
  433. package/src/tabs-menu/block.json +77 -0
  434. package/src/tabs-menu/edit.js +251 -0
  435. package/src/tabs-menu/editor.scss +6 -0
  436. package/src/tabs-menu/icon.js +10 -0
  437. package/src/tabs-menu/index.js +21 -0
  438. package/src/tabs-menu/index.php +74 -0
  439. package/src/tabs-menu/save.js +18 -0
  440. package/src/tabs-menu/style.scss +8 -0
  441. package/src/tabs-menu-item/block.json +98 -0
  442. package/src/tabs-menu-item/controls.js +262 -0
  443. package/src/tabs-menu-item/edit.js +322 -0
  444. package/src/tabs-menu-item/editor.scss +20 -0
  445. package/src/tabs-menu-item/icon.js +10 -0
  446. package/src/tabs-menu-item/index.js +21 -0
  447. package/src/tabs-menu-item/index.php +82 -0
  448. package/src/tabs-menu-item/save.js +44 -0
  449. package/src/tabs-menu-item/style.scss +42 -0
  450. package/src/template-part/edit/index.js +2 -4
  451. package/src/utils/caption.js +1 -7
  452. package/src/verse/block.json +1 -3
  453. package/src/verse/deprecated.js +83 -4
  454. package/src/verse/edit.js +37 -56
  455. package/src/verse/save.js +2 -11
  456. package/src/verse/style.scss +1 -0
  457. package/src/video/edit.js +4 -2
  458. package/build/tab/tabs-list.cjs +0 -132
  459. package/build/tab/tabs-list.cjs.map +0 -7
  460. package/build/tabs/style-engine.cjs +0 -119
  461. package/build/tabs/style-engine.cjs.map +0 -7
  462. package/build-module/tab/tabs-list.mjs +0 -101
  463. package/build-module/tab/tabs-list.mjs.map +0 -7
  464. package/build-module/tabs/style-engine.mjs +0 -101
  465. package/build-module/tabs/style-engine.mjs.map +0 -7
  466. package/build-style/tabs/editor-rtl.css +0 -26
  467. package/build-style/tabs/editor.css +0 -26
  468. package/src/tab/tabs-list.js +0 -122
  469. package/src/tabs/editor.scss +0 -30
  470. package/src/tabs/style-engine.js +0 -164
@@ -2,8 +2,8 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useMemo, useState, useCallback } from '@wordpress/element';
5
- import { useEntityRecords } from '@wordpress/core-data';
6
- import { useDispatch } from '@wordpress/data';
5
+ import { useEntityRecords, store as coreStore } from '@wordpress/core-data';
6
+ import { useDispatch, useSelect } from '@wordpress/data';
7
7
  import {
8
8
  SelectControl,
9
9
  Button,
@@ -21,6 +21,7 @@ import { plus } from '@wordpress/icons';
21
21
  */
22
22
  import { createTemplatePartId } from '../../template-part/edit/utils/create-template-part-id';
23
23
  import useCreateOverlayTemplatePart from './use-create-overlay';
24
+ import DeletedOverlayWarning from './deleted-overlay-warning';
24
25
  import { NAVIGATION_OVERLAY_TEMPLATE_PART_AREA } from '../constants';
25
26
 
26
27
  /**
@@ -47,6 +48,11 @@ export default function OverlayTemplatePartSelector( {
47
48
 
48
49
  const { createErrorNotice } = useDispatch( noticesStore );
49
50
 
51
+ const currentTheme = useSelect(
52
+ ( select ) => select( coreStore ).getCurrentTheme()?.stylesheet,
53
+ []
54
+ );
55
+
50
56
  // Track if we're currently creating a new overlay
51
57
  const [ isCreating, setIsCreating ] = useState( false );
52
58
 
@@ -65,6 +71,16 @@ export default function OverlayTemplatePartSelector( {
65
71
  const createOverlayTemplatePart =
66
72
  useCreateOverlayTemplatePart( overlayTemplateParts );
67
73
 
74
+ // Find the selected template part to get its title
75
+ const selectedTemplatePart = useMemo( () => {
76
+ if ( ! overlay || ! overlayTemplateParts ) {
77
+ return null;
78
+ }
79
+ return overlayTemplateParts.find(
80
+ ( templatePart ) => templatePart.slug === overlay
81
+ );
82
+ }, [ overlay, overlayTemplateParts ] );
83
+
68
84
  // Build options for SelectControl
69
85
  const options = useMemo( () => {
70
86
  const baseOptions = [
@@ -80,37 +96,37 @@ export default function OverlayTemplatePartSelector( {
80
96
 
81
97
  const templatePartOptions = overlayTemplateParts.map(
82
98
  ( templatePart ) => {
83
- const templatePartId = createTemplatePartId(
84
- templatePart.theme,
85
- templatePart.slug
86
- );
87
99
  const label = templatePart.title?.rendered
88
100
  ? decodeEntities( templatePart.title.rendered )
89
101
  : templatePart.slug;
90
102
 
91
103
  return {
92
104
  label,
93
- value: templatePartId,
105
+ value: templatePart.slug,
94
106
  };
95
107
  }
96
108
  );
97
109
 
98
- return [ ...baseOptions, ...templatePartOptions ];
99
- }, [ overlayTemplateParts, hasResolved, isResolving ] );
100
-
101
- // Find the selected template part to get its title
102
- const selectedTemplatePart = useMemo( () => {
103
- if ( ! overlay || ! overlayTemplateParts ) {
104
- return null;
110
+ // If an overlay is selected but not found in the list, add it as a "missing" option
111
+ if ( overlay && ! selectedTemplatePart ) {
112
+ templatePartOptions.unshift( {
113
+ label: sprintf(
114
+ /* translators: %s: Overlay slug. */
115
+ __( '%s (missing)' ),
116
+ overlay
117
+ ),
118
+ value: overlay,
119
+ } );
105
120
  }
106
- return overlayTemplateParts.find( ( templatePart ) => {
107
- const templatePartId = createTemplatePartId(
108
- templatePart.theme,
109
- templatePart.slug
110
- );
111
- return templatePartId === overlay;
112
- } );
113
- }, [ overlay, overlayTemplateParts ] );
121
+
122
+ return [ ...baseOptions, ...templatePartOptions ];
123
+ }, [
124
+ overlayTemplateParts,
125
+ hasResolved,
126
+ isResolving,
127
+ overlay,
128
+ selectedTemplatePart,
129
+ ] );
114
130
 
115
131
  const handleSelectChange = ( value ) => {
116
132
  setAttributes( {
@@ -119,12 +135,21 @@ export default function OverlayTemplatePartSelector( {
119
135
  };
120
136
 
121
137
  const handleEditClick = () => {
122
- if ( ! overlay || ! onNavigateToEntityRecord ) {
138
+ if (
139
+ ! overlay ||
140
+ ! selectedTemplatePart ||
141
+ ! onNavigateToEntityRecord
142
+ ) {
123
143
  return;
124
144
  }
125
145
 
146
+ // Resolve the full template part ID using theme
147
+ // Default to current theme if not set
148
+ const theme = selectedTemplatePart.theme || currentTheme;
149
+ const templatePartId = createTemplatePartId( theme, overlay );
150
+
126
151
  onNavigateToEntityRecord( {
127
- postId: overlay,
152
+ postId: templatePartId,
128
153
  postType: 'wp_template_part',
129
154
  } );
130
155
  };
@@ -136,13 +161,19 @@ export default function OverlayTemplatePartSelector( {
136
161
  const templatePart = await createOverlayTemplatePart();
137
162
 
138
163
  setAttributes( {
139
- overlay: templatePart.id,
164
+ overlay: templatePart.slug,
140
165
  } );
141
166
 
142
167
  // Navigate to the new overlay for editing
168
+ // Create the full ID using theme and slug
143
169
  if ( onNavigateToEntityRecord ) {
170
+ const theme = templatePart.theme || currentTheme;
171
+ const templatePartId = createTemplatePartId(
172
+ theme,
173
+ templatePart.slug
174
+ );
144
175
  onNavigateToEntityRecord( {
145
- postId: templatePart.id,
176
+ postId: templatePartId,
146
177
  postType: 'wp_template_part',
147
178
  } );
148
179
  }
@@ -168,10 +199,22 @@ export default function OverlayTemplatePartSelector( {
168
199
  setAttributes,
169
200
  onNavigateToEntityRecord,
170
201
  createErrorNotice,
202
+ currentTheme,
171
203
  ] );
172
204
 
205
+ const handleClearOverlay = useCallback( () => {
206
+ setAttributes( { overlay: undefined } );
207
+ }, [ setAttributes ] );
208
+
173
209
  const isCreateButtonDisabled = isResolving || isCreating;
174
210
 
211
+ // Check if the selected overlay is missing (deleted)
212
+ const isOverlayMissing = useMemo( () => {
213
+ return (
214
+ overlay && hasResolved && ! isResolving && ! selectedTemplatePart
215
+ );
216
+ }, [ overlay, hasResolved, isResolving, selectedTemplatePart ] );
217
+
175
218
  // Build help text
176
219
  const helpText = useMemo( () => {
177
220
  if ( overlayTemplateParts.length === 0 && hasResolved ) {
@@ -237,6 +280,13 @@ export default function OverlayTemplatePartSelector( {
237
280
  </FlexItem>
238
281
  ) }
239
282
  </HStack>
283
+ { isOverlayMissing && (
284
+ <DeletedOverlayWarning
285
+ onClear={ handleClearOverlay }
286
+ onCreate={ handleCreateOverlay }
287
+ isCreating={ isCreating }
288
+ />
289
+ ) }
240
290
  </div>
241
291
  );
242
292
  }
@@ -10,11 +10,14 @@ import { close, Icon } from '@wordpress/icons';
10
10
  import { Button } from '@wordpress/components';
11
11
  import { __ } from '@wordpress/i18n';
12
12
  import { getColorClassName } from '@wordpress/block-editor';
13
+ import { useSelect } from '@wordpress/data';
14
+ import { store as coreStore } from '@wordpress/core-data';
13
15
 
14
16
  /**
15
17
  * Internal dependencies
16
18
  */
17
19
  import OverlayMenuIcon from './overlay-menu-icon';
20
+ import { createTemplatePartId } from '../../template-part/edit/utils/create-template-part-id';
18
21
 
19
22
  export default function ResponsiveWrapper( {
20
23
  children,
@@ -30,6 +33,11 @@ export default function ResponsiveWrapper( {
30
33
  overlay,
31
34
  onNavigateToEntityRecord,
32
35
  } ) {
36
+ const currentTheme = useSelect(
37
+ ( select ) => select( coreStore ).getCurrentTheme()?.stylesheet,
38
+ []
39
+ );
40
+
33
41
  if ( ! isResponsive ) {
34
42
  return children;
35
43
  }
@@ -87,8 +95,13 @@ export default function ResponsiveWrapper( {
87
95
  const handleToggleClick = () => {
88
96
  // If an overlay template part is selected, navigate to it instead of toggling
89
97
  if ( overlay && onNavigateToEntityRecord ) {
98
+ const templatePartId = createTemplatePartId(
99
+ currentTheme,
100
+ overlay
101
+ );
102
+
90
103
  onNavigateToEntityRecord( {
91
- postId: overlay,
104
+ postId: templatePartId,
92
105
  postType: 'wp_template_part',
93
106
  } );
94
107
  return;
@@ -28,9 +28,10 @@ jest.mock( '../use-create-overlay', () => ( {
28
28
  default: jest.fn(),
29
29
  } ) );
30
30
 
31
- // Mock useDispatch specifically to avoid needing to set up full data store
31
+ // Mock useDispatch and useSelect specifically to avoid needing to set up full data store
32
32
  jest.mock( '@wordpress/data', () => ( {
33
33
  useDispatch: jest.fn(),
34
+ useSelect: jest.fn(),
34
35
  createSelector: jest.fn( ( fn ) => fn ),
35
36
  createRegistrySelector: jest.fn( ( fn ) => fn ),
36
37
  createReduxStore: jest.fn( () => ( {} ) ),
@@ -92,6 +93,7 @@ const allTemplateParts = [
92
93
  describe( 'OverlayTemplatePartSelector', () => {
93
94
  const mockCreateOverlayTemplatePart = jest.fn();
94
95
  const mockCreateErrorNotice = jest.fn();
96
+ const { useSelect } = require( '@wordpress/data' );
95
97
 
96
98
  beforeEach( () => {
97
99
  jest.clearAllMocks();
@@ -107,6 +109,9 @@ describe( 'OverlayTemplatePartSelector', () => {
107
109
  useDispatch.mockReturnValue( {
108
110
  createErrorNotice: mockCreateErrorNotice,
109
111
  } );
112
+ // Mock useSelect to return current theme
113
+ // The component calls: select( coreStore ).getCurrentTheme()?.stylesheet
114
+ useSelect.mockReturnValue( 'twentytwentyfive' );
110
115
  } );
111
116
 
112
117
  describe( 'Loading state', () => {
@@ -195,7 +200,7 @@ describe( 'OverlayTemplatePartSelector', () => {
195
200
  ).toBeInTheDocument();
196
201
  } );
197
202
 
198
- it( 'should call set the overlay attribute when an overlay is selected', async () => {
203
+ it( 'should store slug only when an overlay is selected', async () => {
199
204
  const user = userEvent.setup();
200
205
 
201
206
  useEntityRecords.mockReturnValue( {
@@ -210,10 +215,10 @@ describe( 'OverlayTemplatePartSelector', () => {
210
215
  name: 'Overlay template',
211
216
  } );
212
217
 
213
- await user.selectOptions( select, 'twentytwentyfive//my-overlay' );
218
+ await user.selectOptions( select, 'my-overlay' );
214
219
 
215
220
  expect( mockSetAttributes ).toHaveBeenCalledWith( {
216
- overlay: 'twentytwentyfive//my-overlay',
221
+ overlay: 'my-overlay',
217
222
  } );
218
223
  } );
219
224
 
@@ -229,7 +234,7 @@ describe( 'OverlayTemplatePartSelector', () => {
229
234
  render(
230
235
  <OverlayTemplatePartSelector
231
236
  { ...defaultProps }
232
- overlay="twentytwentyfive//my-overlay"
237
+ overlay="my-overlay"
233
238
  />
234
239
  );
235
240
 
@@ -244,7 +249,7 @@ describe( 'OverlayTemplatePartSelector', () => {
244
249
  } );
245
250
  } );
246
251
 
247
- it( 'should display selected overlay', () => {
252
+ it( 'should display selected overlay by slug', () => {
248
253
  useEntityRecords.mockReturnValue( {
249
254
  records: [ templatePart1 ],
250
255
  isResolving: false,
@@ -254,7 +259,7 @@ describe( 'OverlayTemplatePartSelector', () => {
254
259
  render(
255
260
  <OverlayTemplatePartSelector
256
261
  { ...defaultProps }
257
- overlay="twentytwentyfive//my-overlay"
262
+ overlay="my-overlay"
258
263
  />
259
264
  );
260
265
 
@@ -262,7 +267,7 @@ describe( 'OverlayTemplatePartSelector', () => {
262
267
  name: 'Overlay template',
263
268
  } );
264
269
 
265
- expect( select ).toHaveValue( 'twentytwentyfive//my-overlay' );
270
+ expect( select ).toHaveValue( 'my-overlay' );
266
271
  } );
267
272
  } );
268
273
 
@@ -293,7 +298,7 @@ describe( 'OverlayTemplatePartSelector', () => {
293
298
  render(
294
299
  <OverlayTemplatePartSelector
295
300
  { ...defaultProps }
296
- overlay="twentytwentyfive//my-overlay"
301
+ overlay="my-overlay"
297
302
  />
298
303
  );
299
304
 
@@ -322,7 +327,7 @@ describe( 'OverlayTemplatePartSelector', () => {
322
327
  render(
323
328
  <OverlayTemplatePartSelector
324
329
  { ...defaultProps }
325
- overlay="twentytwentyfive//my-overlay"
330
+ overlay="my-overlay"
326
331
  />
327
332
  );
328
333
 
@@ -345,7 +350,7 @@ describe( 'OverlayTemplatePartSelector', () => {
345
350
  render(
346
351
  <OverlayTemplatePartSelector
347
352
  { ...defaultProps }
348
- overlay="twentytwentyfive//my-overlay"
353
+ overlay="my-overlay"
349
354
  onNavigateToEntityRecord={ undefined }
350
355
  />
351
356
  );
@@ -359,7 +364,7 @@ describe( 'OverlayTemplatePartSelector', () => {
359
364
  expect( editButton ).toHaveAttribute( 'aria-disabled', 'true' );
360
365
  } );
361
366
 
362
- it( 'should navigate to focused overlay editor when edit button is clicked', async () => {
367
+ it( 'should navigate to focused overlay editor with full ID when edit button is clicked', async () => {
363
368
  const user = userEvent.setup();
364
369
 
365
370
  useEntityRecords.mockReturnValue( {
@@ -371,7 +376,7 @@ describe( 'OverlayTemplatePartSelector', () => {
371
376
  render(
372
377
  <OverlayTemplatePartSelector
373
378
  { ...defaultProps }
374
- overlay="twentytwentyfive//my-overlay"
379
+ overlay="my-overlay"
375
380
  />
376
381
  );
377
382
 
@@ -382,6 +387,7 @@ describe( 'OverlayTemplatePartSelector', () => {
382
387
 
383
388
  await user.click( editButton );
384
389
 
390
+ // Should construct full ID from theme and slug
385
391
  expect( mockOnNavigateToEntityRecord ).toHaveBeenCalledWith( {
386
392
  postId: 'twentytwentyfive//my-overlay',
387
393
  postType: 'wp_template_part',
@@ -400,7 +406,7 @@ describe( 'OverlayTemplatePartSelector', () => {
400
406
  render(
401
407
  <OverlayTemplatePartSelector
402
408
  { ...defaultProps }
403
- overlay="twentytwentyfive//my-overlay"
409
+ overlay="my-overlay"
404
410
  onNavigateToEntityRecord={ undefined }
405
411
  />
406
412
  );
@@ -461,7 +467,7 @@ describe( 'OverlayTemplatePartSelector', () => {
461
467
  } );
462
468
 
463
469
  describe( 'Create overlay', () => {
464
- it( 'should call createOverlayTemplatePart when create button is clicked', async () => {
470
+ it( 'should store slug only and navigate with full ID when creating overlay', async () => {
465
471
  const user = userEvent.setup();
466
472
  const newOverlay = {
467
473
  id: 'twentytwentyfive//overlay',
@@ -490,9 +496,11 @@ describe( 'OverlayTemplatePartSelector', () => {
490
496
  await user.click( createButton );
491
497
 
492
498
  expect( mockCreateOverlayTemplatePart ).toHaveBeenCalled();
499
+ // Should store slug only
493
500
  expect( mockSetAttributes ).toHaveBeenCalledWith( {
494
- overlay: 'twentytwentyfive//overlay',
501
+ overlay: 'overlay',
495
502
  } );
503
+ // Should navigate with full ID constructed from theme and slug
496
504
  expect( mockOnNavigateToEntityRecord ).toHaveBeenCalledWith( {
497
505
  postId: 'twentytwentyfive//overlay',
498
506
  postType: 'wp_template_part',
@@ -0,0 +1,179 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+ import { useSelect } from '@wordpress/data';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import ResponsiveWrapper from '../responsive-wrapper';
16
+
17
+ // Mock block-editor to avoid private API issues
18
+ jest.mock( '@wordpress/block-editor', () => ( {
19
+ getColorClassName: jest.fn( () => '' ),
20
+ } ) );
21
+
22
+ // Mock core-data store
23
+ jest.mock( '@wordpress/core-data', () => ( {
24
+ store: {},
25
+ } ) );
26
+
27
+ // Mock useSelect
28
+ jest.mock( '@wordpress/data', () => ( {
29
+ useSelect: jest.fn(),
30
+ createSelector: jest.fn( ( fn ) => fn ),
31
+ createRegistrySelector: jest.fn( ( fn ) => fn ),
32
+ createReduxStore: jest.fn( () => ( {} ) ),
33
+ combineReducers: jest.fn( ( reducers ) => ( state = {}, action ) => {
34
+ const newState = {};
35
+ Object.keys( reducers ).forEach( ( key ) => {
36
+ newState[ key ] = reducers[ key ]( state[ key ], action );
37
+ } );
38
+ return newState;
39
+ } ),
40
+ register: jest.fn(),
41
+ } ) );
42
+
43
+ describe( 'ResponsiveWrapper', () => {
44
+ const mockOnToggle = jest.fn();
45
+ const mockOnNavigateToEntityRecord = jest.fn();
46
+
47
+ const defaultProps = {
48
+ id: 'test-navigation',
49
+ isOpen: false,
50
+ isResponsive: true,
51
+ onToggle: mockOnToggle,
52
+ isHiddenByDefault: false,
53
+ overlayBackgroundColor: {},
54
+ overlayTextColor: {},
55
+ hasIcon: false,
56
+ icon: null,
57
+ overlay: undefined,
58
+ onNavigateToEntityRecord: undefined,
59
+ children: <div>Navigation content</div>,
60
+ };
61
+
62
+ beforeEach( () => {
63
+ jest.clearAllMocks();
64
+ // Mock useSelect - component calls: select( coreStore ).getCurrentTheme()?.stylesheet
65
+ useSelect.mockImplementation( ( selector ) => {
66
+ if ( typeof selector === 'function' ) {
67
+ const mockSelect = () => ( {
68
+ getCurrentTheme: () => ( {
69
+ stylesheet: 'twentytwentyfive',
70
+ } ),
71
+ } );
72
+ return selector( mockSelect );
73
+ }
74
+ return 'twentytwentyfive';
75
+ } );
76
+ } );
77
+
78
+ describe( 'Overlay navigation', () => {
79
+ it( 'should navigate to custom overlay template part when custom overlay slug is provided', async () => {
80
+ const user = userEvent.setup();
81
+
82
+ render(
83
+ <ResponsiveWrapper
84
+ { ...defaultProps }
85
+ overlay="my-overlay"
86
+ onNavigateToEntityRecord={ mockOnNavigateToEntityRecord }
87
+ />
88
+ );
89
+
90
+ const openButton = screen.getByRole( 'button', {
91
+ name: 'Menu',
92
+ } );
93
+
94
+ await user.click( openButton );
95
+
96
+ // Should construct full ID from current theme and slug
97
+ expect( mockOnNavigateToEntityRecord ).toHaveBeenCalledWith( {
98
+ postId: 'twentytwentyfive//my-overlay',
99
+ postType: 'wp_template_part',
100
+ } );
101
+ // Should not open default overlay when custom overlay is present
102
+ expect( mockOnToggle ).not.toHaveBeenCalled();
103
+ } );
104
+
105
+ it( 'should open the default overlay when no custom overlay is provided', async () => {
106
+ const user = userEvent.setup();
107
+
108
+ render( <ResponsiveWrapper { ...defaultProps } /> );
109
+
110
+ const openButton = screen.getByRole( 'button', {
111
+ name: 'Menu',
112
+ } );
113
+
114
+ await user.click( openButton );
115
+
116
+ // Should open the default overlay when no custom overlay
117
+ expect( mockOnToggle ).toHaveBeenCalledWith( true );
118
+ expect( mockOnNavigateToEntityRecord ).not.toHaveBeenCalled();
119
+ } );
120
+
121
+ it( 'should open the default overlay when custom overlay is provided but navigation is not available', async () => {
122
+ const user = userEvent.setup();
123
+
124
+ render(
125
+ <ResponsiveWrapper
126
+ { ...defaultProps }
127
+ overlay="my-overlay"
128
+ onNavigateToEntityRecord={ undefined }
129
+ />
130
+ );
131
+
132
+ const openButton = screen.getByRole( 'button', {
133
+ name: 'Menu',
134
+ } );
135
+
136
+ await user.click( openButton );
137
+
138
+ expect( mockOnToggle ).toHaveBeenCalledWith( true );
139
+ expect( mockOnNavigateToEntityRecord ).not.toHaveBeenCalled();
140
+ } );
141
+
142
+ it( 'should construct template part ID using current theme from useSelect', async () => {
143
+ const user = userEvent.setup();
144
+
145
+ // Mock different theme
146
+ useSelect.mockImplementation( ( selector ) => {
147
+ if ( typeof selector === 'function' ) {
148
+ const mockSelect = () => ( {
149
+ getCurrentTheme: () => ( {
150
+ stylesheet: 'custom-theme',
151
+ } ),
152
+ } );
153
+ return selector( mockSelect );
154
+ }
155
+ return 'custom-theme';
156
+ } );
157
+
158
+ render(
159
+ <ResponsiveWrapper
160
+ { ...defaultProps }
161
+ overlay="my-overlay"
162
+ onNavigateToEntityRecord={ mockOnNavigateToEntityRecord }
163
+ />
164
+ );
165
+
166
+ const openButton = screen.getByRole( 'button', {
167
+ name: 'Menu',
168
+ } );
169
+
170
+ await user.click( openButton );
171
+
172
+ // Should use the current theme from useSelect
173
+ expect( mockOnNavigateToEntityRecord ).toHaveBeenCalledWith( {
174
+ postId: 'custom-theme//my-overlay',
175
+ postType: 'wp_template_part',
176
+ } );
177
+ } );
178
+ } );
179
+ } );