@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.
- package/CHANGELOG.md +2 -0
- package/build/block/block.json +2 -1
- package/build/breadcrumbs/edit.cjs +15 -5
- package/build/breadcrumbs/edit.cjs.map +2 -2
- package/build/breadcrumbs/index.cjs +1 -0
- package/build/breadcrumbs/index.cjs.map +2 -2
- package/build/button/index.cjs +3 -0
- package/build/button/index.cjs.map +2 -2
- package/build/comment-date/block.json +1 -0
- package/build/comment-edit-link/block.json +1 -3
- package/build/comment-edit-link/deprecated.cjs +91 -0
- package/build/comment-edit-link/deprecated.cjs.map +7 -0
- package/build/comment-edit-link/edit.cjs +6 -18
- package/build/comment-edit-link/edit.cjs.map +3 -3
- package/build/comment-edit-link/index.cjs +2 -0
- package/build/comment-edit-link/index.cjs.map +3 -3
- package/build/comment-reply-link/block.json +1 -5
- package/build/comment-reply-link/deprecated.cjs +84 -0
- package/build/comment-reply-link/deprecated.cjs.map +7 -0
- package/build/comment-reply-link/edit.cjs +10 -23
- package/build/comment-reply-link/edit.cjs.map +3 -3
- package/build/comment-reply-link/index.cjs +2 -0
- package/build/comment-reply-link/index.cjs.map +3 -3
- package/build/comments-title/block.json +1 -3
- package/build/comments-title/deprecated.cjs +148 -24
- package/build/comments-title/deprecated.cjs.map +3 -3
- package/build/comments-title/edit.cjs +17 -31
- package/build/comments-title/edit.cjs.map +3 -3
- package/build/cover/edit/block-controls.cjs +10 -2
- package/build/cover/edit/block-controls.cjs.map +2 -2
- package/build/cover/edit/embed-video-url-input.cjs +6 -2
- package/build/cover/edit/embed-video-url-input.cjs.map +2 -2
- package/build/cover/edit/inspector-controls.cjs +1 -1
- package/build/cover/edit/inspector-controls.cjs.map +2 -2
- package/build/details/index.cjs +3 -0
- package/build/details/index.cjs.map +2 -2
- package/build/embed/util.cjs +9 -0
- package/build/embed/util.cjs.map +2 -2
- package/build/freeform/block.json +2 -1
- package/build/heading/index.cjs +3 -0
- package/build/heading/index.cjs.map +2 -2
- package/build/html/block.json +2 -1
- package/build/image/image.cjs +43 -9
- package/build/image/image.cjs.map +2 -2
- package/build/image/index.cjs +1 -1
- package/build/image/index.cjs.map +2 -2
- package/build/index.cjs +6 -0
- package/build/index.cjs.map +2 -2
- package/build/list-item/index.cjs +12 -1
- package/build/list-item/index.cjs.map +2 -2
- package/build/missing/block.json +2 -1
- package/build/more/block.json +2 -1
- package/build/more/index.cjs +1 -1
- package/build/more/index.cjs.map +2 -2
- package/build/navigation/block.json +5 -4
- package/build/navigation/deprecated.cjs +133 -5
- package/build/navigation/deprecated.cjs.map +2 -2
- package/build/navigation/edit/deleted-overlay-warning.cjs +70 -0
- package/build/navigation/edit/deleted-overlay-warning.cjs.map +7 -0
- package/build/navigation/edit/index.cjs +143 -65
- package/build/navigation/edit/index.cjs.map +3 -3
- package/build/navigation/edit/overlay-panel.cjs +10 -1
- package/build/navigation/edit/overlay-panel.cjs.map +3 -3
- package/build/navigation/edit/overlay-preview.cjs +120 -0
- package/build/navigation/edit/overlay-preview.cjs.map +7 -0
- package/build/navigation/edit/overlay-template-part-selector.cjs +59 -24
- package/build/navigation/edit/overlay-template-part-selector.cjs.map +3 -3
- package/build/navigation/edit/responsive-wrapper.cjs +12 -1
- package/build/navigation/edit/responsive-wrapper.cjs.map +3 -3
- package/build/navigation/edit/use-create-overlay.cjs +19 -2
- package/build/navigation/edit/use-create-overlay.cjs.map +3 -3
- package/build/navigation/utils/get-submenu-visibility.cjs +37 -0
- package/build/navigation/utils/get-submenu-visibility.cjs.map +7 -0
- package/build/navigation-link/edit.cjs +2 -40
- package/build/navigation-link/edit.cjs.map +2 -2
- package/build/navigation-link/shared/index.cjs +6 -0
- package/build/navigation-link/shared/index.cjs.map +2 -2
- package/build/navigation-link/shared/select-label-text.cjs +40 -0
- package/build/navigation-link/shared/select-label-text.cjs.map +7 -0
- package/build/navigation-link/shared/use-is-dragging-within.cjs +59 -0
- package/build/navigation-link/shared/use-is-dragging-within.cjs.map +7 -0
- package/build/navigation-submenu/block.json +1 -1
- package/build/navigation-submenu/edit.cjs +8 -47
- package/build/navigation-submenu/edit.cjs.map +2 -2
- package/build/navigation-submenu/index.cjs +2 -2
- package/build/navigation-submenu/index.cjs.map +2 -2
- package/build/nextpage/block.json +2 -1
- package/build/paragraph/block.json +1 -0
- package/build/paragraph/index.cjs +1 -1
- package/build/paragraph/index.cjs.map +2 -2
- package/build/post-excerpt/edit.cjs +1 -1
- package/build/post-excerpt/edit.cjs.map +2 -2
- package/build/shortcode/block.json +2 -1
- package/build/tab/add-tab-toolbar-control.cjs +31 -9
- package/build/tab/add-tab-toolbar-control.cjs.map +2 -2
- package/build/tab/block.json +18 -4
- package/build/tab/controls.cjs +4 -8
- package/build/tab/controls.cjs.map +3 -3
- package/build/tab/edit.cjs +46 -118
- package/build/tab/edit.cjs.map +3 -3
- package/build/tab/remove-tab-toolbar-control.cjs +91 -0
- package/build/tab/remove-tab-toolbar-control.cjs.map +7 -0
- package/build/tab/save.cjs +2 -2
- package/build/tab/save.cjs.map +2 -2
- package/build/tab-panels/block.json +70 -0
- package/build/tab-panels/edit.cjs +63 -0
- package/build/tab-panels/edit.cjs.map +7 -0
- package/build/tab-panels/icon.cjs +29 -0
- package/build/tab-panels/icon.cjs.map +7 -0
- package/build/tab-panels/index.cjs +58 -0
- package/build/tab-panels/index.cjs.map +7 -0
- package/build/tab-panels/save.cjs +33 -0
- package/build/tab-panels/save.cjs.map +7 -0
- package/build/tabs/block.json +61 -90
- package/build/tabs/controls.cjs +19 -221
- package/build/tabs/controls.cjs.map +3 -3
- package/build/tabs/deprecated.cjs +179 -0
- package/build/tabs/deprecated.cjs.map +7 -0
- package/build/tabs/edit.cjs +84 -62
- package/build/tabs/edit.cjs.map +3 -3
- package/build/tabs/index.cjs +3 -1
- package/build/tabs/index.cjs.map +3 -3
- package/build/tabs/save.cjs +6 -9
- package/build/tabs/save.cjs.map +2 -2
- package/build/tabs-menu/block.json +77 -0
- package/build/tabs-menu/edit.cjs +204 -0
- package/build/tabs-menu/edit.cjs.map +7 -0
- package/build/tabs-menu/icon.cjs +29 -0
- package/build/tabs-menu/icon.cjs.map +7 -0
- package/build/tabs-menu/index.cjs +58 -0
- package/build/tabs-menu/index.cjs.map +7 -0
- package/build/tabs-menu/save.cjs +35 -0
- package/build/tabs-menu/save.cjs.map +7 -0
- package/build/tabs-menu-item/block.json +98 -0
- package/build/tabs-menu-item/controls.cjs +247 -0
- package/build/tabs-menu-item/controls.cjs.map +7 -0
- package/build/tabs-menu-item/edit.cjs +272 -0
- package/build/tabs-menu-item/edit.cjs.map +7 -0
- package/build/tabs-menu-item/icon.cjs +29 -0
- package/build/tabs-menu-item/icon.cjs.map +7 -0
- package/build/tabs-menu-item/index.cjs +58 -0
- package/build/tabs-menu-item/index.cjs.map +7 -0
- package/build/tabs-menu-item/save.cjs +50 -0
- package/build/tabs-menu-item/save.cjs.map +7 -0
- package/build/template-part/edit/index.cjs +2 -2
- package/build/template-part/edit/index.cjs.map +2 -2
- package/build/utils/caption.cjs +4 -6
- package/build/utils/caption.cjs.map +3 -3
- package/build/verse/block.json +1 -3
- package/build/verse/deprecated.cjs +74 -5
- package/build/verse/deprecated.cjs.map +3 -3
- package/build/verse/edit.cjs +33 -48
- package/build/verse/edit.cjs.map +3 -3
- package/build/verse/save.cjs +2 -16
- package/build/verse/save.cjs.map +3 -3
- package/build/video/edit.cjs +4 -2
- package/build/video/edit.cjs.map +2 -2
- package/build-module/block/block.json +2 -1
- package/build-module/breadcrumbs/edit.mjs +15 -5
- package/build-module/breadcrumbs/edit.mjs.map +2 -2
- package/build-module/breadcrumbs/index.mjs +1 -0
- package/build-module/breadcrumbs/index.mjs.map +2 -2
- package/build-module/button/index.mjs +3 -0
- package/build-module/button/index.mjs.map +2 -2
- package/build-module/comment-date/block.json +1 -0
- package/build-module/comment-edit-link/block.json +1 -3
- package/build-module/comment-edit-link/deprecated.mjs +60 -0
- package/build-module/comment-edit-link/deprecated.mjs.map +7 -0
- package/build-module/comment-edit-link/edit.mjs +7 -24
- package/build-module/comment-edit-link/edit.mjs.map +2 -2
- package/build-module/comment-edit-link/index.mjs +2 -0
- package/build-module/comment-edit-link/index.mjs.map +2 -2
- package/build-module/comment-reply-link/block.json +1 -5
- package/build-module/comment-reply-link/deprecated.mjs +53 -0
- package/build-module/comment-reply-link/deprecated.mjs.map +7 -0
- package/build-module/comment-reply-link/edit.mjs +12 -29
- package/build-module/comment-reply-link/edit.mjs.map +2 -2
- package/build-module/comment-reply-link/index.mjs +2 -0
- package/build-module/comment-reply-link/index.mjs.map +2 -2
- package/build-module/comments-title/block.json +1 -3
- package/build-module/comments-title/deprecated.mjs +148 -24
- package/build-module/comments-title/deprecated.mjs.map +2 -2
- package/build-module/comments-title/edit.mjs +17 -32
- package/build-module/comments-title/edit.mjs.map +2 -2
- package/build-module/cover/edit/block-controls.mjs +11 -3
- package/build-module/cover/edit/block-controls.mjs.map +2 -2
- package/build-module/cover/edit/embed-video-url-input.mjs +6 -2
- package/build-module/cover/edit/embed-video-url-input.mjs.map +2 -2
- package/build-module/cover/edit/inspector-controls.mjs +1 -1
- package/build-module/cover/edit/inspector-controls.mjs.map +2 -2
- package/build-module/details/index.mjs +3 -0
- package/build-module/details/index.mjs.map +2 -2
- package/build-module/embed/util.mjs +8 -0
- package/build-module/embed/util.mjs.map +2 -2
- package/build-module/freeform/block.json +2 -1
- package/build-module/heading/index.mjs +3 -0
- package/build-module/heading/index.mjs.map +2 -2
- package/build-module/html/block.json +2 -1
- package/build-module/image/image.mjs +43 -9
- package/build-module/image/image.mjs.map +2 -2
- package/build-module/image/index.mjs +1 -1
- package/build-module/image/index.mjs.map +2 -2
- package/build-module/index.mjs +6 -0
- package/build-module/index.mjs.map +2 -2
- package/build-module/list-item/index.mjs +12 -1
- package/build-module/list-item/index.mjs.map +2 -2
- package/build-module/missing/block.json +2 -1
- package/build-module/more/block.json +2 -1
- package/build-module/more/index.mjs +1 -1
- package/build-module/more/index.mjs.map +2 -2
- package/build-module/navigation/block.json +5 -4
- package/build-module/navigation/deprecated.mjs +133 -5
- package/build-module/navigation/deprecated.mjs.map +2 -2
- package/build-module/navigation/edit/deleted-overlay-warning.mjs +49 -0
- package/build-module/navigation/edit/deleted-overlay-warning.mjs.map +7 -0
- package/build-module/navigation/edit/index.mjs +145 -65
- package/build-module/navigation/edit/index.mjs.map +2 -2
- package/build-module/navigation/edit/overlay-panel.mjs +10 -1
- package/build-module/navigation/edit/overlay-panel.mjs.map +2 -2
- package/build-module/navigation/edit/overlay-preview.mjs +99 -0
- package/build-module/navigation/edit/overlay-preview.mjs.map +7 -0
- package/build-module/navigation/edit/overlay-template-part-selector.mjs +61 -26
- package/build-module/navigation/edit/overlay-template-part-selector.mjs.map +2 -2
- package/build-module/navigation/edit/responsive-wrapper.mjs +12 -1
- package/build-module/navigation/edit/responsive-wrapper.mjs.map +2 -2
- package/build-module/navigation/edit/use-create-overlay.mjs +21 -4
- package/build-module/navigation/edit/use-create-overlay.mjs.map +2 -2
- package/build-module/navigation/utils/get-submenu-visibility.mjs +12 -0
- package/build-module/navigation/utils/get-submenu-visibility.mjs.map +7 -0
- package/build-module/navigation-link/edit.mjs +4 -40
- package/build-module/navigation-link/edit.mjs.map +2 -2
- package/build-module/navigation-link/shared/index.mjs +4 -0
- package/build-module/navigation-link/shared/index.mjs.map +2 -2
- package/build-module/navigation-link/shared/select-label-text.mjs +15 -0
- package/build-module/navigation-link/shared/select-label-text.mjs.map +7 -0
- package/build-module/navigation-link/shared/use-is-dragging-within.mjs +34 -0
- package/build-module/navigation-link/shared/use-is-dragging-within.mjs.map +7 -0
- package/build-module/navigation-submenu/block.json +1 -1
- package/build-module/navigation-submenu/edit.mjs +10 -47
- package/build-module/navigation-submenu/edit.mjs.map +2 -2
- package/build-module/navigation-submenu/index.mjs +2 -2
- package/build-module/navigation-submenu/index.mjs.map +2 -2
- package/build-module/nextpage/block.json +2 -1
- package/build-module/paragraph/block.json +1 -0
- package/build-module/paragraph/index.mjs +1 -1
- package/build-module/paragraph/index.mjs.map +2 -2
- package/build-module/post-excerpt/edit.mjs +1 -1
- package/build-module/post-excerpt/edit.mjs.map +2 -2
- package/build-module/shortcode/block.json +2 -1
- package/build-module/tab/add-tab-toolbar-control.mjs +32 -10
- package/build-module/tab/add-tab-toolbar-control.mjs.map +2 -2
- package/build-module/tab/block.json +18 -4
- package/build-module/tab/controls.mjs +4 -8
- package/build-module/tab/controls.mjs.map +2 -2
- package/build-module/tab/edit.mjs +48 -128
- package/build-module/tab/edit.mjs.map +2 -2
- package/build-module/tab/remove-tab-toolbar-control.mjs +73 -0
- package/build-module/tab/remove-tab-toolbar-control.mjs.map +7 -0
- package/build-module/tab/save.mjs +2 -2
- package/build-module/tab/save.mjs.map +2 -2
- package/build-module/tab-panels/block.json +70 -0
- package/build-module/tab-panels/edit.mjs +36 -0
- package/build-module/tab-panels/edit.mjs.map +7 -0
- package/build-module/tab-panels/icon.mjs +8 -0
- package/build-module/tab-panels/icon.mjs.map +7 -0
- package/build-module/tab-panels/index.mjs +20 -0
- package/build-module/tab-panels/index.mjs.map +7 -0
- package/build-module/tab-panels/save.mjs +12 -0
- package/build-module/tab-panels/save.mjs.map +7 -0
- package/build-module/tabs/block.json +61 -90
- package/build-module/tabs/controls.mjs +21 -228
- package/build-module/tabs/controls.mjs.map +2 -2
- package/build-module/tabs/deprecated.mjs +158 -0
- package/build-module/tabs/deprecated.mjs.map +7 -0
- package/build-module/tabs/edit.mjs +87 -64
- package/build-module/tabs/edit.mjs.map +2 -2
- package/build-module/tabs/index.mjs +3 -1
- package/build-module/tabs/index.mjs.map +2 -2
- package/build-module/tabs/save.mjs +7 -10
- package/build-module/tabs/save.mjs.map +2 -2
- package/build-module/tabs-menu/block.json +77 -0
- package/build-module/tabs-menu/edit.mjs +186 -0
- package/build-module/tabs-menu/edit.mjs.map +7 -0
- package/build-module/tabs-menu/icon.mjs +8 -0
- package/build-module/tabs-menu/icon.mjs.map +7 -0
- package/build-module/tabs-menu/index.mjs +20 -0
- package/build-module/tabs-menu/index.mjs.map +7 -0
- package/build-module/tabs-menu/save.mjs +14 -0
- package/build-module/tabs-menu/save.mjs.map +7 -0
- package/build-module/tabs-menu-item/block.json +98 -0
- package/build-module/tabs-menu-item/controls.mjs +227 -0
- package/build-module/tabs-menu-item/controls.mjs.map +7 -0
- package/build-module/tabs-menu-item/edit.mjs +253 -0
- package/build-module/tabs-menu-item/edit.mjs.map +7 -0
- package/build-module/tabs-menu-item/icon.mjs +8 -0
- package/build-module/tabs-menu-item/icon.mjs.map +7 -0
- package/build-module/tabs-menu-item/index.mjs +20 -0
- package/build-module/tabs-menu-item/index.mjs.map +7 -0
- package/build-module/tabs-menu-item/save.mjs +29 -0
- package/build-module/tabs-menu-item/save.mjs.map +7 -0
- package/build-module/template-part/edit/index.mjs +2 -2
- package/build-module/template-part/edit/index.mjs.map +2 -2
- package/build-module/utils/caption.mjs +1 -3
- package/build-module/utils/caption.mjs.map +2 -2
- package/build-module/verse/block.json +1 -3
- package/build-module/verse/deprecated.mjs +74 -5
- package/build-module/verse/deprecated.mjs.map +2 -2
- package/build-module/verse/edit.mjs +35 -55
- package/build-module/verse/edit.mjs.map +2 -2
- package/build-module/verse/save.mjs +2 -6
- package/build-module/verse/save.mjs.map +2 -2
- package/build-module/video/edit.mjs +4 -2
- package/build-module/video/edit.mjs.map +2 -2
- package/build-style/editor-rtl.css +64 -21
- package/build-style/editor.css +64 -21
- package/build-style/gallery/style-rtl.css +1 -1
- package/build-style/gallery/style.css +1 -1
- package/build-style/media-text/style-rtl.css +2 -0
- package/build-style/media-text/style.css +2 -0
- package/build-style/navigation/editor-rtl.css +48 -0
- package/build-style/navigation/editor.css +48 -0
- package/build-style/navigation/style-rtl.css +64 -18
- package/build-style/navigation/style.css +64 -18
- package/build-style/style-rtl.css +109 -171
- package/build-style/style.css +109 -171
- package/build-style/tab/style-rtl.css +7 -1
- package/build-style/tab/style.css +7 -1
- package/build-style/tab-panels/style-rtl.css +4 -0
- package/build-style/tab-panels/style.css +4 -0
- package/build-style/tabs/style-rtl.css +1 -167
- package/build-style/tabs/style.css +1 -167
- package/build-style/tabs-menu/editor-rtl.css +4 -0
- package/build-style/tabs-menu/editor.css +4 -0
- package/build-style/tabs-menu/style-rtl.css +8 -0
- package/build-style/tabs-menu/style.css +8 -0
- package/build-style/tabs-menu-item/editor-rtl.css +16 -0
- package/build-style/tabs-menu-item/editor.css +16 -0
- package/build-style/tabs-menu-item/style-rtl.css +34 -0
- package/build-style/tabs-menu-item/style.css +34 -0
- package/build-style/verse/style-rtl.css +1 -0
- package/build-style/verse/style.css +1 -0
- package/package.json +37 -37
- package/src/block/block.json +2 -1
- package/src/breadcrumbs/edit.js +10 -2
- package/src/breadcrumbs/index.js +1 -0
- package/src/button/index.js +4 -0
- package/src/categories/index.php +5 -1
- package/src/comment-date/block.json +1 -0
- package/src/comment-edit-link/block.json +1 -3
- package/src/comment-edit-link/deprecated.js +63 -0
- package/src/comment-edit-link/edit.js +7 -31
- package/src/comment-edit-link/index.js +2 -0
- package/src/comment-reply-link/block.json +1 -5
- package/src/comment-reply-link/deprecated.js +56 -0
- package/src/comment-reply-link/edit.js +6 -35
- package/src/comment-reply-link/index.js +2 -0
- package/src/comments-title/block.json +1 -3
- package/src/comments-title/deprecated.js +153 -23
- package/src/comments-title/edit.js +9 -25
- package/src/cover/edit/block-controls.js +14 -3
- package/src/cover/edit/embed-video-url-input.js +6 -2
- package/src/cover/edit/inspector-controls.js +1 -3
- package/src/details/index.js +4 -0
- package/src/editor.scss +2 -1
- package/src/embed/test/index.js +49 -0
- package/src/embed/util.js +21 -0
- package/src/freeform/block.json +2 -1
- package/src/gallery/style.scss +1 -1
- package/src/heading/index.js +4 -0
- package/src/html/block.json +2 -1
- package/src/image/image.js +63 -11
- package/src/image/index.js +4 -1
- package/src/index.js +6 -0
- package/src/list-item/index.js +16 -0
- package/src/media-text/style.scss +2 -0
- package/src/missing/block.json +2 -1
- package/src/more/block.json +2 -1
- package/src/more/index.js +4 -1
- package/src/navigation/block.json +5 -4
- package/src/navigation/deprecated.js +144 -5
- package/src/navigation/edit/deleted-overlay-warning.js +56 -0
- package/src/navigation/edit/index.js +181 -70
- package/src/navigation/edit/overlay-panel.js +10 -0
- package/src/navigation/edit/overlay-preview.js +133 -0
- package/src/navigation/edit/overlay-template-part-selector.js +76 -26
- package/src/navigation/edit/responsive-wrapper.js +14 -1
- package/src/navigation/edit/test/overlay-template-part-selector.js +24 -16
- package/src/navigation/edit/test/responsive-wrapper.js +179 -0
- package/src/navigation/edit/test/use-create-overlay.js +129 -2
- package/src/navigation/edit/use-create-overlay.js +26 -4
- package/src/navigation/editor.scss +51 -0
- package/src/navigation/index.php +59 -11
- package/src/navigation/style.scss +140 -76
- package/src/navigation/utils/get-submenu-visibility.js +27 -0
- package/src/navigation/utils/test/get-submenu-visibility.js +47 -0
- package/src/navigation-link/edit.js +3 -67
- package/src/navigation-link/shared/index.js +2 -0
- package/src/navigation-link/shared/select-label-text.js +16 -0
- package/src/navigation-link/shared/use-is-dragging-within.js +55 -0
- package/src/navigation-submenu/block.json +1 -1
- package/src/navigation-submenu/edit.js +10 -73
- package/src/navigation-submenu/index.js +6 -3
- package/src/navigation-submenu/index.php +36 -5
- package/src/nextpage/block.json +2 -1
- package/src/paragraph/block.json +1 -0
- package/src/paragraph/index.js +4 -1
- package/src/post-excerpt/edit.js +1 -1
- package/src/post-excerpt/index.php +39 -16
- package/src/shortcode/block.json +2 -1
- package/src/style.scss +3 -0
- package/src/tab/add-tab-toolbar-control.js +36 -11
- package/src/tab/block.json +18 -4
- package/src/tab/controls.js +4 -5
- package/src/tab/edit.js +75 -150
- package/src/tab/index.php +5 -63
- package/src/tab/remove-tab-toolbar-control.js +103 -0
- package/src/tab/save.js +1 -3
- package/src/tab/style.scss +8 -1
- package/src/tab-panels/block.json +70 -0
- package/src/tab-panels/edit.js +44 -0
- package/src/tab-panels/icon.js +10 -0
- package/src/tab-panels/index.js +21 -0
- package/src/tab-panels/save.js +11 -0
- package/src/tab-panels/style.scss +4 -0
- package/src/tabs/block.json +61 -90
- package/src/tabs/controls.js +7 -221
- package/src/tabs/deprecated.js +214 -0
- package/src/tabs/edit.js +108 -68
- package/src/tabs/index.js +2 -0
- package/src/tabs/index.php +86 -191
- package/src/tabs/save.js +6 -13
- package/src/tabs/style.scss +1 -187
- package/src/tabs-menu/block.json +77 -0
- package/src/tabs-menu/edit.js +251 -0
- package/src/tabs-menu/editor.scss +6 -0
- package/src/tabs-menu/icon.js +10 -0
- package/src/tabs-menu/index.js +21 -0
- package/src/tabs-menu/index.php +74 -0
- package/src/tabs-menu/save.js +18 -0
- package/src/tabs-menu/style.scss +8 -0
- package/src/tabs-menu-item/block.json +98 -0
- package/src/tabs-menu-item/controls.js +262 -0
- package/src/tabs-menu-item/edit.js +322 -0
- package/src/tabs-menu-item/editor.scss +20 -0
- package/src/tabs-menu-item/icon.js +10 -0
- package/src/tabs-menu-item/index.js +21 -0
- package/src/tabs-menu-item/index.php +82 -0
- package/src/tabs-menu-item/save.js +44 -0
- package/src/tabs-menu-item/style.scss +42 -0
- package/src/template-part/edit/index.js +2 -4
- package/src/utils/caption.js +1 -7
- package/src/verse/block.json +1 -3
- package/src/verse/deprecated.js +83 -4
- package/src/verse/edit.js +37 -56
- package/src/verse/save.js +2 -11
- package/src/verse/style.scss +1 -0
- package/src/video/edit.js +4 -2
- package/build/tab/tabs-list.cjs +0 -132
- package/build/tab/tabs-list.cjs.map +0 -7
- package/build/tabs/style-engine.cjs +0 -119
- package/build/tabs/style-engine.cjs.map +0 -7
- package/build-module/tab/tabs-list.mjs +0 -101
- package/build-module/tab/tabs-list.mjs.map +0 -7
- package/build-module/tabs/style-engine.mjs +0 -101
- package/build-module/tabs/style-engine.mjs.map +0 -7
- package/build-style/tabs/editor-rtl.css +0 -26
- package/build-style/tabs/editor.css +0 -26
- package/src/tab/tabs-list.js +0 -122
- package/src/tabs/editor.scss +0 -30
- 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:
|
|
105
|
+
value: templatePart.slug,
|
|
94
106
|
};
|
|
95
107
|
}
|
|
96
108
|
);
|
|
97
109
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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 (
|
|
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:
|
|
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.
|
|
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:
|
|
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:
|
|
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
|
|
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, '
|
|
218
|
+
await user.selectOptions( select, 'my-overlay' );
|
|
214
219
|
|
|
215
220
|
expect( mockSetAttributes ).toHaveBeenCalledWith( {
|
|
216
|
-
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="
|
|
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="
|
|
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( '
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
|
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: '
|
|
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
|
+
} );
|