@secretstache/wordpress-gutenberg 0.1.2 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- package/build/index.css +97 -0
- package/build/index.js +9 -1
- package/build/index.js.map +1 -1
- package/package.json +15 -6
- package/.editorconfig +0 -18
- package/rollup.config.js +0 -40
- package/src/components/ColorPaletteControl.js +0 -16
- package/src/components/IconPicker.js +0 -73
- package/src/components/ImageActions.js +0 -59
- package/src/components/LinkControl.js +0 -31
- package/src/components/MediaPicker.js +0 -130
- package/src/components/PreviewToggle.js +0 -23
- package/src/index.js +0 -8
- package/src/utils/index.js +0 -269
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@secretstache/wordpress-gutenberg",
|
3
|
-
"version": "0.1
|
3
|
+
"version": "0.2.1",
|
4
4
|
"description": "",
|
5
5
|
"author": "Secret Stache",
|
6
6
|
"license": "GPL-2.0-or-later",
|
@@ -12,6 +12,10 @@
|
|
12
12
|
"node": ">=20"
|
13
13
|
},
|
14
14
|
"main": "build/index.js",
|
15
|
+
"module": "build/index.es.js",
|
16
|
+
"files": [
|
17
|
+
"build"
|
18
|
+
],
|
15
19
|
"type": "module",
|
16
20
|
"scripts": {
|
17
21
|
"build": "rollup -c",
|
@@ -30,16 +34,23 @@
|
|
30
34
|
"@rollup/plugin-terser": "^0.4.4",
|
31
35
|
"@wordpress/api-fetch": "^6.52.0",
|
32
36
|
"@wordpress/block-editor": "^12.22.0",
|
37
|
+
"@wordpress/blocks": "^12.34.0",
|
33
38
|
"@wordpress/components": "^27.2.0",
|
34
39
|
"@wordpress/data": "^9.24.0",
|
35
40
|
"@wordpress/element": "^5.32.0",
|
41
|
+
"@wordpress/hooks": "^3.57.0",
|
36
42
|
"@wordpress/icons": "^9.45.0",
|
37
43
|
"babel-core": "^6.26.3",
|
38
44
|
"babel-loader": "^9.1.3",
|
45
|
+
"node-sass": "^9.0.0",
|
46
|
+
"postcss": "^8.4.38",
|
39
47
|
"rollup": "^4.16.4",
|
40
|
-
"rollup-plugin-peer-deps-external": "^2.2.4"
|
48
|
+
"rollup-plugin-peer-deps-external": "^2.2.4",
|
49
|
+
"rollup-plugin-postcss": "^4.0.2"
|
41
50
|
},
|
42
51
|
"dependencies": {
|
52
|
+
"react-select": "5.7.5",
|
53
|
+
"react-sortable-hoc": "2.0.0",
|
43
54
|
"slugify": "^1.6.6"
|
44
55
|
},
|
45
56
|
"peerDependencies": {
|
@@ -49,6 +60,7 @@
|
|
49
60
|
"@wordpress/data": "^9.24.0",
|
50
61
|
"@wordpress/element": "^5.32.0",
|
51
62
|
"@wordpress/icons": "^9.45.0",
|
63
|
+
"@wordpress/hooks": "^3.57.0",
|
52
64
|
"react": "^18.0.0",
|
53
65
|
"react-dom": "^18.0.0"
|
54
66
|
},
|
@@ -57,8 +69,5 @@
|
|
57
69
|
"not dead",
|
58
70
|
"not ie <= 11",
|
59
71
|
"not op_mini all"
|
60
|
-
]
|
61
|
-
"publishConfig": {
|
62
|
-
"access": "public"
|
63
|
-
}
|
72
|
+
]
|
64
73
|
}
|
package/.editorconfig
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
root = true
|
2
|
-
|
3
|
-
[*]
|
4
|
-
charset = utf-8
|
5
|
-
end_of_line = lf
|
6
|
-
insert_final_newline = true
|
7
|
-
indent_style = space
|
8
|
-
indent_size = 2
|
9
|
-
trim_trailing_whitespace = true
|
10
|
-
|
11
|
-
[*.md]
|
12
|
-
trim_trailing_whitespace = false
|
13
|
-
|
14
|
-
[*.js]
|
15
|
-
indent_size = 4
|
16
|
-
|
17
|
-
[*.scss]
|
18
|
-
indent_size = 4
|
package/rollup.config.js
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
import resolve from '@rollup/plugin-node-resolve';
|
2
|
-
import commonjs from '@rollup/plugin-commonjs';
|
3
|
-
import babel from '@rollup/plugin-babel';
|
4
|
-
import terser from '@rollup/plugin-terser';
|
5
|
-
import external from 'rollup-plugin-peer-deps-external';
|
6
|
-
|
7
|
-
export default {
|
8
|
-
input: './src/index.js',
|
9
|
-
output: {
|
10
|
-
dir: 'build',
|
11
|
-
format: 'es',
|
12
|
-
exports: 'named',
|
13
|
-
sourcemap: true,
|
14
|
-
},
|
15
|
-
plugins: [
|
16
|
-
external(),
|
17
|
-
babel({
|
18
|
-
babelHelpers: 'runtime',
|
19
|
-
exclude: /node_modules/,
|
20
|
-
presets: [
|
21
|
-
'@babel/preset-env',
|
22
|
-
['@babel/preset-react', {
|
23
|
-
runtime: 'automatic',
|
24
|
-
}],
|
25
|
-
],
|
26
|
-
plugins: [
|
27
|
-
['@babel/plugin-transform-runtime', {
|
28
|
-
helpers: true,
|
29
|
-
regenerator: true,
|
30
|
-
}],
|
31
|
-
],
|
32
|
-
extensions: ['.js', '.jsx'],
|
33
|
-
}),
|
34
|
-
commonjs({
|
35
|
-
extensions: ['.js', '.jsx'],
|
36
|
-
}),
|
37
|
-
resolve({ extensions: ['.js', '.jsx'] }),
|
38
|
-
terser(),
|
39
|
-
],
|
40
|
-
};
|
@@ -1,16 +0,0 @@
|
|
1
|
-
import { ColorPalette } from '@wordpress/components';
|
2
|
-
import { useThemeColors, useColorChange } from '../utils/index';
|
3
|
-
|
4
|
-
export const ColorPaletteControl = ({ allowedColors, colorAttribute, attributeName, setAttributes }) => {
|
5
|
-
const colors = useThemeColors(allowedColors);
|
6
|
-
const onColorChange = useColorChange(colors, setAttributes);
|
7
|
-
|
8
|
-
return (
|
9
|
-
<ColorPalette
|
10
|
-
colors={colors}
|
11
|
-
value={colorAttribute?.value}
|
12
|
-
disableCustomColors={true}
|
13
|
-
onChange={(colorValue) => onColorChange(colorValue, attributeName)}
|
14
|
-
/>
|
15
|
-
);
|
16
|
-
};
|
@@ -1,73 +0,0 @@
|
|
1
|
-
import {
|
2
|
-
MediaPlaceholder,
|
3
|
-
MediaUpload,
|
4
|
-
MediaUploadCheck,
|
5
|
-
} from '@wordpress/block-editor';
|
6
|
-
import { Button, Icon } from '@wordpress/components';
|
7
|
-
import { edit as editIcon, trash as trashIcon } from '@wordpress/icons';
|
8
|
-
|
9
|
-
export const IconPicker = ({ imageId, imageUrl, imageAlt, svgCode, onSelect, onRemove }) => {
|
10
|
-
const hasImage = imageId && imageUrl;
|
11
|
-
const isSvg = hasImage && svgCode;
|
12
|
-
|
13
|
-
return (
|
14
|
-
<MediaUploadCheck>
|
15
|
-
<MediaUpload
|
16
|
-
onSelect={onSelect}
|
17
|
-
allowedTypes={['image']}
|
18
|
-
value={imageId}
|
19
|
-
render={({ open }) => {
|
20
|
-
return hasImage ? (
|
21
|
-
<div className="bc-image-wrapper">
|
22
|
-
{hasImage && (
|
23
|
-
isSvg ? (
|
24
|
-
<div
|
25
|
-
className="svg-container"
|
26
|
-
dangerouslySetInnerHTML={{ __html: svgCode }}
|
27
|
-
/>
|
28
|
-
) : (
|
29
|
-
<img src={imageUrl} alt={imageAlt || 'icon'} />
|
30
|
-
)
|
31
|
-
)}
|
32
|
-
|
33
|
-
<div className="bc-image-wrapper__actions">
|
34
|
-
<Button
|
35
|
-
className="bc-image-wrapper__btn bc-image-wrapper__replace-btn"
|
36
|
-
type="button"
|
37
|
-
onClick={open}
|
38
|
-
>
|
39
|
-
<Icon
|
40
|
-
icon={editIcon}
|
41
|
-
size={20}
|
42
|
-
className="bc-image-wrapper__btn-icon"
|
43
|
-
/>
|
44
|
-
</Button>
|
45
|
-
|
46
|
-
<Button
|
47
|
-
className="bc-image-wrapper__btn bc-image-wrapper__remove-btn"
|
48
|
-
type="button"
|
49
|
-
onClick={onRemove}
|
50
|
-
>
|
51
|
-
<Icon
|
52
|
-
icon={trashIcon}
|
53
|
-
size={20}
|
54
|
-
className="bc-image-wrapper__btn-icon"
|
55
|
-
/>
|
56
|
-
</Button>
|
57
|
-
</div>
|
58
|
-
|
59
|
-
<div className="bc-image-wrapper__overlay" />
|
60
|
-
</div>
|
61
|
-
) : (
|
62
|
-
<MediaPlaceholder
|
63
|
-
icon="format-image"
|
64
|
-
onSelect={onSelect}
|
65
|
-
allowedTypes={['image', 'image/svg+xml']}
|
66
|
-
labels={{ title: 'Icon Image' }}
|
67
|
-
/>
|
68
|
-
);
|
69
|
-
}}
|
70
|
-
/>
|
71
|
-
</MediaUploadCheck>
|
72
|
-
);
|
73
|
-
};
|
@@ -1,59 +0,0 @@
|
|
1
|
-
import { MediaUpload, MediaUploadCheck, MediaPlaceholder } from '@wordpress/block-editor';
|
2
|
-
import { Button } from '@wordpress/components';
|
3
|
-
|
4
|
-
export const ImageActions = ({
|
5
|
-
imageId,
|
6
|
-
imageUrl,
|
7
|
-
imageAlt,
|
8
|
-
placeholder = false,
|
9
|
-
onSelectImage,
|
10
|
-
onRemoveImage,
|
11
|
-
className = '',
|
12
|
-
}) => {
|
13
|
-
const hasImage = imageId && imageUrl;
|
14
|
-
|
15
|
-
return (
|
16
|
-
<MediaUploadCheck>
|
17
|
-
<MediaUpload
|
18
|
-
onSelect={onSelectImage}
|
19
|
-
allowedTypes={['image']}
|
20
|
-
value={imageId}
|
21
|
-
render={({ open }) => {
|
22
|
-
return hasImage ? (
|
23
|
-
<div className={`bc-image-wrapper ${className}`}>
|
24
|
-
<img src={imageUrl} alt={imageAlt} onClick={open} />
|
25
|
-
<div className="bc-image-wrapper__actions">
|
26
|
-
<Button
|
27
|
-
className="bc-image-wrapper__btn bc-image-wrapper__replace-btn"
|
28
|
-
type="button"
|
29
|
-
onClick={open}
|
30
|
-
>
|
31
|
-
Replace
|
32
|
-
</Button>
|
33
|
-
<Button
|
34
|
-
className="bc-image-wrapper__btn bc-image-wrapper__remove-btn"
|
35
|
-
type="button"
|
36
|
-
onClick={onRemoveImage}
|
37
|
-
>
|
38
|
-
Remove
|
39
|
-
</Button>
|
40
|
-
</div>
|
41
|
-
<div className="bc-image-wrapper__overlay" />
|
42
|
-
</div>
|
43
|
-
) : placeholder ? (
|
44
|
-
<MediaPlaceholder
|
45
|
-
className="media-placeholder"
|
46
|
-
icon="format-image"
|
47
|
-
onSelect={onSelectImage}
|
48
|
-
allowedTypes={['image']}
|
49
|
-
labels={{
|
50
|
-
title: 'Image',
|
51
|
-
instructions: 'Upload an image file or pick one from your media library.',
|
52
|
-
}}
|
53
|
-
/>
|
54
|
-
) : null;
|
55
|
-
}}
|
56
|
-
/>
|
57
|
-
</MediaUploadCheck>
|
58
|
-
);
|
59
|
-
};
|
@@ -1,31 +0,0 @@
|
|
1
|
-
import { BaseControl, CheckboxControl } from '@wordpress/components';
|
2
|
-
import { URLInput } from '@wordpress/block-editor';
|
3
|
-
import { useLinkChange } from '../utils/index';
|
4
|
-
|
5
|
-
// TODO: refactor props names
|
6
|
-
export const LinkControl = ({
|
7
|
-
buttonSource,
|
8
|
-
isButtonOpenInNewTab,
|
9
|
-
setAttributes,
|
10
|
-
}) => {
|
11
|
-
const onLinkChange = useLinkChange(setAttributes);
|
12
|
-
|
13
|
-
return (
|
14
|
-
<>
|
15
|
-
<BaseControl label="Source">
|
16
|
-
<URLInput
|
17
|
-
className="bc-url-input"
|
18
|
-
value={buttonSource}
|
19
|
-
// TODO: this doesn't work if the attribute has a different name
|
20
|
-
onChange={(newUrl) => onLinkChange(newUrl, 'buttonSource')}
|
21
|
-
/>
|
22
|
-
</BaseControl>
|
23
|
-
<CheckboxControl
|
24
|
-
checked={isButtonOpenInNewTab}
|
25
|
-
label="Open in a new tab"
|
26
|
-
onChange={(newIsOpenInNewTab) =>
|
27
|
-
onLinkChange(newIsOpenInNewTab, 'isButtonOpenInNewTab')}
|
28
|
-
/>
|
29
|
-
</>
|
30
|
-
);
|
31
|
-
};
|
@@ -1,130 +0,0 @@
|
|
1
|
-
import { Button } from '@wordpress/components';
|
2
|
-
import { MediaUpload, MediaUploadCheck } from '@wordpress/block-editor';
|
3
|
-
|
4
|
-
export const BCImageRenderer = ({
|
5
|
-
imageId,
|
6
|
-
imageUrl,
|
7
|
-
onImageClick,
|
8
|
-
onRemoveClick,
|
9
|
-
onSelectClick,
|
10
|
-
}) => {
|
11
|
-
return imageId && imageUrl ? (
|
12
|
-
<>
|
13
|
-
<div className="bc-selected-media-wrapper">
|
14
|
-
<img
|
15
|
-
src={imageUrl}
|
16
|
-
className="bc-selected-media bc-selected-media--image"
|
17
|
-
alt="Selected Image"
|
18
|
-
onClick={onImageClick}
|
19
|
-
/>
|
20
|
-
</div>
|
21
|
-
|
22
|
-
<Button
|
23
|
-
className="bc-remove-btn"
|
24
|
-
onClick={onRemoveClick}
|
25
|
-
isSecondary
|
26
|
-
isDestructive
|
27
|
-
>
|
28
|
-
Remove Image
|
29
|
-
</Button>
|
30
|
-
</>
|
31
|
-
) : (
|
32
|
-
<Button
|
33
|
-
variant="secondary"
|
34
|
-
onClick={onSelectClick}
|
35
|
-
className="bc-select-btn"
|
36
|
-
>
|
37
|
-
Select Image
|
38
|
-
</Button>
|
39
|
-
);
|
40
|
-
};
|
41
|
-
|
42
|
-
export const BCVideoRenderer = ({
|
43
|
-
videoId,
|
44
|
-
videoUrl,
|
45
|
-
onRemoveClick,
|
46
|
-
onSelectClick,
|
47
|
-
}) => {
|
48
|
-
return videoId && videoUrl ? (
|
49
|
-
<>
|
50
|
-
<div className="bc-selected-media-wrapper">
|
51
|
-
<video src={videoUrl} className="bc-selected-media bc-selected-media--video" controls />
|
52
|
-
</div>
|
53
|
-
|
54
|
-
<Button
|
55
|
-
className="bc-remove-btn"
|
56
|
-
onClick={onRemoveClick}
|
57
|
-
isSecondary
|
58
|
-
isDestructive
|
59
|
-
>
|
60
|
-
Remove Video
|
61
|
-
</Button>
|
62
|
-
</>
|
63
|
-
) : (
|
64
|
-
<Button
|
65
|
-
variant="secondary"
|
66
|
-
onClick={onSelectClick}
|
67
|
-
className="bc-select-btn"
|
68
|
-
>
|
69
|
-
Select Video
|
70
|
-
</Button>
|
71
|
-
);
|
72
|
-
};
|
73
|
-
|
74
|
-
const MEDIA_TYPES = {
|
75
|
-
IMAGE: 'image',
|
76
|
-
VIDEO: 'video',
|
77
|
-
};
|
78
|
-
|
79
|
-
export const BCMediaPicker = ({
|
80
|
-
mediaId,
|
81
|
-
mediaUrl,
|
82
|
-
onSelect,
|
83
|
-
onRemove,
|
84
|
-
type = MEDIA_TYPES.IMAGE,
|
85
|
-
...other
|
86
|
-
}) => {
|
87
|
-
if (type === MEDIA_TYPES.IMAGE) {
|
88
|
-
return (
|
89
|
-
<MediaUploadCheck>
|
90
|
-
<MediaUpload
|
91
|
-
onSelect={onSelect}
|
92
|
-
allowedTypes={['image', 'image/svg+xml']}
|
93
|
-
accept="image/*"
|
94
|
-
value={mediaId}
|
95
|
-
render={({ open }) => (
|
96
|
-
<BCImageRenderer
|
97
|
-
imageId={mediaId}
|
98
|
-
imageUrl={mediaUrl}
|
99
|
-
onImageClick={open}
|
100
|
-
onSelectClick={open}
|
101
|
-
onRemoveClick={onRemove}
|
102
|
-
/>
|
103
|
-
)}
|
104
|
-
{ ...other }
|
105
|
-
/>
|
106
|
-
</MediaUploadCheck>
|
107
|
-
);
|
108
|
-
} else if (type === MEDIA_TYPES.VIDEO) {
|
109
|
-
return (
|
110
|
-
<MediaUploadCheck>
|
111
|
-
<MediaUpload
|
112
|
-
onSelect={onSelect}
|
113
|
-
allowedTypes={['video']}
|
114
|
-
value={mediaId}
|
115
|
-
render={({ open }) => (
|
116
|
-
<BCVideoRenderer
|
117
|
-
videoId={mediaId}
|
118
|
-
videoUrl={mediaUrl}
|
119
|
-
onSelectClick={open}
|
120
|
-
onRemoveClick={onRemove}
|
121
|
-
/>
|
122
|
-
)}
|
123
|
-
{ ...other }
|
124
|
-
/>
|
125
|
-
</MediaUploadCheck>
|
126
|
-
);
|
127
|
-
} else {
|
128
|
-
throw new Error('Unrecognized media type.');
|
129
|
-
}
|
130
|
-
};
|
@@ -1,23 +0,0 @@
|
|
1
|
-
import { ToggleControl } from '@wordpress/components';
|
2
|
-
|
3
|
-
export const PreviewToggle = ({ attributes, setAttributes, disabled }) => {
|
4
|
-
const { isPreview } = attributes;
|
5
|
-
|
6
|
-
// TODO: useState instead of attributes
|
7
|
-
const handlePreviewChange = () => {
|
8
|
-
setAttributes({ isPreview: !isPreview });
|
9
|
-
};
|
10
|
-
|
11
|
-
// TODO: <BlockControls> will be duplicated if the parent block has the another one <BlockControls>
|
12
|
-
return (
|
13
|
-
<>
|
14
|
-
<ToggleControl
|
15
|
-
label="Enable Preview"
|
16
|
-
help="Please check this option to see how the block will actually look and behave on the frontend."
|
17
|
-
checked={isPreview}
|
18
|
-
onChange={handlePreviewChange}
|
19
|
-
disabled={disabled}
|
20
|
-
/>
|
21
|
-
</>
|
22
|
-
);
|
23
|
-
};
|
package/src/index.js
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
export { ColorPaletteControl } from './components/ColorPaletteControl';
|
2
|
-
export { IconPicker } from './components/IconPicker';
|
3
|
-
export { ImageActions } from './components/ImageActions';
|
4
|
-
export { LinkControl } from './components/LinkControl';
|
5
|
-
export { BCImageRenderer, BCVideoRenderer, BCMediaPicker } from './components/MediaPicker';
|
6
|
-
export { PreviewToggle } from './components/PreviewToggle';
|
7
|
-
|
8
|
-
export * from './utils';
|