@wordpress/block-editor 15.8.0 → 15.8.1-next.dc3f6d3c1.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/build/components/block-inspector/edit-contents.js +19 -23
- package/build/components/block-inspector/edit-contents.js.map +3 -3
- package/build/components/block-inspector/index.js +7 -1
- package/build/components/block-inspector/index.js.map +2 -2
- package/build/components/block-list/block.js +4 -0
- package/build/components/block-list/block.js.map +2 -2
- package/build/components/block-list/use-block-props/index.js +3 -1
- package/build/components/block-list/use-block-props/index.js.map +2 -2
- package/build/components/block-list/use-block-props/use-is-hovered.js +16 -10
- package/build/components/block-list/use-block-props/use-is-hovered.js.map +2 -2
- package/build/components/block-settings-menu-controls/edit-section-menu-item.js +64 -0
- package/build/components/block-settings-menu-controls/edit-section-menu-item.js.map +7 -0
- package/build/components/block-settings-menu-controls/index.js +8 -0
- package/build/components/block-settings-menu-controls/index.js.map +2 -2
- package/build/components/block-toolbar/block-toolbar-icon.js +9 -9
- package/build/components/block-toolbar/block-toolbar-icon.js.map +2 -2
- package/build/components/block-variation-transforms/index.js +32 -5
- package/build/components/block-variation-transforms/index.js.map +2 -2
- package/build/components/border-radius-control/single-input-control.js +1 -0
- package/build/components/border-radius-control/single-input-control.js.map +2 -2
- package/build/components/content-only-controls/index.js +263 -0
- package/build/components/content-only-controls/index.js.map +7 -0
- package/build/components/content-only-controls/link/index.js +204 -0
- package/build/components/content-only-controls/link/index.js.map +7 -0
- package/build/components/content-only-controls/media/index.js +264 -0
- package/build/components/content-only-controls/media/index.js.map +7 -0
- package/build/components/content-only-controls/plain-text/index.js +68 -0
- package/build/components/content-only-controls/plain-text/index.js.map +7 -0
- package/build/components/content-only-controls/rich-text/index.js +197 -0
- package/build/components/content-only-controls/rich-text/index.js.map +7 -0
- package/build/components/content-only-controls/use-inspector-popover-placement.js +41 -0
- package/build/components/content-only-controls/use-inspector-popover-placement.js.map +7 -0
- package/build/components/global-styles/typography-panel.js +16 -10
- package/build/components/global-styles/typography-panel.js.map +2 -2
- package/build/components/inserter/media-tab/media-tab.js +1 -33
- package/build/components/inserter/media-tab/media-tab.js.map +3 -3
- package/build/components/inspector-controls-tabs/content-tab.js +6 -2
- package/build/components/inspector-controls-tabs/content-tab.js.map +3 -3
- package/build/components/inspector-controls-tabs/index.js +7 -1
- package/build/components/inspector-controls-tabs/index.js.map +2 -2
- package/build/components/list-view/block-select-button.js +11 -4
- package/build/components/list-view/block-select-button.js.map +2 -2
- package/build/components/media-placeholder/index.js +1 -31
- package/build/components/media-placeholder/index.js.map +3 -3
- package/build/components/media-replace-flow/index.js +4 -30
- package/build/components/media-replace-flow/index.js.map +3 -3
- package/build/components/rich-text/format-edit.js +9 -1
- package/build/components/rich-text/format-edit.js.map +2 -2
- package/build/components/use-block-display-information/index.js +21 -1
- package/build/components/use-block-display-information/index.js.map +3 -3
- package/build/hooks/block-bindings.js +52 -61
- package/build/hooks/block-bindings.js.map +3 -3
- package/build/hooks/use-content-only-section-edit.js +67 -0
- package/build/hooks/use-content-only-section-edit.js.map +7 -0
- package/build/layouts/constrained.js +2 -2
- package/build/layouts/constrained.js.map +2 -2
- package/build/private-apis.js +2 -3
- package/build/private-apis.js.map +3 -3
- package/build/store/private-keys.js +3 -0
- package/build/store/private-keys.js.map +2 -2
- package/build/store/private-selectors.js +1 -2
- package/build/store/private-selectors.js.map +2 -2
- package/build/store/reducer.js +1 -2
- package/build/store/reducer.js.map +2 -2
- package/build/store/selectors.js +3 -0
- package/build/store/selectors.js.map +2 -2
- package/build/utils/fit-text-utils.js +9 -1
- package/build/utils/fit-text-utils.js.map +2 -2
- package/build-module/components/block-inspector/edit-contents.js +9 -23
- package/build-module/components/block-inspector/edit-contents.js.map +2 -2
- package/build-module/components/block-inspector/index.js +7 -1
- package/build-module/components/block-inspector/index.js.map +2 -2
- package/build-module/components/block-list/block.js +4 -0
- package/build-module/components/block-list/block.js.map +2 -2
- package/build-module/components/block-list/use-block-props/index.js +3 -1
- package/build-module/components/block-list/use-block-props/index.js.map +2 -2
- package/build-module/components/block-list/use-block-props/use-is-hovered.js +16 -10
- package/build-module/components/block-list/use-block-props/use-is-hovered.js.map +2 -2
- package/build-module/components/block-settings-menu-controls/edit-section-menu-item.js +29 -0
- package/build-module/components/block-settings-menu-controls/edit-section-menu-item.js.map +7 -0
- package/build-module/components/block-settings-menu-controls/index.js +8 -0
- package/build-module/components/block-settings-menu-controls/index.js.map +2 -2
- package/build-module/components/block-toolbar/block-toolbar-icon.js +10 -10
- package/build-module/components/block-toolbar/block-toolbar-icon.js.map +2 -2
- package/build-module/components/block-variation-transforms/index.js +32 -5
- package/build-module/components/block-variation-transforms/index.js.map +2 -2
- package/build-module/components/border-radius-control/single-input-control.js +1 -0
- package/build-module/components/border-radius-control/single-input-control.js.map +2 -2
- package/build-module/components/content-only-controls/index.js +237 -0
- package/build-module/components/content-only-controls/index.js.map +7 -0
- package/build-module/components/content-only-controls/link/index.js +172 -0
- package/build-module/components/content-only-controls/link/index.js.map +7 -0
- package/build-module/components/content-only-controls/media/index.js +243 -0
- package/build-module/components/content-only-controls/media/index.js.map +7 -0
- package/build-module/components/content-only-controls/plain-text/index.js +50 -0
- package/build-module/components/content-only-controls/plain-text/index.js.map +7 -0
- package/build-module/components/content-only-controls/rich-text/index.js +174 -0
- package/build-module/components/content-only-controls/rich-text/index.js.map +7 -0
- package/build-module/components/content-only-controls/use-inspector-popover-placement.js +16 -0
- package/build-module/components/content-only-controls/use-inspector-popover-placement.js.map +7 -0
- package/build-module/components/global-styles/typography-panel.js +18 -11
- package/build-module/components/global-styles/typography-panel.js.map +2 -2
- package/build-module/components/inserter/media-tab/media-tab.js +2 -34
- package/build-module/components/inserter/media-tab/media-tab.js.map +2 -2
- package/build-module/components/inspector-controls-tabs/content-tab.js +7 -3
- package/build-module/components/inspector-controls-tabs/content-tab.js.map +2 -2
- package/build-module/components/inspector-controls-tabs/index.js +7 -1
- package/build-module/components/inspector-controls-tabs/index.js.map +2 -2
- package/build-module/components/list-view/block-select-button.js +18 -5
- package/build-module/components/list-view/block-select-button.js.map +2 -2
- package/build-module/components/media-placeholder/index.js +1 -31
- package/build-module/components/media-placeholder/index.js.map +2 -2
- package/build-module/components/media-replace-flow/index.js +4 -30
- package/build-module/components/media-replace-flow/index.js.map +2 -2
- package/build-module/components/rich-text/format-edit.js +9 -1
- package/build-module/components/rich-text/format-edit.js.map +2 -2
- package/build-module/components/use-block-display-information/index.js +21 -1
- package/build-module/components/use-block-display-information/index.js.map +3 -3
- package/build-module/hooks/block-bindings.js +57 -62
- package/build-module/hooks/block-bindings.js.map +2 -2
- package/build-module/hooks/use-content-only-section-edit.js +46 -0
- package/build-module/hooks/use-content-only-section-edit.js.map +7 -0
- package/build-module/layouts/constrained.js +2 -2
- package/build-module/layouts/constrained.js.map +2 -2
- package/build-module/private-apis.js +3 -3
- package/build-module/private-apis.js.map +2 -2
- package/build-module/store/private-keys.js +2 -0
- package/build-module/store/private-keys.js.map +2 -2
- package/build-module/store/private-selectors.js +1 -2
- package/build-module/store/private-selectors.js.map +2 -2
- package/build-module/store/reducer.js +1 -2
- package/build-module/store/reducer.js.map +2 -2
- package/build-module/store/selectors.js +3 -0
- package/build-module/store/selectors.js.map +2 -2
- package/build-module/utils/fit-text-utils.js +9 -1
- package/build-module/utils/fit-text-utils.js.map +2 -2
- package/build-style/style-rtl.css +132 -0
- package/build-style/style.css +132 -0
- package/package.json +37 -37
- package/src/components/block-inspector/edit-contents.js +10 -29
- package/src/components/block-inspector/index.js +4 -2
- package/src/components/block-list/block.js +6 -0
- package/src/components/block-list/use-block-props/index.js +3 -1
- package/src/components/block-list/use-block-props/use-is-hovered.js +24 -12
- package/src/components/block-settings-menu-controls/edit-section-menu-item.js +39 -0
- package/src/components/block-settings-menu-controls/index.js +7 -0
- package/src/components/block-switcher/block-transformations-menu.native.js +0 -1
- package/src/components/block-toolbar/block-toolbar-icon.js +14 -10
- package/src/components/block-toolbar/test/__snapshots__/block-toolbar-menu.native.js.snap +6 -4
- package/src/components/block-toolbar/test/block-toolbar-menu.native.js +2 -2
- package/src/components/block-variation-transforms/index.js +96 -35
- package/src/components/border-radius-control/single-input-control.js +1 -0
- package/src/components/content-only-controls/index.js +296 -0
- package/src/components/content-only-controls/link/index.js +195 -0
- package/src/components/content-only-controls/link/styles.scss +23 -0
- package/src/components/content-only-controls/media/index.js +285 -0
- package/src/components/content-only-controls/media/styles.scss +47 -0
- package/src/components/content-only-controls/plain-text/index.js +49 -0
- package/src/components/content-only-controls/rich-text/index.js +193 -0
- package/src/components/content-only-controls/rich-text/styles.scss +24 -0
- package/src/components/content-only-controls/styles.scss +35 -0
- package/src/components/content-only-controls/use-inspector-popover-placement.js +19 -0
- package/src/components/global-styles/typography-panel.js +12 -0
- package/src/components/inserter/media-tab/media-tab.js +2 -44
- package/src/components/inspector-controls-tabs/content-tab.js +12 -4
- package/src/components/inspector-controls-tabs/index.js +4 -1
- package/src/components/list-view/block-select-button.js +37 -24
- package/src/components/media-placeholder/index.js +1 -41
- package/src/components/media-replace-flow/index.js +3 -39
- package/src/components/rich-text/format-edit.js +9 -1
- package/src/components/use-block-display-information/index.js +30 -2
- package/src/hooks/block-bindings.js +71 -82
- package/src/hooks/use-content-only-section-edit.js +63 -0
- package/src/layouts/constrained.js +8 -2
- package/src/private-apis.js +2 -2
- package/src/store/private-keys.js +1 -0
- package/src/store/private-selectors.js +1 -2
- package/src/store/reducer.js +0 -3
- package/src/store/selectors.js +7 -0
- package/src/store/test/reducer.js +7 -17
- package/src/style.scss +1 -0
- package/src/utils/fit-text-utils.js +19 -1
- package/build/components/media-upload-modal/index.js +0 -29
- package/build/components/media-upload-modal/index.js.map +0 -7
- package/build-module/components/media-upload-modal/index.js +0 -8
- package/build-module/components/media-upload-modal/index.js.map +0 -7
- package/src/components/media-upload-modal/index.js +0 -18
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import {
|
|
5
|
+
BaseControl,
|
|
6
|
+
useBaseControlProps,
|
|
7
|
+
__experimentalToolsPanelItem as ToolsPanelItem,
|
|
8
|
+
} from '@wordpress/components';
|
|
9
|
+
import { useMergeRefs } from '@wordpress/compose';
|
|
10
|
+
import { useRegistry } from '@wordpress/data';
|
|
11
|
+
import { useRef, useState } from '@wordpress/element';
|
|
12
|
+
import {
|
|
13
|
+
__unstableUseRichText as useRichText,
|
|
14
|
+
isEmpty,
|
|
15
|
+
removeFormat,
|
|
16
|
+
} from '@wordpress/rich-text';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Internal dependencies
|
|
20
|
+
*/
|
|
21
|
+
import { useFormatTypes } from '../../rich-text/use-format-types';
|
|
22
|
+
import { getAllowedFormats } from '../../rich-text/utils';
|
|
23
|
+
import { useEventListeners } from '../../rich-text/event-listeners';
|
|
24
|
+
import FormatEdit from '../../rich-text/format-edit';
|
|
25
|
+
import { keyboardShortcutContext, inputEventContext } from '../../rich-text';
|
|
26
|
+
|
|
27
|
+
export default function RichTextControl( {
|
|
28
|
+
clientId,
|
|
29
|
+
control,
|
|
30
|
+
blockType,
|
|
31
|
+
attributeValues,
|
|
32
|
+
updateAttributes,
|
|
33
|
+
} ) {
|
|
34
|
+
const registry = useRegistry();
|
|
35
|
+
const valueKey = control.mapping.value;
|
|
36
|
+
const attrValue = attributeValues[ valueKey ];
|
|
37
|
+
const defaultValue =
|
|
38
|
+
blockType.attributes[ valueKey ]?.defaultValue ?? undefined;
|
|
39
|
+
const [ selection, setSelection ] = useState( {
|
|
40
|
+
start: undefined,
|
|
41
|
+
end: undefined,
|
|
42
|
+
} );
|
|
43
|
+
const [ isSelected, setIsSelected ] = useState( false );
|
|
44
|
+
const anchorRef = useRef();
|
|
45
|
+
const inputEvents = useRef( new Set() );
|
|
46
|
+
const keyboardShortcuts = useRef( new Set() );
|
|
47
|
+
|
|
48
|
+
const adjustedAllowedFormats = getAllowedFormats( {
|
|
49
|
+
allowedFormats: control.args?.allowedFormats,
|
|
50
|
+
disableFormats: control.args?.disableFormats,
|
|
51
|
+
} );
|
|
52
|
+
|
|
53
|
+
const {
|
|
54
|
+
formatTypes,
|
|
55
|
+
prepareHandlers,
|
|
56
|
+
valueHandlers,
|
|
57
|
+
changeHandlers,
|
|
58
|
+
dependencies,
|
|
59
|
+
} = useFormatTypes( {
|
|
60
|
+
clientId,
|
|
61
|
+
identifier: valueKey,
|
|
62
|
+
allowedFormats: adjustedAllowedFormats,
|
|
63
|
+
withoutInteractiveFormatting:
|
|
64
|
+
control.args?.withoutInteractiveFormatting,
|
|
65
|
+
disableNoneEssentialFormatting: true,
|
|
66
|
+
} );
|
|
67
|
+
|
|
68
|
+
function addEditorOnlyFormats( value ) {
|
|
69
|
+
return valueHandlers.reduce(
|
|
70
|
+
( accumulator, fn ) => fn( accumulator, value.text ),
|
|
71
|
+
value.formats
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function removeEditorOnlyFormats( value ) {
|
|
76
|
+
formatTypes.forEach( ( formatType ) => {
|
|
77
|
+
// Remove formats created by prepareEditableTree, because they are editor only.
|
|
78
|
+
if ( formatType.__experimentalCreatePrepareEditableTree ) {
|
|
79
|
+
value = removeFormat(
|
|
80
|
+
value,
|
|
81
|
+
formatType.name,
|
|
82
|
+
0,
|
|
83
|
+
value.text.length
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
} );
|
|
87
|
+
|
|
88
|
+
return value.formats;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function addInvisibleFormats( value ) {
|
|
92
|
+
return prepareHandlers.reduce(
|
|
93
|
+
( accumulator, fn ) => fn( accumulator, value.text ),
|
|
94
|
+
value.formats
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function onFocus() {
|
|
99
|
+
anchorRef.current?.focus();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const {
|
|
103
|
+
value,
|
|
104
|
+
getValue,
|
|
105
|
+
onChange,
|
|
106
|
+
ref: richTextRef,
|
|
107
|
+
} = useRichText( {
|
|
108
|
+
value: attrValue,
|
|
109
|
+
onChange( html, { __unstableFormats, __unstableText } ) {
|
|
110
|
+
updateAttributes( { [ valueKey ]: html } );
|
|
111
|
+
Object.values( changeHandlers ).forEach( ( changeHandler ) => {
|
|
112
|
+
changeHandler( __unstableFormats, __unstableText );
|
|
113
|
+
} );
|
|
114
|
+
},
|
|
115
|
+
selectionStart: selection.start,
|
|
116
|
+
selectionEnd: selection.end,
|
|
117
|
+
onSelectionChange: ( start, end ) => setSelection( { start, end } ),
|
|
118
|
+
__unstableIsSelected: isSelected,
|
|
119
|
+
preserveWhiteSpace: !! control.args?.preserveWhiteSpace,
|
|
120
|
+
placeholder: control.args?.placeholder,
|
|
121
|
+
__unstableDisableFormats: control.args?.disableFormats,
|
|
122
|
+
__unstableDependencies: dependencies,
|
|
123
|
+
__unstableAfterParse: addEditorOnlyFormats,
|
|
124
|
+
__unstableBeforeSerialize: removeEditorOnlyFormats,
|
|
125
|
+
__unstableAddInvisibleFormats: addInvisibleFormats,
|
|
126
|
+
} );
|
|
127
|
+
|
|
128
|
+
const { baseControlProps, controlProps } = useBaseControlProps( {
|
|
129
|
+
hideLabelFromVision: control.shownByDefault,
|
|
130
|
+
label: control.label,
|
|
131
|
+
} );
|
|
132
|
+
|
|
133
|
+
return (
|
|
134
|
+
<ToolsPanelItem
|
|
135
|
+
panelId={ clientId }
|
|
136
|
+
label={ control.label }
|
|
137
|
+
hasValue={ () => {
|
|
138
|
+
return value?.text && ! isEmpty( value );
|
|
139
|
+
} }
|
|
140
|
+
onDeselect={ () =>
|
|
141
|
+
updateAttributes( { [ valueKey ]: defaultValue } )
|
|
142
|
+
}
|
|
143
|
+
isShownByDefault={ control.shownByDefault }
|
|
144
|
+
>
|
|
145
|
+
{ isSelected && (
|
|
146
|
+
<keyboardShortcutContext.Provider value={ keyboardShortcuts }>
|
|
147
|
+
<inputEventContext.Provider value={ inputEvents }>
|
|
148
|
+
<div>
|
|
149
|
+
<FormatEdit
|
|
150
|
+
value={ value }
|
|
151
|
+
onChange={ onChange }
|
|
152
|
+
onFocus={ onFocus }
|
|
153
|
+
formatTypes={ formatTypes }
|
|
154
|
+
forwardedRef={ anchorRef }
|
|
155
|
+
isVisible={ false }
|
|
156
|
+
/>
|
|
157
|
+
</div>
|
|
158
|
+
</inputEventContext.Provider>
|
|
159
|
+
</keyboardShortcutContext.Provider>
|
|
160
|
+
) }
|
|
161
|
+
<BaseControl __nextHasNoMarginBottom { ...baseControlProps }>
|
|
162
|
+
<div
|
|
163
|
+
className="block-editor-content-only-controls__rich-text"
|
|
164
|
+
role="textbox"
|
|
165
|
+
aria-multiline={ ! control.args?.disableLineBreaks }
|
|
166
|
+
ref={ useMergeRefs( [
|
|
167
|
+
richTextRef,
|
|
168
|
+
useEventListeners( {
|
|
169
|
+
registry,
|
|
170
|
+
getValue,
|
|
171
|
+
onChange,
|
|
172
|
+
formatTypes,
|
|
173
|
+
selectionChange: setSelection,
|
|
174
|
+
isSelected,
|
|
175
|
+
disableFormats: control.args?.disableFormats,
|
|
176
|
+
value,
|
|
177
|
+
tagName: 'div',
|
|
178
|
+
removeEditorOnlyFormats,
|
|
179
|
+
disableLineBreaks: control.args?.disableLineBreaks,
|
|
180
|
+
keyboardShortcuts,
|
|
181
|
+
inputEvents,
|
|
182
|
+
} ),
|
|
183
|
+
anchorRef,
|
|
184
|
+
] ) }
|
|
185
|
+
onFocus={ () => setIsSelected( true ) }
|
|
186
|
+
onBlur={ () => setIsSelected( false ) }
|
|
187
|
+
contentEditable
|
|
188
|
+
{ ...controlProps }
|
|
189
|
+
/>
|
|
190
|
+
</BaseControl>
|
|
191
|
+
</ToolsPanelItem>
|
|
192
|
+
);
|
|
193
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
@use "@wordpress/base-styles/colors" as *;
|
|
2
|
+
@use "@wordpress/base-styles/mixins" as *;
|
|
3
|
+
@use "@wordpress/base-styles/variables" as *;
|
|
4
|
+
|
|
5
|
+
.block-editor-content-only-controls__rich-text {
|
|
6
|
+
width: 100%;
|
|
7
|
+
// Override input style margin in WP forms.css.
|
|
8
|
+
margin: 0;
|
|
9
|
+
background: $white;
|
|
10
|
+
color: $gray-900;
|
|
11
|
+
@include input-control( var(--wp-admin-theme-color, #3858e9) );
|
|
12
|
+
border-color: $gray-600;
|
|
13
|
+
|
|
14
|
+
&::placeholder {
|
|
15
|
+
color: color-mix(in srgb, $gray-900, transparent 38%);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
min-height: $grid-unit-50;
|
|
19
|
+
|
|
20
|
+
// Subtract 1px to account for the border, which isn't included on the element
|
|
21
|
+
// on newer components like InputControl, SelectControl, etc.
|
|
22
|
+
// These values should be shared with the `controlPaddingX` in ./utils/config-values.js
|
|
23
|
+
padding: $grid-unit-15;
|
|
24
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
@use "@wordpress/base-styles/colors" as *;
|
|
2
|
+
@use "@wordpress/base-styles/variables" as *;
|
|
3
|
+
@use "./link/styles.scss" as *;
|
|
4
|
+
@use "./media/styles.scss" as *;
|
|
5
|
+
@use "./rich-text/styles.scss" as *;
|
|
6
|
+
|
|
7
|
+
.block-editor-content-only-controls__screen {
|
|
8
|
+
&.components-navigator-screen {
|
|
9
|
+
padding: $grid-unit-10 0 0 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Add border for the entire content controls and remove the similar border
|
|
13
|
+
// for tools panel.
|
|
14
|
+
border-top: $border-width solid $gray-200;
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
.components-tools-panel {
|
|
18
|
+
border-top: none;
|
|
19
|
+
|
|
20
|
+
// Condense the tools panels more than normal.
|
|
21
|
+
padding-top: $grid-unit-10;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.block-editor-content-only-controls__button-panel {
|
|
26
|
+
padding: 4px;
|
|
27
|
+
|
|
28
|
+
// Match heading font weights for the tools panels.
|
|
29
|
+
font-weight: 500 !important;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.block-editor-content-only-controls__back-button,
|
|
33
|
+
.block-editor-content-only-controls__drill-down-button {
|
|
34
|
+
width: 100%;
|
|
35
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { useViewportMatch } from '@wordpress/compose';
|
|
5
|
+
|
|
6
|
+
export function useInspectorPopoverPlacement(
|
|
7
|
+
{ isControl } = { isControl: false }
|
|
8
|
+
) {
|
|
9
|
+
const isMobile = useViewportMatch( 'medium', '<' );
|
|
10
|
+
return ! isMobile
|
|
11
|
+
? {
|
|
12
|
+
popoverProps: {
|
|
13
|
+
placement: 'left-start',
|
|
14
|
+
// For non-mobile, inner sidebar width (248px) - button width (24px) - border (1px) + padding (16px) + spacing (20px)
|
|
15
|
+
offset: isControl ? 35 : 259,
|
|
16
|
+
},
|
|
17
|
+
}
|
|
18
|
+
: {};
|
|
19
|
+
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
__experimentalNumberControl as NumberControl,
|
|
7
7
|
__experimentalToolsPanel as ToolsPanel,
|
|
8
8
|
__experimentalToolsPanelItem as ToolsPanelItem,
|
|
9
|
+
Notice,
|
|
9
10
|
} from '@wordpress/components';
|
|
10
11
|
import { __ } from '@wordpress/i18n';
|
|
11
12
|
import { useCallback, useMemo, useEffect } from '@wordpress/element';
|
|
@@ -609,9 +610,20 @@ export default function TypographyPanel( {
|
|
|
609
610
|
<TextAlignmentControl
|
|
610
611
|
value={ textAlign }
|
|
611
612
|
onChange={ setTextAlign }
|
|
613
|
+
options={ [ 'left', 'center', 'right', 'justify' ] }
|
|
612
614
|
size="__unstable-large"
|
|
613
615
|
__nextHasNoMarginBottom
|
|
614
616
|
/>
|
|
617
|
+
|
|
618
|
+
{ textAlign === 'justify' && (
|
|
619
|
+
<div>
|
|
620
|
+
<Notice status="warning" isDismissible={ false }>
|
|
621
|
+
{ __(
|
|
622
|
+
'Justified text can reduce readability. For better accessibility, use left-aligned text instead.'
|
|
623
|
+
) }
|
|
624
|
+
</Notice>
|
|
625
|
+
</div>
|
|
626
|
+
) }
|
|
615
627
|
</ToolsPanelItem>
|
|
616
628
|
) }
|
|
617
629
|
</Wrapper>
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
import { __ } from '@wordpress/i18n';
|
|
5
5
|
import { useViewportMatch } from '@wordpress/compose';
|
|
6
6
|
import { Button } from '@wordpress/components';
|
|
7
|
-
import { useCallback, useMemo
|
|
8
|
-
import { useSelect } from '@wordpress/data';
|
|
7
|
+
import { useCallback, useMemo } from '@wordpress/element';
|
|
9
8
|
|
|
10
9
|
/**
|
|
11
10
|
* Internal dependencies
|
|
@@ -13,55 +12,14 @@ import { useSelect } from '@wordpress/data';
|
|
|
13
12
|
import { MediaCategoryPanel } from './media-panel';
|
|
14
13
|
import MediaUploadCheck from '../../media-upload/check';
|
|
15
14
|
import MediaUpload from '../../media-upload';
|
|
16
|
-
import MediaUploadModal from '../../media-upload-modal';
|
|
17
15
|
import { useMediaCategories } from './hooks';
|
|
18
16
|
import { getBlockAndPreviewFromMedia } from './utils';
|
|
19
17
|
import MobileTabNavigation from '../mobile-tab-navigation';
|
|
20
18
|
import CategoryTabs from '../category-tabs';
|
|
21
19
|
import InserterNoResults from '../no-results';
|
|
22
|
-
import { store as blockEditorStore } from '../../../store';
|
|
23
20
|
|
|
24
21
|
const ALLOWED_MEDIA_TYPES = [ 'image', 'video', 'audio' ];
|
|
25
22
|
|
|
26
|
-
/**
|
|
27
|
-
* Conditional Media component that uses MediaUploadModal when experiment is enabled,
|
|
28
|
-
* otherwise falls back to MediaUpload.
|
|
29
|
-
*
|
|
30
|
-
* @param {Object} root0 Component props.
|
|
31
|
-
* @param {Function} root0.render Render prop function that receives { open } object.
|
|
32
|
-
* @return {JSX.Element} The component.
|
|
33
|
-
*/
|
|
34
|
-
function ConditionalMediaUpload( { render, ...props } ) {
|
|
35
|
-
const [ isModalOpen, setIsModalOpen ] = useState( false );
|
|
36
|
-
const mediaUpload = useSelect( ( select ) => {
|
|
37
|
-
const { getSettings } = select( blockEditorStore );
|
|
38
|
-
return getSettings().mediaUpload;
|
|
39
|
-
}, [] );
|
|
40
|
-
|
|
41
|
-
if ( window.__experimentalDataViewsMediaModal ) {
|
|
42
|
-
return (
|
|
43
|
-
<>
|
|
44
|
-
{ render && render( { open: () => setIsModalOpen( true ) } ) }
|
|
45
|
-
<MediaUploadModal
|
|
46
|
-
{ ...props }
|
|
47
|
-
isOpen={ isModalOpen }
|
|
48
|
-
onClose={ () => {
|
|
49
|
-
setIsModalOpen( false );
|
|
50
|
-
props.onClose?.();
|
|
51
|
-
} }
|
|
52
|
-
onSelect={ ( media ) => {
|
|
53
|
-
setIsModalOpen( false );
|
|
54
|
-
props.onSelect?.( media );
|
|
55
|
-
} }
|
|
56
|
-
onUpload={ mediaUpload }
|
|
57
|
-
/>
|
|
58
|
-
</>
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return <MediaUpload { ...props } render={ render } />;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
23
|
function MediaTab( {
|
|
66
24
|
rootClientId,
|
|
67
25
|
selectedCategory,
|
|
@@ -113,7 +71,7 @@ function MediaTab( {
|
|
|
113
71
|
{ children }
|
|
114
72
|
</CategoryTabs>
|
|
115
73
|
<MediaUploadCheck>
|
|
116
|
-
<
|
|
74
|
+
<MediaUpload
|
|
117
75
|
multiple={ false }
|
|
118
76
|
onSelect={ onSelectMedia }
|
|
119
77
|
allowedTypes={ ALLOWED_MEDIA_TYPES }
|
|
@@ -8,16 +8,24 @@ import { __ } from '@wordpress/i18n';
|
|
|
8
8
|
* Internal dependencies
|
|
9
9
|
*/
|
|
10
10
|
import BlockQuickNavigation from '../block-quick-navigation';
|
|
11
|
+
import ContentOnlyControls from '../content-only-controls';
|
|
11
12
|
|
|
12
|
-
const ContentTab = ( { contentClientIds } ) => {
|
|
13
|
+
const ContentTab = ( { rootClientId, contentClientIds } ) => {
|
|
13
14
|
if ( ! contentClientIds || contentClientIds.length === 0 ) {
|
|
14
15
|
return null;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
return (
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
<>
|
|
20
|
+
{ ! window?.__experimentalContentOnlyPatternInsertion && (
|
|
21
|
+
<PanelBody title={ __( 'Content' ) }>
|
|
22
|
+
<BlockQuickNavigation clientIds={ contentClientIds } />
|
|
23
|
+
</PanelBody>
|
|
24
|
+
) }
|
|
25
|
+
{ window?.__experimentalContentOnlyPatternInsertion && (
|
|
26
|
+
<ContentOnlyControls rootClientId={ rootClientId } />
|
|
27
|
+
) }
|
|
28
|
+
</>
|
|
21
29
|
);
|
|
22
30
|
};
|
|
23
31
|
|
|
@@ -109,7 +109,10 @@ export default function InspectorControlsTabs( {
|
|
|
109
109
|
/>
|
|
110
110
|
</Tabs.TabPanel>
|
|
111
111
|
<Tabs.TabPanel tabId={ TAB_CONTENT.name } focusable={ false }>
|
|
112
|
-
<ContentTab
|
|
112
|
+
<ContentTab
|
|
113
|
+
rootClientId={ clientId }
|
|
114
|
+
contentClientIds={ contentClientIds }
|
|
115
|
+
/>
|
|
113
116
|
</Tabs.TabPanel>
|
|
114
117
|
<Tabs.TabPanel tabId={ TAB_LIST_VIEW.name } focusable={ false }>
|
|
115
118
|
<InspectorControls.Slot group="list" />
|
|
@@ -12,7 +12,13 @@ import {
|
|
|
12
12
|
privateApis as componentsPrivateApis,
|
|
13
13
|
} from '@wordpress/components';
|
|
14
14
|
import { forwardRef } from '@wordpress/element';
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
Icon,
|
|
17
|
+
lockSmall as lock,
|
|
18
|
+
pinSmall,
|
|
19
|
+
unseen,
|
|
20
|
+
symbol,
|
|
21
|
+
} from '@wordpress/icons';
|
|
16
22
|
import { SPACE, ENTER } from '@wordpress/keycodes';
|
|
17
23
|
import { useSelect } from '@wordpress/data';
|
|
18
24
|
import { hasBlockSupport } from '@wordpress/blocks';
|
|
@@ -55,28 +61,35 @@ function ListViewBlockSelectButton(
|
|
|
55
61
|
context: 'list-view',
|
|
56
62
|
} );
|
|
57
63
|
const { isLocked } = useBlockLock( clientId );
|
|
58
|
-
const {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
64
|
+
const {
|
|
65
|
+
canToggleBlockVisibility,
|
|
66
|
+
isBlockHidden,
|
|
67
|
+
isContentOnly,
|
|
68
|
+
hasPatternName,
|
|
69
|
+
} = useSelect(
|
|
70
|
+
( select ) => {
|
|
71
|
+
const { getBlockName, getBlockAttributes } =
|
|
72
|
+
select( blockEditorStore );
|
|
73
|
+
const { isBlockHidden: _isBlockHidden } = unlock(
|
|
74
|
+
select( blockEditorStore )
|
|
75
|
+
);
|
|
76
|
+
const blockAttributes = getBlockAttributes( clientId );
|
|
77
|
+
return {
|
|
78
|
+
canToggleBlockVisibility: hasBlockSupport(
|
|
79
|
+
getBlockName( clientId ),
|
|
80
|
+
'blockVisibility',
|
|
81
|
+
true
|
|
82
|
+
),
|
|
83
|
+
isBlockHidden: _isBlockHidden( clientId ),
|
|
84
|
+
isContentOnly:
|
|
85
|
+
select( blockEditorStore ).getBlockEditingMode(
|
|
86
|
+
clientId
|
|
87
|
+
) === 'contentOnly',
|
|
88
|
+
hasPatternName: !! blockAttributes?.metadata?.patternName,
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
[ clientId ]
|
|
92
|
+
);
|
|
80
93
|
const shouldShowLockIcon = isLocked && ! isContentOnly;
|
|
81
94
|
const shouldShowBlockVisibilityIcon =
|
|
82
95
|
canToggleBlockVisibility && isBlockHidden;
|
|
@@ -123,7 +136,7 @@ function ListViewBlockSelectButton(
|
|
|
123
136
|
>
|
|
124
137
|
<ListViewExpander onClick={ onToggleExpanded } />
|
|
125
138
|
<BlockIcon
|
|
126
|
-
icon={ blockInformation?.icon }
|
|
139
|
+
icon={ hasPatternName ? symbol : blockInformation?.icon }
|
|
127
140
|
showColors
|
|
128
141
|
context="list-view"
|
|
129
142
|
/>
|
|
@@ -25,7 +25,6 @@ import deprecated from '@wordpress/deprecated';
|
|
|
25
25
|
* Internal dependencies
|
|
26
26
|
*/
|
|
27
27
|
import MediaUpload from '../media-upload';
|
|
28
|
-
import MediaUploadModal from '../media-upload-modal';
|
|
29
28
|
import MediaUploadCheck from '../media-upload/check';
|
|
30
29
|
import URLPopover from '../url-popover';
|
|
31
30
|
import { store as blockEditorStore } from '../../store';
|
|
@@ -33,45 +32,6 @@ import { parseDropEvent } from '../use-on-block-drop';
|
|
|
33
32
|
|
|
34
33
|
const noop = () => {};
|
|
35
34
|
|
|
36
|
-
/**
|
|
37
|
-
* Conditional Media component that uses MediaUploadModal when experiment is enabled,
|
|
38
|
-
* otherwise falls back to MediaUpload.
|
|
39
|
-
*
|
|
40
|
-
* @param {Object} root0 Component props.
|
|
41
|
-
* @param {Function} root0.render Render prop function that receives { open } object.
|
|
42
|
-
* @return {JSX.Element} The component.
|
|
43
|
-
*/
|
|
44
|
-
function ConditionalMediaUpload( { render, ...props } ) {
|
|
45
|
-
const [ isModalOpen, setIsModalOpen ] = useState( false );
|
|
46
|
-
const mediaUpload = useSelect( ( select ) => {
|
|
47
|
-
const { getSettings } = select( blockEditorStore );
|
|
48
|
-
return getSettings().mediaUpload;
|
|
49
|
-
}, [] );
|
|
50
|
-
|
|
51
|
-
if ( window.__experimentalDataViewsMediaModal ) {
|
|
52
|
-
return (
|
|
53
|
-
<>
|
|
54
|
-
{ render && render( { open: () => setIsModalOpen( true ) } ) }
|
|
55
|
-
<MediaUploadModal
|
|
56
|
-
{ ...props }
|
|
57
|
-
isOpen={ isModalOpen }
|
|
58
|
-
onClose={ () => {
|
|
59
|
-
setIsModalOpen( false );
|
|
60
|
-
props.onClose?.();
|
|
61
|
-
} }
|
|
62
|
-
onSelect={ ( media ) => {
|
|
63
|
-
setIsModalOpen( false );
|
|
64
|
-
props.onSelect?.( media );
|
|
65
|
-
} }
|
|
66
|
-
onUpload={ mediaUpload }
|
|
67
|
-
/>
|
|
68
|
-
</>
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return <MediaUpload { ...props } render={ render } />;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
35
|
const InsertFromURLPopover = ( {
|
|
76
36
|
src,
|
|
77
37
|
onChange,
|
|
@@ -488,7 +448,7 @@ export function MediaPlaceholder( {
|
|
|
488
448
|
};
|
|
489
449
|
const libraryButton = mediaLibraryButton ?? defaultButton;
|
|
490
450
|
const uploadMediaLibraryButton = (
|
|
491
|
-
<
|
|
451
|
+
<MediaUpload
|
|
492
452
|
addToGallery={ addToGallery }
|
|
493
453
|
gallery={ multiple && onlyAllowsImages() }
|
|
494
454
|
multiple={ multiple }
|
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
ToolbarButton,
|
|
13
13
|
} from '@wordpress/components';
|
|
14
14
|
import { useSelect, withDispatch } from '@wordpress/data';
|
|
15
|
-
import { useState } from '@wordpress/element';
|
|
16
15
|
import { DOWN } from '@wordpress/keycodes';
|
|
17
16
|
import {
|
|
18
17
|
postFeaturedImage,
|
|
@@ -27,7 +26,6 @@ import { store as noticesStore } from '@wordpress/notices';
|
|
|
27
26
|
* Internal dependencies
|
|
28
27
|
*/
|
|
29
28
|
import MediaUpload from '../media-upload';
|
|
30
|
-
import MediaUploadModal from '../media-upload-modal';
|
|
31
29
|
import MediaUploadCheck from '../media-upload/check';
|
|
32
30
|
import LinkControl from '../link-control';
|
|
33
31
|
import { store as blockEditorStore } from '../../store';
|
|
@@ -35,42 +33,6 @@ import { store as blockEditorStore } from '../../store';
|
|
|
35
33
|
const noop = () => {};
|
|
36
34
|
let uniqueId = 0;
|
|
37
35
|
|
|
38
|
-
/**
|
|
39
|
-
* Conditional Media component that uses MediaUploadModal when experiment is enabled,
|
|
40
|
-
* otherwise falls back to MediaUpload.
|
|
41
|
-
*
|
|
42
|
-
* @param {Object} root0 Component props.
|
|
43
|
-
* @param {Function} root0.render Render prop function that receives { open } object.
|
|
44
|
-
* @return {JSX.Element} The component.
|
|
45
|
-
*/
|
|
46
|
-
function ConditionalMediaUpload( { render, ...props } ) {
|
|
47
|
-
const [ isModalOpen, setIsModalOpen ] = useState( false );
|
|
48
|
-
const { getSettings } = useSelect( blockEditorStore );
|
|
49
|
-
|
|
50
|
-
if ( window.__experimentalDataViewsMediaModal ) {
|
|
51
|
-
return (
|
|
52
|
-
<>
|
|
53
|
-
{ render && render( { open: () => setIsModalOpen( true ) } ) }
|
|
54
|
-
<MediaUploadModal
|
|
55
|
-
{ ...props }
|
|
56
|
-
isOpen={ isModalOpen }
|
|
57
|
-
onClose={ () => {
|
|
58
|
-
setIsModalOpen( false );
|
|
59
|
-
props.onClose?.();
|
|
60
|
-
} }
|
|
61
|
-
onSelect={ ( media ) => {
|
|
62
|
-
setIsModalOpen( false );
|
|
63
|
-
props.onSelect?.( media );
|
|
64
|
-
} }
|
|
65
|
-
onUpload={ getSettings().mediaUpload }
|
|
66
|
-
/>
|
|
67
|
-
</>
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return <MediaUpload { ...props } render={ render } />;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
36
|
const MediaReplaceFlow = ( {
|
|
75
37
|
mediaURL,
|
|
76
38
|
mediaId,
|
|
@@ -93,6 +55,7 @@ const MediaReplaceFlow = ( {
|
|
|
93
55
|
handleUpload = true,
|
|
94
56
|
popoverProps,
|
|
95
57
|
renderToggle,
|
|
58
|
+
className,
|
|
96
59
|
} ) => {
|
|
97
60
|
const { getSettings } = useSelect( blockEditorStore );
|
|
98
61
|
const errorNoticeID = `block-editor/media-replace-flow/error-notice/${ ++uniqueId }`;
|
|
@@ -169,6 +132,7 @@ const MediaReplaceFlow = ( {
|
|
|
169
132
|
return (
|
|
170
133
|
<Dropdown
|
|
171
134
|
popoverProps={ popoverProps }
|
|
135
|
+
className={ className }
|
|
172
136
|
contentClassName="block-editor-media-replace-flow__options"
|
|
173
137
|
renderToggle={ ( { isOpen, onToggle } ) => {
|
|
174
138
|
if ( renderToggle ) {
|
|
@@ -195,7 +159,7 @@ const MediaReplaceFlow = ( {
|
|
|
195
159
|
<>
|
|
196
160
|
<NavigableMenu className="block-editor-media-replace-flow__media-upload-menu">
|
|
197
161
|
<MediaUploadCheck>
|
|
198
|
-
<
|
|
162
|
+
<MediaUpload
|
|
199
163
|
gallery={ gallery }
|
|
200
164
|
addToGallery={ addToGallery }
|
|
201
165
|
multiple={ multiple }
|
|
@@ -13,7 +13,14 @@ const DEFAULT_BLOCK_CONTEXT = {};
|
|
|
13
13
|
|
|
14
14
|
export const usesContextKey = Symbol( 'usesContext' );
|
|
15
15
|
|
|
16
|
-
function Edit( {
|
|
16
|
+
function Edit( {
|
|
17
|
+
onChange,
|
|
18
|
+
onFocus,
|
|
19
|
+
value,
|
|
20
|
+
forwardedRef,
|
|
21
|
+
settings,
|
|
22
|
+
isVisible,
|
|
23
|
+
} ) {
|
|
17
24
|
const {
|
|
18
25
|
name,
|
|
19
26
|
edit: EditFunction,
|
|
@@ -47,6 +54,7 @@ function Edit( { onChange, onFocus, value, forwardedRef, settings } ) {
|
|
|
47
54
|
<EditFunction
|
|
48
55
|
key={ name }
|
|
49
56
|
isActive={ isActive }
|
|
57
|
+
isVisible={ isVisible }
|
|
50
58
|
activeAttributes={ isActive ? activeFormat.attributes || {} : {} }
|
|
51
59
|
isObjectActive={ isObjectActive }
|
|
52
60
|
activeObjectAttributes={
|