sanity-plugin-simpler-color-input
Version:
1 lines • 20.8 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/ColorInput.tsx","../src/HighlightColorAnnotation.tsx","../src/schemas/highlightColor.tsx","../src/schemas/simplerColor.tsx","../src/TextColorAnnotation.tsx","../src/schemas/textColor.tsx","../src/index.ts"],"sourcesContent":["import {ChevronDownIcon, SearchIcon} from '@sanity/icons'\nimport {CloseIcon} from '@sanity/icons'\nimport {\n Box,\n Button,\n Card,\n Container,\n Flex,\n Inline,\n Popover,\n Stack,\n Text,\n TextInput,\n} from '@sanity/ui'\nimport {type ColorResult, type HsvaColor} from '@uiw/react-color'\nimport {type RefObject, useCallback, useEffect, useRef, useState} from 'react'\nimport {type ObjectInputProps, type ObjectOptions, type ObjectSchemaType, set, unset} from 'sanity'\n\nexport interface SimplerColorType {\n label: string\n value: string\n _type?: string // included in textColor and highlightColor annotation types\n _key?: string // included in textColor and highlightColor annotation types\n}\n\nexport type ColorFormatType = 'hex' | 'hexa' | 'rgb' | 'rgba' | 'hsl' | 'hsla'\n\nexport interface ColorOptions extends Omit<ObjectOptions, 'columns'> {\n colorList?: Array<SimplerColorType>\n colorFormat?: ColorFormatType\n defaultColorList?: Array<SimplerColorType>\n defaultColorFormat?: ColorFormatType\n enableSearch?: boolean\n showColorValue?: boolean\n}\n\nexport type SimplerColorSchemaType = Omit<ObjectSchemaType, 'options'> & {\n options?: ColorOptions\n}\nexport type SimplerColorInputProps = ObjectInputProps<SimplerColorType, SimplerColorSchemaType>\n\nexport const SimplerColorInput = (props: ObjectInputProps) => {\n const [isOpen, setIsOpen] = useState(false)\n const [pickerIsOpen, setPickerIsOpen] = useState(false)\n const [searchValue, setSearchValue] = useState('')\n const {onChange} = props\n const value = props.value as SimplerColorType | undefined\n const type = props.schemaType as SimplerColorSchemaType\n const showColorValue = Boolean(type.options?.showColorValue ?? true)\n const [selectedColor, setSelectedColor] = useState<Partial<SimplerColorType> | undefined>(value)\n\n const handleChange = useCallback(\n (color: SimplerColorType) => {\n setSelectedColor(color)\n setIsOpen(false)\n onChange(set({...props.value, ...color}))\n },\n [onChange, props.value],\n )\n\n const colorList: SimplerColorType[] =\n type.options?.colorList || type.type?.options?.defaultColorList\n const colorFormat = type.options?.colorFormat ?? type.type?.options?.defaultColorFormat\n const enableSearch = Boolean(type.options?.enableSearch ?? type.type?.options?.enableSearch)\n\n const filteredColorList = searchValue.length\n ? colorList?.filter((color) => {\n return color.label.toLowerCase().includes(searchValue.toLowerCase())\n })\n : colorList\n\n const handlePickerChange = (color: ColorResult) => {\n let colorValue: string\n\n switch (colorFormat) {\n case 'hexa':\n colorValue = color.hexa\n break\n case 'rgb':\n colorValue = `rgb(${color.rgb.r}, ${color.rgb.g}, ${color.rgb.b})`\n break\n case 'rgba':\n colorValue = `rgba(${color.rgba.r}, ${color.rgba.g}, ${\n color.rgba.b\n }, ${color.rgba.a.toFixed(2)})`\n break\n case 'hsl':\n colorValue = `hsl(${color.hsl.h.toFixed(0)}, ${color.hsl.s.toFixed(\n 0,\n )}%, ${color.hsl.l.toFixed(0)}%)`\n break\n case 'hsla':\n colorValue = `hsla(${color.hsla.h.toFixed(0)}, ${color.hsla.s.toFixed(\n 0,\n )}%, ${color.hsla.l.toFixed(0)}%, ${color.hsla.a.toFixed(2)})`\n break\n default:\n colorValue = color.hex\n break\n }\n\n const formattedColor = {\n label: 'Custom',\n value: colorValue,\n }\n setSelectedColor(formattedColor)\n onChange(set({...props.value, ...formattedColor}))\n }\n\n const ref: RefObject<HTMLDivElement> = useRef(null)\n useEffect(() => {\n if (!isOpen) setSearchValue('')\n\n const handleClickOutside = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) {\n setPickerIsOpen(false)\n setIsOpen(false)\n }\n }\n document.addEventListener('click', handleClickOutside, true)\n return () => {\n document.removeEventListener('click', handleClickOutside, true)\n }\n }, [isOpen, pickerIsOpen, ref])\n\n /* @ts-expect-error we can assume type exists */\n const isRequired: boolean = type.validation[0]._required === 'required'\n\n const [Component, setComponent] = useState(<div>Loading...</div>)\n\n useEffect(() => {\n import('@uiw/react-color').then((module) => {\n const {Chrome, rgbStringToHsva, hslStringToHsva} = module\n\n // convert rgb and hsl strings to hsva so they can be read by the picker successfully\n let pickerColor: string | HsvaColor = selectedColor?.value || '#ffffff'\n if (pickerColor.startsWith('rgb')) pickerColor = rgbStringToHsva(pickerColor)\n else if (pickerColor.startsWith('hsl')) pickerColor = hslStringToHsva(pickerColor)\n\n setComponent(\n <Container>\n <Popover\n ref={ref}\n content={\n <Chrome\n onChange={handlePickerChange}\n color={pickerColor}\n showAlpha={colorFormat ? colorFormat.slice(-1) === 'a' : false}\n />\n }\n portal\n open={pickerIsOpen}\n >\n <Flex>\n <Button\n style={{\n width: '100%',\n textAlign: 'center',\n borderTopRightRadius: isRequired ? '' : '0',\n borderBottomRightRadius: isRequired ? '' : '0',\n flexShrink: 1,\n overflow: 'hidden',\n }}\n mode=\"ghost\"\n padding={2}\n onClick={() =>\n colorList && colorList.length > 0\n ? setIsOpen(!isOpen)\n : setPickerIsOpen(!pickerIsOpen)\n }\n >\n <Flex justify=\"center\" gap={4}>\n <Flex align=\"center\" gap={1} overflow=\"hidden\">\n <Box style={{flexShrink: 0}}>\n <Card\n style={{backgroundColor: selectedColor?.value || '#ffffff'}}\n radius={2}\n shadow={1}\n padding={2}\n margin={1}\n />\n </Box>\n <Box style={{...(showColorValue && {flexShrink: 0})}}>\n <Text weight=\"semibold\" textOverflow=\"ellipsis\">\n {selectedColor?.label || 'Select a color...'}{' '}\n </Text>\n </Box>\n {showColorValue && (\n <Box>\n <Text textOverflow=\"ellipsis\">{selectedColor?.value}</Text>\n </Box>\n )}\n </Flex>\n <ChevronDownIcon style={{flexShrink: 0}} width={32} height={32} />\n </Flex>\n </Button>\n {!isRequired && (\n <Button\n mode=\"ghost\"\n onClick={() => {\n if (value !== undefined && value._key) {\n // we need to handle annotations differently to\n // prevent errors in the Portable Text editor\n const annotationValue = {_type: value._type, _key: value._key}\n setSelectedColor(annotationValue)\n onChange(set(annotationValue))\n } else {\n setSelectedColor(undefined)\n onChange(unset())\n }\n }}\n style={{borderTopLeftRadius: '0', borderBottomLeftRadius: '0'}}\n >\n <Inline space={1}>\n <CloseIcon width={24} height={24} />\n <Text weight=\"semibold\">Clear</Text>\n </Inline>\n </Button>\n )}\n </Flex>\n </Popover>\n {isOpen && colorList && (\n <Card radius={2} shadow={3} marginTop={1} overflow=\"hidden\">\n {enableSearch && (\n <Box\n padding={3}\n style={{\n borderBottom: '1px solid var(--card-border-color)',\n }}\n >\n <TextInput\n icon={SearchIcon}\n radius={2}\n placeholder=\"Search\"\n onChange={(event) => {\n setSearchValue(event.currentTarget.value)\n }}\n autoFocus\n />\n </Box>\n )}\n <Stack>\n {filteredColorList?.map((color: SimplerColorType) =>\n color.value === 'custom' ? (\n <Button\n key={color.label}\n radius={0}\n mode=\"bleed\"\n onClick={() => {\n setIsOpen(false)\n setPickerIsOpen(true)\n }}\n >\n <Text>{color.label}</Text>\n </Button>\n ) : (\n <Button\n key={color.label}\n radius={0}\n mode=\"bleed\"\n onClick={() => handleChange(color)}\n >\n <Box>\n <Inline space={3}>\n <Card\n style={{backgroundColor: color.value, width: '16px', height: '16px'}}\n radius={2}\n shadow={1}\n />\n <Text>{color.label}</Text>\n </Inline>\n </Box>\n </Button>\n ),\n )}\n </Stack>\n </Card>\n )}\n </Container>,\n )\n })\n }, [isOpen, selectedColor, searchValue, pickerIsOpen])\n\n return Component\n}\n","import {type BlockAnnotationProps} from 'sanity'\nimport styled from 'styled-components'\n\nconst ColorSpan = styled.span<{color: string}>`\n & > span {\n background-color: ${({color}) => color};\n border-bottom: unset;\n color: inherit;\n }\n`\n\nexport const HighlightColorAnnotation = (props: BlockAnnotationProps) => (\n <ColorSpan color={(props.value?.['value'] as unknown as string) || ''}>\n {props.renderDefault(props)}\n </ColorSpan>\n)\n","import {BiHighlight} from 'react-icons/bi'\nimport {defineType} from 'sanity'\n\nimport {SimplerColorInput} from '../ColorInput'\nimport {HighlightColorAnnotation} from '../HighlightColorAnnotation'\n\nexport const highlightColor = defineType({\n title: 'Highlight color',\n type: 'object',\n name: 'highlightColor',\n icon: BiHighlight,\n components: {\n annotation: HighlightColorAnnotation,\n input: SimplerColorInput,\n },\n fields: [\n {\n name: 'label',\n type: 'string',\n },\n {\n name: 'value',\n type: 'string',\n },\n ],\n})\n","import {defineType} from 'sanity'\n\nimport {SimplerColorInput} from '../ColorInput'\n\nexport const simplerColor = defineType({\n title: 'Simpler Color',\n type: 'object',\n name: 'simplerColor',\n components: {input: SimplerColorInput},\n fields: [\n {\n name: 'label',\n type: 'string',\n },\n {\n name: 'value',\n type: 'string',\n },\n ],\n})\n","import {type BlockAnnotationProps} from 'sanity'\nimport styled from 'styled-components'\n\nconst ColorSpan = styled.span<{color: string}>`\n & > span {\n background-color: inherit;\n border-bottom: unset;\n color: ${({color}) => color};\n }\n`\n\nexport const TextColorAnnotation = (props: BlockAnnotationProps) => (\n <ColorSpan color={(props.value?.['value'] as unknown as string) || ''}>\n {props.renderDefault(props)}\n </ColorSpan>\n)\n","import {BiFontColor} from 'react-icons/bi'\nimport {defineType} from 'sanity'\n\nimport {SimplerColorInput} from '../ColorInput'\nimport {TextColorAnnotation} from '../TextColorAnnotation'\n\nexport const textColor = defineType({\n title: 'Text color',\n type: 'object',\n name: 'textColor',\n icon: BiFontColor,\n components: {\n annotation: TextColorAnnotation,\n input: SimplerColorInput,\n },\n fields: [\n {\n name: 'label',\n type: 'string',\n },\n {\n name: 'value',\n type: 'string',\n },\n ],\n})\n","import {definePlugin} from 'sanity'\n\nimport {type ColorFormatType} from './ColorInput'\nimport {highlightColor} from './schemas/highlightColor'\nimport {simplerColor} from './schemas/simplerColor'\nimport {textColor} from './schemas/textColor'\n\ninterface SimplerColorInputConfig {\n defaultColorList?: Array<{label: string; value: string}>\n defaultColorFormat?: ColorFormatType // defaults to 'hex'\n enableSearch?: boolean // defaults to false\n showColorValue?: boolean // default to true\n}\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {simplerColorInput} from 'sanity-plugin-simpler-color-input'\n *\n * export default defineConfig({\n * // ...\n * plugins: [simplerColorInput()],\n * })\n * ```\n */\nexport const simplerColorInput = definePlugin<SimplerColorInputConfig | void>((options) => {\n return {\n name: 'sanity-plugin-simpler-color-input',\n schema: {\n types: [\n {...simplerColor, options},\n {...textColor, options},\n {...highlightColor, options},\n ],\n },\n }\n})\n\nexport type {SimplerColorInputProps, SimplerColorSchemaType, SimplerColorType} from './ColorInput'\nexport {SimplerColorInput} from './ColorInput'\n"],"names":["ColorSpan"],"mappings":"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"}