emoji-picker-react 4.9.4 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"emoji-picker-react.cjs.production.min.js","sources":["../src/DomUtils/classNames.ts","../src/Stylesheet/stylesheet.tsx","../src/config/compareConfig.ts","../src/components/Reactions/DEFAULT_REACTIONS.ts","../src/types/exposedTypes.ts","../src/config/categoryConfig.ts","../src/dataUtils/DataTypes.ts","../src/data/skinToneVariations.ts","../src/dataUtils/alphaNumericEmojiIndex.ts","../src/dataUtils/emojiSelectors.ts","../src/config/cdnUrls.ts","../src/config/config.ts","../src/components/context/PickerConfigContext.tsx","../src/config/useConfig.ts","../src/config/mutableConfig.ts","../src/hooks/useDebouncedState.ts","../src/hooks/useDisallowedEmojis.ts","../src/components/context/PickerContext.tsx","../src/hooks/useInitialLoad.ts","../src/hooks/useIsSearchMode.ts","../src/DomUtils/focusElement.ts","../src/DomUtils/getActiveElement.ts","../src/components/context/ElementRefContext.tsx","../src/hooks/useKeyboardNavigation.ts","../src/DomUtils/scrollTo.ts","../src/DomUtils/selectors.ts","../src/DomUtils/keyboardNavigation.ts","../src/hooks/useCloseAllOpenToggles.ts","../src/hooks/useDisallowMouseMove.ts","../src/hooks/useFocus.ts","../src/hooks/useFilter.ts","../src/hooks/useSetVariationPicker.ts","../src/hooks/useShouldShowSkinTonePicker.ts","../src/DomUtils/elementPositionInRow.ts","../src/hooks/preloadEmoji.ts","../src/components/main/PickerMain.tsx","../src/hooks/useOnFocus.ts","../src/dataUtils/parseNativeEmoji.ts","../src/dataUtils/suggested.ts","../src/typeRefinements/typeRefinements.ts","../src/hooks/useMouseDownHandlers.ts","../src/components/atoms/Button.tsx","../src/components/emoji/ClickableEmojiButton.tsx","../src/components/emoji/emojiStyles.ts","../src/components/emoji/EmojiImg.tsx","../src/components/emoji/NativeEmoji.tsx","../src/components/emoji/ViewOnlyEmoji.tsx","../src/components/emoji/Emoji.tsx","../src/components/Reactions/BtnPlus.tsx","../src/components/Reactions/Reactions.tsx","../src/components/body/EmojiCategory.tsx","../src/hooks/useIsEverMounted.ts","../src/components/body/Suggested.tsx","../src/components/body/EmojiList.tsx","../src/hooks/useHideEmojisByUniocode.ts","../src/hooks/useIsEmojiHidden.ts","../src/components/body/EmojiVariationPicker.tsx","../src/components/body/Body.tsx","../src/hooks/useOnScroll.ts","../src/components/Layout/Flex.tsx","../src/components/Layout/Space.tsx","../src/components/Layout/Absolute.tsx","../src/components/Layout/Relative.tsx","../src/components/header/SkinTonePicker/BtnSkinToneVariation.tsx","../src/components/header/SkinTonePicker/SkinTonePicker.tsx","../src/components/footer/Preview.tsx","../src/hooks/useEmojiPreviewEvents.ts","../src/DomUtils/detectEmojyPartiallyBelowFold.ts","../src/components/navigation/CategoryButton.tsx","../src/components/navigation/CategoryNavigation.tsx","../src/hooks/useScrollCategoryIntoView.ts","../src/hooks/useActiveCategoryScrollDetection.ts","../src/DomUtils/categoryNameFromDom.ts","../src/hooks/useShouldHideCustomEmojis.ts","../src/components/header/Search/BtnClearSearch.tsx","../src/components/header/Search/CssSearch.tsx","../src/components/header/Search/IcnSearch.tsx","../src/components/header/Search/Search.tsx","../src/components/header/Header.tsx","../src/EmojiPickerReact.tsx","../src/components/ErrorBoundary.tsx","../src/components/emoji/ExportedEmoji.tsx","../src/index.tsx"],"sourcesContent":["export enum ClassNames {\n hiddenOnSearch = 'epr-hidden-on-search',\n searchActive = 'epr-search-active',\n hidden = 'epr-hidden',\n visible = 'epr-visible',\n active = 'epr-active',\n emoji = 'epr-emoji',\n category = 'epr-emoji-category',\n label = 'epr-emoji-category-label',\n categoryContent = 'epr-emoji-category-content',\n emojiHasVariations = 'epr-emoji-has-variations',\n scrollBody = 'epr-body',\n emojiList = 'epr-emoji-list',\n external = '__EmojiPicker__',\n emojiPicker = 'EmojiPickerReact',\n open = 'epr-open',\n vertical = 'epr-vertical',\n horizontal = 'epr-horizontal',\n variationPicker = 'epr-emoji-variation-picker',\n darkTheme = 'epr-dark-theme',\n autoTheme = 'epr-auto-theme'\n}\n\nexport function asSelectors(...classNames: ClassNames[]): string {\n return classNames.map(c => `.${c}`).join('');\n}\n","import { Styles, createSheet } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../DomUtils/classNames';\n\nexport const stylesheet = createSheet('epr', null);\n\nconst hidden = {\n display: 'none',\n opacity: '0',\n pointerEvents: 'none',\n visibility: 'hidden',\n overflow: 'hidden'\n};\n\nexport const commonStyles = stylesheet.create({\n hidden: {\n '.': ClassNames.hidden,\n ...hidden\n }\n});\n\nexport const PickerStyleTag = React.memo(function PickerStyleTag() {\n return (\n <style\n suppressHydrationWarning\n dangerouslySetInnerHTML={{ __html: stylesheet.getStyle() }}\n />\n );\n});\n\nexport const commonInteractionStyles = stylesheet.create({\n '.epr-main': {\n ':has(input:not(:placeholder-shown))': {\n categoryBtn: {\n ':hover': {\n opacity: '1',\n backgroundPositionY: 'var(--epr-category-navigation-button-size)'\n }\n },\n hiddenOnSearch: {\n '.': ClassNames.hiddenOnSearch,\n ...hidden\n }\n },\n ':has(input(:placeholder-shown))': {\n visibleOnSearchOnly: hidden\n }\n },\n hiddenOnReactions: {\n transition: 'all 0.5s ease-in-out'\n },\n '.epr-reactions': {\n hiddenOnReactions: {\n height: '0px',\n width: '0px',\n opacity: '0',\n pointerEvents: 'none',\n overflow: 'hidden'\n }\n },\n '.EmojiPickerReact:not(.epr-search-active)': {\n categoryBtn: {\n ':hover': {\n opacity: '1',\n backgroundPositionY: 'var(--epr-category-navigation-button-size)'\n },\n '&.epr-active': {\n opacity: '1',\n backgroundPositionY: 'var(--epr-category-navigation-button-size)'\n }\n },\n visibleOnSearchOnly: {\n '.': 'epr-visible-on-search-only',\n ...hidden\n }\n }\n});\n\nexport function darkMode(key: string, value: Styles) {\n return {\n '.epr-dark-theme': {\n [key]: value\n },\n '.epr-auto-theme': {\n [key]: {\n '@media (prefers-color-scheme: dark)': value\n }\n }\n };\n}\n","import { PickerConfig } from './config';\n\n// eslint-disable-next-line complexity\nexport function compareConfig(prev: PickerConfig, next: PickerConfig) {\n const prevCustomEmojis = prev.customEmojis ?? [];\n const nextCustomEmojis = next.customEmojis ?? [];\n return (\n prev.open === next.open &&\n prev.emojiVersion === next.emojiVersion &&\n prev.reactionsDefaultOpen === next.reactionsDefaultOpen &&\n prev.searchPlaceHolder === next.searchPlaceHolder &&\n prev.searchPlaceholder === next.searchPlaceholder &&\n prev.defaultSkinTone === next.defaultSkinTone &&\n prev.skinTonesDisabled === next.skinTonesDisabled &&\n prev.autoFocusSearch === next.autoFocusSearch &&\n prev.emojiStyle === next.emojiStyle &&\n prev.theme === next.theme &&\n prev.suggestedEmojisMode === next.suggestedEmojisMode &&\n prev.lazyLoadEmojis === next.lazyLoadEmojis &&\n prev.className === next.className &&\n prev.height === next.height &&\n prev.width === next.width &&\n prev.style === next.style &&\n prev.searchDisabled === next.searchDisabled &&\n prev.skinTonePickerLocation === next.skinTonePickerLocation &&\n prevCustomEmojis.length === nextCustomEmojis.length\n );\n}","export const DEFAULT_REACTIONS = [\n '1f44d', // 👍\n '2764-fe0f', // ❤️\n '1f603', // 😃\n '1f622', // 😢\n '1f64f', // 🙏\n '1f44e', // 👎\n '1f621' // 😡\n];\n","export type EmojiClickData = {\n activeSkinTone: SkinTones;\n unified: string;\n unifiedWithoutSkinTone: string;\n emoji: string;\n names: string[];\n imageUrl: string;\n getImageUrl: (emojiStyle?: EmojiStyle) => string;\n isCustom: boolean;\n};\n\nexport enum SuggestionMode {\n RECENT = 'recent',\n FREQUENT = 'frequent'\n}\n\nexport enum EmojiStyle {\n NATIVE = 'native',\n APPLE = 'apple',\n TWITTER = 'twitter',\n GOOGLE = 'google',\n FACEBOOK = 'facebook'\n}\n\nexport enum Theme {\n DARK = 'dark',\n LIGHT = 'light',\n AUTO = 'auto'\n}\n\nexport enum SkinTones {\n NEUTRAL = 'neutral',\n LIGHT = '1f3fb',\n MEDIUM_LIGHT = '1f3fc',\n MEDIUM = '1f3fd',\n MEDIUM_DARK = '1f3fe',\n DARK = '1f3ff'\n}\n\nexport enum Categories {\n SUGGESTED = 'suggested',\n CUSTOM = 'custom',\n SMILEYS_PEOPLE = 'smileys_people',\n ANIMALS_NATURE = 'animals_nature',\n FOOD_DRINK = 'food_drink',\n TRAVEL_PLACES = 'travel_places',\n ACTIVITIES = 'activities',\n OBJECTS = 'objects',\n SYMBOLS = 'symbols',\n FLAGS = 'flags'\n}\n\nexport enum SkinTonePickerLocation {\n SEARCH = 'SEARCH',\n PREVIEW = 'PREVIEW'\n}\n","import { Categories, SuggestionMode } from '../types/exposedTypes';\n\nexport { Categories };\n\nconst categoriesOrdered: Categories[] = [\n Categories.SUGGESTED,\n Categories.CUSTOM,\n Categories.SMILEYS_PEOPLE,\n Categories.ANIMALS_NATURE,\n Categories.FOOD_DRINK,\n Categories.TRAVEL_PLACES,\n Categories.ACTIVITIES,\n Categories.OBJECTS,\n Categories.SYMBOLS,\n Categories.FLAGS\n];\n\nexport const SuggestedRecent: CategoryConfig = {\n name: 'Recently Used',\n category: Categories.SUGGESTED\n};\n\nexport type CustomCategoryConfig = {\n category: Categories.CUSTOM;\n name: string;\n};\n\nconst configByCategory: Record<Categories, CategoryConfig> = {\n [Categories.SUGGESTED]: {\n category: Categories.SUGGESTED,\n name: 'Frequently Used'\n },\n [Categories.CUSTOM]: {\n category: Categories.CUSTOM,\n name: 'Custom Emojis'\n },\n [Categories.SMILEYS_PEOPLE]: {\n category: Categories.SMILEYS_PEOPLE,\n name: 'Smileys & People'\n },\n [Categories.ANIMALS_NATURE]: {\n category: Categories.ANIMALS_NATURE,\n name: 'Animals & Nature'\n },\n [Categories.FOOD_DRINK]: {\n category: Categories.FOOD_DRINK,\n name: 'Food & Drink'\n },\n [Categories.TRAVEL_PLACES]: {\n category: Categories.TRAVEL_PLACES,\n name: 'Travel & Places'\n },\n [Categories.ACTIVITIES]: {\n category: Categories.ACTIVITIES,\n name: 'Activities'\n },\n [Categories.OBJECTS]: {\n category: Categories.OBJECTS,\n name: 'Objects'\n },\n [Categories.SYMBOLS]: {\n category: Categories.SYMBOLS,\n name: 'Symbols'\n },\n [Categories.FLAGS]: {\n category: Categories.FLAGS,\n name: 'Flags'\n }\n};\n\nexport function baseCategoriesConfig(\n modifiers?: Record<Categories, CategoryConfig>\n): CategoriesConfig {\n return categoriesOrdered.map(category => {\n return {\n ...configByCategory[category],\n ...(modifiers && modifiers[category] && modifiers[category])\n };\n });\n}\n\nexport function categoryFromCategoryConfig(category: CategoryConfig) {\n return category.category;\n}\n\nexport function categoryNameFromCategoryConfig(category: CategoryConfig) {\n return category.name;\n}\n\nexport type CategoriesConfig = CategoryConfig[];\n\nexport type CategoryConfig = {\n category: Categories;\n name: string;\n};\n\nexport type UserCategoryConfig = Array<Categories | CategoryConfig>;\n\nexport function mergeCategoriesConfig(\n userCategoriesConfig: UserCategoryConfig = [],\n modifiers: CategoryConfigModifiers = {}\n): CategoriesConfig {\n const extra = {} as Record<Categories, CategoryConfig>;\n\n if (modifiers.suggestionMode === SuggestionMode.RECENT) {\n extra[Categories.SUGGESTED] = SuggestedRecent;\n }\n\n const base = baseCategoriesConfig(extra);\n if (!userCategoriesConfig?.length) {\n return base;\n }\n\n return userCategoriesConfig.map(category => {\n if (typeof category === 'string') {\n return getBaseConfigByCategory(category, extra[category]);\n }\n\n return {\n ...getBaseConfigByCategory(category.category, extra[category.category]),\n ...category\n };\n });\n}\n\nfunction getBaseConfigByCategory(\n category: Categories,\n modifier: CategoryConfig = {} as CategoryConfig\n) {\n return Object.assign(configByCategory[category], modifier);\n}\n\ntype CategoryConfigModifiers = {\n suggestionMode?: SuggestionMode;\n};\n","import emojis from '../data/emojis';\n\nexport enum EmojiProperties {\n name = 'n',\n unified = 'u',\n variations = 'v',\n added_in = 'a',\n imgUrl = 'imgUrl'\n}\n\nexport interface DataEmoji extends WithName {\n [EmojiProperties.unified]: string;\n [EmojiProperties.variations]?: string[];\n [EmojiProperties.added_in]: string;\n [EmojiProperties.imgUrl]?: string;\n}\n\nexport type DataEmojis = DataEmoji[];\n\nexport type DataGroups = keyof typeof emojis;\n\nexport type WithName = {\n [EmojiProperties.name]: string[];\n};\n","import { SkinTones } from '../types/exposedTypes';\n\nconst skinToneVariations = [\n SkinTones.NEUTRAL,\n SkinTones.LIGHT,\n SkinTones.MEDIUM_LIGHT,\n SkinTones.MEDIUM,\n SkinTones.MEDIUM_DARK,\n SkinTones.DARK\n];\n\nexport const skinTonesNamed = Object.entries(SkinTones).reduce(\n (acc, [key, value]) => {\n acc[value] = key;\n return acc;\n },\n {} as Record<string, string>\n);\n\nexport const skinTonesMapped: Record<\n string,\n string\n> = skinToneVariations.reduce(\n (mapped, skinTone) =>\n Object.assign(mapped, {\n [skinTone]: skinTone\n }),\n {}\n);\n\nexport default skinToneVariations;\n","import { DataEmoji } from './DataTypes';\nimport { allEmojis, emojiNames, emojiUnified } from './emojiSelectors';\n\nexport const alphaNumericEmojiIndex: BaseIndex = {};\n\nsetTimeout(() => {\n allEmojis.reduce((searchIndex, emoji) => {\n indexEmoji(emoji);\n return searchIndex;\n }, alphaNumericEmojiIndex as BaseIndex);\n});\n\ntype BaseIndex = Record<string, Record<string, DataEmoji>>;\n\nexport function indexEmoji(emoji: DataEmoji): void {\n const joinedNameString = emojiNames(emoji)\n .flat()\n .join('')\n .toLowerCase()\n .replace(/[^a-zA-Z\\d]/g, '')\n .split('');\n\n joinedNameString.forEach(char => {\n alphaNumericEmojiIndex[char] = alphaNumericEmojiIndex[char] ?? {};\n\n alphaNumericEmojiIndex[char][emojiUnified(emoji)] = emoji;\n });\n}\n","import { Categories } from '../config/categoryConfig';\nimport { cdnUrl } from '../config/cdnUrls';\nimport { CustomEmoji } from '../config/customEmojiConfig';\nimport emojis from '../data/emojis';\nimport skinToneVariations, {\n skinTonesMapped\n} from '../data/skinToneVariations';\nimport { EmojiStyle, SkinTones } from '../types/exposedTypes';\n\nimport { DataEmoji, DataEmojis, EmojiProperties, WithName } from './DataTypes';\nimport { indexEmoji } from './alphaNumericEmojiIndex';\n\nexport function emojiNames(emoji: WithName): string[] {\n return emoji[EmojiProperties.name] ?? [];\n}\n\nexport function addedIn(emoji: DataEmoji): number {\n return parseFloat(emoji[EmojiProperties.added_in]);\n}\n\nexport function emojiName(emoji?: WithName): string {\n if (!emoji) {\n return '';\n }\n\n return emojiNames(emoji)[0];\n}\n\nexport function unifiedWithoutSkinTone(unified: string): string {\n const splat = unified.split('-');\n const [skinTone] = splat.splice(1, 1);\n\n if (skinTonesMapped[skinTone]) {\n return splat.join('-');\n }\n\n return unified;\n}\n\nexport function emojiUnified(emoji: DataEmoji, skinTone?: string): string {\n const unified = emoji[EmojiProperties.unified];\n\n if (!skinTone || !emojiHasVariations(emoji)) {\n return unified;\n }\n\n return emojiVariationUnified(emoji, skinTone) ?? unified;\n}\n\nexport function emojisByCategory(category: Categories): DataEmojis {\n // @ts-ignore\n return emojis?.[category] ?? [];\n}\n\n// WARNING: DO NOT USE DIRECTLY\nexport function emojiUrlByUnified(\n unified: string,\n emojiStyle: EmojiStyle\n): string {\n return `${cdnUrl(emojiStyle)}${unified}.png`;\n}\n\nexport function emojiVariations(emoji: DataEmoji): string[] {\n return emoji[EmojiProperties.variations] ?? [];\n}\n\nexport function emojiHasVariations(emoji: DataEmoji): boolean {\n return emojiVariations(emoji).length > 0;\n}\n\nexport function emojiVariationUnified(\n emoji: DataEmoji,\n skinTone?: string\n): string | undefined {\n return skinTone\n ? emojiVariations(emoji).find(variation => variation.includes(skinTone))\n : emojiUnified(emoji);\n}\n\nexport function emojiByUnified(unified?: string): DataEmoji | undefined {\n if (!unified) {\n return;\n }\n\n if (allEmojisByUnified[unified]) {\n return allEmojisByUnified[unified];\n }\n\n const withoutSkinTone = unifiedWithoutSkinTone(unified);\n return allEmojisByUnified[withoutSkinTone];\n}\n\nexport const allEmojis: DataEmojis = Object.values(emojis).flat();\n\nexport function setCustomEmojis(customEmojis: CustomEmoji[]): void {\n emojis[Categories.CUSTOM].length = 0;\n\n customEmojis.forEach(emoji => {\n const emojiData = customToRegularEmoji(emoji);\n\n emojis[Categories.CUSTOM].push(emojiData as never);\n\n if (allEmojisByUnified[emojiData[EmojiProperties.unified]]) {\n return;\n }\n\n allEmojis.push(emojiData);\n allEmojisByUnified[emojiData[EmojiProperties.unified]] = emojiData;\n indexEmoji(emojiData);\n });\n}\n\nfunction customToRegularEmoji(emoji: CustomEmoji): DataEmoji {\n return {\n [EmojiProperties.name]: emoji.names.map(name => name.toLowerCase()),\n [EmojiProperties.unified]: emoji.id.toLowerCase(),\n [EmojiProperties.added_in]: '0',\n [EmojiProperties.imgUrl]: emoji.imgUrl\n };\n}\n\nconst allEmojisByUnified: {\n [unified: string]: DataEmoji;\n} = {};\n\nsetTimeout(() => {\n allEmojis.reduce((allEmojis, Emoji) => {\n allEmojis[emojiUnified(Emoji)] = Emoji;\n\n if (emojiHasVariations(Emoji)) {\n emojiVariations(Emoji).forEach(variation => {\n allEmojis[variation] = Emoji;\n });\n }\n\n return allEmojis;\n }, allEmojisByUnified);\n});\n\nexport function activeVariationFromUnified(unified: string): SkinTones | null {\n const [, suspectedSkinTone] = unified.split('-') as [string, SkinTones];\n return skinToneVariations.includes(suspectedSkinTone)\n ? suspectedSkinTone\n : null;\n}\n","import { EmojiStyle } from '../types/exposedTypes';\n\nconst CDN_URL_APPLE =\n 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/';\nconst CDN_URL_FACEBOOK =\n 'https://cdn.jsdelivr.net/npm/emoji-datasource-facebook/img/facebook/64/';\nconst CDN_URL_TWITTER =\n 'https://cdn.jsdelivr.net/npm/emoji-datasource-twitter/img/twitter/64/';\nconst CDN_URL_GOOGLE =\n 'https://cdn.jsdelivr.net/npm/emoji-datasource-google/img/google/64/';\n\nexport function cdnUrl(emojiStyle: EmojiStyle): string {\n switch (emojiStyle) {\n case EmojiStyle.TWITTER:\n return CDN_URL_TWITTER;\n case EmojiStyle.GOOGLE:\n return CDN_URL_GOOGLE;\n case EmojiStyle.FACEBOOK:\n return CDN_URL_FACEBOOK;\n case EmojiStyle.APPLE:\n default:\n return CDN_URL_APPLE;\n }\n}\n","import * as React from 'react';\n\nimport { DEFAULT_REACTIONS } from '../components/Reactions/DEFAULT_REACTIONS';\nimport { GetEmojiUrl } from '../components/emoji/BaseEmojiProps';\nimport {\n setCustomEmojis,\n emojiUrlByUnified\n} from '../dataUtils/emojiSelectors';\nimport {\n EmojiClickData,\n EmojiStyle,\n SkinTonePickerLocation,\n SkinTones,\n SuggestionMode,\n Theme\n} from '../types/exposedTypes';\n\nimport {\n CategoriesConfig,\n baseCategoriesConfig,\n mergeCategoriesConfig\n} from './categoryConfig';\nimport { CustomEmoji } from './customEmojiConfig';\n\nconst KNOWN_FAILING_EMOJIS = ['2640-fe0f', '2642-fe0f', '2695-fe0f'];\n\nexport const DEFAULT_SEARCH_PLACEHOLDER = 'Search';\nexport const SEARCH_RESULTS_NO_RESULTS_FOUND = 'No results found';\nexport const SEARCH_RESULTS_SUFFIX =\n ' found. Use up and down arrow keys to navigate.';\nexport const SEARCH_RESULTS_ONE_RESULT_FOUND =\n '1 result' + SEARCH_RESULTS_SUFFIX;\nexport const SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND =\n '%n results' + SEARCH_RESULTS_SUFFIX;\n\nexport function mergeConfig(\n userConfig: PickerConfig = {}\n): PickerConfigInternal {\n const base = basePickerConfig();\n\n const previewConfig = Object.assign(\n base.previewConfig,\n userConfig.previewConfig ?? {}\n );\n const config = Object.assign(base, userConfig);\n\n const categories = mergeCategoriesConfig(userConfig.categories, {\n suggestionMode: config.suggestedEmojisMode\n });\n\n setCustomEmojis(config.customEmojis ?? []);\n\n const skinTonePickerLocation = config.searchDisabled\n ? SkinTonePickerLocation.PREVIEW\n : config.skinTonePickerLocation;\n\n return {\n ...config,\n categories,\n previewConfig,\n skinTonePickerLocation\n };\n}\n\nexport function basePickerConfig(): PickerConfigInternal {\n return {\n autoFocusSearch: true,\n categories: baseCategoriesConfig(),\n className: '',\n customEmojis: [],\n defaultSkinTone: SkinTones.NEUTRAL,\n emojiStyle: EmojiStyle.APPLE,\n emojiVersion: null,\n getEmojiUrl: emojiUrlByUnified,\n height: 450,\n lazyLoadEmojis: false,\n previewConfig: {\n ...basePreviewConfig\n },\n searchDisabled: false,\n searchPlaceHolder: DEFAULT_SEARCH_PLACEHOLDER,\n searchPlaceholder: DEFAULT_SEARCH_PLACEHOLDER,\n skinTonePickerLocation: SkinTonePickerLocation.SEARCH,\n skinTonesDisabled: false,\n style: {},\n suggestedEmojisMode: SuggestionMode.FREQUENT,\n theme: Theme.LIGHT,\n unicodeToHide: new Set<string>(KNOWN_FAILING_EMOJIS),\n width: 350,\n reactionsDefaultOpen: false,\n reactions: DEFAULT_REACTIONS,\n open: true,\n allowExpandReactions: true\n };\n}\n\nexport type PickerConfigInternal = {\n emojiVersion: string | null;\n searchPlaceHolder: string;\n searchPlaceholder: string;\n defaultSkinTone: SkinTones;\n skinTonesDisabled: boolean;\n autoFocusSearch: boolean;\n emojiStyle: EmojiStyle;\n categories: CategoriesConfig;\n theme: Theme;\n suggestedEmojisMode: SuggestionMode;\n lazyLoadEmojis: boolean;\n previewConfig: PreviewConfig;\n className: string;\n height: PickerDimensions;\n width: PickerDimensions;\n style: React.CSSProperties;\n getEmojiUrl: GetEmojiUrl;\n searchDisabled: boolean;\n skinTonePickerLocation: SkinTonePickerLocation;\n unicodeToHide: Set<string>;\n customEmojis: CustomEmoji[];\n reactionsDefaultOpen: boolean;\n reactions: string[];\n open: boolean;\n allowExpandReactions: boolean;\n};\n\nexport type PreviewConfig = {\n defaultEmoji: string;\n defaultCaption: string;\n showPreview: boolean;\n};\n\nconst basePreviewConfig: PreviewConfig = {\n defaultEmoji: '1f60a',\n defaultCaption: \"What's your mood?\",\n showPreview: true\n};\n\ntype ConfigExternal = {\n previewConfig: Partial<PreviewConfig>;\n onEmojiClick: MouseDownEvent;\n onReactionClick: MouseDownEvent;\n onSkinToneChange: OnSkinToneChange;\n} & Omit<PickerConfigInternal, 'previewConfig' | 'unicodeToHide'>;\n\nexport type PickerConfig = Partial<ConfigExternal>;\n\nexport type PickerDimensions = string | number;\n\nexport type MouseDownEvent = (emoji: EmojiClickData, event: MouseEvent) => void;\nexport type OnSkinToneChange = (emoji: SkinTones) => void;\n","import * as React from 'react';\n\nimport { compareConfig } from '../../config/compareConfig';\nimport {\n basePickerConfig,\n mergeConfig,\n PickerConfig,\n PickerConfigInternal\n} from '../../config/config';\n\ntype Props = PickerConfig &\n Readonly<{\n children: React.ReactNode;\n }>;\n\nconst ConfigContext = React.createContext<PickerConfigInternal>(\n basePickerConfig()\n);\n\nexport function PickerConfigProvider({ children, ...config }: Props) {\n const mergedConfig = useSetConfig(config);\n\n return (\n <ConfigContext.Provider value={mergedConfig}>\n {children}\n </ConfigContext.Provider>\n );\n}\n\nexport function useSetConfig(config: PickerConfig) {\n const [mergedConfig, setMergedConfig] = React.useState(() =>\n mergeConfig(config)\n );\n\n React.useEffect(() => {\n if (compareConfig(mergedConfig, config)) {\n return;\n }\n setMergedConfig(mergeConfig(config));\n // not gonna...\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n config.customEmojis?.length,\n config.open,\n config.emojiVersion,\n config.reactionsDefaultOpen,\n config.searchPlaceHolder,\n config.searchPlaceholder,\n config.defaultSkinTone,\n config.skinTonesDisabled,\n config.autoFocusSearch,\n config.emojiStyle,\n config.theme,\n config.suggestedEmojisMode,\n config.lazyLoadEmojis,\n config.className,\n config.height,\n config.width,\n config.searchDisabled,\n config.skinTonePickerLocation,\n config.allowExpandReactions\n ]);\n\n return mergedConfig;\n}\n\nexport function usePickerConfig() {\n return React.useContext(ConfigContext);\n}\n","import * as React from 'react';\n\nimport { usePickerConfig } from '../components/context/PickerConfigContext';\nimport {\n EmojiClickData,\n EmojiStyle,\n SkinTonePickerLocation,\n SkinTones,\n SuggestionMode,\n Theme\n} from '../types/exposedTypes';\n\nimport { CategoriesConfig } from './categoryConfig';\nimport {\n DEFAULT_SEARCH_PLACEHOLDER,\n SEARCH_RESULTS_NO_RESULTS_FOUND,\n SEARCH_RESULTS_ONE_RESULT_FOUND,\n SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND,\n PickerDimensions,\n PreviewConfig\n} from './config';\nimport { CustomEmoji } from './customEmojiConfig';\nimport { useMutableConfig } from './mutableConfig';\n\nexport enum MOUSE_EVENT_SOURCE {\n REACTIONS = 'reactions',\n PICKER = 'picker'\n}\n\nexport function useSearchPlaceHolderConfig(): string {\n const { searchPlaceHolder, searchPlaceholder } = usePickerConfig();\n return (\n [searchPlaceHolder, searchPlaceholder].find(\n p => p !== DEFAULT_SEARCH_PLACEHOLDER\n ) ?? DEFAULT_SEARCH_PLACEHOLDER\n );\n}\n\nexport function useDefaultSkinToneConfig(): SkinTones {\n const { defaultSkinTone } = usePickerConfig();\n return defaultSkinTone;\n}\n\nexport function useAllowExpandReactions(): boolean {\n const { allowExpandReactions } = usePickerConfig();\n return allowExpandReactions;\n}\n\nexport function useSkinTonesDisabledConfig(): boolean {\n const { skinTonesDisabled } = usePickerConfig();\n return skinTonesDisabled;\n}\n\nexport function useEmojiStyleConfig(): EmojiStyle {\n const { emojiStyle } = usePickerConfig();\n return emojiStyle;\n}\n\nexport function useAutoFocusSearchConfig(): boolean {\n const { autoFocusSearch } = usePickerConfig();\n return autoFocusSearch;\n}\n\nexport function useCategoriesConfig(): CategoriesConfig {\n const { categories } = usePickerConfig();\n return categories;\n}\n\nexport function useCustomEmojisConfig(): CustomEmoji[] {\n const { customEmojis } = usePickerConfig();\n return customEmojis;\n}\n\nexport function useOpenConfig(): boolean {\n const { open } = usePickerConfig();\n return open;\n}\n\nexport function useOnEmojiClickConfig(\n mouseEventSource: MOUSE_EVENT_SOURCE\n): (emoji: EmojiClickData, event: MouseEvent) => void {\n const { current } = useMutableConfig();\n\n const handler =\n (mouseEventSource === MOUSE_EVENT_SOURCE.REACTIONS\n ? current.onReactionClick\n : current.onEmojiClick) ?? current.onEmojiClick;\n\n return handler || (() => {});\n}\n\nexport function useOnSkinToneChangeConfig(\n): (skinTone: SkinTones) => void {\n const { current } = useMutableConfig();\n\n return current.onSkinToneChange || (() => {});\n}\n\nexport function usePreviewConfig(): PreviewConfig {\n const { previewConfig } = usePickerConfig();\n return previewConfig;\n}\n\nexport function useThemeConfig(): Theme {\n const { theme } = usePickerConfig();\n\n return theme;\n}\n\nexport function useSuggestedEmojisModeConfig(): SuggestionMode {\n const { suggestedEmojisMode } = usePickerConfig();\n return suggestedEmojisMode;\n}\n\nexport function useLazyLoadEmojisConfig(): boolean {\n const { lazyLoadEmojis } = usePickerConfig();\n return lazyLoadEmojis;\n}\n\nexport function useClassNameConfig(): string {\n const { className } = usePickerConfig();\n return className;\n}\n\nexport function useStyleConfig(): React.CSSProperties {\n const { height, width, style } = usePickerConfig();\n return { height: getDimension(height), width: getDimension(width), ...style };\n}\n\nexport function useReactionsOpenConfig(): boolean {\n const { reactionsDefaultOpen } = usePickerConfig();\n return reactionsDefaultOpen;\n}\n\nexport function useEmojiVersionConfig(): string | null {\n const { emojiVersion } = usePickerConfig();\n return emojiVersion;\n}\n\nexport function useSearchDisabledConfig(): boolean {\n const { searchDisabled } = usePickerConfig();\n return searchDisabled;\n}\n\nexport function useSkinTonePickerLocationConfig(): SkinTonePickerLocation {\n const { skinTonePickerLocation } = usePickerConfig();\n return skinTonePickerLocation;\n}\n\nexport function useUnicodeToHide() {\n const { unicodeToHide } = usePickerConfig();\n return unicodeToHide;\n}\n\nexport function useReactionsConfig(): string[] {\n const { reactions } = usePickerConfig();\n return reactions;\n}\n\nexport function useGetEmojiUrlConfig(): (\n unified: string,\n style: EmojiStyle\n) => string {\n const { getEmojiUrl } = usePickerConfig();\n return getEmojiUrl;\n}\n\nfunction getDimension(dimensionConfig: PickerDimensions): PickerDimensions {\n return typeof dimensionConfig === 'number'\n ? `${dimensionConfig}px`\n : dimensionConfig;\n}\n\nexport function useSearchResultsConfig(searchResultsCount: number): string {\n const hasResults = searchResultsCount > 0;\n const isPlural = searchResultsCount > 1;\n\n if (hasResults) {\n return isPlural\n ? SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND.replace(\n '%n',\n searchResultsCount.toString()\n )\n : SEARCH_RESULTS_ONE_RESULT_FOUND;\n }\n\n return SEARCH_RESULTS_NO_RESULTS_FOUND;\n}\n","import React from 'react';\n\nimport {MouseDownEvent, OnSkinToneChange} from './config';\n\nexport type MutableConfig = {\n onEmojiClick?: MouseDownEvent;\n onReactionClick?: MouseDownEvent;\n onSkinToneChange?: OnSkinToneChange;\n};\n\nexport const MutableConfigContext = React.createContext<\n React.MutableRefObject<MutableConfig>\n>({} as React.MutableRefObject<MutableConfig>);\n\nexport function useMutableConfig(): React.MutableRefObject<MutableConfig> {\n const mutableConfig = React.useContext(MutableConfigContext);\n return mutableConfig;\n}\n\nexport function useDefineMutableConfig(\n config: MutableConfig\n): React.MutableRefObject<MutableConfig> {\n const MutableConfigRef = React.useRef<MutableConfig>({\n onEmojiClick: config.onEmojiClick || emptyFunc,\n onReactionClick: config.onReactionClick || config.onEmojiClick,\n onSkinToneChange: config.onSkinToneChange || emptyFunc\n });\n\n React.useEffect(() => {\n MutableConfigRef.current.onEmojiClick = config.onEmojiClick || emptyFunc;\n MutableConfigRef.current.onReactionClick =\n config.onReactionClick || config.onEmojiClick;\n }, [config.onEmojiClick, config.onReactionClick]);\n\n React.useEffect(() => {\n MutableConfigRef.current.onSkinToneChange = config.onSkinToneChange || emptyFunc;\n }, [config.onSkinToneChange])\n\n return MutableConfigRef;\n}\n\nfunction emptyFunc() {}\n","import { useRef, useState } from 'react';\n\nexport function useDebouncedState<T>(\n initialValue: T,\n delay: number = 0\n): [T, (value: T) => Promise<T>] {\n const [state, setState] = useState<T>(initialValue);\n const timer = useRef<number | null>(null);\n\n function debouncedSetState(value: T) {\n return new Promise<T>(resolve => {\n if (timer.current) {\n clearTimeout(timer.current);\n }\n\n timer.current = window?.setTimeout(() => {\n setState(value);\n resolve(value);\n }, delay);\n });\n }\n\n return [state, debouncedSetState];\n}\n","import { useRef, useMemo } from 'react';\n\nimport { useEmojiVersionConfig } from '../config/useConfig';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport {\n addedIn,\n allEmojis,\n emojiUnified,\n unifiedWithoutSkinTone\n} from '../dataUtils/emojiSelectors';\n\nimport { useIsUnicodeHidden } from './useHideEmojisByUniocode';\n\nexport function useDisallowedEmojis() {\n const DisallowedEmojisRef = useRef<Record<string, boolean>>({});\n const emojiVersionConfig = useEmojiVersionConfig();\n\n return useMemo(() => {\n const emojiVersion = parseFloat(`${emojiVersionConfig}`);\n\n if (!emojiVersionConfig || Number.isNaN(emojiVersion)) {\n return DisallowedEmojisRef.current;\n }\n\n return allEmojis.reduce((disallowedEmojis, emoji) => {\n if (addedInNewerVersion(emoji, emojiVersion)) {\n disallowedEmojis[emojiUnified(emoji)] = true;\n }\n\n return disallowedEmojis;\n }, DisallowedEmojisRef.current);\n }, [emojiVersionConfig]);\n}\n\nexport function useIsEmojiDisallowed() {\n const disallowedEmojis = useDisallowedEmojis();\n const isUnicodeHidden = useIsUnicodeHidden();\n\n return function isEmojiDisallowed(emoji: DataEmoji) {\n const unified = unifiedWithoutSkinTone(emojiUnified(emoji));\n\n return Boolean(disallowedEmojis[unified] || isUnicodeHidden(unified));\n };\n}\n\nfunction addedInNewerVersion(\n emoji: DataEmoji,\n supportedLevel: number\n): boolean {\n return addedIn(emoji) > supportedLevel;\n}\n","import * as React from 'react';\nimport { useState } from 'react';\n\nimport {\n useDefaultSkinToneConfig,\n useReactionsOpenConfig\n} from '../../config/useConfig';\nimport { DataEmoji } from '../../dataUtils/DataTypes';\nimport { alphaNumericEmojiIndex } from '../../dataUtils/alphaNumericEmojiIndex';\nimport { useDebouncedState } from '../../hooks/useDebouncedState';\nimport { useDisallowedEmojis } from '../../hooks/useDisallowedEmojis';\nimport { FilterDict } from '../../hooks/useFilter';\nimport { useMarkInitialLoad } from '../../hooks/useInitialLoad';\nimport { SkinTones } from '../../types/exposedTypes';\n\nexport function PickerContextProvider({ children }: Props) {\n const disallowedEmojis = useDisallowedEmojis();\n const defaultSkinTone = useDefaultSkinToneConfig();\n const reactionsDefaultOpen = useReactionsOpenConfig();\n\n // Initialize the filter with the inititial dictionary\n const filterRef = React.useRef<FilterState>(alphaNumericEmojiIndex);\n const disallowClickRef = React.useRef<boolean>(false);\n const disallowMouseRef = React.useRef<boolean>(false);\n const disallowedEmojisRef = React.useRef<Record<string, boolean>>(\n disallowedEmojis\n );\n\n const suggestedUpdateState = useDebouncedState(Date.now(), 200);\n const searchTerm = useDebouncedState('', 100);\n const skinToneFanOpenState = useState<boolean>(false);\n const activeSkinTone = useState<SkinTones>(defaultSkinTone);\n const activeCategoryState = useState<ActiveCategoryState>(null);\n const emojisThatFailedToLoadState = useState<Set<string>>(new Set());\n const emojiVariationPickerState = useState<DataEmoji | null>(null);\n const reactionsModeState = useState(reactionsDefaultOpen);\n const [isPastInitialLoad, setIsPastInitialLoad] = useState(false);\n\n useMarkInitialLoad(setIsPastInitialLoad);\n\n return (\n <PickerContext.Provider\n value={{\n activeCategoryState,\n activeSkinTone,\n disallowClickRef,\n disallowMouseRef,\n disallowedEmojisRef,\n emojiVariationPickerState,\n emojisThatFailedToLoadState,\n filterRef,\n isPastInitialLoad,\n searchTerm,\n skinToneFanOpenState,\n suggestedUpdateState,\n reactionsModeState\n }}\n >\n {children}\n </PickerContext.Provider>\n );\n}\n\ntype ReactState<T> = [T, React.Dispatch<React.SetStateAction<T>>];\n\nconst PickerContext = React.createContext<{\n searchTerm: [string, (term: string) => Promise<string>];\n suggestedUpdateState: [number, (term: number) => void];\n activeCategoryState: ReactState<ActiveCategoryState>;\n activeSkinTone: ReactState<SkinTones>;\n emojisThatFailedToLoadState: ReactState<Set<string>>;\n isPastInitialLoad: boolean;\n emojiVariationPickerState: ReactState<DataEmoji | null>;\n skinToneFanOpenState: ReactState<boolean>;\n filterRef: React.MutableRefObject<FilterState>;\n disallowClickRef: React.MutableRefObject<boolean>;\n disallowMouseRef: React.MutableRefObject<boolean>;\n disallowedEmojisRef: React.MutableRefObject<Record<string, boolean>>;\n reactionsModeState: ReactState<boolean>;\n}>({\n activeCategoryState: [null, () => {}],\n activeSkinTone: [SkinTones.NEUTRAL, () => {}],\n disallowClickRef: { current: false },\n disallowMouseRef: { current: false },\n disallowedEmojisRef: { current: {} },\n emojiVariationPickerState: [null, () => {}],\n emojisThatFailedToLoadState: [new Set(), () => {}],\n filterRef: { current: {} },\n isPastInitialLoad: true,\n searchTerm: ['', () => new Promise<string>(() => undefined)],\n skinToneFanOpenState: [false, () => {}],\n suggestedUpdateState: [Date.now(), () => {}],\n reactionsModeState: [false, () => {}]\n});\n\ntype Props = Readonly<{\n children: React.ReactNode;\n}>;\n\nexport function useFilterRef() {\n const { filterRef } = React.useContext(PickerContext);\n return filterRef;\n}\n\nexport function useDisallowClickRef() {\n const { disallowClickRef } = React.useContext(PickerContext);\n return disallowClickRef;\n}\n\nexport function useDisallowMouseRef() {\n const { disallowMouseRef } = React.useContext(PickerContext);\n return disallowMouseRef;\n}\n\nexport function useReactionsModeState() {\n const { reactionsModeState } = React.useContext(PickerContext);\n return reactionsModeState;\n}\n\nexport function useSearchTermState() {\n const { searchTerm } = React.useContext(PickerContext);\n return searchTerm;\n}\n\nexport function useActiveSkinToneState(): [\n SkinTones,\n (skinTone: SkinTones) => void\n] {\n const { activeSkinTone } = React.useContext(PickerContext);\n return activeSkinTone;\n}\n\nexport function useEmojisThatFailedToLoadState() {\n const { emojisThatFailedToLoadState } = React.useContext(PickerContext);\n return emojisThatFailedToLoadState;\n}\n\nexport function useIsPastInitialLoad(): boolean {\n const { isPastInitialLoad } = React.useContext(PickerContext);\n return isPastInitialLoad;\n}\n\nexport function useEmojiVariationPickerState() {\n const { emojiVariationPickerState } = React.useContext(PickerContext);\n return emojiVariationPickerState;\n}\n\nexport function useSkinToneFanOpenState() {\n const { skinToneFanOpenState } = React.useContext(PickerContext);\n return skinToneFanOpenState;\n}\n\nexport function useDisallowedEmojisRef() {\n const { disallowedEmojisRef } = React.useContext(PickerContext);\n return disallowedEmojisRef;\n}\n\nexport function useUpdateSuggested(): [number, () => void] {\n const { suggestedUpdateState } = React.useContext(PickerContext);\n\n const [suggestedUpdated, setsuggestedUpdate] = suggestedUpdateState;\n return [\n suggestedUpdated,\n function updateSuggested() {\n setsuggestedUpdate(Date.now());\n }\n ];\n}\n\nexport type FilterState = Record<string, FilterDict>;\n\ntype ActiveCategoryState = null | string;\n","import { useEffect } from 'react';\nimport * as React from 'react';\n\nexport function useMarkInitialLoad(\n dispatch: React.Dispatch<React.SetStateAction<boolean>>\n) {\n useEffect(() => {\n dispatch(true);\n }, [dispatch]);\n}\n","import { useSearchTermState } from '../components/context/PickerContext';\n\nexport default function useIsSearchMode(): boolean {\n const [searchTerm] = useSearchTermState();\n\n return !!searchTerm;\n}\n","import { NullableElement } from './selectors';\n\nexport function focusElement(element: NullableElement) {\n if (!element) {\n return;\n }\n\n requestAnimationFrame(() => {\n element.focus();\n });\n}\n\nexport function focusPrevElementSibling(element: NullableElement) {\n if (!element) return;\n\n const prev = element.previousElementSibling as HTMLElement;\n\n focusElement(prev);\n}\n\nexport function focusNextElementSibling(element: NullableElement) {\n if (!element) return;\n\n const next = element.nextElementSibling as HTMLElement;\n\n focusElement(next);\n}\n\nexport function focusFirstElementChild(element: NullableElement) {\n if (!element) return;\n\n const first = element.firstElementChild as HTMLElement;\n\n focusElement(first);\n}\n","import { NullableElement } from './selectors';\n\nexport function getActiveElement() {\n return document.activeElement as NullableElement;\n}\n","import * as React from 'react';\n\nimport { focusElement } from '../../DomUtils/focusElement';\nimport { NullableElement } from '../../DomUtils/selectors';\n\nexport function ElementRefContextProvider({\n children\n}: {\n children: React.ReactNode;\n}) {\n const PickerMainRef = React.useRef<HTMLElement>(null);\n const AnchoredEmojiRef = React.useRef<HTMLElement>(null);\n const BodyRef = React.useRef<HTMLDivElement>(null);\n const SearchInputRef = React.useRef<HTMLInputElement>(null);\n const SkinTonePickerRef = React.useRef<HTMLDivElement>(null);\n const CategoryNavigationRef = React.useRef<HTMLDivElement>(null);\n const VariationPickerRef = React.useRef<HTMLDivElement>(null);\n const ReactionsRef = React.useRef<HTMLUListElement>(null);\n\n return (\n <ElementRefContext.Provider\n value={{\n AnchoredEmojiRef,\n BodyRef,\n CategoryNavigationRef,\n PickerMainRef,\n SearchInputRef,\n SkinTonePickerRef,\n VariationPickerRef,\n ReactionsRef\n }}\n >\n {children}\n </ElementRefContext.Provider>\n );\n}\n\nexport type ElementRef<\n E extends HTMLElement = HTMLElement\n> = React.MutableRefObject<E | null>;\n\ntype ElementRefs = {\n PickerMainRef: ElementRef;\n AnchoredEmojiRef: ElementRef;\n SkinTonePickerRef: ElementRef<HTMLDivElement>;\n SearchInputRef: ElementRef<HTMLInputElement>;\n BodyRef: ElementRef<HTMLDivElement>;\n CategoryNavigationRef: ElementRef<HTMLDivElement>;\n VariationPickerRef: ElementRef<HTMLDivElement>;\n ReactionsRef: ElementRef<HTMLUListElement>;\n};\n\nconst ElementRefContext = React.createContext<ElementRefs>({\n AnchoredEmojiRef: React.createRef(),\n BodyRef: React.createRef(),\n CategoryNavigationRef: React.createRef(),\n PickerMainRef: React.createRef(),\n SearchInputRef: React.createRef(),\n SkinTonePickerRef: React.createRef(),\n VariationPickerRef: React.createRef(),\n ReactionsRef: React.createRef()\n});\n\nfunction useElementRef() {\n return React.useContext(ElementRefContext);\n}\n\nexport function usePickerMainRef() {\n return useElementRef()['PickerMainRef'];\n}\n\nexport function useAnchoredEmojiRef() {\n return useElementRef()['AnchoredEmojiRef'];\n}\n\nexport function useSetAnchoredEmojiRef(): (target: NullableElement) => void {\n const AnchoredEmojiRef = useAnchoredEmojiRef();\n return (target: NullableElement) => {\n if (target === null && AnchoredEmojiRef.current !== null) {\n focusElement(AnchoredEmojiRef.current);\n }\n\n AnchoredEmojiRef.current = target;\n };\n}\n\nexport function useBodyRef() {\n return useElementRef()['BodyRef'];\n}\n\nexport function useReactionsRef() {\n return useElementRef()['ReactionsRef'];\n}\n\nexport function useSearchInputRef() {\n return useElementRef()['SearchInputRef'];\n}\n\nexport function useSkinTonePickerRef() {\n return useElementRef()['SkinTonePickerRef'];\n}\n\nexport function useCategoryNavigationRef() {\n return useElementRef()['CategoryNavigationRef'];\n}\n\nexport function useVariationPickerRef() {\n return useElementRef()['VariationPickerRef'];\n}\n","import { useCallback, useEffect, useMemo } from 'react';\n\nimport { hasNextElementSibling } from '../DomUtils/elementPositionInRow';\nimport {\n focusNextElementSibling,\n focusPrevElementSibling\n} from '../DomUtils/focusElement';\nimport { getActiveElement } from '../DomUtils/getActiveElement';\nimport {\n focusAndClickFirstVisibleEmoji,\n focusFirstVisibleEmoji,\n focusNextVisibleEmoji,\n focusPrevVisibleEmoji,\n focusVisibleEmojiOneRowDown,\n focusVisibleEmojiOneRowUp\n} from '../DomUtils/keyboardNavigation';\nimport { useScrollTo } from '../DomUtils/scrollTo';\nimport { buttonFromTarget } from '../DomUtils/selectors';\nimport {\n useBodyRef,\n useCategoryNavigationRef,\n usePickerMainRef,\n useSearchInputRef,\n useSkinTonePickerRef\n} from '../components/context/ElementRefContext';\nimport { useSkinToneFanOpenState } from '../components/context/PickerContext';\nimport { useSearchDisabledConfig } from '../config/useConfig';\n\nimport {\n useCloseAllOpenToggles,\n useHasOpenToggles\n} from './useCloseAllOpenToggles';\nimport { useDisallowMouseMove } from './useDisallowMouseMove';\nimport { useAppendSearch, useClearSearch } from './useFilter';\nimport {\n useFocusCategoryNavigation,\n useFocusSearchInput,\n useFocusSkinTonePicker\n} from './useFocus';\nimport useIsSearchMode from './useIsSearchMode';\nimport useSetVariationPicker from './useSetVariationPicker';\nimport {\n useIsSkinToneInPreview,\n useIsSkinToneInSearch\n} from './useShouldShowSkinTonePicker';\n\nenum KeyboardEvents {\n ArrowDown = 'ArrowDown',\n ArrowUp = 'ArrowUp',\n ArrowLeft = 'ArrowLeft',\n ArrowRight = 'ArrowRight',\n Escape = 'Escape',\n Enter = 'Enter',\n Space = ' '\n}\n\nexport function useKeyboardNavigation() {\n usePickerMainKeyboardEvents();\n useSearchInputKeyboardEvents();\n useSkinTonePickerKeyboardEvents();\n useCategoryNavigationKeyboardEvents();\n useBodyKeyboardEvents();\n}\n\nfunction usePickerMainKeyboardEvents() {\n const PickerMainRef = usePickerMainRef();\n const clearSearch = useClearSearch();\n const scrollTo = useScrollTo();\n const SearchInputRef = useSearchInputRef();\n const focusSearchInput = useFocusSearchInput();\n const hasOpenToggles = useHasOpenToggles();\n const disallowMouseMove = useDisallowMouseMove();\n\n const closeAllOpenToggles = useCloseAllOpenToggles();\n\n const onKeyDown = useMemo(\n () =>\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n disallowMouseMove();\n switch (key) {\n // eslint-disable-next-line no-fallthrough\n case KeyboardEvents.Escape:\n event.preventDefault();\n if (hasOpenToggles()) {\n closeAllOpenToggles();\n return;\n }\n clearSearch();\n scrollTo(0);\n focusSearchInput();\n break;\n }\n },\n [\n scrollTo,\n clearSearch,\n closeAllOpenToggles,\n focusSearchInput,\n hasOpenToggles,\n disallowMouseMove\n ]\n );\n\n useEffect(() => {\n const current = PickerMainRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [PickerMainRef, SearchInputRef, scrollTo, onKeyDown]);\n}\n\nfunction useSearchInputKeyboardEvents() {\n const focusSkinTonePicker = useFocusSkinTonePicker();\n const PickerMainRef = usePickerMainRef();\n const BodyRef = useBodyRef();\n const SearchInputRef = useSearchInputRef();\n const [, setSkinToneFanOpenState] = useSkinToneFanOpenState();\n const goDownFromSearchInput = useGoDownFromSearchInput();\n const isSkinToneInSearch = useIsSkinToneInSearch();\n\n const onKeyDown = useMemo(\n () =>\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n switch (key) {\n case KeyboardEvents.ArrowRight:\n if (!isSkinToneInSearch) {\n return;\n }\n event.preventDefault();\n setSkinToneFanOpenState(true);\n focusSkinTonePicker();\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n goDownFromSearchInput();\n break;\n case KeyboardEvents.Enter:\n event.preventDefault();\n focusAndClickFirstVisibleEmoji(BodyRef.current);\n break;\n }\n },\n [\n focusSkinTonePicker,\n goDownFromSearchInput,\n setSkinToneFanOpenState,\n BodyRef,\n isSkinToneInSearch\n ]\n );\n\n useEffect(() => {\n const current = SearchInputRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [PickerMainRef, SearchInputRef, onKeyDown]);\n}\n\nfunction useSkinTonePickerKeyboardEvents() {\n const SkinTonePickerRef = useSkinTonePickerRef();\n const focusSearchInput = useFocusSearchInput();\n const SearchInputRef = useSearchInputRef();\n const goDownFromSearchInput = useGoDownFromSearchInput();\n const [isOpen, setIsOpen] = useSkinToneFanOpenState();\n const isSkinToneInPreview = useIsSkinToneInPreview();\n const isSkinToneInSearch = useIsSkinToneInSearch();\n const onType = useOnType();\n\n const onKeyDown = useMemo(\n () =>\n // eslint-disable-next-line complexity\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n if (isSkinToneInSearch) {\n switch (key) {\n case KeyboardEvents.ArrowLeft:\n event.preventDefault();\n if (!isOpen) {\n return focusSearchInput();\n }\n focusNextSkinTone(focusSearchInput);\n break;\n case KeyboardEvents.ArrowRight:\n event.preventDefault();\n if (!isOpen) {\n return focusSearchInput();\n }\n focusPrevSkinTone();\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n }\n goDownFromSearchInput();\n break;\n default:\n onType(event);\n break;\n }\n }\n\n if (isSkinToneInPreview) {\n switch (key) {\n case KeyboardEvents.ArrowUp:\n event.preventDefault();\n if (!isOpen) {\n return focusSearchInput();\n }\n focusNextSkinTone(focusSearchInput);\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n if (!isOpen) {\n return focusSearchInput();\n }\n focusPrevSkinTone();\n break;\n default:\n onType(event);\n break;\n }\n }\n },\n [\n isOpen,\n focusSearchInput,\n setIsOpen,\n goDownFromSearchInput,\n onType,\n isSkinToneInPreview,\n isSkinToneInSearch\n ]\n );\n\n useEffect(() => {\n const current = SkinTonePickerRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [SkinTonePickerRef, SearchInputRef, isOpen, onKeyDown]);\n}\n\nfunction useCategoryNavigationKeyboardEvents() {\n const focusSearchInput = useFocusSearchInput();\n const CategoryNavigationRef = useCategoryNavigationRef();\n const BodyRef = useBodyRef();\n const onType = useOnType();\n\n const onKeyDown = useMemo(\n () =>\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n switch (key) {\n case KeyboardEvents.ArrowUp:\n event.preventDefault();\n focusSearchInput();\n break;\n case KeyboardEvents.ArrowRight:\n event.preventDefault();\n focusNextElementSibling(getActiveElement());\n break;\n case KeyboardEvents.ArrowLeft:\n event.preventDefault();\n focusPrevElementSibling(getActiveElement());\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n focusFirstVisibleEmoji(BodyRef.current);\n break;\n default:\n onType(event);\n break;\n }\n },\n [BodyRef, focusSearchInput, onType]\n );\n\n useEffect(() => {\n const current = CategoryNavigationRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [CategoryNavigationRef, BodyRef, onKeyDown]);\n}\n\nfunction useBodyKeyboardEvents() {\n const BodyRef = useBodyRef();\n const goUpFromBody = useGoUpFromBody();\n const setVariationPicker = useSetVariationPicker();\n const hasOpenToggles = useHasOpenToggles();\n const closeAllOpenToggles = useCloseAllOpenToggles();\n\n const onType = useOnType();\n\n const onKeyDown = useMemo(\n () =>\n // eslint-disable-next-line complexity\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n const activeElement = buttonFromTarget(getActiveElement());\n\n switch (key) {\n case KeyboardEvents.ArrowRight:\n event.preventDefault();\n focusNextVisibleEmoji(activeElement);\n break;\n case KeyboardEvents.ArrowLeft:\n event.preventDefault();\n focusPrevVisibleEmoji(activeElement);\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n if (hasOpenToggles()) {\n closeAllOpenToggles();\n break;\n }\n focusVisibleEmojiOneRowDown(activeElement);\n break;\n case KeyboardEvents.ArrowUp:\n event.preventDefault();\n if (hasOpenToggles()) {\n closeAllOpenToggles();\n break;\n }\n focusVisibleEmojiOneRowUp(activeElement, goUpFromBody);\n break;\n case KeyboardEvents.Space:\n event.preventDefault();\n setVariationPicker(event.target as HTMLElement);\n break;\n default:\n onType(event);\n break;\n }\n },\n [\n goUpFromBody,\n onType,\n setVariationPicker,\n hasOpenToggles,\n closeAllOpenToggles\n ]\n );\n\n useEffect(() => {\n const current = BodyRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [BodyRef, onKeyDown]);\n}\n\nfunction useGoDownFromSearchInput() {\n const focusCategoryNavigation = useFocusCategoryNavigation();\n const isSearchMode = useIsSearchMode();\n const BodyRef = useBodyRef();\n\n return useCallback(\n function goDownFromSearchInput() {\n if (isSearchMode) {\n return focusFirstVisibleEmoji(BodyRef.current);\n }\n return focusCategoryNavigation();\n },\n [BodyRef, focusCategoryNavigation, isSearchMode]\n );\n}\n\nfunction useGoUpFromBody() {\n const focusSearchInput = useFocusSearchInput();\n const focusCategoryNavigation = useFocusCategoryNavigation();\n const isSearchMode = useIsSearchMode();\n\n return useCallback(\n function goUpFromEmoji() {\n if (isSearchMode) {\n return focusSearchInput();\n }\n return focusCategoryNavigation();\n },\n [focusSearchInput, isSearchMode, focusCategoryNavigation]\n );\n}\n\nfunction focusNextSkinTone(exitLeft: () => void) {\n const currentSkinTone = getActiveElement();\n\n if (!currentSkinTone) {\n return;\n }\n\n if (!hasNextElementSibling(currentSkinTone)) {\n exitLeft();\n }\n\n focusNextElementSibling(currentSkinTone);\n}\n\nfunction focusPrevSkinTone() {\n const currentSkinTone = getActiveElement();\n\n if (!currentSkinTone) {\n return;\n }\n\n focusPrevElementSibling(currentSkinTone);\n}\n\nfunction useOnType() {\n const appendSearch = useAppendSearch();\n const focusSearchInput = useFocusSearchInput();\n const searchDisabled = useSearchDisabledConfig();\n const closeAllOpenToggles = useCloseAllOpenToggles();\n\n return function onType(event: KeyboardEvent) {\n const { key } = event;\n\n if (hasModifier(event) || searchDisabled) {\n return;\n }\n\n if (key.match(/(^[a-zA-Z0-9]$){1}/)) {\n event.preventDefault();\n closeAllOpenToggles();\n focusSearchInput();\n appendSearch(key);\n }\n };\n}\n\nfunction hasModifier(event: KeyboardEvent): boolean {\n const { metaKey, ctrlKey, altKey } = event;\n\n return metaKey || ctrlKey || altKey;\n}\n","import { useCallback } from 'react';\n\nimport { useBodyRef } from '../components/context/ElementRefContext';\n\nimport { asSelectors, ClassNames } from './classNames';\nimport {\n categoryLabelHeight,\n closestCategory,\n closestScrollBody,\n emojiDistanceFromScrollTop,\n isEmojiBehindLabel,\n NullableElement,\n queryScrollBody\n} from './selectors';\n\nexport function scrollTo(root: NullableElement, top: number = 0) {\n const $eprBody = queryScrollBody(root);\n\n if (!$eprBody) {\n return;\n }\n\n requestAnimationFrame(() => {\n $eprBody.scrollTop = top;\n });\n}\n\nexport function scrollBy(root: NullableElement, by: number): void {\n const $eprBody = queryScrollBody(root);\n\n if (!$eprBody) {\n return;\n }\n\n requestAnimationFrame(() => {\n $eprBody.scrollTop = $eprBody.scrollTop + by;\n });\n}\n\nexport function useScrollTo() {\n const BodyRef = useBodyRef();\n\n return useCallback(\n (top: number) => {\n requestAnimationFrame(() => {\n if (BodyRef.current) {\n BodyRef.current.scrollTop = top;\n }\n });\n },\n [BodyRef]\n );\n}\n\nexport function scrollEmojiAboveLabel(emoji: NullableElement) {\n if (!emoji || !isEmojiBehindLabel(emoji)) {\n return;\n }\n\n if (emoji.closest(asSelectors(ClassNames.variationPicker))) {\n return;\n }\n\n const scrollBody = closestScrollBody(emoji);\n const by = emojiDistanceFromScrollTop(emoji);\n scrollBy(scrollBody, -(categoryLabelHeight(closestCategory(emoji)) - by));\n}\n","import { DataEmoji } from '../dataUtils/DataTypes';\nimport {\n emojiByUnified,\n unifiedWithoutSkinTone\n} from '../dataUtils/emojiSelectors';\n\nimport { asSelectors, ClassNames } from './classNames';\nimport { firstVisibleElementInContainer } from './elementPositionInRow';\n\nexport type NullableElement = HTMLElement | null;\n\nexport const EmojiButtonSelector = `button${asSelectors(ClassNames.emoji)}`;\nexport const VisibleEmojiSelector = [\n EmojiButtonSelector,\n asSelectors(ClassNames.visible),\n `:not(${asSelectors(ClassNames.hidden)})`\n].join('');\n\nexport function buttonFromTarget(\n emojiElement: NullableElement\n): HTMLButtonElement | null {\n return emojiElement?.closest(EmojiButtonSelector) ?? null;\n}\n\nexport function isEmojiButton(element: NullableElement): boolean {\n if (!element) {\n return false;\n }\n\n return element.matches(EmojiButtonSelector);\n}\n\nexport function emojiFromElement(\n element: NullableElement\n): [DataEmoji, string] | [] {\n const originalUnified = originalUnifiedFromEmojiElement(element);\n const unified = unifiedFromEmojiElement(element);\n\n if (!originalUnified) {\n return [];\n }\n\n const emoji = emojiByUnified(unified ?? originalUnified);\n\n if (!emoji) {\n return [];\n }\n\n return [emoji, unified as string];\n}\n\nexport function isEmojiElement(element: NullableElement): boolean {\n return Boolean(\n element?.matches(EmojiButtonSelector) ||\n element?.parentElement?.matches(EmojiButtonSelector)\n );\n}\n\nexport function categoryLabelFromCategory(\n category: NullableElement\n): NullableElement {\n return category?.querySelector(asSelectors(ClassNames.label)) ?? null;\n}\n\nexport function closestCategoryLabel(\n element: NullableElement\n): NullableElement {\n const category = closestCategory(element);\n return categoryLabelFromCategory(category);\n}\n\nexport function elementHeight(element: NullableElement): number {\n return element?.clientHeight ?? 0;\n}\n\nexport function emojiTrueOffsetTop(element: NullableElement): number {\n if (!element) {\n return 0;\n }\n\n const button = buttonFromTarget(element);\n const category = closestCategory(button);\n\n // compensate for the label height\n const labelHeight = categoryLabelHeight(category);\n\n return elementOffsetTop(button) + elementOffsetTop(category) + labelHeight;\n}\n\nexport function categoryLabelHeight(category: NullableElement): number {\n if (!category) {\n return 0;\n }\n\n const categoryWithoutLabel = category.querySelector(\n asSelectors(ClassNames.categoryContent)\n );\n\n return (\n (category?.clientHeight ?? 0) - (categoryWithoutLabel?.clientHeight ?? 0)\n );\n}\n\nexport function isEmojiBehindLabel(emoji: NullableElement): boolean {\n if (!emoji) {\n return false;\n }\n\n return (\n emojiDistanceFromScrollTop(emoji) <\n categoryLabelHeight(closestCategory(emoji))\n );\n}\n\nexport function queryScrollBody(root: NullableElement): NullableElement {\n if (!root) return null;\n\n return root.matches(asSelectors(ClassNames.scrollBody))\n ? root\n : root.querySelector(asSelectors(ClassNames.scrollBody));\n}\n\nexport function emojiDistanceFromScrollTop(emoji: NullableElement): number {\n if (!emoji) {\n return 0;\n }\n\n return emojiTrueOffsetTop(emoji) - (closestScrollBody(emoji)?.scrollTop ?? 0);\n}\n\nexport function closestScrollBody(element: NullableElement): NullableElement {\n if (!element) {\n return null;\n }\n\n return element.closest(asSelectors(ClassNames.scrollBody)) ?? null;\n}\n\nexport function emojiTruOffsetLeft(element: NullableElement): number {\n const button = buttonFromTarget(element);\n const category = closestCategory(button);\n\n return elementOffsetLeft(button) + elementOffsetLeft(category);\n}\n\nfunction elementOffsetTop(element: NullableElement): number {\n return element?.offsetTop ?? 0;\n}\n\nfunction elementOffsetLeft(element: NullableElement): number {\n return element?.offsetLeft ?? 0;\n}\n\nexport function unifiedFromEmojiElement(emoji: NullableElement): string | null {\n return elementDataSetKey(buttonFromTarget(emoji), 'unified') ?? null;\n}\n\nexport function originalUnifiedFromEmojiElement(\n emoji: NullableElement\n): string | null {\n const unified = unifiedFromEmojiElement(emoji);\n\n if (unified) {\n return unifiedWithoutSkinTone(unified);\n }\n return null;\n}\n\nexport function allUnifiedFromEmojiElement(\n emoji: NullableElement\n): { unified: string | null; originalUnified: string | null } {\n if (!emoji) {\n return {\n unified: null,\n originalUnified: null\n };\n }\n\n return {\n unified: unifiedFromEmojiElement(emoji),\n originalUnified: originalUnifiedFromEmojiElement(emoji)\n };\n}\n\nfunction elementDataSetKey(\n element: NullableElement,\n key: string\n): string | null {\n return elementDataSet(element)[key] ?? null;\n}\n\nfunction elementDataSet(element: NullableElement): DOMStringMap {\n return element?.dataset ?? {};\n}\n\nexport function isVisibleEmoji(element: HTMLElement) {\n return element.classList.contains(ClassNames.visible);\n}\n\nexport function isHidden(element: NullableElement) {\n if (!element) return true;\n\n return element.classList.contains(ClassNames.hidden);\n}\n\nexport function allVisibleEmojis(parent: NullableElement) {\n if (!parent) {\n return [];\n }\n\n return Array.from(\n parent.querySelectorAll(VisibleEmojiSelector)\n ) as HTMLElement[];\n}\n\nexport function lastVisibleEmoji(element: NullableElement): NullableElement {\n if (!element) return null;\n\n const allEmojis = allVisibleEmojis(element);\n const [last] = allEmojis.slice(-1);\n if (!last) {\n return null;\n }\n\n if (!isVisibleEmoji(last)) {\n return prevVisibleEmoji(last);\n }\n\n return last;\n}\n\nexport function nextVisibleEmoji(element: HTMLElement): NullableElement {\n const next = element.nextElementSibling as HTMLElement;\n\n if (!next) {\n return firstVisibleEmoji(nextCategory(element));\n }\n\n if (!isVisibleEmoji(next)) {\n return nextVisibleEmoji(next);\n }\n\n return next;\n}\n\nexport function prevVisibleEmoji(element: HTMLElement): NullableElement {\n const prev = element.previousElementSibling as HTMLElement;\n\n if (!prev) {\n return lastVisibleEmoji(prevCategory(element));\n }\n\n if (!isVisibleEmoji(prev)) {\n return prevVisibleEmoji(prev);\n }\n\n return prev;\n}\n\nexport function firstVisibleEmoji(parent: NullableElement) {\n if (!parent) {\n return null;\n }\n\n const allEmojis = allVisibleEmojis(parent);\n\n return firstVisibleElementInContainer(parent, allEmojis, 0.1);\n}\n\nexport function prevCategory(element: NullableElement): NullableElement {\n const category = closestCategory(element);\n\n if (!category) {\n return null;\n }\n\n const prev = category.previousElementSibling as HTMLElement;\n\n if (!prev) {\n return null;\n }\n\n if (isHidden(prev)) {\n return prevCategory(prev);\n }\n\n return prev;\n}\n\nexport function nextCategory(element: NullableElement): NullableElement {\n const category = closestCategory(element);\n\n if (!category) {\n return null;\n }\n\n const next = category.nextElementSibling as HTMLElement;\n\n if (!next) {\n return null;\n }\n\n if (isHidden(next)) {\n return nextCategory(next);\n }\n\n return next;\n}\n\nexport function closestCategory(element: NullableElement) {\n if (!element) {\n return null;\n }\n return element.closest(asSelectors(ClassNames.category)) as HTMLElement;\n}\n\nexport function closestCategoryContent(element: NullableElement) {\n if (!element) {\n return null;\n }\n return element.closest(\n asSelectors(ClassNames.categoryContent)\n ) as HTMLElement;\n}\n","import {\n elementCountInRow,\n elementIndexInRow,\n getElementInNextRow,\n getElementInPrevRow,\n getElementInRow,\n hasNextRow,\n rowNumber\n} from './elementPositionInRow';\nimport { focusElement } from './focusElement';\nimport { scrollEmojiAboveLabel } from './scrollTo';\nimport {\n allVisibleEmojis,\n closestCategory,\n firstVisibleEmoji,\n lastVisibleEmoji,\n nextCategory,\n nextVisibleEmoji,\n NullableElement,\n prevCategory,\n prevVisibleEmoji,\n closestCategoryContent\n} from './selectors';\n\nexport function focusFirstVisibleEmoji(parent: NullableElement) {\n const emoji = firstVisibleEmoji(parent);\n focusElement(emoji);\n scrollEmojiAboveLabel(emoji);\n}\n\nexport function focusAndClickFirstVisibleEmoji(parent: NullableElement) {\n const firstEmoji = firstVisibleEmoji(parent);\n\n focusElement(firstEmoji);\n firstEmoji?.click();\n}\n\nexport function focusLastVisibleEmoji(parent: NullableElement) {\n focusElement(lastVisibleEmoji(parent));\n}\n\nexport function focusNextVisibleEmoji(element: NullableElement) {\n if (!element) {\n return;\n }\n\n const next = nextVisibleEmoji(element);\n\n if (!next) {\n return focusFirstVisibleEmoji(nextCategory(element));\n }\n\n focusElement(next);\n scrollEmojiAboveLabel(next);\n}\n\nexport function focusPrevVisibleEmoji(element: NullableElement) {\n if (!element) {\n return;\n }\n\n const prev = prevVisibleEmoji(element);\n\n if (!prev) {\n return focusLastVisibleEmoji(prevCategory(element));\n }\n\n focusElement(prev);\n scrollEmojiAboveLabel(prev);\n}\n\nexport function focusVisibleEmojiOneRowUp(\n element: NullableElement,\n exitUp: () => void\n) {\n if (!element) {\n return;\n }\n\n const prev = visibleEmojiOneRowUp(element);\n\n if (!prev) {\n return exitUp();\n }\n\n focusElement(prev);\n scrollEmojiAboveLabel(prev);\n}\n\nexport function focusVisibleEmojiOneRowDown(element: NullableElement) {\n if (!element) {\n return;\n }\n\n const next = visibleEmojiOneRowDown(element);\n\n return focusElement(next);\n}\n\nfunction visibleEmojiOneRowUp(element: HTMLElement) {\n if (!element) {\n return null;\n }\n\n const categoryContent = closestCategoryContent(element);\n const category = closestCategory(categoryContent);\n const indexInRow = elementIndexInRow(categoryContent, element);\n const row = rowNumber(categoryContent, element);\n const countInRow = elementCountInRow(categoryContent, element);\n\n if (row === 0) {\n const prevVisibleCategory = prevCategory(category);\n\n if (!prevVisibleCategory) {\n return null;\n }\n\n return getElementInRow(\n allVisibleEmojis(prevVisibleCategory),\n -1, // last row\n countInRow,\n indexInRow\n );\n }\n\n return getElementInPrevRow(\n allVisibleEmojis(categoryContent),\n row,\n countInRow,\n indexInRow\n );\n}\n\nfunction visibleEmojiOneRowDown(element: HTMLElement) {\n if (!element) {\n return null;\n }\n\n const categoryContent = closestCategoryContent(element);\n const category = closestCategory(categoryContent);\n const indexInRow = elementIndexInRow(categoryContent, element);\n const row = rowNumber(categoryContent, element);\n const countInRow = elementCountInRow(categoryContent, element);\n if (!hasNextRow(categoryContent, element)) {\n const nextVisibleCategory = nextCategory(category);\n\n if (!nextVisibleCategory) {\n return null;\n }\n\n return getElementInRow(\n allVisibleEmojis(nextVisibleCategory),\n 0,\n countInRow,\n indexInRow\n );\n }\n\n const itemInNextRow = getElementInNextRow(\n allVisibleEmojis(categoryContent),\n row,\n countInRow,\n indexInRow\n );\n\n return itemInNextRow;\n}\n","import { useCallback } from 'react';\n\nimport {\n useEmojiVariationPickerState,\n useSkinToneFanOpenState\n} from '../components/context/PickerContext';\n\nexport function useCloseAllOpenToggles() {\n const [variationPicker, setVariationPicker] = useEmojiVariationPickerState();\n const [skinToneFanOpen, setSkinToneFanOpen] = useSkinToneFanOpenState();\n\n const closeAllOpenToggles = useCallback(() => {\n if (variationPicker) {\n setVariationPicker(null);\n }\n\n if (skinToneFanOpen) {\n setSkinToneFanOpen(false);\n }\n }, [\n variationPicker,\n skinToneFanOpen,\n setVariationPicker,\n setSkinToneFanOpen\n ]);\n\n return closeAllOpenToggles;\n}\n\nexport function useHasOpenToggles() {\n const [variationPicker] = useEmojiVariationPickerState();\n const [skinToneFanOpen] = useSkinToneFanOpenState();\n\n return function hasOpenToggles() {\n return !!variationPicker || skinToneFanOpen;\n };\n}\n","import { useEffect } from 'react';\n\nimport { useBodyRef } from '../components/context/ElementRefContext';\nimport { useDisallowMouseRef } from '../components/context/PickerContext';\n\nexport function useDisallowMouseMove() {\n const DisallowMouseRef = useDisallowMouseRef();\n return function disallowMouseMove() {\n DisallowMouseRef.current = true;\n };\n}\n\nexport function useAllowMouseMove() {\n const DisallowMouseRef = useDisallowMouseRef();\n return function allowMouseMove() {\n DisallowMouseRef.current = false;\n };\n}\n\nexport function useIsMouseDisallowed() {\n const DisallowMouseRef = useDisallowMouseRef();\n return function isMouseDisallowed() {\n return DisallowMouseRef.current;\n };\n}\n\nexport function useOnMouseMove() {\n const BodyRef = useBodyRef();\n const allowMouseMove = useAllowMouseMove();\n const isMouseDisallowed = useIsMouseDisallowed();\n\n useEffect(() => {\n const bodyRef = BodyRef.current;\n bodyRef?.addEventListener('mousemove', onMouseMove, {\n passive: true\n });\n\n function onMouseMove() {\n if (isMouseDisallowed()) {\n allowMouseMove();\n }\n }\n return () => {\n bodyRef?.removeEventListener('mousemove', onMouseMove);\n };\n }, [BodyRef, allowMouseMove, isMouseDisallowed]);\n}\n","import { useCallback } from 'react';\n\nimport { focusElement, focusFirstElementChild } from '../DomUtils/focusElement';\nimport {\n useCategoryNavigationRef,\n useSearchInputRef,\n useSkinTonePickerRef\n} from '../components/context/ElementRefContext';\n\nexport function useFocusSearchInput() {\n const SearchInputRef = useSearchInputRef();\n\n return useCallback(() => {\n focusElement(SearchInputRef.current);\n }, [SearchInputRef]);\n}\n\nexport function useFocusSkinTonePicker() {\n const SkinTonePickerRef = useSkinTonePickerRef();\n\n return useCallback(() => {\n if (!SkinTonePickerRef.current) {\n return;\n }\n\n focusFirstElementChild(SkinTonePickerRef.current);\n }, [SkinTonePickerRef]);\n}\n\nexport function useFocusCategoryNavigation() {\n const CategoryNavigationRef = useCategoryNavigationRef();\n\n return useCallback(() => {\n if (!CategoryNavigationRef.current) {\n return;\n }\n\n focusFirstElementChild(CategoryNavigationRef.current);\n }, [CategoryNavigationRef]);\n}\n","import { scrollTo } from '../DomUtils/scrollTo';\nimport {\n usePickerMainRef,\n useSearchInputRef\n} from '../components/context/ElementRefContext';\nimport {\n FilterState,\n useFilterRef,\n useSearchTermState\n} from '../components/context/PickerContext';\nimport { useSearchResultsConfig } from '../config/useConfig';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport { emojiNames } from '../dataUtils/emojiSelectors';\n\nimport { useFocusSearchInput } from './useFocus';\n\nfunction useSetFilterRef() {\n const filterRef = useFilterRef();\n\n return function setFilter(\n setter: FilterState | ((current: FilterState) => FilterState)\n ): void {\n if (typeof setter === 'function') {\n return setFilter(setter(filterRef.current));\n }\n\n filterRef.current = setter;\n };\n}\n\nexport function useClearSearch() {\n const applySearch = useApplySearch();\n const SearchInputRef = useSearchInputRef();\n const focusSearchInput = useFocusSearchInput();\n\n return function clearSearch() {\n if (SearchInputRef.current) {\n SearchInputRef.current.value = '';\n }\n\n applySearch('');\n focusSearchInput();\n };\n}\n\nexport function useAppendSearch() {\n const SearchInputRef = useSearchInputRef();\n const applySearch = useApplySearch();\n\n return function appendSearch(str: string) {\n if (SearchInputRef.current) {\n SearchInputRef.current.value = `${SearchInputRef.current.value}${str}`;\n applySearch(getNormalizedSearchTerm(SearchInputRef.current.value));\n } else {\n applySearch(getNormalizedSearchTerm(str));\n }\n };\n}\n\nexport function useFilter() {\n const SearchInputRef = useSearchInputRef();\n const filterRef = useFilterRef();\n const setFilterRef = useSetFilterRef();\n const applySearch = useApplySearch();\n\n const [searchTerm] = useSearchTermState();\n const statusSearchResults = getStatusSearchResults(\n filterRef.current,\n searchTerm\n );\n\n return {\n onChange,\n searchTerm,\n SearchInputRef,\n statusSearchResults\n };\n\n function onChange(inputValue: string) {\n const filter = filterRef.current;\n\n const nextValue = inputValue.toLowerCase();\n\n if (filter?.[nextValue] || nextValue.length <= 1) {\n return applySearch(nextValue);\n }\n\n const longestMatch = findLongestMatch(nextValue, filter);\n\n if (!longestMatch) {\n // Can we even get here?\n // If so, we need to search among all emojis\n return applySearch(nextValue);\n }\n\n setFilterRef(current =>\n Object.assign(current, {\n [nextValue]: filterEmojiObjectByKeyword(longestMatch, nextValue)\n })\n );\n applySearch(nextValue);\n }\n}\n\nfunction useApplySearch() {\n const [, setSearchTerm] = useSearchTermState();\n const PickerMainRef = usePickerMainRef();\n\n return function applySearch(searchTerm: string) {\n requestAnimationFrame(() => {\n setSearchTerm(searchTerm ? searchTerm?.toLowerCase() : searchTerm).then(\n () => {\n scrollTo(PickerMainRef.current, 0);\n }\n );\n });\n };\n}\n\nfunction filterEmojiObjectByKeyword(\n emojis: FilterDict,\n keyword: string\n): FilterDict {\n const filtered: FilterDict = {};\n\n for (const unified in emojis) {\n const emoji = emojis[unified];\n\n if (hasMatch(emoji, keyword)) {\n filtered[unified] = emoji;\n }\n }\n\n return filtered;\n}\n\nfunction hasMatch(emoji: DataEmoji, keyword: string): boolean {\n return emojiNames(emoji).some(name => name.includes(keyword));\n}\n\nexport function useIsEmojiFiltered(): (unified: string) => boolean {\n const { current: filter } = useFilterRef();\n const [searchTerm] = useSearchTermState();\n\n return unified => isEmojiFilteredBySearchTerm(unified, filter, searchTerm);\n}\n\nfunction isEmojiFilteredBySearchTerm(\n unified: string,\n filter: FilterState,\n searchTerm: string\n): boolean {\n if (!filter || !searchTerm) {\n return false;\n }\n\n return !filter[searchTerm]?.[unified];\n}\n\nexport type FilterDict = Record<string, DataEmoji>;\n\nfunction findLongestMatch(\n keyword: string,\n dict: Record<string, FilterDict> | null\n): FilterDict | null {\n if (!dict) {\n return null;\n }\n\n if (dict[keyword]) {\n return dict[keyword];\n }\n\n const longestMatchingKey = Object.keys(dict)\n .sort((a, b) => b.length - a.length)\n .find(key => keyword.includes(key));\n\n if (longestMatchingKey) {\n return dict[longestMatchingKey];\n }\n\n return null;\n}\n\nexport function getNormalizedSearchTerm(str: string): string {\n if (!str || typeof str !== 'string') {\n return '';\n }\n\n return str.trim().toLowerCase();\n}\n\nfunction getStatusSearchResults(\n filterState: FilterState,\n searchTerm: string\n): string {\n if (!filterState?.[searchTerm]) return '';\n\n const searchResultsCount =\n Object.entries(filterState?.[searchTerm])?.length || 0;\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useSearchResultsConfig(searchResultsCount);\n}\n","import { emojiFromElement, NullableElement } from '../DomUtils/selectors';\nimport { useSetAnchoredEmojiRef } from '../components/context/ElementRefContext';\nimport { useEmojiVariationPickerState } from '../components/context/PickerContext';\n\nexport default function useSetVariationPicker() {\n const setAnchoredEmojiRef = useSetAnchoredEmojiRef();\n const [, setEmojiVariationPicker] = useEmojiVariationPickerState();\n\n return function setVariationPicker(element: NullableElement) {\n const [emoji] = emojiFromElement(element);\n\n if (emoji) {\n setAnchoredEmojiRef(element);\n setEmojiVariationPicker(emoji);\n }\n };\n}\n","import { useSkinTonePickerLocationConfig } from '../config/useConfig';\nimport { SkinTonePickerLocation } from '../types/exposedTypes';\n\nexport function useShouldShowSkinTonePicker() {\n const skinTonePickerLocationConfig = useSkinTonePickerLocationConfig();\n\n return function shouldShowSkinTonePicker(location: SkinTonePickerLocation) {\n return skinTonePickerLocationConfig === location;\n };\n}\n\nexport function useIsSkinToneInSearch() {\n const skinTonePickerLocationConfig = useSkinTonePickerLocationConfig();\n\n return skinTonePickerLocationConfig === SkinTonePickerLocation.SEARCH;\n}\n\nexport function useIsSkinToneInPreview() {\n const skinTonePickerLocationConfig = useSkinTonePickerLocationConfig();\n\n return skinTonePickerLocationConfig === SkinTonePickerLocation.PREVIEW;\n}\n","import { DEFAULT_LABEL_HEIGHT } from '../components/main/PickerMain';\n\nimport { ClassNames, asSelectors } from './classNames';\nimport { NullableElement } from './selectors';\n\nexport function elementCountInRow(\n parent: NullableElement,\n element: NullableElement\n): number {\n if (!parent || !element) {\n return 0;\n }\n\n const parentWidth = parent.getBoundingClientRect().width;\n const elementWidth = element.getBoundingClientRect().width;\n return Math.floor(parentWidth / elementWidth);\n}\n\nexport function elementIndexInRow(\n parent: NullableElement,\n element: NullableElement\n): number {\n if (!parent || !element) {\n return 0;\n }\n\n const elementWidth = element.getBoundingClientRect().width;\n const elementLeft = element.getBoundingClientRect().left;\n const parentLeft = parent.getBoundingClientRect().left;\n\n return Math.floor((elementLeft - parentLeft) / elementWidth);\n}\n\nexport function rowNumber(\n parent: NullableElement,\n element: NullableElement\n): number {\n if (!parent || !element) {\n return 0;\n }\n\n const elementHeight = element.getBoundingClientRect().height;\n const elementTop = element.getBoundingClientRect().top;\n const parentTop = parent.getBoundingClientRect().top;\n return Math.round((elementTop - parentTop) / elementHeight);\n}\n\nexport function hasNextRow(\n parent: NullableElement,\n element: NullableElement\n): boolean {\n if (!parent || !element) {\n return false;\n }\n\n const elementHeight = element.getBoundingClientRect().height;\n const elementTop = element.getBoundingClientRect().top;\n const parentTop = parent.getBoundingClientRect().top;\n const parentHeight = parent.getBoundingClientRect().height;\n\n return Math.round(elementTop - parentTop + elementHeight) < parentHeight;\n}\n\nfunction getRowElements(\n elements: HTMLElement[],\n row: number,\n elementsInRow: number\n): HTMLElement[] {\n if (row === -1) {\n const lastRow = Math.floor((elements.length - 1) / elementsInRow);\n const firstElementIndex = lastRow * elementsInRow;\n const lastElementIndex = elements.length - 1;\n return elements.slice(firstElementIndex, lastElementIndex + 1);\n }\n\n return elements.slice(row * elementsInRow, (row + 1) * elementsInRow);\n}\n\nfunction getNextRowElements(\n allElements: HTMLElement[],\n currentRow: number,\n elementsInRow: number\n): HTMLElement[] {\n const nextRow = currentRow + 1;\n\n if (nextRow * elementsInRow > allElements.length) {\n return [];\n }\n\n return getRowElements(allElements, nextRow, elementsInRow);\n}\n\nexport function getElementInRow(\n elements: HTMLElement[],\n row: number,\n elementsInRow: number,\n indexInRow: number\n): NullableElement {\n const rowElements = getRowElements(elements, row, elementsInRow);\n // get element, default to last\n return rowElements[indexInRow] || rowElements[rowElements.length - 1] || null;\n}\n\nexport function getElementInNextRow(\n allElements: HTMLElement[],\n currentRow: number,\n elementsInRow: number,\n index: number\n): NullableElement {\n const nextRowElements = getNextRowElements(\n allElements,\n currentRow,\n elementsInRow\n );\n\n // return item in index, or last item in row\n return (\n nextRowElements[index] ||\n nextRowElements[nextRowElements.length - 1] ||\n null\n );\n}\n\nexport function getElementInPrevRow(\n allElements: HTMLElement[],\n currentRow: number,\n elementsInRow: number,\n index: number\n): NullableElement {\n const prevRowElements = getRowElements(\n allElements,\n currentRow - 1,\n elementsInRow\n );\n\n // default to last\n return (\n prevRowElements[index] ||\n prevRowElements[prevRowElements.length - 1] ||\n null\n );\n}\n\nexport function firstVisibleElementInContainer(\n parent: NullableElement,\n elements: HTMLElement[],\n maxVisibilityDiffThreshold = 0\n): NullableElement {\n if (!parent || !elements.length) {\n return null;\n }\n\n const parentTop = parent.getBoundingClientRect().top;\n const parentBottom = parent.getBoundingClientRect().bottom;\n const parentTopWithLabel = parentTop + getLabelHeight(parent);\n\n const visibleElements = elements.find(element => {\n const elementTop = element.getBoundingClientRect().top;\n const elementBottom = element.getBoundingClientRect().bottom;\n const maxVisibilityDiffPixels =\n element.clientHeight * maxVisibilityDiffThreshold;\n\n const elementTopWithAllowedDiff = elementTop + maxVisibilityDiffPixels;\n const elementBottomWithAllowedDiff =\n elementBottom - maxVisibilityDiffPixels;\n\n if (elementTopWithAllowedDiff < parentTopWithLabel) {\n return false;\n }\n\n return (\n (elementTopWithAllowedDiff >= parentTop &&\n elementTopWithAllowedDiff <= parentBottom) ||\n (elementBottomWithAllowedDiff >= parentTop &&\n elementBottomWithAllowedDiff <= parentBottom)\n );\n });\n\n return visibleElements || null;\n}\n\nexport function hasNextElementSibling(element: HTMLElement) {\n return !!element.nextElementSibling;\n}\n\nfunction getLabelHeight(parentNode: HTMLElement) {\n const labels = Array.from(\n parentNode.querySelectorAll(asSelectors(ClassNames.label))\n );\n\n for (const label of labels) {\n const height = label.getBoundingClientRect().height;\n // return height if label is not hidden\n if (height > 0) {\n return height;\n }\n }\n\n return DEFAULT_LABEL_HEIGHT;\n}\n","import { GetEmojiUrl } from '../components/emoji/BaseEmojiProps';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport { emojiUnified, emojiVariations } from '../dataUtils/emojiSelectors';\nimport { EmojiStyle } from '../types/exposedTypes';\n\nexport function preloadEmoji(\n getEmojiUrl: GetEmojiUrl,\n emoji: undefined | DataEmoji,\n emojiStyle: EmojiStyle\n): void {\n if (!emoji) {\n return;\n }\n\n if (emojiStyle === EmojiStyle.NATIVE) {\n return;\n }\n\n const unified = emojiUnified(emoji);\n\n if (preloadedEmojs.has(unified)) {\n return;\n }\n\n emojiVariations(emoji).forEach((variation) => {\n const emojiUrl = getEmojiUrl(variation, emojiStyle);\n preloadImage(emojiUrl);\n });\n\n preloadedEmojs.add(unified);\n}\n\nexport const preloadedEmojs: Set<string> = new Set();\n\nfunction preloadImage(url: string): void {\n const image = new Image();\n image.src = url;\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n useClassNameConfig,\n useStyleConfig,\n useThemeConfig\n} from '../../config/useConfig';\nimport useIsSearchMode from '../../hooks/useIsSearchMode';\nimport { useKeyboardNavigation } from '../../hooks/useKeyboardNavigation';\nimport { useOnFocus } from '../../hooks/useOnFocus';\nimport { Theme } from '../../types/exposedTypes';\nimport { usePickerMainRef } from '../context/ElementRefContext';\nimport {\n PickerContextProvider,\n useReactionsModeState\n} from '../context/PickerContext';\n\ntype Props = Readonly<{\n children: React.ReactNode;\n}>;\n\nexport const DEFAULT_LABEL_HEIGHT = 40;\n\nexport default function PickerMain({ children }: Props) {\n return (\n <PickerContextProvider>\n <PickerRootElement>{children}</PickerRootElement>\n </PickerContextProvider>\n );\n}\n\ntype RootProps = Readonly<{\n className?: string;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}>;\n\nfunction PickerRootElement({ children }: RootProps) {\n const [reactionsMode] = useReactionsModeState();\n const theme = useThemeConfig();\n const searchModeActive = useIsSearchMode();\n const PickerMainRef = usePickerMainRef();\n const className = useClassNameConfig();\n const style = useStyleConfig();\n\n useKeyboardNavigation();\n useOnFocus();\n\n const { width, height, ...styleProps } = style || {};\n\n return (\n <aside\n className={cx(\n styles.main,\n styles.baseVariables,\n theme === Theme.DARK && styles.darkTheme,\n theme === Theme.AUTO && styles.autoThemeDark,\n {\n [ClassNames.searchActive]: searchModeActive\n },\n reactionsMode && styles.reactionsMenu,\n className\n )}\n ref={PickerMainRef}\n style={{\n ...styleProps,\n ...(!reactionsMode && { height, width })\n }}\n >\n {children}\n </aside>\n );\n}\n\nconst DarkTheme = {\n '--epr-emoji-variation-picker-bg-color':\n 'var(--epr-dark-emoji-variation-picker-bg-color)',\n '--epr-hover-bg-color-reduced-opacity':\n 'var(--epr-dark-hover-bg-color-reduced-opacity)',\n '--epr-highlight-color': 'var(--epr-dark-highlight-color)',\n '--epr-text-color': 'var(--epr-dark-text-color)',\n '--epr-hover-bg-color': 'var(--epr-dark-hover-bg-color)',\n '--epr-focus-bg-color': 'var(--epr-dark-focus-bg-color)',\n '--epr-search-input-bg-color': 'var(--epr-dark-search-input-bg-color)',\n '--epr-category-label-bg-color': 'var(--epr-dark-category-label-bg-color)',\n '--epr-picker-border-color': 'var(--epr-dark-picker-border-color)',\n '--epr-bg-color': 'var(--epr-dark-bg-color)',\n '--epr-reactions-bg-color': 'var(--epr-dark-reactions-bg-color)',\n '--epr-search-input-bg-color-active':\n 'var(--epr-dark-search-input-bg-color-active)',\n '--epr-emoji-variation-indicator-color':\n 'var(--epr-dark-emoji-variation-indicator-color)',\n '--epr-category-icon-active-color':\n 'var(--epr-dark-category-icon-active-color)',\n '--epr-skin-tone-picker-menu-color':\n 'var(--epr-dark-skin-tone-picker-menu-color)'\n};\n\nconst styles = stylesheet.create({\n main: {\n '.': ['epr-main', ClassNames.emojiPicker],\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderRadius: 'var(--epr-picker-border-radius)',\n borderColor: 'var(--epr-picker-border-color)',\n backgroundColor: 'var(--epr-bg-color)',\n overflow: 'hidden',\n transition: 'all 0.3s ease-in-out, background-color 0.1s ease-in-out',\n '*': {\n boxSizing: 'border-box',\n fontFamily: 'sans-serif'\n }\n },\n baseVariables: {\n '--': {\n '--epr-highlight-color': '#007aeb',\n '--epr-hover-bg-color': '#f1f8ff',\n '--epr-hover-bg-color-reduced-opacity': '#f1f8ff80',\n '--epr-focus-bg-color': '#e0f0ff',\n '--epr-text-color': '#858585',\n '--epr-search-input-bg-color': '#f6f6f6',\n '--epr-picker-border-color': '#e7e7e7',\n '--epr-bg-color': '#fff',\n '--epr-reactions-bg-color': '#ffffff90',\n '--epr-category-icon-active-color': '#6aa8de',\n '--epr-skin-tone-picker-menu-color': '#ffffff95',\n\n '--epr-horizontal-padding': '10px',\n\n '--epr-picker-border-radius': '8px',\n\n /* Header */\n '--epr-search-border-color': 'var(--epr-highlight-color)',\n '--epr-header-padding': '15px var(--epr-horizontal-padding)',\n\n /* Skin Tone Picker */\n '--epr-active-skin-tone-indicator-border-color':\n 'var(--epr-highlight-color)',\n '--epr-active-skin-hover-color': 'var(--epr-hover-bg-color)',\n\n /* Search */\n '--epr-search-input-bg-color-active': 'var(--epr-search-input-bg-color)',\n '--epr-search-input-padding': '0 30px',\n '--epr-search-input-border-radius': '8px',\n '--epr-search-input-height': '40px',\n '--epr-search-input-text-color': 'var(--epr-text-color)',\n '--epr-search-input-placeholder-color': 'var(--epr-text-color)',\n '--epr-search-bar-inner-padding': 'var(--epr-horizontal-padding)',\n\n /* Category Navigation */\n '--epr-category-navigation-button-size': '30px',\n\n /* Variation Picker */\n '--epr-emoji-variation-picker-height': '45px',\n '--epr-emoji-variation-picker-bg-color': 'var(--epr-bg-color)',\n\n /* Preview */\n '--epr-preview-height': '70px',\n '--epr-preview-text-size': '14px',\n '--epr-preview-text-padding': '0 var(--epr-horizontal-padding)',\n '--epr-preview-border-color': 'var(--epr-picker-border-color)',\n '--epr-preview-text-color': 'var(--epr-text-color)',\n\n /* Category */\n '--epr-category-padding': '0 var(--epr-horizontal-padding)',\n\n /* Category Label */\n '--epr-category-label-bg-color': '#ffffffe6',\n '--epr-category-label-text-color': 'var(--epr-text-color)',\n '--epr-category-label-padding': '0 var(--epr-horizontal-padding)',\n '--epr-category-label-height': `${DEFAULT_LABEL_HEIGHT}px`,\n\n /* Emoji */\n '--epr-emoji-size': '30px',\n '--epr-emoji-padding': '5px',\n '--epr-emoji-fullsize':\n 'calc(var(--epr-emoji-size) + var(--epr-emoji-padding) * 2)',\n '--epr-emoji-hover-color': 'var(--epr-hover-bg-color)',\n '--epr-emoji-variation-indicator-color': 'var(--epr-picker-border-color)',\n '--epr-emoji-variation-indicator-color-hover': 'var(--epr-text-color)',\n\n /* Z-Index */\n '--epr-header-overlay-z-index': '3',\n '--epr-emoji-variations-indictator-z-index': '1',\n '--epr-category-label-z-index': '2',\n '--epr-skin-variation-picker-z-index': '5',\n '--epr-preview-z-index': '6',\n\n /* Dark Theme Variables */\n '--epr-dark': '#000',\n '--epr-dark-emoji-variation-picker-bg-color': 'var(--epr-dark)',\n '--epr-dark-highlight-color': '#c0c0c0',\n '--epr-dark-text-color': 'var(--epr-highlight-color)',\n '--epr-dark-hover-bg-color': '#363636f6',\n '--epr-dark-hover-bg-color-reduced-opacity': '#36363680',\n '--epr-dark-focus-bg-color': '#474747',\n '--epr-dark-search-input-bg-color': '#333333',\n '--epr-dark-category-label-bg-color': '#222222e6',\n '--epr-dark-picker-border-color': '#151617',\n '--epr-dark-bg-color': '#222222',\n '--epr-dark-reactions-bg-color': '#22222290',\n '--epr-dark-search-input-bg-color-active': 'var(--epr-dark)',\n '--epr-dark-emoji-variation-indicator-color': '#444',\n '--epr-dark-category-icon-active-color': '#3271b7',\n '--epr-dark-skin-tone-picker-menu-color': '#22222295'\n }\n },\n autoThemeDark: {\n '.': ClassNames.autoTheme,\n '@media (prefers-color-scheme: dark)': {\n '--': DarkTheme\n }\n },\n darkTheme: {\n '.': ClassNames.darkTheme,\n '--': DarkTheme\n },\n reactionsMenu: {\n '.': 'epr-reactions',\n height: '50px',\n display: 'inline-flex',\n backgroundColor: 'var(--epr-reactions-bg-color)',\n // @ts-ignore - backdropFilter is not recognized.\n backdropFilter: 'blur(8px)',\n '--': {\n '--epr-picker-border-radius': '50px'\n }\n }\n});\n","import { useEffect } from 'react';\n\nimport { buttonFromTarget, emojiFromElement } from '../DomUtils/selectors';\nimport { useBodyRef } from '../components/context/ElementRefContext';\nimport { useEmojiStyleConfig, useGetEmojiUrlConfig } from '../config/useConfig';\nimport { emojiHasVariations } from '../dataUtils/emojiSelectors';\nimport { EmojiStyle } from '../types/exposedTypes';\n\nimport { preloadEmoji } from './preloadEmoji';\n\nexport function useOnFocus() {\n const BodyRef = useBodyRef();\n const emojiStyle = useEmojiStyleConfig();\n const getEmojiUrl = useGetEmojiUrlConfig();\n\n useEffect(() => {\n if (emojiStyle === EmojiStyle.NATIVE) {\n return;\n }\n\n const bodyRef = BodyRef.current;\n\n bodyRef?.addEventListener('focusin', onFocus);\n\n return () => {\n bodyRef?.removeEventListener('focusin', onFocus);\n };\n\n function onFocus(event: FocusEvent) {\n const button = buttonFromTarget(event.target as HTMLElement);\n\n if (!button) {\n return;\n }\n\n const [emoji] = emojiFromElement(button);\n\n if (!emoji) {\n return;\n }\n\n if (emojiHasVariations(emoji)) {\n preloadEmoji(getEmojiUrl, emoji, emojiStyle);\n }\n }\n }, [BodyRef, emojiStyle, getEmojiUrl]);\n}\n","export function parseNativeEmoji(unified: string): string {\n return unified\n .split('-')\n .map(hex => String.fromCodePoint(parseInt(hex, 16)))\n .join('');\n}\n","import { SkinTones, SuggestionMode } from '../types/exposedTypes';\n\nimport { DataEmoji } from './DataTypes';\nimport { emojiUnified } from './emojiSelectors';\n\nconst SUGGESTED_LS_KEY = 'epr_suggested';\n\ntype SuggestedItem = {\n unified: string;\n original: string;\n count: number;\n};\n\ntype Suggested = SuggestedItem[];\n\nexport function getSuggested(mode?: SuggestionMode): Suggested {\n try {\n if (!window?.localStorage) {\n return [];\n }\n const recent = JSON.parse(\n window?.localStorage.getItem(SUGGESTED_LS_KEY) ?? '[]'\n ) as Suggested;\n\n if (mode === SuggestionMode.FREQUENT) {\n return recent.sort((a, b) => b.count - a.count);\n }\n\n return recent;\n } catch {\n return [];\n }\n}\n\nexport function setSuggested(emoji: DataEmoji, skinTone: SkinTones) {\n const recent = getSuggested();\n\n const unified = emojiUnified(emoji, skinTone);\n const originalUnified = emojiUnified(emoji);\n\n let existing = recent.find(({ unified: u }) => u === unified);\n\n let nextList: SuggestedItem[];\n\n if (existing) {\n nextList = [existing].concat(recent.filter(i => i !== existing));\n } else {\n existing = {\n unified,\n original: originalUnified,\n count: 0\n };\n nextList = [existing, ...recent];\n }\n\n existing.count++;\n\n nextList.length = Math.min(nextList.length, 14);\n\n try {\n window?.localStorage.setItem(SUGGESTED_LS_KEY, JSON.stringify(nextList));\n // Prevents the change from being seen immediately.\n } catch {\n // ignore\n }\n}\n","import {\n Categories,\n CategoryConfig,\n CustomCategoryConfig\n} from '../config/categoryConfig';\nimport { CustomEmoji } from '../config/customEmojiConfig';\nimport { DataEmoji } from '../dataUtils/DataTypes';\n\nexport function isCustomCategory(\n category: CategoryConfig | CustomCategoryConfig\n): category is CustomCategoryConfig {\n return category.category === Categories.CUSTOM;\n}\n\nexport function isCustomEmoji(emoji: Partial<DataEmoji>): emoji is CustomEmoji {\n return emoji.imgUrl !== undefined;\n}\n","import * as React from 'react';\nimport { useEffect, useRef } from 'react';\n\nimport {\n emojiFromElement,\n isEmojiElement,\n NullableElement\n} from '../DomUtils/selectors';\nimport {\n useActiveSkinToneState,\n useDisallowClickRef,\n useEmojiVariationPickerState,\n useUpdateSuggested\n} from '../components/context/PickerContext';\nimport { GetEmojiUrl } from '../components/emoji/BaseEmojiProps';\nimport {\n MOUSE_EVENT_SOURCE,\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useOnEmojiClickConfig\n} from '../config/useConfig';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport {\n activeVariationFromUnified,\n emojiHasVariations,\n emojiNames,\n emojiUnified\n} from '../dataUtils/emojiSelectors';\nimport { parseNativeEmoji } from '../dataUtils/parseNativeEmoji';\nimport { setSuggested } from '../dataUtils/suggested';\nimport { isCustomEmoji } from '../typeRefinements/typeRefinements';\nimport { EmojiClickData, SkinTones, EmojiStyle } from '../types/exposedTypes';\n\nimport { useCloseAllOpenToggles } from './useCloseAllOpenToggles';\nimport useSetVariationPicker from './useSetVariationPicker';\n\nexport function useMouseDownHandlers(\n ContainerRef: React.MutableRefObject<NullableElement>,\n mouseEventSource: MOUSE_EVENT_SOURCE\n) {\n const mouseDownTimerRef = useRef<undefined | number>();\n const setVariationPicker = useSetVariationPicker();\n const disallowClickRef = useDisallowClickRef();\n const [, setEmojiVariationPicker] = useEmojiVariationPickerState();\n const closeAllOpenToggles = useCloseAllOpenToggles();\n const [activeSkinTone] = useActiveSkinToneState();\n const onEmojiClick = useOnEmojiClickConfig(mouseEventSource);\n const [, updateSuggested] = useUpdateSuggested();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const activeEmojiStyle = useEmojiStyleConfig();\n\n const onClick = React.useCallback(\n function onClick(event: MouseEvent) {\n if (disallowClickRef.current) {\n return;\n }\n\n closeAllOpenToggles();\n\n const [emoji, unified] = emojiFromEvent(event);\n\n if (!emoji || !unified) {\n return;\n }\n\n const skinToneToUse =\n activeVariationFromUnified(unified) || activeSkinTone;\n\n updateSuggested();\n setSuggested(emoji, skinToneToUse);\n onEmojiClick(\n emojiClickOutput(emoji, skinToneToUse, activeEmojiStyle, getEmojiUrl),\n event\n );\n },\n [\n activeSkinTone,\n closeAllOpenToggles,\n disallowClickRef,\n onEmojiClick,\n updateSuggested,\n getEmojiUrl,\n activeEmojiStyle\n ]\n );\n\n const onMouseDown = React.useCallback(\n function onMouseDown(event: MouseEvent) {\n if (mouseDownTimerRef.current) {\n clearTimeout(mouseDownTimerRef.current);\n }\n\n const [emoji] = emojiFromEvent(event);\n\n if (!emoji || !emojiHasVariations(emoji)) {\n return;\n }\n\n mouseDownTimerRef.current = window?.setTimeout(() => {\n disallowClickRef.current = true;\n mouseDownTimerRef.current = undefined;\n closeAllOpenToggles();\n setVariationPicker(event.target as HTMLElement);\n setEmojiVariationPicker(emoji);\n }, 500);\n },\n [\n disallowClickRef,\n closeAllOpenToggles,\n setVariationPicker,\n setEmojiVariationPicker\n ]\n );\n const onMouseUp = React.useCallback(\n function onMouseUp() {\n if (mouseDownTimerRef.current) {\n clearTimeout(mouseDownTimerRef.current);\n mouseDownTimerRef.current = undefined;\n } else if (disallowClickRef.current) {\n // The problem we're trying to overcome here\n // is that the emoji has both mouseup and click events\n // and when releasing a mouseup event\n // the click gets triggered too\n // So we're disallowing the click event for a short time\n\n requestAnimationFrame(() => {\n disallowClickRef.current = false;\n });\n }\n },\n [disallowClickRef]\n );\n\n useEffect(() => {\n if (!ContainerRef.current) {\n return;\n }\n const confainerRef = ContainerRef.current;\n confainerRef.addEventListener('click', onClick, {\n passive: true\n });\n\n confainerRef.addEventListener('mousedown', onMouseDown, {\n passive: true\n });\n confainerRef.addEventListener('mouseup', onMouseUp, {\n passive: true\n });\n\n return () => {\n confainerRef?.removeEventListener('click', onClick);\n confainerRef?.removeEventListener('mousedown', onMouseDown);\n confainerRef?.removeEventListener('mouseup', onMouseUp);\n };\n }, [ContainerRef, onClick, onMouseDown, onMouseUp]);\n}\n\nfunction emojiFromEvent(event: MouseEvent): [DataEmoji, string] | [] {\n const target = event?.target as HTMLElement;\n if (!isEmojiElement(target)) {\n return [];\n }\n\n return emojiFromElement(target);\n}\n\nfunction emojiClickOutput(\n emoji: DataEmoji,\n activeSkinTone: SkinTones,\n activeEmojiStyle: EmojiStyle,\n getEmojiUrl: GetEmojiUrl\n): EmojiClickData {\n const names = emojiNames(emoji);\n\n if (isCustomEmoji(emoji)) {\n const unified = emojiUnified(emoji);\n return {\n activeSkinTone,\n emoji: unified,\n getImageUrl() {\n return emoji.imgUrl;\n },\n imageUrl: emoji.imgUrl,\n isCustom: true,\n names,\n unified,\n unifiedWithoutSkinTone: unified\n };\n }\n const unified = emojiUnified(emoji, activeSkinTone);\n\n return {\n activeSkinTone,\n emoji: parseNativeEmoji(unified),\n getImageUrl(emojiStyle: EmojiStyle = activeEmojiStyle ?? EmojiStyle.APPLE) {\n return getEmojiUrl(unified, emojiStyle);\n },\n imageUrl: getEmojiUrl(unified, activeEmojiStyle ?? EmojiStyle.APPLE),\n isCustom: false,\n names,\n unified,\n unifiedWithoutSkinTone: emojiUnified(emoji)\n };\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\n\ninterface Props\n extends React.DetailedHTMLProps<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n > {\n className?: string;\n}\n\nexport function Button(props: Props) {\n return (\n <button\n type=\"button\"\n {...props}\n className={cx(styles.button, props.className)}\n >\n {props.children}\n </button>\n );\n}\n\nconst styles = stylesheet.create({\n button: {\n '.': 'epr-btn',\n cursor: 'pointer',\n border: '0',\n background: 'none',\n outline: 'none'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport {\n commonInteractionStyles,\n commonStyles,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport { Button } from '../atoms/Button';\n\ntype ClickableEmojiButtonProps = Readonly<{\n hidden?: boolean;\n showVariations?: boolean;\n hiddenOnSearch?: boolean;\n emojiNames: string[];\n children: React.ReactNode;\n hasVariations: boolean;\n unified?: string;\n noBackground?: boolean;\n className?: string;\n}>;\n\nexport function ClickableEmojiButton({\n emojiNames,\n unified,\n hidden,\n hiddenOnSearch,\n showVariations = true,\n hasVariations,\n children,\n className,\n noBackground = false\n}: ClickableEmojiButtonProps) {\n return (\n <Button\n className={cx(\n styles.emoji,\n hidden && commonStyles.hidden,\n hiddenOnSearch && commonInteractionStyles.hiddenOnSearch,\n {\n [ClassNames.visible]: !hidden && !hiddenOnSearch\n },\n !!(hasVariations && showVariations) && styles.hasVariations,\n noBackground && styles.noBackground,\n className\n )}\n data-unified={unified}\n aria-label={getAriaLabel(emojiNames)}\n data-full-name={emojiNames}\n >\n {children}\n </Button>\n );\n}\n\nfunction getAriaLabel(emojiNames: string[]) {\n return emojiNames[0].match('flag-')\n ? emojiNames[1] ?? emojiNames[0]\n : emojiNames[0];\n}\n\nconst styles = stylesheet.create({\n emoji: {\n '.': ClassNames.emoji,\n position: 'relative',\n width: 'var(--epr-emoji-fullsize)',\n height: 'var(--epr-emoji-fullsize)',\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n maxWidth: 'var(--epr-emoji-fullsize)',\n maxHeight: 'var(--epr-emoji-fullsize)',\n borderRadius: '8px',\n overflow: 'hidden',\n transition: 'background-color 0.2s',\n ':hover': {\n backgroundColor: 'var(--epr-emoji-hover-color)'\n },\n ':focus': {\n backgroundColor: 'var(--epr-focus-bg-color)'\n }\n },\n noBackground: {\n background: 'none',\n ':hover': {\n backgroundColor: 'transparent',\n background: 'none'\n },\n ':focus': {\n backgroundColor: 'transparent',\n background: 'none'\n }\n },\n hasVariations: {\n '.': ClassNames.emojiHasVariations,\n ':after': {\n content: '',\n display: 'block',\n width: '0',\n height: '0',\n right: '0px',\n bottom: '1px',\n position: 'absolute',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n transform: 'rotate(135deg)',\n borderBottom: '4px solid var(--epr-emoji-variation-indicator-color)',\n zIndex: 'var(--epr-emoji-variations-indictator-z-index)'\n },\n ':hover:after': {\n borderBottom: '4px solid var(--epr-emoji-variation-indicator-color-hover)'\n }\n }\n});\n","import { ClassNames } from '../../DomUtils/classNames';\nimport { stylesheet } from '../../Stylesheet/stylesheet';\n\nexport const emojiStyles = stylesheet.create({\n external: {\n '.': ClassNames.external,\n fontSize: '0'\n },\n common: {\n alignSelf: 'center',\n justifySelf: 'center',\n display: 'block'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport { EmojiStyle } from '../../types/exposedTypes';\n\nimport { emojiStyles } from './emojiStyles';\n\nexport function EmojiImg({\n emojiName,\n style,\n lazyLoad = false,\n imgUrl,\n onError,\n className\n}: {\n emojiName: string;\n emojiStyle: EmojiStyle;\n style: React.CSSProperties;\n lazyLoad?: boolean;\n imgUrl: string;\n onError: () => void;\n className?: string;\n}) {\n return (\n <img\n src={imgUrl}\n alt={emojiName}\n className={cx(styles.emojiImag, emojiStyles.external, emojiStyles.common, className)}\n loading={lazyLoad ? 'lazy' : 'eager'}\n onError={onError}\n style={style}\n />\n );\n}\n\nconst styles = stylesheet.create({\n emojiImag: {\n '.': 'epr-emoji-img',\n maxWidth: 'var(--epr-emoji-fullsize)',\n maxHeight: 'var(--epr-emoji-fullsize)',\n minWidth: 'var(--epr-emoji-fullsize)',\n minHeight: 'var(--epr-emoji-fullsize)',\n padding: 'var(--epr-emoji-padding)'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport { parseNativeEmoji } from '../../dataUtils/parseNativeEmoji';\n\nimport { emojiStyles } from './emojiStyles';\n\nexport function NativeEmoji({\n unified,\n style,\n className\n}: {\n unified: string;\n style: React.CSSProperties;\n className?: string;\n}) {\n return (\n <span\n className={cx(\n styles.nativeEmoji,\n emojiStyles.common,\n emojiStyles.external,\n className\n )}\n data-unified={unified}\n style={style}\n >\n {parseNativeEmoji(unified)}\n </span>\n );\n}\n\nconst styles = stylesheet.create({\n nativeEmoji: {\n '.': 'epr-emoji-native',\n fontFamily:\n '\"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Segoe UI\", \"Apple Color Emoji\", \"Twemoji Mozilla\", \"Noto Color Emoji\", \"EmojiOne Color\", \"Android Emoji\"!important',\n position: 'relative',\n lineHeight: '100%',\n fontSize: 'var(--epr-emoji-size)',\n textAlign: 'center',\n alignSelf: 'center',\n justifySelf: 'center',\n letterSpacing: '0',\n padding: 'var(--epr-emoji-padding)'\n }\n});\n","import * as React from 'react';\n\nimport {\n emojiByUnified,\n emojiName,\n emojiUrlByUnified\n} from '../../dataUtils/emojiSelectors';\nimport { isCustomEmoji } from '../../typeRefinements/typeRefinements';\nimport { EmojiStyle } from '../../types/exposedTypes';\nimport { useEmojisThatFailedToLoadState } from '../context/PickerContext';\n\nimport { BaseEmojiProps } from './BaseEmojiProps';\nimport { EmojiImg } from './EmojiImg';\nimport { NativeEmoji } from './NativeEmoji';\n\nexport function ViewOnlyEmoji({\n emoji,\n unified,\n emojiStyle,\n size,\n lazyLoad,\n getEmojiUrl = emojiUrlByUnified,\n className\n}: BaseEmojiProps) {\n const [, setEmojisThatFailedToLoad] = useEmojisThatFailedToLoadState();\n\n const style = {} as React.CSSProperties;\n if (size) {\n style.width = style.height = style.fontSize = `${size}px`;\n }\n\n const emojiToRender = emoji ? emoji : emojiByUnified(unified);\n\n if (!emojiToRender) {\n return null;\n }\n\n if (isCustomEmoji(emojiToRender)) {\n return (\n <EmojiImg\n style={style}\n emojiName={unified}\n emojiStyle={EmojiStyle.NATIVE}\n lazyLoad={lazyLoad}\n imgUrl={emojiToRender.imgUrl}\n onError={onError}\n className={className}\n />\n );\n }\n\n return (\n <>\n {emojiStyle === EmojiStyle.NATIVE ? (\n <NativeEmoji unified={unified} style={style} className={className} />\n ) : (\n <EmojiImg\n style={style}\n emojiName={emojiName(emojiToRender)}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoad}\n imgUrl={getEmojiUrl(unified, emojiStyle)}\n onError={onError}\n className={className}\n />\n )}\n </>\n );\n\n function onError() {\n setEmojisThatFailedToLoad(prev => new Set(prev).add(unified));\n }\n}\n","import * as React from 'react';\n\nimport { DataEmoji } from '../../dataUtils/DataTypes';\nimport { emojiHasVariations, emojiNames } from '../../dataUtils/emojiSelectors';\n\nimport { BaseEmojiProps } from './BaseEmojiProps';\nimport { ClickableEmojiButton } from './ClickableEmojiButton';\nimport { ViewOnlyEmoji } from './ViewOnlyEmoji';\n\ntype ClickableEmojiProps = Readonly<\n BaseEmojiProps & {\n hidden?: boolean;\n showVariations?: boolean;\n hiddenOnSearch?: boolean;\n emoji: DataEmoji;\n className?: string;\n noBackground?: boolean;\n }\n>;\n\nexport function ClickableEmoji({\n emoji,\n unified,\n hidden,\n hiddenOnSearch,\n emojiStyle,\n showVariations = true,\n size,\n lazyLoad,\n getEmojiUrl,\n className,\n noBackground = false\n}: ClickableEmojiProps) {\n const hasVariations = emojiHasVariations(emoji);\n\n return (\n <ClickableEmojiButton\n hasVariations={hasVariations}\n showVariations={showVariations}\n hidden={hidden}\n hiddenOnSearch={hiddenOnSearch}\n emojiNames={emojiNames(emoji)}\n unified={unified}\n noBackground={noBackground}\n >\n <ViewOnlyEmoji\n unified={unified}\n emoji={emoji}\n size={size}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoad}\n getEmojiUrl={getEmojiUrl}\n className={className}\n />\n </ClickableEmojiButton>\n );\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { darkMode, stylesheet } from '../../Stylesheet/stylesheet';\nimport { Button } from '../atoms/Button';\nimport { useReactionsModeState } from '../context/PickerContext';\n\nimport Plus from './svg/plus.svg';\n\nexport function BtnPlus() {\n const [, setReactionsMode] = useReactionsModeState();\n return (\n <Button\n aria-label=\"Show all Emojis\"\n title=\"Show all Emojis\"\n tabIndex={0}\n className={cx(styles.plusSign)}\n onClick={() => setReactionsMode(false)}\n />\n );\n}\n\nconst styles = stylesheet.create({\n plusSign: {\n fontSize: '20px',\n padding: '17px',\n color: 'var(--epr-text-color)',\n borderRadius: '50%',\n textAlign: 'center',\n lineHeight: '100%',\n width: '20px',\n height: '20px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n transition: 'background-color 0.2s ease-in-out',\n ':after': {\n content: '',\n minWidth: '20px',\n minHeight: '20px',\n backgroundImage: `url(${Plus})`,\n backgroundColor: 'transparent',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '20px',\n backgroundPositionY: '0'\n },\n ':hover': {\n color: 'var(--epr-highlight-color)',\n backgroundColor: 'var(--epr-hover-bg-color-reduced-opacity)',\n ':after': {\n backgroundPositionY: '-20px'\n }\n },\n ':focus': {\n color: 'var(--epr-highlight-color)',\n backgroundColor: 'var(--epr-hover-bg-color-reduced-opacity)',\n ':after': {\n backgroundPositionY: '-40px'\n }\n }\n },\n ...darkMode('plusSign', {\n ':after': { backgroundPositionY: '-40px' },\n ':hover:after': { backgroundPositionY: '-60px' }\n })\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { commonStyles, stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n MOUSE_EVENT_SOURCE,\n useEmojiStyleConfig,\n useReactionsConfig,\n useAllowExpandReactions\n} from '../../config/useConfig';\nimport { DataEmoji } from '../../dataUtils/DataTypes';\nimport { emojiByUnified } from '../../dataUtils/emojiSelectors';\nimport { useMouseDownHandlers } from '../../hooks/useMouseDownHandlers';\nimport { useReactionsRef } from '../context/ElementRefContext';\nimport { useReactionsModeState } from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nimport { BtnPlus } from './BtnPlus';\n\nexport function Reactions() {\n const [reactionsOpen] = useReactionsModeState();\n const ReactionsRef = useReactionsRef();\n const reactions = useReactionsConfig();\n useMouseDownHandlers(ReactionsRef, MOUSE_EVENT_SOURCE.REACTIONS);\n const emojiStyle = useEmojiStyleConfig();\n const allowExpandReactions = useAllowExpandReactions();\n\n if (!reactionsOpen) {\n return null;\n }\n\n return (\n <ul\n className={cx(styles.list, !reactionsOpen && commonStyles.hidden)}\n ref={ReactionsRef}\n >\n {reactions.map(reaction => (\n <li key={reaction}>\n <ClickableEmoji\n emoji={emojiByUnified(reaction) as DataEmoji}\n emojiStyle={emojiStyle}\n unified={reaction}\n showVariations={false}\n className={cx(styles.emojiButton)}\n noBackground\n />\n </li>\n ))}\n {allowExpandReactions ? (\n <li>\n <BtnPlus />\n </li>\n ) : null}\n </ul>\n );\n}\n\nconst styles = stylesheet.create({\n list: {\n listStyle: 'none',\n margin: '0',\n padding: '0 5px',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '100%'\n },\n emojiButton: {\n ':hover': {\n transform: 'scale(1.2)'\n },\n ':focus': {\n transform: 'scale(1.2)'\n },\n ':active': {\n transform: 'scale(1.1)'\n },\n transition: 'transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.5)'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport {\n commonInteractionStyles,\n commonStyles,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport {\n CategoryConfig,\n categoryFromCategoryConfig,\n categoryNameFromCategoryConfig\n} from '../../config/categoryConfig';\n\ntype Props = Readonly<{\n categoryConfig: CategoryConfig;\n children?: React.ReactNode;\n hidden?: boolean;\n hiddenOnSearch?: boolean;\n}>;\n\nexport function EmojiCategory({\n categoryConfig,\n children,\n hidden,\n hiddenOnSearch\n}: Props) {\n const category = categoryFromCategoryConfig(categoryConfig);\n const categoryName = categoryNameFromCategoryConfig(categoryConfig);\n\n return (\n <li\n className={cx(\n styles.category,\n hidden && commonStyles.hidden,\n hiddenOnSearch && commonInteractionStyles.hiddenOnSearch\n )}\n data-name={category}\n aria-label={categoryName}\n >\n <h2 className={cx(styles.label)}>{categoryName}</h2>\n <div className={cx(styles.categoryContent)}>{children}</div>\n </li>\n );\n}\n\nconst styles = stylesheet.create({\n category: {\n '.': ClassNames.category,\n ':not(:has(.epr-visible))': {\n display: 'none'\n }\n },\n categoryContent: {\n '.': ClassNames.categoryContent,\n display: 'grid',\n gridGap: '0',\n gridTemplateColumns: 'repeat(auto-fill, var(--epr-emoji-fullsize))',\n justifyContent: 'space-between',\n margin: 'var(--epr-category-padding)',\n position: 'relative'\n },\n label: {\n '.': ClassNames.label,\n alignItems: 'center',\n // @ts-ignore - backdropFilter is not recognized.\n backdropFilter: 'blur(3px)',\n backgroundColor: 'var(--epr-category-label-bg-color)',\n color: 'var(--epr-category-label-text-color)',\n display: 'flex',\n fontSize: '16px',\n fontWeight: 'bold',\n height: 'var(--epr-category-label-height)',\n margin: '0',\n padding: 'var(--epr-category-label-padding)',\n position: 'sticky',\n textTransform: 'capitalize',\n top: '0',\n width: '100%',\n zIndex: 'var(--epr-category-label-z-index)'\n }\n});\n","import * as React from 'react';\n\nlet isEverMounted = false;\n\nexport function useIsEverMounted() {\n const [isMounted, setIsMounted] = React.useState(isEverMounted);\n\n React.useEffect(() => {\n setIsMounted(true);\n isEverMounted = true;\n }, []);\n\n return isMounted || isEverMounted;\n}\n","import * as React from 'react';\n\nimport { CategoryConfig } from '../../config/categoryConfig';\nimport {\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useSuggestedEmojisModeConfig\n} from '../../config/useConfig';\nimport { emojiByUnified } from '../../dataUtils/emojiSelectors';\nimport { getSuggested } from '../../dataUtils/suggested';\nimport { useIsEverMounted } from '../../hooks/useIsEverMounted';\nimport { useUpdateSuggested } from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nimport { EmojiCategory } from './EmojiCategory';\n\ntype Props = Readonly<{\n categoryConfig: CategoryConfig;\n}>;\n\nexport function Suggested({ categoryConfig }: Props) {\n const [suggestedUpdated] = useUpdateSuggested();\n const isMounted = useIsEverMounted();\n const suggestedEmojisModeConfig = useSuggestedEmojisModeConfig();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const suggested = React.useMemo(\n () => getSuggested(suggestedEmojisModeConfig) ?? [],\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [suggestedUpdated, suggestedEmojisModeConfig]\n );\n const emojiStyle = useEmojiStyleConfig();\n\n if (!isMounted) {\n return null;\n }\n\n return (\n <EmojiCategory\n categoryConfig={categoryConfig}\n hiddenOnSearch\n hidden={suggested.length === 0}\n >\n {suggested.map(suggestedItem => {\n const emoji = emojiByUnified(suggestedItem.original);\n\n if (!emoji) {\n return null;\n }\n\n return (\n <ClickableEmoji\n showVariations={false}\n unified={suggestedItem.unified}\n emojiStyle={emojiStyle}\n emoji={emoji}\n key={suggestedItem.unified}\n getEmojiUrl={getEmojiUrl}\n />\n );\n })}\n </EmojiCategory>\n );\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n Categories,\n CategoryConfig,\n categoryFromCategoryConfig\n} from '../../config/categoryConfig';\nimport {\n useCategoriesConfig,\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useLazyLoadEmojisConfig,\n useSkinTonesDisabledConfig\n} from '../../config/useConfig';\nimport { emojisByCategory, emojiUnified } from '../../dataUtils/emojiSelectors';\nimport { useIsEmojiDisallowed } from '../../hooks/useDisallowedEmojis';\nimport { useIsEmojiHidden } from '../../hooks/useIsEmojiHidden';\nimport {\n useActiveSkinToneState,\n useIsPastInitialLoad\n} from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nimport { EmojiCategory } from './EmojiCategory';\nimport { Suggested } from './Suggested';\n\nexport function EmojiList() {\n const categories = useCategoriesConfig();\n const renderdCategoriesCountRef = React.useRef(0);\n\n return (\n <ul className={cx(styles.emojiList)}>\n {categories.map(categoryConfig => {\n const category = categoryFromCategoryConfig(categoryConfig);\n\n if (category === Categories.SUGGESTED) {\n return <Suggested key={category} categoryConfig={categoryConfig} />;\n }\n\n return (\n <RenderCategory\n key={category}\n category={category}\n categoryConfig={categoryConfig}\n renderdCategoriesCountRef={renderdCategoriesCountRef}\n />\n );\n })}\n </ul>\n );\n}\n\nfunction RenderCategory({\n category,\n categoryConfig,\n renderdCategoriesCountRef\n}: {\n category: Categories;\n categoryConfig: CategoryConfig;\n renderdCategoriesCountRef: React.MutableRefObject<number>;\n}) {\n const isEmojiHidden = useIsEmojiHidden();\n const lazyLoadEmojis = useLazyLoadEmojisConfig();\n const emojiStyle = useEmojiStyleConfig();\n const isPastInitialLoad = useIsPastInitialLoad();\n const [activeSkinTone] = useActiveSkinToneState();\n const isEmojiDisallowed = useIsEmojiDisallowed();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const showVariations = !useSkinTonesDisabledConfig();\n\n // Small trick to defer the rendering of all emoji categories until the first category is visible\n // This way the user gets to actually see something and not wait for the whole picker to render.\n const emojisToPush =\n !isPastInitialLoad && renderdCategoriesCountRef.current > 0\n ? []\n : emojisByCategory(category);\n\n if (emojisToPush.length > 0) {\n renderdCategoriesCountRef.current++;\n }\n\n let hiddenCounter = 0;\n\n const emojis = emojisToPush.map(emoji => {\n const unified = emojiUnified(emoji, activeSkinTone);\n const { failedToLoad, filteredOut, hidden } = isEmojiHidden(emoji);\n\n const isDisallowed = isEmojiDisallowed(emoji);\n\n if (hidden || isDisallowed) {\n hiddenCounter++;\n }\n\n if (isDisallowed) {\n return null;\n }\n\n return (\n <ClickableEmoji\n showVariations={showVariations}\n key={unified}\n emoji={emoji}\n unified={unified}\n hidden={failedToLoad}\n hiddenOnSearch={filteredOut}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoadEmojis}\n getEmojiUrl={getEmojiUrl}\n />\n );\n });\n\n return (\n <EmojiCategory\n categoryConfig={categoryConfig}\n // Indicates that there are no visible emojis\n // Hence, the category should be hidden\n hidden={hiddenCounter === emojis.length}\n >\n {emojis}\n </EmojiCategory>\n );\n}\n\nconst styles = stylesheet.create({\n emojiList: {\n '.': ClassNames.emojiList,\n listStyle: 'none',\n margin: '0',\n padding: '0'\n }\n});\n","import { useUnicodeToHide } from \"../config/useConfig\";\n\nexport function useIsUnicodeHidden() {\n const unicodeToHide = useUnicodeToHide();\n return (emojiUnified: string) => unicodeToHide.has(emojiUnified);\n }\n","import { useEmojisThatFailedToLoadState } from '../components/context/PickerContext';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport { emojiUnified } from '../dataUtils/emojiSelectors';\n\nimport { useIsEmojiFiltered } from './useFilter';\n\nexport function useIsEmojiHidden(): (emoji: DataEmoji) => IsHiddenReturn {\n const [emojisThatFailedToLoad] = useEmojisThatFailedToLoadState();\n const isEmojiFiltered = useIsEmojiFiltered();\n\n return (emoji: DataEmoji): IsHiddenReturn => {\n const unified = emojiUnified(emoji);\n\n const failedToLoad = emojisThatFailedToLoad.has(unified);\n const filteredOut = isEmojiFiltered(unified);\n\n return {\n failedToLoad,\n filteredOut,\n hidden: failedToLoad || filteredOut\n };\n };\n}\n\ntype IsHiddenReturn = {\n failedToLoad: boolean;\n filteredOut: boolean;\n hidden: boolean;\n};\n","import { cx } from 'flairup';\nimport * as React from 'react';\nimport { useEffect } from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport { focusFirstVisibleEmoji } from '../../DomUtils/keyboardNavigation';\nimport {\n buttonFromTarget,\n elementHeight,\n emojiTrueOffsetTop,\n emojiTruOffsetLeft\n} from '../../DomUtils/selectors';\nimport { darkMode, stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n useEmojiStyleConfig,\n useGetEmojiUrlConfig\n} from '../../config/useConfig';\nimport {\n emojiHasVariations,\n emojiUnified,\n emojiVariations\n} from '../../dataUtils/emojiSelectors';\nimport {\n useAnchoredEmojiRef,\n useBodyRef,\n useSetAnchoredEmojiRef,\n useVariationPickerRef\n} from '../context/ElementRefContext';\nimport { useEmojiVariationPickerState } from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nimport SVGTriangle from './svg/triangle.svg';\n\nenum Direction {\n Up,\n Down\n}\n\n// eslint-disable-next-line complexity\nexport function EmojiVariationPicker() {\n const AnchoredEmojiRef = useAnchoredEmojiRef();\n const VariationPickerRef = useVariationPickerRef();\n const [emoji] = useEmojiVariationPickerState();\n const emojiStyle = useEmojiStyleConfig();\n\n const { getTop, getMenuDirection } = useVariationPickerTop(\n VariationPickerRef\n );\n const setAnchoredEmojiRef = useSetAnchoredEmojiRef();\n const getPointerStyle = usePointerStyle(VariationPickerRef);\n const getEmojiUrl = useGetEmojiUrlConfig();\n\n const button = buttonFromTarget(AnchoredEmojiRef.current);\n\n const visible = Boolean(\n emoji &&\n button &&\n emojiHasVariations(emoji) &&\n button.classList.contains(ClassNames.emojiHasVariations)\n );\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n\n focusFirstVisibleEmoji(VariationPickerRef.current);\n }, [VariationPickerRef, visible, AnchoredEmojiRef]);\n\n let top, pointerStyle;\n\n if (!visible && AnchoredEmojiRef.current) {\n setAnchoredEmojiRef(null);\n } else {\n top = getTop();\n pointerStyle = getPointerStyle();\n }\n\n return (\n <div\n ref={VariationPickerRef}\n className={cx(\n styles.variationPicker,\n getMenuDirection() === Direction.Down && styles.pointingUp,\n visible && styles.visible\n )}\n style={{ top }}\n >\n {visible && emoji\n ? [emojiUnified(emoji)]\n .concat(emojiVariations(emoji))\n .slice(0, 6)\n .map(unified => (\n <ClickableEmoji\n key={unified}\n emoji={emoji}\n unified={unified}\n emojiStyle={emojiStyle}\n showVariations={false}\n getEmojiUrl={getEmojiUrl}\n />\n ))\n : null}\n <div className={cx(styles.pointer)} style={pointerStyle} />\n </div>\n );\n}\n\nfunction usePointerStyle(VariationPickerRef: React.RefObject<HTMLElement>) {\n const AnchoredEmojiRef = useAnchoredEmojiRef();\n return function getPointerStyle() {\n const style: React.CSSProperties = {};\n if (!VariationPickerRef.current) {\n return style;\n }\n\n if (AnchoredEmojiRef.current) {\n const button = buttonFromTarget(AnchoredEmojiRef.current);\n\n const offsetLeft = emojiTruOffsetLeft(button);\n\n if (!button) {\n return style;\n }\n\n // half of the button\n style.left = offsetLeft + button?.clientWidth / 2;\n }\n\n return style;\n };\n}\n\nfunction useVariationPickerTop(\n VariationPickerRef: React.RefObject<HTMLElement>\n) {\n const AnchoredEmojiRef = useAnchoredEmojiRef();\n const BodyRef = useBodyRef();\n let direction = Direction.Up;\n\n return {\n getMenuDirection,\n getTop\n };\n\n function getMenuDirection() {\n return direction;\n }\n\n function getTop() {\n direction = Direction.Up;\n let emojiOffsetTop = 0;\n\n if (!VariationPickerRef.current) {\n return 0;\n }\n\n const height = elementHeight(VariationPickerRef.current);\n\n if (AnchoredEmojiRef.current) {\n const bodyRef = BodyRef.current;\n const button = buttonFromTarget(AnchoredEmojiRef.current);\n\n const buttonHeight = elementHeight(button);\n\n emojiOffsetTop = emojiTrueOffsetTop(button);\n\n const scrollTop = bodyRef?.scrollTop ?? 0;\n\n if (scrollTop > emojiOffsetTop - height) {\n direction = Direction.Down;\n emojiOffsetTop += buttonHeight + height;\n }\n }\n\n return emojiOffsetTop - height;\n }\n}\n\nconst styles = stylesheet.create({\n variationPicker: {\n '.': ClassNames.variationPicker,\n position: 'absolute',\n right: '15px',\n left: '15px',\n padding: '5px',\n boxShadow: '0px 2px 5px rgba(0, 0, 0, 0.2)',\n borderRadius: '3px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-around',\n opacity: '0',\n visibility: 'hidden',\n pointerEvents: 'none',\n top: '-100%',\n border: '1px solid var(--epr-picker-border-color)',\n height: 'var(--epr-emoji-variation-picker-height)',\n zIndex: 'var(--epr-skin-variation-picker-z-index)',\n background: 'var(--epr-emoji-variation-picker-bg-color)',\n transform: 'scale(0.9)',\n transition: 'transform 0.1s ease-out, opacity 0.2s ease-out'\n },\n visible: {\n opacity: '1',\n visibility: 'visible',\n pointerEvents: 'all',\n transform: 'scale(1)'\n },\n pointingUp: {\n '.': 'pointing-up',\n transformOrigin: 'center 0%',\n transform: 'scale(0.9)'\n },\n '.pointing-up': {\n pointer: {\n top: '0',\n transform: 'rotate(180deg) translateY(100%) translateX(18px)'\n }\n },\n pointer: {\n '.': 'epr-emoji-pointer',\n content: '',\n position: 'absolute',\n width: '25px',\n height: '15px',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: '0 0',\n backgroundSize: '50px 15px',\n top: '100%',\n transform: 'translateX(-18px)',\n backgroundImage: `url(${SVGTriangle})`\n },\n ...darkMode('pointer', {\n backgroundPosition: '-25px 0'\n })\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport {\n commonInteractionStyles,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport { MOUSE_EVENT_SOURCE } from '../../config/useConfig';\nimport { useOnMouseMove } from '../../hooks/useDisallowMouseMove';\nimport { useMouseDownHandlers } from '../../hooks/useMouseDownHandlers';\nimport { useOnScroll } from '../../hooks/useOnScroll';\nimport { useBodyRef } from '../context/ElementRefContext';\n\nimport { EmojiList } from './EmojiList';\nimport { EmojiVariationPicker } from './EmojiVariationPicker';\n\nexport function Body() {\n const BodyRef = useBodyRef();\n useOnScroll(BodyRef);\n useMouseDownHandlers(BodyRef, MOUSE_EVENT_SOURCE.PICKER);\n useOnMouseMove();\n\n return (\n <div\n className={cx(styles.body, commonInteractionStyles.hiddenOnReactions)}\n ref={BodyRef}\n >\n <EmojiVariationPicker />\n <EmojiList />\n </div>\n );\n}\n\nconst styles = stylesheet.create({\n body: {\n '.': ClassNames.scrollBody,\n flex: '1',\n overflowY: 'scroll',\n overflowX: 'hidden',\n position: 'relative'\n }\n});\n","import { useEffect } from 'react';\n\nimport { ElementRef } from '../components/context/ElementRefContext';\n\nimport { useCloseAllOpenToggles } from './useCloseAllOpenToggles';\n\nexport function useOnScroll(BodyRef: ElementRef) {\n const closeAllOpenToggles = useCloseAllOpenToggles();\n\n useEffect(() => {\n const bodyRef = BodyRef.current;\n if (!bodyRef) {\n return;\n }\n\n bodyRef.addEventListener('scroll', onScroll, {\n passive: true\n });\n\n function onScroll() {\n closeAllOpenToggles();\n }\n\n return () => {\n bodyRef?.removeEventListener('scroll', onScroll);\n };\n }, [BodyRef, closeAllOpenToggles]);\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\n\nexport enum FlexDirection {\n ROW = 'FlexRow',\n COLUMN = 'FlexColumn'\n}\n\ntype Props = Readonly<{\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n direction?: FlexDirection;\n}>;\n\nexport default function Flex({\n children,\n className,\n style = {},\n direction = FlexDirection.ROW\n}: Props) {\n return (\n <div\n style={{ ...style }}\n className={cx(styles.flex, className, styles[direction])}\n >\n {children}\n </div>\n );\n}\n\nconst styles = stylesheet.create({\n flex: {\n display: 'flex'\n },\n [FlexDirection.ROW]: {\n flexDirection: 'row'\n },\n [FlexDirection.COLUMN]: {\n flexDirection: 'column'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\n\ntype Props = Readonly<{\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport default function Space({ className, style = {} }: Props) {\n return <div style={{ flex: 1, ...style }} className={cx(className)} />;\n}\n","import * as React from 'react';\n\ntype Props = Readonly<{\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport default function Absolute({ children, className, style }: Props) {\n return (\n <div style={{ ...style, position: 'absolute' }} className={className}>\n {children}\n </div>\n );\n}\n","import * as React from 'react';\n\ntype Props = Readonly<{\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport default function Relative({ children, className, style }: Props) {\n return (\n <div style={{ ...style, position: 'relative' }} className={className}>\n {children}\n </div>\n );\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../../Stylesheet/stylesheet';\nimport { skinTonesNamed } from '../../../data/skinToneVariations';\nimport { SkinTones } from '../../../types/exposedTypes';\nimport { Button } from '../../atoms/Button';\n\ntype Props = {\n isOpen: boolean;\n onClick: () => void;\n isActive: boolean;\n skinToneVariation: SkinTones;\n style?: React.CSSProperties;\n};\n\n// eslint-disable-next-line complexity\nexport function BtnSkinToneVariation({\n isOpen,\n onClick,\n isActive,\n skinToneVariation,\n style\n}: Props) {\n return (\n <Button\n style={style}\n onClick={onClick}\n className={cx(\n `epr-tone-${skinToneVariation}`,\n styles.tone,\n !isOpen && styles.closedTone,\n isActive && styles.active\n )}\n tabIndex={isOpen ? 0 : -1}\n aria-pressed={isActive}\n aria-label={`Skin tone ${skinTonesNamed[skinToneVariation as SkinTones]}`}\n ></Button>\n );\n}\n\nconst styles = stylesheet.create({\n closedTone: {\n opacity: '0',\n zIndex: '0'\n },\n active: {\n '.': 'epr-active',\n zIndex: '1',\n opacity: '1'\n },\n tone: {\n '.': 'epr-tone',\n ':hover': {\n boxShadow: '0 0 0 3px var(--epr-active-skin-hover-color)'\n },\n ':focus': {\n boxShadow: '0 0 0 3px var(--epr-focus-bg-color)'\n },\n '&.epr-tone-neutral': {\n backgroundColor: '#ffd225'\n },\n '&.epr-tone-1f3fb': {\n backgroundColor: '#ffdfbd'\n },\n '&.epr-tone-1f3fc': {\n backgroundColor: '#e9c197'\n },\n '&.epr-tone-1f3fd': {\n backgroundColor: '#c88e62'\n },\n '&.epr-tone-1f3fe': {\n backgroundColor: '#a86637'\n },\n '&.epr-tone-1f3ff': {\n backgroundColor: '#60463a'\n }\n }\n});\n","/* eslint-disable complexity */\nimport { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../../DomUtils/classNames';\nimport { stylesheet } from '../../../Stylesheet/stylesheet';\nimport {\n useOnSkinToneChangeConfig,\n useSkinTonesDisabledConfig\n} from '../../../config/useConfig';\nimport skinToneVariations from '../../../data/skinToneVariations';\nimport { useCloseAllOpenToggles } from '../../../hooks/useCloseAllOpenToggles';\nimport { useFocusSearchInput } from '../../../hooks/useFocus';\nimport Absolute from '../../Layout/Absolute';\nimport Relative from '../../Layout/Relative';\nimport { useSkinTonePickerRef } from '../../context/ElementRefContext';\nimport {\n useActiveSkinToneState,\n useSkinToneFanOpenState\n} from '../../context/PickerContext';\n\nimport { BtnSkinToneVariation } from './BtnSkinToneVariation';\n\nconst ITEM_SIZE = 28;\n\ntype Props = {\n direction?: SkinTonePickerDirection;\n};\n\nexport function SkinTonePickerMenu() {\n return (\n <Relative style={{ height: ITEM_SIZE }}>\n <Absolute style={{ bottom: 0, right: 0 }}>\n <SkinTonePicker direction={SkinTonePickerDirection.VERTICAL} />\n </Absolute>\n </Relative>\n );\n}\n\nexport function SkinTonePicker({\n direction = SkinTonePickerDirection.HORIZONTAL\n}: Props) {\n const SkinTonePickerRef = useSkinTonePickerRef();\n const isDisabled = useSkinTonesDisabledConfig();\n const [isOpen, setIsOpen] = useSkinToneFanOpenState();\n const [activeSkinTone, setActiveSkinTone] = useActiveSkinToneState();\n const onSkinToneChange = useOnSkinToneChangeConfig();\n const closeAllOpenToggles = useCloseAllOpenToggles();\n const focusSearchInput = useFocusSearchInput();\n\n if (isDisabled) {\n return null;\n }\n\n const fullWidth = `${ITEM_SIZE * skinToneVariations.length}px`;\n\n const expandedSize = isOpen ? fullWidth : ITEM_SIZE + 'px';\n\n const vertical = direction === SkinTonePickerDirection.VERTICAL;\n\n return (\n <Relative\n className={cx(\n styles.skinTones,\n vertical && styles.vertical,\n isOpen && styles.open,\n vertical && isOpen && styles.verticalShadow\n )}\n style={\n vertical\n ? { flexBasis: expandedSize, height: expandedSize }\n : { flexBasis: expandedSize }\n }\n >\n <div className={cx(styles.select)} ref={SkinTonePickerRef}>\n {skinToneVariations.map((skinToneVariation, i) => {\n const active = skinToneVariation === activeSkinTone;\n\n return (\n <BtnSkinToneVariation\n key={skinToneVariation}\n skinToneVariation={skinToneVariation}\n isOpen={isOpen}\n style={{\n transform: cx(\n vertical\n ? `translateY(-${i * (isOpen ? ITEM_SIZE : 0)}px)`\n : `translateX(-${i * (isOpen ? ITEM_SIZE : 0)}px)`,\n isOpen && active && 'scale(1.3)'\n )\n }}\n isActive={active}\n onClick={() => {\n if (isOpen) {\n setActiveSkinTone(skinToneVariation);\n onSkinToneChange(skinToneVariation);\n focusSearchInput();\n } else {\n setIsOpen(true);\n }\n closeAllOpenToggles();\n }}\n />\n );\n })}\n </div>\n </Relative>\n );\n}\n\nexport enum SkinTonePickerDirection {\n VERTICAL = ClassNames.vertical,\n HORIZONTAL = ClassNames.horizontal\n}\n\nconst styles = stylesheet.create({\n skinTones: {\n '.': 'epr-skin-tones',\n '--': {\n '--epr-skin-tone-size': '15px'\n },\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n transition: 'all 0.3s ease-in-out',\n padding: '10px 0'\n },\n vertical: {\n padding: '9px',\n alignItems: 'flex-end',\n flexDirection: 'column',\n borderRadius: '6px',\n border: '1px solid var(--epr-bg-color)'\n },\n verticalShadow: {\n boxShadow: '0px 0 7px var(--epr-picker-border-color)'\n },\n open: {\n // @ts-ignore - backdropFilter is not recognized.\n backdropFilter: 'blur(5px)',\n background: 'var(--epr-skin-tone-picker-menu-color)',\n '.epr-active:after': {\n content: '',\n position: 'absolute',\n top: '-2px',\n left: '-2px',\n right: '-2px',\n bottom: '-2px',\n borderRadius: '5px',\n border: '1px solid var(--epr-active-skin-tone-indicator-border-color)'\n }\n },\n select: {\n '.': 'epr-skin-tone-select',\n position: 'relative',\n width: 'var(--epr-skin-tone-size)',\n height: 'var(--epr-skin-tone-size)',\n '> button': {\n width: 'var(--epr-skin-tone-size)',\n display: 'block',\n cursor: 'pointer',\n borderRadius: '4px',\n height: 'var(--epr-skin-tone-size)',\n position: 'absolute',\n right: '0',\n transition: 'transform 0.3s ease-in-out, opacity 0.35s ease-in-out',\n zIndex: '0',\n boxShadow: '0 0 0 0px var(--epr-active-skin-hover-color)'\n }\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\nimport { useState } from 'react';\n\nimport {\n commonInteractionStyles,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport {\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n usePreviewConfig\n} from '../../config/useConfig';\nimport {\n emojiByUnified,\n emojiName,\n emojiUnified\n} from '../../dataUtils/emojiSelectors';\nimport { useEmojiPreviewEvents } from '../../hooks/useEmojiPreviewEvents';\nimport { useIsSkinToneInPreview } from '../../hooks/useShouldShowSkinTonePicker';\nimport Flex from '../Layout/Flex';\nimport Space from '../Layout/Space';\nimport { useEmojiVariationPickerState } from '../context/PickerContext';\nimport { ViewOnlyEmoji } from '../emoji/ViewOnlyEmoji';\nimport { SkinTonePickerMenu } from '../header/SkinTonePicker/SkinTonePicker';\n\nexport function Preview() {\n const previewConfig = usePreviewConfig();\n const isSkinToneInPreview = useIsSkinToneInPreview();\n\n if (!previewConfig.showPreview) {\n return null;\n }\n\n return (\n <Flex\n className={cx(styles.preview, commonInteractionStyles.hiddenOnReactions)}\n >\n <PreviewBody />\n <Space />\n {isSkinToneInPreview ? <SkinTonePickerMenu /> : null}\n </Flex>\n );\n}\n\nexport function PreviewBody() {\n const previewConfig = usePreviewConfig();\n const [previewEmoji, setPreviewEmoji] = useState<PreviewEmoji>(null);\n const emojiStyle = useEmojiStyleConfig();\n const [variationPickerEmoji] = useEmojiVariationPickerState();\n const getEmojiUrl = useGetEmojiUrlConfig();\n\n useEmojiPreviewEvents(previewConfig.showPreview, setPreviewEmoji);\n\n const emoji = emojiByUnified(\n previewEmoji?.unified ?? previewEmoji?.originalUnified\n );\n\n const show = emoji != null && previewEmoji != null;\n\n return <PreviewContent />;\n\n function PreviewContent() {\n const defaultEmoji =\n variationPickerEmoji ?? emojiByUnified(previewConfig.defaultEmoji);\n if (!defaultEmoji) {\n return null;\n }\n const defaultText = variationPickerEmoji\n ? emojiName(variationPickerEmoji)\n : previewConfig.defaultCaption;\n\n return (\n <>\n <div>\n {show ? (\n <ViewOnlyEmoji\n unified={previewEmoji?.unified as string}\n emoji={emoji}\n emojiStyle={emojiStyle}\n size={45}\n getEmojiUrl={getEmojiUrl}\n className={cx(styles.emoji)}\n />\n ) : defaultEmoji ? (\n <ViewOnlyEmoji\n unified={emojiUnified(defaultEmoji)}\n emoji={defaultEmoji}\n emojiStyle={emojiStyle}\n size={45}\n getEmojiUrl={getEmojiUrl}\n className={cx(styles.emoji)}\n />\n ) : null}\n </div>\n <div className={cx(styles.label)}>\n {show ? emojiName(emoji) : defaultText}\n </div>\n </>\n );\n }\n}\n\nexport type PreviewEmoji = null | {\n unified: string;\n originalUnified: string;\n};\n\nconst styles = stylesheet.create({\n preview: {\n alignItems: 'center',\n borderTop: '1px solid var(--epr-preview-border-color)',\n height: 'var(--epr-preview-height)',\n padding: '0 var(--epr-horizontal-padding)',\n position: 'relative',\n zIndex: 'var(--epr-preview-z-index)'\n },\n label: {\n color: 'var(--epr-preview-text-color)',\n fontSize: 'var(--epr-preview-text-size)',\n padding: 'var(--epr-preview-text-padding)',\n textTransform: 'capitalize'\n },\n emoji: {\n padding: '0'\n }\n});\n","import * as React from 'react';\nimport { useEffect } from 'react';\n\nimport { detectEmojyPartiallyBelowFold } from '../DomUtils/detectEmojyPartiallyBelowFold';\nimport { focusElement } from '../DomUtils/focusElement';\nimport {\n allUnifiedFromEmojiElement,\n buttonFromTarget\n} from '../DomUtils/selectors';\nimport { useBodyRef } from '../components/context/ElementRefContext';\nimport { PreviewEmoji } from '../components/footer/Preview';\n\nimport {\n useAllowMouseMove,\n useIsMouseDisallowed\n} from './useDisallowMouseMove';\n\nexport function useEmojiPreviewEvents(\n allow: boolean,\n setPreviewEmoji: React.Dispatch<React.SetStateAction<PreviewEmoji>>\n) {\n const BodyRef = useBodyRef();\n const isMouseDisallowed = useIsMouseDisallowed();\n const allowMouseMove = useAllowMouseMove();\n\n useEffect(() => {\n if (!allow) {\n return;\n }\n const bodyRef = BodyRef.current;\n\n bodyRef?.addEventListener('keydown', onEscape, {\n passive: true\n });\n\n bodyRef?.addEventListener('mouseover', onMouseOver, true);\n\n bodyRef?.addEventListener('focus', onEnter, true);\n\n bodyRef?.addEventListener('mouseout', onLeave, {\n passive: true\n });\n bodyRef?.addEventListener('blur', onLeave, true);\n\n function onEnter(e: FocusEvent) {\n const button = buttonFromTarget(e.target as HTMLElement);\n\n if (!button) {\n return onLeave();\n }\n\n const { unified, originalUnified } = allUnifiedFromEmojiElement(button);\n\n if (!unified || !originalUnified) {\n return onLeave();\n }\n\n setPreviewEmoji({\n unified,\n originalUnified\n });\n }\n function onLeave(e?: FocusEvent | MouseEvent) {\n if (e) {\n const relatedTarget = e.relatedTarget as HTMLElement;\n\n if (!buttonFromTarget(relatedTarget)) {\n return setPreviewEmoji(null);\n }\n }\n\n setPreviewEmoji(null);\n }\n function onEscape(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n setPreviewEmoji(null);\n }\n }\n\n function onMouseOver(e: MouseEvent) {\n if (isMouseDisallowed()) {\n return;\n }\n\n const button = buttonFromTarget(e.target as HTMLElement);\n\n if (button) {\n const belowFoldByPx = detectEmojyPartiallyBelowFold(button, bodyRef);\n const buttonHeight = button.getBoundingClientRect().height;\n if (belowFoldByPx < buttonHeight) {\n return handlePartiallyVisibleElementFocus(button, setPreviewEmoji);\n }\n\n focusElement(button);\n }\n }\n\n return () => {\n bodyRef?.removeEventListener('mouseover', onMouseOver);\n bodyRef?.removeEventListener('mouseout', onLeave);\n bodyRef?.removeEventListener('focus', onEnter, true);\n bodyRef?.removeEventListener('blur', onLeave, true);\n bodyRef?.removeEventListener('keydown', onEscape);\n };\n }, [BodyRef, allow, setPreviewEmoji, isMouseDisallowed, allowMouseMove]);\n}\n\nfunction handlePartiallyVisibleElementFocus(\n button: HTMLElement,\n setPreviewEmoji: React.Dispatch<React.SetStateAction<PreviewEmoji>>\n) {\n const { unified, originalUnified } = allUnifiedFromEmojiElement(button);\n\n if (!unified || !originalUnified) {\n return;\n }\n\n (document.activeElement as HTMLElement)?.blur?.();\n\n setPreviewEmoji({\n unified,\n originalUnified\n });\n}\n","import { NullableElement } from './selectors';\n\nexport function detectEmojyPartiallyBelowFold(\n button: HTMLButtonElement,\n bodyRef: NullableElement\n): number {\n if (!button || !bodyRef) {\n return 0;\n }\n\n const buttonRect = button.getBoundingClientRect();\n const bodyRect = bodyRef.getBoundingClientRect();\n\n // If the element is obscured by at least half of its size\n return bodyRect.height - (buttonRect.y - bodyRect.y);\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport {\n commonInteractionStyles,\n darkMode,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport {\n CategoryConfig,\n categoryNameFromCategoryConfig\n} from '../../config/categoryConfig';\nimport { Button } from '../atoms/Button';\n\nimport SVGNavigation from './svg/CategoryNav.svg';\n\ntype Props = {\n isActiveCategory: boolean;\n category: string;\n allowNavigation: boolean;\n onClick: () => void;\n categoryConfig: CategoryConfig;\n};\n\nexport function CategoryButton({\n isActiveCategory,\n category,\n allowNavigation,\n categoryConfig,\n onClick\n}: Props) {\n return (\n <Button\n tabIndex={allowNavigation ? 0 : -1}\n className={cx(\n styles.catBtn,\n commonInteractionStyles.categoryBtn,\n `epr-icn-${category}`,\n {\n [ClassNames.active]: isActiveCategory\n }\n )}\n onClick={onClick}\n aria-label={categoryNameFromCategoryConfig(categoryConfig)}\n aria-selected={isActiveCategory}\n role=\"tab\"\n aria-controls=\"epr-category-nav-id\"\n />\n );\n}\n\nconst DarkActivePositionY = {\n backgroundPositionY: 'calc(var(--epr-category-navigation-button-size) * 3)'\n};\nconst DarkPositionY = {\n backgroundPositionY: 'calc(var(--epr-category-navigation-button-size) * 2)'\n};\n\nconst DarkInactivePosition = {\n ':not(.epr-search-active)': {\n catBtn: {\n ':hover': DarkActivePositionY,\n '&.epr-active': DarkActivePositionY\n }\n }\n};\n\nconst styles = stylesheet.create({\n catBtn: {\n '.': 'epr-cat-btn',\n display: 'inline-block',\n transition: 'opacity 0.2s ease-in-out',\n position: 'relative',\n height: 'var(--epr-category-navigation-button-size)',\n width: 'var(--epr-category-navigation-button-size)',\n backgroundSize: 'calc(var(--epr-category-navigation-button-size) * 10)',\n outline: 'none',\n backgroundPosition: '0 0',\n backgroundImage: `url(${SVGNavigation})`,\n ':focus:before': {\n content: '',\n position: 'absolute',\n top: '-2px',\n left: '-2px',\n right: '-2px',\n bottom: '-2px',\n border: '2px solid var(--epr-category-icon-active-color)',\n borderRadius: '50%'\n },\n '&.epr-icn-suggested': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -8)'\n },\n '&.epr-icn-custom': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -9)'\n },\n '&.epr-icn-activities': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -4)'\n },\n '&.epr-icn-animals_nature': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -1)'\n },\n '&.epr-icn-flags': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -7)'\n },\n '&.epr-icn-food_drink': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -2)'\n },\n '&.epr-icn-objects': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -5)'\n },\n '&.epr-icn-smileys_people': {\n backgroundPositionX: '0px'\n },\n '&.epr-icn-symbols': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -6)'\n },\n '&.epr-icn-travel_places': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -3)'\n }\n },\n ...darkMode('catBtn', DarkPositionY),\n '.epr-dark-theme': {\n ...DarkInactivePosition\n },\n '.epr-auto-theme': {\n ...DarkInactivePosition\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\nimport { useState } from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport { categoryFromCategoryConfig } from '../../config/categoryConfig';\nimport { useCategoriesConfig } from '../../config/useConfig';\nimport { useActiveCategoryScrollDetection } from '../../hooks/useActiveCategoryScrollDetection';\nimport useIsSearchMode from '../../hooks/useIsSearchMode';\nimport { useScrollCategoryIntoView } from '../../hooks/useScrollCategoryIntoView';\nimport { useShouldHideCustomEmojis } from '../../hooks/useShouldHideCustomEmojis';\nimport { isCustomCategory } from '../../typeRefinements/typeRefinements';\nimport { useCategoryNavigationRef } from '../context/ElementRefContext';\n\nimport { CategoryButton } from './CategoryButton';\n\nexport function CategoryNavigation() {\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const scrollCategoryIntoView = useScrollCategoryIntoView();\n useActiveCategoryScrollDetection(setActiveCategory);\n const isSearchMode = useIsSearchMode();\n\n const categoriesConfig = useCategoriesConfig();\n const CategoryNavigationRef = useCategoryNavigationRef();\n const hideCustomCategory = useShouldHideCustomEmojis();\n\n return (\n <div\n className={cx(styles.nav)}\n role=\"tablist\"\n aria-label=\"Category navigation\"\n id=\"epr-category-nav-id\"\n ref={CategoryNavigationRef}\n >\n {categoriesConfig.map(categoryConfig => {\n const category = categoryFromCategoryConfig(categoryConfig);\n const isActiveCategory = category === activeCategory;\n\n if (isCustomCategory(categoryConfig) && hideCustomCategory) {\n return null;\n }\n\n const allowNavigation = !isSearchMode && !isActiveCategory;\n\n return (\n <CategoryButton\n key={category}\n category={category}\n isActiveCategory={isActiveCategory}\n allowNavigation={allowNavigation}\n categoryConfig={categoryConfig}\n onClick={() => {\n setActiveCategory(category);\n scrollCategoryIntoView(category);\n }}\n />\n );\n })}\n </div>\n );\n}\n\nconst styles = stylesheet.create({\n nav: {\n '.': 'epr-category-nav',\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-around',\n padding: 'var(--epr-header-padding)'\n },\n '.epr-search-active': {\n nav: {\n opacity: '0.3',\n cursor: 'default',\n pointerEvents: 'none'\n }\n },\n '.epr-main:has(input:not(:placeholder-shown))': {\n nav: {\n opacity: '0.3',\n cursor: 'default',\n pointerEvents: 'none'\n }\n }\n});\n","import { scrollTo } from '../DomUtils/scrollTo';\nimport { NullableElement } from '../DomUtils/selectors';\nimport {\n useBodyRef,\n usePickerMainRef\n} from '../components/context/ElementRefContext';\n\nexport function useScrollCategoryIntoView() {\n const BodyRef = useBodyRef();\n const PickerMainRef = usePickerMainRef();\n\n return function scrollCategoryIntoView(category: string): void {\n if (!BodyRef.current) {\n return;\n }\n const $category = BodyRef.current?.querySelector(\n `[data-name=\"${category}\"]`\n ) as NullableElement;\n\n if (!$category) {\n return;\n }\n\n const offsetTop = $category.offsetTop || 0;\n\n scrollTo(PickerMainRef.current, offsetTop);\n };\n}\n","import { useEffect } from 'react';\n\nimport { categoryNameFromDom } from '../DomUtils/categoryNameFromDom';\nimport { asSelectors, ClassNames } from '../DomUtils/classNames';\nimport { useBodyRef } from '../components/context/ElementRefContext';\n\nexport function useActiveCategoryScrollDetection(\n setActiveCategory: (category: string) => void\n) {\n const BodyRef = useBodyRef();\n\n useEffect(() => {\n const visibleCategories = new Map();\n const bodyRef = BodyRef.current;\n const observer = new IntersectionObserver(\n entries => {\n if (!bodyRef) {\n return;\n }\n\n for (const entry of entries) {\n const id = categoryNameFromDom(entry.target);\n visibleCategories.set(id, entry.intersectionRatio);\n }\n\n const ratios = Array.from(visibleCategories);\n const lastCategory = ratios[ratios.length - 1];\n\n if (lastCategory[1] == 1) {\n return setActiveCategory(lastCategory[0]);\n }\n\n for (const [id, ratio] of ratios) {\n if (ratio) {\n setActiveCategory(id);\n break;\n }\n }\n },\n {\n threshold: [0, 1]\n }\n );\n bodyRef?.querySelectorAll(asSelectors(ClassNames.category)).forEach(el => {\n observer.observe(el);\n });\n }, [BodyRef, setActiveCategory]);\n}\n","export function categoryNameFromDom($category: Element | null): string | null {\n return $category?.getAttribute('data-name') ?? null;\n}\n","import { useCustomEmojisConfig } from '../config/useConfig';\n\nexport function useShouldHideCustomEmojis() {\n const customCategoryConfig = useCustomEmojisConfig();\n\n if (!customCategoryConfig) {\n return false;\n }\n\n return customCategoryConfig.length === 0;\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport {\n commonInteractionStyles,\n darkMode,\n stylesheet\n} from '../../../Stylesheet/stylesheet';\nimport { useClearSearch } from '../../../hooks/useFilter';\nimport { Button } from '../../atoms/Button';\n\nimport SVGTimes from './svg/times.svg';\n\nexport function BtnClearSearch() {\n const clearSearch = useClearSearch();\n\n return (\n <Button\n className={cx(\n styles.btnClearSearch,\n commonInteractionStyles.visibleOnSearchOnly\n )}\n onClick={clearSearch}\n aria-label=\"Clear\"\n title=\"Clear\"\n >\n <div className={cx(styles.icnClearnSearch)} />\n </Button>\n );\n}\n\nconst HoverDark = {\n ':hover': {\n '> .epr-icn-clear-search': {\n backgroundPositionY: '-60px'\n }\n }\n};\n\nconst styles = stylesheet.create({\n btnClearSearch: {\n '.': 'epr-btn-clear-search',\n position: 'absolute',\n right: 'var(--epr-search-bar-inner-padding)',\n height: '30px',\n width: '30px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n top: '50%',\n transform: 'translateY(-50%)',\n padding: '0',\n borderRadius: '50%',\n ':hover': {\n background: 'var(--epr-hover-bg-color)'\n },\n ':focus': {\n background: 'var(--epr-hover-bg-color)'\n }\n },\n icnClearnSearch: {\n '.': 'epr-icn-clear-search',\n backgroundColor: 'transparent',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '20px',\n height: '20px',\n width: '20px',\n backgroundImage: `url(${SVGTimes})`,\n ':hover': {\n backgroundPositionY: '-20px'\n },\n ':focus': {\n backgroundPositionY: '-20px'\n }\n },\n ...darkMode('icnClearnSearch', {\n backgroundPositionY: '-40px'\n }),\n ...darkMode('btnClearSearch', HoverDark)\n});\n","import * as React from 'react';\n\nimport { ClassNames, asSelectors } from '../../../DomUtils/classNames';\nimport { getNormalizedSearchTerm } from '../../../hooks/useFilter';\n\nconst SCOPE = `${asSelectors(ClassNames.emojiPicker)} ${asSelectors(\n ClassNames.emojiList\n)}`;\n\nconst EMOJI_BUTTON = ['button', asSelectors(ClassNames.emoji)].join('');\nconst CATEGORY = asSelectors(ClassNames.category);\n\nexport function CssSearch({ value }: { value: undefined | string }) {\n if (!value) {\n return null;\n }\n\n const q = genQuery(value);\n\n return (\n <style>{`\n ${SCOPE} ${EMOJI_BUTTON} {\n display: none;\n }\n\n\n ${SCOPE} ${q} {\n display: flex;\n }\n\n ${SCOPE} ${CATEGORY}:not(:has(${q})) {\n display: none;\n }\n `}</style>\n );\n}\n\nfunction genQuery(value: string): string {\n return [\n EMOJI_BUTTON,\n '[data-full-name*=\"',\n getNormalizedSearchTerm(value),\n '\"]'\n ].join('');\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { darkMode, stylesheet } from '../../../Stylesheet/stylesheet';\n\nimport SVGMagnifier from './svg/magnifier.svg';\n\nexport function IcnSearch() {\n return <div className={cx(styles.icnSearch)} />;\n}\n\nconst styles = stylesheet.create({\n icnSearch: {\n '.': 'epr-icn-search',\n content: '',\n position: 'absolute',\n top: '50%',\n left: 'var(--epr-search-bar-inner-padding)',\n transform: 'translateY(-50%)',\n width: '20px',\n height: '20px',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: '0 0',\n backgroundSize: '20px',\n backgroundImage: `url(${SVGMagnifier})`\n },\n ...darkMode('icnSearch', {\n backgroundPositionY: '-20px'\n })\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\nimport { useState } from 'react';\n\nimport { darkMode, stylesheet } from '../../../Stylesheet/stylesheet';\nimport {\n useAutoFocusSearchConfig,\n useSearchDisabledConfig,\n useSearchPlaceHolderConfig\n} from '../../../config/useConfig';\nimport { useCloseAllOpenToggles } from '../../../hooks/useCloseAllOpenToggles';\nimport { useFilter } from '../../../hooks/useFilter';\nimport { useIsSkinToneInSearch } from '../../../hooks/useShouldShowSkinTonePicker';\nimport Flex from '../../Layout/Flex';\nimport Relative from '../../Layout/Relative';\nimport { useSearchInputRef } from '../../context/ElementRefContext';\nimport { SkinTonePicker } from '../SkinTonePicker/SkinTonePicker';\n\nimport { BtnClearSearch } from './BtnClearSearch';\nimport { CssSearch } from './CssSearch';\nimport { IcnSearch } from './IcnSearch';\nimport SVGTimes from './svg/times.svg';\n\nexport function SearchContainer() {\n const searchDisabled = useSearchDisabledConfig();\n\n const isSkinToneInSearch = useIsSkinToneInSearch();\n\n if (searchDisabled) {\n return null;\n }\n\n return (\n <Flex className={cx(styles.overlay)}>\n <Search />\n\n {isSkinToneInSearch ? <SkinTonePicker /> : null}\n </Flex>\n );\n}\n\nexport function Search() {\n const [inc, setInc] = useState(0);\n const closeAllOpenToggles = useCloseAllOpenToggles();\n const SearchInputRef = useSearchInputRef();\n const placeholder = useSearchPlaceHolderConfig();\n const autoFocus = useAutoFocusSearchConfig();\n const { statusSearchResults, searchTerm, onChange } = useFilter();\n\n const input = SearchInputRef?.current;\n const value = input?.value;\n\n return (\n <Relative className={cx(styles.searchContainer)}>\n <CssSearch value={value} />\n <input\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={autoFocus}\n aria-label={'Type to search for an emoji'}\n onFocus={closeAllOpenToggles}\n className={cx(styles.search)}\n type=\"text\"\n aria-controls=\"epr-search-id\"\n placeholder={placeholder}\n onChange={event => {\n setInc(inc + 1);\n setTimeout(() => {\n onChange(event?.target?.value ?? value);\n });\n }}\n ref={SearchInputRef}\n />\n {searchTerm ? (\n <div\n role=\"status\"\n className={cx('epr-status-search-results', styles.visuallyHidden)}\n aria-live=\"polite\"\n id=\"epr-search-id\"\n aria-atomic=\"true\"\n >\n {statusSearchResults}\n </div>\n ) : null}\n <IcnSearch />\n <BtnClearSearch />\n </Relative>\n );\n}\n\nconst styles = stylesheet.create({\n overlay: {\n padding: 'var(--epr-header-padding)',\n zIndex: 'var(--epr-header-overlay-z-index)'\n },\n searchContainer: {\n '.': 'epr-search-container',\n flex: '1',\n display: 'block',\n minWidth: '0'\n },\n visuallyHidden: {\n clip: 'rect(0 0 0 0)',\n clipPath: 'inset(50%)',\n height: '1px',\n overflow: 'hidden',\n position: 'absolute',\n whiteSpace: 'nowrap',\n width: '1px'\n },\n search: {\n outline: 'none',\n transition: 'all 0.2s ease-in-out',\n color: 'var(--epr-search-input-text-color)',\n borderRadius: 'var(--epr-search-input-border-radius)',\n padding: 'var(--epr-search-input-padding)',\n height: 'var(--epr-search-input-height)',\n backgroundColor: 'var(--epr-search-input-bg-color)',\n border: '1px solid var(--epr-search-input-bg-color)',\n width: '100%',\n ':focus': {\n backgroundColor: 'var(--epr-search-input-bg-color-active)',\n border: '1px solid var(--epr-search-border-color)'\n },\n '::placeholder': {\n color: 'var(--epr-search-input-placeholder-color)'\n }\n },\n\n btnClearSearch: {\n '.': 'epr-btn-clear-search',\n position: 'absolute',\n right: 'var(--epr-search-bar-inner-padding)',\n height: '30px',\n width: '30px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n top: '50%',\n transform: 'translateY(-50%)',\n padding: '0',\n borderRadius: '50%',\n ':hover': {\n background: 'var(--epr-hover-bg-color)'\n },\n ':focus': {\n background: 'var(--epr-hover-bg-color)'\n }\n },\n icnClearnSearch: {\n '.': 'epr-icn-clear-search',\n backgroundColor: 'transparent',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '20px',\n height: '20px',\n width: '20px',\n backgroundImage: `url(${SVGTimes})`,\n ':hover': {\n backgroundPositionY: '-20px'\n },\n ':focus': {\n backgroundPositionY: '-20px'\n }\n },\n ...darkMode('icnClearnSearch', {\n backgroundPositionY: '-40px'\n }),\n ...darkMode('btnClearSearch', {\n ':hover > .epr-icn-clear-search': {\n backgroundPositionY: '-60px'\n }\n })\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { commonInteractionStyles } from '../../Stylesheet/stylesheet';\nimport Relative from '../Layout/Relative';\nimport { CategoryNavigation } from '../navigation/CategoryNavigation';\n\nimport { SearchContainer } from './Search/Search';\n\nexport function Header() {\n return (\n <Relative\n className={cx('epr-header', commonInteractionStyles.hiddenOnReactions)}\n >\n <SearchContainer />\n <CategoryNavigation />\n </Relative>\n );\n}\n","import * as React from 'react';\n\nimport { PickerStyleTag } from './Stylesheet/stylesheet';\nimport { Reactions } from './components/Reactions/Reactions';\nimport { Body } from './components/body/Body';\nimport { ElementRefContextProvider } from './components/context/ElementRefContext';\nimport { PickerConfigProvider } from './components/context/PickerConfigContext';\nimport { useReactionsModeState } from './components/context/PickerContext';\nimport { Preview } from './components/footer/Preview';\nimport { Header } from './components/header/Header';\nimport PickerMain from './components/main/PickerMain';\nimport { compareConfig } from './config/compareConfig';\nimport { useAllowExpandReactions, useOpenConfig } from './config/useConfig';\n\nimport { PickerProps } from './index';\n\nfunction EmojiPicker(props: PickerProps) {\n return (\n <ElementRefContextProvider>\n <PickerStyleTag />\n <PickerConfigProvider {...props}>\n <ContentControl />\n </PickerConfigProvider>\n </ElementRefContextProvider>\n );\n}\n\nfunction ContentControl() {\n const [reactionsDefaultOpen] = useReactionsModeState();\n const allowExpandReactions = useAllowExpandReactions();\n\n const [renderAll, setRenderAll] = React.useState(!reactionsDefaultOpen);\n const isOpen = useOpenConfig();\n\n React.useEffect(() => {\n if (reactionsDefaultOpen && !allowExpandReactions) {\n return;\n }\n\n if (!renderAll) {\n setRenderAll(true);\n }\n }, [renderAll, allowExpandReactions, reactionsDefaultOpen]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <PickerMain>\n <Reactions />\n <ExpandedPickerContent renderAll={renderAll} />\n </PickerMain>\n );\n}\n\nfunction ExpandedPickerContent({ renderAll }: { renderAll: boolean }) {\n if (!renderAll) {\n return null;\n }\n\n return (\n <>\n <Header />\n <Body />\n <Preview />\n </>\n );\n}\n\n// eslint-disable-next-line complexity\nexport default React.memo(EmojiPicker, compareConfig);\n","import * as React from 'react';\n\nexport default class ErrorBoundary extends React.Component<\n { children: React.ReactNode },\n { hasError: boolean }\n> {\n constructor(props: { children: React.ReactNode }) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: any) {\n // eslint-disable-next-line no-console\n console.error('Emoji Picker React failed to render:', error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n return null;\n }\n\n return this.props.children;\n }\n}\n","import * as React from 'react';\n\nimport { EmojiStyle } from '../../types/exposedTypes';\n\nimport { GetEmojiUrl } from './BaseEmojiProps';\nimport { ViewOnlyEmoji } from './ViewOnlyEmoji';\n\nexport function ExportedEmoji({\n unified,\n size = 32,\n emojiStyle = EmojiStyle.APPLE,\n lazyLoad = false,\n getEmojiUrl,\n emojiUrl\n}: {\n unified: string;\n emojiStyle?: EmojiStyle;\n size?: number;\n lazyLoad?: boolean;\n getEmojiUrl?: GetEmojiUrl;\n emojiUrl?: string;\n}) {\n if (!unified && !emojiUrl && !getEmojiUrl) {\n return null;\n }\n\n return (\n <ViewOnlyEmoji\n unified={unified}\n size={size}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoad}\n getEmojiUrl={emojiUrl ? () => emojiUrl : getEmojiUrl}\n />\n );\n}\n","import * as React from 'react';\n\nimport EmojiPickerReact from './EmojiPickerReact';\nimport ErrorBoundary from './components/ErrorBoundary';\nimport { PickerConfig } from './config/config';\nimport {\n MutableConfigContext,\n useDefineMutableConfig\n} from './config/mutableConfig';\n\nexport { ExportedEmoji as Emoji } from './components/emoji/ExportedEmoji';\n\nexport {\n EmojiStyle,\n SkinTones,\n Theme,\n Categories,\n EmojiClickData,\n SuggestionMode,\n SkinTonePickerLocation\n} from './types/exposedTypes';\n\nexport interface PickerProps extends PickerConfig {}\n\nexport default function EmojiPicker(props: PickerProps) {\n const MutableConfigRef = useDefineMutableConfig({\n onEmojiClick: props.onEmojiClick,\n onReactionClick: props.onReactionClick,\n onSkinToneChange: props.onSkinToneChange,\n });\n\n return (\n <ErrorBoundary>\n <MutableConfigContext.Provider value={MutableConfigRef}>\n <EmojiPickerReact {...props} />\n </MutableConfigContext.Provider>\n </ErrorBoundary>\n );\n}\n"],"names":["ClassNames","asSelectors","classNames","Array","_len","_key","arguments","map","c","join","stylesheet","createSheet","hidden","display","opacity","pointerEvents","visibility","overflow","commonStyles","create","_extends",".","PickerStyleTag","React","suppressHydrationWarning","dangerouslySetInnerHTML","__html","getStyle","commonInteractionStyles",".epr-main",":has(input:not(:placeholder-shown))","categoryBtn",":hover","backgroundPositionY","hiddenOnSearch",":has(input(:placeholder-shown))","visibleOnSearchOnly","hiddenOnReactions","transition",".epr-reactions","height","width",".EmojiPickerReact:not(.epr-search-active)","&.epr-active","darkMode","key","value",".epr-dark-theme","_eprDarkTheme",".epr-auto-theme","_eprAutoTheme","@media (prefers-color-scheme: dark)","compareConfig","prev","next","prevCustomEmojis","_prev$customEmojis","customEmojis","nextCustomEmojis","_next$customEmojis","open","emojiVersion","reactionsDefaultOpen","searchPlaceHolder","searchPlaceholder","defaultSkinTone","skinTonesDisabled","autoFocusSearch","emojiStyle","theme","suggestedEmojisMode","lazyLoadEmojis","className","style","searchDisabled","skinTonePickerLocation","length","SuggestionMode","EmojiStyle","Theme","SkinTones","Categories","SkinTonePickerLocation","DEFAULT_REACTIONS","categoriesOrdered","SUGGESTED","CUSTOM","SMILEYS_PEOPLE","ANIMALS_NATURE","FOOD_DRINK","TRAVEL_PLACES","ACTIVITIES","OBJECTS","SYMBOLS","FLAGS","SuggestedRecent","name","category","configByCategory","_configByCategory","baseCategoriesConfig","modifiers","categoryFromCategoryConfig","categoryNameFromCategoryConfig","getBaseConfigByCategory","modifier","Object","assign","EmojiProperties","skinToneVariations","NEUTRAL","LIGHT","MEDIUM_LIGHT","MEDIUM","MEDIUM_DARK","DARK","skinTonesNamed","entries","reduce","acc","_ref","skinTonesMapped","mapped","skinTone","_Object$assign","alphaNumericEmojiIndex","indexEmoji","emoji","emojiNames","flat","toLowerCase","replace","split","forEach","char","_alphaNumericEmojiInd","emojiUnified","_emoji$EmojiPropertie","emojiName","unifiedWithoutSkinTone","unified","splat","_splat$splice","splice","emojiHasVariations","_emojiVariationUnifie","emojiVariations","find","variation","includes","emojiVariationUnified","emojisByCategory","_emojis$category","emojis","emojiUrlByUnified","TWITTER","GOOGLE","FACEBOOK","APPLE","cdnUrl","_emoji$EmojiPropertie2","variations","emojiByUnified","allEmojisByUnified","withoutSkinTone","setTimeout","allEmojis","searchIndex","values","Emoji","KNOWN_FAILING_EMOJIS","mergeConfig","userConfig","base","basePickerConfig","previewConfig","_userConfig$previewCo","config","categories","userCategoriesConfig","extra","suggestionMode","RECENT","_userCategoriesConfig","mergeCategoriesConfig","_config$customEmojis","emojiData","names","id","added_in","imgUrl","customToRegularEmoji","push","PREVIEW","getEmojiUrl","basePreviewConfig","SEARCH","FREQUENT","unicodeToHide","Set","reactions","allowExpandReactions","defaultEmoji","defaultCaption","showPreview","ConfigContext","PickerConfigProvider","children","mergedConfig","_React$useState","setMergedConfig","useSetConfig","_objectWithoutPropertiesLoose","_excluded","Provider","usePickerConfig","MOUSE_EVENT_SOURCE","MutableConfigContext","createContext","useMutableConfig","useContext","emptyFunc","useAllowExpandReactions","useSkinTonesDisabledConfig","useEmojiStyleConfig","useCategoriesConfig","usePreviewConfig","useSearchDisabledConfig","useSkinTonePickerLocationConfig","useGetEmojiUrlConfig","getDimension","dimensionConfig","useDebouncedState","initialValue","delay","_useState","useState","state","setState","timer","useRef","Promise","resolve","current","clearTimeout","_window","window","useDisallowedEmojis","DisallowedEmojisRef","emojiVersionConfig","useMemo","parseFloat","Number","isNaN","disallowedEmojis","supportedLevel","addedIn","addedInNewerVersion","PickerContextProvider","dispatch","filterRef","disallowClickRef","disallowMouseRef","disallowedEmojisRef","suggestedUpdateState","Date","now","searchTerm","skinToneFanOpenState","activeSkinTone","activeCategoryState","emojisThatFailedToLoadState","emojiVariationPickerState","reactionsModeState","isPastInitialLoad","useEffect","PickerContext","useFilterRef","useDisallowMouseRef","useReactionsModeState","useSearchTermState","useActiveSkinToneState","useEmojisThatFailedToLoadState","useEmojiVariationPickerState","useSkinToneFanOpenState","useUpdateSuggested","setsuggestedUpdate","useIsSearchMode","focusElement","element","requestAnimationFrame","focus","focusPrevElementSibling","previousElementSibling","focusNextElementSibling","nextElementSibling","focusFirstElementChild","firstElementChild","getActiveElement","document","activeElement","ElementRefContextProvider","PickerMainRef","AnchoredEmojiRef","BodyRef","SearchInputRef","SkinTonePickerRef","CategoryNavigationRef","VariationPickerRef","ReactionsRef","ElementRefContext","KeyboardEvents","useElementRef","usePickerMainRef","useAnchoredEmojiRef","useSetAnchoredEmojiRef","target","useBodyRef","useSearchInputRef","useSkinTonePickerRef","useCategoryNavigationRef","scrollTo","root","top","$eprBody","queryScrollBody","scrollTop","scrollEmojiAboveLabel","emojiDistanceFromScrollTop","categoryLabelHeight","closestCategory","isEmojiBehindLabel","closest","variationPicker","scrollBody","closestScrollBody","by","scrollBy","focusFirstVisibleEmoji","parent","firstVisibleEmoji","useCloseAllOpenToggles","_useEmojiVariationPic","setVariationPicker","_useSkinToneFanOpenSt","skinToneFanOpen","setSkinToneFanOpen","useCallback","useHasOpenToggles","useAllowMouseMove","DisallowMouseRef","useIsMouseDisallowed","useFocusSearchInput","useFocusCategoryNavigation","useClearSearch","applySearch","useApplySearch","focusSearchInput","setSearchTerm","then","hasMatch","keyword","some","getNormalizedSearchTerm","str","trim","useSetVariationPicker","setAnchoredEmojiRef","setEmojiVariationPicker","emojiFromElement","useIsSkinToneInSearch","useIsSkinToneInPreview","useGoDownFromSearchInput","focusCategoryNavigation","isSearchMode","focusNextSkinTone","exitLeft","currentSkinTone","focusPrevSkinTone","useOnType","appendSearch","closeAllOpenToggles","event","metaKey","ctrlKey","altKey","hasModifier","match","preventDefault","preloadedEmojs","PickerMain","PickerRootElement","_ref2","reactionsMode","searchModeActive","_usePickerConfig15","useStyleConfig","focusSkinTonePicker","setSkinToneFanOpenState","goDownFromSearchInput","isSkinToneInSearch","onKeyDown","clearSearch","hasOpenToggles","disallowMouseMove","Escape","addEventListener","removeEventListener","usePickerMainKeyboardEvents","firstEmoji","ArrowRight","ArrowDown","Enter","click","_useSkinToneFanOpenSt2","isOpen","setIsOpen","isSkinToneInPreview","onType","ArrowLeft","ArrowUp","useSkinTonePickerKeyboardEvents","useCategoryNavigationKeyboardEvents","goUpFromBody","buttonFromTarget","nextVisibleEmoji","isVisibleEmoji","nextCategory","focusNextVisibleEmoji","prevVisibleEmoji","lastVisibleEmoji","prevCategory","focusPrevVisibleEmoji","index","nextRowElements","allElements","currentRow","elementsInRow","nextRow","categoryContent","closestCategoryContent","indexInRow","elementIndexInRow","row","rowNumber","countInRow","elementCountInRow","elementHeight","getBoundingClientRect","elementTop","parentTop","parentHeight","Math","round","hasNextRow","nextVisibleCategory","getElementInRow","allVisibleEmojis","getRowElements","visibleEmojiOneRowDown","exitUp","prevRowElements","prevVisibleCategory","visibleEmojiOneRowUp","focusVisibleEmojiOneRowUp","Space","useBodyKeyboardEvents","useKeyboardNavigation","NATIVE","bodyRef","onFocus","button","has","url","Image","src","add","preloadEmoji","_ref3","styleProps","cx","styles","main","baseVariables","darkTheme","AUTO","autoThemeDark","_cx","searchActive","reactionsMenu","ref","DarkTheme","--epr-emoji-variation-picker-bg-color","--epr-hover-bg-color-reduced-opacity","--epr-highlight-color","--epr-text-color","--epr-hover-bg-color","--epr-focus-bg-color","--epr-search-input-bg-color","--epr-category-label-bg-color","--epr-picker-border-color","--epr-bg-color","--epr-reactions-bg-color","--epr-search-input-bg-color-active","--epr-emoji-variation-indicator-color","--epr-category-icon-active-color","--epr-skin-tone-picker-menu-color","emojiPicker","position","flexDirection","borderWidth","borderStyle","borderRadius","borderColor","backgroundColor","*","boxSizing","fontFamily","--","--epr-horizontal-padding","--epr-picker-border-radius","--epr-search-border-color","--epr-header-padding","--epr-active-skin-tone-indicator-border-color","--epr-active-skin-hover-color","--epr-search-input-padding","--epr-search-input-border-radius","--epr-search-input-height","--epr-search-input-text-color","--epr-search-input-placeholder-color","--epr-search-bar-inner-padding","--epr-category-navigation-button-size","--epr-emoji-variation-picker-height","--epr-preview-height","--epr-preview-text-size","--epr-preview-text-padding","--epr-preview-border-color","--epr-preview-text-color","--epr-category-padding","--epr-category-label-text-color","--epr-category-label-padding","--epr-category-label-height","DEFAULT_LABEL_HEIGHT","--epr-emoji-size","--epr-emoji-padding","--epr-emoji-fullsize","--epr-emoji-hover-color","--epr-emoji-variation-indicator-color-hover","--epr-header-overlay-z-index","--epr-emoji-variations-indictator-z-index","--epr-category-label-z-index","--epr-skin-variation-picker-z-index","--epr-preview-z-index","--epr-dark","--epr-dark-emoji-variation-picker-bg-color","--epr-dark-highlight-color","--epr-dark-text-color","--epr-dark-hover-bg-color","--epr-dark-hover-bg-color-reduced-opacity","--epr-dark-focus-bg-color","--epr-dark-search-input-bg-color","--epr-dark-category-label-bg-color","--epr-dark-picker-border-color","--epr-dark-bg-color","--epr-dark-reactions-bg-color","--epr-dark-search-input-bg-color-active","--epr-dark-emoji-variation-indicator-color","--epr-dark-category-icon-active-color","--epr-dark-skin-tone-picker-menu-color","autoTheme","backdropFilter","parentWidth","elementWidth","floor","elementLeft","left","parentLeft","elements","lastRow","slice","rowElements","EmojiButtonSelector","VisibleEmojiSelector","visible","emojiElement","_emojiElement$closest","originalUnified","originalUnifiedFromEmojiElement","unifiedFromEmojiElement","_element$clientHeight","clientHeight","emojiTrueOffsetTop","labelHeight","elementOffsetTop","categoryWithoutLabel","querySelector","_category$clientHeigh","_categoryWithoutLabel","matches","_closestScrollBody$sc","_closestScrollBody","_element$closest","_element$offsetTop","offsetTop","elementOffsetLeft","_element$offsetLeft","offsetLeft","_elementDataSetKey","_elementDataSet$key","_element$dataset","dataset","elementDataSet","allUnifiedFromEmojiElement","classList","contains","isHidden","from","querySelectorAll","last","maxVisibilityDiffThreshold","parentBottom","bottom","parentTopWithLabel","parentNode","_i","_labels","label","getLabelHeight","elementBottom","maxVisibilityDiffPixels","elementTopWithAllowedDiff","elementBottomWithAllowedDiff","firstVisibleElementInContainer","parseNativeEmoji","hex","String","fromCodePoint","parseInt","getSuggested","mode","_window$localStorage$","_window2","localStorage","recent","JSON","parse","getItem","sort","a","b","count","_unused","isCustomEmoji","undefined","useMouseDownHandlers","ContainerRef","mouseEventSource","mouseDownTimerRef","onEmojiClick","REACTIONS","onReactionClick","useOnEmojiClickConfig","updateSuggested","activeEmojiStyle","onClick","_emojiFromEvent","emojiFromEvent","skinToneToUse","suspectedSkinTone","activeVariationFromUnified","nextList","existing","concat","filter","i","original","min","_window3","setItem","stringify","_unused2","setSuggested","getImageUrl","imageUrl","isCustom","emojiClickOutput","onMouseDown","onMouseUp","confainerRef","passive","Boolean","_element$parentElemen","parentElement","Button","props","type","cursor","border","background","outline","ClickableEmojiButton","_ref$showVariations","showVariations","hasVariations","_ref$noBackground","noBackground","getAriaLabel","_emojiNames$","alignItems","justifyContent","maxWidth","maxHeight",":focus",":after","content","right","borderLeft","borderRight","transform","borderBottom","zIndex",":hover:after","emojiStyles","external","fontSize","common","alignSelf","justifySelf","EmojiImg","_ref$lazyLoad","lazyLoad","onError","alt","emojiImag","loading","minWidth","minHeight","padding","NativeEmoji","nativeEmoji","lineHeight","textAlign","letterSpacing","ViewOnlyEmoji","size","_ref$getEmojiUrl","setEmojisThatFailedToLoad","emojiToRender","ClickableEmoji","BtnPlus","setReactionsMode","title","tabIndex","plusSign","color","backgroundImage","backgroundRepeat","backgroundSize","Reactions","reactionsOpen","list","reaction","emojiButton","listStyle","margin",":active","EmojiCategory","categoryConfig","categoryName",":not(:has(.epr-visible))","gridGap","gridTemplateColumns","fontWeight","textTransform","isEverMounted","Suggested","suggestedUpdated","isMounted","setIsMounted","useIsEverMounted","suggestedEmojisModeConfig","suggested","_getSuggested","suggestedItem","EmojiList","renderdCategoriesCountRef","emojiList","RenderCategory","isUnicodeHidden","emojisThatFailedToLoad","isEmojiFiltered","isEmojiHidden","_filter$searchTerm","isEmojiFilteredBySearchTerm","failedToLoad","filteredOut","isEmojiDisallowed","emojisToPush","hiddenCounter","_isEmojiHidden","isDisallowed","Direction","EmojiVariationPicker","pointerStyle","_useVariationPickerTo","direction","Up","getMenuDirection","getTop","emojiOffsetTop","_bodyRef$scrollTop","buttonHeight","Down","useVariationPickerTop","getPointerStyle","emojiTruOffsetLeft","clientWidth","usePointerStyle","pointingUp","pointer","boxShadow","transformOrigin",".pointing-up","backgroundPosition","Body","onScroll","useOnScroll","PICKER","allowMouseMove","isMouseDisallowed","onMouseMove","useOnMouseMove","body","FlexDirection","flex","overflowY","overflowX","Flex","_ref$style","_ref$direction","ROW","_stylesheet$create","COLUMN","Absolute","Relative","BtnSkinToneVariation","isActive","skinToneVariation","tone","closedTone","active","SkinTonePickerDirection","&.epr-tone-neutral","&.epr-tone-1f3fb","&.epr-tone-1f3fc","&.epr-tone-1f3fd","&.epr-tone-1f3fe","&.epr-tone-1f3ff","SkinTonePickerMenu","SkinTonePicker","VERTICAL","HORIZONTAL","isDisabled","_useActiveSkinToneSta","setActiveSkinTone","onSkinToneChange","expandedSize","ITEM_SIZE","vertical","skinTones","verticalShadow","flexBasis","select","--epr-skin-tone-size",".epr-active:after","> button","Preview","preview","PreviewBody","previewEmoji","setPreviewEmoji","variationPickerEmoji","allow","onEscape","onMouseOver","onEnter","onLeave","e","_allUnifiedFromEmojiE","relatedTarget","buttonRect","bodyRect","y","detectEmojyPartiallyBelowFold","_allUnifiedFromEmojiE2","_document$activeEleme","blur","handlePartiallyVisibleElementFocus","useEmojiPreviewEvents","_previewEmoji$unified","show","defaultText","borderTop","CategoryButton","isActiveCategory","allowNavigation","catBtn","role","DarkActivePositionY","DarkInactivePosition",":not(.epr-search-active)",":focus:before","&.epr-icn-suggested","backgroundPositionX","&.epr-icn-custom","&.epr-icn-activities","&.epr-icn-animals_nature","&.epr-icn-flags","&.epr-icn-food_drink","&.epr-icn-objects","&.epr-icn-smileys_people","&.epr-icn-symbols","&.epr-icn-travel_places","CategoryNavigation","activeCategory","setActiveCategory","scrollCategoryIntoView","$category","_BodyRef$current","visibleCategories","Map","observer","IntersectionObserver","_step","_iterator","_createForOfIteratorHelperLoose","done","entry","_$category$getAttribu","getAttribute","set","intersectionRatio","ratios","lastCategory","_ratios","_ratios$_i","threshold","el","observe","useActiveCategoryScrollDetection","customCategoryConfig","categoriesConfig","hideCustomCategory","nav","isCustomCategory",".epr-search-active",".epr-main:has(input:not(:placeholder-shown))","BtnClearSearch","btnClearSearch","icnClearnSearch","HoverDark","> .epr-icn-clear-search","SVGTimes","SCOPE","EMOJI_BUTTON","CATEGORY","CssSearch","q","genQuery","IcnSearch","icnSearch","SearchContainer","overlay","Search","_usePickerConfig","inc","setInc","placeholder","_find","p","autoFocus","_useFilter","setFilterRef","setFilter","setter","useSetFilterRef","onChange","inputValue","nextValue","longestMatch","dict","longestMatchingKey","keys","findLongestMatch","filtered","filterEmojiObjectByKeyword","statusSearchResults","filterState","searchResultsCount","_Object$entries","toString","getStatusSearchResults","useFilter","input","searchContainer","search","_event$target$value","_event$target","visuallyHidden","clip","clipPath","whiteSpace","::placeholder",":hover > .epr-icn-clear-search","Header","EmojiPicker","ContentControl","renderAll","setRenderAll","ExpandedPickerContent","ErrorBoundary","_React$Component","_this","call","hasError","getDerivedStateFromError","_proto","prototype","componentDidCatch","error","errorInfo","console","render","this","_ref$size","_ref$emojiStyle","emojiUrl","MutableConfigRef","useDefineMutableConfig","EmojiPickerReact"],"mappings":"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"}
1
+ {"version":3,"file":"emoji-picker-react.cjs.production.min.js","sources":["../src/DomUtils/classNames.ts","../src/Stylesheet/stylesheet.tsx","../src/config/compareConfig.ts","../src/components/Reactions/DEFAULT_REACTIONS.ts","../src/types/exposedTypes.ts","../src/config/categoryConfig.ts","../src/dataUtils/DataTypes.ts","../src/data/skinToneVariations.ts","../src/dataUtils/alphaNumericEmojiIndex.ts","../src/dataUtils/emojiSelectors.ts","../src/config/cdnUrls.ts","../src/config/config.ts","../src/components/context/PickerConfigContext.tsx","../src/config/useConfig.ts","../src/config/mutableConfig.ts","../src/hooks/useDebouncedState.ts","../src/hooks/useDisallowedEmojis.ts","../src/components/context/PickerContext.tsx","../src/hooks/useInitialLoad.ts","../src/hooks/useIsSearchMode.ts","../src/DomUtils/focusElement.ts","../src/DomUtils/getActiveElement.ts","../src/components/context/ElementRefContext.tsx","../src/hooks/useKeyboardNavigation.ts","../src/DomUtils/scrollTo.ts","../src/DomUtils/selectors.ts","../src/DomUtils/keyboardNavigation.ts","../src/hooks/useCloseAllOpenToggles.ts","../src/hooks/useDisallowMouseMove.ts","../src/hooks/useFocus.ts","../src/hooks/useFilter.ts","../src/hooks/useSetVariationPicker.ts","../src/hooks/useShouldShowSkinTonePicker.ts","../src/DomUtils/elementPositionInRow.ts","../src/hooks/preloadEmoji.ts","../src/components/main/PickerMain.tsx","../src/hooks/useOnFocus.ts","../src/dataUtils/parseNativeEmoji.ts","../src/dataUtils/suggested.ts","../src/typeRefinements/typeRefinements.ts","../src/hooks/useMouseDownHandlers.ts","../src/components/atoms/Button.tsx","../src/components/emoji/ClickableEmojiButton.tsx","../src/components/emoji/emojiStyles.ts","../src/components/emoji/EmojiImg.tsx","../src/components/emoji/NativeEmoji.tsx","../src/components/emoji/ViewOnlyEmoji.tsx","../src/components/emoji/Emoji.tsx","../src/components/Reactions/BtnPlus.tsx","../src/components/Reactions/Reactions.tsx","../src/components/body/EmojiCategory.tsx","../src/hooks/useIsEverMounted.ts","../src/components/body/Suggested.tsx","../src/components/body/EmojiList.tsx","../src/hooks/useHideEmojisByUniocode.ts","../src/hooks/useIsEmojiHidden.ts","../src/components/body/EmojiVariationPicker.tsx","../src/components/body/Body.tsx","../src/hooks/useOnScroll.ts","../src/components/Layout/Flex.tsx","../src/components/Layout/Space.tsx","../src/components/Layout/Absolute.tsx","../src/components/Layout/Relative.tsx","../src/components/header/SkinTonePicker/BtnSkinToneVariation.tsx","../src/components/header/SkinTonePicker/SkinTonePicker.tsx","../src/components/footer/Preview.tsx","../src/hooks/useEmojiPreviewEvents.ts","../src/DomUtils/detectEmojyPartiallyBelowFold.ts","../src/components/navigation/CategoryButton.tsx","../src/components/navigation/CategoryNavigation.tsx","../src/hooks/useScrollCategoryIntoView.ts","../src/hooks/useActiveCategoryScrollDetection.ts","../src/DomUtils/categoryNameFromDom.ts","../src/hooks/useShouldHideCustomEmojis.ts","../src/components/header/Search/BtnClearSearch.tsx","../src/components/header/Search/CssSearch.tsx","../src/components/header/Search/IcnSearch.tsx","../src/components/header/Search/Search.tsx","../src/components/header/Header.tsx","../src/EmojiPickerReact.tsx","../src/components/ErrorBoundary.tsx","../src/components/emoji/ExportedEmoji.tsx","../src/index.tsx"],"sourcesContent":["export enum ClassNames {\n hiddenOnSearch = 'epr-hidden-on-search',\n searchActive = 'epr-search-active',\n hidden = 'epr-hidden',\n visible = 'epr-visible',\n active = 'epr-active',\n emoji = 'epr-emoji',\n category = 'epr-emoji-category',\n label = 'epr-emoji-category-label',\n categoryContent = 'epr-emoji-category-content',\n emojiHasVariations = 'epr-emoji-has-variations',\n scrollBody = 'epr-body',\n emojiList = 'epr-emoji-list',\n external = '__EmojiPicker__',\n emojiPicker = 'EmojiPickerReact',\n open = 'epr-open',\n vertical = 'epr-vertical',\n horizontal = 'epr-horizontal',\n variationPicker = 'epr-emoji-variation-picker',\n darkTheme = 'epr-dark-theme',\n autoTheme = 'epr-auto-theme'\n}\n\nexport function asSelectors(...classNames: ClassNames[]): string {\n return classNames.map(c => `.${c}`).join('');\n}\n","import { Styles, createSheet } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../DomUtils/classNames';\n\nexport const stylesheet = createSheet('epr', null);\n\nconst hidden = {\n display: 'none',\n opacity: '0',\n pointerEvents: 'none',\n visibility: 'hidden',\n overflow: 'hidden'\n};\n\nexport const commonStyles = stylesheet.create({\n hidden: {\n '.': ClassNames.hidden,\n ...hidden\n }\n});\n\nexport const PickerStyleTag = React.memo(function PickerStyleTag() {\n return (\n <style\n suppressHydrationWarning\n dangerouslySetInnerHTML={{ __html: stylesheet.getStyle() }}\n />\n );\n});\n\nexport const commonInteractionStyles = stylesheet.create({\n '.epr-main': {\n ':has(input:not(:placeholder-shown))': {\n categoryBtn: {\n ':hover': {\n opacity: '1',\n backgroundPositionY: 'var(--epr-category-navigation-button-size)'\n }\n },\n hiddenOnSearch: {\n '.': ClassNames.hiddenOnSearch,\n ...hidden\n }\n },\n ':has(input(:placeholder-shown))': {\n visibleOnSearchOnly: hidden\n }\n },\n hiddenOnReactions: {\n transition: 'all 0.5s ease-in-out'\n },\n '.epr-reactions': {\n hiddenOnReactions: {\n height: '0px',\n width: '0px',\n opacity: '0',\n pointerEvents: 'none',\n overflow: 'hidden'\n }\n },\n '.EmojiPickerReact:not(.epr-search-active)': {\n categoryBtn: {\n ':hover': {\n opacity: '1',\n backgroundPositionY: 'var(--epr-category-navigation-button-size)'\n },\n '&.epr-active': {\n opacity: '1',\n backgroundPositionY: 'var(--epr-category-navigation-button-size)'\n }\n },\n visibleOnSearchOnly: {\n '.': 'epr-visible-on-search-only',\n ...hidden\n }\n }\n});\n\nexport function darkMode(key: string, value: Styles) {\n return {\n '.epr-dark-theme': {\n [key]: value\n },\n '.epr-auto-theme': {\n [key]: {\n '@media (prefers-color-scheme: dark)': value\n }\n }\n };\n}\n","import { PickerConfig } from './config';\n\n// eslint-disable-next-line complexity\nexport function compareConfig(prev: PickerConfig, next: PickerConfig) {\n const prevCustomEmojis = prev.customEmojis ?? [];\n const nextCustomEmojis = next.customEmojis ?? [];\n return (\n prev.open === next.open &&\n prev.emojiVersion === next.emojiVersion &&\n prev.reactionsDefaultOpen === next.reactionsDefaultOpen &&\n prev.searchPlaceHolder === next.searchPlaceHolder &&\n prev.searchPlaceholder === next.searchPlaceholder &&\n prev.defaultSkinTone === next.defaultSkinTone &&\n prev.skinTonesDisabled === next.skinTonesDisabled &&\n prev.autoFocusSearch === next.autoFocusSearch &&\n prev.emojiStyle === next.emojiStyle &&\n prev.theme === next.theme &&\n prev.suggestedEmojisMode === next.suggestedEmojisMode &&\n prev.lazyLoadEmojis === next.lazyLoadEmojis &&\n prev.className === next.className &&\n prev.height === next.height &&\n prev.width === next.width &&\n prev.style === next.style &&\n prev.searchDisabled === next.searchDisabled &&\n prev.skinTonePickerLocation === next.skinTonePickerLocation &&\n prevCustomEmojis.length === nextCustomEmojis.length\n );\n}","export const DEFAULT_REACTIONS = [\n '1f44d', // 👍\n '2764-fe0f', // ❤️\n '1f603', // 😃\n '1f622', // 😢\n '1f64f', // 🙏\n '1f44e', // 👎\n '1f621' // 😡\n];\n","export type EmojiClickData = {\n activeSkinTone: SkinTones;\n unified: string;\n unifiedWithoutSkinTone: string;\n emoji: string;\n names: string[];\n imageUrl: string;\n getImageUrl: (emojiStyle?: EmojiStyle) => string;\n isCustom: boolean;\n};\n\nexport enum SuggestionMode {\n RECENT = 'recent',\n FREQUENT = 'frequent'\n}\n\nexport enum EmojiStyle {\n NATIVE = 'native',\n APPLE = 'apple',\n TWITTER = 'twitter',\n GOOGLE = 'google',\n FACEBOOK = 'facebook'\n}\n\nexport enum Theme {\n DARK = 'dark',\n LIGHT = 'light',\n AUTO = 'auto'\n}\n\nexport enum SkinTones {\n NEUTRAL = 'neutral',\n LIGHT = '1f3fb',\n MEDIUM_LIGHT = '1f3fc',\n MEDIUM = '1f3fd',\n MEDIUM_DARK = '1f3fe',\n DARK = '1f3ff'\n}\n\nexport enum Categories {\n SUGGESTED = 'suggested',\n CUSTOM = 'custom',\n SMILEYS_PEOPLE = 'smileys_people',\n ANIMALS_NATURE = 'animals_nature',\n FOOD_DRINK = 'food_drink',\n TRAVEL_PLACES = 'travel_places',\n ACTIVITIES = 'activities',\n OBJECTS = 'objects',\n SYMBOLS = 'symbols',\n FLAGS = 'flags'\n}\n\nexport enum SkinTonePickerLocation {\n SEARCH = 'SEARCH',\n PREVIEW = 'PREVIEW'\n}\n","import { Categories, SuggestionMode } from '../types/exposedTypes';\n\nexport { Categories };\n\nconst categoriesOrdered: Categories[] = [\n Categories.SUGGESTED,\n Categories.CUSTOM,\n Categories.SMILEYS_PEOPLE,\n Categories.ANIMALS_NATURE,\n Categories.FOOD_DRINK,\n Categories.TRAVEL_PLACES,\n Categories.ACTIVITIES,\n Categories.OBJECTS,\n Categories.SYMBOLS,\n Categories.FLAGS\n];\n\nexport const SuggestedRecent: CategoryConfig = {\n name: 'Recently Used',\n category: Categories.SUGGESTED\n};\n\nexport type CustomCategoryConfig = {\n category: Categories.CUSTOM;\n name: string;\n};\n\nconst configByCategory: Record<Categories, CategoryConfig> = {\n [Categories.SUGGESTED]: {\n category: Categories.SUGGESTED,\n name: 'Frequently Used'\n },\n [Categories.CUSTOM]: {\n category: Categories.CUSTOM,\n name: 'Custom Emojis'\n },\n [Categories.SMILEYS_PEOPLE]: {\n category: Categories.SMILEYS_PEOPLE,\n name: 'Smileys & People'\n },\n [Categories.ANIMALS_NATURE]: {\n category: Categories.ANIMALS_NATURE,\n name: 'Animals & Nature'\n },\n [Categories.FOOD_DRINK]: {\n category: Categories.FOOD_DRINK,\n name: 'Food & Drink'\n },\n [Categories.TRAVEL_PLACES]: {\n category: Categories.TRAVEL_PLACES,\n name: 'Travel & Places'\n },\n [Categories.ACTIVITIES]: {\n category: Categories.ACTIVITIES,\n name: 'Activities'\n },\n [Categories.OBJECTS]: {\n category: Categories.OBJECTS,\n name: 'Objects'\n },\n [Categories.SYMBOLS]: {\n category: Categories.SYMBOLS,\n name: 'Symbols'\n },\n [Categories.FLAGS]: {\n category: Categories.FLAGS,\n name: 'Flags'\n }\n};\n\nexport function baseCategoriesConfig(\n modifiers?: Record<Categories, CategoryConfig>\n): CategoriesConfig {\n return categoriesOrdered.map(category => {\n return {\n ...configByCategory[category],\n ...(modifiers && modifiers[category] && modifiers[category])\n };\n });\n}\n\nexport function categoryFromCategoryConfig(category: CategoryConfig) {\n return category.category;\n}\n\nexport function categoryNameFromCategoryConfig(category: CategoryConfig) {\n return category.name;\n}\n\nexport type CategoriesConfig = CategoryConfig[];\n\nexport type CategoryConfig = {\n category: Categories;\n name: string;\n};\n\nexport type UserCategoryConfig = Array<Categories | CategoryConfig>;\n\nexport function mergeCategoriesConfig(\n userCategoriesConfig: UserCategoryConfig = [],\n modifiers: CategoryConfigModifiers = {}\n): CategoriesConfig {\n const extra = {} as Record<Categories, CategoryConfig>;\n\n if (modifiers.suggestionMode === SuggestionMode.RECENT) {\n extra[Categories.SUGGESTED] = SuggestedRecent;\n }\n\n const base = baseCategoriesConfig(extra);\n if (!userCategoriesConfig?.length) {\n return base;\n }\n\n return userCategoriesConfig.map(category => {\n if (typeof category === 'string') {\n return getBaseConfigByCategory(category, extra[category]);\n }\n\n return {\n ...getBaseConfigByCategory(category.category, extra[category.category]),\n ...category\n };\n });\n}\n\nfunction getBaseConfigByCategory(\n category: Categories,\n modifier: CategoryConfig = {} as CategoryConfig\n) {\n return Object.assign(configByCategory[category], modifier);\n}\n\ntype CategoryConfigModifiers = {\n suggestionMode?: SuggestionMode;\n};\n","import emojis from '../data/emojis';\n\nexport enum EmojiProperties {\n name = 'n',\n unified = 'u',\n variations = 'v',\n added_in = 'a',\n imgUrl = 'imgUrl'\n}\n\nexport interface DataEmoji extends WithName {\n [EmojiProperties.unified]: string;\n [EmojiProperties.variations]?: string[];\n [EmojiProperties.added_in]: string;\n [EmojiProperties.imgUrl]?: string;\n}\n\nexport type DataEmojis = DataEmoji[];\n\nexport type DataGroups = keyof typeof emojis;\n\nexport type WithName = {\n [EmojiProperties.name]: string[];\n};\n","import { SkinTones } from '../types/exposedTypes';\n\nconst skinToneVariations = [\n SkinTones.NEUTRAL,\n SkinTones.LIGHT,\n SkinTones.MEDIUM_LIGHT,\n SkinTones.MEDIUM,\n SkinTones.MEDIUM_DARK,\n SkinTones.DARK\n];\n\nexport const skinTonesNamed = Object.entries(SkinTones).reduce(\n (acc, [key, value]) => {\n acc[value] = key;\n return acc;\n },\n {} as Record<string, string>\n);\n\nexport const skinTonesMapped: Record<\n string,\n string\n> = skinToneVariations.reduce(\n (mapped, skinTone) =>\n Object.assign(mapped, {\n [skinTone]: skinTone\n }),\n {}\n);\n\nexport default skinToneVariations;\n","import { DataEmoji } from './DataTypes';\nimport { allEmojis, emojiNames, emojiUnified } from './emojiSelectors';\n\nexport const alphaNumericEmojiIndex: BaseIndex = {};\n\nsetTimeout(() => {\n allEmojis.reduce((searchIndex, emoji) => {\n indexEmoji(emoji);\n return searchIndex;\n }, alphaNumericEmojiIndex as BaseIndex);\n});\n\ntype BaseIndex = Record<string, Record<string, DataEmoji>>;\n\nexport function indexEmoji(emoji: DataEmoji): void {\n const joinedNameString = emojiNames(emoji)\n .flat()\n .join('')\n .toLowerCase()\n .replace(/[^a-zA-Z\\d]/g, '')\n .split('');\n\n joinedNameString.forEach(char => {\n alphaNumericEmojiIndex[char] = alphaNumericEmojiIndex[char] ?? {};\n\n alphaNumericEmojiIndex[char][emojiUnified(emoji)] = emoji;\n });\n}\n","import { Categories } from '../config/categoryConfig';\nimport { cdnUrl } from '../config/cdnUrls';\nimport { CustomEmoji } from '../config/customEmojiConfig';\nimport emojis from '../data/emojis';\nimport skinToneVariations, {\n skinTonesMapped\n} from '../data/skinToneVariations';\nimport { EmojiStyle, SkinTones } from '../types/exposedTypes';\n\nimport { DataEmoji, DataEmojis, EmojiProperties, WithName } from './DataTypes';\nimport { indexEmoji } from './alphaNumericEmojiIndex';\n\nexport function emojiNames(emoji: WithName): string[] {\n return emoji[EmojiProperties.name] ?? [];\n}\n\nexport function addedIn(emoji: DataEmoji): number {\n return parseFloat(emoji[EmojiProperties.added_in]);\n}\n\nexport function emojiName(emoji?: WithName): string {\n if (!emoji) {\n return '';\n }\n\n return emojiNames(emoji)[0];\n}\n\nexport function unifiedWithoutSkinTone(unified: string): string {\n const splat = unified.split('-');\n const [skinTone] = splat.splice(1, 1);\n\n if (skinTonesMapped[skinTone]) {\n return splat.join('-');\n }\n\n return unified;\n}\n\nexport function emojiUnified(emoji: DataEmoji, skinTone?: string): string {\n const unified = emoji[EmojiProperties.unified];\n\n if (!skinTone || !emojiHasVariations(emoji)) {\n return unified;\n }\n\n return emojiVariationUnified(emoji, skinTone) ?? unified;\n}\n\nexport function emojisByCategory(category: Categories): DataEmojis {\n // @ts-ignore\n return emojis?.[category] ?? [];\n}\n\n// WARNING: DO NOT USE DIRECTLY\nexport function emojiUrlByUnified(\n unified: string,\n emojiStyle: EmojiStyle\n): string {\n return `${cdnUrl(emojiStyle)}${unified}.png`;\n}\n\nexport function emojiVariations(emoji: DataEmoji): string[] {\n return emoji[EmojiProperties.variations] ?? [];\n}\n\nexport function emojiHasVariations(emoji: DataEmoji): boolean {\n return emojiVariations(emoji).length > 0;\n}\n\nexport function emojiVariationUnified(\n emoji: DataEmoji,\n skinTone?: string\n): string | undefined {\n return skinTone\n ? emojiVariations(emoji).find(variation => variation.includes(skinTone))\n : emojiUnified(emoji);\n}\n\nexport function emojiByUnified(unified?: string): DataEmoji | undefined {\n if (!unified) {\n return;\n }\n\n if (allEmojisByUnified[unified]) {\n return allEmojisByUnified[unified];\n }\n\n const withoutSkinTone = unifiedWithoutSkinTone(unified);\n return allEmojisByUnified[withoutSkinTone];\n}\n\nexport const allEmojis: DataEmojis = Object.values(emojis).flat();\n\nexport function setCustomEmojis(customEmojis: CustomEmoji[]): void {\n emojis[Categories.CUSTOM].length = 0;\n\n customEmojis.forEach(emoji => {\n const emojiData = customToRegularEmoji(emoji);\n\n emojis[Categories.CUSTOM].push(emojiData as never);\n\n if (allEmojisByUnified[emojiData[EmojiProperties.unified]]) {\n return;\n }\n\n allEmojis.push(emojiData);\n allEmojisByUnified[emojiData[EmojiProperties.unified]] = emojiData;\n indexEmoji(emojiData);\n });\n}\n\nfunction customToRegularEmoji(emoji: CustomEmoji): DataEmoji {\n return {\n [EmojiProperties.name]: emoji.names.map(name => name.toLowerCase()),\n [EmojiProperties.unified]: emoji.id.toLowerCase(),\n [EmojiProperties.added_in]: '0',\n [EmojiProperties.imgUrl]: emoji.imgUrl\n };\n}\n\nconst allEmojisByUnified: {\n [unified: string]: DataEmoji;\n} = {};\n\nsetTimeout(() => {\n allEmojis.reduce((allEmojis, Emoji) => {\n allEmojis[emojiUnified(Emoji)] = Emoji;\n\n if (emojiHasVariations(Emoji)) {\n emojiVariations(Emoji).forEach(variation => {\n allEmojis[variation] = Emoji;\n });\n }\n\n return allEmojis;\n }, allEmojisByUnified);\n});\n\nexport function activeVariationFromUnified(unified: string): SkinTones | null {\n const [, suspectedSkinTone] = unified.split('-') as [string, SkinTones];\n return skinToneVariations.includes(suspectedSkinTone)\n ? suspectedSkinTone\n : null;\n}\n","import { EmojiStyle } from '../types/exposedTypes';\n\nconst CDN_URL_APPLE =\n 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/';\nconst CDN_URL_FACEBOOK =\n 'https://cdn.jsdelivr.net/npm/emoji-datasource-facebook/img/facebook/64/';\nconst CDN_URL_TWITTER =\n 'https://cdn.jsdelivr.net/npm/emoji-datasource-twitter/img/twitter/64/';\nconst CDN_URL_GOOGLE =\n 'https://cdn.jsdelivr.net/npm/emoji-datasource-google/img/google/64/';\n\nexport function cdnUrl(emojiStyle: EmojiStyle): string {\n switch (emojiStyle) {\n case EmojiStyle.TWITTER:\n return CDN_URL_TWITTER;\n case EmojiStyle.GOOGLE:\n return CDN_URL_GOOGLE;\n case EmojiStyle.FACEBOOK:\n return CDN_URL_FACEBOOK;\n case EmojiStyle.APPLE:\n default:\n return CDN_URL_APPLE;\n }\n}\n","import * as React from 'react';\n\nimport { DEFAULT_REACTIONS } from '../components/Reactions/DEFAULT_REACTIONS';\nimport { GetEmojiUrl } from '../components/emoji/BaseEmojiProps';\nimport {\n setCustomEmojis,\n emojiUrlByUnified\n} from '../dataUtils/emojiSelectors';\nimport {\n EmojiClickData,\n EmojiStyle,\n SkinTonePickerLocation,\n SkinTones,\n SuggestionMode,\n Theme\n} from '../types/exposedTypes';\n\nimport {\n CategoriesConfig,\n baseCategoriesConfig,\n mergeCategoriesConfig\n} from './categoryConfig';\nimport { CustomEmoji } from './customEmojiConfig';\n\nconst KNOWN_FAILING_EMOJIS = ['2640-fe0f', '2642-fe0f', '2695-fe0f'];\n\nexport const DEFAULT_SEARCH_PLACEHOLDER = 'Search';\nexport const SEARCH_RESULTS_NO_RESULTS_FOUND = 'No results found';\nexport const SEARCH_RESULTS_SUFFIX =\n ' found. Use up and down arrow keys to navigate.';\nexport const SEARCH_RESULTS_ONE_RESULT_FOUND =\n '1 result' + SEARCH_RESULTS_SUFFIX;\nexport const SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND =\n '%n results' + SEARCH_RESULTS_SUFFIX;\n\nexport function mergeConfig(\n userConfig: PickerConfig = {}\n): PickerConfigInternal {\n const base = basePickerConfig();\n\n const previewConfig = Object.assign(\n base.previewConfig,\n userConfig.previewConfig ?? {}\n );\n const config = Object.assign(base, userConfig);\n\n const categories = mergeCategoriesConfig(userConfig.categories, {\n suggestionMode: config.suggestedEmojisMode\n });\n\n config.hiddenEmojis.forEach(emoji => {\n config.unicodeToHide.add(emoji);\n });\n\n setCustomEmojis(config.customEmojis ?? []);\n\n const skinTonePickerLocation = config.searchDisabled\n ? SkinTonePickerLocation.PREVIEW\n : config.skinTonePickerLocation;\n\n return {\n ...config,\n categories,\n previewConfig,\n skinTonePickerLocation\n };\n}\n\nexport function basePickerConfig(): PickerConfigInternal {\n return {\n autoFocusSearch: true,\n categories: baseCategoriesConfig(),\n className: '',\n customEmojis: [],\n defaultSkinTone: SkinTones.NEUTRAL,\n emojiStyle: EmojiStyle.APPLE,\n emojiVersion: null,\n getEmojiUrl: emojiUrlByUnified,\n height: 450,\n lazyLoadEmojis: false,\n previewConfig: {\n ...basePreviewConfig\n },\n searchDisabled: false,\n searchPlaceHolder: DEFAULT_SEARCH_PLACEHOLDER,\n searchPlaceholder: DEFAULT_SEARCH_PLACEHOLDER,\n skinTonePickerLocation: SkinTonePickerLocation.SEARCH,\n skinTonesDisabled: false,\n style: {},\n suggestedEmojisMode: SuggestionMode.FREQUENT,\n theme: Theme.LIGHT,\n unicodeToHide: new Set<string>(KNOWN_FAILING_EMOJIS),\n width: 350,\n reactionsDefaultOpen: false,\n reactions: DEFAULT_REACTIONS,\n open: true,\n allowExpandReactions: true,\n hiddenEmojis: []\n };\n}\n\nexport type PickerConfigInternal = {\n emojiVersion: string | null;\n searchPlaceHolder: string;\n searchPlaceholder: string;\n defaultSkinTone: SkinTones;\n skinTonesDisabled: boolean;\n autoFocusSearch: boolean;\n emojiStyle: EmojiStyle;\n categories: CategoriesConfig;\n theme: Theme;\n suggestedEmojisMode: SuggestionMode;\n lazyLoadEmojis: boolean;\n previewConfig: PreviewConfig;\n className: string;\n height: PickerDimensions;\n width: PickerDimensions;\n style: React.CSSProperties;\n getEmojiUrl: GetEmojiUrl;\n searchDisabled: boolean;\n skinTonePickerLocation: SkinTonePickerLocation;\n unicodeToHide: Set<string>;\n customEmojis: CustomEmoji[];\n reactionsDefaultOpen: boolean;\n reactions: string[];\n open: boolean;\n allowExpandReactions: boolean;\n hiddenEmojis: string[];\n};\n\nexport type PreviewConfig = {\n defaultEmoji: string;\n defaultCaption: string;\n showPreview: boolean;\n};\n\nconst basePreviewConfig: PreviewConfig = {\n defaultEmoji: '1f60a',\n defaultCaption: \"What's your mood?\",\n showPreview: true\n};\n\ntype ConfigExternal = {\n previewConfig: Partial<PreviewConfig>;\n onEmojiClick: MouseDownEvent;\n onReactionClick: MouseDownEvent;\n onSkinToneChange: OnSkinToneChange;\n} & Omit<PickerConfigInternal, 'previewConfig' | 'unicodeToHide'>;\n\nexport type PickerConfig = Partial<ConfigExternal>;\n\nexport type PickerDimensions = string | number;\n\nexport type MouseDownEvent = (emoji: EmojiClickData, event: MouseEvent) => void;\nexport type OnSkinToneChange = (emoji: SkinTones) => void;\n","import * as React from 'react';\n\nimport { compareConfig } from '../../config/compareConfig';\nimport {\n basePickerConfig,\n mergeConfig,\n PickerConfig,\n PickerConfigInternal\n} from '../../config/config';\n\ntype Props = PickerConfig &\n Readonly<{\n children: React.ReactNode;\n }>;\n\nconst ConfigContext = React.createContext<PickerConfigInternal>(\n basePickerConfig()\n);\n\nexport function PickerConfigProvider({ children, ...config }: Props) {\n const mergedConfig = useSetConfig(config);\n\n return (\n <ConfigContext.Provider value={mergedConfig}>\n {children}\n </ConfigContext.Provider>\n );\n}\n\nexport function useSetConfig(config: PickerConfig) {\n const [mergedConfig, setMergedConfig] = React.useState(() =>\n mergeConfig(config)\n );\n\n React.useEffect(() => {\n if (compareConfig(mergedConfig, config)) {\n return;\n }\n setMergedConfig(mergeConfig(config));\n // not gonna...\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n config.customEmojis?.length,\n config.open,\n config.emojiVersion,\n config.reactionsDefaultOpen,\n config.searchPlaceHolder,\n config.searchPlaceholder,\n config.defaultSkinTone,\n config.skinTonesDisabled,\n config.autoFocusSearch,\n config.emojiStyle,\n config.theme,\n config.suggestedEmojisMode,\n config.lazyLoadEmojis,\n config.className,\n config.height,\n config.width,\n config.searchDisabled,\n config.skinTonePickerLocation,\n config.allowExpandReactions\n ]);\n\n return mergedConfig;\n}\n\nexport function usePickerConfig() {\n return React.useContext(ConfigContext);\n}\n","import * as React from 'react';\n\nimport { usePickerConfig } from '../components/context/PickerConfigContext';\nimport {\n EmojiClickData,\n EmojiStyle,\n SkinTonePickerLocation,\n SkinTones,\n SuggestionMode,\n Theme\n} from '../types/exposedTypes';\n\nimport { CategoriesConfig } from './categoryConfig';\nimport {\n DEFAULT_SEARCH_PLACEHOLDER,\n SEARCH_RESULTS_NO_RESULTS_FOUND,\n SEARCH_RESULTS_ONE_RESULT_FOUND,\n SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND,\n PickerDimensions,\n PreviewConfig\n} from './config';\nimport { CustomEmoji } from './customEmojiConfig';\nimport { useMutableConfig } from './mutableConfig';\n\nexport enum MOUSE_EVENT_SOURCE {\n REACTIONS = 'reactions',\n PICKER = 'picker'\n}\n\nexport function useSearchPlaceHolderConfig(): string {\n const { searchPlaceHolder, searchPlaceholder } = usePickerConfig();\n return (\n [searchPlaceHolder, searchPlaceholder].find(\n p => p !== DEFAULT_SEARCH_PLACEHOLDER\n ) ?? DEFAULT_SEARCH_PLACEHOLDER\n );\n}\n\nexport function useDefaultSkinToneConfig(): SkinTones {\n const { defaultSkinTone } = usePickerConfig();\n return defaultSkinTone;\n}\n\nexport function useAllowExpandReactions(): boolean {\n const { allowExpandReactions } = usePickerConfig();\n return allowExpandReactions;\n}\n\nexport function useSkinTonesDisabledConfig(): boolean {\n const { skinTonesDisabled } = usePickerConfig();\n return skinTonesDisabled;\n}\n\nexport function useEmojiStyleConfig(): EmojiStyle {\n const { emojiStyle } = usePickerConfig();\n return emojiStyle;\n}\n\nexport function useAutoFocusSearchConfig(): boolean {\n const { autoFocusSearch } = usePickerConfig();\n return autoFocusSearch;\n}\n\nexport function useCategoriesConfig(): CategoriesConfig {\n const { categories } = usePickerConfig();\n return categories;\n}\n\nexport function useCustomEmojisConfig(): CustomEmoji[] {\n const { customEmojis } = usePickerConfig();\n return customEmojis;\n}\n\nexport function useOpenConfig(): boolean {\n const { open } = usePickerConfig();\n return open;\n}\n\nexport function useOnEmojiClickConfig(\n mouseEventSource: MOUSE_EVENT_SOURCE\n): (emoji: EmojiClickData, event: MouseEvent) => void {\n const { current } = useMutableConfig();\n\n const handler =\n (mouseEventSource === MOUSE_EVENT_SOURCE.REACTIONS\n ? current.onReactionClick\n : current.onEmojiClick) ?? current.onEmojiClick;\n\n return handler || (() => {});\n}\n\nexport function useOnSkinToneChangeConfig(\n): (skinTone: SkinTones) => void {\n const { current } = useMutableConfig();\n\n return current.onSkinToneChange || (() => {});\n}\n\nexport function usePreviewConfig(): PreviewConfig {\n const { previewConfig } = usePickerConfig();\n return previewConfig;\n}\n\nexport function useThemeConfig(): Theme {\n const { theme } = usePickerConfig();\n\n return theme;\n}\n\nexport function useSuggestedEmojisModeConfig(): SuggestionMode {\n const { suggestedEmojisMode } = usePickerConfig();\n return suggestedEmojisMode;\n}\n\nexport function useLazyLoadEmojisConfig(): boolean {\n const { lazyLoadEmojis } = usePickerConfig();\n return lazyLoadEmojis;\n}\n\nexport function useClassNameConfig(): string {\n const { className } = usePickerConfig();\n return className;\n}\n\nexport function useStyleConfig(): React.CSSProperties {\n const { height, width, style } = usePickerConfig();\n return { height: getDimension(height), width: getDimension(width), ...style };\n}\n\nexport function useReactionsOpenConfig(): boolean {\n const { reactionsDefaultOpen } = usePickerConfig();\n return reactionsDefaultOpen;\n}\n\nexport function useEmojiVersionConfig(): string | null {\n const { emojiVersion } = usePickerConfig();\n return emojiVersion;\n}\n\nexport function useSearchDisabledConfig(): boolean {\n const { searchDisabled } = usePickerConfig();\n return searchDisabled;\n}\n\nexport function useSkinTonePickerLocationConfig(): SkinTonePickerLocation {\n const { skinTonePickerLocation } = usePickerConfig();\n return skinTonePickerLocation;\n}\n\nexport function useUnicodeToHide() {\n const { unicodeToHide } = usePickerConfig();\n return unicodeToHide;\n}\n\nexport function useReactionsConfig(): string[] {\n const { reactions } = usePickerConfig();\n return reactions;\n}\n\nexport function useGetEmojiUrlConfig(): (\n unified: string,\n style: EmojiStyle\n) => string {\n const { getEmojiUrl } = usePickerConfig();\n return getEmojiUrl;\n}\n\nfunction getDimension(dimensionConfig: PickerDimensions): PickerDimensions {\n return typeof dimensionConfig === 'number'\n ? `${dimensionConfig}px`\n : dimensionConfig;\n}\n\nexport function useSearchResultsConfig(searchResultsCount: number): string {\n const hasResults = searchResultsCount > 0;\n const isPlural = searchResultsCount > 1;\n\n if (hasResults) {\n return isPlural\n ? SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND.replace(\n '%n',\n searchResultsCount.toString()\n )\n : SEARCH_RESULTS_ONE_RESULT_FOUND;\n }\n\n return SEARCH_RESULTS_NO_RESULTS_FOUND;\n}\n","import React from 'react';\n\nimport {MouseDownEvent, OnSkinToneChange} from './config';\n\nexport type MutableConfig = {\n onEmojiClick?: MouseDownEvent;\n onReactionClick?: MouseDownEvent;\n onSkinToneChange?: OnSkinToneChange;\n};\n\nexport const MutableConfigContext = React.createContext<\n React.MutableRefObject<MutableConfig>\n>({} as React.MutableRefObject<MutableConfig>);\n\nexport function useMutableConfig(): React.MutableRefObject<MutableConfig> {\n const mutableConfig = React.useContext(MutableConfigContext);\n return mutableConfig;\n}\n\nexport function useDefineMutableConfig(\n config: MutableConfig\n): React.MutableRefObject<MutableConfig> {\n const MutableConfigRef = React.useRef<MutableConfig>({\n onEmojiClick: config.onEmojiClick || emptyFunc,\n onReactionClick: config.onReactionClick || config.onEmojiClick,\n onSkinToneChange: config.onSkinToneChange || emptyFunc\n });\n\n React.useEffect(() => {\n MutableConfigRef.current.onEmojiClick = config.onEmojiClick || emptyFunc;\n MutableConfigRef.current.onReactionClick =\n config.onReactionClick || config.onEmojiClick;\n }, [config.onEmojiClick, config.onReactionClick]);\n\n React.useEffect(() => {\n MutableConfigRef.current.onSkinToneChange = config.onSkinToneChange || emptyFunc;\n }, [config.onSkinToneChange])\n\n return MutableConfigRef;\n}\n\nfunction emptyFunc() {}\n","import { useRef, useState } from 'react';\n\nexport function useDebouncedState<T>(\n initialValue: T,\n delay: number = 0\n): [T, (value: T) => Promise<T>] {\n const [state, setState] = useState<T>(initialValue);\n const timer = useRef<number | null>(null);\n\n function debouncedSetState(value: T) {\n return new Promise<T>(resolve => {\n if (timer.current) {\n clearTimeout(timer.current);\n }\n\n timer.current = window?.setTimeout(() => {\n setState(value);\n resolve(value);\n }, delay);\n });\n }\n\n return [state, debouncedSetState];\n}\n","import { useRef, useMemo } from 'react';\n\nimport { useEmojiVersionConfig } from '../config/useConfig';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport {\n addedIn,\n allEmojis,\n emojiUnified,\n unifiedWithoutSkinTone\n} from '../dataUtils/emojiSelectors';\n\nimport { useIsUnicodeHidden } from './useHideEmojisByUniocode';\n\nexport function useDisallowedEmojis() {\n const DisallowedEmojisRef = useRef<Record<string, boolean>>({});\n const emojiVersionConfig = useEmojiVersionConfig();\n\n return useMemo(() => {\n const emojiVersion = parseFloat(`${emojiVersionConfig}`);\n\n if (!emojiVersionConfig || Number.isNaN(emojiVersion)) {\n return DisallowedEmojisRef.current;\n }\n\n return allEmojis.reduce((disallowedEmojis, emoji) => {\n if (addedInNewerVersion(emoji, emojiVersion)) {\n disallowedEmojis[emojiUnified(emoji)] = true;\n }\n\n return disallowedEmojis;\n }, DisallowedEmojisRef.current);\n }, [emojiVersionConfig]);\n}\n\nexport function useIsEmojiDisallowed() {\n const disallowedEmojis = useDisallowedEmojis();\n const isUnicodeHidden = useIsUnicodeHidden();\n\n return function isEmojiDisallowed(emoji: DataEmoji) {\n const unified = unifiedWithoutSkinTone(emojiUnified(emoji));\n\n return Boolean(disallowedEmojis[unified] || isUnicodeHidden(unified));\n };\n}\n\nfunction addedInNewerVersion(\n emoji: DataEmoji,\n supportedLevel: number\n): boolean {\n return addedIn(emoji) > supportedLevel;\n}\n","import * as React from 'react';\nimport { useState } from 'react';\n\nimport {\n useDefaultSkinToneConfig,\n useReactionsOpenConfig\n} from '../../config/useConfig';\nimport { DataEmoji } from '../../dataUtils/DataTypes';\nimport { alphaNumericEmojiIndex } from '../../dataUtils/alphaNumericEmojiIndex';\nimport { useDebouncedState } from '../../hooks/useDebouncedState';\nimport { useDisallowedEmojis } from '../../hooks/useDisallowedEmojis';\nimport { FilterDict } from '../../hooks/useFilter';\nimport { useMarkInitialLoad } from '../../hooks/useInitialLoad';\nimport { SkinTones } from '../../types/exposedTypes';\n\nexport function PickerContextProvider({ children }: Props) {\n const disallowedEmojis = useDisallowedEmojis();\n const defaultSkinTone = useDefaultSkinToneConfig();\n const reactionsDefaultOpen = useReactionsOpenConfig();\n\n // Initialize the filter with the inititial dictionary\n const filterRef = React.useRef<FilterState>(alphaNumericEmojiIndex);\n const disallowClickRef = React.useRef<boolean>(false);\n const disallowMouseRef = React.useRef<boolean>(false);\n const disallowedEmojisRef = React.useRef<Record<string, boolean>>(\n disallowedEmojis\n );\n\n const suggestedUpdateState = useDebouncedState(Date.now(), 200);\n const searchTerm = useDebouncedState('', 100);\n const skinToneFanOpenState = useState<boolean>(false);\n const activeSkinTone = useState<SkinTones>(defaultSkinTone);\n const activeCategoryState = useState<ActiveCategoryState>(null);\n const emojisThatFailedToLoadState = useState<Set<string>>(new Set());\n const emojiVariationPickerState = useState<DataEmoji | null>(null);\n const reactionsModeState = useState(reactionsDefaultOpen);\n const [isPastInitialLoad, setIsPastInitialLoad] = useState(false);\n\n useMarkInitialLoad(setIsPastInitialLoad);\n\n return (\n <PickerContext.Provider\n value={{\n activeCategoryState,\n activeSkinTone,\n disallowClickRef,\n disallowMouseRef,\n disallowedEmojisRef,\n emojiVariationPickerState,\n emojisThatFailedToLoadState,\n filterRef,\n isPastInitialLoad,\n searchTerm,\n skinToneFanOpenState,\n suggestedUpdateState,\n reactionsModeState\n }}\n >\n {children}\n </PickerContext.Provider>\n );\n}\n\ntype ReactState<T> = [T, React.Dispatch<React.SetStateAction<T>>];\n\nconst PickerContext = React.createContext<{\n searchTerm: [string, (term: string) => Promise<string>];\n suggestedUpdateState: [number, (term: number) => void];\n activeCategoryState: ReactState<ActiveCategoryState>;\n activeSkinTone: ReactState<SkinTones>;\n emojisThatFailedToLoadState: ReactState<Set<string>>;\n isPastInitialLoad: boolean;\n emojiVariationPickerState: ReactState<DataEmoji | null>;\n skinToneFanOpenState: ReactState<boolean>;\n filterRef: React.MutableRefObject<FilterState>;\n disallowClickRef: React.MutableRefObject<boolean>;\n disallowMouseRef: React.MutableRefObject<boolean>;\n disallowedEmojisRef: React.MutableRefObject<Record<string, boolean>>;\n reactionsModeState: ReactState<boolean>;\n}>({\n activeCategoryState: [null, () => {}],\n activeSkinTone: [SkinTones.NEUTRAL, () => {}],\n disallowClickRef: { current: false },\n disallowMouseRef: { current: false },\n disallowedEmojisRef: { current: {} },\n emojiVariationPickerState: [null, () => {}],\n emojisThatFailedToLoadState: [new Set(), () => {}],\n filterRef: { current: {} },\n isPastInitialLoad: true,\n searchTerm: ['', () => new Promise<string>(() => undefined)],\n skinToneFanOpenState: [false, () => {}],\n suggestedUpdateState: [Date.now(), () => {}],\n reactionsModeState: [false, () => {}]\n});\n\ntype Props = Readonly<{\n children: React.ReactNode;\n}>;\n\nexport function useFilterRef() {\n const { filterRef } = React.useContext(PickerContext);\n return filterRef;\n}\n\nexport function useDisallowClickRef() {\n const { disallowClickRef } = React.useContext(PickerContext);\n return disallowClickRef;\n}\n\nexport function useDisallowMouseRef() {\n const { disallowMouseRef } = React.useContext(PickerContext);\n return disallowMouseRef;\n}\n\nexport function useReactionsModeState() {\n const { reactionsModeState } = React.useContext(PickerContext);\n return reactionsModeState;\n}\n\nexport function useSearchTermState() {\n const { searchTerm } = React.useContext(PickerContext);\n return searchTerm;\n}\n\nexport function useActiveSkinToneState(): [\n SkinTones,\n (skinTone: SkinTones) => void\n] {\n const { activeSkinTone } = React.useContext(PickerContext);\n return activeSkinTone;\n}\n\nexport function useEmojisThatFailedToLoadState() {\n const { emojisThatFailedToLoadState } = React.useContext(PickerContext);\n return emojisThatFailedToLoadState;\n}\n\nexport function useIsPastInitialLoad(): boolean {\n const { isPastInitialLoad } = React.useContext(PickerContext);\n return isPastInitialLoad;\n}\n\nexport function useEmojiVariationPickerState() {\n const { emojiVariationPickerState } = React.useContext(PickerContext);\n return emojiVariationPickerState;\n}\n\nexport function useSkinToneFanOpenState() {\n const { skinToneFanOpenState } = React.useContext(PickerContext);\n return skinToneFanOpenState;\n}\n\nexport function useDisallowedEmojisRef() {\n const { disallowedEmojisRef } = React.useContext(PickerContext);\n return disallowedEmojisRef;\n}\n\nexport function useUpdateSuggested(): [number, () => void] {\n const { suggestedUpdateState } = React.useContext(PickerContext);\n\n const [suggestedUpdated, setsuggestedUpdate] = suggestedUpdateState;\n return [\n suggestedUpdated,\n function updateSuggested() {\n setsuggestedUpdate(Date.now());\n }\n ];\n}\n\nexport type FilterState = Record<string, FilterDict>;\n\ntype ActiveCategoryState = null | string;\n","import { useEffect } from 'react';\nimport * as React from 'react';\n\nexport function useMarkInitialLoad(\n dispatch: React.Dispatch<React.SetStateAction<boolean>>\n) {\n useEffect(() => {\n dispatch(true);\n }, [dispatch]);\n}\n","import { useSearchTermState } from '../components/context/PickerContext';\n\nexport default function useIsSearchMode(): boolean {\n const [searchTerm] = useSearchTermState();\n\n return !!searchTerm;\n}\n","import { NullableElement } from './selectors';\n\nexport function focusElement(element: NullableElement) {\n if (!element) {\n return;\n }\n\n requestAnimationFrame(() => {\n element.focus();\n });\n}\n\nexport function focusPrevElementSibling(element: NullableElement) {\n if (!element) return;\n\n const prev = element.previousElementSibling as HTMLElement;\n\n focusElement(prev);\n}\n\nexport function focusNextElementSibling(element: NullableElement) {\n if (!element) return;\n\n const next = element.nextElementSibling as HTMLElement;\n\n focusElement(next);\n}\n\nexport function focusFirstElementChild(element: NullableElement) {\n if (!element) return;\n\n const first = element.firstElementChild as HTMLElement;\n\n focusElement(first);\n}\n","import { NullableElement } from './selectors';\n\nexport function getActiveElement() {\n return document.activeElement as NullableElement;\n}\n","import * as React from 'react';\n\nimport { focusElement } from '../../DomUtils/focusElement';\nimport { NullableElement } from '../../DomUtils/selectors';\n\nexport function ElementRefContextProvider({\n children\n}: {\n children: React.ReactNode;\n}) {\n const PickerMainRef = React.useRef<HTMLElement>(null);\n const AnchoredEmojiRef = React.useRef<HTMLElement>(null);\n const BodyRef = React.useRef<HTMLDivElement>(null);\n const SearchInputRef = React.useRef<HTMLInputElement>(null);\n const SkinTonePickerRef = React.useRef<HTMLDivElement>(null);\n const CategoryNavigationRef = React.useRef<HTMLDivElement>(null);\n const VariationPickerRef = React.useRef<HTMLDivElement>(null);\n const ReactionsRef = React.useRef<HTMLUListElement>(null);\n\n return (\n <ElementRefContext.Provider\n value={{\n AnchoredEmojiRef,\n BodyRef,\n CategoryNavigationRef,\n PickerMainRef,\n SearchInputRef,\n SkinTonePickerRef,\n VariationPickerRef,\n ReactionsRef\n }}\n >\n {children}\n </ElementRefContext.Provider>\n );\n}\n\nexport type ElementRef<\n E extends HTMLElement = HTMLElement\n> = React.MutableRefObject<E | null>;\n\ntype ElementRefs = {\n PickerMainRef: ElementRef;\n AnchoredEmojiRef: ElementRef;\n SkinTonePickerRef: ElementRef<HTMLDivElement>;\n SearchInputRef: ElementRef<HTMLInputElement>;\n BodyRef: ElementRef<HTMLDivElement>;\n CategoryNavigationRef: ElementRef<HTMLDivElement>;\n VariationPickerRef: ElementRef<HTMLDivElement>;\n ReactionsRef: ElementRef<HTMLUListElement>;\n};\n\nconst ElementRefContext = React.createContext<ElementRefs>({\n AnchoredEmojiRef: React.createRef(),\n BodyRef: React.createRef(),\n CategoryNavigationRef: React.createRef(),\n PickerMainRef: React.createRef(),\n SearchInputRef: React.createRef(),\n SkinTonePickerRef: React.createRef(),\n VariationPickerRef: React.createRef(),\n ReactionsRef: React.createRef()\n});\n\nfunction useElementRef() {\n return React.useContext(ElementRefContext);\n}\n\nexport function usePickerMainRef() {\n return useElementRef()['PickerMainRef'];\n}\n\nexport function useAnchoredEmojiRef() {\n return useElementRef()['AnchoredEmojiRef'];\n}\n\nexport function useSetAnchoredEmojiRef(): (target: NullableElement) => void {\n const AnchoredEmojiRef = useAnchoredEmojiRef();\n return (target: NullableElement) => {\n if (target === null && AnchoredEmojiRef.current !== null) {\n focusElement(AnchoredEmojiRef.current);\n }\n\n AnchoredEmojiRef.current = target;\n };\n}\n\nexport function useBodyRef() {\n return useElementRef()['BodyRef'];\n}\n\nexport function useReactionsRef() {\n return useElementRef()['ReactionsRef'];\n}\n\nexport function useSearchInputRef() {\n return useElementRef()['SearchInputRef'];\n}\n\nexport function useSkinTonePickerRef() {\n return useElementRef()['SkinTonePickerRef'];\n}\n\nexport function useCategoryNavigationRef() {\n return useElementRef()['CategoryNavigationRef'];\n}\n\nexport function useVariationPickerRef() {\n return useElementRef()['VariationPickerRef'];\n}\n","import { useCallback, useEffect, useMemo } from 'react';\n\nimport { hasNextElementSibling } from '../DomUtils/elementPositionInRow';\nimport {\n focusNextElementSibling,\n focusPrevElementSibling\n} from '../DomUtils/focusElement';\nimport { getActiveElement } from '../DomUtils/getActiveElement';\nimport {\n focusAndClickFirstVisibleEmoji,\n focusFirstVisibleEmoji,\n focusNextVisibleEmoji,\n focusPrevVisibleEmoji,\n focusVisibleEmojiOneRowDown,\n focusVisibleEmojiOneRowUp\n} from '../DomUtils/keyboardNavigation';\nimport { useScrollTo } from '../DomUtils/scrollTo';\nimport { buttonFromTarget } from '../DomUtils/selectors';\nimport {\n useBodyRef,\n useCategoryNavigationRef,\n usePickerMainRef,\n useSearchInputRef,\n useSkinTonePickerRef\n} from '../components/context/ElementRefContext';\nimport { useSkinToneFanOpenState } from '../components/context/PickerContext';\nimport { useSearchDisabledConfig } from '../config/useConfig';\n\nimport {\n useCloseAllOpenToggles,\n useHasOpenToggles\n} from './useCloseAllOpenToggles';\nimport { useDisallowMouseMove } from './useDisallowMouseMove';\nimport { useAppendSearch, useClearSearch } from './useFilter';\nimport {\n useFocusCategoryNavigation,\n useFocusSearchInput,\n useFocusSkinTonePicker\n} from './useFocus';\nimport useIsSearchMode from './useIsSearchMode';\nimport useSetVariationPicker from './useSetVariationPicker';\nimport {\n useIsSkinToneInPreview,\n useIsSkinToneInSearch\n} from './useShouldShowSkinTonePicker';\n\nenum KeyboardEvents {\n ArrowDown = 'ArrowDown',\n ArrowUp = 'ArrowUp',\n ArrowLeft = 'ArrowLeft',\n ArrowRight = 'ArrowRight',\n Escape = 'Escape',\n Enter = 'Enter',\n Space = ' '\n}\n\nexport function useKeyboardNavigation() {\n usePickerMainKeyboardEvents();\n useSearchInputKeyboardEvents();\n useSkinTonePickerKeyboardEvents();\n useCategoryNavigationKeyboardEvents();\n useBodyKeyboardEvents();\n}\n\nfunction usePickerMainKeyboardEvents() {\n const PickerMainRef = usePickerMainRef();\n const clearSearch = useClearSearch();\n const scrollTo = useScrollTo();\n const SearchInputRef = useSearchInputRef();\n const focusSearchInput = useFocusSearchInput();\n const hasOpenToggles = useHasOpenToggles();\n const disallowMouseMove = useDisallowMouseMove();\n\n const closeAllOpenToggles = useCloseAllOpenToggles();\n\n const onKeyDown = useMemo(\n () =>\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n disallowMouseMove();\n switch (key) {\n // eslint-disable-next-line no-fallthrough\n case KeyboardEvents.Escape:\n event.preventDefault();\n if (hasOpenToggles()) {\n closeAllOpenToggles();\n return;\n }\n clearSearch();\n scrollTo(0);\n focusSearchInput();\n break;\n }\n },\n [\n scrollTo,\n clearSearch,\n closeAllOpenToggles,\n focusSearchInput,\n hasOpenToggles,\n disallowMouseMove\n ]\n );\n\n useEffect(() => {\n const current = PickerMainRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [PickerMainRef, SearchInputRef, scrollTo, onKeyDown]);\n}\n\nfunction useSearchInputKeyboardEvents() {\n const focusSkinTonePicker = useFocusSkinTonePicker();\n const PickerMainRef = usePickerMainRef();\n const BodyRef = useBodyRef();\n const SearchInputRef = useSearchInputRef();\n const [, setSkinToneFanOpenState] = useSkinToneFanOpenState();\n const goDownFromSearchInput = useGoDownFromSearchInput();\n const isSkinToneInSearch = useIsSkinToneInSearch();\n\n const onKeyDown = useMemo(\n () =>\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n switch (key) {\n case KeyboardEvents.ArrowRight:\n if (!isSkinToneInSearch) {\n return;\n }\n event.preventDefault();\n setSkinToneFanOpenState(true);\n focusSkinTonePicker();\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n goDownFromSearchInput();\n break;\n case KeyboardEvents.Enter:\n event.preventDefault();\n focusAndClickFirstVisibleEmoji(BodyRef.current);\n break;\n }\n },\n [\n focusSkinTonePicker,\n goDownFromSearchInput,\n setSkinToneFanOpenState,\n BodyRef,\n isSkinToneInSearch\n ]\n );\n\n useEffect(() => {\n const current = SearchInputRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [PickerMainRef, SearchInputRef, onKeyDown]);\n}\n\nfunction useSkinTonePickerKeyboardEvents() {\n const SkinTonePickerRef = useSkinTonePickerRef();\n const focusSearchInput = useFocusSearchInput();\n const SearchInputRef = useSearchInputRef();\n const goDownFromSearchInput = useGoDownFromSearchInput();\n const [isOpen, setIsOpen] = useSkinToneFanOpenState();\n const isSkinToneInPreview = useIsSkinToneInPreview();\n const isSkinToneInSearch = useIsSkinToneInSearch();\n const onType = useOnType();\n\n const onKeyDown = useMemo(\n () =>\n // eslint-disable-next-line complexity\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n if (isSkinToneInSearch) {\n switch (key) {\n case KeyboardEvents.ArrowLeft:\n event.preventDefault();\n if (!isOpen) {\n return focusSearchInput();\n }\n focusNextSkinTone(focusSearchInput);\n break;\n case KeyboardEvents.ArrowRight:\n event.preventDefault();\n if (!isOpen) {\n return focusSearchInput();\n }\n focusPrevSkinTone();\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n }\n goDownFromSearchInput();\n break;\n default:\n onType(event);\n break;\n }\n }\n\n if (isSkinToneInPreview) {\n switch (key) {\n case KeyboardEvents.ArrowUp:\n event.preventDefault();\n if (!isOpen) {\n return focusSearchInput();\n }\n focusNextSkinTone(focusSearchInput);\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n if (!isOpen) {\n return focusSearchInput();\n }\n focusPrevSkinTone();\n break;\n default:\n onType(event);\n break;\n }\n }\n },\n [\n isOpen,\n focusSearchInput,\n setIsOpen,\n goDownFromSearchInput,\n onType,\n isSkinToneInPreview,\n isSkinToneInSearch\n ]\n );\n\n useEffect(() => {\n const current = SkinTonePickerRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [SkinTonePickerRef, SearchInputRef, isOpen, onKeyDown]);\n}\n\nfunction useCategoryNavigationKeyboardEvents() {\n const focusSearchInput = useFocusSearchInput();\n const CategoryNavigationRef = useCategoryNavigationRef();\n const BodyRef = useBodyRef();\n const onType = useOnType();\n\n const onKeyDown = useMemo(\n () =>\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n switch (key) {\n case KeyboardEvents.ArrowUp:\n event.preventDefault();\n focusSearchInput();\n break;\n case KeyboardEvents.ArrowRight:\n event.preventDefault();\n focusNextElementSibling(getActiveElement());\n break;\n case KeyboardEvents.ArrowLeft:\n event.preventDefault();\n focusPrevElementSibling(getActiveElement());\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n focusFirstVisibleEmoji(BodyRef.current);\n break;\n default:\n onType(event);\n break;\n }\n },\n [BodyRef, focusSearchInput, onType]\n );\n\n useEffect(() => {\n const current = CategoryNavigationRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [CategoryNavigationRef, BodyRef, onKeyDown]);\n}\n\nfunction useBodyKeyboardEvents() {\n const BodyRef = useBodyRef();\n const goUpFromBody = useGoUpFromBody();\n const setVariationPicker = useSetVariationPicker();\n const hasOpenToggles = useHasOpenToggles();\n const closeAllOpenToggles = useCloseAllOpenToggles();\n\n const onType = useOnType();\n\n const onKeyDown = useMemo(\n () =>\n // eslint-disable-next-line complexity\n function onKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n const activeElement = buttonFromTarget(getActiveElement());\n\n switch (key) {\n case KeyboardEvents.ArrowRight:\n event.preventDefault();\n focusNextVisibleEmoji(activeElement);\n break;\n case KeyboardEvents.ArrowLeft:\n event.preventDefault();\n focusPrevVisibleEmoji(activeElement);\n break;\n case KeyboardEvents.ArrowDown:\n event.preventDefault();\n if (hasOpenToggles()) {\n closeAllOpenToggles();\n break;\n }\n focusVisibleEmojiOneRowDown(activeElement);\n break;\n case KeyboardEvents.ArrowUp:\n event.preventDefault();\n if (hasOpenToggles()) {\n closeAllOpenToggles();\n break;\n }\n focusVisibleEmojiOneRowUp(activeElement, goUpFromBody);\n break;\n case KeyboardEvents.Space:\n event.preventDefault();\n setVariationPicker(event.target as HTMLElement);\n break;\n default:\n onType(event);\n break;\n }\n },\n [\n goUpFromBody,\n onType,\n setVariationPicker,\n hasOpenToggles,\n closeAllOpenToggles\n ]\n );\n\n useEffect(() => {\n const current = BodyRef.current;\n\n if (!current) {\n return;\n }\n\n current.addEventListener('keydown', onKeyDown);\n\n return () => {\n current.removeEventListener('keydown', onKeyDown);\n };\n }, [BodyRef, onKeyDown]);\n}\n\nfunction useGoDownFromSearchInput() {\n const focusCategoryNavigation = useFocusCategoryNavigation();\n const isSearchMode = useIsSearchMode();\n const BodyRef = useBodyRef();\n\n return useCallback(\n function goDownFromSearchInput() {\n if (isSearchMode) {\n return focusFirstVisibleEmoji(BodyRef.current);\n }\n return focusCategoryNavigation();\n },\n [BodyRef, focusCategoryNavigation, isSearchMode]\n );\n}\n\nfunction useGoUpFromBody() {\n const focusSearchInput = useFocusSearchInput();\n const focusCategoryNavigation = useFocusCategoryNavigation();\n const isSearchMode = useIsSearchMode();\n\n return useCallback(\n function goUpFromEmoji() {\n if (isSearchMode) {\n return focusSearchInput();\n }\n return focusCategoryNavigation();\n },\n [focusSearchInput, isSearchMode, focusCategoryNavigation]\n );\n}\n\nfunction focusNextSkinTone(exitLeft: () => void) {\n const currentSkinTone = getActiveElement();\n\n if (!currentSkinTone) {\n return;\n }\n\n if (!hasNextElementSibling(currentSkinTone)) {\n exitLeft();\n }\n\n focusNextElementSibling(currentSkinTone);\n}\n\nfunction focusPrevSkinTone() {\n const currentSkinTone = getActiveElement();\n\n if (!currentSkinTone) {\n return;\n }\n\n focusPrevElementSibling(currentSkinTone);\n}\n\nfunction useOnType() {\n const appendSearch = useAppendSearch();\n const focusSearchInput = useFocusSearchInput();\n const searchDisabled = useSearchDisabledConfig();\n const closeAllOpenToggles = useCloseAllOpenToggles();\n\n return function onType(event: KeyboardEvent) {\n const { key } = event;\n\n if (hasModifier(event) || searchDisabled) {\n return;\n }\n\n if (key.match(/(^[a-zA-Z0-9]$){1}/)) {\n event.preventDefault();\n closeAllOpenToggles();\n focusSearchInput();\n appendSearch(key);\n }\n };\n}\n\nfunction hasModifier(event: KeyboardEvent): boolean {\n const { metaKey, ctrlKey, altKey } = event;\n\n return metaKey || ctrlKey || altKey;\n}\n","import { useCallback } from 'react';\n\nimport { useBodyRef } from '../components/context/ElementRefContext';\n\nimport { asSelectors, ClassNames } from './classNames';\nimport {\n categoryLabelHeight,\n closestCategory,\n closestScrollBody,\n emojiDistanceFromScrollTop,\n isEmojiBehindLabel,\n NullableElement,\n queryScrollBody\n} from './selectors';\n\nexport function scrollTo(root: NullableElement, top: number = 0) {\n const $eprBody = queryScrollBody(root);\n\n if (!$eprBody) {\n return;\n }\n\n requestAnimationFrame(() => {\n $eprBody.scrollTop = top;\n });\n}\n\nexport function scrollBy(root: NullableElement, by: number): void {\n const $eprBody = queryScrollBody(root);\n\n if (!$eprBody) {\n return;\n }\n\n requestAnimationFrame(() => {\n $eprBody.scrollTop = $eprBody.scrollTop + by;\n });\n}\n\nexport function useScrollTo() {\n const BodyRef = useBodyRef();\n\n return useCallback(\n (top: number) => {\n requestAnimationFrame(() => {\n if (BodyRef.current) {\n BodyRef.current.scrollTop = top;\n }\n });\n },\n [BodyRef]\n );\n}\n\nexport function scrollEmojiAboveLabel(emoji: NullableElement) {\n if (!emoji || !isEmojiBehindLabel(emoji)) {\n return;\n }\n\n if (emoji.closest(asSelectors(ClassNames.variationPicker))) {\n return;\n }\n\n const scrollBody = closestScrollBody(emoji);\n const by = emojiDistanceFromScrollTop(emoji);\n scrollBy(scrollBody, -(categoryLabelHeight(closestCategory(emoji)) - by));\n}\n","import { DataEmoji } from '../dataUtils/DataTypes';\nimport {\n emojiByUnified,\n unifiedWithoutSkinTone\n} from '../dataUtils/emojiSelectors';\n\nimport { asSelectors, ClassNames } from './classNames';\nimport { firstVisibleElementInContainer } from './elementPositionInRow';\n\nexport type NullableElement = HTMLElement | null;\n\nexport const EmojiButtonSelector = `button${asSelectors(ClassNames.emoji)}`;\nexport const VisibleEmojiSelector = [\n EmojiButtonSelector,\n asSelectors(ClassNames.visible),\n `:not(${asSelectors(ClassNames.hidden)})`\n].join('');\n\nexport function buttonFromTarget(\n emojiElement: NullableElement\n): HTMLButtonElement | null {\n return emojiElement?.closest(EmojiButtonSelector) ?? null;\n}\n\nexport function isEmojiButton(element: NullableElement): boolean {\n if (!element) {\n return false;\n }\n\n return element.matches(EmojiButtonSelector);\n}\n\nexport function emojiFromElement(\n element: NullableElement\n): [DataEmoji, string] | [] {\n const originalUnified = originalUnifiedFromEmojiElement(element);\n const unified = unifiedFromEmojiElement(element);\n\n if (!originalUnified) {\n return [];\n }\n\n const emoji = emojiByUnified(unified ?? originalUnified);\n\n if (!emoji) {\n return [];\n }\n\n return [emoji, unified as string];\n}\n\nexport function isEmojiElement(element: NullableElement): boolean {\n return Boolean(\n element?.matches(EmojiButtonSelector) ||\n element?.parentElement?.matches(EmojiButtonSelector)\n );\n}\n\nexport function categoryLabelFromCategory(\n category: NullableElement\n): NullableElement {\n return category?.querySelector(asSelectors(ClassNames.label)) ?? null;\n}\n\nexport function closestCategoryLabel(\n element: NullableElement\n): NullableElement {\n const category = closestCategory(element);\n return categoryLabelFromCategory(category);\n}\n\nexport function elementHeight(element: NullableElement): number {\n return element?.clientHeight ?? 0;\n}\n\nexport function emojiTrueOffsetTop(element: NullableElement): number {\n if (!element) {\n return 0;\n }\n\n const button = buttonFromTarget(element);\n const category = closestCategory(button);\n\n // compensate for the label height\n const labelHeight = categoryLabelHeight(category);\n\n return elementOffsetTop(button) + elementOffsetTop(category) + labelHeight;\n}\n\nexport function categoryLabelHeight(category: NullableElement): number {\n if (!category) {\n return 0;\n }\n\n const categoryWithoutLabel = category.querySelector(\n asSelectors(ClassNames.categoryContent)\n );\n\n return (\n (category?.clientHeight ?? 0) - (categoryWithoutLabel?.clientHeight ?? 0)\n );\n}\n\nexport function isEmojiBehindLabel(emoji: NullableElement): boolean {\n if (!emoji) {\n return false;\n }\n\n return (\n emojiDistanceFromScrollTop(emoji) <\n categoryLabelHeight(closestCategory(emoji))\n );\n}\n\nexport function queryScrollBody(root: NullableElement): NullableElement {\n if (!root) return null;\n\n return root.matches(asSelectors(ClassNames.scrollBody))\n ? root\n : root.querySelector(asSelectors(ClassNames.scrollBody));\n}\n\nexport function emojiDistanceFromScrollTop(emoji: NullableElement): number {\n if (!emoji) {\n return 0;\n }\n\n return emojiTrueOffsetTop(emoji) - (closestScrollBody(emoji)?.scrollTop ?? 0);\n}\n\nexport function closestScrollBody(element: NullableElement): NullableElement {\n if (!element) {\n return null;\n }\n\n return element.closest(asSelectors(ClassNames.scrollBody)) ?? null;\n}\n\nexport function emojiTruOffsetLeft(element: NullableElement): number {\n const button = buttonFromTarget(element);\n const category = closestCategory(button);\n\n return elementOffsetLeft(button) + elementOffsetLeft(category);\n}\n\nfunction elementOffsetTop(element: NullableElement): number {\n return element?.offsetTop ?? 0;\n}\n\nfunction elementOffsetLeft(element: NullableElement): number {\n return element?.offsetLeft ?? 0;\n}\n\nexport function unifiedFromEmojiElement(emoji: NullableElement): string | null {\n return elementDataSetKey(buttonFromTarget(emoji), 'unified') ?? null;\n}\n\nexport function originalUnifiedFromEmojiElement(\n emoji: NullableElement\n): string | null {\n const unified = unifiedFromEmojiElement(emoji);\n\n if (unified) {\n return unifiedWithoutSkinTone(unified);\n }\n return null;\n}\n\nexport function allUnifiedFromEmojiElement(\n emoji: NullableElement\n): { unified: string | null; originalUnified: string | null } {\n if (!emoji) {\n return {\n unified: null,\n originalUnified: null\n };\n }\n\n return {\n unified: unifiedFromEmojiElement(emoji),\n originalUnified: originalUnifiedFromEmojiElement(emoji)\n };\n}\n\nfunction elementDataSetKey(\n element: NullableElement,\n key: string\n): string | null {\n return elementDataSet(element)[key] ?? null;\n}\n\nfunction elementDataSet(element: NullableElement): DOMStringMap {\n return element?.dataset ?? {};\n}\n\nexport function isVisibleEmoji(element: HTMLElement) {\n return element.classList.contains(ClassNames.visible);\n}\n\nexport function isHidden(element: NullableElement) {\n if (!element) return true;\n\n return element.classList.contains(ClassNames.hidden);\n}\n\nexport function allVisibleEmojis(parent: NullableElement) {\n if (!parent) {\n return [];\n }\n\n return Array.from(\n parent.querySelectorAll(VisibleEmojiSelector)\n ) as HTMLElement[];\n}\n\nexport function lastVisibleEmoji(element: NullableElement): NullableElement {\n if (!element) return null;\n\n const allEmojis = allVisibleEmojis(element);\n const [last] = allEmojis.slice(-1);\n if (!last) {\n return null;\n }\n\n if (!isVisibleEmoji(last)) {\n return prevVisibleEmoji(last);\n }\n\n return last;\n}\n\nexport function nextVisibleEmoji(element: HTMLElement): NullableElement {\n const next = element.nextElementSibling as HTMLElement;\n\n if (!next) {\n return firstVisibleEmoji(nextCategory(element));\n }\n\n if (!isVisibleEmoji(next)) {\n return nextVisibleEmoji(next);\n }\n\n return next;\n}\n\nexport function prevVisibleEmoji(element: HTMLElement): NullableElement {\n const prev = element.previousElementSibling as HTMLElement;\n\n if (!prev) {\n return lastVisibleEmoji(prevCategory(element));\n }\n\n if (!isVisibleEmoji(prev)) {\n return prevVisibleEmoji(prev);\n }\n\n return prev;\n}\n\nexport function firstVisibleEmoji(parent: NullableElement) {\n if (!parent) {\n return null;\n }\n\n const allEmojis = allVisibleEmojis(parent);\n\n return firstVisibleElementInContainer(parent, allEmojis, 0.1);\n}\n\nexport function prevCategory(element: NullableElement): NullableElement {\n const category = closestCategory(element);\n\n if (!category) {\n return null;\n }\n\n const prev = category.previousElementSibling as HTMLElement;\n\n if (!prev) {\n return null;\n }\n\n if (isHidden(prev)) {\n return prevCategory(prev);\n }\n\n return prev;\n}\n\nexport function nextCategory(element: NullableElement): NullableElement {\n const category = closestCategory(element);\n\n if (!category) {\n return null;\n }\n\n const next = category.nextElementSibling as HTMLElement;\n\n if (!next) {\n return null;\n }\n\n if (isHidden(next)) {\n return nextCategory(next);\n }\n\n return next;\n}\n\nexport function closestCategory(element: NullableElement) {\n if (!element) {\n return null;\n }\n return element.closest(asSelectors(ClassNames.category)) as HTMLElement;\n}\n\nexport function closestCategoryContent(element: NullableElement) {\n if (!element) {\n return null;\n }\n return element.closest(\n asSelectors(ClassNames.categoryContent)\n ) as HTMLElement;\n}\n","import {\n elementCountInRow,\n elementIndexInRow,\n getElementInNextRow,\n getElementInPrevRow,\n getElementInRow,\n hasNextRow,\n rowNumber\n} from './elementPositionInRow';\nimport { focusElement } from './focusElement';\nimport { scrollEmojiAboveLabel } from './scrollTo';\nimport {\n allVisibleEmojis,\n closestCategory,\n firstVisibleEmoji,\n lastVisibleEmoji,\n nextCategory,\n nextVisibleEmoji,\n NullableElement,\n prevCategory,\n prevVisibleEmoji,\n closestCategoryContent\n} from './selectors';\n\nexport function focusFirstVisibleEmoji(parent: NullableElement) {\n const emoji = firstVisibleEmoji(parent);\n focusElement(emoji);\n scrollEmojiAboveLabel(emoji);\n}\n\nexport function focusAndClickFirstVisibleEmoji(parent: NullableElement) {\n const firstEmoji = firstVisibleEmoji(parent);\n\n focusElement(firstEmoji);\n firstEmoji?.click();\n}\n\nexport function focusLastVisibleEmoji(parent: NullableElement) {\n focusElement(lastVisibleEmoji(parent));\n}\n\nexport function focusNextVisibleEmoji(element: NullableElement) {\n if (!element) {\n return;\n }\n\n const next = nextVisibleEmoji(element);\n\n if (!next) {\n return focusFirstVisibleEmoji(nextCategory(element));\n }\n\n focusElement(next);\n scrollEmojiAboveLabel(next);\n}\n\nexport function focusPrevVisibleEmoji(element: NullableElement) {\n if (!element) {\n return;\n }\n\n const prev = prevVisibleEmoji(element);\n\n if (!prev) {\n return focusLastVisibleEmoji(prevCategory(element));\n }\n\n focusElement(prev);\n scrollEmojiAboveLabel(prev);\n}\n\nexport function focusVisibleEmojiOneRowUp(\n element: NullableElement,\n exitUp: () => void\n) {\n if (!element) {\n return;\n }\n\n const prev = visibleEmojiOneRowUp(element);\n\n if (!prev) {\n return exitUp();\n }\n\n focusElement(prev);\n scrollEmojiAboveLabel(prev);\n}\n\nexport function focusVisibleEmojiOneRowDown(element: NullableElement) {\n if (!element) {\n return;\n }\n\n const next = visibleEmojiOneRowDown(element);\n\n return focusElement(next);\n}\n\nfunction visibleEmojiOneRowUp(element: HTMLElement) {\n if (!element) {\n return null;\n }\n\n const categoryContent = closestCategoryContent(element);\n const category = closestCategory(categoryContent);\n const indexInRow = elementIndexInRow(categoryContent, element);\n const row = rowNumber(categoryContent, element);\n const countInRow = elementCountInRow(categoryContent, element);\n\n if (row === 0) {\n const prevVisibleCategory = prevCategory(category);\n\n if (!prevVisibleCategory) {\n return null;\n }\n\n return getElementInRow(\n allVisibleEmojis(prevVisibleCategory),\n -1, // last row\n countInRow,\n indexInRow\n );\n }\n\n return getElementInPrevRow(\n allVisibleEmojis(categoryContent),\n row,\n countInRow,\n indexInRow\n );\n}\n\nfunction visibleEmojiOneRowDown(element: HTMLElement) {\n if (!element) {\n return null;\n }\n\n const categoryContent = closestCategoryContent(element);\n const category = closestCategory(categoryContent);\n const indexInRow = elementIndexInRow(categoryContent, element);\n const row = rowNumber(categoryContent, element);\n const countInRow = elementCountInRow(categoryContent, element);\n if (!hasNextRow(categoryContent, element)) {\n const nextVisibleCategory = nextCategory(category);\n\n if (!nextVisibleCategory) {\n return null;\n }\n\n return getElementInRow(\n allVisibleEmojis(nextVisibleCategory),\n 0,\n countInRow,\n indexInRow\n );\n }\n\n const itemInNextRow = getElementInNextRow(\n allVisibleEmojis(categoryContent),\n row,\n countInRow,\n indexInRow\n );\n\n return itemInNextRow;\n}\n","import { useCallback } from 'react';\n\nimport {\n useEmojiVariationPickerState,\n useSkinToneFanOpenState\n} from '../components/context/PickerContext';\n\nexport function useCloseAllOpenToggles() {\n const [variationPicker, setVariationPicker] = useEmojiVariationPickerState();\n const [skinToneFanOpen, setSkinToneFanOpen] = useSkinToneFanOpenState();\n\n const closeAllOpenToggles = useCallback(() => {\n if (variationPicker) {\n setVariationPicker(null);\n }\n\n if (skinToneFanOpen) {\n setSkinToneFanOpen(false);\n }\n }, [\n variationPicker,\n skinToneFanOpen,\n setVariationPicker,\n setSkinToneFanOpen\n ]);\n\n return closeAllOpenToggles;\n}\n\nexport function useHasOpenToggles() {\n const [variationPicker] = useEmojiVariationPickerState();\n const [skinToneFanOpen] = useSkinToneFanOpenState();\n\n return function hasOpenToggles() {\n return !!variationPicker || skinToneFanOpen;\n };\n}\n","import { useEffect } from 'react';\n\nimport { useBodyRef } from '../components/context/ElementRefContext';\nimport { useDisallowMouseRef } from '../components/context/PickerContext';\n\nexport function useDisallowMouseMove() {\n const DisallowMouseRef = useDisallowMouseRef();\n return function disallowMouseMove() {\n DisallowMouseRef.current = true;\n };\n}\n\nexport function useAllowMouseMove() {\n const DisallowMouseRef = useDisallowMouseRef();\n return function allowMouseMove() {\n DisallowMouseRef.current = false;\n };\n}\n\nexport function useIsMouseDisallowed() {\n const DisallowMouseRef = useDisallowMouseRef();\n return function isMouseDisallowed() {\n return DisallowMouseRef.current;\n };\n}\n\nexport function useOnMouseMove() {\n const BodyRef = useBodyRef();\n const allowMouseMove = useAllowMouseMove();\n const isMouseDisallowed = useIsMouseDisallowed();\n\n useEffect(() => {\n const bodyRef = BodyRef.current;\n bodyRef?.addEventListener('mousemove', onMouseMove, {\n passive: true\n });\n\n function onMouseMove() {\n if (isMouseDisallowed()) {\n allowMouseMove();\n }\n }\n return () => {\n bodyRef?.removeEventListener('mousemove', onMouseMove);\n };\n }, [BodyRef, allowMouseMove, isMouseDisallowed]);\n}\n","import { useCallback } from 'react';\n\nimport { focusElement, focusFirstElementChild } from '../DomUtils/focusElement';\nimport {\n useCategoryNavigationRef,\n useSearchInputRef,\n useSkinTonePickerRef\n} from '../components/context/ElementRefContext';\n\nexport function useFocusSearchInput() {\n const SearchInputRef = useSearchInputRef();\n\n return useCallback(() => {\n focusElement(SearchInputRef.current);\n }, [SearchInputRef]);\n}\n\nexport function useFocusSkinTonePicker() {\n const SkinTonePickerRef = useSkinTonePickerRef();\n\n return useCallback(() => {\n if (!SkinTonePickerRef.current) {\n return;\n }\n\n focusFirstElementChild(SkinTonePickerRef.current);\n }, [SkinTonePickerRef]);\n}\n\nexport function useFocusCategoryNavigation() {\n const CategoryNavigationRef = useCategoryNavigationRef();\n\n return useCallback(() => {\n if (!CategoryNavigationRef.current) {\n return;\n }\n\n focusFirstElementChild(CategoryNavigationRef.current);\n }, [CategoryNavigationRef]);\n}\n","import { scrollTo } from '../DomUtils/scrollTo';\nimport {\n usePickerMainRef,\n useSearchInputRef\n} from '../components/context/ElementRefContext';\nimport {\n FilterState,\n useFilterRef,\n useSearchTermState\n} from '../components/context/PickerContext';\nimport { useSearchResultsConfig } from '../config/useConfig';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport { emojiNames } from '../dataUtils/emojiSelectors';\n\nimport { useFocusSearchInput } from './useFocus';\n\nfunction useSetFilterRef() {\n const filterRef = useFilterRef();\n\n return function setFilter(\n setter: FilterState | ((current: FilterState) => FilterState)\n ): void {\n if (typeof setter === 'function') {\n return setFilter(setter(filterRef.current));\n }\n\n filterRef.current = setter;\n };\n}\n\nexport function useClearSearch() {\n const applySearch = useApplySearch();\n const SearchInputRef = useSearchInputRef();\n const focusSearchInput = useFocusSearchInput();\n\n return function clearSearch() {\n if (SearchInputRef.current) {\n SearchInputRef.current.value = '';\n }\n\n applySearch('');\n focusSearchInput();\n };\n}\n\nexport function useAppendSearch() {\n const SearchInputRef = useSearchInputRef();\n const applySearch = useApplySearch();\n\n return function appendSearch(str: string) {\n if (SearchInputRef.current) {\n SearchInputRef.current.value = `${SearchInputRef.current.value}${str}`;\n applySearch(getNormalizedSearchTerm(SearchInputRef.current.value));\n } else {\n applySearch(getNormalizedSearchTerm(str));\n }\n };\n}\n\nexport function useFilter() {\n const SearchInputRef = useSearchInputRef();\n const filterRef = useFilterRef();\n const setFilterRef = useSetFilterRef();\n const applySearch = useApplySearch();\n\n const [searchTerm] = useSearchTermState();\n const statusSearchResults = getStatusSearchResults(\n filterRef.current,\n searchTerm\n );\n\n return {\n onChange,\n searchTerm,\n SearchInputRef,\n statusSearchResults\n };\n\n function onChange(inputValue: string) {\n const filter = filterRef.current;\n\n const nextValue = inputValue.toLowerCase();\n\n if (filter?.[nextValue] || nextValue.length <= 1) {\n return applySearch(nextValue);\n }\n\n const longestMatch = findLongestMatch(nextValue, filter);\n\n if (!longestMatch) {\n // Can we even get here?\n // If so, we need to search among all emojis\n return applySearch(nextValue);\n }\n\n setFilterRef(current =>\n Object.assign(current, {\n [nextValue]: filterEmojiObjectByKeyword(longestMatch, nextValue)\n })\n );\n applySearch(nextValue);\n }\n}\n\nfunction useApplySearch() {\n const [, setSearchTerm] = useSearchTermState();\n const PickerMainRef = usePickerMainRef();\n\n return function applySearch(searchTerm: string) {\n requestAnimationFrame(() => {\n setSearchTerm(searchTerm ? searchTerm?.toLowerCase() : searchTerm).then(\n () => {\n scrollTo(PickerMainRef.current, 0);\n }\n );\n });\n };\n}\n\nfunction filterEmojiObjectByKeyword(\n emojis: FilterDict,\n keyword: string\n): FilterDict {\n const filtered: FilterDict = {};\n\n for (const unified in emojis) {\n const emoji = emojis[unified];\n\n if (hasMatch(emoji, keyword)) {\n filtered[unified] = emoji;\n }\n }\n\n return filtered;\n}\n\nfunction hasMatch(emoji: DataEmoji, keyword: string): boolean {\n return emojiNames(emoji).some(name => name.includes(keyword));\n}\n\nexport function useIsEmojiFiltered(): (unified: string) => boolean {\n const { current: filter } = useFilterRef();\n const [searchTerm] = useSearchTermState();\n\n return unified => isEmojiFilteredBySearchTerm(unified, filter, searchTerm);\n}\n\nfunction isEmojiFilteredBySearchTerm(\n unified: string,\n filter: FilterState,\n searchTerm: string\n): boolean {\n if (!filter || !searchTerm) {\n return false;\n }\n\n return !filter[searchTerm]?.[unified];\n}\n\nexport type FilterDict = Record<string, DataEmoji>;\n\nfunction findLongestMatch(\n keyword: string,\n dict: Record<string, FilterDict> | null\n): FilterDict | null {\n if (!dict) {\n return null;\n }\n\n if (dict[keyword]) {\n return dict[keyword];\n }\n\n const longestMatchingKey = Object.keys(dict)\n .sort((a, b) => b.length - a.length)\n .find(key => keyword.includes(key));\n\n if (longestMatchingKey) {\n return dict[longestMatchingKey];\n }\n\n return null;\n}\n\nexport function getNormalizedSearchTerm(str: string): string {\n if (!str || typeof str !== 'string') {\n return '';\n }\n\n return str.trim().toLowerCase();\n}\n\nfunction getStatusSearchResults(\n filterState: FilterState,\n searchTerm: string\n): string {\n if (!filterState?.[searchTerm]) return '';\n\n const searchResultsCount =\n Object.entries(filterState?.[searchTerm])?.length || 0;\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useSearchResultsConfig(searchResultsCount);\n}\n","import { emojiFromElement, NullableElement } from '../DomUtils/selectors';\nimport { useSetAnchoredEmojiRef } from '../components/context/ElementRefContext';\nimport { useEmojiVariationPickerState } from '../components/context/PickerContext';\n\nexport default function useSetVariationPicker() {\n const setAnchoredEmojiRef = useSetAnchoredEmojiRef();\n const [, setEmojiVariationPicker] = useEmojiVariationPickerState();\n\n return function setVariationPicker(element: NullableElement) {\n const [emoji] = emojiFromElement(element);\n\n if (emoji) {\n setAnchoredEmojiRef(element);\n setEmojiVariationPicker(emoji);\n }\n };\n}\n","import { useSkinTonePickerLocationConfig } from '../config/useConfig';\nimport { SkinTonePickerLocation } from '../types/exposedTypes';\n\nexport function useShouldShowSkinTonePicker() {\n const skinTonePickerLocationConfig = useSkinTonePickerLocationConfig();\n\n return function shouldShowSkinTonePicker(location: SkinTonePickerLocation) {\n return skinTonePickerLocationConfig === location;\n };\n}\n\nexport function useIsSkinToneInSearch() {\n const skinTonePickerLocationConfig = useSkinTonePickerLocationConfig();\n\n return skinTonePickerLocationConfig === SkinTonePickerLocation.SEARCH;\n}\n\nexport function useIsSkinToneInPreview() {\n const skinTonePickerLocationConfig = useSkinTonePickerLocationConfig();\n\n return skinTonePickerLocationConfig === SkinTonePickerLocation.PREVIEW;\n}\n","import { DEFAULT_LABEL_HEIGHT } from '../components/main/PickerMain';\n\nimport { ClassNames, asSelectors } from './classNames';\nimport { NullableElement } from './selectors';\n\nexport function elementCountInRow(\n parent: NullableElement,\n element: NullableElement\n): number {\n if (!parent || !element) {\n return 0;\n }\n\n const parentWidth = parent.getBoundingClientRect().width;\n const elementWidth = element.getBoundingClientRect().width;\n return Math.floor(parentWidth / elementWidth);\n}\n\nexport function elementIndexInRow(\n parent: NullableElement,\n element: NullableElement\n): number {\n if (!parent || !element) {\n return 0;\n }\n\n const elementWidth = element.getBoundingClientRect().width;\n const elementLeft = element.getBoundingClientRect().left;\n const parentLeft = parent.getBoundingClientRect().left;\n\n return Math.floor((elementLeft - parentLeft) / elementWidth);\n}\n\nexport function rowNumber(\n parent: NullableElement,\n element: NullableElement\n): number {\n if (!parent || !element) {\n return 0;\n }\n\n const elementHeight = element.getBoundingClientRect().height;\n const elementTop = element.getBoundingClientRect().top;\n const parentTop = parent.getBoundingClientRect().top;\n return Math.round((elementTop - parentTop) / elementHeight);\n}\n\nexport function hasNextRow(\n parent: NullableElement,\n element: NullableElement\n): boolean {\n if (!parent || !element) {\n return false;\n }\n\n const elementHeight = element.getBoundingClientRect().height;\n const elementTop = element.getBoundingClientRect().top;\n const parentTop = parent.getBoundingClientRect().top;\n const parentHeight = parent.getBoundingClientRect().height;\n\n return Math.round(elementTop - parentTop + elementHeight) < parentHeight;\n}\n\nfunction getRowElements(\n elements: HTMLElement[],\n row: number,\n elementsInRow: number\n): HTMLElement[] {\n if (row === -1) {\n const lastRow = Math.floor((elements.length - 1) / elementsInRow);\n const firstElementIndex = lastRow * elementsInRow;\n const lastElementIndex = elements.length - 1;\n return elements.slice(firstElementIndex, lastElementIndex + 1);\n }\n\n return elements.slice(row * elementsInRow, (row + 1) * elementsInRow);\n}\n\nfunction getNextRowElements(\n allElements: HTMLElement[],\n currentRow: number,\n elementsInRow: number\n): HTMLElement[] {\n const nextRow = currentRow + 1;\n\n if (nextRow * elementsInRow > allElements.length) {\n return [];\n }\n\n return getRowElements(allElements, nextRow, elementsInRow);\n}\n\nexport function getElementInRow(\n elements: HTMLElement[],\n row: number,\n elementsInRow: number,\n indexInRow: number\n): NullableElement {\n const rowElements = getRowElements(elements, row, elementsInRow);\n // get element, default to last\n return rowElements[indexInRow] || rowElements[rowElements.length - 1] || null;\n}\n\nexport function getElementInNextRow(\n allElements: HTMLElement[],\n currentRow: number,\n elementsInRow: number,\n index: number\n): NullableElement {\n const nextRowElements = getNextRowElements(\n allElements,\n currentRow,\n elementsInRow\n );\n\n // return item in index, or last item in row\n return (\n nextRowElements[index] ||\n nextRowElements[nextRowElements.length - 1] ||\n null\n );\n}\n\nexport function getElementInPrevRow(\n allElements: HTMLElement[],\n currentRow: number,\n elementsInRow: number,\n index: number\n): NullableElement {\n const prevRowElements = getRowElements(\n allElements,\n currentRow - 1,\n elementsInRow\n );\n\n // default to last\n return (\n prevRowElements[index] ||\n prevRowElements[prevRowElements.length - 1] ||\n null\n );\n}\n\nexport function firstVisibleElementInContainer(\n parent: NullableElement,\n elements: HTMLElement[],\n maxVisibilityDiffThreshold = 0\n): NullableElement {\n if (!parent || !elements.length) {\n return null;\n }\n\n const parentTop = parent.getBoundingClientRect().top;\n const parentBottom = parent.getBoundingClientRect().bottom;\n const parentTopWithLabel = parentTop + getLabelHeight(parent);\n\n const visibleElements = elements.find(element => {\n const elementTop = element.getBoundingClientRect().top;\n const elementBottom = element.getBoundingClientRect().bottom;\n const maxVisibilityDiffPixels =\n element.clientHeight * maxVisibilityDiffThreshold;\n\n const elementTopWithAllowedDiff = elementTop + maxVisibilityDiffPixels;\n const elementBottomWithAllowedDiff =\n elementBottom - maxVisibilityDiffPixels;\n\n if (elementTopWithAllowedDiff < parentTopWithLabel) {\n return false;\n }\n\n return (\n (elementTopWithAllowedDiff >= parentTop &&\n elementTopWithAllowedDiff <= parentBottom) ||\n (elementBottomWithAllowedDiff >= parentTop &&\n elementBottomWithAllowedDiff <= parentBottom)\n );\n });\n\n return visibleElements || null;\n}\n\nexport function hasNextElementSibling(element: HTMLElement) {\n return !!element.nextElementSibling;\n}\n\nfunction getLabelHeight(parentNode: HTMLElement) {\n const labels = Array.from(\n parentNode.querySelectorAll(asSelectors(ClassNames.label))\n );\n\n for (const label of labels) {\n const height = label.getBoundingClientRect().height;\n // return height if label is not hidden\n if (height > 0) {\n return height;\n }\n }\n\n return DEFAULT_LABEL_HEIGHT;\n}\n","import { GetEmojiUrl } from '../components/emoji/BaseEmojiProps';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport { emojiUnified, emojiVariations } from '../dataUtils/emojiSelectors';\nimport { EmojiStyle } from '../types/exposedTypes';\n\nexport function preloadEmoji(\n getEmojiUrl: GetEmojiUrl,\n emoji: undefined | DataEmoji,\n emojiStyle: EmojiStyle\n): void {\n if (!emoji) {\n return;\n }\n\n if (emojiStyle === EmojiStyle.NATIVE) {\n return;\n }\n\n const unified = emojiUnified(emoji);\n\n if (preloadedEmojs.has(unified)) {\n return;\n }\n\n emojiVariations(emoji).forEach((variation) => {\n const emojiUrl = getEmojiUrl(variation, emojiStyle);\n preloadImage(emojiUrl);\n });\n\n preloadedEmojs.add(unified);\n}\n\nexport const preloadedEmojs: Set<string> = new Set();\n\nfunction preloadImage(url: string): void {\n const image = new Image();\n image.src = url;\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n useClassNameConfig,\n useStyleConfig,\n useThemeConfig\n} from '../../config/useConfig';\nimport useIsSearchMode from '../../hooks/useIsSearchMode';\nimport { useKeyboardNavigation } from '../../hooks/useKeyboardNavigation';\nimport { useOnFocus } from '../../hooks/useOnFocus';\nimport { Theme } from '../../types/exposedTypes';\nimport { usePickerMainRef } from '../context/ElementRefContext';\nimport {\n PickerContextProvider,\n useReactionsModeState\n} from '../context/PickerContext';\n\ntype Props = Readonly<{\n children: React.ReactNode;\n}>;\n\nexport const DEFAULT_LABEL_HEIGHT = 40;\n\nexport default function PickerMain({ children }: Props) {\n return (\n <PickerContextProvider>\n <PickerRootElement>{children}</PickerRootElement>\n </PickerContextProvider>\n );\n}\n\ntype RootProps = Readonly<{\n className?: string;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}>;\n\nfunction PickerRootElement({ children }: RootProps) {\n const [reactionsMode] = useReactionsModeState();\n const theme = useThemeConfig();\n const searchModeActive = useIsSearchMode();\n const PickerMainRef = usePickerMainRef();\n const className = useClassNameConfig();\n const style = useStyleConfig();\n\n useKeyboardNavigation();\n useOnFocus();\n\n const { width, height, ...styleProps } = style || {};\n\n return (\n <aside\n className={cx(\n styles.main,\n styles.baseVariables,\n theme === Theme.DARK && styles.darkTheme,\n theme === Theme.AUTO && styles.autoThemeDark,\n {\n [ClassNames.searchActive]: searchModeActive\n },\n reactionsMode && styles.reactionsMenu,\n className\n )}\n ref={PickerMainRef}\n style={{\n ...styleProps,\n ...(!reactionsMode && { height, width })\n }}\n >\n {children}\n </aside>\n );\n}\n\nconst DarkTheme = {\n '--epr-emoji-variation-picker-bg-color':\n 'var(--epr-dark-emoji-variation-picker-bg-color)',\n '--epr-hover-bg-color-reduced-opacity':\n 'var(--epr-dark-hover-bg-color-reduced-opacity)',\n '--epr-highlight-color': 'var(--epr-dark-highlight-color)',\n '--epr-text-color': 'var(--epr-dark-text-color)',\n '--epr-hover-bg-color': 'var(--epr-dark-hover-bg-color)',\n '--epr-focus-bg-color': 'var(--epr-dark-focus-bg-color)',\n '--epr-search-input-bg-color': 'var(--epr-dark-search-input-bg-color)',\n '--epr-category-label-bg-color': 'var(--epr-dark-category-label-bg-color)',\n '--epr-picker-border-color': 'var(--epr-dark-picker-border-color)',\n '--epr-bg-color': 'var(--epr-dark-bg-color)',\n '--epr-reactions-bg-color': 'var(--epr-dark-reactions-bg-color)',\n '--epr-search-input-bg-color-active':\n 'var(--epr-dark-search-input-bg-color-active)',\n '--epr-emoji-variation-indicator-color':\n 'var(--epr-dark-emoji-variation-indicator-color)',\n '--epr-category-icon-active-color':\n 'var(--epr-dark-category-icon-active-color)',\n '--epr-skin-tone-picker-menu-color':\n 'var(--epr-dark-skin-tone-picker-menu-color)'\n};\n\nconst styles = stylesheet.create({\n main: {\n '.': ['epr-main', ClassNames.emojiPicker],\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderRadius: 'var(--epr-picker-border-radius)',\n borderColor: 'var(--epr-picker-border-color)',\n backgroundColor: 'var(--epr-bg-color)',\n overflow: 'hidden',\n transition: 'all 0.3s ease-in-out, background-color 0.1s ease-in-out',\n '*': {\n boxSizing: 'border-box',\n fontFamily: 'sans-serif'\n }\n },\n baseVariables: {\n '--': {\n '--epr-highlight-color': '#007aeb',\n '--epr-hover-bg-color': '#f1f8ff',\n '--epr-hover-bg-color-reduced-opacity': '#f1f8ff80',\n '--epr-focus-bg-color': '#e0f0ff',\n '--epr-text-color': '#858585',\n '--epr-search-input-bg-color': '#f6f6f6',\n '--epr-picker-border-color': '#e7e7e7',\n '--epr-bg-color': '#fff',\n '--epr-reactions-bg-color': '#ffffff90',\n '--epr-category-icon-active-color': '#6aa8de',\n '--epr-skin-tone-picker-menu-color': '#ffffff95',\n\n '--epr-horizontal-padding': '10px',\n\n '--epr-picker-border-radius': '8px',\n\n /* Header */\n '--epr-search-border-color': 'var(--epr-highlight-color)',\n '--epr-header-padding': '15px var(--epr-horizontal-padding)',\n\n /* Skin Tone Picker */\n '--epr-active-skin-tone-indicator-border-color':\n 'var(--epr-highlight-color)',\n '--epr-active-skin-hover-color': 'var(--epr-hover-bg-color)',\n\n /* Search */\n '--epr-search-input-bg-color-active': 'var(--epr-search-input-bg-color)',\n '--epr-search-input-padding': '0 30px',\n '--epr-search-input-border-radius': '8px',\n '--epr-search-input-height': '40px',\n '--epr-search-input-text-color': 'var(--epr-text-color)',\n '--epr-search-input-placeholder-color': 'var(--epr-text-color)',\n '--epr-search-bar-inner-padding': 'var(--epr-horizontal-padding)',\n\n /* Category Navigation */\n '--epr-category-navigation-button-size': '30px',\n\n /* Variation Picker */\n '--epr-emoji-variation-picker-height': '45px',\n '--epr-emoji-variation-picker-bg-color': 'var(--epr-bg-color)',\n\n /* Preview */\n '--epr-preview-height': '70px',\n '--epr-preview-text-size': '14px',\n '--epr-preview-text-padding': '0 var(--epr-horizontal-padding)',\n '--epr-preview-border-color': 'var(--epr-picker-border-color)',\n '--epr-preview-text-color': 'var(--epr-text-color)',\n\n /* Category */\n '--epr-category-padding': '0 var(--epr-horizontal-padding)',\n\n /* Category Label */\n '--epr-category-label-bg-color': '#ffffffe6',\n '--epr-category-label-text-color': 'var(--epr-text-color)',\n '--epr-category-label-padding': '0 var(--epr-horizontal-padding)',\n '--epr-category-label-height': `${DEFAULT_LABEL_HEIGHT}px`,\n\n /* Emoji */\n '--epr-emoji-size': '30px',\n '--epr-emoji-padding': '5px',\n '--epr-emoji-fullsize':\n 'calc(var(--epr-emoji-size) + var(--epr-emoji-padding) * 2)',\n '--epr-emoji-hover-color': 'var(--epr-hover-bg-color)',\n '--epr-emoji-variation-indicator-color': 'var(--epr-picker-border-color)',\n '--epr-emoji-variation-indicator-color-hover': 'var(--epr-text-color)',\n\n /* Z-Index */\n '--epr-header-overlay-z-index': '3',\n '--epr-emoji-variations-indictator-z-index': '1',\n '--epr-category-label-z-index': '2',\n '--epr-skin-variation-picker-z-index': '5',\n '--epr-preview-z-index': '6',\n\n /* Dark Theme Variables */\n '--epr-dark': '#000',\n '--epr-dark-emoji-variation-picker-bg-color': 'var(--epr-dark)',\n '--epr-dark-highlight-color': '#c0c0c0',\n '--epr-dark-text-color': 'var(--epr-highlight-color)',\n '--epr-dark-hover-bg-color': '#363636f6',\n '--epr-dark-hover-bg-color-reduced-opacity': '#36363680',\n '--epr-dark-focus-bg-color': '#474747',\n '--epr-dark-search-input-bg-color': '#333333',\n '--epr-dark-category-label-bg-color': '#222222e6',\n '--epr-dark-picker-border-color': '#151617',\n '--epr-dark-bg-color': '#222222',\n '--epr-dark-reactions-bg-color': '#22222290',\n '--epr-dark-search-input-bg-color-active': 'var(--epr-dark)',\n '--epr-dark-emoji-variation-indicator-color': '#444',\n '--epr-dark-category-icon-active-color': '#3271b7',\n '--epr-dark-skin-tone-picker-menu-color': '#22222295'\n }\n },\n autoThemeDark: {\n '.': ClassNames.autoTheme,\n '@media (prefers-color-scheme: dark)': {\n '--': DarkTheme\n }\n },\n darkTheme: {\n '.': ClassNames.darkTheme,\n '--': DarkTheme\n },\n reactionsMenu: {\n '.': 'epr-reactions',\n height: '50px',\n display: 'inline-flex',\n backgroundColor: 'var(--epr-reactions-bg-color)',\n // @ts-ignore - backdropFilter is not recognized.\n backdropFilter: 'blur(8px)',\n '--': {\n '--epr-picker-border-radius': '50px'\n }\n }\n});\n","import { useEffect } from 'react';\n\nimport { buttonFromTarget, emojiFromElement } from '../DomUtils/selectors';\nimport { useBodyRef } from '../components/context/ElementRefContext';\nimport { useEmojiStyleConfig, useGetEmojiUrlConfig } from '../config/useConfig';\nimport { emojiHasVariations } from '../dataUtils/emojiSelectors';\nimport { EmojiStyle } from '../types/exposedTypes';\n\nimport { preloadEmoji } from './preloadEmoji';\n\nexport function useOnFocus() {\n const BodyRef = useBodyRef();\n const emojiStyle = useEmojiStyleConfig();\n const getEmojiUrl = useGetEmojiUrlConfig();\n\n useEffect(() => {\n if (emojiStyle === EmojiStyle.NATIVE) {\n return;\n }\n\n const bodyRef = BodyRef.current;\n\n bodyRef?.addEventListener('focusin', onFocus);\n\n return () => {\n bodyRef?.removeEventListener('focusin', onFocus);\n };\n\n function onFocus(event: FocusEvent) {\n const button = buttonFromTarget(event.target as HTMLElement);\n\n if (!button) {\n return;\n }\n\n const [emoji] = emojiFromElement(button);\n\n if (!emoji) {\n return;\n }\n\n if (emojiHasVariations(emoji)) {\n preloadEmoji(getEmojiUrl, emoji, emojiStyle);\n }\n }\n }, [BodyRef, emojiStyle, getEmojiUrl]);\n}\n","export function parseNativeEmoji(unified: string): string {\n return unified\n .split('-')\n .map(hex => String.fromCodePoint(parseInt(hex, 16)))\n .join('');\n}\n","import { SkinTones, SuggestionMode } from '../types/exposedTypes';\n\nimport { DataEmoji } from './DataTypes';\nimport { emojiUnified } from './emojiSelectors';\n\nconst SUGGESTED_LS_KEY = 'epr_suggested';\n\ntype SuggestedItem = {\n unified: string;\n original: string;\n count: number;\n};\n\ntype Suggested = SuggestedItem[];\n\nexport function getSuggested(mode?: SuggestionMode): Suggested {\n try {\n if (!window?.localStorage) {\n return [];\n }\n const recent = JSON.parse(\n window?.localStorage.getItem(SUGGESTED_LS_KEY) ?? '[]'\n ) as Suggested;\n\n if (mode === SuggestionMode.FREQUENT) {\n return recent.sort((a, b) => b.count - a.count);\n }\n\n return recent;\n } catch {\n return [];\n }\n}\n\nexport function setSuggested(emoji: DataEmoji, skinTone: SkinTones) {\n const recent = getSuggested();\n\n const unified = emojiUnified(emoji, skinTone);\n const originalUnified = emojiUnified(emoji);\n\n let existing = recent.find(({ unified: u }) => u === unified);\n\n let nextList: SuggestedItem[];\n\n if (existing) {\n nextList = [existing].concat(recent.filter(i => i !== existing));\n } else {\n existing = {\n unified,\n original: originalUnified,\n count: 0\n };\n nextList = [existing, ...recent];\n }\n\n existing.count++;\n\n nextList.length = Math.min(nextList.length, 14);\n\n try {\n window?.localStorage.setItem(SUGGESTED_LS_KEY, JSON.stringify(nextList));\n // Prevents the change from being seen immediately.\n } catch {\n // ignore\n }\n}\n","import {\n Categories,\n CategoryConfig,\n CustomCategoryConfig\n} from '../config/categoryConfig';\nimport { CustomEmoji } from '../config/customEmojiConfig';\nimport { DataEmoji } from '../dataUtils/DataTypes';\n\nexport function isCustomCategory(\n category: CategoryConfig | CustomCategoryConfig\n): category is CustomCategoryConfig {\n return category.category === Categories.CUSTOM;\n}\n\nexport function isCustomEmoji(emoji: Partial<DataEmoji>): emoji is CustomEmoji {\n return emoji.imgUrl !== undefined;\n}\n","import * as React from 'react';\nimport { useEffect, useRef } from 'react';\n\nimport {\n emojiFromElement,\n isEmojiElement,\n NullableElement\n} from '../DomUtils/selectors';\nimport {\n useActiveSkinToneState,\n useDisallowClickRef,\n useEmojiVariationPickerState,\n useUpdateSuggested\n} from '../components/context/PickerContext';\nimport { GetEmojiUrl } from '../components/emoji/BaseEmojiProps';\nimport {\n MOUSE_EVENT_SOURCE,\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useOnEmojiClickConfig\n} from '../config/useConfig';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport {\n activeVariationFromUnified,\n emojiHasVariations,\n emojiNames,\n emojiUnified\n} from '../dataUtils/emojiSelectors';\nimport { parseNativeEmoji } from '../dataUtils/parseNativeEmoji';\nimport { setSuggested } from '../dataUtils/suggested';\nimport { isCustomEmoji } from '../typeRefinements/typeRefinements';\nimport { EmojiClickData, SkinTones, EmojiStyle } from '../types/exposedTypes';\n\nimport { useCloseAllOpenToggles } from './useCloseAllOpenToggles';\nimport useSetVariationPicker from './useSetVariationPicker';\n\nexport function useMouseDownHandlers(\n ContainerRef: React.MutableRefObject<NullableElement>,\n mouseEventSource: MOUSE_EVENT_SOURCE\n) {\n const mouseDownTimerRef = useRef<undefined | number>();\n const setVariationPicker = useSetVariationPicker();\n const disallowClickRef = useDisallowClickRef();\n const [, setEmojiVariationPicker] = useEmojiVariationPickerState();\n const closeAllOpenToggles = useCloseAllOpenToggles();\n const [activeSkinTone] = useActiveSkinToneState();\n const onEmojiClick = useOnEmojiClickConfig(mouseEventSource);\n const [, updateSuggested] = useUpdateSuggested();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const activeEmojiStyle = useEmojiStyleConfig();\n\n const onClick = React.useCallback(\n function onClick(event: MouseEvent) {\n if (disallowClickRef.current) {\n return;\n }\n\n closeAllOpenToggles();\n\n const [emoji, unified] = emojiFromEvent(event);\n\n if (!emoji || !unified) {\n return;\n }\n\n const skinToneToUse =\n activeVariationFromUnified(unified) || activeSkinTone;\n\n updateSuggested();\n setSuggested(emoji, skinToneToUse);\n onEmojiClick(\n emojiClickOutput(emoji, skinToneToUse, activeEmojiStyle, getEmojiUrl),\n event\n );\n },\n [\n activeSkinTone,\n closeAllOpenToggles,\n disallowClickRef,\n onEmojiClick,\n updateSuggested,\n getEmojiUrl,\n activeEmojiStyle\n ]\n );\n\n const onMouseDown = React.useCallback(\n function onMouseDown(event: MouseEvent) {\n if (mouseDownTimerRef.current) {\n clearTimeout(mouseDownTimerRef.current);\n }\n\n const [emoji] = emojiFromEvent(event);\n\n if (!emoji || !emojiHasVariations(emoji)) {\n return;\n }\n\n mouseDownTimerRef.current = window?.setTimeout(() => {\n disallowClickRef.current = true;\n mouseDownTimerRef.current = undefined;\n closeAllOpenToggles();\n setVariationPicker(event.target as HTMLElement);\n setEmojiVariationPicker(emoji);\n }, 500);\n },\n [\n disallowClickRef,\n closeAllOpenToggles,\n setVariationPicker,\n setEmojiVariationPicker\n ]\n );\n const onMouseUp = React.useCallback(\n function onMouseUp() {\n if (mouseDownTimerRef.current) {\n clearTimeout(mouseDownTimerRef.current);\n mouseDownTimerRef.current = undefined;\n } else if (disallowClickRef.current) {\n // The problem we're trying to overcome here\n // is that the emoji has both mouseup and click events\n // and when releasing a mouseup event\n // the click gets triggered too\n // So we're disallowing the click event for a short time\n\n requestAnimationFrame(() => {\n disallowClickRef.current = false;\n });\n }\n },\n [disallowClickRef]\n );\n\n useEffect(() => {\n if (!ContainerRef.current) {\n return;\n }\n const confainerRef = ContainerRef.current;\n confainerRef.addEventListener('click', onClick, {\n passive: true\n });\n\n confainerRef.addEventListener('mousedown', onMouseDown, {\n passive: true\n });\n confainerRef.addEventListener('mouseup', onMouseUp, {\n passive: true\n });\n\n return () => {\n confainerRef?.removeEventListener('click', onClick);\n confainerRef?.removeEventListener('mousedown', onMouseDown);\n confainerRef?.removeEventListener('mouseup', onMouseUp);\n };\n }, [ContainerRef, onClick, onMouseDown, onMouseUp]);\n}\n\nfunction emojiFromEvent(event: MouseEvent): [DataEmoji, string] | [] {\n const target = event?.target as HTMLElement;\n if (!isEmojiElement(target)) {\n return [];\n }\n\n return emojiFromElement(target);\n}\n\nfunction emojiClickOutput(\n emoji: DataEmoji,\n activeSkinTone: SkinTones,\n activeEmojiStyle: EmojiStyle,\n getEmojiUrl: GetEmojiUrl\n): EmojiClickData {\n const names = emojiNames(emoji);\n\n if (isCustomEmoji(emoji)) {\n const unified = emojiUnified(emoji);\n return {\n activeSkinTone,\n emoji: unified,\n getImageUrl() {\n return emoji.imgUrl;\n },\n imageUrl: emoji.imgUrl,\n isCustom: true,\n names,\n unified,\n unifiedWithoutSkinTone: unified\n };\n }\n const unified = emojiUnified(emoji, activeSkinTone);\n\n return {\n activeSkinTone,\n emoji: parseNativeEmoji(unified),\n getImageUrl(emojiStyle: EmojiStyle = activeEmojiStyle ?? EmojiStyle.APPLE) {\n return getEmojiUrl(unified, emojiStyle);\n },\n imageUrl: getEmojiUrl(unified, activeEmojiStyle ?? EmojiStyle.APPLE),\n isCustom: false,\n names,\n unified,\n unifiedWithoutSkinTone: emojiUnified(emoji)\n };\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\n\ninterface Props\n extends React.DetailedHTMLProps<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n > {\n className?: string;\n}\n\nexport function Button(props: Props) {\n return (\n <button\n type=\"button\"\n {...props}\n className={cx(styles.button, props.className)}\n >\n {props.children}\n </button>\n );\n}\n\nconst styles = stylesheet.create({\n button: {\n '.': 'epr-btn',\n cursor: 'pointer',\n border: '0',\n background: 'none',\n outline: 'none'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport {\n commonInteractionStyles,\n commonStyles,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport { Button } from '../atoms/Button';\n\ntype ClickableEmojiButtonProps = Readonly<{\n hidden?: boolean;\n showVariations?: boolean;\n hiddenOnSearch?: boolean;\n emojiNames: string[];\n children: React.ReactNode;\n hasVariations: boolean;\n unified?: string;\n noBackground?: boolean;\n className?: string;\n}>;\n\nexport function ClickableEmojiButton({\n emojiNames,\n unified,\n hidden,\n hiddenOnSearch,\n showVariations = true,\n hasVariations,\n children,\n className,\n noBackground = false\n}: ClickableEmojiButtonProps) {\n return (\n <Button\n className={cx(\n styles.emoji,\n hidden && commonStyles.hidden,\n hiddenOnSearch && commonInteractionStyles.hiddenOnSearch,\n {\n [ClassNames.visible]: !hidden && !hiddenOnSearch\n },\n !!(hasVariations && showVariations) && styles.hasVariations,\n noBackground && styles.noBackground,\n className\n )}\n data-unified={unified}\n aria-label={getAriaLabel(emojiNames)}\n data-full-name={emojiNames}\n >\n {children}\n </Button>\n );\n}\n\nfunction getAriaLabel(emojiNames: string[]) {\n return emojiNames[0].match('flag-')\n ? emojiNames[1] ?? emojiNames[0]\n : emojiNames[0];\n}\n\nconst styles = stylesheet.create({\n emoji: {\n '.': ClassNames.emoji,\n position: 'relative',\n width: 'var(--epr-emoji-fullsize)',\n height: 'var(--epr-emoji-fullsize)',\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n maxWidth: 'var(--epr-emoji-fullsize)',\n maxHeight: 'var(--epr-emoji-fullsize)',\n borderRadius: '8px',\n overflow: 'hidden',\n transition: 'background-color 0.2s',\n ':hover': {\n backgroundColor: 'var(--epr-emoji-hover-color)'\n },\n ':focus': {\n backgroundColor: 'var(--epr-focus-bg-color)'\n }\n },\n noBackground: {\n background: 'none',\n ':hover': {\n backgroundColor: 'transparent',\n background: 'none'\n },\n ':focus': {\n backgroundColor: 'transparent',\n background: 'none'\n }\n },\n hasVariations: {\n '.': ClassNames.emojiHasVariations,\n ':after': {\n content: '',\n display: 'block',\n width: '0',\n height: '0',\n right: '0px',\n bottom: '1px',\n position: 'absolute',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n transform: 'rotate(135deg)',\n borderBottom: '4px solid var(--epr-emoji-variation-indicator-color)',\n zIndex: 'var(--epr-emoji-variations-indictator-z-index)'\n },\n ':hover:after': {\n borderBottom: '4px solid var(--epr-emoji-variation-indicator-color-hover)'\n }\n }\n});\n","import { ClassNames } from '../../DomUtils/classNames';\nimport { stylesheet } from '../../Stylesheet/stylesheet';\n\nexport const emojiStyles = stylesheet.create({\n external: {\n '.': ClassNames.external,\n fontSize: '0'\n },\n common: {\n alignSelf: 'center',\n justifySelf: 'center',\n display: 'block'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport { EmojiStyle } from '../../types/exposedTypes';\n\nimport { emojiStyles } from './emojiStyles';\n\nexport function EmojiImg({\n emojiName,\n style,\n lazyLoad = false,\n imgUrl,\n onError,\n className\n}: {\n emojiName: string;\n emojiStyle: EmojiStyle;\n style: React.CSSProperties;\n lazyLoad?: boolean;\n imgUrl: string;\n onError: () => void;\n className?: string;\n}) {\n return (\n <img\n src={imgUrl}\n alt={emojiName}\n className={cx(styles.emojiImag, emojiStyles.external, emojiStyles.common, className)}\n loading={lazyLoad ? 'lazy' : 'eager'}\n onError={onError}\n style={style}\n />\n );\n}\n\nconst styles = stylesheet.create({\n emojiImag: {\n '.': 'epr-emoji-img',\n maxWidth: 'var(--epr-emoji-fullsize)',\n maxHeight: 'var(--epr-emoji-fullsize)',\n minWidth: 'var(--epr-emoji-fullsize)',\n minHeight: 'var(--epr-emoji-fullsize)',\n padding: 'var(--epr-emoji-padding)'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport { parseNativeEmoji } from '../../dataUtils/parseNativeEmoji';\n\nimport { emojiStyles } from './emojiStyles';\n\nexport function NativeEmoji({\n unified,\n style,\n className\n}: {\n unified: string;\n style: React.CSSProperties;\n className?: string;\n}) {\n return (\n <span\n className={cx(\n styles.nativeEmoji,\n emojiStyles.common,\n emojiStyles.external,\n className\n )}\n data-unified={unified}\n style={style}\n >\n {parseNativeEmoji(unified)}\n </span>\n );\n}\n\nconst styles = stylesheet.create({\n nativeEmoji: {\n '.': 'epr-emoji-native',\n fontFamily:\n '\"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Segoe UI\", \"Apple Color Emoji\", \"Twemoji Mozilla\", \"Noto Color Emoji\", \"EmojiOne Color\", \"Android Emoji\"!important',\n position: 'relative',\n lineHeight: '100%',\n fontSize: 'var(--epr-emoji-size)',\n textAlign: 'center',\n alignSelf: 'center',\n justifySelf: 'center',\n letterSpacing: '0',\n padding: 'var(--epr-emoji-padding)'\n }\n});\n","import * as React from 'react';\n\nimport {\n emojiByUnified,\n emojiName,\n emojiUrlByUnified\n} from '../../dataUtils/emojiSelectors';\nimport { isCustomEmoji } from '../../typeRefinements/typeRefinements';\nimport { EmojiStyle } from '../../types/exposedTypes';\nimport { useEmojisThatFailedToLoadState } from '../context/PickerContext';\n\nimport { BaseEmojiProps } from './BaseEmojiProps';\nimport { EmojiImg } from './EmojiImg';\nimport { NativeEmoji } from './NativeEmoji';\n\nexport function ViewOnlyEmoji({\n emoji,\n unified,\n emojiStyle,\n size,\n lazyLoad,\n getEmojiUrl = emojiUrlByUnified,\n className\n}: BaseEmojiProps) {\n const [, setEmojisThatFailedToLoad] = useEmojisThatFailedToLoadState();\n\n const style = {} as React.CSSProperties;\n if (size) {\n style.width = style.height = style.fontSize = `${size}px`;\n }\n\n const emojiToRender = emoji ? emoji : emojiByUnified(unified);\n\n if (!emojiToRender) {\n return null;\n }\n\n if (isCustomEmoji(emojiToRender)) {\n return (\n <EmojiImg\n style={style}\n emojiName={unified}\n emojiStyle={EmojiStyle.NATIVE}\n lazyLoad={lazyLoad}\n imgUrl={emojiToRender.imgUrl}\n onError={onError}\n className={className}\n />\n );\n }\n\n return (\n <>\n {emojiStyle === EmojiStyle.NATIVE ? (\n <NativeEmoji unified={unified} style={style} className={className} />\n ) : (\n <EmojiImg\n style={style}\n emojiName={emojiName(emojiToRender)}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoad}\n imgUrl={getEmojiUrl(unified, emojiStyle)}\n onError={onError}\n className={className}\n />\n )}\n </>\n );\n\n function onError() {\n setEmojisThatFailedToLoad(prev => new Set(prev).add(unified));\n }\n}\n","import * as React from 'react';\n\nimport { DataEmoji } from '../../dataUtils/DataTypes';\nimport { emojiHasVariations, emojiNames } from '../../dataUtils/emojiSelectors';\n\nimport { BaseEmojiProps } from './BaseEmojiProps';\nimport { ClickableEmojiButton } from './ClickableEmojiButton';\nimport { ViewOnlyEmoji } from './ViewOnlyEmoji';\n\ntype ClickableEmojiProps = Readonly<\n BaseEmojiProps & {\n hidden?: boolean;\n showVariations?: boolean;\n hiddenOnSearch?: boolean;\n emoji: DataEmoji;\n className?: string;\n noBackground?: boolean;\n }\n>;\n\nexport function ClickableEmoji({\n emoji,\n unified,\n hidden,\n hiddenOnSearch,\n emojiStyle,\n showVariations = true,\n size,\n lazyLoad,\n getEmojiUrl,\n className,\n noBackground = false\n}: ClickableEmojiProps) {\n const hasVariations = emojiHasVariations(emoji);\n\n return (\n <ClickableEmojiButton\n hasVariations={hasVariations}\n showVariations={showVariations}\n hidden={hidden}\n hiddenOnSearch={hiddenOnSearch}\n emojiNames={emojiNames(emoji)}\n unified={unified}\n noBackground={noBackground}\n >\n <ViewOnlyEmoji\n unified={unified}\n emoji={emoji}\n size={size}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoad}\n getEmojiUrl={getEmojiUrl}\n className={className}\n />\n </ClickableEmojiButton>\n );\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { darkMode, stylesheet } from '../../Stylesheet/stylesheet';\nimport { Button } from '../atoms/Button';\nimport { useReactionsModeState } from '../context/PickerContext';\n\nimport Plus from './svg/plus.svg';\n\nexport function BtnPlus() {\n const [, setReactionsMode] = useReactionsModeState();\n return (\n <Button\n aria-label=\"Show all Emojis\"\n title=\"Show all Emojis\"\n tabIndex={0}\n className={cx(styles.plusSign)}\n onClick={() => setReactionsMode(false)}\n />\n );\n}\n\nconst styles = stylesheet.create({\n plusSign: {\n fontSize: '20px',\n padding: '17px',\n color: 'var(--epr-text-color)',\n borderRadius: '50%',\n textAlign: 'center',\n lineHeight: '100%',\n width: '20px',\n height: '20px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n transition: 'background-color 0.2s ease-in-out',\n ':after': {\n content: '',\n minWidth: '20px',\n minHeight: '20px',\n backgroundImage: `url(${Plus})`,\n backgroundColor: 'transparent',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '20px',\n backgroundPositionY: '0'\n },\n ':hover': {\n color: 'var(--epr-highlight-color)',\n backgroundColor: 'var(--epr-hover-bg-color-reduced-opacity)',\n ':after': {\n backgroundPositionY: '-20px'\n }\n },\n ':focus': {\n color: 'var(--epr-highlight-color)',\n backgroundColor: 'var(--epr-hover-bg-color-reduced-opacity)',\n ':after': {\n backgroundPositionY: '-40px'\n }\n }\n },\n ...darkMode('plusSign', {\n ':after': { backgroundPositionY: '-40px' },\n ':hover:after': { backgroundPositionY: '-60px' }\n })\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { commonStyles, stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n MOUSE_EVENT_SOURCE,\n useEmojiStyleConfig,\n useReactionsConfig,\n useAllowExpandReactions\n} from '../../config/useConfig';\nimport { DataEmoji } from '../../dataUtils/DataTypes';\nimport { emojiByUnified } from '../../dataUtils/emojiSelectors';\nimport { useMouseDownHandlers } from '../../hooks/useMouseDownHandlers';\nimport { useReactionsRef } from '../context/ElementRefContext';\nimport { useReactionsModeState } from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nimport { BtnPlus } from './BtnPlus';\n\nexport function Reactions() {\n const [reactionsOpen] = useReactionsModeState();\n const ReactionsRef = useReactionsRef();\n const reactions = useReactionsConfig();\n useMouseDownHandlers(ReactionsRef, MOUSE_EVENT_SOURCE.REACTIONS);\n const emojiStyle = useEmojiStyleConfig();\n const allowExpandReactions = useAllowExpandReactions();\n\n if (!reactionsOpen) {\n return null;\n }\n\n return (\n <ul\n className={cx(styles.list, !reactionsOpen && commonStyles.hidden)}\n ref={ReactionsRef}\n >\n {reactions.map(reaction => (\n <li key={reaction}>\n <ClickableEmoji\n emoji={emojiByUnified(reaction) as DataEmoji}\n emojiStyle={emojiStyle}\n unified={reaction}\n showVariations={false}\n className={cx(styles.emojiButton)}\n noBackground\n />\n </li>\n ))}\n {allowExpandReactions ? (\n <li>\n <BtnPlus />\n </li>\n ) : null}\n </ul>\n );\n}\n\nconst styles = stylesheet.create({\n list: {\n listStyle: 'none',\n margin: '0',\n padding: '0 5px',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '100%'\n },\n emojiButton: {\n ':hover': {\n transform: 'scale(1.2)'\n },\n ':focus': {\n transform: 'scale(1.2)'\n },\n ':active': {\n transform: 'scale(1.1)'\n },\n transition: 'transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.5)'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport {\n commonInteractionStyles,\n commonStyles,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport {\n CategoryConfig,\n categoryFromCategoryConfig,\n categoryNameFromCategoryConfig\n} from '../../config/categoryConfig';\n\ntype Props = Readonly<{\n categoryConfig: CategoryConfig;\n children?: React.ReactNode;\n hidden?: boolean;\n hiddenOnSearch?: boolean;\n}>;\n\nexport function EmojiCategory({\n categoryConfig,\n children,\n hidden,\n hiddenOnSearch\n}: Props) {\n const category = categoryFromCategoryConfig(categoryConfig);\n const categoryName = categoryNameFromCategoryConfig(categoryConfig);\n\n return (\n <li\n className={cx(\n styles.category,\n hidden && commonStyles.hidden,\n hiddenOnSearch && commonInteractionStyles.hiddenOnSearch\n )}\n data-name={category}\n aria-label={categoryName}\n >\n <h2 className={cx(styles.label)}>{categoryName}</h2>\n <div className={cx(styles.categoryContent)}>{children}</div>\n </li>\n );\n}\n\nconst styles = stylesheet.create({\n category: {\n '.': ClassNames.category,\n ':not(:has(.epr-visible))': {\n display: 'none'\n }\n },\n categoryContent: {\n '.': ClassNames.categoryContent,\n display: 'grid',\n gridGap: '0',\n gridTemplateColumns: 'repeat(auto-fill, var(--epr-emoji-fullsize))',\n justifyContent: 'space-between',\n margin: 'var(--epr-category-padding)',\n position: 'relative'\n },\n label: {\n '.': ClassNames.label,\n alignItems: 'center',\n // @ts-ignore - backdropFilter is not recognized.\n backdropFilter: 'blur(3px)',\n backgroundColor: 'var(--epr-category-label-bg-color)',\n color: 'var(--epr-category-label-text-color)',\n display: 'flex',\n fontSize: '16px',\n fontWeight: 'bold',\n height: 'var(--epr-category-label-height)',\n margin: '0',\n padding: 'var(--epr-category-label-padding)',\n position: 'sticky',\n textTransform: 'capitalize',\n top: '0',\n width: '100%',\n zIndex: 'var(--epr-category-label-z-index)'\n }\n});\n","import * as React from 'react';\n\nlet isEverMounted = false;\n\nexport function useIsEverMounted() {\n const [isMounted, setIsMounted] = React.useState(isEverMounted);\n\n React.useEffect(() => {\n setIsMounted(true);\n isEverMounted = true;\n }, []);\n\n return isMounted || isEverMounted;\n}\n","import * as React from 'react';\n\nimport { CategoryConfig } from '../../config/categoryConfig';\nimport {\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useSuggestedEmojisModeConfig\n} from '../../config/useConfig';\nimport { emojiByUnified } from '../../dataUtils/emojiSelectors';\nimport { getSuggested } from '../../dataUtils/suggested';\nimport { useIsEverMounted } from '../../hooks/useIsEverMounted';\nimport { useUpdateSuggested } from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nimport { EmojiCategory } from './EmojiCategory';\n\ntype Props = Readonly<{\n categoryConfig: CategoryConfig;\n}>;\n\nexport function Suggested({ categoryConfig }: Props) {\n const [suggestedUpdated] = useUpdateSuggested();\n const isMounted = useIsEverMounted();\n const suggestedEmojisModeConfig = useSuggestedEmojisModeConfig();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const suggested = React.useMemo(\n () => getSuggested(suggestedEmojisModeConfig) ?? [],\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [suggestedUpdated, suggestedEmojisModeConfig]\n );\n const emojiStyle = useEmojiStyleConfig();\n\n if (!isMounted) {\n return null;\n }\n\n return (\n <EmojiCategory\n categoryConfig={categoryConfig}\n hiddenOnSearch\n hidden={suggested.length === 0}\n >\n {suggested.map(suggestedItem => {\n const emoji = emojiByUnified(suggestedItem.original);\n\n if (!emoji) {\n return null;\n }\n\n return (\n <ClickableEmoji\n showVariations={false}\n unified={suggestedItem.unified}\n emojiStyle={emojiStyle}\n emoji={emoji}\n key={suggestedItem.unified}\n getEmojiUrl={getEmojiUrl}\n />\n );\n })}\n </EmojiCategory>\n );\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n Categories,\n CategoryConfig,\n categoryFromCategoryConfig\n} from '../../config/categoryConfig';\nimport {\n useCategoriesConfig,\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useLazyLoadEmojisConfig,\n useSkinTonesDisabledConfig\n} from '../../config/useConfig';\nimport { emojisByCategory, emojiUnified } from '../../dataUtils/emojiSelectors';\nimport { useIsEmojiDisallowed } from '../../hooks/useDisallowedEmojis';\nimport { useIsEmojiHidden } from '../../hooks/useIsEmojiHidden';\nimport {\n useActiveSkinToneState,\n useIsPastInitialLoad\n} from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nimport { EmojiCategory } from './EmojiCategory';\nimport { Suggested } from './Suggested';\n\nexport function EmojiList() {\n const categories = useCategoriesConfig();\n const renderdCategoriesCountRef = React.useRef(0);\n\n return (\n <ul className={cx(styles.emojiList)}>\n {categories.map(categoryConfig => {\n const category = categoryFromCategoryConfig(categoryConfig);\n\n if (category === Categories.SUGGESTED) {\n return <Suggested key={category} categoryConfig={categoryConfig} />;\n }\n\n return (\n <RenderCategory\n key={category}\n category={category}\n categoryConfig={categoryConfig}\n renderdCategoriesCountRef={renderdCategoriesCountRef}\n />\n );\n })}\n </ul>\n );\n}\n\nfunction RenderCategory({\n category,\n categoryConfig,\n renderdCategoriesCountRef\n}: {\n category: Categories;\n categoryConfig: CategoryConfig;\n renderdCategoriesCountRef: React.MutableRefObject<number>;\n}) {\n const isEmojiHidden = useIsEmojiHidden();\n const lazyLoadEmojis = useLazyLoadEmojisConfig();\n const emojiStyle = useEmojiStyleConfig();\n const isPastInitialLoad = useIsPastInitialLoad();\n const [activeSkinTone] = useActiveSkinToneState();\n const isEmojiDisallowed = useIsEmojiDisallowed();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const showVariations = !useSkinTonesDisabledConfig();\n\n // Small trick to defer the rendering of all emoji categories until the first category is visible\n // This way the user gets to actually see something and not wait for the whole picker to render.\n const emojisToPush =\n !isPastInitialLoad && renderdCategoriesCountRef.current > 0\n ? []\n : emojisByCategory(category);\n\n if (emojisToPush.length > 0) {\n renderdCategoriesCountRef.current++;\n }\n\n let hiddenCounter = 0;\n\n const emojis = emojisToPush.map(emoji => {\n const unified = emojiUnified(emoji, activeSkinTone);\n const { failedToLoad, filteredOut, hidden } = isEmojiHidden(emoji);\n\n const isDisallowed = isEmojiDisallowed(emoji);\n\n if (hidden || isDisallowed) {\n hiddenCounter++;\n }\n\n if (isDisallowed) {\n return null;\n }\n\n return (\n <ClickableEmoji\n showVariations={showVariations}\n key={unified}\n emoji={emoji}\n unified={unified}\n hidden={failedToLoad}\n hiddenOnSearch={filteredOut}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoadEmojis}\n getEmojiUrl={getEmojiUrl}\n />\n );\n });\n\n return (\n <EmojiCategory\n categoryConfig={categoryConfig}\n // Indicates that there are no visible emojis\n // Hence, the category should be hidden\n hidden={hiddenCounter === emojis.length}\n >\n {emojis}\n </EmojiCategory>\n );\n}\n\nconst styles = stylesheet.create({\n emojiList: {\n '.': ClassNames.emojiList,\n listStyle: 'none',\n margin: '0',\n padding: '0'\n }\n});\n","import { useUnicodeToHide } from \"../config/useConfig\";\n\nexport function useIsUnicodeHidden() {\n const unicodeToHide = useUnicodeToHide();\n return (emojiUnified: string) => unicodeToHide.has(emojiUnified);\n }\n","import { useEmojisThatFailedToLoadState } from '../components/context/PickerContext';\nimport { DataEmoji } from '../dataUtils/DataTypes';\nimport { emojiUnified } from '../dataUtils/emojiSelectors';\n\nimport { useIsEmojiFiltered } from './useFilter';\n\nexport function useIsEmojiHidden(): (emoji: DataEmoji) => IsHiddenReturn {\n const [emojisThatFailedToLoad] = useEmojisThatFailedToLoadState();\n const isEmojiFiltered = useIsEmojiFiltered();\n\n return (emoji: DataEmoji): IsHiddenReturn => {\n const unified = emojiUnified(emoji);\n\n const failedToLoad = emojisThatFailedToLoad.has(unified);\n const filteredOut = isEmojiFiltered(unified);\n\n return {\n failedToLoad,\n filteredOut,\n hidden: failedToLoad || filteredOut\n };\n };\n}\n\ntype IsHiddenReturn = {\n failedToLoad: boolean;\n filteredOut: boolean;\n hidden: boolean;\n};\n","import { cx } from 'flairup';\nimport * as React from 'react';\nimport { useEffect } from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport { focusFirstVisibleEmoji } from '../../DomUtils/keyboardNavigation';\nimport {\n buttonFromTarget,\n elementHeight,\n emojiTrueOffsetTop,\n emojiTruOffsetLeft\n} from '../../DomUtils/selectors';\nimport { darkMode, stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n useEmojiStyleConfig,\n useGetEmojiUrlConfig\n} from '../../config/useConfig';\nimport {\n emojiHasVariations,\n emojiUnified,\n emojiVariations\n} from '../../dataUtils/emojiSelectors';\nimport {\n useAnchoredEmojiRef,\n useBodyRef,\n useSetAnchoredEmojiRef,\n useVariationPickerRef\n} from '../context/ElementRefContext';\nimport { useEmojiVariationPickerState } from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nimport SVGTriangle from './svg/triangle.svg';\n\nenum Direction {\n Up,\n Down\n}\n\n// eslint-disable-next-line complexity\nexport function EmojiVariationPicker() {\n const AnchoredEmojiRef = useAnchoredEmojiRef();\n const VariationPickerRef = useVariationPickerRef();\n const [emoji] = useEmojiVariationPickerState();\n const emojiStyle = useEmojiStyleConfig();\n\n const { getTop, getMenuDirection } = useVariationPickerTop(\n VariationPickerRef\n );\n const setAnchoredEmojiRef = useSetAnchoredEmojiRef();\n const getPointerStyle = usePointerStyle(VariationPickerRef);\n const getEmojiUrl = useGetEmojiUrlConfig();\n\n const button = buttonFromTarget(AnchoredEmojiRef.current);\n\n const visible = Boolean(\n emoji &&\n button &&\n emojiHasVariations(emoji) &&\n button.classList.contains(ClassNames.emojiHasVariations)\n );\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n\n focusFirstVisibleEmoji(VariationPickerRef.current);\n }, [VariationPickerRef, visible, AnchoredEmojiRef]);\n\n let top, pointerStyle;\n\n if (!visible && AnchoredEmojiRef.current) {\n setAnchoredEmojiRef(null);\n } else {\n top = getTop();\n pointerStyle = getPointerStyle();\n }\n\n return (\n <div\n ref={VariationPickerRef}\n className={cx(\n styles.variationPicker,\n getMenuDirection() === Direction.Down && styles.pointingUp,\n visible && styles.visible\n )}\n style={{ top }}\n >\n {visible && emoji\n ? [emojiUnified(emoji)]\n .concat(emojiVariations(emoji))\n .slice(0, 6)\n .map(unified => (\n <ClickableEmoji\n key={unified}\n emoji={emoji}\n unified={unified}\n emojiStyle={emojiStyle}\n showVariations={false}\n getEmojiUrl={getEmojiUrl}\n />\n ))\n : null}\n <div className={cx(styles.pointer)} style={pointerStyle} />\n </div>\n );\n}\n\nfunction usePointerStyle(VariationPickerRef: React.RefObject<HTMLElement>) {\n const AnchoredEmojiRef = useAnchoredEmojiRef();\n return function getPointerStyle() {\n const style: React.CSSProperties = {};\n if (!VariationPickerRef.current) {\n return style;\n }\n\n if (AnchoredEmojiRef.current) {\n const button = buttonFromTarget(AnchoredEmojiRef.current);\n\n const offsetLeft = emojiTruOffsetLeft(button);\n\n if (!button) {\n return style;\n }\n\n // half of the button\n style.left = offsetLeft + button?.clientWidth / 2;\n }\n\n return style;\n };\n}\n\nfunction useVariationPickerTop(\n VariationPickerRef: React.RefObject<HTMLElement>\n) {\n const AnchoredEmojiRef = useAnchoredEmojiRef();\n const BodyRef = useBodyRef();\n let direction = Direction.Up;\n\n return {\n getMenuDirection,\n getTop\n };\n\n function getMenuDirection() {\n return direction;\n }\n\n function getTop() {\n direction = Direction.Up;\n let emojiOffsetTop = 0;\n\n if (!VariationPickerRef.current) {\n return 0;\n }\n\n const height = elementHeight(VariationPickerRef.current);\n\n if (AnchoredEmojiRef.current) {\n const bodyRef = BodyRef.current;\n const button = buttonFromTarget(AnchoredEmojiRef.current);\n\n const buttonHeight = elementHeight(button);\n\n emojiOffsetTop = emojiTrueOffsetTop(button);\n\n const scrollTop = bodyRef?.scrollTop ?? 0;\n\n if (scrollTop > emojiOffsetTop - height) {\n direction = Direction.Down;\n emojiOffsetTop += buttonHeight + height;\n }\n }\n\n return emojiOffsetTop - height;\n }\n}\n\nconst styles = stylesheet.create({\n variationPicker: {\n '.': ClassNames.variationPicker,\n position: 'absolute',\n right: '15px',\n left: '15px',\n padding: '5px',\n boxShadow: '0px 2px 5px rgba(0, 0, 0, 0.2)',\n borderRadius: '3px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-around',\n opacity: '0',\n visibility: 'hidden',\n pointerEvents: 'none',\n top: '-100%',\n border: '1px solid var(--epr-picker-border-color)',\n height: 'var(--epr-emoji-variation-picker-height)',\n zIndex: 'var(--epr-skin-variation-picker-z-index)',\n background: 'var(--epr-emoji-variation-picker-bg-color)',\n transform: 'scale(0.9)',\n transition: 'transform 0.1s ease-out, opacity 0.2s ease-out'\n },\n visible: {\n opacity: '1',\n visibility: 'visible',\n pointerEvents: 'all',\n transform: 'scale(1)'\n },\n pointingUp: {\n '.': 'pointing-up',\n transformOrigin: 'center 0%',\n transform: 'scale(0.9)'\n },\n '.pointing-up': {\n pointer: {\n top: '0',\n transform: 'rotate(180deg) translateY(100%) translateX(18px)'\n }\n },\n pointer: {\n '.': 'epr-emoji-pointer',\n content: '',\n position: 'absolute',\n width: '25px',\n height: '15px',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: '0 0',\n backgroundSize: '50px 15px',\n top: '100%',\n transform: 'translateX(-18px)',\n backgroundImage: `url(${SVGTriangle})`\n },\n ...darkMode('pointer', {\n backgroundPosition: '-25px 0'\n })\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport {\n commonInteractionStyles,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport { MOUSE_EVENT_SOURCE } from '../../config/useConfig';\nimport { useOnMouseMove } from '../../hooks/useDisallowMouseMove';\nimport { useMouseDownHandlers } from '../../hooks/useMouseDownHandlers';\nimport { useOnScroll } from '../../hooks/useOnScroll';\nimport { useBodyRef } from '../context/ElementRefContext';\n\nimport { EmojiList } from './EmojiList';\nimport { EmojiVariationPicker } from './EmojiVariationPicker';\n\nexport function Body() {\n const BodyRef = useBodyRef();\n useOnScroll(BodyRef);\n useMouseDownHandlers(BodyRef, MOUSE_EVENT_SOURCE.PICKER);\n useOnMouseMove();\n\n return (\n <div\n className={cx(styles.body, commonInteractionStyles.hiddenOnReactions)}\n ref={BodyRef}\n >\n <EmojiVariationPicker />\n <EmojiList />\n </div>\n );\n}\n\nconst styles = stylesheet.create({\n body: {\n '.': ClassNames.scrollBody,\n flex: '1',\n overflowY: 'scroll',\n overflowX: 'hidden',\n position: 'relative'\n }\n});\n","import { useEffect } from 'react';\n\nimport { ElementRef } from '../components/context/ElementRefContext';\n\nimport { useCloseAllOpenToggles } from './useCloseAllOpenToggles';\n\nexport function useOnScroll(BodyRef: ElementRef) {\n const closeAllOpenToggles = useCloseAllOpenToggles();\n\n useEffect(() => {\n const bodyRef = BodyRef.current;\n if (!bodyRef) {\n return;\n }\n\n bodyRef.addEventListener('scroll', onScroll, {\n passive: true\n });\n\n function onScroll() {\n closeAllOpenToggles();\n }\n\n return () => {\n bodyRef?.removeEventListener('scroll', onScroll);\n };\n }, [BodyRef, closeAllOpenToggles]);\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\n\nexport enum FlexDirection {\n ROW = 'FlexRow',\n COLUMN = 'FlexColumn'\n}\n\ntype Props = Readonly<{\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n direction?: FlexDirection;\n}>;\n\nexport default function Flex({\n children,\n className,\n style = {},\n direction = FlexDirection.ROW\n}: Props) {\n return (\n <div\n style={{ ...style }}\n className={cx(styles.flex, className, styles[direction])}\n >\n {children}\n </div>\n );\n}\n\nconst styles = stylesheet.create({\n flex: {\n display: 'flex'\n },\n [FlexDirection.ROW]: {\n flexDirection: 'row'\n },\n [FlexDirection.COLUMN]: {\n flexDirection: 'column'\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\n\ntype Props = Readonly<{\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport default function Space({ className, style = {} }: Props) {\n return <div style={{ flex: 1, ...style }} className={cx(className)} />;\n}\n","import * as React from 'react';\n\ntype Props = Readonly<{\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport default function Absolute({ children, className, style }: Props) {\n return (\n <div style={{ ...style, position: 'absolute' }} className={className}>\n {children}\n </div>\n );\n}\n","import * as React from 'react';\n\ntype Props = Readonly<{\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport default function Relative({ children, className, style }: Props) {\n return (\n <div style={{ ...style, position: 'relative' }} className={className}>\n {children}\n </div>\n );\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { stylesheet } from '../../../Stylesheet/stylesheet';\nimport { skinTonesNamed } from '../../../data/skinToneVariations';\nimport { SkinTones } from '../../../types/exposedTypes';\nimport { Button } from '../../atoms/Button';\n\ntype Props = {\n isOpen: boolean;\n onClick: () => void;\n isActive: boolean;\n skinToneVariation: SkinTones;\n style?: React.CSSProperties;\n};\n\n// eslint-disable-next-line complexity\nexport function BtnSkinToneVariation({\n isOpen,\n onClick,\n isActive,\n skinToneVariation,\n style\n}: Props) {\n return (\n <Button\n style={style}\n onClick={onClick}\n className={cx(\n `epr-tone-${skinToneVariation}`,\n styles.tone,\n !isOpen && styles.closedTone,\n isActive && styles.active\n )}\n tabIndex={isOpen ? 0 : -1}\n aria-pressed={isActive}\n aria-label={`Skin tone ${skinTonesNamed[skinToneVariation as SkinTones]}`}\n ></Button>\n );\n}\n\nconst styles = stylesheet.create({\n closedTone: {\n opacity: '0',\n zIndex: '0'\n },\n active: {\n '.': 'epr-active',\n zIndex: '1',\n opacity: '1'\n },\n tone: {\n '.': 'epr-tone',\n ':hover': {\n boxShadow: '0 0 0 3px var(--epr-active-skin-hover-color)'\n },\n ':focus': {\n boxShadow: '0 0 0 3px var(--epr-focus-bg-color)'\n },\n '&.epr-tone-neutral': {\n backgroundColor: '#ffd225'\n },\n '&.epr-tone-1f3fb': {\n backgroundColor: '#ffdfbd'\n },\n '&.epr-tone-1f3fc': {\n backgroundColor: '#e9c197'\n },\n '&.epr-tone-1f3fd': {\n backgroundColor: '#c88e62'\n },\n '&.epr-tone-1f3fe': {\n backgroundColor: '#a86637'\n },\n '&.epr-tone-1f3ff': {\n backgroundColor: '#60463a'\n }\n }\n});\n","/* eslint-disable complexity */\nimport { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../../DomUtils/classNames';\nimport { stylesheet } from '../../../Stylesheet/stylesheet';\nimport {\n useOnSkinToneChangeConfig,\n useSkinTonesDisabledConfig\n} from '../../../config/useConfig';\nimport skinToneVariations from '../../../data/skinToneVariations';\nimport { useCloseAllOpenToggles } from '../../../hooks/useCloseAllOpenToggles';\nimport { useFocusSearchInput } from '../../../hooks/useFocus';\nimport Absolute from '../../Layout/Absolute';\nimport Relative from '../../Layout/Relative';\nimport { useSkinTonePickerRef } from '../../context/ElementRefContext';\nimport {\n useActiveSkinToneState,\n useSkinToneFanOpenState\n} from '../../context/PickerContext';\n\nimport { BtnSkinToneVariation } from './BtnSkinToneVariation';\n\nconst ITEM_SIZE = 28;\n\ntype Props = {\n direction?: SkinTonePickerDirection;\n};\n\nexport function SkinTonePickerMenu() {\n return (\n <Relative style={{ height: ITEM_SIZE }}>\n <Absolute style={{ bottom: 0, right: 0 }}>\n <SkinTonePicker direction={SkinTonePickerDirection.VERTICAL} />\n </Absolute>\n </Relative>\n );\n}\n\nexport function SkinTonePicker({\n direction = SkinTonePickerDirection.HORIZONTAL\n}: Props) {\n const SkinTonePickerRef = useSkinTonePickerRef();\n const isDisabled = useSkinTonesDisabledConfig();\n const [isOpen, setIsOpen] = useSkinToneFanOpenState();\n const [activeSkinTone, setActiveSkinTone] = useActiveSkinToneState();\n const onSkinToneChange = useOnSkinToneChangeConfig();\n const closeAllOpenToggles = useCloseAllOpenToggles();\n const focusSearchInput = useFocusSearchInput();\n\n if (isDisabled) {\n return null;\n }\n\n const fullWidth = `${ITEM_SIZE * skinToneVariations.length}px`;\n\n const expandedSize = isOpen ? fullWidth : ITEM_SIZE + 'px';\n\n const vertical = direction === SkinTonePickerDirection.VERTICAL;\n\n return (\n <Relative\n className={cx(\n styles.skinTones,\n vertical && styles.vertical,\n isOpen && styles.open,\n vertical && isOpen && styles.verticalShadow\n )}\n style={\n vertical\n ? { flexBasis: expandedSize, height: expandedSize }\n : { flexBasis: expandedSize }\n }\n >\n <div className={cx(styles.select)} ref={SkinTonePickerRef}>\n {skinToneVariations.map((skinToneVariation, i) => {\n const active = skinToneVariation === activeSkinTone;\n\n return (\n <BtnSkinToneVariation\n key={skinToneVariation}\n skinToneVariation={skinToneVariation}\n isOpen={isOpen}\n style={{\n transform: cx(\n vertical\n ? `translateY(-${i * (isOpen ? ITEM_SIZE : 0)}px)`\n : `translateX(-${i * (isOpen ? ITEM_SIZE : 0)}px)`,\n isOpen && active && 'scale(1.3)'\n )\n }}\n isActive={active}\n onClick={() => {\n if (isOpen) {\n setActiveSkinTone(skinToneVariation);\n onSkinToneChange(skinToneVariation);\n focusSearchInput();\n } else {\n setIsOpen(true);\n }\n closeAllOpenToggles();\n }}\n />\n );\n })}\n </div>\n </Relative>\n );\n}\n\nexport enum SkinTonePickerDirection {\n VERTICAL = ClassNames.vertical,\n HORIZONTAL = ClassNames.horizontal\n}\n\nconst styles = stylesheet.create({\n skinTones: {\n '.': 'epr-skin-tones',\n '--': {\n '--epr-skin-tone-size': '15px'\n },\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n transition: 'all 0.3s ease-in-out',\n padding: '10px 0'\n },\n vertical: {\n padding: '9px',\n alignItems: 'flex-end',\n flexDirection: 'column',\n borderRadius: '6px',\n border: '1px solid var(--epr-bg-color)'\n },\n verticalShadow: {\n boxShadow: '0px 0 7px var(--epr-picker-border-color)'\n },\n open: {\n // @ts-ignore - backdropFilter is not recognized.\n backdropFilter: 'blur(5px)',\n background: 'var(--epr-skin-tone-picker-menu-color)',\n '.epr-active:after': {\n content: '',\n position: 'absolute',\n top: '-2px',\n left: '-2px',\n right: '-2px',\n bottom: '-2px',\n borderRadius: '5px',\n border: '1px solid var(--epr-active-skin-tone-indicator-border-color)'\n }\n },\n select: {\n '.': 'epr-skin-tone-select',\n position: 'relative',\n width: 'var(--epr-skin-tone-size)',\n height: 'var(--epr-skin-tone-size)',\n '> button': {\n width: 'var(--epr-skin-tone-size)',\n display: 'block',\n cursor: 'pointer',\n borderRadius: '4px',\n height: 'var(--epr-skin-tone-size)',\n position: 'absolute',\n right: '0',\n transition: 'transform 0.3s ease-in-out, opacity 0.35s ease-in-out',\n zIndex: '0',\n boxShadow: '0 0 0 0px var(--epr-active-skin-hover-color)'\n }\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\nimport { useState } from 'react';\n\nimport {\n commonInteractionStyles,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport {\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n usePreviewConfig\n} from '../../config/useConfig';\nimport {\n emojiByUnified,\n emojiName,\n emojiUnified\n} from '../../dataUtils/emojiSelectors';\nimport { useEmojiPreviewEvents } from '../../hooks/useEmojiPreviewEvents';\nimport { useIsSkinToneInPreview } from '../../hooks/useShouldShowSkinTonePicker';\nimport Flex from '../Layout/Flex';\nimport Space from '../Layout/Space';\nimport { useEmojiVariationPickerState } from '../context/PickerContext';\nimport { ViewOnlyEmoji } from '../emoji/ViewOnlyEmoji';\nimport { SkinTonePickerMenu } from '../header/SkinTonePicker/SkinTonePicker';\n\nexport function Preview() {\n const previewConfig = usePreviewConfig();\n const isSkinToneInPreview = useIsSkinToneInPreview();\n\n if (!previewConfig.showPreview) {\n return null;\n }\n\n return (\n <Flex\n className={cx(styles.preview, commonInteractionStyles.hiddenOnReactions)}\n >\n <PreviewBody />\n <Space />\n {isSkinToneInPreview ? <SkinTonePickerMenu /> : null}\n </Flex>\n );\n}\n\nexport function PreviewBody() {\n const previewConfig = usePreviewConfig();\n const [previewEmoji, setPreviewEmoji] = useState<PreviewEmoji>(null);\n const emojiStyle = useEmojiStyleConfig();\n const [variationPickerEmoji] = useEmojiVariationPickerState();\n const getEmojiUrl = useGetEmojiUrlConfig();\n\n useEmojiPreviewEvents(previewConfig.showPreview, setPreviewEmoji);\n\n const emoji = emojiByUnified(\n previewEmoji?.unified ?? previewEmoji?.originalUnified\n );\n\n const show = emoji != null && previewEmoji != null;\n\n return <PreviewContent />;\n\n function PreviewContent() {\n const defaultEmoji =\n variationPickerEmoji ?? emojiByUnified(previewConfig.defaultEmoji);\n if (!defaultEmoji) {\n return null;\n }\n const defaultText = variationPickerEmoji\n ? emojiName(variationPickerEmoji)\n : previewConfig.defaultCaption;\n\n return (\n <>\n <div>\n {show ? (\n <ViewOnlyEmoji\n unified={previewEmoji?.unified as string}\n emoji={emoji}\n emojiStyle={emojiStyle}\n size={45}\n getEmojiUrl={getEmojiUrl}\n className={cx(styles.emoji)}\n />\n ) : defaultEmoji ? (\n <ViewOnlyEmoji\n unified={emojiUnified(defaultEmoji)}\n emoji={defaultEmoji}\n emojiStyle={emojiStyle}\n size={45}\n getEmojiUrl={getEmojiUrl}\n className={cx(styles.emoji)}\n />\n ) : null}\n </div>\n <div className={cx(styles.label)}>\n {show ? emojiName(emoji) : defaultText}\n </div>\n </>\n );\n }\n}\n\nexport type PreviewEmoji = null | {\n unified: string;\n originalUnified: string;\n};\n\nconst styles = stylesheet.create({\n preview: {\n alignItems: 'center',\n borderTop: '1px solid var(--epr-preview-border-color)',\n height: 'var(--epr-preview-height)',\n padding: '0 var(--epr-horizontal-padding)',\n position: 'relative',\n zIndex: 'var(--epr-preview-z-index)'\n },\n label: {\n color: 'var(--epr-preview-text-color)',\n fontSize: 'var(--epr-preview-text-size)',\n padding: 'var(--epr-preview-text-padding)',\n textTransform: 'capitalize'\n },\n emoji: {\n padding: '0'\n }\n});\n","import * as React from 'react';\nimport { useEffect } from 'react';\n\nimport { detectEmojyPartiallyBelowFold } from '../DomUtils/detectEmojyPartiallyBelowFold';\nimport { focusElement } from '../DomUtils/focusElement';\nimport {\n allUnifiedFromEmojiElement,\n buttonFromTarget\n} from '../DomUtils/selectors';\nimport { useBodyRef } from '../components/context/ElementRefContext';\nimport { PreviewEmoji } from '../components/footer/Preview';\n\nimport {\n useAllowMouseMove,\n useIsMouseDisallowed\n} from './useDisallowMouseMove';\n\nexport function useEmojiPreviewEvents(\n allow: boolean,\n setPreviewEmoji: React.Dispatch<React.SetStateAction<PreviewEmoji>>\n) {\n const BodyRef = useBodyRef();\n const isMouseDisallowed = useIsMouseDisallowed();\n const allowMouseMove = useAllowMouseMove();\n\n useEffect(() => {\n if (!allow) {\n return;\n }\n const bodyRef = BodyRef.current;\n\n bodyRef?.addEventListener('keydown', onEscape, {\n passive: true\n });\n\n bodyRef?.addEventListener('mouseover', onMouseOver, true);\n\n bodyRef?.addEventListener('focus', onEnter, true);\n\n bodyRef?.addEventListener('mouseout', onLeave, {\n passive: true\n });\n bodyRef?.addEventListener('blur', onLeave, true);\n\n function onEnter(e: FocusEvent) {\n const button = buttonFromTarget(e.target as HTMLElement);\n\n if (!button) {\n return onLeave();\n }\n\n const { unified, originalUnified } = allUnifiedFromEmojiElement(button);\n\n if (!unified || !originalUnified) {\n return onLeave();\n }\n\n setPreviewEmoji({\n unified,\n originalUnified\n });\n }\n function onLeave(e?: FocusEvent | MouseEvent) {\n if (e) {\n const relatedTarget = e.relatedTarget as HTMLElement;\n\n if (!buttonFromTarget(relatedTarget)) {\n return setPreviewEmoji(null);\n }\n }\n\n setPreviewEmoji(null);\n }\n function onEscape(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n setPreviewEmoji(null);\n }\n }\n\n function onMouseOver(e: MouseEvent) {\n if (isMouseDisallowed()) {\n return;\n }\n\n const button = buttonFromTarget(e.target as HTMLElement);\n\n if (button) {\n const belowFoldByPx = detectEmojyPartiallyBelowFold(button, bodyRef);\n const buttonHeight = button.getBoundingClientRect().height;\n if (belowFoldByPx < buttonHeight) {\n return handlePartiallyVisibleElementFocus(button, setPreviewEmoji);\n }\n\n focusElement(button);\n }\n }\n\n return () => {\n bodyRef?.removeEventListener('mouseover', onMouseOver);\n bodyRef?.removeEventListener('mouseout', onLeave);\n bodyRef?.removeEventListener('focus', onEnter, true);\n bodyRef?.removeEventListener('blur', onLeave, true);\n bodyRef?.removeEventListener('keydown', onEscape);\n };\n }, [BodyRef, allow, setPreviewEmoji, isMouseDisallowed, allowMouseMove]);\n}\n\nfunction handlePartiallyVisibleElementFocus(\n button: HTMLElement,\n setPreviewEmoji: React.Dispatch<React.SetStateAction<PreviewEmoji>>\n) {\n const { unified, originalUnified } = allUnifiedFromEmojiElement(button);\n\n if (!unified || !originalUnified) {\n return;\n }\n\n (document.activeElement as HTMLElement)?.blur?.();\n\n setPreviewEmoji({\n unified,\n originalUnified\n });\n}\n","import { NullableElement } from './selectors';\n\nexport function detectEmojyPartiallyBelowFold(\n button: HTMLButtonElement,\n bodyRef: NullableElement\n): number {\n if (!button || !bodyRef) {\n return 0;\n }\n\n const buttonRect = button.getBoundingClientRect();\n const bodyRect = bodyRef.getBoundingClientRect();\n\n // If the element is obscured by at least half of its size\n return bodyRect.height - (buttonRect.y - bodyRect.y);\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport {\n commonInteractionStyles,\n darkMode,\n stylesheet\n} from '../../Stylesheet/stylesheet';\nimport {\n CategoryConfig,\n categoryNameFromCategoryConfig\n} from '../../config/categoryConfig';\nimport { Button } from '../atoms/Button';\n\nimport SVGNavigation from './svg/CategoryNav.svg';\n\ntype Props = {\n isActiveCategory: boolean;\n category: string;\n allowNavigation: boolean;\n onClick: () => void;\n categoryConfig: CategoryConfig;\n};\n\nexport function CategoryButton({\n isActiveCategory,\n category,\n allowNavigation,\n categoryConfig,\n onClick\n}: Props) {\n return (\n <Button\n tabIndex={allowNavigation ? 0 : -1}\n className={cx(\n styles.catBtn,\n commonInteractionStyles.categoryBtn,\n `epr-icn-${category}`,\n {\n [ClassNames.active]: isActiveCategory\n }\n )}\n onClick={onClick}\n aria-label={categoryNameFromCategoryConfig(categoryConfig)}\n aria-selected={isActiveCategory}\n role=\"tab\"\n aria-controls=\"epr-category-nav-id\"\n />\n );\n}\n\nconst DarkActivePositionY = {\n backgroundPositionY: 'calc(var(--epr-category-navigation-button-size) * 3)'\n};\nconst DarkPositionY = {\n backgroundPositionY: 'calc(var(--epr-category-navigation-button-size) * 2)'\n};\n\nconst DarkInactivePosition = {\n ':not(.epr-search-active)': {\n catBtn: {\n ':hover': DarkActivePositionY,\n '&.epr-active': DarkActivePositionY\n }\n }\n};\n\nconst styles = stylesheet.create({\n catBtn: {\n '.': 'epr-cat-btn',\n display: 'inline-block',\n transition: 'opacity 0.2s ease-in-out',\n position: 'relative',\n height: 'var(--epr-category-navigation-button-size)',\n width: 'var(--epr-category-navigation-button-size)',\n backgroundSize: 'calc(var(--epr-category-navigation-button-size) * 10)',\n outline: 'none',\n backgroundPosition: '0 0',\n backgroundImage: `url(${SVGNavigation})`,\n ':focus:before': {\n content: '',\n position: 'absolute',\n top: '-2px',\n left: '-2px',\n right: '-2px',\n bottom: '-2px',\n border: '2px solid var(--epr-category-icon-active-color)',\n borderRadius: '50%'\n },\n '&.epr-icn-suggested': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -8)'\n },\n '&.epr-icn-custom': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -9)'\n },\n '&.epr-icn-activities': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -4)'\n },\n '&.epr-icn-animals_nature': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -1)'\n },\n '&.epr-icn-flags': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -7)'\n },\n '&.epr-icn-food_drink': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -2)'\n },\n '&.epr-icn-objects': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -5)'\n },\n '&.epr-icn-smileys_people': {\n backgroundPositionX: '0px'\n },\n '&.epr-icn-symbols': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -6)'\n },\n '&.epr-icn-travel_places': {\n backgroundPositionX:\n 'calc(var(--epr-category-navigation-button-size) * -3)'\n }\n },\n ...darkMode('catBtn', DarkPositionY),\n '.epr-dark-theme': {\n ...DarkInactivePosition\n },\n '.epr-auto-theme': {\n ...DarkInactivePosition\n }\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\nimport { useState } from 'react';\n\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport { categoryFromCategoryConfig } from '../../config/categoryConfig';\nimport { useCategoriesConfig } from '../../config/useConfig';\nimport { useActiveCategoryScrollDetection } from '../../hooks/useActiveCategoryScrollDetection';\nimport useIsSearchMode from '../../hooks/useIsSearchMode';\nimport { useScrollCategoryIntoView } from '../../hooks/useScrollCategoryIntoView';\nimport { useShouldHideCustomEmojis } from '../../hooks/useShouldHideCustomEmojis';\nimport { isCustomCategory } from '../../typeRefinements/typeRefinements';\nimport { useCategoryNavigationRef } from '../context/ElementRefContext';\n\nimport { CategoryButton } from './CategoryButton';\n\nexport function CategoryNavigation() {\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const scrollCategoryIntoView = useScrollCategoryIntoView();\n useActiveCategoryScrollDetection(setActiveCategory);\n const isSearchMode = useIsSearchMode();\n\n const categoriesConfig = useCategoriesConfig();\n const CategoryNavigationRef = useCategoryNavigationRef();\n const hideCustomCategory = useShouldHideCustomEmojis();\n\n return (\n <div\n className={cx(styles.nav)}\n role=\"tablist\"\n aria-label=\"Category navigation\"\n id=\"epr-category-nav-id\"\n ref={CategoryNavigationRef}\n >\n {categoriesConfig.map(categoryConfig => {\n const category = categoryFromCategoryConfig(categoryConfig);\n const isActiveCategory = category === activeCategory;\n\n if (isCustomCategory(categoryConfig) && hideCustomCategory) {\n return null;\n }\n\n const allowNavigation = !isSearchMode && !isActiveCategory;\n\n return (\n <CategoryButton\n key={category}\n category={category}\n isActiveCategory={isActiveCategory}\n allowNavigation={allowNavigation}\n categoryConfig={categoryConfig}\n onClick={() => {\n setActiveCategory(category);\n scrollCategoryIntoView(category);\n }}\n />\n );\n })}\n </div>\n );\n}\n\nconst styles = stylesheet.create({\n nav: {\n '.': 'epr-category-nav',\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-around',\n padding: 'var(--epr-header-padding)'\n },\n '.epr-search-active': {\n nav: {\n opacity: '0.3',\n cursor: 'default',\n pointerEvents: 'none'\n }\n },\n '.epr-main:has(input:not(:placeholder-shown))': {\n nav: {\n opacity: '0.3',\n cursor: 'default',\n pointerEvents: 'none'\n }\n }\n});\n","import { scrollTo } from '../DomUtils/scrollTo';\nimport { NullableElement } from '../DomUtils/selectors';\nimport {\n useBodyRef,\n usePickerMainRef\n} from '../components/context/ElementRefContext';\n\nexport function useScrollCategoryIntoView() {\n const BodyRef = useBodyRef();\n const PickerMainRef = usePickerMainRef();\n\n return function scrollCategoryIntoView(category: string): void {\n if (!BodyRef.current) {\n return;\n }\n const $category = BodyRef.current?.querySelector(\n `[data-name=\"${category}\"]`\n ) as NullableElement;\n\n if (!$category) {\n return;\n }\n\n const offsetTop = $category.offsetTop || 0;\n\n scrollTo(PickerMainRef.current, offsetTop);\n };\n}\n","import { useEffect } from 'react';\n\nimport { categoryNameFromDom } from '../DomUtils/categoryNameFromDom';\nimport { asSelectors, ClassNames } from '../DomUtils/classNames';\nimport { useBodyRef } from '../components/context/ElementRefContext';\n\nexport function useActiveCategoryScrollDetection(\n setActiveCategory: (category: string) => void\n) {\n const BodyRef = useBodyRef();\n\n useEffect(() => {\n const visibleCategories = new Map();\n const bodyRef = BodyRef.current;\n const observer = new IntersectionObserver(\n entries => {\n if (!bodyRef) {\n return;\n }\n\n for (const entry of entries) {\n const id = categoryNameFromDom(entry.target);\n visibleCategories.set(id, entry.intersectionRatio);\n }\n\n const ratios = Array.from(visibleCategories);\n const lastCategory = ratios[ratios.length - 1];\n\n if (lastCategory[1] == 1) {\n return setActiveCategory(lastCategory[0]);\n }\n\n for (const [id, ratio] of ratios) {\n if (ratio) {\n setActiveCategory(id);\n break;\n }\n }\n },\n {\n threshold: [0, 1]\n }\n );\n bodyRef?.querySelectorAll(asSelectors(ClassNames.category)).forEach(el => {\n observer.observe(el);\n });\n }, [BodyRef, setActiveCategory]);\n}\n","export function categoryNameFromDom($category: Element | null): string | null {\n return $category?.getAttribute('data-name') ?? null;\n}\n","import { useCustomEmojisConfig } from '../config/useConfig';\n\nexport function useShouldHideCustomEmojis() {\n const customCategoryConfig = useCustomEmojisConfig();\n\n if (!customCategoryConfig) {\n return false;\n }\n\n return customCategoryConfig.length === 0;\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport {\n commonInteractionStyles,\n darkMode,\n stylesheet\n} from '../../../Stylesheet/stylesheet';\nimport { useClearSearch } from '../../../hooks/useFilter';\nimport { Button } from '../../atoms/Button';\n\nimport SVGTimes from './svg/times.svg';\n\nexport function BtnClearSearch() {\n const clearSearch = useClearSearch();\n\n return (\n <Button\n className={cx(\n styles.btnClearSearch,\n commonInteractionStyles.visibleOnSearchOnly\n )}\n onClick={clearSearch}\n aria-label=\"Clear\"\n title=\"Clear\"\n >\n <div className={cx(styles.icnClearnSearch)} />\n </Button>\n );\n}\n\nconst HoverDark = {\n ':hover': {\n '> .epr-icn-clear-search': {\n backgroundPositionY: '-60px'\n }\n }\n};\n\nconst styles = stylesheet.create({\n btnClearSearch: {\n '.': 'epr-btn-clear-search',\n position: 'absolute',\n right: 'var(--epr-search-bar-inner-padding)',\n height: '30px',\n width: '30px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n top: '50%',\n transform: 'translateY(-50%)',\n padding: '0',\n borderRadius: '50%',\n ':hover': {\n background: 'var(--epr-hover-bg-color)'\n },\n ':focus': {\n background: 'var(--epr-hover-bg-color)'\n }\n },\n icnClearnSearch: {\n '.': 'epr-icn-clear-search',\n backgroundColor: 'transparent',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '20px',\n height: '20px',\n width: '20px',\n backgroundImage: `url(${SVGTimes})`,\n ':hover': {\n backgroundPositionY: '-20px'\n },\n ':focus': {\n backgroundPositionY: '-20px'\n }\n },\n ...darkMode('icnClearnSearch', {\n backgroundPositionY: '-40px'\n }),\n ...darkMode('btnClearSearch', HoverDark)\n});\n","import * as React from 'react';\n\nimport { ClassNames, asSelectors } from '../../../DomUtils/classNames';\nimport { getNormalizedSearchTerm } from '../../../hooks/useFilter';\n\nconst SCOPE = `${asSelectors(ClassNames.emojiPicker)} ${asSelectors(\n ClassNames.emojiList\n)}`;\n\nconst EMOJI_BUTTON = ['button', asSelectors(ClassNames.emoji)].join('');\nconst CATEGORY = asSelectors(ClassNames.category);\n\nexport function CssSearch({ value }: { value: undefined | string }) {\n if (!value) {\n return null;\n }\n\n const q = genQuery(value);\n\n return (\n <style>{`\n ${SCOPE} ${EMOJI_BUTTON} {\n display: none;\n }\n\n\n ${SCOPE} ${q} {\n display: flex;\n }\n\n ${SCOPE} ${CATEGORY}:not(:has(${q})) {\n display: none;\n }\n `}</style>\n );\n}\n\nfunction genQuery(value: string): string {\n return [\n EMOJI_BUTTON,\n '[data-full-name*=\"',\n getNormalizedSearchTerm(value),\n '\"]'\n ].join('');\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { darkMode, stylesheet } from '../../../Stylesheet/stylesheet';\n\nimport SVGMagnifier from './svg/magnifier.svg';\n\nexport function IcnSearch() {\n return <div className={cx(styles.icnSearch)} />;\n}\n\nconst styles = stylesheet.create({\n icnSearch: {\n '.': 'epr-icn-search',\n content: '',\n position: 'absolute',\n top: '50%',\n left: 'var(--epr-search-bar-inner-padding)',\n transform: 'translateY(-50%)',\n width: '20px',\n height: '20px',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: '0 0',\n backgroundSize: '20px',\n backgroundImage: `url(${SVGMagnifier})`\n },\n ...darkMode('icnSearch', {\n backgroundPositionY: '-20px'\n })\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\nimport { useState } from 'react';\n\nimport { darkMode, stylesheet } from '../../../Stylesheet/stylesheet';\nimport {\n useAutoFocusSearchConfig,\n useSearchDisabledConfig,\n useSearchPlaceHolderConfig\n} from '../../../config/useConfig';\nimport { useCloseAllOpenToggles } from '../../../hooks/useCloseAllOpenToggles';\nimport { useFilter } from '../../../hooks/useFilter';\nimport { useIsSkinToneInSearch } from '../../../hooks/useShouldShowSkinTonePicker';\nimport Flex from '../../Layout/Flex';\nimport Relative from '../../Layout/Relative';\nimport { useSearchInputRef } from '../../context/ElementRefContext';\nimport { SkinTonePicker } from '../SkinTonePicker/SkinTonePicker';\n\nimport { BtnClearSearch } from './BtnClearSearch';\nimport { CssSearch } from './CssSearch';\nimport { IcnSearch } from './IcnSearch';\nimport SVGTimes from './svg/times.svg';\n\nexport function SearchContainer() {\n const searchDisabled = useSearchDisabledConfig();\n\n const isSkinToneInSearch = useIsSkinToneInSearch();\n\n if (searchDisabled) {\n return null;\n }\n\n return (\n <Flex className={cx(styles.overlay)}>\n <Search />\n\n {isSkinToneInSearch ? <SkinTonePicker /> : null}\n </Flex>\n );\n}\n\nexport function Search() {\n const [inc, setInc] = useState(0);\n const closeAllOpenToggles = useCloseAllOpenToggles();\n const SearchInputRef = useSearchInputRef();\n const placeholder = useSearchPlaceHolderConfig();\n const autoFocus = useAutoFocusSearchConfig();\n const { statusSearchResults, searchTerm, onChange } = useFilter();\n\n const input = SearchInputRef?.current;\n const value = input?.value;\n\n return (\n <Relative className={cx(styles.searchContainer)}>\n <CssSearch value={value} />\n <input\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={autoFocus}\n aria-label={'Type to search for an emoji'}\n onFocus={closeAllOpenToggles}\n className={cx(styles.search)}\n type=\"text\"\n aria-controls=\"epr-search-id\"\n placeholder={placeholder}\n onChange={event => {\n setInc(inc + 1);\n setTimeout(() => {\n onChange(event?.target?.value ?? value);\n });\n }}\n ref={SearchInputRef}\n />\n {searchTerm ? (\n <div\n role=\"status\"\n className={cx('epr-status-search-results', styles.visuallyHidden)}\n aria-live=\"polite\"\n id=\"epr-search-id\"\n aria-atomic=\"true\"\n >\n {statusSearchResults}\n </div>\n ) : null}\n <IcnSearch />\n <BtnClearSearch />\n </Relative>\n );\n}\n\nconst styles = stylesheet.create({\n overlay: {\n padding: 'var(--epr-header-padding)',\n zIndex: 'var(--epr-header-overlay-z-index)'\n },\n searchContainer: {\n '.': 'epr-search-container',\n flex: '1',\n display: 'block',\n minWidth: '0'\n },\n visuallyHidden: {\n clip: 'rect(0 0 0 0)',\n clipPath: 'inset(50%)',\n height: '1px',\n overflow: 'hidden',\n position: 'absolute',\n whiteSpace: 'nowrap',\n width: '1px'\n },\n search: {\n outline: 'none',\n transition: 'all 0.2s ease-in-out',\n color: 'var(--epr-search-input-text-color)',\n borderRadius: 'var(--epr-search-input-border-radius)',\n padding: 'var(--epr-search-input-padding)',\n height: 'var(--epr-search-input-height)',\n backgroundColor: 'var(--epr-search-input-bg-color)',\n border: '1px solid var(--epr-search-input-bg-color)',\n width: '100%',\n ':focus': {\n backgroundColor: 'var(--epr-search-input-bg-color-active)',\n border: '1px solid var(--epr-search-border-color)'\n },\n '::placeholder': {\n color: 'var(--epr-search-input-placeholder-color)'\n }\n },\n\n btnClearSearch: {\n '.': 'epr-btn-clear-search',\n position: 'absolute',\n right: 'var(--epr-search-bar-inner-padding)',\n height: '30px',\n width: '30px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n top: '50%',\n transform: 'translateY(-50%)',\n padding: '0',\n borderRadius: '50%',\n ':hover': {\n background: 'var(--epr-hover-bg-color)'\n },\n ':focus': {\n background: 'var(--epr-hover-bg-color)'\n }\n },\n icnClearnSearch: {\n '.': 'epr-icn-clear-search',\n backgroundColor: 'transparent',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '20px',\n height: '20px',\n width: '20px',\n backgroundImage: `url(${SVGTimes})`,\n ':hover': {\n backgroundPositionY: '-20px'\n },\n ':focus': {\n backgroundPositionY: '-20px'\n }\n },\n ...darkMode('icnClearnSearch', {\n backgroundPositionY: '-40px'\n }),\n ...darkMode('btnClearSearch', {\n ':hover > .epr-icn-clear-search': {\n backgroundPositionY: '-60px'\n }\n })\n});\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { commonInteractionStyles } from '../../Stylesheet/stylesheet';\nimport Relative from '../Layout/Relative';\nimport { CategoryNavigation } from '../navigation/CategoryNavigation';\n\nimport { SearchContainer } from './Search/Search';\n\nexport function Header() {\n return (\n <Relative\n className={cx('epr-header', commonInteractionStyles.hiddenOnReactions)}\n >\n <SearchContainer />\n <CategoryNavigation />\n </Relative>\n );\n}\n","import * as React from 'react';\n\nimport { PickerStyleTag } from './Stylesheet/stylesheet';\nimport { Reactions } from './components/Reactions/Reactions';\nimport { Body } from './components/body/Body';\nimport { ElementRefContextProvider } from './components/context/ElementRefContext';\nimport { PickerConfigProvider } from './components/context/PickerConfigContext';\nimport { useReactionsModeState } from './components/context/PickerContext';\nimport { Preview } from './components/footer/Preview';\nimport { Header } from './components/header/Header';\nimport PickerMain from './components/main/PickerMain';\nimport { compareConfig } from './config/compareConfig';\nimport { useAllowExpandReactions, useOpenConfig } from './config/useConfig';\n\nimport { PickerProps } from './index';\n\nfunction EmojiPicker(props: PickerProps) {\n return (\n <ElementRefContextProvider>\n <PickerStyleTag />\n <PickerConfigProvider {...props}>\n <ContentControl />\n </PickerConfigProvider>\n </ElementRefContextProvider>\n );\n}\n\nfunction ContentControl() {\n const [reactionsDefaultOpen] = useReactionsModeState();\n const allowExpandReactions = useAllowExpandReactions();\n\n const [renderAll, setRenderAll] = React.useState(!reactionsDefaultOpen);\n const isOpen = useOpenConfig();\n\n React.useEffect(() => {\n if (reactionsDefaultOpen && !allowExpandReactions) {\n return;\n }\n\n if (!renderAll) {\n setRenderAll(true);\n }\n }, [renderAll, allowExpandReactions, reactionsDefaultOpen]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <PickerMain>\n <Reactions />\n <ExpandedPickerContent renderAll={renderAll} />\n </PickerMain>\n );\n}\n\nfunction ExpandedPickerContent({ renderAll }: { renderAll: boolean }) {\n if (!renderAll) {\n return null;\n }\n\n return (\n <>\n <Header />\n <Body />\n <Preview />\n </>\n );\n}\n\n// eslint-disable-next-line complexity\nexport default React.memo(EmojiPicker, compareConfig);\n","import * as React from 'react';\n\nexport default class ErrorBoundary extends React.Component<\n { children: React.ReactNode },\n { hasError: boolean }\n> {\n constructor(props: { children: React.ReactNode }) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: any) {\n // eslint-disable-next-line no-console\n console.error('Emoji Picker React failed to render:', error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n return null;\n }\n\n return this.props.children;\n }\n}\n","import * as React from 'react';\n\nimport { EmojiStyle } from '../../types/exposedTypes';\n\nimport { GetEmojiUrl } from './BaseEmojiProps';\nimport { ViewOnlyEmoji } from './ViewOnlyEmoji';\n\nexport function ExportedEmoji({\n unified,\n size = 32,\n emojiStyle = EmojiStyle.APPLE,\n lazyLoad = false,\n getEmojiUrl,\n emojiUrl\n}: {\n unified: string;\n emojiStyle?: EmojiStyle;\n size?: number;\n lazyLoad?: boolean;\n getEmojiUrl?: GetEmojiUrl;\n emojiUrl?: string;\n}) {\n if (!unified && !emojiUrl && !getEmojiUrl) {\n return null;\n }\n\n return (\n <ViewOnlyEmoji\n unified={unified}\n size={size}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoad}\n getEmojiUrl={emojiUrl ? () => emojiUrl : getEmojiUrl}\n />\n );\n}\n","import * as React from 'react';\n\nimport EmojiPickerReact from './EmojiPickerReact';\nimport ErrorBoundary from './components/ErrorBoundary';\nimport { PickerConfig } from './config/config';\nimport {\n MutableConfigContext,\n useDefineMutableConfig\n} from './config/mutableConfig';\n\nexport { ExportedEmoji as Emoji } from './components/emoji/ExportedEmoji';\n\nexport {\n EmojiStyle,\n SkinTones,\n Theme,\n Categories,\n EmojiClickData,\n SuggestionMode,\n SkinTonePickerLocation\n} from './types/exposedTypes';\n\nexport interface PickerProps extends PickerConfig {}\n\nexport default function EmojiPicker(props: PickerProps) {\n const MutableConfigRef = useDefineMutableConfig({\n onEmojiClick: props.onEmojiClick,\n onReactionClick: props.onReactionClick,\n onSkinToneChange: props.onSkinToneChange,\n });\n\n return (\n <ErrorBoundary>\n <MutableConfigContext.Provider value={MutableConfigRef}>\n <EmojiPickerReact {...props} />\n </MutableConfigContext.Provider>\n </ErrorBoundary>\n );\n}\n"],"names":["ClassNames","asSelectors","classNames","Array","_len","_key","arguments","map","c","join","stylesheet","createSheet","hidden","display","opacity","pointerEvents","visibility","overflow","commonStyles","create","_extends",".","PickerStyleTag","React","suppressHydrationWarning","dangerouslySetInnerHTML","__html","getStyle","commonInteractionStyles",".epr-main",":has(input:not(:placeholder-shown))","categoryBtn",":hover","backgroundPositionY","hiddenOnSearch",":has(input(:placeholder-shown))","visibleOnSearchOnly","hiddenOnReactions","transition",".epr-reactions","height","width",".EmojiPickerReact:not(.epr-search-active)","&.epr-active","darkMode","key","value",".epr-dark-theme","_eprDarkTheme",".epr-auto-theme","_eprAutoTheme","@media (prefers-color-scheme: dark)","compareConfig","prev","next","prevCustomEmojis","_prev$customEmojis","customEmojis","nextCustomEmojis","_next$customEmojis","open","emojiVersion","reactionsDefaultOpen","searchPlaceHolder","searchPlaceholder","defaultSkinTone","skinTonesDisabled","autoFocusSearch","emojiStyle","theme","suggestedEmojisMode","lazyLoadEmojis","className","style","searchDisabled","skinTonePickerLocation","length","SuggestionMode","EmojiStyle","Theme","SkinTones","Categories","SkinTonePickerLocation","DEFAULT_REACTIONS","categoriesOrdered","SUGGESTED","CUSTOM","SMILEYS_PEOPLE","ANIMALS_NATURE","FOOD_DRINK","TRAVEL_PLACES","ACTIVITIES","OBJECTS","SYMBOLS","FLAGS","SuggestedRecent","name","category","configByCategory","_configByCategory","baseCategoriesConfig","modifiers","categoryFromCategoryConfig","categoryNameFromCategoryConfig","getBaseConfigByCategory","modifier","Object","assign","EmojiProperties","skinToneVariations","NEUTRAL","LIGHT","MEDIUM_LIGHT","MEDIUM","MEDIUM_DARK","DARK","skinTonesNamed","entries","reduce","acc","_ref","skinTonesMapped","mapped","skinTone","_Object$assign","alphaNumericEmojiIndex","indexEmoji","emoji","emojiNames","flat","toLowerCase","replace","split","forEach","char","_alphaNumericEmojiInd","emojiUnified","_emoji$EmojiPropertie","emojiName","unifiedWithoutSkinTone","unified","splat","_splat$splice","splice","emojiHasVariations","_emojiVariationUnifie","emojiVariations","find","variation","includes","emojiVariationUnified","emojisByCategory","_emojis$category","emojis","emojiUrlByUnified","TWITTER","GOOGLE","FACEBOOK","APPLE","cdnUrl","_emoji$EmojiPropertie2","variations","emojiByUnified","allEmojisByUnified","withoutSkinTone","setTimeout","allEmojis","searchIndex","values","Emoji","KNOWN_FAILING_EMOJIS","mergeConfig","userConfig","base","basePickerConfig","previewConfig","_userConfig$previewCo","config","categories","userCategoriesConfig","extra","suggestionMode","RECENT","_userCategoriesConfig","mergeCategoriesConfig","hiddenEmojis","unicodeToHide","add","_config$customEmojis","emojiData","names","id","added_in","imgUrl","customToRegularEmoji","push","PREVIEW","getEmojiUrl","basePreviewConfig","SEARCH","FREQUENT","Set","reactions","allowExpandReactions","defaultEmoji","defaultCaption","showPreview","ConfigContext","PickerConfigProvider","children","mergedConfig","_React$useState","setMergedConfig","useSetConfig","_objectWithoutPropertiesLoose","_excluded","Provider","usePickerConfig","MOUSE_EVENT_SOURCE","MutableConfigContext","createContext","useMutableConfig","useContext","emptyFunc","useAllowExpandReactions","useSkinTonesDisabledConfig","useEmojiStyleConfig","useCategoriesConfig","usePreviewConfig","useSearchDisabledConfig","useSkinTonePickerLocationConfig","useGetEmojiUrlConfig","getDimension","dimensionConfig","useDebouncedState","initialValue","delay","_useState","useState","state","setState","timer","useRef","Promise","resolve","current","clearTimeout","_window","window","useDisallowedEmojis","DisallowedEmojisRef","emojiVersionConfig","useMemo","parseFloat","Number","isNaN","disallowedEmojis","supportedLevel","addedIn","addedInNewerVersion","PickerContextProvider","dispatch","filterRef","disallowClickRef","disallowMouseRef","disallowedEmojisRef","suggestedUpdateState","Date","now","searchTerm","skinToneFanOpenState","activeSkinTone","activeCategoryState","emojisThatFailedToLoadState","emojiVariationPickerState","reactionsModeState","isPastInitialLoad","useEffect","PickerContext","useFilterRef","useDisallowMouseRef","useReactionsModeState","useSearchTermState","useActiveSkinToneState","useEmojisThatFailedToLoadState","useEmojiVariationPickerState","useSkinToneFanOpenState","useUpdateSuggested","setsuggestedUpdate","useIsSearchMode","focusElement","element","requestAnimationFrame","focus","focusPrevElementSibling","previousElementSibling","focusNextElementSibling","nextElementSibling","focusFirstElementChild","firstElementChild","getActiveElement","document","activeElement","ElementRefContextProvider","PickerMainRef","AnchoredEmojiRef","BodyRef","SearchInputRef","SkinTonePickerRef","CategoryNavigationRef","VariationPickerRef","ReactionsRef","ElementRefContext","KeyboardEvents","useElementRef","usePickerMainRef","useAnchoredEmojiRef","useSetAnchoredEmojiRef","target","useBodyRef","useSearchInputRef","useSkinTonePickerRef","useCategoryNavigationRef","scrollTo","root","top","$eprBody","queryScrollBody","scrollTop","scrollEmojiAboveLabel","emojiDistanceFromScrollTop","categoryLabelHeight","closestCategory","isEmojiBehindLabel","closest","variationPicker","scrollBody","closestScrollBody","by","scrollBy","focusFirstVisibleEmoji","parent","firstVisibleEmoji","useCloseAllOpenToggles","_useEmojiVariationPic","setVariationPicker","_useSkinToneFanOpenSt","skinToneFanOpen","setSkinToneFanOpen","useCallback","useHasOpenToggles","useAllowMouseMove","DisallowMouseRef","useIsMouseDisallowed","useFocusSearchInput","useFocusCategoryNavigation","useClearSearch","applySearch","useApplySearch","focusSearchInput","setSearchTerm","then","hasMatch","keyword","some","getNormalizedSearchTerm","str","trim","useSetVariationPicker","setAnchoredEmojiRef","setEmojiVariationPicker","emojiFromElement","useIsSkinToneInSearch","useIsSkinToneInPreview","useGoDownFromSearchInput","focusCategoryNavigation","isSearchMode","focusNextSkinTone","exitLeft","currentSkinTone","focusPrevSkinTone","useOnType","appendSearch","closeAllOpenToggles","event","metaKey","ctrlKey","altKey","hasModifier","match","preventDefault","preloadedEmojs","PickerMain","PickerRootElement","_ref2","reactionsMode","searchModeActive","_usePickerConfig15","useStyleConfig","focusSkinTonePicker","setSkinToneFanOpenState","goDownFromSearchInput","isSkinToneInSearch","onKeyDown","clearSearch","hasOpenToggles","disallowMouseMove","Escape","addEventListener","removeEventListener","usePickerMainKeyboardEvents","firstEmoji","ArrowRight","ArrowDown","Enter","click","_useSkinToneFanOpenSt2","isOpen","setIsOpen","isSkinToneInPreview","onType","ArrowLeft","ArrowUp","useSkinTonePickerKeyboardEvents","useCategoryNavigationKeyboardEvents","goUpFromBody","buttonFromTarget","nextVisibleEmoji","isVisibleEmoji","nextCategory","focusNextVisibleEmoji","prevVisibleEmoji","lastVisibleEmoji","prevCategory","focusPrevVisibleEmoji","index","nextRowElements","allElements","currentRow","elementsInRow","nextRow","categoryContent","closestCategoryContent","indexInRow","elementIndexInRow","row","rowNumber","countInRow","elementCountInRow","elementHeight","getBoundingClientRect","elementTop","parentTop","parentHeight","Math","round","hasNextRow","nextVisibleCategory","getElementInRow","allVisibleEmojis","getRowElements","visibleEmojiOneRowDown","exitUp","prevRowElements","prevVisibleCategory","visibleEmojiOneRowUp","focusVisibleEmojiOneRowUp","Space","useBodyKeyboardEvents","useKeyboardNavigation","NATIVE","bodyRef","onFocus","button","has","url","Image","src","preloadEmoji","_ref3","styleProps","cx","styles","main","baseVariables","darkTheme","AUTO","autoThemeDark","_cx","searchActive","reactionsMenu","ref","DarkTheme","--epr-emoji-variation-picker-bg-color","--epr-hover-bg-color-reduced-opacity","--epr-highlight-color","--epr-text-color","--epr-hover-bg-color","--epr-focus-bg-color","--epr-search-input-bg-color","--epr-category-label-bg-color","--epr-picker-border-color","--epr-bg-color","--epr-reactions-bg-color","--epr-search-input-bg-color-active","--epr-emoji-variation-indicator-color","--epr-category-icon-active-color","--epr-skin-tone-picker-menu-color","emojiPicker","position","flexDirection","borderWidth","borderStyle","borderRadius","borderColor","backgroundColor","*","boxSizing","fontFamily","--","--epr-horizontal-padding","--epr-picker-border-radius","--epr-search-border-color","--epr-header-padding","--epr-active-skin-tone-indicator-border-color","--epr-active-skin-hover-color","--epr-search-input-padding","--epr-search-input-border-radius","--epr-search-input-height","--epr-search-input-text-color","--epr-search-input-placeholder-color","--epr-search-bar-inner-padding","--epr-category-navigation-button-size","--epr-emoji-variation-picker-height","--epr-preview-height","--epr-preview-text-size","--epr-preview-text-padding","--epr-preview-border-color","--epr-preview-text-color","--epr-category-padding","--epr-category-label-text-color","--epr-category-label-padding","--epr-category-label-height","DEFAULT_LABEL_HEIGHT","--epr-emoji-size","--epr-emoji-padding","--epr-emoji-fullsize","--epr-emoji-hover-color","--epr-emoji-variation-indicator-color-hover","--epr-header-overlay-z-index","--epr-emoji-variations-indictator-z-index","--epr-category-label-z-index","--epr-skin-variation-picker-z-index","--epr-preview-z-index","--epr-dark","--epr-dark-emoji-variation-picker-bg-color","--epr-dark-highlight-color","--epr-dark-text-color","--epr-dark-hover-bg-color","--epr-dark-hover-bg-color-reduced-opacity","--epr-dark-focus-bg-color","--epr-dark-search-input-bg-color","--epr-dark-category-label-bg-color","--epr-dark-picker-border-color","--epr-dark-bg-color","--epr-dark-reactions-bg-color","--epr-dark-search-input-bg-color-active","--epr-dark-emoji-variation-indicator-color","--epr-dark-category-icon-active-color","--epr-dark-skin-tone-picker-menu-color","autoTheme","backdropFilter","parentWidth","elementWidth","floor","elementLeft","left","parentLeft","elements","lastRow","slice","rowElements","EmojiButtonSelector","VisibleEmojiSelector","visible","emojiElement","_emojiElement$closest","originalUnified","originalUnifiedFromEmojiElement","unifiedFromEmojiElement","_element$clientHeight","clientHeight","emojiTrueOffsetTop","labelHeight","elementOffsetTop","categoryWithoutLabel","querySelector","_category$clientHeigh","_categoryWithoutLabel","matches","_closestScrollBody$sc","_closestScrollBody","_element$closest","_element$offsetTop","offsetTop","elementOffsetLeft","_element$offsetLeft","offsetLeft","_elementDataSetKey","_elementDataSet$key","_element$dataset","dataset","elementDataSet","allUnifiedFromEmojiElement","classList","contains","isHidden","from","querySelectorAll","last","maxVisibilityDiffThreshold","parentBottom","bottom","parentTopWithLabel","parentNode","_i","_labels","label","getLabelHeight","elementBottom","maxVisibilityDiffPixels","elementTopWithAllowedDiff","elementBottomWithAllowedDiff","firstVisibleElementInContainer","parseNativeEmoji","hex","String","fromCodePoint","parseInt","getSuggested","mode","_window$localStorage$","_window2","localStorage","recent","JSON","parse","getItem","sort","a","b","count","_unused","isCustomEmoji","undefined","useMouseDownHandlers","ContainerRef","mouseEventSource","mouseDownTimerRef","onEmojiClick","REACTIONS","onReactionClick","useOnEmojiClickConfig","updateSuggested","activeEmojiStyle","onClick","_emojiFromEvent","emojiFromEvent","skinToneToUse","suspectedSkinTone","activeVariationFromUnified","nextList","existing","concat","filter","i","original","min","_window3","setItem","stringify","_unused2","setSuggested","getImageUrl","imageUrl","isCustom","emojiClickOutput","onMouseDown","onMouseUp","confainerRef","passive","Boolean","_element$parentElemen","parentElement","Button","props","type","cursor","border","background","outline","ClickableEmojiButton","_ref$showVariations","showVariations","hasVariations","_ref$noBackground","noBackground","getAriaLabel","_emojiNames$","alignItems","justifyContent","maxWidth","maxHeight",":focus",":after","content","right","borderLeft","borderRight","transform","borderBottom","zIndex",":hover:after","emojiStyles","external","fontSize","common","alignSelf","justifySelf","EmojiImg","_ref$lazyLoad","lazyLoad","onError","alt","emojiImag","loading","minWidth","minHeight","padding","NativeEmoji","nativeEmoji","lineHeight","textAlign","letterSpacing","ViewOnlyEmoji","size","_ref$getEmojiUrl","setEmojisThatFailedToLoad","emojiToRender","ClickableEmoji","BtnPlus","setReactionsMode","title","tabIndex","plusSign","color","backgroundImage","backgroundRepeat","backgroundSize","Reactions","reactionsOpen","list","reaction","emojiButton","listStyle","margin",":active","EmojiCategory","categoryConfig","categoryName",":not(:has(.epr-visible))","gridGap","gridTemplateColumns","fontWeight","textTransform","isEverMounted","Suggested","suggestedUpdated","isMounted","setIsMounted","useIsEverMounted","suggestedEmojisModeConfig","suggested","_getSuggested","suggestedItem","EmojiList","renderdCategoriesCountRef","emojiList","RenderCategory","isUnicodeHidden","emojisThatFailedToLoad","isEmojiFiltered","isEmojiHidden","_filter$searchTerm","isEmojiFilteredBySearchTerm","failedToLoad","filteredOut","isEmojiDisallowed","emojisToPush","hiddenCounter","_isEmojiHidden","isDisallowed","Direction","EmojiVariationPicker","pointerStyle","_useVariationPickerTo","direction","Up","getMenuDirection","getTop","emojiOffsetTop","_bodyRef$scrollTop","buttonHeight","Down","useVariationPickerTop","getPointerStyle","emojiTruOffsetLeft","clientWidth","usePointerStyle","pointingUp","pointer","boxShadow","transformOrigin",".pointing-up","backgroundPosition","Body","onScroll","useOnScroll","PICKER","allowMouseMove","isMouseDisallowed","onMouseMove","useOnMouseMove","body","FlexDirection","flex","overflowY","overflowX","Flex","_ref$style","_ref$direction","ROW","_stylesheet$create","COLUMN","Absolute","Relative","BtnSkinToneVariation","isActive","skinToneVariation","tone","closedTone","active","SkinTonePickerDirection","&.epr-tone-neutral","&.epr-tone-1f3fb","&.epr-tone-1f3fc","&.epr-tone-1f3fd","&.epr-tone-1f3fe","&.epr-tone-1f3ff","SkinTonePickerMenu","SkinTonePicker","VERTICAL","HORIZONTAL","isDisabled","_useActiveSkinToneSta","setActiveSkinTone","onSkinToneChange","expandedSize","ITEM_SIZE","vertical","skinTones","verticalShadow","flexBasis","select","--epr-skin-tone-size",".epr-active:after","> button","Preview","preview","PreviewBody","previewEmoji","setPreviewEmoji","variationPickerEmoji","allow","onEscape","onMouseOver","onEnter","onLeave","e","_allUnifiedFromEmojiE","relatedTarget","buttonRect","bodyRect","y","detectEmojyPartiallyBelowFold","_allUnifiedFromEmojiE2","_document$activeEleme","blur","handlePartiallyVisibleElementFocus","useEmojiPreviewEvents","_previewEmoji$unified","show","defaultText","borderTop","CategoryButton","isActiveCategory","allowNavigation","catBtn","role","DarkActivePositionY","DarkInactivePosition",":not(.epr-search-active)",":focus:before","&.epr-icn-suggested","backgroundPositionX","&.epr-icn-custom","&.epr-icn-activities","&.epr-icn-animals_nature","&.epr-icn-flags","&.epr-icn-food_drink","&.epr-icn-objects","&.epr-icn-smileys_people","&.epr-icn-symbols","&.epr-icn-travel_places","CategoryNavigation","activeCategory","setActiveCategory","scrollCategoryIntoView","$category","_BodyRef$current","visibleCategories","Map","observer","IntersectionObserver","_step","_iterator","_createForOfIteratorHelperLoose","done","entry","_$category$getAttribu","getAttribute","set","intersectionRatio","ratios","lastCategory","_ratios","_ratios$_i","threshold","el","observe","useActiveCategoryScrollDetection","customCategoryConfig","categoriesConfig","hideCustomCategory","nav","isCustomCategory",".epr-search-active",".epr-main:has(input:not(:placeholder-shown))","BtnClearSearch","btnClearSearch","icnClearnSearch","HoverDark","> .epr-icn-clear-search","SVGTimes","SCOPE","EMOJI_BUTTON","CATEGORY","CssSearch","q","genQuery","IcnSearch","icnSearch","SearchContainer","overlay","Search","_usePickerConfig","inc","setInc","placeholder","_find","p","autoFocus","_useFilter","setFilterRef","setFilter","setter","useSetFilterRef","onChange","inputValue","nextValue","longestMatch","dict","longestMatchingKey","keys","findLongestMatch","filtered","filterEmojiObjectByKeyword","statusSearchResults","filterState","searchResultsCount","_Object$entries","toString","getStatusSearchResults","useFilter","input","searchContainer","search","_event$target$value","_event$target","visuallyHidden","clip","clipPath","whiteSpace","::placeholder",":hover > .epr-icn-clear-search","Header","EmojiPicker","ContentControl","renderAll","setRenderAll","ExpandedPickerContent","ErrorBoundary","_React$Component","_this","call","hasError","getDerivedStateFromError","_proto","prototype","componentDidCatch","error","errorInfo","console","render","this","_ref$size","_ref$emojiStyle","emojiUrl","MutableConfigRef","useDefineMutableConfig","EmojiPickerReact"],"mappings":"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"}