@wordpress/edit-site 5.28.4 → 5.28.6
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-editor/use-site-editor-settings.js +1 -1
- package/build/components/block-editor/use-site-editor-settings.js.map +1 -1
- package/build/components/global-styles/font-library-modal/context.js +63 -59
- package/build/components/global-styles/font-library-modal/context.js.map +1 -1
- package/build/components/global-styles/font-library-modal/font-collection.js +6 -6
- package/build/components/global-styles/font-library-modal/font-collection.js.map +1 -1
- package/build/components/global-styles/font-library-modal/index.js +17 -4
- package/build/components/global-styles/font-library-modal/index.js.map +1 -1
- package/build/components/global-styles/font-library-modal/installed-fonts.js +10 -1
- package/build/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
- package/build/components/global-styles/font-library-modal/upload-fonts.js +46 -20
- package/build/components/global-styles/font-library-modal/upload-fonts.js.map +1 -1
- package/build/components/global-styles/font-library-modal/utils/index.js +39 -5
- package/build/components/global-styles/font-library-modal/utils/index.js.map +1 -1
- package/build/components/keyboard-shortcuts/global.js +17 -3
- package/build/components/keyboard-shortcuts/global.js.map +1 -1
- package/build/components/resizable-frame/index.js +2 -1
- package/build/components/resizable-frame/index.js.map +1 -1
- package/build-module/components/block-editor/use-site-editor-settings.js +1 -1
- package/build-module/components/block-editor/use-site-editor-settings.js.map +1 -1
- package/build-module/components/global-styles/font-library-modal/context.js +65 -61
- package/build-module/components/global-styles/font-library-modal/context.js.map +1 -1
- package/build-module/components/global-styles/font-library-modal/font-collection.js +6 -6
- package/build-module/components/global-styles/font-library-modal/font-collection.js.map +1 -1
- package/build-module/components/global-styles/font-library-modal/index.js +17 -4
- package/build-module/components/global-styles/font-library-modal/index.js.map +1 -1
- package/build-module/components/global-styles/font-library-modal/installed-fonts.js +10 -1
- package/build-module/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
- package/build-module/components/global-styles/font-library-modal/upload-fonts.js +46 -20
- package/build-module/components/global-styles/font-library-modal/upload-fonts.js.map +1 -1
- package/build-module/components/global-styles/font-library-modal/utils/index.js +38 -5
- package/build-module/components/global-styles/font-library-modal/utils/index.js.map +1 -1
- package/build-module/components/keyboard-shortcuts/global.js +17 -3
- package/build-module/components/keyboard-shortcuts/global.js.map +1 -1
- package/build-module/components/resizable-frame/index.js +2 -1
- package/build-module/components/resizable-frame/index.js.map +1 -1
- package/build-style/style-rtl.css +20 -11
- package/build-style/style.css +20 -11
- package/package.json +19 -19
- package/src/components/block-editor/use-site-editor-settings.js +0 -2
- package/src/components/global-styles/font-library-modal/context.js +122 -107
- package/src/components/global-styles/font-library-modal/font-collection.js +10 -8
- package/src/components/global-styles/font-library-modal/index.js +21 -14
- package/src/components/global-styles/font-library-modal/installed-fonts.js +18 -1
- package/src/components/global-styles/font-library-modal/upload-fonts.js +56 -21
- package/src/components/global-styles/font-library-modal/utils/index.js +45 -5
- package/src/components/global-styles/font-library-modal/utils/test/getDisplaySrcFromFontFace.spec.js +7 -18
- package/src/components/keyboard-shortcuts/global.js +16 -4
- package/src/components/resizable-frame/index.js +1 -0
|
@@ -20,7 +20,7 @@ const {
|
|
|
20
20
|
} = unlock(componentsPrivateApis);
|
|
21
21
|
function UploadFonts() {
|
|
22
22
|
const {
|
|
23
|
-
|
|
23
|
+
installFonts,
|
|
24
24
|
notice,
|
|
25
25
|
setNotice
|
|
26
26
|
} = useContext(FontLibraryContext);
|
|
@@ -38,29 +38,42 @@ function UploadFonts() {
|
|
|
38
38
|
* @param {Array} files The files to be filtered
|
|
39
39
|
* @return {void}
|
|
40
40
|
*/
|
|
41
|
-
const handleFilesUpload = files => {
|
|
41
|
+
const handleFilesUpload = async files => {
|
|
42
42
|
setNotice(null);
|
|
43
43
|
setIsUploading(true);
|
|
44
44
|
const uniqueFilenames = new Set();
|
|
45
45
|
const selectedFiles = [...files];
|
|
46
|
-
|
|
46
|
+
let hasInvalidFiles = false;
|
|
47
|
+
|
|
48
|
+
// Use map to create a promise for each file check, then filter with Promise.all.
|
|
49
|
+
const checkFilesPromises = selectedFiles.map(async file => {
|
|
50
|
+
const isFont = await isFontFile(file);
|
|
51
|
+
if (!isFont) {
|
|
52
|
+
hasInvalidFiles = true;
|
|
53
|
+
return null; // Return null for invalid files.
|
|
54
|
+
}
|
|
55
|
+
// Check for duplicates
|
|
47
56
|
if (uniqueFilenames.has(file.name)) {
|
|
48
|
-
return
|
|
57
|
+
return null; // Return null for duplicates.
|
|
49
58
|
}
|
|
50
|
-
//
|
|
59
|
+
// Check if the file extension is allowed.
|
|
51
60
|
const fileExtension = file.name.split('.').pop().toLowerCase();
|
|
52
61
|
if (ALLOWED_FILE_EXTENSIONS.includes(fileExtension)) {
|
|
53
62
|
uniqueFilenames.add(file.name);
|
|
54
|
-
return
|
|
63
|
+
return file; // Return the file if it passes all checks.
|
|
55
64
|
}
|
|
56
|
-
return
|
|
65
|
+
return null; // Return null for disallowed file extensions.
|
|
57
66
|
});
|
|
67
|
+
|
|
68
|
+
// Filter out the nulls after all promises have resolved.
|
|
69
|
+
const allowedFiles = (await Promise.all(checkFilesPromises)).filter(file => null !== file);
|
|
58
70
|
if (allowedFiles.length > 0) {
|
|
59
71
|
loadFiles(allowedFiles);
|
|
60
72
|
} else {
|
|
73
|
+
const message = hasInvalidFiles ? __('Sorry, you are not allowed to upload this file type.') : __('No fonts found to install.');
|
|
61
74
|
setNotice({
|
|
62
75
|
type: 'error',
|
|
63
|
-
message
|
|
76
|
+
message
|
|
64
77
|
});
|
|
65
78
|
setIsUploading(false);
|
|
66
79
|
}
|
|
@@ -81,6 +94,23 @@ function UploadFonts() {
|
|
|
81
94
|
handleInstall(fontFacesLoaded);
|
|
82
95
|
};
|
|
83
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Checks if a file is a valid Font file.
|
|
99
|
+
*
|
|
100
|
+
* @param {File} file The file to be checked.
|
|
101
|
+
* @return {boolean} Whether the file is a valid font file.
|
|
102
|
+
*/
|
|
103
|
+
async function isFontFile(file) {
|
|
104
|
+
const font = new Font('Uploaded Font');
|
|
105
|
+
try {
|
|
106
|
+
const buffer = await readFileAsArrayBuffer(file);
|
|
107
|
+
await font.fromDataBuffer(buffer, 'font');
|
|
108
|
+
return true;
|
|
109
|
+
} catch (error) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
84
114
|
// Create a function to read the file as array buffer
|
|
85
115
|
async function readFileAsArrayBuffer(file) {
|
|
86
116
|
return new Promise((resolve, reject) => {
|
|
@@ -124,16 +154,8 @@ function UploadFonts() {
|
|
|
124
154
|
*/
|
|
125
155
|
const handleInstall = async fontFaces => {
|
|
126
156
|
const fontFamilies = makeFamiliesFromFaces(fontFaces);
|
|
127
|
-
if (fontFamilies.length > 1) {
|
|
128
|
-
setNotice({
|
|
129
|
-
type: 'error',
|
|
130
|
-
message: __('Variants from only one font family can be uploaded at a time.')
|
|
131
|
-
});
|
|
132
|
-
setIsUploading(false);
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
157
|
try {
|
|
136
|
-
await
|
|
158
|
+
await installFonts(fontFamilies);
|
|
137
159
|
setNotice({
|
|
138
160
|
type: 'success',
|
|
139
161
|
message: __('Fonts were installed successfully.')
|
|
@@ -141,7 +163,8 @@ function UploadFonts() {
|
|
|
141
163
|
} catch (error) {
|
|
142
164
|
setNotice({
|
|
143
165
|
type: 'error',
|
|
144
|
-
message: error.message
|
|
166
|
+
message: error.message,
|
|
167
|
+
errors: error?.installationErrors
|
|
145
168
|
});
|
|
146
169
|
}
|
|
147
170
|
setIsUploading(false);
|
|
@@ -154,8 +177,11 @@ function UploadFonts() {
|
|
|
154
177
|
className: "font-library-modal__local-fonts"
|
|
155
178
|
}, notice && createElement(Notice, {
|
|
156
179
|
status: notice.type,
|
|
180
|
+
__unstableHTML: true,
|
|
157
181
|
onRemove: () => setNotice(null)
|
|
158
|
-
}, notice.message
|
|
182
|
+
}, notice.message, notice.errors && createElement("ul", null, notice.errors.map((error, index) => createElement("li", {
|
|
183
|
+
key: index
|
|
184
|
+
}, error)))), isUploading && createElement(FlexItem, null, createElement("div", {
|
|
159
185
|
className: "font-library-modal__upload-area"
|
|
160
186
|
}, createElement(ProgressBar, null))), !isUploading && createElement(FormFileUpload, {
|
|
161
187
|
accept: ALLOWED_FILE_EXTENSIONS.map(ext => `.${ext}`).join(','),
|
|
@@ -171,7 +197,7 @@ function UploadFonts() {
|
|
|
171
197
|
margin: 2
|
|
172
198
|
}), createElement(Text, {
|
|
173
199
|
className: "font-library-modal__upload-area__text"
|
|
174
|
-
}, __('Uploaded fonts appear in your library and can be used in your theme. Supported formats: .
|
|
200
|
+
}, __('Uploaded fonts appear in your library and can be used in your theme. Supported formats: .ttf, .otf, .woff, and .woff2.'))));
|
|
175
201
|
}
|
|
176
202
|
export default UploadFonts;
|
|
177
203
|
//# sourceMappingURL=upload-fonts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__","__experimentalSpacer","Spacer","__experimentalText","Text","__experimentalVStack","VStack","Button","DropZone","Notice","FormFileUpload","FlexItem","privateApis","componentsPrivateApis","useContext","useState","ALLOWED_FILE_EXTENSIONS","FontLibraryContext","Font","makeFamiliesFromFaces","loadFontFaceInBrowser","unlock","ProgressBar","UploadFonts","installFont","notice","setNotice","isUploading","setIsUploading","handleDropZone","files","handleFilesUpload","onFilesUpload","event","target","uniqueFilenames","Set","selectedFiles","allowedFiles","filter","file","has","name","fileExtension","split","pop","toLowerCase","includes","add","length","loadFiles","type","message","fontFacesLoaded","Promise","all","map","fontFile","fontFaceData","getFontFaceMetadata","handleInstall","readFileAsArrayBuffer","resolve","reject","reader","window","FileReader","readAsArrayBuffer","onload","result","onerror","buffer","fontObj","fromDataBuffer","onloadEvent","font","detail","opentype","tables","fontName","get","isItalic","fontWeight","usWeightClass","isVariable","fvar","weightAxis","axes","find","tag","weightRange","minValue","maxValue","fontFamily","fontStyle","fontFaces","fontFamilies","error","createElement","className","onFilesDrop","status","onRemove","accept","ext","join","multiple","onChange","render","openFileDialog","onClick","margin"],"sources":["@wordpress/edit-site/src/components/global-styles/font-library-modal/upload-fonts.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport {\n\t__experimentalSpacer as Spacer,\n\t__experimentalText as Text,\n\t__experimentalVStack as VStack,\n\tButton,\n\tDropZone,\n\tNotice,\n\tFormFileUpload,\n\tFlexItem,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useContext, useState } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { ALLOWED_FILE_EXTENSIONS } from './utils/constants';\nimport { FontLibraryContext } from './context';\nimport { Font } from '../../../../lib/lib-font.browser';\nimport makeFamiliesFromFaces from './utils/make-families-from-faces';\nimport { loadFontFaceInBrowser } from './utils';\nimport { unlock } from '../../../lock-unlock';\n\nconst { ProgressBar } = unlock( componentsPrivateApis );\n\nfunction UploadFonts() {\n\tconst { installFont, notice, setNotice } = useContext( FontLibraryContext );\n\tconst [ isUploading, setIsUploading ] = useState( false );\n\n\tconst handleDropZone = ( files ) => {\n\t\thandleFilesUpload( files );\n\t};\n\tconst onFilesUpload = ( event ) => {\n\t\thandleFilesUpload( event.target.files );\n\t};\n\n\t/**\n\t * Filters the selected files to only allow the ones with the allowed extensions\n\t *\n\t * @param {Array} files The files to be filtered\n\t * @return {void}\n\t */\n\tconst handleFilesUpload = ( files ) => {\n\t\tsetNotice( null );\n\t\tsetIsUploading( true );\n\t\tconst uniqueFilenames = new Set();\n\t\tconst selectedFiles = [ ...files ];\n\t\tconst allowedFiles = selectedFiles.filter( ( file ) => {\n\t\t\tif ( uniqueFilenames.has( file.name ) ) {\n\t\t\t\treturn false; // Discard duplicates\n\t\t\t}\n\t\t\t// Eliminates files that are not allowed\n\t\t\tconst fileExtension = file.name.split( '.' ).pop().toLowerCase();\n\t\t\tif ( ALLOWED_FILE_EXTENSIONS.includes( fileExtension ) ) {\n\t\t\t\tuniqueFilenames.add( file.name );\n\t\t\t\treturn true; // Keep file if the extension is allowed\n\t\t\t}\n\t\t\treturn false; // Discard file extension not allowed\n\t\t} );\n\t\tif ( allowedFiles.length > 0 ) {\n\t\t\tloadFiles( allowedFiles );\n\t\t} else {\n\t\t\tsetNotice( {\n\t\t\t\ttype: 'error',\n\t\t\t\tmessage: __( 'No fonts found to install.' ),\n\t\t\t} );\n\t\t\tsetIsUploading( false );\n\t\t}\n\t};\n\n\t/**\n\t * Loads the selected files and reads the font metadata\n\t *\n\t * @param {Array} files The files to be loaded\n\t * @return {void}\n\t */\n\tconst loadFiles = async ( files ) => {\n\t\tconst fontFacesLoaded = await Promise.all(\n\t\t\tfiles.map( async ( fontFile ) => {\n\t\t\t\tconst fontFaceData = await getFontFaceMetadata( fontFile );\n\t\t\t\tawait loadFontFaceInBrowser(\n\t\t\t\t\tfontFaceData,\n\t\t\t\t\tfontFaceData.file,\n\t\t\t\t\t'all'\n\t\t\t\t);\n\t\t\t\treturn fontFaceData;\n\t\t\t} )\n\t\t);\n\t\thandleInstall( fontFacesLoaded );\n\t};\n\n\t// Create a function to read the file as array buffer\n\tasync function readFileAsArrayBuffer( file ) {\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\tconst reader = new window.FileReader();\n\t\t\treader.readAsArrayBuffer( file );\n\t\t\treader.onload = () => resolve( reader.result );\n\t\t\treader.onerror = reject;\n\t\t} );\n\t}\n\n\tconst getFontFaceMetadata = async ( fontFile ) => {\n\t\tconst buffer = await readFileAsArrayBuffer( fontFile );\n\t\tconst fontObj = new Font( 'Uploaded Font' );\n\t\tfontObj.fromDataBuffer( buffer, fontFile.name );\n\t\t// Assuming that fromDataBuffer triggers onload event and returning a Promise\n\t\tconst onloadEvent = await new Promise(\n\t\t\t( resolve ) => ( fontObj.onload = resolve )\n\t\t);\n\t\tconst font = onloadEvent.detail.font;\n\t\tconst { name } = font.opentype.tables;\n\t\tconst fontName = name.get( 16 ) || name.get( 1 );\n\t\tconst isItalic = name.get( 2 ).toLowerCase().includes( 'italic' );\n\t\tconst fontWeight =\n\t\t\tfont.opentype.tables[ 'OS/2' ].usWeightClass || 'normal';\n\t\tconst isVariable = !! font.opentype.tables.fvar;\n\t\tconst weightAxis =\n\t\t\tisVariable &&\n\t\t\tfont.opentype.tables.fvar.axes.find(\n\t\t\t\t( { tag } ) => tag === 'wght'\n\t\t\t);\n\t\tconst weightRange = weightAxis\n\t\t\t? `${ weightAxis.minValue } ${ weightAxis.maxValue }`\n\t\t\t: null;\n\t\treturn {\n\t\t\tfile: fontFile,\n\t\t\tfontFamily: fontName,\n\t\t\tfontStyle: isItalic ? 'italic' : 'normal',\n\t\t\tfontWeight: weightRange || fontWeight,\n\t\t};\n\t};\n\n\t/**\n\t * Creates the font family definition and sends it to the server\n\t *\n\t * @param {Array} fontFaces The font faces to be installed\n\t * @return {void}\n\t */\n\tconst handleInstall = async ( fontFaces ) => {\n\t\tconst fontFamilies = makeFamiliesFromFaces( fontFaces );\n\n\t\tif ( fontFamilies.length > 1 ) {\n\t\t\tsetNotice( {\n\t\t\t\ttype: 'error',\n\t\t\t\tmessage: __(\n\t\t\t\t\t'Variants from only one font family can be uploaded at a time.'\n\t\t\t\t),\n\t\t\t} );\n\t\t\tsetIsUploading( false );\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait installFont( fontFamilies[ 0 ] );\n\t\t\tsetNotice( {\n\t\t\t\ttype: 'success',\n\t\t\t\tmessage: __( 'Fonts were installed successfully.' ),\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\tsetNotice( {\n\t\t\t\ttype: 'error',\n\t\t\t\tmessage: error.message,\n\t\t\t} );\n\t\t}\n\n\t\tsetIsUploading( false );\n\t};\n\n\treturn (\n\t\t<div className=\"font-library-modal__tabpanel-layout\">\n\t\t\t<DropZone onFilesDrop={ handleDropZone } />\n\t\t\t<VStack className=\"font-library-modal__local-fonts\">\n\t\t\t\t{ notice && (\n\t\t\t\t\t<Notice\n\t\t\t\t\t\tstatus={ notice.type }\n\t\t\t\t\t\tonRemove={ () => setNotice( null ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ notice.message }\n\t\t\t\t\t</Notice>\n\t\t\t\t) }\n\t\t\t\t{ isUploading && (\n\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t<div className=\"font-library-modal__upload-area\">\n\t\t\t\t\t\t\t<ProgressBar />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</FlexItem>\n\t\t\t\t) }\n\t\t\t\t{ ! isUploading && (\n\t\t\t\t\t<FormFileUpload\n\t\t\t\t\t\taccept={ ALLOWED_FILE_EXTENSIONS.map(\n\t\t\t\t\t\t\t( ext ) => `.${ ext }`\n\t\t\t\t\t\t).join( ',' ) }\n\t\t\t\t\t\tmultiple={ true }\n\t\t\t\t\t\tonChange={ onFilesUpload }\n\t\t\t\t\t\trender={ ( { openFileDialog } ) => (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tclassName=\"font-library-modal__upload-area\"\n\t\t\t\t\t\t\t\tonClick={ openFileDialog }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ __( 'Upload font' ) }\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t) }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t<Spacer margin={ 2 } />\n\t\t\t\t<Text className=\"font-library-modal__upload-area__text\">\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'Uploaded fonts appear in your library and can be used in your theme. Supported formats: .tff, .otf, .woff, and .woff2.'\n\t\t\t\t\t) }\n\t\t\t\t</Text>\n\t\t\t</VStack>\n\t\t</div>\n\t);\n}\n\nexport default UploadFonts;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["__","__experimentalSpacer","Spacer","__experimentalText","Text","__experimentalVStack","VStack","Button","DropZone","Notice","FormFileUpload","FlexItem","privateApis","componentsPrivateApis","useContext","useState","ALLOWED_FILE_EXTENSIONS","FontLibraryContext","Font","makeFamiliesFromFaces","loadFontFaceInBrowser","unlock","ProgressBar","UploadFonts","installFonts","notice","setNotice","isUploading","setIsUploading","handleDropZone","files","handleFilesUpload","onFilesUpload","event","target","uniqueFilenames","Set","selectedFiles","hasInvalidFiles","checkFilesPromises","map","file","isFont","isFontFile","has","name","fileExtension","split","pop","toLowerCase","includes","add","allowedFiles","Promise","all","filter","length","loadFiles","message","type","fontFacesLoaded","fontFile","fontFaceData","getFontFaceMetadata","handleInstall","font","buffer","readFileAsArrayBuffer","fromDataBuffer","error","resolve","reject","reader","window","FileReader","readAsArrayBuffer","onload","result","onerror","fontObj","onloadEvent","detail","opentype","tables","fontName","get","isItalic","fontWeight","usWeightClass","isVariable","fvar","weightAxis","axes","find","tag","weightRange","minValue","maxValue","fontFamily","fontStyle","fontFaces","fontFamilies","errors","installationErrors","createElement","className","onFilesDrop","status","__unstableHTML","onRemove","index","key","accept","ext","join","multiple","onChange","render","openFileDialog","onClick","margin"],"sources":["@wordpress/edit-site/src/components/global-styles/font-library-modal/upload-fonts.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport {\n\t__experimentalSpacer as Spacer,\n\t__experimentalText as Text,\n\t__experimentalVStack as VStack,\n\tButton,\n\tDropZone,\n\tNotice,\n\tFormFileUpload,\n\tFlexItem,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useContext, useState } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { ALLOWED_FILE_EXTENSIONS } from './utils/constants';\nimport { FontLibraryContext } from './context';\nimport { Font } from '../../../../lib/lib-font.browser';\nimport makeFamiliesFromFaces from './utils/make-families-from-faces';\nimport { loadFontFaceInBrowser } from './utils';\nimport { unlock } from '../../../lock-unlock';\n\nconst { ProgressBar } = unlock( componentsPrivateApis );\n\nfunction UploadFonts() {\n\tconst { installFonts, notice, setNotice } =\n\t\tuseContext( FontLibraryContext );\n\tconst [ isUploading, setIsUploading ] = useState( false );\n\n\tconst handleDropZone = ( files ) => {\n\t\thandleFilesUpload( files );\n\t};\n\tconst onFilesUpload = ( event ) => {\n\t\thandleFilesUpload( event.target.files );\n\t};\n\n\t/**\n\t * Filters the selected files to only allow the ones with the allowed extensions\n\t *\n\t * @param {Array} files The files to be filtered\n\t * @return {void}\n\t */\n\tconst handleFilesUpload = async ( files ) => {\n\t\tsetNotice( null );\n\t\tsetIsUploading( true );\n\t\tconst uniqueFilenames = new Set();\n\t\tconst selectedFiles = [ ...files ];\n\t\tlet hasInvalidFiles = false;\n\n\t\t// Use map to create a promise for each file check, then filter with Promise.all.\n\t\tconst checkFilesPromises = selectedFiles.map( async ( file ) => {\n\t\t\tconst isFont = await isFontFile( file );\n\t\t\tif ( ! isFont ) {\n\t\t\t\thasInvalidFiles = true;\n\t\t\t\treturn null; // Return null for invalid files.\n\t\t\t}\n\t\t\t// Check for duplicates\n\t\t\tif ( uniqueFilenames.has( file.name ) ) {\n\t\t\t\treturn null; // Return null for duplicates.\n\t\t\t}\n\t\t\t// Check if the file extension is allowed.\n\t\t\tconst fileExtension = file.name.split( '.' ).pop().toLowerCase();\n\t\t\tif ( ALLOWED_FILE_EXTENSIONS.includes( fileExtension ) ) {\n\t\t\t\tuniqueFilenames.add( file.name );\n\t\t\t\treturn file; // Return the file if it passes all checks.\n\t\t\t}\n\t\t\treturn null; // Return null for disallowed file extensions.\n\t\t} );\n\n\t\t// Filter out the nulls after all promises have resolved.\n\t\tconst allowedFiles = ( await Promise.all( checkFilesPromises ) ).filter(\n\t\t\t( file ) => null !== file\n\t\t);\n\n\t\tif ( allowedFiles.length > 0 ) {\n\t\t\tloadFiles( allowedFiles );\n\t\t} else {\n\t\t\tconst message = hasInvalidFiles\n\t\t\t\t? __( 'Sorry, you are not allowed to upload this file type.' )\n\t\t\t\t: __( 'No fonts found to install.' );\n\n\t\t\tsetNotice( {\n\t\t\t\ttype: 'error',\n\t\t\t\tmessage,\n\t\t\t} );\n\t\t\tsetIsUploading( false );\n\t\t}\n\t};\n\n\t/**\n\t * Loads the selected files and reads the font metadata\n\t *\n\t * @param {Array} files The files to be loaded\n\t * @return {void}\n\t */\n\tconst loadFiles = async ( files ) => {\n\t\tconst fontFacesLoaded = await Promise.all(\n\t\t\tfiles.map( async ( fontFile ) => {\n\t\t\t\tconst fontFaceData = await getFontFaceMetadata( fontFile );\n\t\t\t\tawait loadFontFaceInBrowser(\n\t\t\t\t\tfontFaceData,\n\t\t\t\t\tfontFaceData.file,\n\t\t\t\t\t'all'\n\t\t\t\t);\n\t\t\t\treturn fontFaceData;\n\t\t\t} )\n\t\t);\n\t\thandleInstall( fontFacesLoaded );\n\t};\n\n\t/**\n\t * Checks if a file is a valid Font file.\n\t *\n\t * @param {File} file The file to be checked.\n\t * @return {boolean} Whether the file is a valid font file.\n\t */\n\tasync function isFontFile( file ) {\n\t\tconst font = new Font( 'Uploaded Font' );\n\t\ttry {\n\t\t\tconst buffer = await readFileAsArrayBuffer( file );\n\t\t\tawait font.fromDataBuffer( buffer, 'font' );\n\t\t\treturn true;\n\t\t} catch ( error ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Create a function to read the file as array buffer\n\tasync function readFileAsArrayBuffer( file ) {\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\tconst reader = new window.FileReader();\n\t\t\treader.readAsArrayBuffer( file );\n\t\t\treader.onload = () => resolve( reader.result );\n\t\t\treader.onerror = reject;\n\t\t} );\n\t}\n\n\tconst getFontFaceMetadata = async ( fontFile ) => {\n\t\tconst buffer = await readFileAsArrayBuffer( fontFile );\n\t\tconst fontObj = new Font( 'Uploaded Font' );\n\t\tfontObj.fromDataBuffer( buffer, fontFile.name );\n\t\t// Assuming that fromDataBuffer triggers onload event and returning a Promise\n\t\tconst onloadEvent = await new Promise(\n\t\t\t( resolve ) => ( fontObj.onload = resolve )\n\t\t);\n\t\tconst font = onloadEvent.detail.font;\n\t\tconst { name } = font.opentype.tables;\n\t\tconst fontName = name.get( 16 ) || name.get( 1 );\n\t\tconst isItalic = name.get( 2 ).toLowerCase().includes( 'italic' );\n\t\tconst fontWeight =\n\t\t\tfont.opentype.tables[ 'OS/2' ].usWeightClass || 'normal';\n\t\tconst isVariable = !! font.opentype.tables.fvar;\n\t\tconst weightAxis =\n\t\t\tisVariable &&\n\t\t\tfont.opentype.tables.fvar.axes.find(\n\t\t\t\t( { tag } ) => tag === 'wght'\n\t\t\t);\n\t\tconst weightRange = weightAxis\n\t\t\t? `${ weightAxis.minValue } ${ weightAxis.maxValue }`\n\t\t\t: null;\n\t\treturn {\n\t\t\tfile: fontFile,\n\t\t\tfontFamily: fontName,\n\t\t\tfontStyle: isItalic ? 'italic' : 'normal',\n\t\t\tfontWeight: weightRange || fontWeight,\n\t\t};\n\t};\n\n\t/**\n\t * Creates the font family definition and sends it to the server\n\t *\n\t * @param {Array} fontFaces The font faces to be installed\n\t * @return {void}\n\t */\n\tconst handleInstall = async ( fontFaces ) => {\n\t\tconst fontFamilies = makeFamiliesFromFaces( fontFaces );\n\n\t\ttry {\n\t\t\tawait installFonts( fontFamilies );\n\t\t\tsetNotice( {\n\t\t\t\ttype: 'success',\n\t\t\t\tmessage: __( 'Fonts were installed successfully.' ),\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\tsetNotice( {\n\t\t\t\ttype: 'error',\n\t\t\t\tmessage: error.message,\n\t\t\t\terrors: error?.installationErrors,\n\t\t\t} );\n\t\t}\n\n\t\tsetIsUploading( false );\n\t};\n\n\treturn (\n\t\t<div className=\"font-library-modal__tabpanel-layout\">\n\t\t\t<DropZone onFilesDrop={ handleDropZone } />\n\t\t\t<VStack className=\"font-library-modal__local-fonts\">\n\t\t\t\t{ notice && (\n\t\t\t\t\t<Notice\n\t\t\t\t\t\tstatus={ notice.type }\n\t\t\t\t\t\t__unstableHTML\n\t\t\t\t\t\tonRemove={ () => setNotice( null ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ notice.message }\n\t\t\t\t\t\t{ notice.errors && (\n\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t{ notice.errors.map( ( error, index ) => (\n\t\t\t\t\t\t\t\t\t<li key={ index }>{ error }</li>\n\t\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</Notice>\n\t\t\t\t) }\n\t\t\t\t{ isUploading && (\n\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t<div className=\"font-library-modal__upload-area\">\n\t\t\t\t\t\t\t<ProgressBar />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</FlexItem>\n\t\t\t\t) }\n\t\t\t\t{ ! isUploading && (\n\t\t\t\t\t<FormFileUpload\n\t\t\t\t\t\taccept={ ALLOWED_FILE_EXTENSIONS.map(\n\t\t\t\t\t\t\t( ext ) => `.${ ext }`\n\t\t\t\t\t\t).join( ',' ) }\n\t\t\t\t\t\tmultiple={ true }\n\t\t\t\t\t\tonChange={ onFilesUpload }\n\t\t\t\t\t\trender={ ( { openFileDialog } ) => (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tclassName=\"font-library-modal__upload-area\"\n\t\t\t\t\t\t\t\tonClick={ openFileDialog }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ __( 'Upload font' ) }\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t) }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t<Spacer margin={ 2 } />\n\t\t\t\t<Text className=\"font-library-modal__upload-area__text\">\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'Uploaded fonts appear in your library and can be used in your theme. Supported formats: .ttf, .otf, .woff, and .woff2.'\n\t\t\t\t\t) }\n\t\t\t\t</Text>\n\t\t\t</VStack>\n\t\t</div>\n\t);\n}\n\nexport default UploadFonts;\n"],"mappings":"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"}
|
|
@@ -107,7 +107,40 @@ export async function loadFontFaceInBrowser(fontFace, source, addTo = 'all') {
|
|
|
107
107
|
iframeDocument.fonts.add(loadedFace);
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* Unloads the font face and remove it from the browser.
|
|
113
|
+
* It also removes it from the iframe document.
|
|
114
|
+
*
|
|
115
|
+
* Note that Font faces that were added to the set using the CSS @font-face rule
|
|
116
|
+
* remain connected to the corresponding CSS, and cannot be deleted.
|
|
117
|
+
*
|
|
118
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/delete.
|
|
119
|
+
*/
|
|
120
|
+
export function unloadFontFaceInBrowser(fontFace, removeFrom = 'all') {
|
|
121
|
+
const unloadFontFace = fonts => {
|
|
122
|
+
fonts.forEach(f => {
|
|
123
|
+
if (f.family === formatFontFaceName(fontFace.fontFamily) && f.weight === fontFace.fontWeight && f.style === fontFace.fontStyle) {
|
|
124
|
+
fonts.delete(f);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
if (removeFrom === 'document' || removeFrom === 'all') {
|
|
129
|
+
unloadFontFace(document.fonts);
|
|
130
|
+
}
|
|
131
|
+
if (removeFrom === 'iframe' || removeFrom === 'all') {
|
|
132
|
+
const iframeDocument = document.querySelector('iframe[name="editor-canvas"]').contentDocument;
|
|
133
|
+
unloadFontFace(iframeDocument.fonts);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Retrieves the display source from a font face src.
|
|
139
|
+
*
|
|
140
|
+
* @param {string|string[]} input - The font face src.
|
|
141
|
+
* @return {string|undefined} The display source or undefined if the input is invalid.
|
|
142
|
+
*/
|
|
143
|
+
export function getDisplaySrcFromFontFace(input) {
|
|
111
144
|
if (!input) {
|
|
112
145
|
return;
|
|
113
146
|
}
|
|
@@ -117,9 +150,9 @@ export function getDisplaySrcFromFontFace(input, urlPrefix) {
|
|
|
117
150
|
} else {
|
|
118
151
|
src = input;
|
|
119
152
|
}
|
|
120
|
-
//
|
|
121
|
-
if (src.startsWith('file:.')
|
|
122
|
-
|
|
153
|
+
// It's expected theme fonts will already be loaded in the browser.
|
|
154
|
+
if (src.startsWith('file:.')) {
|
|
155
|
+
return;
|
|
123
156
|
}
|
|
124
157
|
if (!isUrlEncoded(src)) {
|
|
125
158
|
src = encodeURI(src);
|
|
@@ -194,7 +227,7 @@ export async function batchInstallFontFaces(fontFamilyId, fontFacesData) {
|
|
|
194
227
|
// Handle network errors or other fetch-related errors
|
|
195
228
|
results.errors.push({
|
|
196
229
|
data: fontFacesData[index],
|
|
197
|
-
message:
|
|
230
|
+
message: result.reason.message
|
|
198
231
|
});
|
|
199
232
|
}
|
|
200
233
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["privateApis","componentsPrivateApis","FONT_WEIGHTS","FONT_STYLES","unlock","fetchInstallFontFace","formatFontFaceName","File","window","setUIValuesNeeded","font","extraValues","name","fontFamily","slug","isUrlEncoded","url","decodeURIComponent","getFontFaceVariantName","face","weightName","fontWeight","styleName","fontStyle","mergeFontFaces","existing","incoming","map","Map","set","Array","from","values","mergeFontFamilies","has","fontFace","incomingFontFaces","restIncoming","existingFont","get","mergedFontFaces","loadFontFaceInBrowser","source","addTo","dataSource","arrayBuffer","newFont","FontFace","style","weight","loadedFace","load","document","fonts","add","iframeDocument","querySelector","contentDocument","getDisplaySrcFromFontFace","input","urlPrefix","src","isArray","startsWith","replace","encodeURI","makeFontFamilyFormData","formData","FormData","kebabCase","category","familyWithValidParameters","fontFamilySettings","append","JSON","stringify","makeFontFacesFormData","fontFacesFormData","item","faceIndex","file","files","forEach","key","fileId","push","length","batchInstallFontFaces","fontFamilyId","fontFacesData","promises","faceData","responses","Promise","allSettled","results","errors","successes","result","index","status","response","value","id","data","message","reason","downloadFontFaceAssets","all","fetch","Request","then","ok","Error","blob","filename","split","pop","type","checkFontFaceInstalled","collection","findIndex","collectionFontFace"],"sources":["@wordpress/edit-site/src/components/global-styles/font-library-modal/utils/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { privateApis as componentsPrivateApis } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport { FONT_WEIGHTS, FONT_STYLES } from './constants';\nimport { unlock } from '../../../../lock-unlock';\nimport { fetchInstallFontFace } from '../resolvers';\nimport { formatFontFaceName } from './preview-styles';\n\n/**\n * Browser dependencies\n */\nconst { File } = window;\n\nexport function setUIValuesNeeded( font, extraValues = {} ) {\n\tif ( ! font.name && ( font.fontFamily || font.slug ) ) {\n\t\tfont.name = font.fontFamily || font.slug;\n\t}\n\treturn {\n\t\t...font,\n\t\t...extraValues,\n\t};\n}\n\nexport function isUrlEncoded( url ) {\n\tif ( typeof url !== 'string' ) {\n\t\treturn false;\n\t}\n\treturn url !== decodeURIComponent( url );\n}\n\nexport function getFontFaceVariantName( face ) {\n\tconst weightName = FONT_WEIGHTS[ face.fontWeight ] || face.fontWeight;\n\tconst styleName =\n\t\tface.fontStyle === 'normal'\n\t\t\t? ''\n\t\t\t: FONT_STYLES[ face.fontStyle ] || face.fontStyle;\n\treturn `${ weightName } ${ styleName }`;\n}\n\nexport function mergeFontFaces( existing = [], incoming = [] ) {\n\tconst map = new Map();\n\tfor ( const face of existing ) {\n\t\tmap.set( `${ face.fontWeight }${ face.fontStyle }`, face );\n\t}\n\tfor ( const face of incoming ) {\n\t\t// This will overwrite if the src already exists, keeping it unique.\n\t\tmap.set( `${ face.fontWeight }${ face.fontStyle }`, face );\n\t}\n\treturn Array.from( map.values() );\n}\n\nexport function mergeFontFamilies( existing = [], incoming = [] ) {\n\tconst map = new Map();\n\t// Add the existing array to the map.\n\tfor ( const font of existing ) {\n\t\tmap.set( font.slug, { ...font } );\n\t}\n\t// Add the incoming array to the map, overwriting existing values excepting fontFace that need to be merged.\n\tfor ( const font of incoming ) {\n\t\tif ( map.has( font.slug ) ) {\n\t\t\tconst { fontFace: incomingFontFaces, ...restIncoming } = font;\n\t\t\tconst existingFont = map.get( font.slug );\n\t\t\t// Merge the fontFaces existing with the incoming fontFaces.\n\t\t\tconst mergedFontFaces = mergeFontFaces(\n\t\t\t\texistingFont.fontFace,\n\t\t\t\tincomingFontFaces\n\t\t\t);\n\t\t\t// Except for the fontFace key all the other keys are overwritten with the incoming values.\n\t\t\tmap.set( font.slug, {\n\t\t\t\t...restIncoming,\n\t\t\t\tfontFace: mergedFontFaces,\n\t\t\t} );\n\t\t} else {\n\t\t\tmap.set( font.slug, { ...font } );\n\t\t}\n\t}\n\treturn Array.from( map.values() );\n}\n\n/*\n * Loads the font face from a URL and adds it to the browser.\n * It also adds it to the iframe document.\n */\nexport async function loadFontFaceInBrowser( fontFace, source, addTo = 'all' ) {\n\tlet dataSource;\n\n\tif ( typeof source === 'string' ) {\n\t\tdataSource = `url(${ source })`;\n\t\t// eslint-disable-next-line no-undef\n\t} else if ( source instanceof File ) {\n\t\tdataSource = await source.arrayBuffer();\n\t} else {\n\t\treturn;\n\t}\n\n\tconst newFont = new window.FontFace(\n\t\tformatFontFaceName( fontFace.fontFamily ),\n\t\tdataSource,\n\t\t{\n\t\t\tstyle: fontFace.fontStyle,\n\t\t\tweight: fontFace.fontWeight,\n\t\t}\n\t);\n\n\tconst loadedFace = await newFont.load();\n\n\tif ( addTo === 'document' || addTo === 'all' ) {\n\t\tdocument.fonts.add( loadedFace );\n\t}\n\n\tif ( addTo === 'iframe' || addTo === 'all' ) {\n\t\tconst iframeDocument = document.querySelector(\n\t\t\t'iframe[name=\"editor-canvas\"]'\n\t\t).contentDocument;\n\t\tiframeDocument.fonts.add( loadedFace );\n\t}\n}\n\nexport function getDisplaySrcFromFontFace( input, urlPrefix ) {\n\tif ( ! input ) {\n\t\treturn;\n\t}\n\n\tlet src;\n\tif ( Array.isArray( input ) ) {\n\t\tsrc = input[ 0 ];\n\t} else {\n\t\tsrc = input;\n\t}\n\t// If it is a theme font, we need to make the url absolute\n\tif ( src.startsWith( 'file:.' ) && urlPrefix ) {\n\t\tsrc = src.replace( 'file:.', urlPrefix );\n\t}\n\tif ( ! isUrlEncoded( src ) ) {\n\t\tsrc = encodeURI( src );\n\t}\n\treturn src;\n}\n\nexport function makeFontFamilyFormData( fontFamily ) {\n\tconst formData = new FormData();\n\tconst { kebabCase } = unlock( componentsPrivateApis );\n\n\tconst { fontFace, category, ...familyWithValidParameters } = fontFamily;\n\tconst fontFamilySettings = {\n\t\t...familyWithValidParameters,\n\t\tslug: kebabCase( fontFamily.slug ),\n\t};\n\n\tformData.append(\n\t\t'font_family_settings',\n\t\tJSON.stringify( fontFamilySettings )\n\t);\n\treturn formData;\n}\n\nexport function makeFontFacesFormData( font ) {\n\tif ( font?.fontFace ) {\n\t\tconst fontFacesFormData = font.fontFace.map( ( item, faceIndex ) => {\n\t\t\tconst face = { ...item };\n\t\t\tconst formData = new FormData();\n\t\t\tif ( face.file ) {\n\t\t\t\t// Normalize to an array, since face.file may be a single file or an array of files.\n\t\t\t\tconst files = Array.isArray( face.file )\n\t\t\t\t\t? face.file\n\t\t\t\t\t: [ face.file ];\n\t\t\t\tconst src = [];\n\n\t\t\t\tfiles.forEach( ( file, key ) => {\n\t\t\t\t\t// Slugified file name because the it might contain spaces or characters treated differently on the server.\n\t\t\t\t\tconst fileId = `file-${ faceIndex }-${ key }`;\n\t\t\t\t\t// Add the files to the formData\n\t\t\t\t\tformData.append( fileId, file, file.name );\n\t\t\t\t\tsrc.push( fileId );\n\t\t\t\t} );\n\n\t\t\t\tface.src = src.length === 1 ? src[ 0 ] : src;\n\t\t\t\tdelete face.file;\n\n\t\t\t\tformData.append( 'font_face_settings', JSON.stringify( face ) );\n\t\t\t} else {\n\t\t\t\tformData.append( 'font_face_settings', JSON.stringify( face ) );\n\t\t\t}\n\t\t\treturn formData;\n\t\t} );\n\n\t\treturn fontFacesFormData;\n\t}\n}\n\nexport async function batchInstallFontFaces( fontFamilyId, fontFacesData ) {\n\tconst promises = fontFacesData.map( ( faceData ) =>\n\t\tfetchInstallFontFace( fontFamilyId, faceData )\n\t);\n\tconst responses = await Promise.allSettled( promises );\n\n\tconst results = {\n\t\terrors: [],\n\t\tsuccesses: [],\n\t};\n\n\tresponses.forEach( ( result, index ) => {\n\t\tif ( result.status === 'fulfilled' ) {\n\t\t\tconst response = result.value;\n\t\t\tif ( response.id ) {\n\t\t\t\tresults.successes.push( response );\n\t\t\t} else {\n\t\t\t\tresults.errors.push( {\n\t\t\t\t\tdata: fontFacesData[ index ],\n\t\t\t\t\tmessage: `Error: ${ response.message }`,\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\t\t\t// Handle network errors or other fetch-related errors\n\t\t\tresults.errors.push( {\n\t\t\t\tdata: fontFacesData[ index ],\n\t\t\t\tmessage: `Fetch error: ${ result.reason.message }`,\n\t\t\t} );\n\t\t}\n\t} );\n\n\treturn results;\n}\n\n/*\n * Downloads a font face asset from a URL to the client and returns a File object.\n */\nexport async function downloadFontFaceAssets( src ) {\n\t// Normalize to an array, since `src` could be a string or array.\n\tsrc = Array.isArray( src ) ? src : [ src ];\n\n\tconst files = await Promise.all(\n\t\tsrc.map( async ( url ) => {\n\t\t\treturn fetch( new Request( url ) )\n\t\t\t\t.then( ( response ) => {\n\t\t\t\t\tif ( ! response.ok ) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Error downloading font face asset from ${ url }. Server responded with status: ${ response.status }`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn response.blob();\n\t\t\t\t} )\n\t\t\t\t.then( ( blob ) => {\n\t\t\t\t\tconst filename = url.split( '/' ).pop();\n\t\t\t\t\tconst file = new File( [ blob ], filename, {\n\t\t\t\t\t\ttype: blob.type,\n\t\t\t\t\t} );\n\t\t\t\t\treturn file;\n\t\t\t\t} );\n\t\t} )\n\t);\n\n\t// If we only have one file return it (not the array). Otherwise return all of them in the array.\n\treturn files.length === 1 ? files[ 0 ] : files;\n}\n\n/*\n * Determine if a given Font Face is present in a given collection.\n * We determine that a font face has been installed by comparing the fontWeight and fontStyle\n *\n * @param {Object} fontFace The Font Face to seek\n * @param {Array} collection The Collection to seek in\n * @returns True if the font face is found in the collection. Otherwise False.\n */\nexport function checkFontFaceInstalled( fontFace, collection ) {\n\treturn (\n\t\t-1 !==\n\t\tcollection.findIndex( ( collectionFontFace ) => {\n\t\t\treturn (\n\t\t\t\tcollectionFontFace.fontWeight === fontFace.fontWeight &&\n\t\t\t\tcollectionFontFace.fontStyle === fontFace.fontStyle\n\t\t\t);\n\t\t} )\n\t);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,WAAW,IAAIC,qBAAqB,QAAQ,uBAAuB;;AAE5E;AACA;AACA;AACA,SAASC,YAAY,EAAEC,WAAW,QAAQ,aAAa;AACvD,SAASC,MAAM,QAAQ,yBAAyB;AAChD,SAASC,oBAAoB,QAAQ,cAAc;AACnD,SAASC,kBAAkB,QAAQ,kBAAkB;;AAErD;AACA;AACA;AACA,MAAM;EAAEC;AAAK,CAAC,GAAGC,MAAM;AAEvB,OAAO,SAASC,iBAAiBA,CAAEC,IAAI,EAAEC,WAAW,GAAG,CAAC,CAAC,EAAG;EAC3D,IAAK,CAAED,IAAI,CAACE,IAAI,KAAMF,IAAI,CAACG,UAAU,IAAIH,IAAI,CAACI,IAAI,CAAE,EAAG;IACtDJ,IAAI,CAACE,IAAI,GAAGF,IAAI,CAACG,UAAU,IAAIH,IAAI,CAACI,IAAI;EACzC;EACA,OAAO;IACN,GAAGJ,IAAI;IACP,GAAGC;EACJ,CAAC;AACF;AAEA,OAAO,SAASI,YAAYA,CAAEC,GAAG,EAAG;EACnC,IAAK,OAAOA,GAAG,KAAK,QAAQ,EAAG;IAC9B,OAAO,KAAK;EACb;EACA,OAAOA,GAAG,KAAKC,kBAAkB,CAAED,GAAI,CAAC;AACzC;AAEA,OAAO,SAASE,sBAAsBA,CAAEC,IAAI,EAAG;EAC9C,MAAMC,UAAU,GAAGlB,YAAY,CAAEiB,IAAI,CAACE,UAAU,CAAE,IAAIF,IAAI,CAACE,UAAU;EACrE,MAAMC,SAAS,GACdH,IAAI,CAACI,SAAS,KAAK,QAAQ,GACxB,EAAE,GACFpB,WAAW,CAAEgB,IAAI,CAACI,SAAS,CAAE,IAAIJ,IAAI,CAACI,SAAS;EACnD,OAAQ,GAAGH,UAAY,IAAIE,SAAW,EAAC;AACxC;AAEA,OAAO,SAASE,cAAcA,CAAEC,QAAQ,GAAG,EAAE,EAAEC,QAAQ,GAAG,EAAE,EAAG;EAC9D,MAAMC,GAAG,GAAG,IAAIC,GAAG,CAAC,CAAC;EACrB,KAAM,MAAMT,IAAI,IAAIM,QAAQ,EAAG;IAC9BE,GAAG,CAACE,GAAG,CAAG,GAAGV,IAAI,CAACE,UAAY,GAAGF,IAAI,CAACI,SAAW,EAAC,EAAEJ,IAAK,CAAC;EAC3D;EACA,KAAM,MAAMA,IAAI,IAAIO,QAAQ,EAAG;IAC9B;IACAC,GAAG,CAACE,GAAG,CAAG,GAAGV,IAAI,CAACE,UAAY,GAAGF,IAAI,CAACI,SAAW,EAAC,EAAEJ,IAAK,CAAC;EAC3D;EACA,OAAOW,KAAK,CAACC,IAAI,CAAEJ,GAAG,CAACK,MAAM,CAAC,CAAE,CAAC;AAClC;AAEA,OAAO,SAASC,iBAAiBA,CAAER,QAAQ,GAAG,EAAE,EAAEC,QAAQ,GAAG,EAAE,EAAG;EACjE,MAAMC,GAAG,GAAG,IAAIC,GAAG,CAAC,CAAC;EACrB;EACA,KAAM,MAAMlB,IAAI,IAAIe,QAAQ,EAAG;IAC9BE,GAAG,CAACE,GAAG,CAAEnB,IAAI,CAACI,IAAI,EAAE;MAAE,GAAGJ;IAAK,CAAE,CAAC;EAClC;EACA;EACA,KAAM,MAAMA,IAAI,IAAIgB,QAAQ,EAAG;IAC9B,IAAKC,GAAG,CAACO,GAAG,CAAExB,IAAI,CAACI,IAAK,CAAC,EAAG;MAC3B,MAAM;QAAEqB,QAAQ,EAAEC,iBAAiB;QAAE,GAAGC;MAAa,CAAC,GAAG3B,IAAI;MAC7D,MAAM4B,YAAY,GAAGX,GAAG,CAACY,GAAG,CAAE7B,IAAI,CAACI,IAAK,CAAC;MACzC;MACA,MAAM0B,eAAe,GAAGhB,cAAc,CACrCc,YAAY,CAACH,QAAQ,EACrBC,iBACD,CAAC;MACD;MACAT,GAAG,CAACE,GAAG,CAAEnB,IAAI,CAACI,IAAI,EAAE;QACnB,GAAGuB,YAAY;QACfF,QAAQ,EAAEK;MACX,CAAE,CAAC;IACJ,CAAC,MAAM;MACNb,GAAG,CAACE,GAAG,CAAEnB,IAAI,CAACI,IAAI,EAAE;QAAE,GAAGJ;MAAK,CAAE,CAAC;IAClC;EACD;EACA,OAAOoB,KAAK,CAACC,IAAI,CAAEJ,GAAG,CAACK,MAAM,CAAC,CAAE,CAAC;AAClC;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeS,qBAAqBA,CAAEN,QAAQ,EAAEO,MAAM,EAAEC,KAAK,GAAG,KAAK,EAAG;EAC9E,IAAIC,UAAU;EAEd,IAAK,OAAOF,MAAM,KAAK,QAAQ,EAAG;IACjCE,UAAU,GAAI,OAAOF,MAAQ,GAAE;IAC/B;EACD,CAAC,MAAM,IAAKA,MAAM,YAAYnC,IAAI,EAAG;IACpCqC,UAAU,GAAG,MAAMF,MAAM,CAACG,WAAW,CAAC,CAAC;EACxC,CAAC,MAAM;IACN;EACD;EAEA,MAAMC,OAAO,GAAG,IAAItC,MAAM,CAACuC,QAAQ,CAClCzC,kBAAkB,CAAE6B,QAAQ,CAACtB,UAAW,CAAC,EACzC+B,UAAU,EACV;IACCI,KAAK,EAAEb,QAAQ,CAACZ,SAAS;IACzB0B,MAAM,EAAEd,QAAQ,CAACd;EAClB,CACD,CAAC;EAED,MAAM6B,UAAU,GAAG,MAAMJ,OAAO,CAACK,IAAI,CAAC,CAAC;EAEvC,IAAKR,KAAK,KAAK,UAAU,IAAIA,KAAK,KAAK,KAAK,EAAG;IAC9CS,QAAQ,CAACC,KAAK,CAACC,GAAG,CAAEJ,UAAW,CAAC;EACjC;EAEA,IAAKP,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,KAAK,EAAG;IAC5C,MAAMY,cAAc,GAAGH,QAAQ,CAACI,aAAa,CAC5C,8BACD,CAAC,CAACC,eAAe;IACjBF,cAAc,CAACF,KAAK,CAACC,GAAG,CAAEJ,UAAW,CAAC;EACvC;AACD;AAEA,OAAO,SAASQ,yBAAyBA,CAAEC,KAAK,EAAEC,SAAS,EAAG;EAC7D,IAAK,CAAED,KAAK,EAAG;IACd;EACD;EAEA,IAAIE,GAAG;EACP,IAAK/B,KAAK,CAACgC,OAAO,CAAEH,KAAM,CAAC,EAAG;IAC7BE,GAAG,GAAGF,KAAK,CAAE,CAAC,CAAE;EACjB,CAAC,MAAM;IACNE,GAAG,GAAGF,KAAK;EACZ;EACA;EACA,IAAKE,GAAG,CAACE,UAAU,CAAE,QAAS,CAAC,IAAIH,SAAS,EAAG;IAC9CC,GAAG,GAAGA,GAAG,CAACG,OAAO,CAAE,QAAQ,EAAEJ,SAAU,CAAC;EACzC;EACA,IAAK,CAAE7C,YAAY,CAAE8C,GAAI,CAAC,EAAG;IAC5BA,GAAG,GAAGI,SAAS,CAAEJ,GAAI,CAAC;EACvB;EACA,OAAOA,GAAG;AACX;AAEA,OAAO,SAASK,sBAAsBA,CAAErD,UAAU,EAAG;EACpD,MAAMsD,QAAQ,GAAG,IAAIC,QAAQ,CAAC,CAAC;EAC/B,MAAM;IAAEC;EAAU,CAAC,GAAGjE,MAAM,CAAEH,qBAAsB,CAAC;EAErD,MAAM;IAAEkC,QAAQ;IAAEmC,QAAQ;IAAE,GAAGC;EAA0B,CAAC,GAAG1D,UAAU;EACvE,MAAM2D,kBAAkB,GAAG;IAC1B,GAAGD,yBAAyB;IAC5BzD,IAAI,EAAEuD,SAAS,CAAExD,UAAU,CAACC,IAAK;EAClC,CAAC;EAEDqD,QAAQ,CAACM,MAAM,CACd,sBAAsB,EACtBC,IAAI,CAACC,SAAS,CAAEH,kBAAmB,CACpC,CAAC;EACD,OAAOL,QAAQ;AAChB;AAEA,OAAO,SAASS,qBAAqBA,CAAElE,IAAI,EAAG;EAC7C,IAAKA,IAAI,EAAEyB,QAAQ,EAAG;IACrB,MAAM0C,iBAAiB,GAAGnE,IAAI,CAACyB,QAAQ,CAACR,GAAG,CAAE,CAAEmD,IAAI,EAAEC,SAAS,KAAM;MACnE,MAAM5D,IAAI,GAAG;QAAE,GAAG2D;MAAK,CAAC;MACxB,MAAMX,QAAQ,GAAG,IAAIC,QAAQ,CAAC,CAAC;MAC/B,IAAKjD,IAAI,CAAC6D,IAAI,EAAG;QAChB;QACA,MAAMC,KAAK,GAAGnD,KAAK,CAACgC,OAAO,CAAE3C,IAAI,CAAC6D,IAAK,CAAC,GACrC7D,IAAI,CAAC6D,IAAI,GACT,CAAE7D,IAAI,CAAC6D,IAAI,CAAE;QAChB,MAAMnB,GAAG,GAAG,EAAE;QAEdoB,KAAK,CAACC,OAAO,CAAE,CAAEF,IAAI,EAAEG,GAAG,KAAM;UAC/B;UACA,MAAMC,MAAM,GAAI,QAAQL,SAAW,IAAII,GAAK,EAAC;UAC7C;UACAhB,QAAQ,CAACM,MAAM,CAAEW,MAAM,EAAEJ,IAAI,EAAEA,IAAI,CAACpE,IAAK,CAAC;UAC1CiD,GAAG,CAACwB,IAAI,CAAED,MAAO,CAAC;QACnB,CAAE,CAAC;QAEHjE,IAAI,CAAC0C,GAAG,GAAGA,GAAG,CAACyB,MAAM,KAAK,CAAC,GAAGzB,GAAG,CAAE,CAAC,CAAE,GAAGA,GAAG;QAC5C,OAAO1C,IAAI,CAAC6D,IAAI;QAEhBb,QAAQ,CAACM,MAAM,CAAE,oBAAoB,EAAEC,IAAI,CAACC,SAAS,CAAExD,IAAK,CAAE,CAAC;MAChE,CAAC,MAAM;QACNgD,QAAQ,CAACM,MAAM,CAAE,oBAAoB,EAAEC,IAAI,CAACC,SAAS,CAAExD,IAAK,CAAE,CAAC;MAChE;MACA,OAAOgD,QAAQ;IAChB,CAAE,CAAC;IAEH,OAAOU,iBAAiB;EACzB;AACD;AAEA,OAAO,eAAeU,qBAAqBA,CAAEC,YAAY,EAAEC,aAAa,EAAG;EAC1E,MAAMC,QAAQ,GAAGD,aAAa,CAAC9D,GAAG,CAAIgE,QAAQ,IAC7CtF,oBAAoB,CAAEmF,YAAY,EAAEG,QAAS,CAC9C,CAAC;EACD,MAAMC,SAAS,GAAG,MAAMC,OAAO,CAACC,UAAU,CAAEJ,QAAS,CAAC;EAEtD,MAAMK,OAAO,GAAG;IACfC,MAAM,EAAE,EAAE;IACVC,SAAS,EAAE;EACZ,CAAC;EAEDL,SAAS,CAACV,OAAO,CAAE,CAAEgB,MAAM,EAAEC,KAAK,KAAM;IACvC,IAAKD,MAAM,CAACE,MAAM,KAAK,WAAW,EAAG;MACpC,MAAMC,QAAQ,GAAGH,MAAM,CAACI,KAAK;MAC7B,IAAKD,QAAQ,CAACE,EAAE,EAAG;QAClBR,OAAO,CAACE,SAAS,CAACZ,IAAI,CAAEgB,QAAS,CAAC;MACnC,CAAC,MAAM;QACNN,OAAO,CAACC,MAAM,CAACX,IAAI,CAAE;UACpBmB,IAAI,EAAEf,aAAa,CAAEU,KAAK,CAAE;UAC5BM,OAAO,EAAG,UAAUJ,QAAQ,CAACI,OAAS;QACvC,CAAE,CAAC;MACJ;IACD,CAAC,MAAM;MACN;MACAV,OAAO,CAACC,MAAM,CAACX,IAAI,CAAE;QACpBmB,IAAI,EAAEf,aAAa,CAAEU,KAAK,CAAE;QAC5BM,OAAO,EAAG,gBAAgBP,MAAM,CAACQ,MAAM,CAACD,OAAS;MAClD,CAAE,CAAC;IACJ;EACD,CAAE,CAAC;EAEH,OAAOV,OAAO;AACf;;AAEA;AACA;AACA;AACA,OAAO,eAAeY,sBAAsBA,CAAE9C,GAAG,EAAG;EACnD;EACAA,GAAG,GAAG/B,KAAK,CAACgC,OAAO,CAAED,GAAI,CAAC,GAAGA,GAAG,GAAG,CAAEA,GAAG,CAAE;EAE1C,MAAMoB,KAAK,GAAG,MAAMY,OAAO,CAACe,GAAG,CAC9B/C,GAAG,CAAClC,GAAG,CAAE,MAAQX,GAAG,IAAM;IACzB,OAAO6F,KAAK,CAAE,IAAIC,OAAO,CAAE9F,GAAI,CAAE,CAAC,CAChC+F,IAAI,CAAIV,QAAQ,IAAM;MACtB,IAAK,CAAEA,QAAQ,CAACW,EAAE,EAAG;QACpB,MAAM,IAAIC,KAAK,CACb,0CAA0CjG,GAAK,mCAAmCqF,QAAQ,CAACD,MAAQ,EACrG,CAAC;MACF;MACA,OAAOC,QAAQ,CAACa,IAAI,CAAC,CAAC;IACvB,CAAE,CAAC,CACFH,IAAI,CAAIG,IAAI,IAAM;MAClB,MAAMC,QAAQ,GAAGnG,GAAG,CAACoG,KAAK,CAAE,GAAI,CAAC,CAACC,GAAG,CAAC,CAAC;MACvC,MAAMrC,IAAI,GAAG,IAAIzE,IAAI,CAAE,CAAE2G,IAAI,CAAE,EAAEC,QAAQ,EAAE;QAC1CG,IAAI,EAAEJ,IAAI,CAACI;MACZ,CAAE,CAAC;MACH,OAAOtC,IAAI;IACZ,CAAE,CAAC;EACL,CAAE,CACH,CAAC;;EAED;EACA,OAAOC,KAAK,CAACK,MAAM,KAAK,CAAC,GAAGL,KAAK,CAAE,CAAC,CAAE,GAAGA,KAAK;AAC/C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASsC,sBAAsBA,CAAEpF,QAAQ,EAAEqF,UAAU,EAAG;EAC9D,OACC,CAAC,CAAC,KACFA,UAAU,CAACC,SAAS,CAAIC,kBAAkB,IAAM;IAC/C,OACCA,kBAAkB,CAACrG,UAAU,KAAKc,QAAQ,CAACd,UAAU,IACrDqG,kBAAkB,CAACnG,SAAS,KAAKY,QAAQ,CAACZ,SAAS;EAErD,CAAE,CAAC;AAEL"}
|
|
1
|
+
{"version":3,"names":["privateApis","componentsPrivateApis","FONT_WEIGHTS","FONT_STYLES","unlock","fetchInstallFontFace","formatFontFaceName","File","window","setUIValuesNeeded","font","extraValues","name","fontFamily","slug","isUrlEncoded","url","decodeURIComponent","getFontFaceVariantName","face","weightName","fontWeight","styleName","fontStyle","mergeFontFaces","existing","incoming","map","Map","set","Array","from","values","mergeFontFamilies","has","fontFace","incomingFontFaces","restIncoming","existingFont","get","mergedFontFaces","loadFontFaceInBrowser","source","addTo","dataSource","arrayBuffer","newFont","FontFace","style","weight","loadedFace","load","document","fonts","add","iframeDocument","querySelector","contentDocument","unloadFontFaceInBrowser","removeFrom","unloadFontFace","forEach","f","family","delete","getDisplaySrcFromFontFace","input","src","isArray","startsWith","encodeURI","makeFontFamilyFormData","formData","FormData","kebabCase","category","familyWithValidParameters","fontFamilySettings","append","JSON","stringify","makeFontFacesFormData","fontFacesFormData","item","faceIndex","file","files","key","fileId","push","length","batchInstallFontFaces","fontFamilyId","fontFacesData","promises","faceData","responses","Promise","allSettled","results","errors","successes","result","index","status","response","value","id","data","message","reason","downloadFontFaceAssets","all","fetch","Request","then","ok","Error","blob","filename","split","pop","type","checkFontFaceInstalled","collection","findIndex","collectionFontFace"],"sources":["@wordpress/edit-site/src/components/global-styles/font-library-modal/utils/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { privateApis as componentsPrivateApis } from '@wordpress/components';\n\n/**\n * Internal dependencies\n */\nimport { FONT_WEIGHTS, FONT_STYLES } from './constants';\nimport { unlock } from '../../../../lock-unlock';\nimport { fetchInstallFontFace } from '../resolvers';\nimport { formatFontFaceName } from './preview-styles';\n\n/**\n * Browser dependencies\n */\nconst { File } = window;\n\nexport function setUIValuesNeeded( font, extraValues = {} ) {\n\tif ( ! font.name && ( font.fontFamily || font.slug ) ) {\n\t\tfont.name = font.fontFamily || font.slug;\n\t}\n\treturn {\n\t\t...font,\n\t\t...extraValues,\n\t};\n}\n\nexport function isUrlEncoded( url ) {\n\tif ( typeof url !== 'string' ) {\n\t\treturn false;\n\t}\n\treturn url !== decodeURIComponent( url );\n}\n\nexport function getFontFaceVariantName( face ) {\n\tconst weightName = FONT_WEIGHTS[ face.fontWeight ] || face.fontWeight;\n\tconst styleName =\n\t\tface.fontStyle === 'normal'\n\t\t\t? ''\n\t\t\t: FONT_STYLES[ face.fontStyle ] || face.fontStyle;\n\treturn `${ weightName } ${ styleName }`;\n}\n\nexport function mergeFontFaces( existing = [], incoming = [] ) {\n\tconst map = new Map();\n\tfor ( const face of existing ) {\n\t\tmap.set( `${ face.fontWeight }${ face.fontStyle }`, face );\n\t}\n\tfor ( const face of incoming ) {\n\t\t// This will overwrite if the src already exists, keeping it unique.\n\t\tmap.set( `${ face.fontWeight }${ face.fontStyle }`, face );\n\t}\n\treturn Array.from( map.values() );\n}\n\nexport function mergeFontFamilies( existing = [], incoming = [] ) {\n\tconst map = new Map();\n\t// Add the existing array to the map.\n\tfor ( const font of existing ) {\n\t\tmap.set( font.slug, { ...font } );\n\t}\n\t// Add the incoming array to the map, overwriting existing values excepting fontFace that need to be merged.\n\tfor ( const font of incoming ) {\n\t\tif ( map.has( font.slug ) ) {\n\t\t\tconst { fontFace: incomingFontFaces, ...restIncoming } = font;\n\t\t\tconst existingFont = map.get( font.slug );\n\t\t\t// Merge the fontFaces existing with the incoming fontFaces.\n\t\t\tconst mergedFontFaces = mergeFontFaces(\n\t\t\t\texistingFont.fontFace,\n\t\t\t\tincomingFontFaces\n\t\t\t);\n\t\t\t// Except for the fontFace key all the other keys are overwritten with the incoming values.\n\t\t\tmap.set( font.slug, {\n\t\t\t\t...restIncoming,\n\t\t\t\tfontFace: mergedFontFaces,\n\t\t\t} );\n\t\t} else {\n\t\t\tmap.set( font.slug, { ...font } );\n\t\t}\n\t}\n\treturn Array.from( map.values() );\n}\n\n/*\n * Loads the font face from a URL and adds it to the browser.\n * It also adds it to the iframe document.\n */\nexport async function loadFontFaceInBrowser( fontFace, source, addTo = 'all' ) {\n\tlet dataSource;\n\n\tif ( typeof source === 'string' ) {\n\t\tdataSource = `url(${ source })`;\n\t\t// eslint-disable-next-line no-undef\n\t} else if ( source instanceof File ) {\n\t\tdataSource = await source.arrayBuffer();\n\t} else {\n\t\treturn;\n\t}\n\n\tconst newFont = new window.FontFace(\n\t\tformatFontFaceName( fontFace.fontFamily ),\n\t\tdataSource,\n\t\t{\n\t\t\tstyle: fontFace.fontStyle,\n\t\t\tweight: fontFace.fontWeight,\n\t\t}\n\t);\n\n\tconst loadedFace = await newFont.load();\n\n\tif ( addTo === 'document' || addTo === 'all' ) {\n\t\tdocument.fonts.add( loadedFace );\n\t}\n\n\tif ( addTo === 'iframe' || addTo === 'all' ) {\n\t\tconst iframeDocument = document.querySelector(\n\t\t\t'iframe[name=\"editor-canvas\"]'\n\t\t).contentDocument;\n\t\tiframeDocument.fonts.add( loadedFace );\n\t}\n}\n\n/*\n * Unloads the font face and remove it from the browser.\n * It also removes it from the iframe document.\n *\n * Note that Font faces that were added to the set using the CSS @font-face rule\n * remain connected to the corresponding CSS, and cannot be deleted.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/delete.\n */\nexport function unloadFontFaceInBrowser( fontFace, removeFrom = 'all' ) {\n\tconst unloadFontFace = ( fonts ) => {\n\t\tfonts.forEach( ( f ) => {\n\t\t\tif (\n\t\t\t\tf.family === formatFontFaceName( fontFace.fontFamily ) &&\n\t\t\t\tf.weight === fontFace.fontWeight &&\n\t\t\t\tf.style === fontFace.fontStyle\n\t\t\t) {\n\t\t\t\tfonts.delete( f );\n\t\t\t}\n\t\t} );\n\t};\n\n\tif ( removeFrom === 'document' || removeFrom === 'all' ) {\n\t\tunloadFontFace( document.fonts );\n\t}\n\n\tif ( removeFrom === 'iframe' || removeFrom === 'all' ) {\n\t\tconst iframeDocument = document.querySelector(\n\t\t\t'iframe[name=\"editor-canvas\"]'\n\t\t).contentDocument;\n\t\tunloadFontFace( iframeDocument.fonts );\n\t}\n}\n\n/**\n * Retrieves the display source from a font face src.\n *\n * @param {string|string[]} input - The font face src.\n * @return {string|undefined} The display source or undefined if the input is invalid.\n */\nexport function getDisplaySrcFromFontFace( input ) {\n\tif ( ! input ) {\n\t\treturn;\n\t}\n\n\tlet src;\n\tif ( Array.isArray( input ) ) {\n\t\tsrc = input[ 0 ];\n\t} else {\n\t\tsrc = input;\n\t}\n\t// It's expected theme fonts will already be loaded in the browser.\n\tif ( src.startsWith( 'file:.' ) ) {\n\t\treturn;\n\t}\n\tif ( ! isUrlEncoded( src ) ) {\n\t\tsrc = encodeURI( src );\n\t}\n\treturn src;\n}\n\nexport function makeFontFamilyFormData( fontFamily ) {\n\tconst formData = new FormData();\n\tconst { kebabCase } = unlock( componentsPrivateApis );\n\n\tconst { fontFace, category, ...familyWithValidParameters } = fontFamily;\n\tconst fontFamilySettings = {\n\t\t...familyWithValidParameters,\n\t\tslug: kebabCase( fontFamily.slug ),\n\t};\n\n\tformData.append(\n\t\t'font_family_settings',\n\t\tJSON.stringify( fontFamilySettings )\n\t);\n\treturn formData;\n}\n\nexport function makeFontFacesFormData( font ) {\n\tif ( font?.fontFace ) {\n\t\tconst fontFacesFormData = font.fontFace.map( ( item, faceIndex ) => {\n\t\t\tconst face = { ...item };\n\t\t\tconst formData = new FormData();\n\t\t\tif ( face.file ) {\n\t\t\t\t// Normalize to an array, since face.file may be a single file or an array of files.\n\t\t\t\tconst files = Array.isArray( face.file )\n\t\t\t\t\t? face.file\n\t\t\t\t\t: [ face.file ];\n\t\t\t\tconst src = [];\n\n\t\t\t\tfiles.forEach( ( file, key ) => {\n\t\t\t\t\t// Slugified file name because the it might contain spaces or characters treated differently on the server.\n\t\t\t\t\tconst fileId = `file-${ faceIndex }-${ key }`;\n\t\t\t\t\t// Add the files to the formData\n\t\t\t\t\tformData.append( fileId, file, file.name );\n\t\t\t\t\tsrc.push( fileId );\n\t\t\t\t} );\n\n\t\t\t\tface.src = src.length === 1 ? src[ 0 ] : src;\n\t\t\t\tdelete face.file;\n\n\t\t\t\tformData.append( 'font_face_settings', JSON.stringify( face ) );\n\t\t\t} else {\n\t\t\t\tformData.append( 'font_face_settings', JSON.stringify( face ) );\n\t\t\t}\n\t\t\treturn formData;\n\t\t} );\n\n\t\treturn fontFacesFormData;\n\t}\n}\n\nexport async function batchInstallFontFaces( fontFamilyId, fontFacesData ) {\n\tconst promises = fontFacesData.map( ( faceData ) =>\n\t\tfetchInstallFontFace( fontFamilyId, faceData )\n\t);\n\tconst responses = await Promise.allSettled( promises );\n\n\tconst results = {\n\t\terrors: [],\n\t\tsuccesses: [],\n\t};\n\n\tresponses.forEach( ( result, index ) => {\n\t\tif ( result.status === 'fulfilled' ) {\n\t\t\tconst response = result.value;\n\t\t\tif ( response.id ) {\n\t\t\t\tresults.successes.push( response );\n\t\t\t} else {\n\t\t\t\tresults.errors.push( {\n\t\t\t\t\tdata: fontFacesData[ index ],\n\t\t\t\t\tmessage: `Error: ${ response.message }`,\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\t\t\t// Handle network errors or other fetch-related errors\n\t\t\tresults.errors.push( {\n\t\t\t\tdata: fontFacesData[ index ],\n\t\t\t\tmessage: result.reason.message,\n\t\t\t} );\n\t\t}\n\t} );\n\n\treturn results;\n}\n\n/*\n * Downloads a font face asset from a URL to the client and returns a File object.\n */\nexport async function downloadFontFaceAssets( src ) {\n\t// Normalize to an array, since `src` could be a string or array.\n\tsrc = Array.isArray( src ) ? src : [ src ];\n\n\tconst files = await Promise.all(\n\t\tsrc.map( async ( url ) => {\n\t\t\treturn fetch( new Request( url ) )\n\t\t\t\t.then( ( response ) => {\n\t\t\t\t\tif ( ! response.ok ) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Error downloading font face asset from ${ url }. Server responded with status: ${ response.status }`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn response.blob();\n\t\t\t\t} )\n\t\t\t\t.then( ( blob ) => {\n\t\t\t\t\tconst filename = url.split( '/' ).pop();\n\t\t\t\t\tconst file = new File( [ blob ], filename, {\n\t\t\t\t\t\ttype: blob.type,\n\t\t\t\t\t} );\n\t\t\t\t\treturn file;\n\t\t\t\t} );\n\t\t} )\n\t);\n\n\t// If we only have one file return it (not the array). Otherwise return all of them in the array.\n\treturn files.length === 1 ? files[ 0 ] : files;\n}\n\n/*\n * Determine if a given Font Face is present in a given collection.\n * We determine that a font face has been installed by comparing the fontWeight and fontStyle\n *\n * @param {Object} fontFace The Font Face to seek\n * @param {Array} collection The Collection to seek in\n * @returns True if the font face is found in the collection. Otherwise False.\n */\nexport function checkFontFaceInstalled( fontFace, collection ) {\n\treturn (\n\t\t-1 !==\n\t\tcollection.findIndex( ( collectionFontFace ) => {\n\t\t\treturn (\n\t\t\t\tcollectionFontFace.fontWeight === fontFace.fontWeight &&\n\t\t\t\tcollectionFontFace.fontStyle === fontFace.fontStyle\n\t\t\t);\n\t\t} )\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -4,27 +4,41 @@
|
|
|
4
4
|
import { useShortcut } from '@wordpress/keyboard-shortcuts';
|
|
5
5
|
import { useDispatch, useSelect } from '@wordpress/data';
|
|
6
6
|
import { store as coreStore } from '@wordpress/core-data';
|
|
7
|
+
import { store as editorStore } from '@wordpress/editor';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Internal dependencies
|
|
10
11
|
*/
|
|
11
12
|
import { store as editSiteStore } from '../../store';
|
|
13
|
+
import { unlock } from '../../lock-unlock';
|
|
12
14
|
function KeyboardShortcutsGlobal() {
|
|
13
15
|
const {
|
|
14
16
|
__experimentalGetDirtyEntityRecords,
|
|
15
17
|
isSavingEntityRecord
|
|
16
18
|
} = useSelect(coreStore);
|
|
19
|
+
const {
|
|
20
|
+
hasNonPostEntityChanges
|
|
21
|
+
} = useSelect(editorStore);
|
|
22
|
+
const {
|
|
23
|
+
getCanvasMode
|
|
24
|
+
} = unlock(useSelect(editSiteStore));
|
|
17
25
|
const {
|
|
18
26
|
setIsSaveViewOpened
|
|
19
27
|
} = useDispatch(editSiteStore);
|
|
20
28
|
useShortcut('core/edit-site/save', event => {
|
|
21
29
|
event.preventDefault();
|
|
22
30
|
const dirtyEntityRecords = __experimentalGetDirtyEntityRecords();
|
|
23
|
-
const
|
|
31
|
+
const hasDirtyEntities = !!dirtyEntityRecords.length;
|
|
24
32
|
const isSaving = dirtyEntityRecords.some(record => isSavingEntityRecord(record.kind, record.name, record.key));
|
|
25
|
-
|
|
26
|
-
|
|
33
|
+
const _hasNonPostEntityChanges = hasNonPostEntityChanges();
|
|
34
|
+
const isViewMode = getCanvasMode() === 'view';
|
|
35
|
+
if ((!hasDirtyEntities || !_hasNonPostEntityChanges || isSaving) && !isViewMode) {
|
|
36
|
+
return;
|
|
27
37
|
}
|
|
38
|
+
// At this point, we know that there are dirty entities, other than
|
|
39
|
+
// the edited post, and we're not in the process of saving, so open
|
|
40
|
+
// save view.
|
|
41
|
+
setIsSaveViewOpened(true);
|
|
28
42
|
});
|
|
29
43
|
return null;
|
|
30
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useShortcut","useDispatch","useSelect","store","coreStore","editSiteStore","KeyboardShortcutsGlobal","__experimentalGetDirtyEntityRecords","isSavingEntityRecord","setIsSaveViewOpened","event","preventDefault","dirtyEntityRecords","
|
|
1
|
+
{"version":3,"names":["useShortcut","useDispatch","useSelect","store","coreStore","editorStore","editSiteStore","unlock","KeyboardShortcutsGlobal","__experimentalGetDirtyEntityRecords","isSavingEntityRecord","hasNonPostEntityChanges","getCanvasMode","setIsSaveViewOpened","event","preventDefault","dirtyEntityRecords","hasDirtyEntities","length","isSaving","some","record","kind","name","key","_hasNonPostEntityChanges","isViewMode"],"sources":["@wordpress/edit-site/src/components/keyboard-shortcuts/global.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useShortcut } from '@wordpress/keyboard-shortcuts';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { store as editorStore } from '@wordpress/editor';\n\n/**\n * Internal dependencies\n */\nimport { store as editSiteStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\nfunction KeyboardShortcutsGlobal() {\n\tconst { __experimentalGetDirtyEntityRecords, isSavingEntityRecord } =\n\t\tuseSelect( coreStore );\n\tconst { hasNonPostEntityChanges } = useSelect( editorStore );\n\tconst { getCanvasMode } = unlock( useSelect( editSiteStore ) );\n\tconst { setIsSaveViewOpened } = useDispatch( editSiteStore );\n\n\tuseShortcut( 'core/edit-site/save', ( event ) => {\n\t\tevent.preventDefault();\n\n\t\tconst dirtyEntityRecords = __experimentalGetDirtyEntityRecords();\n\t\tconst hasDirtyEntities = !! dirtyEntityRecords.length;\n\t\tconst isSaving = dirtyEntityRecords.some( ( record ) =>\n\t\t\tisSavingEntityRecord( record.kind, record.name, record.key )\n\t\t);\n\t\tconst _hasNonPostEntityChanges = hasNonPostEntityChanges();\n\t\tconst isViewMode = getCanvasMode() === 'view';\n\t\tif (\n\t\t\t( ! hasDirtyEntities || ! _hasNonPostEntityChanges || isSaving ) &&\n\t\t\t! isViewMode\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\t// At this point, we know that there are dirty entities, other than\n\t\t// the edited post, and we're not in the process of saving, so open\n\t\t// save view.\n\t\tsetIsSaveViewOpened( true );\n\t} );\n\n\treturn null;\n}\n\nexport default KeyboardShortcutsGlobal;\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,WAAW,QAAQ,+BAA+B;AAC3D,SAASC,WAAW,EAAEC,SAAS,QAAQ,iBAAiB;AACxD,SAASC,KAAK,IAAIC,SAAS,QAAQ,sBAAsB;AACzD,SAASD,KAAK,IAAIE,WAAW,QAAQ,mBAAmB;;AAExD;AACA;AACA;AACA,SAASF,KAAK,IAAIG,aAAa,QAAQ,aAAa;AACpD,SAASC,MAAM,QAAQ,mBAAmB;AAE1C,SAASC,uBAAuBA,CAAA,EAAG;EAClC,MAAM;IAAEC,mCAAmC;IAAEC;EAAqB,CAAC,GAClER,SAAS,CAAEE,SAAU,CAAC;EACvB,MAAM;IAAEO;EAAwB,CAAC,GAAGT,SAAS,CAAEG,WAAY,CAAC;EAC5D,MAAM;IAAEO;EAAc,CAAC,GAAGL,MAAM,CAAEL,SAAS,CAAEI,aAAc,CAAE,CAAC;EAC9D,MAAM;IAAEO;EAAoB,CAAC,GAAGZ,WAAW,CAAEK,aAAc,CAAC;EAE5DN,WAAW,CAAE,qBAAqB,EAAIc,KAAK,IAAM;IAChDA,KAAK,CAACC,cAAc,CAAC,CAAC;IAEtB,MAAMC,kBAAkB,GAAGP,mCAAmC,CAAC,CAAC;IAChE,MAAMQ,gBAAgB,GAAG,CAAC,CAAED,kBAAkB,CAACE,MAAM;IACrD,MAAMC,QAAQ,GAAGH,kBAAkB,CAACI,IAAI,CAAIC,MAAM,IACjDX,oBAAoB,CAAEW,MAAM,CAACC,IAAI,EAAED,MAAM,CAACE,IAAI,EAAEF,MAAM,CAACG,GAAI,CAC5D,CAAC;IACD,MAAMC,wBAAwB,GAAGd,uBAAuB,CAAC,CAAC;IAC1D,MAAMe,UAAU,GAAGd,aAAa,CAAC,CAAC,KAAK,MAAM;IAC7C,IACC,CAAE,CAAEK,gBAAgB,IAAI,CAAEQ,wBAAwB,IAAIN,QAAQ,KAC9D,CAAEO,UAAU,EACX;MACD;IACD;IACA;IACA;IACA;IACAb,mBAAmB,CAAE,IAAK,CAAC;EAC5B,CAAE,CAAC;EAEH,OAAO,IAAI;AACZ;AAEA,eAAeL,uBAAuB"}
|
|
@@ -245,7 +245,8 @@ function ResizableFrame({
|
|
|
245
245
|
onResizeStop: handleResizeStop,
|
|
246
246
|
className: classnames('edit-site-resizable-frame__inner', {
|
|
247
247
|
'is-resizing': isResizing
|
|
248
|
-
})
|
|
248
|
+
}),
|
|
249
|
+
showHandle: false // Do not show the default handle, as we're using a custom one.
|
|
249
250
|
}, createElement(motion.div, {
|
|
250
251
|
className: "edit-site-resizable-frame__inner-content",
|
|
251
252
|
animate: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["classnames","useState","useRef","ResizableBox","Tooltip","__unstableMotion","motion","useInstanceId","useDispatch","useSelect","__","unlock","store","editSiteStore","HANDLE_STYLES_OVERRIDE","position","undefined","userSelect","cursor","width","height","top","right","bottom","left","FRAME_MIN_WIDTH","FRAME_REFERENCE_WIDTH","FRAME_TARGET_ASPECT_RATIO","SNAP_TO_EDIT_CANVAS_MODE_THRESHOLD","INITIAL_FRAME_SIZE","calculateNewHeight","initialAspectRatio","lerp","a","b","amount","lerpFactor","Math","max","min","intermediateAspectRatio","ResizableFrame","isFullWidth","isOversized","setIsOversized","isReady","children","defaultSize","innerContentStyle","frameSize","setFrameSize","startingWidth","setStartingWidth","isResizing","setIsResizing","shouldShowHandle","setShouldShowHandle","resizeRatio","setResizeRatio","canvasMode","select","getCanvasMode","setCanvasMode","FRAME_TRANSITION","type","duration","frameRef","resizableHandleHelpId","defaultAspectRatio","handleResizeStart","_event","_direction","ref","offsetWidth","handleResize","_ref","delta","normalizedDelta","deltaAbs","abs","maxDoubledDelta","deltaToDouble","doubleSegment","singleSegment","updatedWidth","handleResizeStop","remainingWidth","ownerDocument","documentElement","handleResizableHandleKeyDown","event","includes","key","preventDefault","step","shiftKey","newWidth","current","resizable","frameAnimationVariants","default","flexGrow","fullWidth","resizeHandleVariants","hidden","opacity","visible","active","scaleY","currentResizeHandleVariant","createElement","as","div","initial","variants","animate","onAnimationComplete","definition","transition","size","enable","topRight","bottomRight","bottomLeft","topLeft","handleClasses","handleStyles","minWidth","maxWidth","maxHeight","onFocus","onBlur","onMouseOver","onMouseOut","handleComponent","Fragment","text","button","role","className","onKeyDown","exit","whileFocus","whileHover","id","onResizeStart","onResize","onResizeStop","borderRadius","style"],"sources":["@wordpress/edit-site/src/components/resizable-frame/index.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { useState, useRef } from '@wordpress/element';\nimport {\n\tResizableBox,\n\tTooltip,\n\t__unstableMotion as motion,\n} from '@wordpress/components';\nimport { useInstanceId } from '@wordpress/compose';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\nimport { store as editSiteStore } from '../../store';\n\n// Removes the inline styles in the drag handles.\nconst HANDLE_STYLES_OVERRIDE = {\n\tposition: undefined,\n\tuserSelect: undefined,\n\tcursor: undefined,\n\twidth: undefined,\n\theight: undefined,\n\ttop: undefined,\n\tright: undefined,\n\tbottom: undefined,\n\tleft: undefined,\n};\n\n// The minimum width of the frame (in px) while resizing.\nconst FRAME_MIN_WIDTH = 320;\n// The reference width of the frame (in px) used to calculate the aspect ratio.\nconst FRAME_REFERENCE_WIDTH = 1300;\n// 9 : 19.5 is the target aspect ratio enforced (when possible) while resizing.\nconst FRAME_TARGET_ASPECT_RATIO = 9 / 19.5;\n// The minimum distance (in px) between the frame resize handle and the\n// viewport's edge. If the frame is resized to be closer to the viewport's edge\n// than this distance, then \"canvas mode\" will be enabled.\nconst SNAP_TO_EDIT_CANVAS_MODE_THRESHOLD = 200;\n// Default size for the `frameSize` state.\nconst INITIAL_FRAME_SIZE = { width: '100%', height: '100%' };\n\nfunction calculateNewHeight( width, initialAspectRatio ) {\n\tconst lerp = ( a, b, amount ) => {\n\t\treturn a + ( b - a ) * amount;\n\t};\n\n\t// Calculate the intermediate aspect ratio based on the current width.\n\tconst lerpFactor =\n\t\t1 -\n\t\tMath.max(\n\t\t\t0,\n\t\t\tMath.min(\n\t\t\t\t1,\n\t\t\t\t( width - FRAME_MIN_WIDTH ) /\n\t\t\t\t\t( FRAME_REFERENCE_WIDTH - FRAME_MIN_WIDTH )\n\t\t\t)\n\t\t);\n\n\t// Calculate the height based on the intermediate aspect ratio\n\t// ensuring the frame arrives at the target aspect ratio.\n\tconst intermediateAspectRatio = lerp(\n\t\tinitialAspectRatio,\n\t\tFRAME_TARGET_ASPECT_RATIO,\n\t\tlerpFactor\n\t);\n\n\treturn width / intermediateAspectRatio;\n}\n\nfunction ResizableFrame( {\n\tisFullWidth,\n\tisOversized,\n\tsetIsOversized,\n\tisReady,\n\tchildren,\n\t/** The default (unresized) width/height of the frame, based on the space availalbe in the viewport. */\n\tdefaultSize,\n\tinnerContentStyle,\n} ) {\n\tconst [ frameSize, setFrameSize ] = useState( INITIAL_FRAME_SIZE );\n\t// The width of the resizable frame when a new resize gesture starts.\n\tconst [ startingWidth, setStartingWidth ] = useState();\n\tconst [ isResizing, setIsResizing ] = useState( false );\n\tconst [ shouldShowHandle, setShouldShowHandle ] = useState( false );\n\tconst [ resizeRatio, setResizeRatio ] = useState( 1 );\n\tconst canvasMode = useSelect(\n\t\t( select ) => unlock( select( editSiteStore ) ).getCanvasMode(),\n\t\t[]\n\t);\n\tconst { setCanvasMode } = unlock( useDispatch( editSiteStore ) );\n\tconst FRAME_TRANSITION = { type: 'tween', duration: isResizing ? 0 : 0.5 };\n\tconst frameRef = useRef( null );\n\tconst resizableHandleHelpId = useInstanceId(\n\t\tResizableFrame,\n\t\t'edit-site-resizable-frame-handle-help'\n\t);\n\tconst defaultAspectRatio = defaultSize.width / defaultSize.height;\n\n\tconst handleResizeStart = ( _event, _direction, ref ) => {\n\t\t// Remember the starting width so we don't have to get `ref.offsetWidth` on\n\t\t// every resize event thereafter, which will cause layout thrashing.\n\t\tsetStartingWidth( ref.offsetWidth );\n\t\tsetIsResizing( true );\n\t};\n\n\t// Calculate the frame size based on the window width as its resized.\n\tconst handleResize = ( _event, _direction, _ref, delta ) => {\n\t\tconst normalizedDelta = delta.width / resizeRatio;\n\t\tconst deltaAbs = Math.abs( normalizedDelta );\n\t\tconst maxDoubledDelta =\n\t\t\tdelta.width < 0 // is shrinking\n\t\t\t\t? deltaAbs\n\t\t\t\t: ( defaultSize.width - startingWidth ) / 2;\n\t\tconst deltaToDouble = Math.min( deltaAbs, maxDoubledDelta );\n\t\tconst doubleSegment = deltaAbs === 0 ? 0 : deltaToDouble / deltaAbs;\n\t\tconst singleSegment = 1 - doubleSegment;\n\n\t\tsetResizeRatio( singleSegment + doubleSegment * 2 );\n\n\t\tconst updatedWidth = startingWidth + delta.width;\n\n\t\tsetIsOversized( updatedWidth > defaultSize.width );\n\n\t\t// Width will be controlled by the library (via `resizeRatio`),\n\t\t// so we only need to update the height.\n\t\tsetFrameSize( {\n\t\t\theight: isOversized\n\t\t\t\t? '100%'\n\t\t\t\t: calculateNewHeight( updatedWidth, defaultAspectRatio ),\n\t\t} );\n\t};\n\n\tconst handleResizeStop = ( _event, _direction, ref ) => {\n\t\tsetIsResizing( false );\n\n\t\tif ( ! isOversized ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsOversized( false );\n\n\t\tconst remainingWidth =\n\t\t\tref.ownerDocument.documentElement.offsetWidth - ref.offsetWidth;\n\n\t\tif ( remainingWidth > SNAP_TO_EDIT_CANVAS_MODE_THRESHOLD ) {\n\t\t\t// Reset the initial aspect ratio if the frame is resized slightly\n\t\t\t// above the sidebar but not far enough to trigger full screen.\n\t\t\tsetFrameSize( INITIAL_FRAME_SIZE );\n\t\t} else {\n\t\t\t// Trigger full screen if the frame is resized far enough to the left.\n\t\t\tsetCanvasMode( 'edit' );\n\t\t}\n\t};\n\n\t// Handle resize by arrow keys\n\tconst handleResizableHandleKeyDown = ( event ) => {\n\t\tif ( ! [ 'ArrowLeft', 'ArrowRight' ].includes( event.key ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tconst step = 20 * ( event.shiftKey ? 5 : 1 );\n\t\tconst delta = step * ( event.key === 'ArrowLeft' ? 1 : -1 );\n\t\tconst newWidth = Math.min(\n\t\t\tMath.max(\n\t\t\t\tFRAME_MIN_WIDTH,\n\t\t\t\tframeRef.current.resizable.offsetWidth + delta\n\t\t\t),\n\t\t\tdefaultSize.width\n\t\t);\n\n\t\tsetFrameSize( {\n\t\t\twidth: newWidth,\n\t\t\theight: calculateNewHeight( newWidth, defaultAspectRatio ),\n\t\t} );\n\t};\n\n\tconst frameAnimationVariants = {\n\t\tdefault: {\n\t\t\tflexGrow: 0,\n\t\t\theight: frameSize.height,\n\t\t},\n\t\tfullWidth: {\n\t\t\tflexGrow: 1,\n\t\t\theight: frameSize.height,\n\t\t},\n\t};\n\n\tconst resizeHandleVariants = {\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t\tleft: 0,\n\t\t},\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\tleft: -16,\n\t\t},\n\t\tactive: {\n\t\t\topacity: 1,\n\t\t\tleft: -16,\n\t\t\tscaleY: 1.3,\n\t\t},\n\t};\n\tconst currentResizeHandleVariant = ( () => {\n\t\tif ( isResizing ) {\n\t\t\treturn 'active';\n\t\t}\n\t\treturn shouldShowHandle ? 'visible' : 'hidden';\n\t} )();\n\n\treturn (\n\t\t<ResizableBox\n\t\t\tas={ motion.div }\n\t\t\tref={ frameRef }\n\t\t\tinitial={ false }\n\t\t\tvariants={ frameAnimationVariants }\n\t\t\tanimate={ isFullWidth ? 'fullWidth' : 'default' }\n\t\t\tonAnimationComplete={ ( definition ) => {\n\t\t\t\tif ( definition === 'fullWidth' )\n\t\t\t\t\tsetFrameSize( { width: '100%', height: '100%' } );\n\t\t\t} }\n\t\t\ttransition={ FRAME_TRANSITION }\n\t\t\tsize={ frameSize }\n\t\t\tenable={ {\n\t\t\t\ttop: false,\n\t\t\t\tright: false,\n\t\t\t\tbottom: false,\n\t\t\t\t// Resizing will be disabled until the editor content is loaded.\n\t\t\t\tleft: isReady,\n\t\t\t\ttopRight: false,\n\t\t\t\tbottomRight: false,\n\t\t\t\tbottomLeft: false,\n\t\t\t\ttopLeft: false,\n\t\t\t} }\n\t\t\tresizeRatio={ resizeRatio }\n\t\t\thandleClasses={ undefined }\n\t\t\thandleStyles={ {\n\t\t\t\tleft: HANDLE_STYLES_OVERRIDE,\n\t\t\t\tright: HANDLE_STYLES_OVERRIDE,\n\t\t\t} }\n\t\t\tminWidth={ FRAME_MIN_WIDTH }\n\t\t\tmaxWidth={ isFullWidth ? '100%' : '150%' }\n\t\t\tmaxHeight={ '100%' }\n\t\t\tonFocus={ () => setShouldShowHandle( true ) }\n\t\t\tonBlur={ () => setShouldShowHandle( false ) }\n\t\t\tonMouseOver={ () => setShouldShowHandle( true ) }\n\t\t\tonMouseOut={ () => setShouldShowHandle( false ) }\n\t\t\thandleComponent={ {\n\t\t\t\tleft: canvasMode === 'view' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Tooltip text={ __( 'Drag to resize' ) }>\n\t\t\t\t\t\t\t{ /* Disable reason: role=\"separator\" does in fact support aria-valuenow */ }\n\t\t\t\t\t\t\t{ /* eslint-disable-next-line jsx-a11y/role-supports-aria-props */ }\n\t\t\t\t\t\t\t<motion.button\n\t\t\t\t\t\t\t\tkey=\"handle\"\n\t\t\t\t\t\t\t\trole=\"separator\"\n\t\t\t\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\t\t\t\tclassName={ classnames(\n\t\t\t\t\t\t\t\t\t'edit-site-resizable-frame__handle',\n\t\t\t\t\t\t\t\t\t{ 'is-resizing': isResizing }\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\tvariants={ resizeHandleVariants }\n\t\t\t\t\t\t\t\tanimate={ currentResizeHandleVariant }\n\t\t\t\t\t\t\t\taria-label={ __( 'Drag to resize' ) }\n\t\t\t\t\t\t\t\taria-describedby={ resizableHandleHelpId }\n\t\t\t\t\t\t\t\taria-valuenow={\n\t\t\t\t\t\t\t\t\tframeRef.current?.resizable?.offsetWidth ||\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taria-valuemin={ FRAME_MIN_WIDTH }\n\t\t\t\t\t\t\t\taria-valuemax={ defaultSize.width }\n\t\t\t\t\t\t\t\tonKeyDown={ handleResizableHandleKeyDown }\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\texit=\"hidden\"\n\t\t\t\t\t\t\t\twhileFocus=\"active\"\n\t\t\t\t\t\t\t\twhileHover=\"active\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<div hidden id={ resizableHandleHelpId }>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Use left and right arrow keys to resize the canvas. Hold shift to resize in larger increments.'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t} }\n\t\t\tonResizeStart={ handleResizeStart }\n\t\t\tonResize={ handleResize }\n\t\t\tonResizeStop={ handleResizeStop }\n\t\t\tclassName={ classnames( 'edit-site-resizable-frame__inner', {\n\t\t\t\t'is-resizing': isResizing,\n\t\t\t} ) }\n\t\t>\n\t\t\t<motion.div\n\t\t\t\tclassName=\"edit-site-resizable-frame__inner-content\"\n\t\t\t\tanimate={ {\n\t\t\t\t\tborderRadius: isFullWidth ? 0 : 8,\n\t\t\t\t} }\n\t\t\t\ttransition={ FRAME_TRANSITION }\n\t\t\t\tstyle={ innerContentStyle }\n\t\t\t>\n\t\t\t\t{ children }\n\t\t\t</motion.div>\n\t\t</ResizableBox>\n\t);\n}\n\nexport default ResizableFrame;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["classnames","useState","useRef","ResizableBox","Tooltip","__unstableMotion","motion","useInstanceId","useDispatch","useSelect","__","unlock","store","editSiteStore","HANDLE_STYLES_OVERRIDE","position","undefined","userSelect","cursor","width","height","top","right","bottom","left","FRAME_MIN_WIDTH","FRAME_REFERENCE_WIDTH","FRAME_TARGET_ASPECT_RATIO","SNAP_TO_EDIT_CANVAS_MODE_THRESHOLD","INITIAL_FRAME_SIZE","calculateNewHeight","initialAspectRatio","lerp","a","b","amount","lerpFactor","Math","max","min","intermediateAspectRatio","ResizableFrame","isFullWidth","isOversized","setIsOversized","isReady","children","defaultSize","innerContentStyle","frameSize","setFrameSize","startingWidth","setStartingWidth","isResizing","setIsResizing","shouldShowHandle","setShouldShowHandle","resizeRatio","setResizeRatio","canvasMode","select","getCanvasMode","setCanvasMode","FRAME_TRANSITION","type","duration","frameRef","resizableHandleHelpId","defaultAspectRatio","handleResizeStart","_event","_direction","ref","offsetWidth","handleResize","_ref","delta","normalizedDelta","deltaAbs","abs","maxDoubledDelta","deltaToDouble","doubleSegment","singleSegment","updatedWidth","handleResizeStop","remainingWidth","ownerDocument","documentElement","handleResizableHandleKeyDown","event","includes","key","preventDefault","step","shiftKey","newWidth","current","resizable","frameAnimationVariants","default","flexGrow","fullWidth","resizeHandleVariants","hidden","opacity","visible","active","scaleY","currentResizeHandleVariant","createElement","as","div","initial","variants","animate","onAnimationComplete","definition","transition","size","enable","topRight","bottomRight","bottomLeft","topLeft","handleClasses","handleStyles","minWidth","maxWidth","maxHeight","onFocus","onBlur","onMouseOver","onMouseOut","handleComponent","Fragment","text","button","role","className","onKeyDown","exit","whileFocus","whileHover","id","onResizeStart","onResize","onResizeStop","showHandle","borderRadius","style"],"sources":["@wordpress/edit-site/src/components/resizable-frame/index.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { useState, useRef } from '@wordpress/element';\nimport {\n\tResizableBox,\n\tTooltip,\n\t__unstableMotion as motion,\n} from '@wordpress/components';\nimport { useInstanceId } from '@wordpress/compose';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\nimport { store as editSiteStore } from '../../store';\n\n// Removes the inline styles in the drag handles.\nconst HANDLE_STYLES_OVERRIDE = {\n\tposition: undefined,\n\tuserSelect: undefined,\n\tcursor: undefined,\n\twidth: undefined,\n\theight: undefined,\n\ttop: undefined,\n\tright: undefined,\n\tbottom: undefined,\n\tleft: undefined,\n};\n\n// The minimum width of the frame (in px) while resizing.\nconst FRAME_MIN_WIDTH = 320;\n// The reference width of the frame (in px) used to calculate the aspect ratio.\nconst FRAME_REFERENCE_WIDTH = 1300;\n// 9 : 19.5 is the target aspect ratio enforced (when possible) while resizing.\nconst FRAME_TARGET_ASPECT_RATIO = 9 / 19.5;\n// The minimum distance (in px) between the frame resize handle and the\n// viewport's edge. If the frame is resized to be closer to the viewport's edge\n// than this distance, then \"canvas mode\" will be enabled.\nconst SNAP_TO_EDIT_CANVAS_MODE_THRESHOLD = 200;\n// Default size for the `frameSize` state.\nconst INITIAL_FRAME_SIZE = { width: '100%', height: '100%' };\n\nfunction calculateNewHeight( width, initialAspectRatio ) {\n\tconst lerp = ( a, b, amount ) => {\n\t\treturn a + ( b - a ) * amount;\n\t};\n\n\t// Calculate the intermediate aspect ratio based on the current width.\n\tconst lerpFactor =\n\t\t1 -\n\t\tMath.max(\n\t\t\t0,\n\t\t\tMath.min(\n\t\t\t\t1,\n\t\t\t\t( width - FRAME_MIN_WIDTH ) /\n\t\t\t\t\t( FRAME_REFERENCE_WIDTH - FRAME_MIN_WIDTH )\n\t\t\t)\n\t\t);\n\n\t// Calculate the height based on the intermediate aspect ratio\n\t// ensuring the frame arrives at the target aspect ratio.\n\tconst intermediateAspectRatio = lerp(\n\t\tinitialAspectRatio,\n\t\tFRAME_TARGET_ASPECT_RATIO,\n\t\tlerpFactor\n\t);\n\n\treturn width / intermediateAspectRatio;\n}\n\nfunction ResizableFrame( {\n\tisFullWidth,\n\tisOversized,\n\tsetIsOversized,\n\tisReady,\n\tchildren,\n\t/** The default (unresized) width/height of the frame, based on the space availalbe in the viewport. */\n\tdefaultSize,\n\tinnerContentStyle,\n} ) {\n\tconst [ frameSize, setFrameSize ] = useState( INITIAL_FRAME_SIZE );\n\t// The width of the resizable frame when a new resize gesture starts.\n\tconst [ startingWidth, setStartingWidth ] = useState();\n\tconst [ isResizing, setIsResizing ] = useState( false );\n\tconst [ shouldShowHandle, setShouldShowHandle ] = useState( false );\n\tconst [ resizeRatio, setResizeRatio ] = useState( 1 );\n\tconst canvasMode = useSelect(\n\t\t( select ) => unlock( select( editSiteStore ) ).getCanvasMode(),\n\t\t[]\n\t);\n\tconst { setCanvasMode } = unlock( useDispatch( editSiteStore ) );\n\tconst FRAME_TRANSITION = { type: 'tween', duration: isResizing ? 0 : 0.5 };\n\tconst frameRef = useRef( null );\n\tconst resizableHandleHelpId = useInstanceId(\n\t\tResizableFrame,\n\t\t'edit-site-resizable-frame-handle-help'\n\t);\n\tconst defaultAspectRatio = defaultSize.width / defaultSize.height;\n\n\tconst handleResizeStart = ( _event, _direction, ref ) => {\n\t\t// Remember the starting width so we don't have to get `ref.offsetWidth` on\n\t\t// every resize event thereafter, which will cause layout thrashing.\n\t\tsetStartingWidth( ref.offsetWidth );\n\t\tsetIsResizing( true );\n\t};\n\n\t// Calculate the frame size based on the window width as its resized.\n\tconst handleResize = ( _event, _direction, _ref, delta ) => {\n\t\tconst normalizedDelta = delta.width / resizeRatio;\n\t\tconst deltaAbs = Math.abs( normalizedDelta );\n\t\tconst maxDoubledDelta =\n\t\t\tdelta.width < 0 // is shrinking\n\t\t\t\t? deltaAbs\n\t\t\t\t: ( defaultSize.width - startingWidth ) / 2;\n\t\tconst deltaToDouble = Math.min( deltaAbs, maxDoubledDelta );\n\t\tconst doubleSegment = deltaAbs === 0 ? 0 : deltaToDouble / deltaAbs;\n\t\tconst singleSegment = 1 - doubleSegment;\n\n\t\tsetResizeRatio( singleSegment + doubleSegment * 2 );\n\n\t\tconst updatedWidth = startingWidth + delta.width;\n\n\t\tsetIsOversized( updatedWidth > defaultSize.width );\n\n\t\t// Width will be controlled by the library (via `resizeRatio`),\n\t\t// so we only need to update the height.\n\t\tsetFrameSize( {\n\t\t\theight: isOversized\n\t\t\t\t? '100%'\n\t\t\t\t: calculateNewHeight( updatedWidth, defaultAspectRatio ),\n\t\t} );\n\t};\n\n\tconst handleResizeStop = ( _event, _direction, ref ) => {\n\t\tsetIsResizing( false );\n\n\t\tif ( ! isOversized ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsOversized( false );\n\n\t\tconst remainingWidth =\n\t\t\tref.ownerDocument.documentElement.offsetWidth - ref.offsetWidth;\n\n\t\tif ( remainingWidth > SNAP_TO_EDIT_CANVAS_MODE_THRESHOLD ) {\n\t\t\t// Reset the initial aspect ratio if the frame is resized slightly\n\t\t\t// above the sidebar but not far enough to trigger full screen.\n\t\t\tsetFrameSize( INITIAL_FRAME_SIZE );\n\t\t} else {\n\t\t\t// Trigger full screen if the frame is resized far enough to the left.\n\t\t\tsetCanvasMode( 'edit' );\n\t\t}\n\t};\n\n\t// Handle resize by arrow keys\n\tconst handleResizableHandleKeyDown = ( event ) => {\n\t\tif ( ! [ 'ArrowLeft', 'ArrowRight' ].includes( event.key ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tconst step = 20 * ( event.shiftKey ? 5 : 1 );\n\t\tconst delta = step * ( event.key === 'ArrowLeft' ? 1 : -1 );\n\t\tconst newWidth = Math.min(\n\t\t\tMath.max(\n\t\t\t\tFRAME_MIN_WIDTH,\n\t\t\t\tframeRef.current.resizable.offsetWidth + delta\n\t\t\t),\n\t\t\tdefaultSize.width\n\t\t);\n\n\t\tsetFrameSize( {\n\t\t\twidth: newWidth,\n\t\t\theight: calculateNewHeight( newWidth, defaultAspectRatio ),\n\t\t} );\n\t};\n\n\tconst frameAnimationVariants = {\n\t\tdefault: {\n\t\t\tflexGrow: 0,\n\t\t\theight: frameSize.height,\n\t\t},\n\t\tfullWidth: {\n\t\t\tflexGrow: 1,\n\t\t\theight: frameSize.height,\n\t\t},\n\t};\n\n\tconst resizeHandleVariants = {\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t\tleft: 0,\n\t\t},\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\tleft: -16,\n\t\t},\n\t\tactive: {\n\t\t\topacity: 1,\n\t\t\tleft: -16,\n\t\t\tscaleY: 1.3,\n\t\t},\n\t};\n\tconst currentResizeHandleVariant = ( () => {\n\t\tif ( isResizing ) {\n\t\t\treturn 'active';\n\t\t}\n\t\treturn shouldShowHandle ? 'visible' : 'hidden';\n\t} )();\n\n\treturn (\n\t\t<ResizableBox\n\t\t\tas={ motion.div }\n\t\t\tref={ frameRef }\n\t\t\tinitial={ false }\n\t\t\tvariants={ frameAnimationVariants }\n\t\t\tanimate={ isFullWidth ? 'fullWidth' : 'default' }\n\t\t\tonAnimationComplete={ ( definition ) => {\n\t\t\t\tif ( definition === 'fullWidth' )\n\t\t\t\t\tsetFrameSize( { width: '100%', height: '100%' } );\n\t\t\t} }\n\t\t\ttransition={ FRAME_TRANSITION }\n\t\t\tsize={ frameSize }\n\t\t\tenable={ {\n\t\t\t\ttop: false,\n\t\t\t\tright: false,\n\t\t\t\tbottom: false,\n\t\t\t\t// Resizing will be disabled until the editor content is loaded.\n\t\t\t\tleft: isReady,\n\t\t\t\ttopRight: false,\n\t\t\t\tbottomRight: false,\n\t\t\t\tbottomLeft: false,\n\t\t\t\ttopLeft: false,\n\t\t\t} }\n\t\t\tresizeRatio={ resizeRatio }\n\t\t\thandleClasses={ undefined }\n\t\t\thandleStyles={ {\n\t\t\t\tleft: HANDLE_STYLES_OVERRIDE,\n\t\t\t\tright: HANDLE_STYLES_OVERRIDE,\n\t\t\t} }\n\t\t\tminWidth={ FRAME_MIN_WIDTH }\n\t\t\tmaxWidth={ isFullWidth ? '100%' : '150%' }\n\t\t\tmaxHeight={ '100%' }\n\t\t\tonFocus={ () => setShouldShowHandle( true ) }\n\t\t\tonBlur={ () => setShouldShowHandle( false ) }\n\t\t\tonMouseOver={ () => setShouldShowHandle( true ) }\n\t\t\tonMouseOut={ () => setShouldShowHandle( false ) }\n\t\t\thandleComponent={ {\n\t\t\t\tleft: canvasMode === 'view' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Tooltip text={ __( 'Drag to resize' ) }>\n\t\t\t\t\t\t\t{ /* Disable reason: role=\"separator\" does in fact support aria-valuenow */ }\n\t\t\t\t\t\t\t{ /* eslint-disable-next-line jsx-a11y/role-supports-aria-props */ }\n\t\t\t\t\t\t\t<motion.button\n\t\t\t\t\t\t\t\tkey=\"handle\"\n\t\t\t\t\t\t\t\trole=\"separator\"\n\t\t\t\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\t\t\t\tclassName={ classnames(\n\t\t\t\t\t\t\t\t\t'edit-site-resizable-frame__handle',\n\t\t\t\t\t\t\t\t\t{ 'is-resizing': isResizing }\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\tvariants={ resizeHandleVariants }\n\t\t\t\t\t\t\t\tanimate={ currentResizeHandleVariant }\n\t\t\t\t\t\t\t\taria-label={ __( 'Drag to resize' ) }\n\t\t\t\t\t\t\t\taria-describedby={ resizableHandleHelpId }\n\t\t\t\t\t\t\t\taria-valuenow={\n\t\t\t\t\t\t\t\t\tframeRef.current?.resizable?.offsetWidth ||\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taria-valuemin={ FRAME_MIN_WIDTH }\n\t\t\t\t\t\t\t\taria-valuemax={ defaultSize.width }\n\t\t\t\t\t\t\t\tonKeyDown={ handleResizableHandleKeyDown }\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\texit=\"hidden\"\n\t\t\t\t\t\t\t\twhileFocus=\"active\"\n\t\t\t\t\t\t\t\twhileHover=\"active\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<div hidden id={ resizableHandleHelpId }>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Use left and right arrow keys to resize the canvas. Hold shift to resize in larger increments.'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t} }\n\t\t\tonResizeStart={ handleResizeStart }\n\t\t\tonResize={ handleResize }\n\t\t\tonResizeStop={ handleResizeStop }\n\t\t\tclassName={ classnames( 'edit-site-resizable-frame__inner', {\n\t\t\t\t'is-resizing': isResizing,\n\t\t\t} ) }\n\t\t\tshowHandle={ false } // Do not show the default handle, as we're using a custom one.\n\t\t>\n\t\t\t<motion.div\n\t\t\t\tclassName=\"edit-site-resizable-frame__inner-content\"\n\t\t\t\tanimate={ {\n\t\t\t\t\tborderRadius: isFullWidth ? 0 : 8,\n\t\t\t\t} }\n\t\t\t\ttransition={ FRAME_TRANSITION }\n\t\t\t\tstyle={ innerContentStyle }\n\t\t\t>\n\t\t\t\t{ children }\n\t\t\t</motion.div>\n\t\t</ResizableBox>\n\t);\n}\n\nexport default ResizableFrame;\n"],"mappings":"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"}
|
|
@@ -96,6 +96,7 @@
|
|
|
96
96
|
--wp-admin-border-width-focus: 2px;
|
|
97
97
|
--wp-block-synced-color: #7a00df;
|
|
98
98
|
--wp-block-synced-color--rgb: 122, 0, 223;
|
|
99
|
+
--wp-bound-block-color: #9747ff;
|
|
99
100
|
}
|
|
100
101
|
@media (min-resolution: 192dpi) {
|
|
101
102
|
:root {
|
|
@@ -494,12 +495,13 @@ body.is-fullscreen-mode .interface-interface-skeleton {
|
|
|
494
495
|
box-sizing: border-box;
|
|
495
496
|
scroll-padding-bottom: 64px;
|
|
496
497
|
}
|
|
497
|
-
.dataviews-wrapper > div {
|
|
498
|
-
min-height: 100%;
|
|
499
|
-
}
|
|
500
498
|
|
|
501
499
|
.dataviews-filters__view-actions {
|
|
502
500
|
padding: 12px 32px 0;
|
|
501
|
+
margin-bottom: 12px;
|
|
502
|
+
flex-shrink: 0;
|
|
503
|
+
position: sticky;
|
|
504
|
+
right: 0;
|
|
503
505
|
}
|
|
504
506
|
.dataviews-filters__view-actions .components-search-control .components-base-control__field {
|
|
505
507
|
max-width: 240px;
|
|
@@ -514,15 +516,14 @@ body.is-fullscreen-mode .interface-interface-skeleton {
|
|
|
514
516
|
}
|
|
515
517
|
|
|
516
518
|
.dataviews-pagination {
|
|
517
|
-
margin-top: auto;
|
|
518
519
|
position: sticky;
|
|
519
520
|
bottom: 0;
|
|
520
|
-
|
|
521
|
-
-
|
|
522
|
-
backdrop-filter: blur(6px);
|
|
521
|
+
right: 0;
|
|
522
|
+
background-color: #fff;
|
|
523
523
|
padding: 12px 32px;
|
|
524
524
|
border-top: 1px solid #f0f0f0;
|
|
525
525
|
color: #757575;
|
|
526
|
+
flex-shrink: 0;
|
|
526
527
|
}
|
|
527
528
|
|
|
528
529
|
.dataviews-pagination__page-selection {
|
|
@@ -618,17 +619,19 @@ body.is-fullscreen-mode .interface-interface-skeleton {
|
|
|
618
619
|
.dataviews-view-table tr.is-selected:hover {
|
|
619
620
|
background-color: rgba(var(--wp-admin-theme-color--rgb), 0.08);
|
|
620
621
|
}
|
|
622
|
+
.dataviews-view-table thead {
|
|
623
|
+
position: sticky;
|
|
624
|
+
inset-block-start: 0;
|
|
625
|
+
z-index: 1;
|
|
626
|
+
}
|
|
621
627
|
.dataviews-view-table thead tr {
|
|
622
628
|
border: 0;
|
|
623
629
|
}
|
|
624
630
|
.dataviews-view-table thead th {
|
|
625
|
-
position: sticky;
|
|
626
|
-
top: -1px;
|
|
627
631
|
background-color: #fff;
|
|
628
632
|
box-shadow: inset 0 -1px 0 #f0f0f0;
|
|
629
633
|
padding-top: 8px;
|
|
630
634
|
padding-bottom: 8px;
|
|
631
|
-
z-index: 1;
|
|
632
635
|
font-size: 11px;
|
|
633
636
|
text-transform: uppercase;
|
|
634
637
|
font-weight: 500;
|
|
@@ -678,7 +681,6 @@ body.is-fullscreen-mode .interface-interface-skeleton {
|
|
|
678
681
|
color: #1e1e1e;
|
|
679
682
|
text-overflow: ellipsis;
|
|
680
683
|
white-space: nowrap;
|
|
681
|
-
overflow: hidden;
|
|
682
684
|
display: block;
|
|
683
685
|
width: 100%;
|
|
684
686
|
}
|
|
@@ -698,6 +700,13 @@ body.is-fullscreen-mode .interface-interface-skeleton {
|
|
|
698
700
|
.dataviews-view-table__primary-field a:hover {
|
|
699
701
|
color: #1e1e1e;
|
|
700
702
|
}
|
|
703
|
+
.dataviews-view-list__primary-field a:focus,
|
|
704
|
+
.dataviews-view-grid__primary-field a:focus,
|
|
705
|
+
.dataviews-view-table__primary-field a:focus {
|
|
706
|
+
color: var(--wp-admin-theme-color--rgb);
|
|
707
|
+
box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color, #007cba);
|
|
708
|
+
border-radius: 2px;
|
|
709
|
+
}
|
|
701
710
|
.dataviews-view-list__primary-field button.components-button.is-link,
|
|
702
711
|
.dataviews-view-grid__primary-field button.components-button.is-link,
|
|
703
712
|
.dataviews-view-table__primary-field button.components-button.is-link {
|