@elementor/editor-controls 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -0
- package/dist/index.d.mts +37 -25
- package/dist/index.d.ts +37 -25
- package/dist/index.js +609 -289
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +583 -254
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -6
- package/src/bound-prop-context/prop-key-context.tsx +1 -1
- package/src/components/repeater.tsx +10 -4
- package/src/components/text-field-inner-selection.tsx +2 -2
- package/src/control-actions/control-actions-context.tsx +1 -1
- package/src/control-actions/control-actions.tsx +1 -1
- package/src/controls/autocomplete-control.tsx +99 -80
- package/src/controls/background-control/background-overlay/background-image-overlay/background-image-overlay-attachment.tsx +3 -3
- package/src/controls/background-control/background-overlay/background-image-overlay/background-image-overlay-position.tsx +72 -8
- package/src/controls/background-control/background-overlay/background-image-overlay/background-image-overlay-repeat.tsx +1 -1
- package/src/controls/background-control/background-overlay/background-image-overlay/background-image-overlay-size.tsx +71 -11
- package/src/controls/background-control/background-overlay/background-overlay-repeater-control.tsx +92 -46
- package/src/controls/background-control/background-overlay/types.ts +22 -0
- package/src/controls/background-control/background-overlay/use-background-tabs-history.ts +62 -0
- package/src/controls/box-shadow-repeater-control.tsx +1 -1
- package/src/controls/image-control.tsx +26 -22
- package/src/controls/image-media-control.tsx +1 -1
- package/src/controls/link-control.tsx +134 -17
- package/src/controls/size-control.tsx +1 -1
- package/src/controls/stroke-control.tsx +1 -1
- package/src/controls/svg-media-control.tsx +107 -0
- package/src/create-control-replacement.tsx +2 -2
- package/src/env.ts +5 -0
- package/src/index.ts +2 -1
- package/src/controls/background-control/background-overlay/background-image-overlay/background-image-overlay-resolution.tsx +0 -27
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { imageSrcPropTypeUtil } from '@elementor/editor-props';
|
|
3
|
+
import { UploadIcon } from '@elementor/icons';
|
|
4
|
+
import { Button, Card, CardMedia, CardOverlay, CircularProgress, Stack, styled } from '@elementor/ui';
|
|
5
|
+
import { useWpMediaAttachment, useWpMediaFrame } from '@elementor/wp-media';
|
|
6
|
+
import { __ } from '@wordpress/i18n';
|
|
7
|
+
|
|
8
|
+
import { useBoundProp } from '../bound-prop-context';
|
|
9
|
+
import { ControlLabel } from '../components/control-label';
|
|
10
|
+
import ControlActions from '../control-actions/control-actions';
|
|
11
|
+
import { createControl } from '../create-control';
|
|
12
|
+
|
|
13
|
+
const TILE_SIZE = 8;
|
|
14
|
+
const TILE_WHITE = 'transparent';
|
|
15
|
+
const TILE_BLACK = '#c1c1c1';
|
|
16
|
+
const TILES_GRADIENT_FORMULA = `linear-gradient(45deg, ${ TILE_BLACK } 25%, ${ TILE_WHITE } 0, ${ TILE_WHITE } 75%, ${ TILE_BLACK } 0, ${ TILE_BLACK })`;
|
|
17
|
+
|
|
18
|
+
const StyledCard = styled( Card )`
|
|
19
|
+
background-color: white;
|
|
20
|
+
background-image: ${ TILES_GRADIENT_FORMULA }, ${ TILES_GRADIENT_FORMULA };
|
|
21
|
+
background-size: ${ TILE_SIZE }px ${ TILE_SIZE }px;
|
|
22
|
+
background-position:
|
|
23
|
+
0 0,
|
|
24
|
+
${ TILE_SIZE / 2 }px ${ TILE_SIZE / 2 }px;
|
|
25
|
+
border: none;
|
|
26
|
+
`;
|
|
27
|
+
|
|
28
|
+
const StyledCardMediaContainer = styled( Stack )`
|
|
29
|
+
position: relative;
|
|
30
|
+
height: 140px;
|
|
31
|
+
object-fit: contain;
|
|
32
|
+
padding: 5px;
|
|
33
|
+
justify-content: center;
|
|
34
|
+
align-items: center;
|
|
35
|
+
background-color: rgba( 255, 255, 255, 0.37 );
|
|
36
|
+
`;
|
|
37
|
+
|
|
38
|
+
export const SvgMediaControl = createControl( () => {
|
|
39
|
+
const { value, setValue } = useBoundProp( imageSrcPropTypeUtil );
|
|
40
|
+
const { id, url } = value ?? {};
|
|
41
|
+
const { data: attachment, isFetching } = useWpMediaAttachment( id?.value || null );
|
|
42
|
+
const src = attachment?.url ?? url?.value ?? null;
|
|
43
|
+
const { open } = useWpMediaFrame( {
|
|
44
|
+
types: [ 'image/svg+xml' ],
|
|
45
|
+
allowedExtensions: [ 'svg' ],
|
|
46
|
+
multiple: false,
|
|
47
|
+
selected: id?.value || null,
|
|
48
|
+
onSelect: ( selectedAttachment ) => {
|
|
49
|
+
setValue( {
|
|
50
|
+
id: {
|
|
51
|
+
$$type: 'image-attachment-id',
|
|
52
|
+
value: selectedAttachment.id,
|
|
53
|
+
},
|
|
54
|
+
url: null,
|
|
55
|
+
} );
|
|
56
|
+
},
|
|
57
|
+
} );
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<Stack gap={ 1 }>
|
|
61
|
+
<ControlLabel> { __( 'Choose SVG', 'elementor' ) } </ControlLabel>
|
|
62
|
+
<ControlActions>
|
|
63
|
+
<StyledCard variant="outlined">
|
|
64
|
+
<StyledCardMediaContainer>
|
|
65
|
+
{ isFetching ? (
|
|
66
|
+
<CircularProgress role="progressbar" />
|
|
67
|
+
) : (
|
|
68
|
+
<CardMedia
|
|
69
|
+
component="img"
|
|
70
|
+
image={ src }
|
|
71
|
+
alt={ __( 'Preview SVG', 'elementor' ) }
|
|
72
|
+
sx={ { maxHeight: '140px', width: '50px' } }
|
|
73
|
+
/>
|
|
74
|
+
) }
|
|
75
|
+
</StyledCardMediaContainer>
|
|
76
|
+
<CardOverlay
|
|
77
|
+
sx={ {
|
|
78
|
+
'&:hover': {
|
|
79
|
+
backgroundColor: 'rgba( 0, 0, 0, 0.75 )',
|
|
80
|
+
},
|
|
81
|
+
} }
|
|
82
|
+
>
|
|
83
|
+
<Stack gap={ 1 }>
|
|
84
|
+
<Button
|
|
85
|
+
size="tiny"
|
|
86
|
+
color="inherit"
|
|
87
|
+
variant="outlined"
|
|
88
|
+
onClick={ () => open( { mode: 'browse' } ) }
|
|
89
|
+
>
|
|
90
|
+
{ __( 'Select SVG', 'elementor' ) }
|
|
91
|
+
</Button>
|
|
92
|
+
<Button
|
|
93
|
+
size="tiny"
|
|
94
|
+
variant="text"
|
|
95
|
+
color="inherit"
|
|
96
|
+
startIcon={ <UploadIcon /> }
|
|
97
|
+
onClick={ () => open( { mode: 'upload' } ) }
|
|
98
|
+
>
|
|
99
|
+
{ __( 'Upload SVG', 'elementor' ) }
|
|
100
|
+
</Button>
|
|
101
|
+
</Stack>
|
|
102
|
+
</CardOverlay>
|
|
103
|
+
</StyledCard>
|
|
104
|
+
</ControlActions>
|
|
105
|
+
</Stack>
|
|
106
|
+
);
|
|
107
|
+
} );
|
|
@@ -4,11 +4,11 @@ import { type PropValue } from '@elementor/editor-props';
|
|
|
4
4
|
|
|
5
5
|
import { useBoundProp } from './bound-prop-context';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
type ReplaceWhenParams = {
|
|
8
8
|
value: PropValue;
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
type CreateControlReplacement = {
|
|
12
12
|
component: ComponentType;
|
|
13
13
|
condition: ( { value }: ReplaceWhenParams ) => boolean;
|
|
14
14
|
};
|
package/src/env.ts
ADDED
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// control types
|
|
2
|
-
export { ImageControl } from './controls/image-control';
|
|
3
2
|
export { AutocompleteControl } from './controls/autocomplete-control';
|
|
3
|
+
export { ImageControl } from './controls/image-control';
|
|
4
4
|
export { TextControl } from './controls/text-control';
|
|
5
5
|
export { TextAreaControl } from './controls/text-area-control';
|
|
6
6
|
export { SizeControl } from './controls/size-control';
|
|
@@ -16,6 +16,7 @@ export { FontFamilyControl } from './controls/font-family-control';
|
|
|
16
16
|
export { UrlControl } from './controls/url-control';
|
|
17
17
|
export { LinkControl } from './controls/link-control';
|
|
18
18
|
export { GapControl } from './controls/gap-control';
|
|
19
|
+
export { SvgMediaControl } from './controls/svg-media-control';
|
|
19
20
|
export { BackgroundControl } from './controls/background-control/background-control';
|
|
20
21
|
|
|
21
22
|
// components
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { Grid } from '@elementor/ui';
|
|
3
|
-
import { __ } from '@wordpress/i18n';
|
|
4
|
-
|
|
5
|
-
import { ControlLabel } from '../../../../components/control-label';
|
|
6
|
-
import { SelectControl } from '../../../select-control';
|
|
7
|
-
|
|
8
|
-
const backgroundResolutionOptions = [
|
|
9
|
-
{ label: __( 'Thumbnail - 150 x 150', 'elementor' ), value: 'thumbnail' },
|
|
10
|
-
{ label: __( 'Medium - 300 x 300', 'elementor' ), value: 'medium' },
|
|
11
|
-
{ label: __( 'Medium Large - 768 x 768' ), value: 'medium_large' },
|
|
12
|
-
{ label: __( 'Large 1024 x 1024', 'elementor' ), value: 'large' },
|
|
13
|
-
{ label: __( 'Full', 'elementor' ), value: 'full' },
|
|
14
|
-
];
|
|
15
|
-
|
|
16
|
-
export const BackgroundImageOverlayResolution = () => {
|
|
17
|
-
return (
|
|
18
|
-
<Grid container gap={ 2 } alignItems="center" flexWrap="nowrap">
|
|
19
|
-
<Grid item xs={ 6 }>
|
|
20
|
-
<ControlLabel>{ __( 'Resolution', 'elementor' ) }</ControlLabel>
|
|
21
|
-
</Grid>
|
|
22
|
-
<Grid item xs={ 6 }>
|
|
23
|
-
<SelectControl options={ backgroundResolutionOptions } />
|
|
24
|
-
</Grid>
|
|
25
|
-
</Grid>
|
|
26
|
-
);
|
|
27
|
-
};
|