@amaui/ui-react
Version:
UI for React
803 lines (799 loc) • 31.3 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
const _excluded = ["tonal", "color", "version", "render", "updates", "actions", "exclude", "downloadName", "downloadType", "downloadQuality", "viewBox", "strokeColor", "strokeWidth", "svgRef", "valueDefault", "value", "onChange", "onMouseDown", "onClear", "onDownload", "IconClear", "IconDownload", "IconSize", "IconStrokeColor", "IconProps", "SizeProps", "AppendProps", "ToolbarProps", "ToolbarUpdatesProps", "ToolbarActionsProps", "ToggleButtonProps", "ToggleButtonsProps", "DividerProps", "SelectProps", "ListItemProps", "TooltipProps", "PaletteProps", "IconButtonProps", "ColorTextFieldProps", "Component", "className"],
_excluded2 = ["open", "label", "children"],
_excluded3 = ["open", "element", "anchorElement", "onClose", "children"],
_excluded4 = ["color"],
_excluded5 = ["version", "onUpdate", "onClose"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
import React from 'react';
import { elementToCanvas, is, isEnvironment } from '@amaui/utils';
import { classNames, colors, style as styleMethod, useAmauiTheme } from '@amaui/style-react';
import IconMaterialDeleteSweep from '@amaui/icons-material-rounded-react/IconMaterialDeleteSweepW100';
import IconMaterialDownload from '@amaui/icons-material-rounded-react/IconMaterialDownloadW100';
import IconMaterialCropLandscape from '@amaui/icons-material-rounded-react/IconMaterialCropLandscapeW100';
import IconMaterialPalette from '@amaui/icons-material-rounded-react/IconMaterialPaletteW100';
import ListItemElement from '../ListItem';
import SurfaceElement from '../Surface';
import TooltipElement from '../Tooltip';
import TypeElement from '../Type';
import ButtonElement from '../Button';
import LineElement from '../Line';
import SelectElement from '../Select';
import NumericTextFieldElement from '../NumericTextField';
import ToggleButtonsElement from '../ToggleButtons';
import DividerElement from '../Divider';
import ToggleButtonElement from '../ToggleButton';
import ColorTextFieldElement from '../ColorTextField';
import AppendElement from '../Append';
import FadeElement from '../Fade';
import ClickListenerElement from '../ClickListener';
import { staticClassName } from '../utils';
const useStyle = styleMethod(theme => ({
root: {
position: 'relative'
},
methods: {
position: 'absolute',
right: '8px',
bottom: '8px',
padding: `${theme.methods.space.value(0.5, 'px')} ${theme.methods.space.value(1.5, 'px')}`
},
svg: {
display: 'block',
margin: '12px',
cursor: 'none',
touchAction: 'none',
boxShadow: theme.shadows.values.default[1],
background: theme.palette.color.neutral[100]
},
toolbars: {
width: '100%'
},
toolbar: {
width: '100%',
overflowX: 'auto',
padding: theme.methods.space.value(1, 'px')
},
modal: {
padding: theme.methods.space.value(1.5, 'px'),
borderRadius: theme.methods.shape.radius.value(1, 'px'),
boxShadow: theme.shadows.values.default[2]
},
palette: {
padding: theme.methods.space.value(1.5, 'px'),
borderRadius: theme.methods.shape.radius.value(1, 'px'),
boxShadow: theme.shadows.values.default[2]
},
paletteItem: {
position: 'relative',
width: '17px',
height: '17px',
cursor: 'pointer',
borderRadius: theme.methods.shape.radius.value(40, 'px'),
boxShadow: theme.shadows.values.default[1],
transition: theme.methods.transitions.make('box-shadow'),
'&:hover': {
boxShadow: theme.shadows.values.default[2]
}
},
textFieldColor: {
flex: '1 1 auto'
},
inputColor: {
border: 'none',
borderRadius: theme.methods.shape.radius.value(40, 'px'),
overflow: 'hidden',
width: '17px',
height: '17px',
cursor: 'pointer',
boxShadow: theme.shadows.values.default[1],
'&::-webkit-color-swatch-wrapper': {
padding: '0px'
},
'&::-webkit-color-swatch': {
border: 'none'
}
},
divider: {
'&.amaui-Divider-root': {
margin: '0'
}
},
divider_middle: {
'&.amaui-Divider-root': {
opacity: theme.palette.light ? '0.07' : '0.24'
}
},
divider_end: {
'&.amaui-Divider-root': {
opacity: theme.palette.light ? '0.14' : '0.4'
}
}
}), {
name: 'amaui-Drawing'
});
const Drawing = /*#__PURE__*/React.forwardRef((props__, ref) => {
const theme = useAmauiTheme();
const props = React.useMemo(() => _objectSpread(_objectSpread(_objectSpread({}, theme?.ui?.elements?.all?.props?.default), theme?.ui?.elements?.amauiDrawing?.props?.default), props__), [props__]);
const Line = React.useMemo(() => theme?.elements?.Line || LineElement, [theme]);
const ListItem = React.useMemo(() => theme?.elements?.ListItem || ListItemElement, [theme]);
const Surface = React.useMemo(() => theme?.elements?.Surface || SurfaceElement, [theme]);
const Tooltip = React.useMemo(() => theme?.elements?.Tooltip || TooltipElement, [theme]);
const Type = React.useMemo(() => theme?.elements?.Type || TypeElement, [theme]);
const Button = React.useMemo(() => theme?.elements?.Button || ButtonElement, [theme]);
const Select = React.useMemo(() => theme?.elements?.Select || SelectElement, [theme]);
const NumericTextField = React.useMemo(() => theme?.elements?.NumericTextField || NumericTextFieldElement, [theme]);
const ToggleButton = React.useMemo(() => theme?.elements?.ToggleButton || ToggleButtonElement, [theme]);
const ToggleButtons = React.useMemo(() => theme?.elements?.ToggleButtons || ToggleButtonsElement, [theme]);
const Divider = React.useMemo(() => theme?.elements?.Divider || DividerElement, [theme]);
const ColorTextField = React.useMemo(() => theme?.elements?.ColorTextField || ColorTextFieldElement, [theme]);
const Append = React.useMemo(() => theme?.elements?.Append || AppendElement, [theme]);
const Fade = React.useMemo(() => theme?.elements?.Fade || FadeElement, [theme]);
const ClickListener = React.useMemo(() => theme?.elements?.ClickListener || ClickListenerElement, [theme]);
const {
tonal = true,
color = 'default',
version = 'filled',
render,
updates = true,
actions = true,
exclude,
downloadName = `amaui-drawing.png`,
downloadType = 'image/png',
downloadQuality = 1,
viewBox = '0 0 340 140',
strokeColor = '#000000',
strokeWidth = 1,
svgRef,
valueDefault,
value: value_,
onChange,
onMouseDown: onMouseDown_,
onClear: onClear_,
onDownload: onDownload_,
IconClear = IconMaterialDeleteSweep,
IconDownload = IconMaterialDownload,
IconSize = IconMaterialCropLandscape,
IconStrokeColor = IconMaterialPalette,
IconProps: IconProps_,
SizeProps,
AppendProps: AppendProps_,
ToolbarProps,
ToolbarUpdatesProps,
ToolbarActionsProps,
ToggleButtonProps: ToggleButtonProps_,
ToggleButtonsProps: ToggleButtonsProps_,
DividerProps: DividerProps_,
SelectProps: SelectProps_,
ListItemProps: ListItemProps_,
TooltipProps: TooltipProps_,
PaletteProps,
IconButtonProps,
ColorTextFieldProps,
Component = 'div',
className
} = props,
other = _objectWithoutProperties(props, _excluded);
const {
classes
} = useStyle();
const [value, setValue] = React.useState((valueDefault !== undefined ? valueDefault : value_) || []);
const [mouseDown, setMouseDown] = React.useState(false);
const [move, setMove] = React.useState({});
const [loading, setLoading] = React.useState(false);
const [inputValues, setInputValues] = React.useState({
viewBox: '0 0 340 140',
width: 340,
widthInput: 340,
height: 140,
heightInput: 140,
strokeWidth: 1,
strokeColor: '#000000'
});
const [open, setOpen] = React.useState({});
const refs = {
root: React.useRef(undefined),
inputValues: React.useRef(undefined),
svg: React.useRef(undefined),
value: React.useRef(undefined),
mouseDown: React.useRef(undefined),
props: React.useRef(undefined),
move: React.useRef(undefined),
download: React.useRef(undefined),
open: React.useRef(undefined),
elements: {
size: React.useRef(undefined),
strokeColor: React.useRef(undefined)
}
};
refs.value.current = value;
refs.open.current = open;
refs.props.current = props;
refs.inputValues.current = inputValues;
refs.download.current = {
name: downloadName,
type: downloadType,
quality: downloadQuality
};
refs.mouseDown.current = mouseDown;
refs.move.current = move;
const updateValue = valueNew => {
if (!props.hasOwnProperty('value')) setValue(valueNew);
if (is('function', onChange)) onChange(valueNew);
};
const updateInputValues = (property, itemValue) => {
setInputValues(values => _objectSpread(_objectSpread({}, values), {}, {
[property]: itemValue
}));
};
const updateOpen = (property, itemValue) => {
setOpen(values => _objectSpread(_objectSpread({}, values), {}, {
[property]: itemValue
}));
};
React.useEffect(() => {
const onMouseUp = () => {
if (refs.mouseDown.current) setMouseDown(false);
};
const onMouseMove = event => {
const x = event.clientX;
const y = event.clientY;
const rect = refs.svg.current?.getBoundingClientRect();
if (!rect) return;
const {
x: xRoot,
y: yRoot
} = rect;
const valueMove = {
x: x - xRoot,
y: y - yRoot
};
update(valueMove);
};
const onTouchMove = event => {
const x = event.touches[0].clientX;
const y = event.touches[0].clientY;
const rect = refs.svg.current?.getBoundingClientRect();
if (!rect) return;
const {
x: xRoot,
y: yRoot
} = rect;
const valueMove = {
x: x - xRoot,
y: y - yRoot
};
update(valueMove);
};
const update = valueNew => {
if (refs.mouseDown.current) {
// Update
// relative value from the previous one how much x and y moved
const x = valueNew?.x;
const y = valueNew?.y;
const previous = refs.value.current?.[refs.value.current?.length - 1];
if (previous) {
if (!(x === 0 && y === 0)) {
previous.d += ` ${x},${y}`;
updateValue([...refs.value.current]);
}
}
}
setMove(valueNew);
};
const rootDocument = isEnvironment('browser') ? refs.root.current?.ownerDocument || window.document : undefined;
rootDocument.addEventListener('mouseup', onMouseUp);
rootDocument.addEventListener('mousemove', onMouseMove);
rootDocument.addEventListener('touchend', onMouseUp, {
passive: true
});
rootDocument.addEventListener('touchmove', onTouchMove);
return () => {
rootDocument.removeEventListener('mouseup', onMouseUp);
rootDocument.removeEventListener('touchend', onMouseUp);
rootDocument.removeEventListener('mousemove', onMouseMove);
rootDocument.removeEventListener('touchmove', onTouchMove);
};
}, []);
React.useEffect(() => {
if (value_ !== refs.value.current) setValue(value_);
}, [value_]);
React.useEffect(() => {
if (strokeColor !== undefined && strokeColor !== refs.inputValues.current.strokeColor) updateInputValues('strokeColor', strokeColor);
if (strokeWidth !== undefined && strokeWidth !== refs.inputValues.current.strokeWidth) updateInputValues('strokeWidth', strokeWidth);
}, [strokeColor, strokeWidth]);
React.useEffect(() => {
if (viewBox !== undefined && viewBox !== refs.inputValues.current.viewBox) {
updateInputValues('viewBox', viewBox);
updateInputValues('width', viewBox.split(' ')[2]);
updateInputValues('height', viewBox.split(' ')[3]);
}
}, [viewBox]);
const onMouseDown = React.useCallback(event => {
setMouseDown(true);
let x = event.touches ? event.touches[0].clientX : event.clientX;
let y = event.touches ? event.touches[0].clientY : event.clientY;
const rect = refs.svg.current.getBoundingClientRect();
x -= rect.x;
y -= rect.y;
setMove({
x,
y
});
// Create new value path
updateValue([...(refs.value.current || []), {
d: `M ${x},${y} L ${x} ${y}`,
stroke: refs.inputValues.current.strokeColor,
strokeWidth: refs.inputValues.current.strokeWidth
}]);
if (is('function', onMouseDown_)) onMouseDown_(event);
}, []);
const onClear = React.useCallback(() => {
updateValue([]);
if (is('function', onClear_)) onClear_();
}, []);
const onDownload = React.useCallback(async () => {
const svg = refs.svg.current;
const rect = svg.getBoundingClientRect();
// Clean up
const clone = svg.cloneNode(true);
clone.style.margin = '0px';
clone.style.boxShadow = 'none';
if (refs.download.current.type?.includes('png')) {
clone.style.background = 'transparent';
}
try {
setLoading(true);
await elementToCanvas(clone, {
response: 'download',
filter: ['.amaui-Drawing-pointer'],
download: refs.download.current,
width: rect.width,
height: rect.height
});
} catch (error) {}
setLoading(false);
if (is('function', onDownload_)) onDownload_();
}, []);
const includes = function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return !is('array', exclude) || args.some(item => !exclude.includes(item));
};
// updates toolbar
const updateOptions = ['stroke-color', 'stroke-width', 'size'];
const updates_ = updates && (!is('array', exclude) || includes(...updateOptions));
// action toolbar
const actions_ = actions && (!is('array', exclude) || includes('clear', 'download'));
const AppendProps = _objectSpread({
padding: [14, 14]
}, AppendProps_);
const DividerProps = _objectSpread({
color: 'inherit'
}, DividerProps_);
const TooltipProps = _objectSpread({
position: 'bottom',
interactive: false
}, TooltipProps_);
const ToggleButtonsProps = _objectSpread({
tonal,
color,
version: 'text',
border: false
}, ToggleButtonsProps_);
const ToggleButtonProps = _objectSpread({
size: 'small'
}, ToggleButtonProps_);
const SelectProps = _objectSpread({
tonal,
color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed',
version: 'outlined',
size: 'small',
ListProps: {
tonal,
color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed'
},
MenuProps: {
portal: true
}
}, SelectProps_);
const ListItemProps = _objectSpread({
size: 'small',
PrimaryProps: {
style: {
fontFamily: 'inherit'
}
}
}, ListItemProps_);
const IconProps = _objectSpread({
size: 'small'
}, IconProps_);
const WrapperToggleButton = React.useCallback( /*#__PURE__*/React.forwardRef((props_, ref_) => {
const {
open: open_,
label,
children
} = props_,
other_ = _objectWithoutProperties(props_, _excluded2);
return /*#__PURE__*/React.createElement(Tooltip, _extends({
open: open_ !== undefined ? open_ : undefined,
label: label
}, TooltipProps), /*#__PURE__*/React.cloneElement(children, _objectSpread(_objectSpread({}, other_), children.props)));
}), []);
const WrapperAppend = React.useCallback(props_ => {
const {
open: open_,
element,
anchorElement,
onClose,
children
} = props_,
other_ = _objectWithoutProperties(props_, _excluded3);
return /*#__PURE__*/React.createElement(Append, _extends({
open: open_,
element: /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Fade, {
in: open_,
add: true
}, /*#__PURE__*/React.cloneElement(element))),
anchorElement: anchorElement,
portal: true,
alignment: "center",
position: "bottom"
}, AppendProps), /*#__PURE__*/React.cloneElement(children, _objectSpread(_objectSpread({}, other_), children.props)));
}, []);
const PaletteItem = React.useCallback(props_ => {
const {
color: color_
} = props_,
other_ = _objectWithoutProperties(props_, _excluded4);
return /*#__PURE__*/React.createElement("span", _extends({
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-palette-item'], classes.paletteItem]),
style: {
background: color_
}
}, other_));
}, []);
const Palette = React.useCallback( /*#__PURE__*/React.forwardRef((props_, ref_) => {
const {
version: version_,
onUpdate,
onClose
} = props_,
other_ = _objectWithoutProperties(props_, _excluded5);
return /*#__PURE__*/React.createElement(Line, _extends({
ref: ref_,
gap: 1,
direction: "column",
tonal: tonal,
color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed',
Component: Surface,
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-palette'], classes.palette])
}, other_), /*#__PURE__*/React.createElement(Line, {
gap: 0.5
}, /*#__PURE__*/React.createElement(Line, {
gap: 0.5,
direction: "row",
style: {
width: '100%'
}
}, /*#__PURE__*/React.createElement(PaletteItem, {
color: "#000000",
onClick: () => {
onUpdate('#000000');
onClose();
}
}), /*#__PURE__*/React.createElement(PaletteItem, {
color: "#ffffff",
onClick: () => {
onUpdate('#ffffff');
onClose();
}
})), Object.keys(colors).filter(item => !['black', 'white'].includes(item)).map((item, index) => /*#__PURE__*/React.createElement(Line, {
key: index,
gap: 0.5,
direction: "row",
style: {
width: '100%'
}
}, Object.keys(colors[item]).map((item_, index_) => /*#__PURE__*/React.createElement(PaletteItem, {
key: index_,
color: colors[item][item_],
onClick: () => {
onUpdate(colors[item][item_]);
onClose();
}
}))))), /*#__PURE__*/React.createElement(Divider, null), /*#__PURE__*/React.createElement(Line, {
gap: 0.5,
direction: "row",
align: "center",
style: {
width: '100%'
}
}, /*#__PURE__*/React.createElement(ColorTextField, _extends({
tonal: tonal,
color: color,
label: "Custom color",
version: "outlined",
size: "small",
value: refs.inputValues.current[version_],
onChange: valueNew => updateInputValues(version_, valueNew)
}, ColorTextFieldProps, {
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-text-field-color'], ColorTextFieldProps?.className, classes.textFieldColor])
})), /*#__PURE__*/React.createElement(Button, {
tonal: tonal,
color: "inherit",
version: "text",
size: "small",
onClick: () => {
onUpdate(refs.inputValues.current[version_]);
onClose();
}
}, "Apply")));
}), []);
const valueNew_ = (is('array', value) ? value : [value]).filter(Boolean);
const valueNewActive = mouseDown && valueNew_[valueNew_.length - 1];
const circleStrokeWidth = +(valueNewActive ? valueNewActive.strokeWidth : refs.inputValues.current.strokeWidth);
const stroke_width = [{
label: /*#__PURE__*/React.createElement(Line, {
direction: "row",
align: "center"
}, /*#__PURE__*/React.createElement("div", {
style: {
width: 14,
height: 1,
background: theme.palette.text.default.primary
}
}), /*#__PURE__*/React.createElement(Type, {
version: "b2"
}, "1")),
value: 1
}, {
label: /*#__PURE__*/React.createElement(Line, {
direction: "row",
align: "center"
}, /*#__PURE__*/React.createElement("div", {
style: {
width: 14,
height: 2,
background: theme.palette.text.default.primary
}
}), /*#__PURE__*/React.createElement(Type, {
version: "b2"
}, "2")),
value: 2
}, {
label: /*#__PURE__*/React.createElement(Line, {
direction: "row",
align: "center"
}, /*#__PURE__*/React.createElement("div", {
style: {
width: 14,
height: 4,
background: theme.palette.text.default.primary
}
}), /*#__PURE__*/React.createElement(Type, {
version: "b2"
}, "4")),
value: 4
}, {
label: /*#__PURE__*/React.createElement(Line, {
direction: "row",
align: "center"
}, /*#__PURE__*/React.createElement("div", {
style: {
width: 14,
height: 8,
background: theme.palette.text.default.primary
}
}), /*#__PURE__*/React.createElement(Type, {
version: "b2"
}, "8")),
value: 8
}];
return /*#__PURE__*/React.createElement(Surface, _extends({
ref: item => {
if (ref) {
if (is('function', ref)) ref(item);else ref.current = item;
}
refs.root.current = item;
},
tonal: tonal,
color: color,
version: version,
Component: Component,
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-root', updates && `amaui-Drawing-updates`, actions && `amaui-Drawing-actions`], className, classes.root])
}, other), (updates || actions_) && /*#__PURE__*/React.createElement(Line, _extends({
tonal: tonal,
color: color,
version: version,
gap: 0,
direction: "column",
align: "unset",
justify: "unset",
Component: Surface
}, ToolbarProps, {
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-toolbars'], ToolbarProps?.className, classes.toolbars])
}), updates_ && /*#__PURE__*/React.createElement(Line, _extends({
gap: 2,
direction: "row",
align: "center",
justify: "flex-start"
}, ToolbarUpdatesProps, {
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-toolbar'], ToolbarUpdatesProps?.className, classes.toolbar, classes.toolbar_updates])
}), includes('stroke-width') && /*#__PURE__*/React.createElement(Line, {
gap: 1,
direction: "row",
align: "center",
justify: "flex-start"
}, includes('stroke-width') && /*#__PURE__*/React.createElement(Select, _extends({
label: "Stroke Width",
valueDefault: stroke_width.find(item => String(item.value).includes('1')).value,
value: inputValues['strokeWidth'],
onChange: valueNew => updateInputValues('strokeWidth', valueNew)
}, SelectProps, {
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-select'], SelectProps?.className, classes.select]),
style: {
minWidth: '90px'
}
}), stroke_width.map(item => /*#__PURE__*/React.createElement(ListItem, _extends({
key: item.value,
primary: item.label,
value: item.value,
button: true
}, ListItemProps))))), includes('stroke-color') && /*#__PURE__*/React.createElement(ToggleButtons, ToggleButtonsProps, includes('stroke-color') && /*#__PURE__*/React.createElement(WrapperAppend, {
open: refs.open.current.strokeColor,
anchorElement: refs.elements.strokeColor.current,
element: /*#__PURE__*/React.createElement(ClickListener, {
onClickOutside: () => updateOpen('strokeColor', false),
include: [refs.elements.strokeColor, refs.elements.strokeColor.current]
}, /*#__PURE__*/React.createElement(Palette, _extends({
onClose: () => updateOpen('strokeColor', false),
onUpdate: valueNew => updateInputValues('strokeColor', valueNew)
}, PaletteProps)))
}, /*#__PURE__*/React.createElement(WrapperToggleButton, {
label: "Stroke Color",
open: refs.open.current.strokeColor ? false : undefined
}, is('function', render) ? render('stroke-color', ToggleButtonProps, refs.value.current) : /*#__PURE__*/React.createElement(ToggleButton, _extends({
ref: refs.elements.strokeColor
}, ToggleButtonProps, {
selected: refs.open.current.strokeColor,
onClick: () => updateOpen('strokeColor', !refs.open.current.strokeColor)
}), /*#__PURE__*/React.createElement(IconStrokeColor, IconProps))))), includes('size') && /*#__PURE__*/React.createElement(ToggleButtons, ToggleButtonsProps, includes('size') && /*#__PURE__*/React.createElement(WrapperAppend, {
open: refs.open.current.size,
anchorElement: refs.elements.size.current,
element: /*#__PURE__*/React.createElement(ClickListener, {
onClickOutside: () => updateOpen('size', false),
include: [refs.elements.size]
}, /*#__PURE__*/React.createElement(Line, _extends({
gap: 1,
tonal: tonal,
color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed',
Component: Surface,
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-modal'], classes.modal])
}, SizeProps), /*#__PURE__*/React.createElement(Line, {
gap: 1,
direction: "row",
align: "center",
justify: "center"
}, /*#__PURE__*/React.createElement(NumericTextField, {
label: "Width",
tonal: tonal,
color: color,
size: "small",
version: "outlined",
min: 1,
increment: false,
decrement: false,
value: refs.inputValues.current.widthInput,
onChange: valueNew => updateInputValues('widthInput', !valueNew ? 1 : valueNew)
}), "\xD7", /*#__PURE__*/React.createElement(NumericTextField, {
label: "Height",
tonal: tonal,
color: color,
size: "small",
version: "outlined",
min: 1,
increment: false,
decrement: false,
value: refs.inputValues.current.heightInput,
onChange: valueNew => updateInputValues('heightInput', !valueNew ? 1 : valueNew)
})), /*#__PURE__*/React.createElement(Line, {
gap: 1,
direction: "row",
align: "center",
justify: "flex-end",
style: {
width: '100%'
}
}, /*#__PURE__*/React.createElement(Button, {
tonal: tonal,
color: "inherit",
version: "text",
size: "small",
onClick: () => {
const viewBox_ = refs.inputValues.current.viewBox?.split(' ');
if (viewBox_) {
viewBox_[2] = refs.inputValues.current.widthInput;
viewBox_[3] = refs.inputValues.current.heightInput;
}
updateInputValues('viewBox', viewBox_.join(' '));
updateInputValues('width', refs.inputValues.current.widthInput);
updateInputValues('height', refs.inputValues.current.heightInput);
updateOpen('size', false);
}
}, "Update"))))
}, /*#__PURE__*/React.createElement(WrapperToggleButton, {
label: "Size",
open: refs.open.current.size ? false : undefined
}, is('function', render) ? render('size', ToggleButtonProps, refs.value.current) : /*#__PURE__*/React.createElement(ToggleButton, _extends({
ref: refs.elements.size
}, ToggleButtonProps, {
selected: refs.open.current.size,
onClick: () => updateOpen('size', !refs.open.current.size)
}), /*#__PURE__*/React.createElement(IconSize, IconProps)))))), updates_ && actions_ && /*#__PURE__*/React.createElement(Divider, _extends({}, DividerProps, {
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-divider'], DividerProps?.className, classes.divider, classes.divider_middle])
})), actions_ && /*#__PURE__*/React.createElement(Line, _extends({
gap: 2,
direction: "row",
align: "center",
justify: "flex-start"
}, ToolbarActionsProps, {
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-toolbar'], ToolbarActionsProps?.className, classes.toolbar, classes.toolbar_actions])
}), /*#__PURE__*/React.createElement(Line, {
direction: "row",
align: "center",
justify: "space-between",
style: {
width: '100%'
}
}, /*#__PURE__*/React.createElement(Line, {
gap: 2,
direction: "row",
align: "center",
justify: "flex-start"
}, includes('clear') && /*#__PURE__*/React.createElement(ToggleButtons, ToggleButtonsProps, includes('clear') && /*#__PURE__*/React.createElement(WrapperToggleButton, {
label: "Clear"
}, is('function', render) ? render('clear', ToggleButtonProps, refs.value.current) : /*#__PURE__*/React.createElement(ToggleButton, _extends({}, ToggleButtonProps, {
onClick: onClear
}), /*#__PURE__*/React.createElement(IconClear, IconProps))))), /*#__PURE__*/React.createElement(Line, {
gap: 2,
direction: "row",
align: "center",
justify: "flex-start"
}, includes('download') && /*#__PURE__*/React.createElement(ToggleButtons, ToggleButtonsProps, includes('download') && /*#__PURE__*/React.createElement(WrapperToggleButton, {
label: "Download"
}, is('function', render) ? render('download', ToggleButtonProps, refs.value.current) : /*#__PURE__*/React.createElement(ToggleButton, _extends({}, ToggleButtonProps, {
loading: loading,
onClick: onDownload
}), /*#__PURE__*/React.createElement(IconDownload, IconProps))))))), /*#__PURE__*/React.createElement(Divider, _extends({}, DividerProps, {
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-divider'], DividerProps?.className, classes.divider, classes.divider_end])
}))), /*#__PURE__*/React.createElement("svg", {
ref: item => {
if (svgRef) svgRef.current = item;
refs.svg.current = item;
},
viewBox: refs.inputValues.current.viewBox,
onMouseDown: onMouseDown,
onTouchStart: onMouseDown,
className: classNames([staticClassName('Drawing', theme) && ['amaui-Drawing-svg'], classes.svg]),
style: {
width: refs.inputValues.current.width,
height: refs.inputValues.current.height
}
}, valueNew_.map((item, index) => /*#__PURE__*/React.createElement("path", _extends({
key: index,
fill: "none"
}, item))), /*#__PURE__*/React.createElement("circle", {
className: "amaui-Drawing-pointer",
cx: move?.x,
cy: move?.y,
r: circleStrokeWidth + 1,
fill: refs.inputValues.current.strokeColor
})));
});
Drawing.displayName = 'amaui-Drawing';
export default Drawing;