UNPKG

@yamada-ui/form-control

Version:

Yamada UI form control component

387 lines (386 loc) • 13.1 kB
"use client" "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/form-control.tsx var form_control_exports = {}; __export(form_control_exports, { ErrorMessage: () => ErrorMessage, FormControl: () => FormControl, FormControlContextProvider: () => FormControlContextProvider, FormControlStylesProvider: () => FormControlStylesProvider, HelperMessage: () => HelperMessage, Label: () => Label, RequiredIndicator: () => RequiredIndicator, formControlProperties: () => formControlProperties, getFormControlProperties: () => getFormControlProperties, useFormControl: () => useFormControl, useFormControlContext: () => useFormControlContext, useFormControlProps: () => useFormControlProps, useFormControlStyles: () => useFormControlStyles }); module.exports = __toCommonJS(form_control_exports); var import_core = require("@yamada-ui/core"); var import_utils = require("@yamada-ui/utils"); var import_react = require("react"); var import_jsx_runtime = require("react/jsx-runtime"); var [FormControlContextProvider, useFormControlContext] = (0, import_utils.createContext)({ name: "FormControlContext", strict: false }); var [FormControlStylesProvider, useFormControlStyles] = (0, import_utils.createContext)({ name: "FormControlStyleContext", strict: false }); var FormControl = (0, import_core.forwardRef)( ({ id, ...props }, ref) => { const [styles, mergedProps] = (0, import_core.useComponentMultiStyle)("FormControl", props); const uuid = (0, import_react.useId)(); const labelId = (0, import_react.useId)(); const { className, children, isDisabled = false, disabled = isDisabled, errorMessage, helperMessage, isInvalid = false, invalid = isInvalid, isReadOnly = false, isReplace = true, isRequired = false, label, optionalIndicator, readOnly = isReadOnly, replace = isReplace, required = isRequired, requiredIndicator, errorMessageProps, helperMessageProps, labelProps, ...rest } = (0, import_core.omitThemeProps)(mergedProps); const [focused, setFocused] = (0, import_react.useState)(false); const validChildren = (0, import_utils.getValidChildren)(children); const customLabel = (0, import_utils.findChild)(validChildren, Label); const customHelperMessage = (0, import_utils.findChild)(validChildren, HelperMessage); const customErrorMessage = (0, import_utils.findChild)(validChildren, ErrorMessage); const isCustomLabel = !!customLabel; const isCustomHelperMessage = !!customHelperMessage; const isCustomErrorMessage = !!customErrorMessage; const css = { ...styles.container }; id != null ? id : id = uuid; return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( FormControlContextProvider, { value: { id, disabled, focused, invalid, labelId, readOnly, replace, required, onBlur: () => setFocused(false), onFocus: () => setFocused(true) }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FormControlStylesProvider, { value: styles, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)( import_core.ui.div, { ref, className: (0, import_utils.cx)("ui-form__control", className), "data-disabled": (0, import_utils.dataAttr)(disabled), "data-focus": (0, import_utils.dataAttr)(focused), "data-invalid": (0, import_utils.dataAttr)(invalid), "data-readonly": (0, import_utils.dataAttr)(readOnly), __css: css, ...rest, children: [ !isCustomLabel && label ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)( Label, { optionalIndicator, requiredIndicator, ...labelProps, children: label } ) : null, children, !isCustomHelperMessage && helperMessage ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HelperMessage, { ...helperMessageProps, children: helperMessage }) : null, !isCustomErrorMessage && errorMessage ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ErrorMessage, { ...errorMessageProps, children: errorMessage }) : null ] } ) }) } ); } ); FormControl.displayName = "FormControl"; FormControl.__ui__ = "FormControl"; var useFormControl = ({ id: idProp, disabled: disabledProp, invalid: invalidProp, isDisabled: isDisabledProp, isInvalid: isInvalidProp, isReadOnly: isReadOnlyProp, isRequired: isRequiredProp, readOnly: readOnlyProp, required: requiredProp, ...rest }) => { var _a, _b, _c, _d; const control = useFormControlContext(); const id = idProp != null ? idProp : control == null ? void 0 : control.id; const labelId = control == null ? void 0 : control.labelId; const disabled = (_a = disabledProp != null ? disabledProp : isDisabledProp) != null ? _a : control == null ? void 0 : control.disabled; const readOnly = (_b = readOnlyProp != null ? readOnlyProp : isReadOnlyProp) != null ? _b : control == null ? void 0 : control.readOnly; const required = (_c = requiredProp != null ? requiredProp : isRequiredProp) != null ? _c : control == null ? void 0 : control.required; const invalid = (_d = invalidProp != null ? invalidProp : isInvalidProp) != null ? _d : control == null ? void 0 : control.invalid; return { id, disabled, invalid, /** * @deprecated Use `disabled` instead. */ isDisabled: disabled, /** * @deprecated Use `invalid` instead. */ isInvalid: invalid, /** * @deprecated Use `readOnly` instead. */ isReadOnly: readOnly, /** * @deprecated Use `required` instead. */ isRequired: required, labelId, readOnly, required, ...rest }; }; var useFormControlProps = ({ id, disabled, invalid, isDisabled, isInvalid, isReadOnly, isRequired, readOnly, required, onBlur, onFocus, ...rest }) => { const control = useFormControlContext(); disabled != null ? disabled : disabled = isDisabled != null ? isDisabled : control == null ? void 0 : control.disabled; required != null ? required : required = isRequired != null ? isRequired : control == null ? void 0 : control.required; readOnly != null ? readOnly : readOnly = isReadOnly != null ? isReadOnly : control == null ? void 0 : control.readOnly; invalid != null ? invalid : invalid = isInvalid != null ? isInvalid : control == null ? void 0 : control.invalid; return { id: id != null ? id : control == null ? void 0 : control.id, "aria-disabled": (0, import_utils.ariaAttr)(disabled), "aria-invalid": (0, import_utils.ariaAttr)(invalid), "aria-readonly": (0, import_utils.ariaAttr)(readOnly), "aria-required": (0, import_utils.ariaAttr)(required), "data-readonly": (0, import_utils.dataAttr)(readOnly), disabled, readOnly, required, onBlur: (0, import_utils.handlerAll)(control == null ? void 0 : control.onBlur, onBlur), onFocus: (0, import_utils.handlerAll)(control == null ? void 0 : control.onFocus, onFocus), ...disabled || readOnly ? { _active: {}, _focus: {}, _focusVisible: {}, _hover: {}, _invalid: {} } : {}, ...rest }; }; var formControlProperties = [ "disabled", "required", "readOnly", "aria-disabled", "aria-readonly", "aria-required", "aria-invalid", "data-readonly", "onFocus", "onBlur", "_hover", "_active", "_focus", "_invalid", "_focusVisible" ]; var getFormControlProperties = ({ omit = [], pick = [] } = {}) => { let result = [...formControlProperties]; if (pick.length) { result = result.filter((property) => pick.includes(property)); } if (omit.length) { result = result.filter((property) => !omit.includes(property)); } return result; }; var Label = (0, import_core.forwardRef)( ({ id, htmlFor, className, children, isRequired, optionalIndicator = null, required: requiredProp = isRequired, requiredIndicator = null, ...rest }, ref) => { var _a, _b; const { id: formControlId, disabled, focused, invalid, labelId, readOnly, required } = (_a = useFormControlContext()) != null ? _a : {}; const styles = (_b = useFormControlStyles()) != null ? _b : {}; const css = { display: "block", pointerEvents: readOnly ? "none" : void 0, ...styles.label }; id != null ? id : id = labelId; requiredProp != null ? requiredProp : requiredProp = required; return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)( import_core.ui.label, { id, ref, htmlFor: htmlFor != null ? htmlFor : formControlId, className: (0, import_utils.cx)("ui-form__label", className), style: { cursor: disabled ? "not-allowed" : void 0 }, "data-disabled": (0, import_utils.dataAttr)(disabled), "data-focus": (0, import_utils.dataAttr)(focused), "data-invalid": (0, import_utils.dataAttr)(invalid), "data-readonly": (0, import_utils.dataAttr)(readOnly), __css: css, ...rest, children: [ children, requiredProp ? requiredIndicator ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RequiredIndicator, { children: requiredIndicator }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RequiredIndicator, {}) : optionalIndicator ] } ); } ); Label.displayName = "Label"; Label.__ui__ = "Label"; var RequiredIndicator = (0, import_core.forwardRef)( ({ className, children, ...rest }, ref) => { var _a; const styles = (_a = useFormControlStyles()) != null ? _a : {}; const css = { ...styles.requiredIndicator }; return !(0, import_react.isValidElement)(children) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)( import_core.ui.span, { ref, className: (0, import_utils.cx)("ui-form__required-indicator", className), "aria-hidden": true, role: "presentation", __css: css, ...rest, children: children != null ? children : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: "*" }) } ) : children; } ); RequiredIndicator.displayName = "RequiredIndicator"; RequiredIndicator.__ui__ = "RequiredIndicator"; var HelperMessage = (0, import_core.forwardRef)( ({ className, ...rest }, ref) => { var _a, _b; const { id, invalid, replace } = (_a = useFormControlContext()) != null ? _a : {}; const styles = (_b = useFormControlStyles()) != null ? _b : {}; const css = { ...styles.helperMessage }; if (replace && invalid) return null; return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( import_core.ui.span, { ref, className: (0, import_utils.cx)("ui-form__helper-message", className), "aria-describedby": id, __css: css, ...rest } ); } ); HelperMessage.displayName = "HelperMessage"; HelperMessage.__ui__ = "HelperMessage"; var ErrorMessage = (0, import_core.forwardRef)( ({ className, ...rest }, ref) => { var _a, _b; const { invalid } = (_a = useFormControlContext()) != null ? _a : {}; const styles = (_b = useFormControlStyles()) != null ? _b : {}; const css = { ...styles.errorMessage }; if (!invalid) return null; return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( import_core.ui.span, { ref, className: (0, import_utils.cx)("ui-form__error-message", className), "aria-live": "polite", __css: css, ...rest } ); } ); ErrorMessage.displayName = "ErrorMessage"; ErrorMessage.__ui__ = "ErrorMessage"; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ErrorMessage, FormControl, FormControlContextProvider, FormControlStylesProvider, HelperMessage, Label, RequiredIndicator, formControlProperties, getFormControlProperties, useFormControl, useFormControlContext, useFormControlProps, useFormControlStyles }); //# sourceMappingURL=form-control.js.map