diff --git a/assets/css/src/components-form-editor/_preview.scss b/assets/css/src/components-form-editor/_preview.scss
index ed465df9e7..31b2cdc393 100644
--- a/assets/css/src/components-form-editor/_preview.scss
+++ b/assets/css/src/components-form-editor/_preview.scss
@@ -80,3 +80,11 @@
width: 300px;
}
}
+
+.mailpoet-size-settings-control {
+ .components-radio-control__option {
+ display: inline-block;
+ margin-right: 1em;
+ width: auto;
+ }
+}
diff --git a/assets/js/src/form_editor/components/_stories/size_settings.tsx b/assets/js/src/form_editor/components/_stories/size_settings.tsx
new file mode 100644
index 0000000000..0dcde73102
--- /dev/null
+++ b/assets/js/src/form_editor/components/_stories/size_settings.tsx
@@ -0,0 +1,58 @@
+import React from 'react';
+import { action } from '@storybook/addon-actions';
+import { SizeSettings } from '../size_settings';
+
+export default {
+ title: 'FormEditor/Size Settings',
+};
+
+export const Settings = () => (
+ <>
+
+
+ >
+);
+
+
+export const SettingsInSidebar = () => (
+
+
+
+
+);
diff --git a/assets/js/src/form_editor/components/size_settings.tsx b/assets/js/src/form_editor/components/size_settings.tsx
new file mode 100644
index 0000000000..83a5db9896
--- /dev/null
+++ b/assets/js/src/form_editor/components/size_settings.tsx
@@ -0,0 +1,66 @@
+import React, { useState } from 'react';
+import { RangeControl, RadioControl } from '@wordpress/components';
+
+export type SizeDefinition = {
+ value: number|undefined,
+ unit: 'percent'|'pixel',
+};
+
+type Props = {
+ label: string,
+ minPercents?: number,
+ maxPercents?: number,
+ minPixels?: number,
+ maxPixels?: number,
+ value: SizeDefinition|undefined,
+ defaultPercentValue?: number,
+ defaultPixelValue?: number,
+ onChange: (value: SizeDefinition) => any,
+}
+
+export const SizeSettings = ({
+ label,
+ minPercents = 0,
+ maxPercents = 100,
+ minPixels = 10,
+ maxPixels = 1000,
+ value,
+ defaultPercentValue = 50,
+ defaultPixelValue = 200,
+ onChange,
+}: Props) => {
+ const [localValue, setLocalValue] = useState(value ?? { unit: 'pixel', value: undefined });
+ return (
+
+
{label}
+ {
+ const newValue = {
+ value: unit === 'pixel' ? defaultPixelValue : defaultPercentValue,
+ unit,
+ };
+ setLocalValue(newValue);
+ onChange(newValue);
+ }}
+ />
+ {
+ const newValue: SizeDefinition = {
+ unit: localValue.unit === 'pixel' ? 'pixel' : 'percent',
+ value: val,
+ };
+ setLocalValue(newValue);
+ onChange(newValue);
+ }}
+ />
+
+ );
+};