@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.
Files changed (32) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/index.d.mts +37 -25
  3. package/dist/index.d.ts +37 -25
  4. package/dist/index.js +609 -289
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +583 -254
  7. package/dist/index.mjs.map +1 -1
  8. package/package.json +11 -6
  9. package/src/bound-prop-context/prop-key-context.tsx +1 -1
  10. package/src/components/repeater.tsx +10 -4
  11. package/src/components/text-field-inner-selection.tsx +2 -2
  12. package/src/control-actions/control-actions-context.tsx +1 -1
  13. package/src/control-actions/control-actions.tsx +1 -1
  14. package/src/controls/autocomplete-control.tsx +99 -80
  15. package/src/controls/background-control/background-overlay/background-image-overlay/background-image-overlay-attachment.tsx +3 -3
  16. package/src/controls/background-control/background-overlay/background-image-overlay/background-image-overlay-position.tsx +72 -8
  17. package/src/controls/background-control/background-overlay/background-image-overlay/background-image-overlay-repeat.tsx +1 -1
  18. package/src/controls/background-control/background-overlay/background-image-overlay/background-image-overlay-size.tsx +71 -11
  19. package/src/controls/background-control/background-overlay/background-overlay-repeater-control.tsx +92 -46
  20. package/src/controls/background-control/background-overlay/types.ts +22 -0
  21. package/src/controls/background-control/background-overlay/use-background-tabs-history.ts +62 -0
  22. package/src/controls/box-shadow-repeater-control.tsx +1 -1
  23. package/src/controls/image-control.tsx +26 -22
  24. package/src/controls/image-media-control.tsx +1 -1
  25. package/src/controls/link-control.tsx +134 -17
  26. package/src/controls/size-control.tsx +1 -1
  27. package/src/controls/stroke-control.tsx +1 -1
  28. package/src/controls/svg-media-control.tsx +107 -0
  29. package/src/create-control-replacement.tsx +2 -2
  30. package/src/env.ts +5 -0
  31. package/src/index.ts +2 -1
  32. 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
- export type ReplaceWhenParams = {
7
+ type ReplaceWhenParams = {
8
8
  value: PropValue;
9
9
  };
10
10
 
11
- export type CreateControlReplacement = {
11
+ type CreateControlReplacement = {
12
12
  component: ComponentType;
13
13
  condition: ( { value }: ReplaceWhenParams ) => boolean;
14
14
  };
package/src/env.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { parseEnv } from '@elementor/env';
2
+
3
+ export const { env } = parseEnv< {
4
+ background_placeholder_image: string;
5
+ } >( '@elementor/editor-controls' );
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
- };