{
  "version": 3,
  "sources": ["../../../src/index.ts", "../../../src/EmojiPicker.tsx"],
  "sourcesContent": ["export * from './EmojiPicker';\n", "import type {\n  JSX,\n  Resource,\n} from 'solid-js';\nimport {\n  For,\n  Show,\n  createMemo,\n  createResource,\n} from 'solid-js';\n\nconst ORIGIN_GROUP_DATA_KEY = 'data-by-group.json';\nconst ORIGIN_COMPONENTS_KEY = 'data-emoji-components.json';\nconst ORIGIN_EMOJI_KEY = 'data-by-emoji.json';\nconst CDN_URL = 'https://unpkg.com/unicode-emoji-json@0.6.0/';\n\nlet GROUP_DATA_KEY = `${CDN_URL}${ORIGIN_GROUP_DATA_KEY}`;\nlet COMPONENTS_KEY = `${CDN_URL}${ORIGIN_COMPONENTS_KEY}`;\nlet EMOJI_KEY = `${CDN_URL}${ORIGIN_EMOJI_KEY}`;\n\nexport function setCDN(url: string): void {\n  GROUP_DATA_KEY = `${url}${ORIGIN_GROUP_DATA_KEY}`;\n  COMPONENTS_KEY = `${url}${ORIGIN_COMPONENTS_KEY}`;\n  EMOJI_KEY = `${url}${ORIGIN_EMOJI_KEY}`;\n}\n\nexport function setComponentsURL(url: string): void {\n  COMPONENTS_KEY = url;\n}\n\nexport function setEmojiURL(url: string): void {\n  EMOJI_KEY = url;\n}\n\nexport function setEmojiGroupURL(url: string): void {\n  GROUP_DATA_KEY = url;\n}\n\nexport interface Emoji {\n  emoji: string;\n  skin_tone_support: boolean;\n  name: string;\n  slug: string;\n  unicode_version: string;\n  emoji_version: string;\n}\n\nexport type EmojiData = Record<string, Emoji>;\n\nexport interface EmojiGroupData {\n  name: string;\n  slug: string;\n  emojis: Emoji[];\n}\n\nexport type EmojiComponents = Record<string, string>;\n\nlet EMOJI_DATA: EmojiData | undefined;\nlet EMOJI_COMPONENTS: EmojiComponents | undefined;\nlet EMOJI_GROUP_DATA: EmojiGroupData[] | undefined;\n\nexport async function loadEmojiData(): Promise<EmojiData> {\n  if (!EMOJI_DATA) {\n    const response = await fetch(EMOJI_KEY);\n    EMOJI_DATA = await response.json() as EmojiData;\n  }\n  return EMOJI_DATA;\n}\n\nexport async function loadEmojiGroupData(): Promise<EmojiGroupData[]> {\n  if (!EMOJI_GROUP_DATA) {\n    const response = await fetch(GROUP_DATA_KEY);\n    EMOJI_GROUP_DATA = await response.json() as EmojiGroupData[];\n  }\n  return EMOJI_GROUP_DATA;\n}\n\nexport async function loadEmojiComponents(): Promise<EmojiComponents> {\n  if (!EMOJI_COMPONENTS) {\n    const response = await fetch(COMPONENTS_KEY);\n    EMOJI_COMPONENTS = await response.json() as EmojiComponents;\n  }\n  return EMOJI_COMPONENTS;\n}\n\nexport function setEmojiData(data: EmojiData): void {\n  EMOJI_DATA = data;\n}\n\nexport function setEmojiComponents(data: EmojiComponents): void {\n  EMOJI_COMPONENTS = data;\n}\n\nexport function useEmojiData(): Resource<EmojiData | undefined> {\n  const [data] = createResource<EmojiData>(loadEmojiData);\n  return data;\n}\n\nexport function useEmojiComponents(): Resource<EmojiComponents | undefined> {\n  const [data] = createResource<EmojiComponents>(loadEmojiComponents);\n  return data;\n}\n\nexport function useEmojiGroupData(): Resource<EmojiGroupData[] | undefined> {\n  const [data] = createResource<EmojiGroupData[]>(loadEmojiGroupData);\n  return data;\n}\n\nexport type EmojiSkinTone =\n  | 'light'\n  | 'medium-light'\n  | 'medium'\n  | 'medium-dark'\n  | 'dark';\n\nconst SKIN_TONE_TO_COMPONENT: Record<EmojiSkinTone, string> = {\n  light: 'light_skin_tone',\n  'medium-light': 'medium_light_skin_tone',\n  medium: 'medium_skin_tone',\n  'medium-dark': 'medium_dark_skin_tone',\n  dark: 'dark_skin_tone',\n};\n\nexport function convertSkinToneToComponent(\n  components: EmojiComponents,\n  skinTone?: EmojiSkinTone,\n): string | undefined {\n  if (skinTone) {\n    return components[SKIN_TONE_TO_COMPONENT[skinTone]];\n  }\n  return undefined;\n}\n\nconst VARIATION = '\\uFE0F';\nconst ZWJ = '\\u200D';\n\nexport function getEmojiWithSkinTone(\n  emojis: EmojiData,\n  emoji: Emoji,\n  skinTone?: string,\n): string {\n  if (!(skinTone && emoji.skin_tone_support)) {\n    return emoji.emoji;\n  }\n  const emojiWithSkinTone = emoji.emoji.split(ZWJ)\n    .map((chunk) => {\n      if (chunk in emojis && emojis[chunk].skin_tone_support) {\n        return `${chunk}${skinTone}`;\n      }\n      return chunk;\n    })\n    .join(ZWJ);\n\n  const emojiWithoutVariation = emojiWithSkinTone.replaceAll(`${VARIATION}${skinTone}`, `${skinTone}`);\n\n  return emojiWithoutVariation;\n}\n\nfunction DEFAULT_EMOJI_RENDER(\n  emojis: EmojiData,\n  emoji: Emoji,\n  components: EmojiComponents,\n  skinTone?: EmojiSkinTone,\n): JSX.Element {\n  return (\n    <span class=\"emoji\">\n      {getEmojiWithSkinTone(\n        emojis,\n        emoji,\n        convertSkinToneToComponent(components, skinTone),\n      )}\n    </span>\n  );\n}\n\nexport type EmojiEventHandler<T extends Event> = (emoji: Emoji, event: T & {\n  currentTarget: HTMLButtonElement;\n  target: Element;\n}) => void;\n\nexport interface EmojiPickerProps {\n  skinTone?: EmojiSkinTone;\n  filter?: (emoji: Emoji) => boolean;\n  renderEmoji?: (\n    emojis: EmojiData,\n    emoji: Emoji,\n    components: EmojiComponents,\n    skinTone?: EmojiSkinTone,\n  ) => JSX.Element;\n  onEmojiClick?: EmojiEventHandler<MouseEvent>;\n  onEmojiFocus?: EmojiEventHandler<FocusEvent>;\n  onEmojiHover?: EmojiEventHandler<MouseEvent>;\n}\n\nexport function EmojiPicker(props: EmojiPickerProps): JSX.Element {\n  const emojiData = useEmojiData();\n  const componentData = useEmojiComponents();\n  const emojiGroupData = useEmojiGroupData();\n\n  const renderEmoji = createMemo(() => props.renderEmoji || DEFAULT_EMOJI_RENDER);\n\n  return (\n    <div class=\"emoji-picker\">\n      {createMemo(() => {\n        const emoji = emojiData();\n        const components = componentData();\n        const emojiGroup = emojiGroupData();\n\n        if (emoji && components && emojiGroup) {\n          return (\n            <For each={emojiGroup}>\n              {(group): JSX.Element => (\n                <div class=\"emoji-section\">\n                  <span class=\"emoji-section-title\">{group.name}</span>\n                  <div class=\"emoji-items\">\n                    <For each={group.emojis}>\n                      {(emojiItem): JSX.Element => (\n                        <Show when={props.filter ? props.filter(emojiItem) : true}>\n                          <button\n                            type=\"button\"\n                            class=\"emoji-button\"\n                            onClick={props.onEmojiClick && [props.onEmojiClick, emojiItem]}\n                            onFocus={props.onEmojiFocus && [props.onEmojiFocus, emojiItem]}\n                            onMouseOver={props.onEmojiHover && [props.onEmojiHover, emojiItem]}\n                            title={emojiItem.name}\n                          >\n                            {renderEmoji()(emoji, emojiItem, components, props.skinTone)}\n                          </button>\n                        </Show>\n                      )}\n                    </For>\n                  </div>\n                </div>\n              )}\n            </For>\n          );\n        }\n\n        return null;\n      })() }\n    </div>\n  );\n}\n"],
  "mappings": "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",
  "names": []
}
