UNPKG

@amaui/ui-react

Version:
180 lines 7.39 kB
import _extends from "@babel/runtime/helpers/extends"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; const _excluded = ["accordion", "divider", "name", "description", "size", "start", "end", "footer", "onSubmit", "Component", "ComponentForm", "HeaderProps", "TextProps", "AsideProps", "StartProps", "EndProps", "AccordionProps", "AccordionMainProps", "wrapper", "className", "children"]; 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 { is } from '@amaui/utils'; import { classNames, style as styleMethod, useAmauiTheme } from '@amaui/style-react'; import LineElement from '../Line'; import AccordionElement from '../Accordion'; import TypeElement from '../Type'; import { staticClassName } from '../utils'; const useStyle = styleMethod(theme => ({ root: {}, root_accordion: { '&.amaui-Surface-root': { background: 'transparent' } }, aside: { flex: '0 0 auto' }, divider: { position: 'relative', paddingBottom: theme.methods.space.value(4, 'px'), '&::after': { content: "''", position: 'absolute', bottom: '0px', width: '100%', height: '1px', background: theme.palette.text.default.primary, opacity: theme.palette.light ? '0.07' : '0.1' }, '&:last-child': { paddingBottom: 0, '&::after': { display: 'none' } } }, size_small_form_accordion: { marginTop: '16px' }, size_regular_form_accordion: { marginTop: '24px' }, size_large_form_accordion: { marginTop: '32px' } }), { name: 'amaui-Form' }); const Form = /*#__PURE__*/React.forwardRef((props_, ref) => { const theme = useAmauiTheme(); const props = React.useMemo(() => _objectSpread(_objectSpread(_objectSpread({}, theme?.ui?.elements?.all?.props?.default), theme?.ui?.elements?.amauiForm?.props?.default), props_), [props_]); const Line = React.useMemo(() => theme?.elements?.Line || LineElement, [theme]); const Accordion = React.useMemo(() => theme?.elements?.Accordion || AccordionElement, [theme]); const Type = React.useMemo(() => theme?.elements?.Type || TypeElement, [theme]); const { accordion, divider, name, description, size = 'regular', start, end, footer, onSubmit: onSubmit_, Component = Line, ComponentForm: ComponentForm_, HeaderProps, TextProps, AsideProps, StartProps, EndProps, AccordionProps, AccordionMainProps, wrapper, className, children } = props, other = _objectWithoutProperties(props, _excluded); const { classes } = useStyle(); const ComponentForm = ComponentForm_ !== undefined ? ComponentForm_ : wrapper ? 'div' : 'form'; const text = name || description; const actions = start || end; const header = text || actions; let justify = 'unset'; if (start && end && !text) justify = 'space-between'; if (!start && !text && end) justify = 'flex-end'; const onSubmit = ComponentForm === 'form' ? onSubmit_ || React.useCallback(event => { event.preventDefault(); }, []) : undefined; const elements = { name: name && (is('string', name) ? /*#__PURE__*/React.createElement(Type, { version: size === 'large' ? 't1' : size === 'regular' ? 't2' : 't3' }, name) : name), description: description && (is('string', description) ? /*#__PURE__*/React.createElement(Type, { version: size === 'large' ? 'b1' : size === 'regular' ? 'b2' : 'b3' }, description) : description) }; if (accordion) { return /*#__PURE__*/React.createElement(Accordion, _extends({ tonal: true, color: "primary", primary: elements.name, secondary: elements.description, expandedMarginVertical: "none", expandedHeaderPaddingVertical: "none", headerPaddingVertical: "none", headerPaddingHorizontal: "none", mainPaddingVertical: "none", mainPaddingHorizontal: "none", start: start, end: end, HeaderProps: { direction: 'column', gap: size === 'large' ? 1 : size === 'regular' ? 0.5 : 0.5 } }, AccordionProps, { className: classNames([staticClassName('Form', theme) && ['amaui-Form-root'], AccordionProps?.className, className, classes.root, classes.root_accordion, divider && classes.divider]) }, other), /*#__PURE__*/React.createElement(Line, _extends({ ref: ref, gap: size === 'large' ? 3 : size === 'regular' ? 2.5 : 2, direction: "column", justify: "unset", align: "flex-start", Component: ComponentForm, onSubmit: onSubmit, fullWidth: true }, AccordionMainProps, { className: classNames([AccordionMainProps?.className, classes[`size_${size}_form_accordion`]]) }), children, footer && /*#__PURE__*/React.createElement(Line, { direction: "row", justify: "flex-end", fullWidth: true, className: classes.footer }, footer))); } return /*#__PURE__*/React.createElement(Component, _extends({ ref: ref, gap: size === 'large' ? 3 : size === 'regular' ? 2.5 : 2, direction: "column", justify: "unset", align: "flex-start", Component: ComponentForm, onSubmit: onSubmit, fullWidth: true, className: classNames([staticClassName('Form', theme) && ['amaui-Form-root', `amaui-Form-size-${size}`], className, classes.root, divider && classes.divider]) }, other), header && /*#__PURE__*/React.createElement(Line, _extends({ gap: 1, direction: "row", align: "center", justify: justify, fullWidth: true }, HeaderProps), start && /*#__PURE__*/React.createElement(Line, _extends({}, AsideProps, StartProps, { className: classNames([AsideProps?.className, StartProps?.className, classes.aside]) }), start), text && /*#__PURE__*/React.createElement(Line, _extends({ gap: size === 'large' ? 1 : size === 'regular' ? 0.5 : 0.5, direction: "column", flex: true }, TextProps), elements.name, elements.description), end && /*#__PURE__*/React.createElement(Line, _extends({ gap: 0, direction: "row", align: "center" }, AsideProps, EndProps, { className: classNames([AsideProps?.className, EndProps?.className, classes.aside]) }), end)), children, footer && /*#__PURE__*/React.createElement(Line, { direction: "row", justify: "flex-end", fullWidth: true, className: classes.footer }, footer)); }); Form.displayName = 'amaui-Form'; export default Form;