UNPKG

@kobalte/core

Version:

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

116 lines (113 loc) 3.37 kB
import { parseColor } from "../chunk/MABDB67U.jsx"; import { NumberFieldDecrementTrigger, NumberFieldHiddenInput, NumberFieldIncrementTrigger, NumberFieldInput, NumberFieldRoot } from "../chunk/DOJAEHTL.jsx"; import "../chunk/ZAGMEN2K.jsx"; import "../chunk/LR7LBJN3.jsx"; import "../chunk/JHMNWOLY.jsx"; import "../chunk/UKTBL2JL.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-channel-field/color-channel-field-root.tsx import { mergeDefaultProps } from "@kobalte/utils"; import { createMemo, createUniqueId, splitProps } from "solid-js"; function ColorChannelFieldRoot(props) { const defaultId = `colorchannelfield-${createUniqueId()}`; const mergedProps = mergeDefaultProps( { id: defaultId }, props ); const [local, others] = splitProps(mergedProps, [ "value", "defaultValue", "onChange", "channel", "colorSpace" ]); const [value, setValue] = createControllableSignal({ value: () => local.value, defaultValue: () => local.defaultValue ?? parseColor("hsl(0, 100%, 50%)"), onChange: (value2) => local.onChange?.(value2) }); const color = createMemo( () => local.colorSpace ? value().toFormat(local.colorSpace) : value() ); const range = createMemo(() => color().getChannelRange(local.channel)); const formatOptions = createMemo( () => color().getChannelFormatOptions(local.channel) ); const multiplier = createMemo( () => formatOptions().style === "percent" && range().maxValue === 100 ? 100 : 1 ); const onRawValueChange = (value2) => { setValue( color().withChannelValue( local.channel, !Number.isNaN(value2) ? Math.round( Math.max( Math.min(value2 * multiplier(), range().maxValue), range().minValue ) ) : Number.NaN ) ); }; return <NumberFieldRoot rawValue={Number.isNaN(color().getChannelValue(local.channel)) ? void 0 : color().getChannelValue(local.channel) / multiplier()} minValue={range().minValue / multiplier()} maxValue={range().maxValue / multiplier()} step={range().step / multiplier()} formatOptions={formatOptions()} onRawValueChange={onRawValueChange} {...others} />; } // src/color-channel-field/index.tsx var ColorChannelField = Object.assign(ColorChannelFieldRoot, { Description: FormControlDescription, ErrorMessage: FormControlErrorMessage, HiddenInput: NumberFieldHiddenInput, Input: NumberFieldInput, IncrementTrigger: NumberFieldIncrementTrigger, DecrementTrigger: NumberFieldDecrementTrigger, Label: FormControlLabel }); export { ColorChannelField, NumberFieldDecrementTrigger as DecrementTrigger, FormControlDescription as Description, FormControlErrorMessage as ErrorMessage, NumberFieldHiddenInput as HiddenInput, NumberFieldIncrementTrigger as IncrementTrigger, NumberFieldInput as Input, FormControlLabel as Label, ColorChannelFieldRoot as Root };