UNPKG

@kobalte/core

Version:

Unstyled components and primitives for building accessible web apps and design systems with SolidJS.

155 lines (149 loc) 3.84 kB
import { parseColor } from "../chunk/KNLKPWUU.jsx"; import { TextFieldInput, TextFieldRoot } from "../chunk/MKJEDDFV.jsx"; import "../chunk/LR7LBJN3.jsx"; import "../chunk/NGHEENNE.jsx"; import { FormControlLabel } from "../chunk/FOXVCQFV.jsx"; import "../chunk/QJIB6BDF.jsx"; import { FormControlErrorMessage } from "../chunk/ZZYKR3VO.jsx"; import { FormControlDescription } from "../chunk/XUUROM4M.jsx"; import "../chunk/JNCCF6MP.jsx"; import { createControllableSignal } from "../chunk/FN6EICGO.jsx"; import "../chunk/OYES4GOP.jsx"; import "../chunk/FLVHQV4A.jsx"; import "../chunk/5WXHJDCZ.jsx"; // src/color-field/color-field-input.tsx import { composeEventHandlers } from "@kobalte/utils"; import { splitProps } from "solid-js"; // src/color-field/color-field-context.tsx import { createContext, useContext } from "solid-js"; var ColorFieldContext = createContext(); function useColorFieldContext() { const context = useContext(ColorFieldContext); if (context === void 0) { throw new Error( "[kobalte]: `useColorFieldContext` must be used within a `ColorField` component" ); } return context; } // src/color-field/color-field-input.tsx function ColorFieldInput(props) { const context = useColorFieldContext(); const [local, others] = splitProps(props, ["onBlur"]); return <TextFieldInput autoComplete="off" autoCorrect="off" spellCheck="false" onBlur={composeEventHandlers([local.onBlur, context.onBlur])} {...others} />; } // src/color-field/color-field-root.tsx import { mergeDefaultProps } from "@kobalte/utils"; import { batch, createMemo, createSignal, createUniqueId, splitProps as splitProps2 } from "solid-js"; function ColorFieldRoot(props) { const defaultId = `colorfield-${createUniqueId()}`; const mergedProps = mergeDefaultProps( { id: defaultId }, props ); const [local, others] = splitProps2(mergedProps, [ "value", "defaultValue", "onChange" ]); const defaultValue = createMemo(() => { let defaultValue2 = local.defaultValue; try { defaultValue2 = parseColor( defaultValue2?.startsWith("#") ? defaultValue2 : `#${defaultValue2}` ).toString("hex"); } catch { defaultValue2 = ""; } return defaultValue2; }); const [value, setValue] = createControllableSignal({ value: () => local.value, defaultValue, onChange: (value2) => local.onChange?.(value2) }); const [prevValue, setPrevValue] = createSignal(value()); const onChange = (value2) => { if (isAllowedInput(value2)) { setValue(value2); } }; const onBlur = (e) => { if (!value().length) { setPrevValue(""); return; } let newValue; try { newValue = parseColor( value().startsWith("#") ? value() : `#${value()}` ).toString("hex"); } catch { if (prevValue()) { setValue(prevValue()); } else { setValue(""); } return; } batch(() => { setValue(newValue); setPrevValue(newValue); }); }; const context = { onBlur }; return <ColorFieldContext.Provider value={context}><TextFieldRoot value={value()} defaultValue={defaultValue()} onChange={onChange} {...others} /></ColorFieldContext.Provider>; } function isAllowedInput(value) { return value === "" || !!value.match(/^#?[0-9a-f]{0,6}$/i)?.[0]; } // src/color-field/index.tsx var ColorField = Object.assign(ColorFieldRoot, { Description: FormControlDescription, ErrorMessage: FormControlErrorMessage, Input: ColorFieldInput, Label: FormControlLabel }); export { ColorField, FormControlDescription as Description, FormControlErrorMessage as ErrorMessage, ColorFieldInput as Input, FormControlLabel as Label, ColorFieldRoot as Root, useColorFieldContext };