@wordpress/editor 14.38.0 → 14.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 (233) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/document-bar/useEditedSectionDetails.cjs +0 -3
  3. package/build/components/document-bar/useEditedSectionDetails.cjs.map +2 -2
  4. package/build/components/editor-interface/index.cjs +33 -9
  5. package/build/components/editor-interface/index.cjs.map +2 -2
  6. package/build/components/header/header-skeleton.cjs +100 -0
  7. package/build/components/header/header-skeleton.cjs.map +7 -0
  8. package/build/components/header/index.cjs +63 -106
  9. package/build/components/header/index.cjs.map +3 -3
  10. package/build/components/media/index.cjs +44 -0
  11. package/build/components/media/index.cjs.map +7 -0
  12. package/build/components/media/metadata-panel.cjs +96 -0
  13. package/build/components/media/metadata-panel.cjs.map +7 -0
  14. package/build/components/media/preview.cjs +39 -0
  15. package/build/components/media/preview.cjs.map +7 -0
  16. package/build/components/more-menu/index.cjs +3 -2
  17. package/build/components/more-menu/index.cjs.map +2 -2
  18. package/build/components/post-card-panel/index.cjs +33 -4
  19. package/build/components/post-card-panel/index.cjs.map +3 -3
  20. package/build/components/post-content-information/index.cjs +9 -0
  21. package/build/components/post-content-information/index.cjs.map +2 -2
  22. package/build/components/post-last-edited-panel/index.cjs +5 -6
  23. package/build/components/post-last-edited-panel/index.cjs.map +2 -2
  24. package/build/components/post-last-revision/index.cjs +5 -7
  25. package/build/components/post-last-revision/index.cjs.map +2 -2
  26. package/build/components/post-publish-button/label.cjs +6 -1
  27. package/build/components/post-publish-button/label.cjs.map +2 -2
  28. package/build/components/post-publish-button/post-publish-button-or-toggle.cjs +8 -3
  29. package/build/components/post-publish-button/post-publish-button-or-toggle.cjs.map +2 -2
  30. package/build/components/post-revisions-preview/index.cjs +44 -0
  31. package/build/components/post-revisions-preview/index.cjs.map +7 -0
  32. package/build/components/post-revisions-preview/revisions-canvas.cjs +82 -0
  33. package/build/components/post-revisions-preview/revisions-canvas.cjs.map +7 -0
  34. package/build/components/post-revisions-preview/revisions-header.cjs +119 -0
  35. package/build/components/post-revisions-preview/revisions-header.cjs.map +7 -0
  36. package/build/components/post-revisions-preview/revisions-slider.cjs +110 -0
  37. package/build/components/post-revisions-preview/revisions-slider.cjs.map +7 -0
  38. package/build/components/post-saved-state/index.cjs +8 -2
  39. package/build/components/post-saved-state/index.cjs.map +2 -2
  40. package/build/components/post-title/index.cjs +5 -4
  41. package/build/components/post-title/index.cjs.map +2 -2
  42. package/build/components/provider/index.cjs +19 -0
  43. package/build/components/provider/index.cjs.map +3 -3
  44. package/build/components/provider/use-block-editor-settings.cjs +2 -1
  45. package/build/components/provider/use-block-editor-settings.cjs.map +2 -2
  46. package/build/components/revision-author-panel/index.cjs +59 -0
  47. package/build/components/revision-author-panel/index.cjs.map +7 -0
  48. package/build/components/revision-created-panel/index.cjs +47 -0
  49. package/build/components/revision-created-panel/index.cjs.map +7 -0
  50. package/build/components/sidebar/header.cjs +27 -12
  51. package/build/components/sidebar/header.cjs.map +3 -3
  52. package/build/components/sidebar/index.cjs +36 -15
  53. package/build/components/sidebar/index.cjs.map +3 -3
  54. package/build/components/sidebar/post-summary.cjs +44 -19
  55. package/build/components/sidebar/post-summary.cjs.map +3 -3
  56. package/build/components/start-page-options/index.cjs +1 -1
  57. package/build/components/start-page-options/index.cjs.map +2 -2
  58. package/build/dataviews/store/private-actions.cjs +47 -26
  59. package/build/dataviews/store/private-actions.cjs.map +3 -3
  60. package/build/store/constants.cjs +3 -0
  61. package/build/store/constants.cjs.map +2 -2
  62. package/build/store/private-actions.cjs +40 -0
  63. package/build/store/private-actions.cjs.map +2 -2
  64. package/build/store/private-selectors.cjs +33 -2
  65. package/build/store/private-selectors.cjs.map +2 -2
  66. package/build/store/reducer.cjs +10 -0
  67. package/build/store/reducer.cjs.map +2 -2
  68. package/build/store/selectors.cjs +3 -0
  69. package/build/store/selectors.cjs.map +2 -2
  70. package/build/store/utils/notice-builder.cjs +4 -0
  71. package/build/store/utils/notice-builder.cjs.map +2 -2
  72. package/build-module/components/document-bar/useEditedSectionDetails.mjs +0 -3
  73. package/build-module/components/document-bar/useEditedSectionDetails.mjs.map +2 -2
  74. package/build-module/components/editor-interface/index.mjs +33 -9
  75. package/build-module/components/editor-interface/index.mjs.map +2 -2
  76. package/build-module/components/header/header-skeleton.mjs +69 -0
  77. package/build-module/components/header/header-skeleton.mjs.map +7 -0
  78. package/build-module/components/header/index.mjs +65 -107
  79. package/build-module/components/header/index.mjs.map +2 -2
  80. package/build-module/components/media/index.mjs +8 -0
  81. package/build-module/components/media/index.mjs.map +7 -0
  82. package/build-module/components/media/metadata-panel.mjs +65 -0
  83. package/build-module/components/media/metadata-panel.mjs.map +7 -0
  84. package/build-module/components/media/preview.mjs +21 -0
  85. package/build-module/components/media/preview.mjs.map +7 -0
  86. package/build-module/components/more-menu/index.mjs +3 -2
  87. package/build-module/components/more-menu/index.mjs.map +2 -2
  88. package/build-module/components/post-card-panel/index.mjs +35 -5
  89. package/build-module/components/post-card-panel/index.mjs.map +3 -3
  90. package/build-module/components/post-content-information/index.mjs +9 -0
  91. package/build-module/components/post-content-information/index.mjs.map +2 -2
  92. package/build-module/components/post-last-edited-panel/index.mjs +5 -6
  93. package/build-module/components/post-last-edited-panel/index.mjs.map +2 -2
  94. package/build-module/components/post-last-revision/index.mjs +6 -8
  95. package/build-module/components/post-last-revision/index.mjs.map +2 -2
  96. package/build-module/components/post-publish-button/label.mjs +6 -1
  97. package/build-module/components/post-publish-button/label.mjs.map +2 -2
  98. package/build-module/components/post-publish-button/post-publish-button-or-toggle.mjs +8 -3
  99. package/build-module/components/post-publish-button/post-publish-button-or-toggle.mjs.map +2 -2
  100. package/build-module/components/post-revisions-preview/index.mjs +8 -0
  101. package/build-module/components/post-revisions-preview/index.mjs.map +7 -0
  102. package/build-module/components/post-revisions-preview/revisions-canvas.mjs +54 -0
  103. package/build-module/components/post-revisions-preview/revisions-canvas.mjs.map +7 -0
  104. package/build-module/components/post-revisions-preview/revisions-header.mjs +92 -0
  105. package/build-module/components/post-revisions-preview/revisions-header.mjs.map +7 -0
  106. package/build-module/components/post-revisions-preview/revisions-slider.mjs +89 -0
  107. package/build-module/components/post-revisions-preview/revisions-slider.mjs.map +7 -0
  108. package/build-module/components/post-saved-state/index.mjs +8 -2
  109. package/build-module/components/post-saved-state/index.mjs.map +2 -2
  110. package/build-module/components/post-title/index.mjs +5 -4
  111. package/build-module/components/post-title/index.mjs.map +2 -2
  112. package/build-module/components/provider/index.mjs +19 -0
  113. package/build-module/components/provider/index.mjs.map +2 -2
  114. package/build-module/components/provider/use-block-editor-settings.mjs +2 -1
  115. package/build-module/components/provider/use-block-editor-settings.mjs.map +2 -2
  116. package/build-module/components/revision-author-panel/index.mjs +28 -0
  117. package/build-module/components/revision-author-panel/index.mjs.map +7 -0
  118. package/build-module/components/revision-created-panel/index.mjs +26 -0
  119. package/build-module/components/revision-created-panel/index.mjs.map +7 -0
  120. package/build-module/components/sidebar/header.mjs +22 -7
  121. package/build-module/components/sidebar/header.mjs.map +2 -2
  122. package/build-module/components/sidebar/index.mjs +38 -16
  123. package/build-module/components/sidebar/index.mjs.map +2 -2
  124. package/build-module/components/sidebar/post-summary.mjs +48 -20
  125. package/build-module/components/sidebar/post-summary.mjs.map +2 -2
  126. package/build-module/components/start-page-options/index.mjs +2 -1
  127. package/build-module/components/start-page-options/index.mjs.map +2 -2
  128. package/build-module/dataviews/store/private-actions.mjs +59 -27
  129. package/build-module/dataviews/store/private-actions.mjs.map +2 -2
  130. package/build-module/store/constants.mjs +2 -0
  131. package/build-module/store/constants.mjs.map +2 -2
  132. package/build-module/store/private-actions.mjs +38 -0
  133. package/build-module/store/private-actions.mjs.map +2 -2
  134. package/build-module/store/private-selectors.mjs +29 -1
  135. package/build-module/store/private-selectors.mjs.map +2 -2
  136. package/build-module/store/reducer.mjs +9 -0
  137. package/build-module/store/reducer.mjs.map +2 -2
  138. package/build-module/store/selectors.mjs +4 -0
  139. package/build-module/store/selectors.mjs.map +2 -2
  140. package/build-module/store/utils/notice-builder.mjs +4 -0
  141. package/build-module/store/utils/notice-builder.mjs.map +2 -2
  142. package/build-style/style-rtl.css +182 -16
  143. package/build-style/style.css +182 -16
  144. package/build-types/components/document-bar/useEditedSectionDetails.d.ts.map +1 -1
  145. package/build-types/components/editor-interface/index.d.ts.map +1 -1
  146. package/build-types/components/header/header-skeleton.d.ts +17 -0
  147. package/build-types/components/header/header-skeleton.d.ts.map +1 -0
  148. package/build-types/components/header/index.d.ts.map +1 -1
  149. package/build-types/components/media/index.d.ts +3 -0
  150. package/build-types/components/media/index.d.ts.map +1 -0
  151. package/build-types/components/media/metadata-panel.d.ts +12 -0
  152. package/build-types/components/media/metadata-panel.d.ts.map +1 -0
  153. package/build-types/components/media/preview.d.ts +9 -0
  154. package/build-types/components/media/preview.d.ts.map +1 -0
  155. package/build-types/components/more-menu/index.d.ts +3 -1
  156. package/build-types/components/more-menu/index.d.ts.map +1 -1
  157. package/build-types/components/post-card-panel/index.d.ts.map +1 -1
  158. package/build-types/components/post-content-information/index.d.ts.map +1 -1
  159. package/build-types/components/post-last-edited-panel/index.d.ts.map +1 -1
  160. package/build-types/components/post-last-revision/index.d.ts.map +1 -1
  161. package/build-types/components/post-publish-button/label.d.ts.map +1 -1
  162. package/build-types/components/post-publish-button/post-publish-button-or-toggle.d.ts.map +1 -1
  163. package/build-types/components/post-revisions-preview/index.d.ts +3 -0
  164. package/build-types/components/post-revisions-preview/index.d.ts.map +1 -0
  165. package/build-types/components/post-revisions-preview/revisions-canvas.d.ts +7 -0
  166. package/build-types/components/post-revisions-preview/revisions-canvas.d.ts.map +1 -0
  167. package/build-types/components/post-revisions-preview/revisions-header.d.ts +8 -0
  168. package/build-types/components/post-revisions-preview/revisions-header.d.ts.map +1 -0
  169. package/build-types/components/post-revisions-preview/revisions-slider.d.ts +8 -0
  170. package/build-types/components/post-revisions-preview/revisions-slider.d.ts.map +1 -0
  171. package/build-types/components/post-saved-state/index.d.ts.map +1 -1
  172. package/build-types/components/provider/index.d.ts.map +1 -1
  173. package/build-types/components/provider/use-block-editor-settings.d.ts.map +1 -1
  174. package/build-types/components/revision-author-panel/index.d.ts +2 -0
  175. package/build-types/components/revision-author-panel/index.d.ts.map +1 -0
  176. package/build-types/components/revision-created-panel/index.d.ts +2 -0
  177. package/build-types/components/revision-created-panel/index.d.ts.map +1 -0
  178. package/build-types/components/sidebar/index.d.ts.map +1 -1
  179. package/build-types/components/sidebar/post-summary.d.ts.map +1 -1
  180. package/build-types/components/start-page-options/index.d.ts.map +1 -1
  181. package/build-types/dataviews/store/private-actions.d.ts +1 -0
  182. package/build-types/dataviews/store/private-actions.d.ts.map +1 -1
  183. package/build-types/store/constants.d.ts +1 -0
  184. package/build-types/store/constants.d.ts.map +1 -1
  185. package/build-types/store/private-actions.d.ts +13 -0
  186. package/build-types/store/private-actions.d.ts.map +1 -1
  187. package/build-types/store/private-selectors.d.ts +25 -0
  188. package/build-types/store/private-selectors.d.ts.map +1 -1
  189. package/build-types/store/reducer.d.ts +11 -0
  190. package/build-types/store/reducer.d.ts.map +1 -1
  191. package/build-types/store/selectors.d.ts.map +1 -1
  192. package/build-types/store/utils/notice-builder.d.ts.map +1 -1
  193. package/package.json +42 -40
  194. package/src/components/document-bar/useEditedSectionDetails.js +0 -5
  195. package/src/components/editor-interface/index.js +39 -9
  196. package/src/components/header/header-skeleton.js +90 -0
  197. package/src/components/header/index.js +69 -102
  198. package/src/components/header/style.scss +4 -0
  199. package/src/components/media/index.js +2 -0
  200. package/src/components/media/metadata-panel.js +77 -0
  201. package/src/components/media/preview.js +35 -0
  202. package/src/components/more-menu/index.js +2 -1
  203. package/src/components/post-card-panel/index.js +43 -7
  204. package/src/components/post-content-information/index.js +11 -0
  205. package/src/components/post-last-edited-panel/index.js +8 -9
  206. package/src/components/post-last-revision/index.js +7 -8
  207. package/src/components/post-publish-button/label.js +9 -0
  208. package/src/components/post-publish-button/post-publish-button-or-toggle.js +13 -5
  209. package/src/components/post-revisions-preview/index.js +2 -0
  210. package/src/components/post-revisions-preview/revisions-canvas.js +73 -0
  211. package/src/components/post-revisions-preview/revisions-header.js +108 -0
  212. package/src/components/post-revisions-preview/revisions-slider.js +123 -0
  213. package/src/components/post-revisions-preview/style.scss +22 -0
  214. package/src/components/post-saved-state/index.js +8 -0
  215. package/src/components/post-title/index.js +4 -3
  216. package/src/components/provider/index.js +26 -0
  217. package/src/components/provider/use-block-editor-settings.js +2 -3
  218. package/src/components/revision-author-panel/index.js +36 -0
  219. package/src/components/revision-created-panel/index.js +36 -0
  220. package/src/components/sidebar/header.js +35 -14
  221. package/src/components/sidebar/index.js +40 -13
  222. package/src/components/sidebar/post-summary.js +45 -11
  223. package/src/components/sidebar/style.scss +7 -0
  224. package/src/components/start-page-options/index.js +2 -0
  225. package/src/dataviews/store/private-actions.ts +79 -33
  226. package/src/store/constants.ts +1 -0
  227. package/src/store/private-actions.js +70 -0
  228. package/src/store/private-selectors.js +54 -0
  229. package/src/store/reducer.js +17 -0
  230. package/src/store/selectors.js +6 -0
  231. package/src/store/test/selectors.js +7 -0
  232. package/src/store/utils/notice-builder.js +9 -0
  233. package/src/style.scss +2 -0
@@ -0,0 +1,73 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { Spinner } from '@wordpress/components';
5
+ import {
6
+ privateApis as blockEditorPrivateApis,
7
+ store as blockEditorStore,
8
+ } from '@wordpress/block-editor';
9
+ import { createBlock, parse } from '@wordpress/blocks';
10
+ import { useSelect } from '@wordpress/data';
11
+ import { useMemo } from '@wordpress/element';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import { unlock } from '../../lock-unlock';
17
+ import { store as editorStore } from '../../store';
18
+ import VisualEditor from '../visual-editor';
19
+
20
+ const { ExperimentalBlockEditorProvider } = unlock( blockEditorPrivateApis );
21
+
22
+ /**
23
+ * Canvas component that renders a post revision in read-only mode.
24
+ *
25
+ * @return {JSX.Element} The revisions canvas component.
26
+ */
27
+ export default function RevisionsCanvas() {
28
+ const { revision, postType, blockEditorSettings } = useSelect(
29
+ ( select ) => {
30
+ const { getCurrentRevision, getCurrentPostType } = unlock(
31
+ select( editorStore )
32
+ );
33
+ return {
34
+ revision: getCurrentRevision(),
35
+ postType: getCurrentPostType(),
36
+ blockEditorSettings: select( blockEditorStore ).getSettings(),
37
+ };
38
+ },
39
+ []
40
+ );
41
+
42
+ const blocks = useMemo( () => {
43
+ const parsedBlocks = parse( revision?.content?.raw ?? '' );
44
+ if ( postType === 'wp_navigation' ) {
45
+ return [
46
+ createBlock(
47
+ 'core/navigation',
48
+ { templateLock: false },
49
+ parsedBlocks
50
+ ),
51
+ ];
52
+ }
53
+ return parsedBlocks;
54
+ }, [ revision?.content?.raw, postType ] );
55
+
56
+ const settings = useMemo(
57
+ () => ( {
58
+ ...blockEditorSettings,
59
+ isPreviewMode: true,
60
+ } ),
61
+ [ blockEditorSettings ]
62
+ );
63
+
64
+ return revision ? (
65
+ <ExperimentalBlockEditorProvider value={ blocks } settings={ settings }>
66
+ <VisualEditor />
67
+ </ExperimentalBlockEditorProvider>
68
+ ) : (
69
+ <div className="editor-revisions-canvas__loading">
70
+ <Spinner />
71
+ </div>
72
+ );
73
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect, useDispatch } from '@wordpress/data';
5
+ import { useViewportMatch } from '@wordpress/compose';
6
+ import { Button } from '@wordpress/components';
7
+ import { store as preferencesStore } from '@wordpress/preferences';
8
+ import { PinnedItems } from '@wordpress/interface';
9
+ import { __ } from '@wordpress/i18n';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import HeaderSkeleton from '../header/header-skeleton';
15
+ import MoreMenu from '../more-menu';
16
+ import PostPreviewButton from '../post-preview-button';
17
+ import PreviewDropdown from '../preview-dropdown';
18
+ import RevisionsSlider from './revisions-slider';
19
+ import { store as editorStore } from '../../store';
20
+ import {
21
+ TEMPLATE_PART_POST_TYPE,
22
+ PATTERN_POST_TYPE,
23
+ NAVIGATION_POST_TYPE,
24
+ } from '../../store/constants';
25
+ import { unlock } from '../../lock-unlock';
26
+
27
+ /**
28
+ * Header component for revisions preview mode.
29
+ *
30
+ * @return {JSX.Element} The revisions header component.
31
+ */
32
+ function RevisionsHeader() {
33
+ const isWideViewport = useViewportMatch( 'large' );
34
+ const { postType, showIconLabels, currentRevisionId } = useSelect(
35
+ ( select ) => {
36
+ const { get: getPreference } = select( preferencesStore );
37
+ const { getCurrentPostType } = select( editorStore );
38
+
39
+ return {
40
+ postType: getCurrentPostType(),
41
+ showIconLabels: getPreference( 'core', 'showIconLabels' ),
42
+ currentRevisionId: unlock(
43
+ select( editorStore )
44
+ ).getCurrentRevisionId(),
45
+ };
46
+ },
47
+ []
48
+ );
49
+
50
+ const { setCurrentRevisionId, restoreRevision } = unlock(
51
+ useDispatch( editorStore )
52
+ );
53
+
54
+ const disablePreviewOption = [
55
+ NAVIGATION_POST_TYPE,
56
+ TEMPLATE_PART_POST_TYPE,
57
+ PATTERN_POST_TYPE,
58
+ ].includes( postType );
59
+
60
+ const canRestore = !! currentRevisionId;
61
+
62
+ const handleRestore = () => {
63
+ if ( currentRevisionId ) {
64
+ restoreRevision( currentRevisionId );
65
+ }
66
+ };
67
+
68
+ return (
69
+ <HeaderSkeleton
70
+ className="editor-revisions-header"
71
+ center={ <RevisionsSlider /> }
72
+ settings={
73
+ <>
74
+ <PreviewDropdown disabled={ disablePreviewOption } />
75
+
76
+ <PostPreviewButton className="editor-header__post-preview-button" />
77
+
78
+ { ( isWideViewport || ! showIconLabels ) && (
79
+ <PinnedItems.Slot scope="core" />
80
+ ) }
81
+
82
+ <Button
83
+ __next40pxDefaultSize
84
+ variant="secondary"
85
+ size="compact"
86
+ onClick={ () => setCurrentRevisionId( null ) }
87
+ >
88
+ { __( 'Exit' ) }
89
+ </Button>
90
+ <Button
91
+ __next40pxDefaultSize
92
+ accessibleWhenDisabled
93
+ variant="primary"
94
+ size="compact"
95
+ className="editor-revisions-header__restore-button"
96
+ disabled={ ! canRestore }
97
+ onClick={ handleRestore }
98
+ >
99
+ { __( 'Restore' ) }
100
+ </Button>
101
+ <MoreMenu disabled />
102
+ </>
103
+ }
104
+ />
105
+ );
106
+ }
107
+
108
+ export default RevisionsHeader;
@@ -0,0 +1,123 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useMemo } from '@wordpress/element';
5
+ import { useSelect, useDispatch } from '@wordpress/data';
6
+ import { RangeControl, Spinner } from '@wordpress/components';
7
+ import { store as coreStore } from '@wordpress/core-data';
8
+ import { __ } from '@wordpress/i18n';
9
+ import { dateI18n, getSettings as getDateSettings } from '@wordpress/date';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import { store as editorStore } from '../../store';
15
+ import { unlock } from '../../lock-unlock';
16
+
17
+ /**
18
+ * Slider component for navigating revisions.
19
+ *
20
+ * @return {JSX.Element} The revisions slider component.
21
+ */
22
+ function RevisionsSlider() {
23
+ const { revisions, isLoading, currentRevisionId } = useSelect(
24
+ ( select ) => {
25
+ const { getCurrentPostId, getCurrentPostType } =
26
+ select( editorStore );
27
+ const { getRevisions, isResolving } = select( coreStore );
28
+
29
+ const postId = getCurrentPostId();
30
+ const postType = getCurrentPostType();
31
+
32
+ if ( ! postId || ! postType ) {
33
+ return {};
34
+ }
35
+
36
+ const query = { per_page: -1, context: 'edit' };
37
+ return {
38
+ revisions: getRevisions( 'postType', postType, postId, query ),
39
+ isLoading: isResolving( 'getRevisions', [
40
+ 'postType',
41
+ postType,
42
+ postId,
43
+ query,
44
+ ] ),
45
+ currentRevisionId: unlock(
46
+ select( editorStore )
47
+ ).getCurrentRevisionId(),
48
+ };
49
+ },
50
+ []
51
+ );
52
+
53
+ const { setCurrentRevisionId } = unlock( useDispatch( editorStore ) );
54
+
55
+ const sortedRevisions = useMemo( () => {
56
+ return (
57
+ revisions
58
+ ?.slice()
59
+ .sort( ( a, b ) => new Date( a.date ) - new Date( b.date ) ) ??
60
+ []
61
+ );
62
+ }, [ revisions ] );
63
+
64
+ const selectedIndex = sortedRevisions.findIndex(
65
+ ( r ) => r.id === currentRevisionId
66
+ );
67
+
68
+ const handleSliderChange = ( index ) => {
69
+ const revision = sortedRevisions[ index ];
70
+ if ( revision ) {
71
+ setCurrentRevisionId( revision.id );
72
+ }
73
+ };
74
+
75
+ // Format date for tooltip.
76
+ const dateSettings = getDateSettings();
77
+ const renderTooltipContent = ( index ) => {
78
+ const revision = sortedRevisions[ index ];
79
+ if ( ! revision ) {
80
+ return index;
81
+ }
82
+ return dateI18n( dateSettings.formats.datetime, revision.date );
83
+ };
84
+
85
+ if ( isLoading ) {
86
+ return <Spinner />;
87
+ }
88
+
89
+ if ( ! sortedRevisions.length ) {
90
+ return (
91
+ <span className="editor-revisions-header__no-revisions">
92
+ { __( 'No revisions found.' ) }
93
+ </span>
94
+ );
95
+ }
96
+
97
+ if ( sortedRevisions.length === 1 ) {
98
+ return (
99
+ <span className="editor-revisions-header__no-revisions">
100
+ { __( 'Only one revision found.' ) }
101
+ </span>
102
+ );
103
+ }
104
+
105
+ return (
106
+ <RangeControl
107
+ __nextHasNoMarginBottom
108
+ __next40pxDefaultSize
109
+ className="editor-revisions-header__slider"
110
+ hideLabelFromVision
111
+ label={ __( 'Revision' ) }
112
+ max={ sortedRevisions.length - 1 }
113
+ min={ 0 }
114
+ marks
115
+ onChange={ handleSliderChange }
116
+ renderTooltipContent={ renderTooltipContent }
117
+ value={ selectedIndex }
118
+ withInputField={ false }
119
+ />
120
+ );
121
+ }
122
+
123
+ export default RevisionsSlider;
@@ -0,0 +1,22 @@
1
+ @use "@wordpress/base-styles/colors" as *;
2
+ @use "@wordpress/base-styles/variables" as *;
3
+
4
+ .editor-revisions-header__slider {
5
+ width: 100%;
6
+
7
+ .components-range-control__tooltip {
8
+ white-space: nowrap;
9
+ }
10
+ }
11
+
12
+ .editor-revisions-header__no-revisions {
13
+ color: $gray-700;
14
+ font-size: $default-font-size;
15
+ }
16
+
17
+ .editor-revisions-canvas__loading {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ height: 100%;
22
+ }
@@ -23,6 +23,7 @@ import { store as preferencesStore } from '@wordpress/preferences';
23
23
  */
24
24
  import { STATUS_OPTIONS } from '../../components/post-status';
25
25
  import { store as editorStore } from '../../store';
26
+ import { ATTACHMENT_POST_TYPE } from '../../store/constants';
26
27
 
27
28
  /**
28
29
  * Component showing whether the post is saved or not and providing save
@@ -49,6 +50,7 @@ export default function PostSavedState( { forceIsDirty } ) {
49
50
  showIconLabels,
50
51
  postStatus,
51
52
  postStatusHasChanged,
53
+ postType,
52
54
  } = useSelect(
53
55
  ( select ) => {
54
56
  const {
@@ -77,6 +79,7 @@ export default function PostSavedState( { forceIsDirty } ) {
77
79
  showIconLabels: get( 'core', 'showIconLabels' ),
78
80
  postStatus: getEditedPostAttribute( 'status' ),
79
81
  postStatusHasChanged: !! getPostEdits()?.status,
82
+ postType: select( editorStore ).getCurrentPostType(),
80
83
  };
81
84
  },
82
85
  [ forceIsDirty ]
@@ -99,6 +102,11 @@ export default function PostSavedState( { forceIsDirty } ) {
99
102
  return () => clearTimeout( timeoutId );
100
103
  }, [ isSaving ] );
101
104
 
105
+ // Attachments don't support draft mode, so hide this button.
106
+ if ( postType === ATTACHMENT_POST_TYPE ) {
107
+ return null;
108
+ }
109
+
102
110
  // Once the post has been submitted for review this button
103
111
  // is not needed for the contributor role.
104
112
  if ( ! hasPublishAction && isPending ) {
@@ -31,16 +31,17 @@ import PostTypeSupportCheck from '../post-type-support-check';
31
31
  import { unlock } from '../../lock-unlock';
32
32
 
33
33
  const PostTitle = forwardRef( ( _, forwardedRef ) => {
34
- const { placeholder, isEditingContentOnlySection } = useSelect(
34
+ const { placeholder, isEditingContentOnlySection, isPreview } = useSelect(
35
35
  ( select ) => {
36
36
  const { getSettings, getEditedContentOnlySection } = unlock(
37
37
  select( blockEditorStore )
38
38
  );
39
- const { titlePlaceholder } = getSettings();
39
+ const { titlePlaceholder, isPreviewMode } = getSettings();
40
40
 
41
41
  return {
42
42
  placeholder: titlePlaceholder,
43
43
  isEditingContentOnlySection: !! getEditedContentOnlySection(),
44
+ isPreview: isPreviewMode,
44
45
  };
45
46
  },
46
47
  []
@@ -185,7 +186,7 @@ const PostTitle = forwardRef( ( _, forwardedRef ) => {
185
186
  /* eslint-disable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-to-interactive-role */
186
187
  <h1
187
188
  ref={ useMergeRefs( [ richTextRef, focusRef ] ) }
188
- contentEditable={ ! isEditingContentOnlySection }
189
+ contentEditable={ ! isEditingContentOnlySection && ! isPreview }
189
190
  className={ className }
190
191
  aria-label={ decodedPlaceholder }
191
192
  role="textbox"
@@ -23,6 +23,7 @@ import { createBlock } from '@wordpress/blocks';
23
23
  */
24
24
  import withRegistryProvider from './with-registry-provider';
25
25
  import { store as editorStore } from '../../store';
26
+ import { ATTACHMENT_POST_TYPE } from '../../store/constants';
26
27
  import useBlockEditorSettings from './use-block-editor-settings';
27
28
  import { unlock } from '../../lock-unlock';
28
29
  import DisableNonPageContentBlocks from './disable-non-page-content-blocks';
@@ -355,6 +356,31 @@ export const ExperimentalEditorProvider = withRegistryProvider(
355
356
  return null;
356
357
  }
357
358
 
359
+ const isAttachment =
360
+ post.type === ATTACHMENT_POST_TYPE &&
361
+ window?.__experimentalMediaEditor;
362
+
363
+ // Early return for attachments - no block editor needed
364
+ if ( isAttachment ) {
365
+ return (
366
+ <EntityProvider kind="root" type="site">
367
+ <EntityProvider
368
+ kind="postType"
369
+ type={ post.type }
370
+ id={ post.id }
371
+ >
372
+ { children }
373
+ { ! settings.isPreviewMode && (
374
+ <>
375
+ <EditorKeyboardShortcuts />
376
+ <KeyboardShortcutHelpModal />
377
+ </>
378
+ ) }
379
+ </EntityProvider>
380
+ </EntityProvider>
381
+ );
382
+ }
383
+
358
384
  return (
359
385
  <EntityProvider kind="root" type="site">
360
386
  <EntityProvider
@@ -50,6 +50,7 @@ const BLOCK_EDITOR_SETTINGS = [
50
50
  'maxUploadFileSize',
51
51
  'allowedMimeTypes',
52
52
  'bodyPlaceholder',
53
+ 'canEditCSS',
53
54
  'canLockBlocks',
54
55
  'canUpdateBlockBindings',
55
56
  'capabilities',
@@ -387,9 +388,7 @@ function useBlockEditorSettings( settings, postType, postId, renderingMode ) {
387
388
  'wp_block',
388
389
  'wp_navigation',
389
390
  ].includes( postType ),
390
- ...( window.__experimentalHideBlocksBasedOnScreenSize && deviceType
391
- ? { [ deviceTypeKey ]: deviceType }
392
- : {} ),
391
+ ...( deviceType ? { [ deviceTypeKey ]: deviceType } : {} ),
393
392
  };
394
393
 
395
394
  return blockEditorSettings;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect } from '@wordpress/data';
5
+ import { store as coreStore } from '@wordpress/core-data';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
+ import { __ } from '@wordpress/i18n';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import PostPanelRow from '../post-panel-row';
13
+ import { store as editorStore } from '../../store';
14
+ import { unlock } from '../../lock-unlock';
15
+
16
+ export default function RevisionAuthorPanel() {
17
+ const authorName = useSelect( ( select ) => {
18
+ const { getCurrentRevision } = unlock( select( editorStore ) );
19
+ const revision = getCurrentRevision();
20
+ if ( ! revision?.author ) {
21
+ return null;
22
+ }
23
+ const author = select( coreStore ).getUser( revision.author );
24
+ return author?.name;
25
+ }, [] );
26
+
27
+ if ( ! authorName ) {
28
+ return null;
29
+ }
30
+
31
+ return (
32
+ <PostPanelRow label={ __( 'Author' ) }>
33
+ { decodeEntities( authorName ) }
34
+ </PostPanelRow>
35
+ );
36
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __experimentalText as Text } from '@wordpress/components';
5
+ import { useSelect } from '@wordpress/data';
6
+ import { __, sprintf } from '@wordpress/i18n';
7
+ import { humanTimeDiff } from '@wordpress/date';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import { store as editorStore } from '../../store';
13
+ import { unlock } from '../../lock-unlock';
14
+
15
+ export default function RevisionCreatedPanel() {
16
+ const date = useSelect( ( select ) => {
17
+ const { getCurrentRevision } = unlock( select( editorStore ) );
18
+ return getCurrentRevision()?.date;
19
+ }, [] );
20
+
21
+ if ( ! date ) {
22
+ return null;
23
+ }
24
+
25
+ return (
26
+ <div className="editor-post-last-edited-panel">
27
+ <Text>
28
+ { sprintf(
29
+ // translators: %s: Human-readable time difference, e.g. "2 days ago".
30
+ __( 'Created %s.' ),
31
+ humanTimeDiff( date )
32
+ ) }
33
+ </Text>
34
+ </div>
35
+ );
36
+ }
@@ -11,21 +11,40 @@ import { decodeEntities } from '@wordpress/html-entities';
11
11
  * Internal dependencies
12
12
  */
13
13
  import { store as editorStore } from '../../store';
14
+ import { ATTACHMENT_POST_TYPE } from '../../store/constants';
14
15
  import { unlock } from '../../lock-unlock';
15
16
  import { sidebars } from './constants';
16
17
 
17
18
  const { Tabs } = unlock( componentsPrivateApis );
18
19
 
19
20
  const SidebarHeader = ( _, ref ) => {
20
- const postTypeLabel = useSelect(
21
- ( select ) => select( editorStore ).getPostTypeLabel(),
21
+ const { postTypeLabel, isAttachment, isRevisionsMode } = useSelect(
22
+ ( select ) => {
23
+ const { getPostTypeLabel, getCurrentPostType } =
24
+ select( editorStore );
25
+ const { isRevisionsMode: _isRevisionsMode } = unlock(
26
+ select( editorStore )
27
+ );
28
+ return {
29
+ postTypeLabel: getPostTypeLabel(),
30
+ isAttachment:
31
+ getCurrentPostType() === ATTACHMENT_POST_TYPE &&
32
+ window?.__experimentalMediaEditor,
33
+ isRevisionsMode: _isRevisionsMode(),
34
+ };
35
+ },
22
36
  []
23
37
  );
24
38
 
25
- const documentLabel = postTypeLabel
26
- ? decodeEntities( postTypeLabel )
27
- : // translators: Default label for the Document sidebar tab, not selected.
28
- _x( 'Document', 'noun, panel' );
39
+ let documentLabel;
40
+ if ( isRevisionsMode ) {
41
+ documentLabel = __( 'Revision' );
42
+ } else if ( postTypeLabel ) {
43
+ documentLabel = decodeEntities( postTypeLabel );
44
+ } else {
45
+ // translators: Default label for the Document sidebar tab, not selected.
46
+ documentLabel = _x( 'Document', 'noun, panel' );
47
+ }
29
48
 
30
49
  return (
31
50
  <Tabs.TabList ref={ ref }>
@@ -36,14 +55,16 @@ const SidebarHeader = ( _, ref ) => {
36
55
  >
37
56
  { documentLabel }
38
57
  </Tabs.Tab>
39
- <Tabs.Tab
40
- tabId={ sidebars.block }
41
- // Used for focus management in the SettingsSidebar component.
42
- data-tab-id={ sidebars.block }
43
- >
44
- { /* translators: Text label for the Block Settings Sidebar tab. */ }
45
- { __( 'Block' ) }
46
- </Tabs.Tab>
58
+ { ! isAttachment && ! isRevisionsMode && (
59
+ <Tabs.Tab
60
+ tabId={ sidebars.block }
61
+ // Used for focus management in the SettingsSidebar component.
62
+ data-tab-id={ sidebars.block }
63
+ >
64
+ { /* translators: Text label for the Block Settings Sidebar tab. */ }
65
+ { __( 'Block' ) }
66
+ </Tabs.Tab>
67
+ ) }
47
68
  </Tabs.TabList>
48
69
  );
49
70
  };