import { SchemaFieldProps, ColorField as ColorFieldType } from '@vev/utils'; import { SilkeColorPicker } from '../../silke-color-picker'; import React, { useCallback, useRef, useState } from 'react'; import { SilkeBox } from '../../silke-box'; import { SilkeIcon } from '../../silke-icon'; import { getTitle } from './utils/schema-util'; import { SilkeTextFieldOutline } from '../../silke-text-field/silke-text-field-outline'; import { SilkeTextFieldItem } from '../../silke-text-field'; import { SilkePopover } from '../../silke-popover'; import { SilkeCssNumberField } from '../../silke-css-number-field'; import tinycolor from 'tinycolor2'; const ColorField = ({ schema, value, disabled, readonly, onChange, }: SchemaFieldProps) => { const fieldRef = useRef(null); const [open, setOpen] = useState(false); const hasColor = !!value && tinycolor(value).isValid(); const tc = hasColor ? tinycolor(value) : null; const hex = tc ? tc.toHexString().toUpperCase() : ''; const opacity = tc ? Math.round(tc.getAlpha() * 100) : 100; const handleFieldClick = useCallback(() => { if (!disabled) setOpen(true); }, [disabled]); const handleOpacityChange = useCallback( (opStr: string) => { const op = parseFloat(opStr); if (isNaN(op)) return; const tc = tinycolor(value || '#000'); tc.setAlpha(Math.max(0, Math.min(100, op)) / 100); onChange(tc.toHex8String()); }, [value, onChange], ); return ( {hasColor ? (
) : ( )} { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleFieldClick(); } }} > {hasColor ? hex : 'Choose a color'} {hasColor && ( e.stopPropagation()}> )} {open && ( setOpen(false)} > )} ); }; export default ColorField;