mirror of
https://github.com/utopia-os/utopia-ui.git
synced 2026-01-20 11:51:26 +00:00
153 lines
3.8 KiB
TypeScript
153 lines
3.8 KiB
TypeScript
import { useState } from 'react'
|
|
|
|
interface Props {
|
|
selectedEmoji: string
|
|
selectedColor: string
|
|
selectedShape: string
|
|
setSelectedEmoji: (emoji: string) => void
|
|
setSelectedColor: (color: string) => void
|
|
setSelectedShape: (shape: string) => void
|
|
}
|
|
|
|
export const EmojiPicker = ({
|
|
selectedEmoji,
|
|
selectedColor,
|
|
selectedShape,
|
|
setSelectedEmoji,
|
|
setSelectedColor,
|
|
setSelectedShape,
|
|
}: Props) => {
|
|
const [isOpen, setIsOpen] = useState(false)
|
|
|
|
const emojis = [
|
|
'❤️',
|
|
'🙏',
|
|
'👍',
|
|
'🌻',
|
|
'✨',
|
|
'☀️',
|
|
'🔥',
|
|
'🪵',
|
|
'💧',
|
|
'🎶',
|
|
'🎨',
|
|
'🍄',
|
|
'📝',
|
|
'✉️',
|
|
'🧩',
|
|
'💡',
|
|
'🎓',
|
|
'💬',
|
|
'🛠',
|
|
'💻',
|
|
'🕹',
|
|
'🖨',
|
|
'🚐',
|
|
'🛒',
|
|
'⚽️',
|
|
'🧵',
|
|
'👀',
|
|
'🌱',
|
|
'🏕',
|
|
'💪',
|
|
'🎁',
|
|
'🏹',
|
|
'🥕',
|
|
'🥇',
|
|
'🥈',
|
|
'🥉',
|
|
]
|
|
const shapes = ['squircle', 'circle', 'hexagon-2']
|
|
|
|
const colors = [
|
|
'#FF99C8',
|
|
'#fff0d6',
|
|
'#FCF6BD',
|
|
'#D0F4DE',
|
|
'#A9DEF9',
|
|
'#E4C1F9',
|
|
'#de324c',
|
|
'#f4895f',
|
|
'#f8e16f',
|
|
'#95cf92',
|
|
'#369acc',
|
|
'#9656a2',
|
|
]
|
|
|
|
const toggleDropdown = () => {
|
|
setIsOpen(!isOpen)
|
|
}
|
|
|
|
const selectEmoji = (emoji: string) => {
|
|
setSelectedEmoji(emoji)
|
|
setIsOpen(false)
|
|
}
|
|
|
|
const selectShape = (shape: string) => {
|
|
setSelectedShape(shape)
|
|
setIsOpen(false)
|
|
}
|
|
|
|
const selectColor = (color: string) => {
|
|
setSelectedColor(color)
|
|
setIsOpen(false)
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<div
|
|
onClick={toggleDropdown}
|
|
className={`tw:cursor-pointer ${selectedEmoji === 'select badge' ? 'tw:text-sm tw:p-9! tw:text-center ' : 'tw:text-6xl'} tw:mask tw:mask-${selectedShape} tw:p-6`}
|
|
style={{ backgroundColor: selectedColor }}
|
|
>
|
|
{selectedEmoji}
|
|
</div>
|
|
|
|
{isOpen && (
|
|
<div className='tw:absolute tw:z-3000 tw:top-0 tw:left-1/2 tw:transform tw:-translate-x-1/2 tw:mt-12 tw:bg-base-100 tw:rounded-2xl tw:shadow-lg tw:p-2 tw:w-full'>
|
|
<div className='tw:grid tw:grid-cols-6 tw:gap-2 tw:pb-2'>
|
|
{emojis.map((emoji) => (
|
|
<button
|
|
key={emoji}
|
|
onClick={() => selectEmoji(emoji)}
|
|
className={`tw:cursor-pointer tw:text-2xl tw:p-2 tw:hover:bg-base-200 tw:rounded-md ${emoji === selectedEmoji ? 'tw:bg-base-300' : ''}`}
|
|
>
|
|
{emoji}
|
|
</button>
|
|
))}
|
|
</div>
|
|
<hr />
|
|
<div className='tw:grid tw:grid-cols-3 tw:gap-2 tw:py-2'>
|
|
{shapes.map((shape) => (
|
|
<div
|
|
key={shape}
|
|
className={`tw:cursor-pointer tw:hover:bg-base-200 tw:rounded-md tw:p-2 ${shape === selectedShape ? 'tw:bg-base-300' : ''}`}
|
|
onClick={() => selectShape(shape)}
|
|
>
|
|
<div
|
|
className={`tw:h-12 tw:w-full tw:mask ${shape === 'squircle' ? 'tw:mask-squircle' : shape === 'circle' ? 'tw:mask-circle' : 'tw:mask-hexagon-2'} tw:bg-neutral-content`}
|
|
></div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
<hr />
|
|
<div className='tw:grid tw:grid-cols-6 tw:gap-2 tw:py-2 tw:px-6'>
|
|
{colors.map((color) => (
|
|
<div
|
|
key={color}
|
|
className={`tw:cursor-pointer tw:hover:bg-base-200 tw:rounded-md tw:p-2 tw:flex tw:justify-center tw:items-center ${color === selectedColor ? 'tw:bg-base-300' : ''}`}
|
|
onClick={() => selectColor(color)}
|
|
>
|
|
<div
|
|
className={`tw:h-8 tw:w-8 tw:rounded-full`}
|
|
style={{ backgroundColor: color }}
|
|
></div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
)}
|
|
</>
|
|
)
|
|
}
|