/
shadow-panel-components.js
125 lines (116 loc) · 3.01 KB
/
shadow-panel-components.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/**
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
import {
__experimentalVStack as VStack,
__experimentalHeading as Heading,
__experimentalGrid as Grid,
__experimentalHStack as HStack,
__experimentalDropdownContentWrapper as DropdownContentWrapper,
Button,
FlexItem,
Dropdown,
} from '@wordpress/components';
import { shadow as shadowIcon, Icon, check } from '@wordpress/icons';
/**
* External dependencies
*/
import classNames from 'classnames';
export function ShadowPopoverContainer( { shadow, onShadowChange, settings } ) {
const defaultShadows = settings?.shadow?.presets?.default || [];
const themeShadows = settings?.shadow?.presets?.theme || [];
const defaultPresetsEnabled = settings?.shadow?.defaultPresets;
const shadows = [
...( defaultPresetsEnabled ? defaultShadows : [] ),
...themeShadows,
];
return (
<div className="block-editor-global-styles__shadow-popover-container">
<VStack spacing={ 4 }>
<Heading level={ 5 }>{ __( 'Drop shadow' ) }</Heading>
<ShadowPresets
presets={ shadows }
activeShadow={ shadow }
onSelect={ onShadowChange }
/>
</VStack>
</div>
);
}
export function ShadowPresets( { presets, activeShadow, onSelect } ) {
return ! presets ? null : (
<Grid columns={ 6 } gap={ 0 } align="center" justify="center">
{ presets.map( ( { name, slug, shadow } ) => (
<ShadowIndicator
key={ slug }
label={ name }
isActive={ shadow === activeShadow }
onSelect={ () =>
onSelect( shadow === activeShadow ? undefined : shadow )
}
shadow={ shadow }
/>
) ) }
</Grid>
);
}
export function ShadowIndicator( { label, isActive, onSelect, shadow } ) {
return (
<div className="block-editor-global-styles__shadow-indicator-wrapper">
<Button
className="block-editor-global-styles__shadow-indicator"
onClick={ onSelect }
label={ label }
style={ { boxShadow: shadow } }
showTooltip
>
{ isActive && <Icon icon={ check } /> }
</Button>
</div>
);
}
export function ShadowPopover( { shadow, onShadowChange, settings } ) {
const popoverProps = {
placement: 'left-start',
offset: 36,
shift: true,
};
return (
<Dropdown
popoverProps={ popoverProps }
className="block-editor-global-styles__shadow-dropdown"
renderToggle={ renderShadowToggle() }
renderContent={ () => (
<DropdownContentWrapper paddingSize="medium">
<ShadowPopoverContainer
shadow={ shadow }
onShadowChange={ onShadowChange }
settings={ settings }
/>
</DropdownContentWrapper>
) }
/>
);
}
function renderShadowToggle() {
return ( { onToggle, isOpen } ) => {
const toggleProps = {
onClick: onToggle,
className: classNames( { 'is-open': isOpen } ),
'aria-expanded': isOpen,
};
return (
<Button { ...toggleProps }>
<HStack justify="flex-start">
<Icon
className="block-editor-global-styles__toggle-icon"
icon={ shadowIcon }
size={ 24 }
/>
<FlexItem>{ __( 'Drop shadow' ) }</FlexItem>
</HStack>
</Button>
);
};
}