UNPKG

braid-design-system

Version:
214 lines (213 loc) • 8.16 kB
"use strict"; const jsxRuntime = require("react/jsx-runtime"); const react = require("react"); const lib_components_Box_BackgroundContext_cjs = require("../../Box/BackgroundContext.cjs"); const lib_components_Box_Box_cjs = require("../../Box/Box.cjs"); const lib_components_private_FieldOverlay_FieldOverlay_cjs = require("../FieldOverlay/FieldOverlay.cjs"); const lib_components_private_buildDataAttributes_cjs = require("../buildDataAttributes.cjs"); const lib_components_private_validateTabIndex_cjs = require("../validateTabIndex.cjs"); const lib_components_private_InlineField_InlineField_css_cjs = require("./InlineField.css.cjs"); const lib_components_icons_IconMinus_IconMinus_cjs = require("../../icons/IconMinus/IconMinus.cjs"); const lib_components_icons_IconTick_IconTick_cjs = require("../../icons/IconTick/IconTick.cjs"); const tones = ["neutral", "critical"]; const Indicator = ({ type, checked, hover = false, disabled = false }) => { const isCheckbox = type === "checkbox"; const iconTone = (() => { if (disabled) { return "secondary"; } if (hover) { return "formAccent"; } })(); return isCheckbox ? /* @__PURE__ */ jsxRuntime.jsxs( lib_components_Box_Box_cjs.Box, { height: "full", transition: "fast", position: "relative", className: lib_components_private_InlineField_InlineField_css_cjs.checkboxIndicator, children: [ /* @__PURE__ */ jsxRuntime.jsx( lib_components_Box_Box_cjs.Box, { position: "absolute", inset: 0, transition: "fast", opacity: checked !== "mixed" ? 0 : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(lib_components_icons_IconMinus_IconMinus_cjs.IconMinus, { size: "fill", tone: iconTone }) } ), /* @__PURE__ */ jsxRuntime.jsx( lib_components_Box_Box_cjs.Box, { position: "absolute", inset: 0, transition: "fast", opacity: checked !== true ? 0 : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(lib_components_icons_IconTick_IconTick_cjs.IconTick, { size: "fill", tone: iconTone }) } ) ] } ) : /* @__PURE__ */ jsxRuntime.jsx( lib_components_Box_Box_cjs.Box, { background: !disabled ? "formAccent" : void 0, transition: "fast", width: "full", height: "full", borderRadius: "full", className: [ lib_components_private_InlineField_InlineField_css_cjs.radioIndicator, disabled ? lib_components_private_InlineField_InlineField_css_cjs.disabledRadioIndicator : void 0 ] } ); }; const StyledInput = react.forwardRef( ({ id, name, value, checked, data, onChange, type, tone = "neutral", disabled = false, required, tabIndex, size = "standard", "aria-describedby": ariaDescribedBy, "aria-labelledby": ariaLabelledBy, "aria-label": ariaLabel, ...restProps }, forwardedRef) => { const defaultRef = react.useRef(null); const ref = forwardedRef || defaultRef; if (tones.indexOf(tone) === -1) { throw new Error(`Invalid tone: ${tone}`); } if (process.env.NODE_ENV !== "production") { lib_components_private_validateTabIndex_cjs.validateTabIndex(tabIndex); } const isCheckbox = type === "checkbox"; const fieldBorderRadius = isCheckbox ? "standard" : "full"; const accentBackground = disabled ? "neutralLight" : "formAccent"; const isMixed = isCheckbox && checked === "mixed"; const fieldBackground = disabled ? { lightMode: "neutralSoft", darkMode: "neutral" } : { lightMode: "surface" }; const defaultBorder = checked ? "formAccent" : "default"; const indeterminateRef = react.useRef(isMixed); const lastChecked = react.useRef(null); indeterminateRef.current = isMixed; if (isCheckbox && checked !== lastChecked.current && ref && typeof ref === "object" && ref.current) { ref.current.indeterminate = indeterminateRef.current; } react.useEffect(() => { if (isCheckbox && ref && typeof ref === "object" && ref.current) { ref.current.indeterminate = indeterminateRef.current; } }, [ref, isCheckbox]); react.useEffect(() => { if (isCheckbox) { lastChecked.current = checked; } }, [isCheckbox, checked]); const { lightMode } = lib_components_Box_BackgroundContext_cjs.useBackgroundLightness(); return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [ /* @__PURE__ */ jsxRuntime.jsx( lib_components_Box_Box_cjs.Box, { component: "input", type, id, name, value, onChange: (e) => { if (isMixed) { e.currentTarget.indeterminate = isMixed; } if (typeof onChange === "function") { onChange(e); } }, checked: checked === "mixed" ? false : checked, position: "absolute", zIndex: 1, className: [ lib_components_private_InlineField_InlineField_css_cjs.realField, lib_components_private_InlineField_InlineField_css_cjs.sizeVars[size], isMixed ? lib_components_private_InlineField_InlineField_css_cjs.isMixed : void 0 ], cursor: !disabled ? "pointer" : void 0, opacity: 0, "aria-describedby": ariaDescribedBy, "aria-labelledby": ariaLabelledBy, "aria-label": ariaLabel, "aria-checked": isMixed ? "mixed" : checked, "aria-required": required, disabled, ref, tabIndex, ...lib_components_private_buildDataAttributes_cjs.buildDataAttributes({ data, validateRestProps: restProps }) } ), /* @__PURE__ */ jsxRuntime.jsxs( lib_components_Box_Box_cjs.Box, { flexShrink: 0, position: "relative", className: [lib_components_private_InlineField_InlineField_css_cjs.fakeField, lib_components_private_InlineField_InlineField_css_cjs.sizeVars[size]], background: fieldBackground, borderRadius: fieldBorderRadius, children: [ /* @__PURE__ */ jsxRuntime.jsx( lib_components_private_FieldOverlay_FieldOverlay_cjs.FieldOverlay, { background: isCheckbox ? accentBackground : void 0, borderRadius: fieldBorderRadius, className: lib_components_private_InlineField_InlineField_css_cjs.selected, children: /* @__PURE__ */ jsxRuntime.jsx(Indicator, { type, disabled, checked }) } ), /* @__PURE__ */ jsxRuntime.jsx( lib_components_private_FieldOverlay_FieldOverlay_cjs.FieldOverlay, { variant: disabled ? "disabled" : defaultBorder, borderRadius: fieldBorderRadius, visible: type === "radio" || !checked || disabled, className: { [lib_components_private_InlineField_InlineField_css_cjs.hideBorderOnDarkBackgroundInLightMode]: lightMode === "dark" } } ), /* @__PURE__ */ jsxRuntime.jsx( lib_components_private_FieldOverlay_FieldOverlay_cjs.FieldOverlay, { variant: "critical", borderRadius: fieldBorderRadius, visible: tone === "critical" && !disabled } ), /* @__PURE__ */ jsxRuntime.jsx( lib_components_private_FieldOverlay_FieldOverlay_cjs.FieldOverlay, { variant: "formAccent", borderRadius: fieldBorderRadius, className: lib_components_private_InlineField_InlineField_css_cjs.hoverOverlay, children: /* @__PURE__ */ jsxRuntime.jsx(Indicator, { type, hover: true, checked: true }) } ) ] } ) ] }); } ); exports.StyledInput = StyledInput;