@moveo-ai/web-client 0.92.0 → 0.93.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":"329.min.js","mappings":"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","sources":["webpack://MoveoAI/./node_modules/flairup/src/utils/asArray.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/is.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/joinTruthy.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/stableHash.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/stringManipulators.ts","webpack://MoveoAI/./node_modules/flairup/src/Rule.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/classNames.ts","webpack://MoveoAI/./node_modules/flairup/src/Sheet.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/forIn.ts","webpack://MoveoAI/./node_modules/flairup/src/cx.ts","webpack://MoveoAI/./node_modules/flairup/src/index.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/Stylesheet/stylesheet.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/compareConfig.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Reactions/DEFAULT_REACTIONS.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/types/exposedTypes.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/alphaNumericEmojiIndex.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useDebouncedState.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useDisallowedEmojis.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/useConfig.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/emojiSelectors.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/context/PickerContext.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useInitialLoad.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/categoryConfig.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/cdnUrls.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/DataTypes.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/data/skinToneVariations.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/suggested.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/config.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/context/PickerConfigContext.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/mutableConfig.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useIsSearchMode.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/focusElement.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/getActiveElement.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/context/ElementRefContext.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useKeyboardNavigation.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/scrollTo.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/selectors.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/keyboardNavigation.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useCloseAllOpenToggles.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useDisallowMouseMove.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useFocus.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useFilter.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useSetVariationPicker.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useShouldShowSkinTonePicker.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/elementPositionInRow.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/preloadEmoji.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/main/PickerMain.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useOnFocus.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/parseNativeEmoji.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/typeRefinements/typeRefinements.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useMouseDownHandlers.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/atoms/Button.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/ClickableEmojiButton.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/emojiStyles.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/EmojiImg.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/NativeEmoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/ViewOnlyEmoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/Emoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Reactions/BtnPlus.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Reactions/Reactions.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useEmojiVirtualization.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useHideEmojisByUniocode.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useIsEmojiHidden.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useCategoryHeight.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/virtualization/virtualizationHelpers.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/EmojiCategory.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/MeasureEmoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/EmojiList.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/EmojiVariationPicker.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/Body.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useOnScroll.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Layout/Flex.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Layout/Space.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Layout/Absolute.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Layout/Relative.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/SkinTonePicker/BtnSkinToneVariation.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/SkinTonePicker/SkinTonePicker.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/footer/Preview.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useEmojiPreviewEvents.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/detectEmojyPartiallyBelowFold.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/categoryNameFromDom.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/navigation/CategoryButton.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/navigation/CategoryNavigation.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useScrollCategoryIntoView.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useActiveCategoryScrollDetection.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useShouldHideCustomEmojis.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/Search/BtnClearSearch.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/Search/IcnSearch.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/Search/Search.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/Header.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/EmojiPickerReact.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/ErrorBoundary.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/ExportedEmoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/index.tsx"],"sourcesContent":["export function asArray<T>(v: T | T[]): T[] {\n return [].concat(v as unknown as []);\n}\n","import { ClassName } from '../types.js';\n\nexport function isPsuedoSelector(selector: string): boolean {\n return selector.startsWith(':');\n}\n\nexport function isStyleCondition(selector: string): boolean {\n return (\n isString(selector) &&\n (selector === '*' ||\n (selector.length > 1 && ':>~.+*'.includes(selector.slice(0, 1))) ||\n isImmediatePostcondition(selector))\n );\n}\n\nexport function isValidProperty(\n property: string,\n value: unknown,\n): value is string {\n return (\n (isString(value) || typeof value === 'number') &&\n !isCssVariables(property) &&\n !isPsuedoSelector(property) &&\n !isMediaQuery(property)\n );\n}\n\nexport function isMediaQuery(selector: string): boolean {\n return selector.startsWith('@media');\n}\n\nexport function isDirectClass(selector: string): boolean {\n return selector === '.';\n}\n\nexport function isCssVariables(selector: string): boolean {\n return selector === '--';\n}\n\nexport function isString(value: unknown): value is string {\n return value + '' === value;\n}\n\nexport function isClassName(value: unknown): value is ClassName {\n return isString(value) && value.length > 1 && value.startsWith('.');\n}\n\nexport function isImmediatePostcondition(\n value: unknown,\n): value is `&${string}` {\n return isString(value) && (value.startsWith('&') || isPsuedoSelector(value));\n}\n","export function joinTruthy(arr: unknown[], delimiter: string = ''): string {\n return arr.filter(Boolean).join(delimiter);\n}\n","// Stable hash function.\nexport function stableHash(prefix: string, seed: string): string {\n let hash = 0;\n if (seed.length === 0) return hash.toString();\n for (let i = 0; i < seed.length; i++) {\n const char = seed.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return `${prefix ?? 'cl'}_${hash.toString(36)}`;\n}\n","// Some properties need special handling\nexport function handlePropertyValue(property: string, value: string): string {\n if (property === 'content') {\n return `\"${value}\"`;\n }\n\n return value;\n}\n\nexport function camelCaseToDash(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\nexport function joinedProperty(property: string, value: string): string {\n return `${property}:${value}`;\n}\n\nexport function toClass(str: string): string {\n return str ? `.${str}` : '';\n}\n\nexport function appendString(base: string, line: string): string {\n return base ? `${base}\\n${line}` : line;\n}\n","import { Sheet } from './Sheet';\nimport { asArray } from './utils/asArray';\nimport { isImmediatePostcondition, isPsuedoSelector } from './utils/is';\nimport { joinTruthy } from './utils/joinTruthy';\nimport { stableHash } from './utils/stableHash';\nimport {\n camelCaseToDash,\n handlePropertyValue,\n joinedProperty,\n toClass,\n} from './utils/stringManipulators';\n\nexport class Rule {\n public hash: string;\n public joined: string;\n public key: string;\n\n constructor(\n private sheet: Sheet,\n public property: string,\n public value: string,\n private selector: Selector,\n ) {\n this.property = property;\n this.value = value;\n this.joined = joinedProperty(property, value);\n const joinedConditions = this.selector.preconditions.concat(\n this.selector.postconditions,\n );\n this.hash = this.selector.hasConditions\n ? (this.selector.scopeClassName as string)\n : stableHash(this.sheet.name, this.joined);\n this.key = joinTruthy([this.joined, joinedConditions, this.hash]);\n }\n\n public toString(): string {\n let selectors = mergeSelectors(this.selector.preconditions, {\n right: this.hash,\n });\n\n selectors = mergeSelectors(this.selector.postconditions, {\n left: selectors,\n });\n\n return `${selectors} {${Rule.genRule(this.property, this.value)}}`;\n }\n\n static genRule(property: string, value: string): string {\n const transformedProperty = camelCaseToDash(property);\n return (\n joinedProperty(\n transformedProperty,\n handlePropertyValue(property, value),\n ) + ';'\n );\n }\n}\n\nexport function mergeSelectors(\n selectors: string[],\n { left = '', right = '' }: { left?: string; right?: string } = {},\n): string {\n const output = selectors.reduce((selectors, current) => {\n if (isPsuedoSelector(current)) {\n return selectors + current;\n }\n\n if (isImmediatePostcondition(current)) {\n return selectors + current.slice(1);\n }\n\n return joinTruthy([selectors, current], ' ');\n\n // selector then postcondition\n }, left);\n\n // preconditions, then selector\n return joinTruthy([output, toClass(right)], ' ');\n}\n\nexport class Selector {\n public preconditions: string[] = [];\n public scopeClassName: string | null = null;\n public scopeName: string | null = null;\n public postconditions: string[] = [];\n\n constructor(\n private sheet: Sheet,\n scopeName: string | null = null,\n {\n preconditions,\n postconditions,\n }: {\n preconditions?: string[] | string | undefined;\n postconditions?: string[] | string | undefined;\n } = {},\n ) {\n this.preconditions = preconditions ? asArray(preconditions) : [];\n this.postconditions = postconditions ? asArray(postconditions) : [];\n this.setScope(scopeName);\n }\n\n private setScope(scopeName: string | null): Selector {\n if (!scopeName) {\n return this;\n }\n\n if (!this.scopeClassName) {\n this.scopeName = scopeName;\n this.scopeClassName = stableHash(\n this.sheet.name,\n // adding the count guarantees uniqueness across style.create calls\n scopeName + this.sheet.count,\n );\n }\n\n return this;\n }\n\n get hasConditions(): boolean {\n return this.preconditions.length > 0 || this.postconditions.length > 0;\n }\n\n addScope(scopeName: string): Selector {\n return new Selector(this.sheet, scopeName, {\n preconditions: this.preconditions,\n postconditions: this.postconditions,\n });\n }\n\n addPrecondition(precondition: string): Selector {\n return new Selector(this.sheet, this.scopeClassName, {\n postconditions: this.postconditions,\n preconditions: this.preconditions.concat(precondition),\n });\n }\n\n addPostcondition(postcondition: string): Selector {\n return new Selector(this.sheet, this.scopeClassName, {\n preconditions: this.preconditions,\n postconditions: this.postconditions.concat(postcondition),\n });\n }\n\n createRule(property: string, value: string): Rule {\n return new Rule(this.sheet, property, value, this);\n }\n}\n","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 { Rule } from './Rule.js';\nimport { StoredStyles } from './types.js';\nimport { isString } from './utils/is.js';\nimport { appendString } from './utils/stringManipulators.js';\n\nexport class Sheet {\n private styleTag: HTMLStyleElement | undefined;\n\n // Hash->css\n private storedStyles: StoredStyles = {};\n\n // styles->hash\n private storedClasses: Record<string, string> = {};\n private style: string = '';\n public count = 0;\n public id: string;\n\n constructor(\n public name: string,\n private rootNode?: HTMLElement | null,\n ) {\n this.id = `flairup-${name}`;\n\n this.styleTag = this.createStyleTag();\n }\n\n getStyle(): string {\n return this.style;\n }\n\n append(css: string): void {\n this.style = appendString(this.style, css);\n }\n\n apply(): void {\n this.count++;\n\n if (!this.styleTag) {\n return;\n }\n\n this.styleTag.innerHTML = this.style;\n }\n\n isApplied(): boolean {\n return !!this.styleTag;\n }\n\n createStyleTag(): HTMLStyleElement | undefined {\n // check that we're in the browser and have access to the DOM\n if (\n typeof document === 'undefined' ||\n this.isApplied() ||\n // Explicitly disallow mounting to the DOM\n this.rootNode === null\n ) {\n return this.styleTag;\n }\n\n const styleTag = document.createElement('style');\n styleTag.type = 'text/css';\n styleTag.id = this.id;\n (this.rootNode ?? document.head).appendChild(styleTag);\n return styleTag;\n }\n\n addRule(rule: Rule): string {\n const storedClass = this.storedClasses[rule.key];\n\n if (isString(storedClass)) {\n return storedClass;\n }\n\n this.storedClasses[rule.key] = rule.hash;\n this.storedStyles[rule.hash] = [rule.property, rule.value];\n\n this.append(rule.toString());\n return rule.hash;\n }\n}\n","export function forIn<O extends Record<string, unknown>>(\n obj: O,\n fn: (key: string, value: O[string]) => void,\n): void {\n for (const key in obj) {\n fn(key.trim(), obj[key]);\n }\n}\n","import { joinTruthy } from './utils/joinTruthy';\n\nexport function cx(...args: unknown[]): string {\n const classes = args.reduce((classes: string[], arg) => {\n if (arg instanceof Set) {\n classes.push(...arg);\n } else if (typeof arg === 'string') {\n classes.push(arg);\n } else if (Array.isArray(arg)) {\n classes.push(cx(...arg));\n } else if (typeof arg === 'object') {\n // @ts-expect-error - it is a string\n Object.entries(arg).forEach(([key, value]) => {\n if (value) {\n classes.push(key);\n }\n });\n }\n\n return classes;\n }, [] as string[]);\n\n return joinTruthy(classes, ' ').trim();\n}\n","import { Rule, Selector, mergeSelectors } from './Rule.js';\nimport { Sheet } from './Sheet.js';\nimport {\n CSSVariablesObject,\n ClassSet,\n CreateSheetInput,\n DirectClass,\n ScopedStyles,\n Styles,\n createSheetReturn,\n} from './types.js';\nimport { asArray } from './utils/asArray.js';\nimport { forIn } from './utils/forIn.js';\nimport {\n isCssVariables,\n isDirectClass,\n isMediaQuery,\n isStyleCondition,\n isValidProperty,\n} from './utils/is.js';\n\nexport { cx } from './cx.js';\n\nexport type { CreateSheetInput, Styles };\n\nexport function createSheet(\n name: string,\n rootNode?: HTMLElement | null,\n): createSheetReturn {\n const sheet = new Sheet(name, rootNode);\n\n return {\n create,\n getStyle: sheet.getStyle.bind(sheet),\n isApplied: sheet.isApplied.bind(sheet),\n };\n\n function create<K extends string>(styles: CreateSheetInput<K>) {\n const scopedStyles: ScopedStyles<K> = {} as ScopedStyles<K>;\n\n iteratePreconditions(sheet, styles, new Selector(sheet)).forEach(\n ([scopeName, styles, selector]) => {\n iterateStyles(sheet, styles as Styles, selector).forEach(\n (className) => {\n addScopedStyle(scopeName as K, className);\n },\n );\n },\n );\n\n // Commit the styles to the sheet.\n // Done only once per create call.\n // This way we do not update the DOM on every style.\n sheet.apply();\n\n return scopedStyles;\n\n function addScopedStyle(name: K, className: string) {\n scopedStyles[name as keyof ScopedStyles<K>] =\n scopedStyles[name as keyof ScopedStyles<K>] ?? new Set<string>();\n scopedStyles[name as keyof ScopedStyles<K>].add(className);\n }\n }\n}\n\n// This one plucks out all of the preconditions\n// and creates selector objects from them\nfunction iteratePreconditions(\n sheet: Sheet,\n styles: Styles,\n selector: Selector,\n) {\n const output: Array<[string, Styles, Selector]> = [];\n\n forIn(styles, (key: string, value) => {\n if (isStyleCondition(key)) {\n return iteratePreconditions(\n sheet,\n value as Styles,\n selector.addPrecondition(key),\n ).forEach((item) => output.push(item));\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - this is a valid case\n output.push([key, styles[key], selector.addScope(key)]);\n });\n\n return output;\n}\n\nfunction iterateStyles(\n sheet: Sheet,\n styles: Styles,\n selector: Selector,\n): ClassSet {\n const output: ClassSet = new Set<string>();\n // eslint-disable-next-line max-statements\n forIn(styles, (property, value) => {\n let res: string[] | Set<string> = [];\n\n // Postconditions\n if (isStyleCondition(property)) {\n res = iterateStyles(\n sheet,\n value as Styles,\n selector.addPostcondition(property),\n );\n // Direct classes: \".\": \"className\"\n } else if (isDirectClass(property)) {\n res = asArray(value as DirectClass);\n } else if (isMediaQuery(property)) {\n res = handleMediaQuery(sheet, value as Styles, property, selector);\n\n // \"--\": { \"--variable\": \"value\" }\n } else if (isCssVariables(property)) {\n res = cssVariablesBlock(sheet, value as CSSVariablesObject, selector);\n\n // \"property\": \"value\"\n } else if (isValidProperty(property, value)) {\n const rule = selector.createRule(property, value);\n sheet.addRule(rule);\n output.add(rule.hash);\n }\n\n return addEachClass(res, output);\n });\n\n return output;\n}\n\nfunction addEachClass(list: string[] | Set<string>, to: Set<string>) {\n list.forEach((className) => to.add(className));\n return to;\n}\n\n// eslint-disable-next-line max-statements\nfunction cssVariablesBlock(\n sheet: Sheet,\n styles: CSSVariablesObject,\n selector: Selector,\n) {\n const classes: ClassSet = new Set<string>();\n\n const chunkRows: string[] = [];\n forIn(styles, (property: string, value) => {\n if (isValidProperty(property, value)) {\n chunkRows.push(Rule.genRule(property, value));\n return;\n }\n const res = iterateStyles(sheet, value ?? {}, selector);\n addEachClass(res, classes);\n });\n\n if (!selector.scopeClassName) {\n return classes;\n }\n\n if (chunkRows.length) {\n const output = chunkRows.join(' ');\n sheet.append(\n `${mergeSelectors(selector.preconditions, {\n right: selector.scopeClassName,\n })} {${output}}`,\n );\n }\n\n classes.add(selector.scopeClassName);\n return classes;\n}\n\nfunction handleMediaQuery(\n sheet: Sheet,\n styles: Styles,\n mediaQuery: string,\n selector: Selector,\n) {\n sheet.append(mediaQuery + ' {');\n\n // iterateStyles will internally append each rule to the sheet\n // as needed. All we have to do is just open the block and close it after.\n const output = iterateStyles(sheet, styles, selector);\n\n sheet.append('}');\n\n return output;\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.searchClearButtonLabel === next.searchClearButtonLabel &&\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 { 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 { 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';\n\nimport { usePickerConfig } from '../components/context/PickerConfigContext';\nimport { useReactionsModeState } from '../components/context/PickerContext';\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 DEFAULT_SEARCH_CLEAR_BUTTON_LABEL,\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 useSearchClearButtonLabelConfig(): string {\n const { searchClearButtonLabel } = usePickerConfig();\n return searchClearButtonLabel ?? DEFAULT_SEARCH_CLEAR_BUTTON_LABEL;\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 const [, setReactionsOpen] = useReactionsModeState();\n\n const handler = current.onEmojiClick || (() => {});\n const { onReactionClick } = current;\n\n if (mouseEventSource === MOUSE_EVENT_SOURCE.REACTIONS && onReactionClick) {\n return (...args) =>\n onReactionClick(...args, {\n collapseToReactions: () => {\n setReactionsOpen(o => o);\n }\n });\n }\n\n return (...args) => {\n handler(...args, {\n collapseToReactions: () => {\n setReactionsOpen(true);\n }\n });\n };\n}\n\nexport function useOnSkinToneChangeConfig(): (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 { useUpdateSuggested } from '../components/context/PickerContext';\nimport { Categories } from '../config/categoryConfig';\nimport { cdnUrl } from '../config/cdnUrls';\nimport { CustomEmoji } from '../config/customEmojiConfig';\nimport { useSuggestedEmojisModeConfig } from '../config/useConfig';\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';\nimport { getSuggested } from './suggested';\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 useGetEmojisByCategory(): (Category: Categories) => DataEmojis {\n const suggestedEmojisModeConfig = useSuggestedEmojisModeConfig();\n const [suggestedUpdated] = useUpdateSuggested();\n\n const suggested = React.useMemo(\n () => {\n const suggested = getSuggested(suggestedEmojisModeConfig) ?? [];\n\n return suggested\n .map(s => emojiByUnified(s.unified))\n .filter(Boolean) as DataEmojis;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [suggestedUpdated, suggestedEmojisModeConfig]\n );\n\n return function getEmojisByCategory(category: Categories): DataEmojis {\n if (category === Categories.SUGGESTED) {\n return suggested;\n }\n\n // @ts-ignore\n return emojis[category] ?? [];\n };\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 * 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 const visibleCategoriesState = useState<string[]>([]);\n const emojiSizeState = useState<number | null>(null);\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 visibleCategoriesState,\n emojiSizeState\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 visibleCategoriesState: ReactState<Array<string>>;\n emojiSizeState: ReactState<number | null>;\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 visibleCategoriesState: [[], () => []],\n emojiSizeState: [null, () => {}]\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 useVisibleCategoriesState() {\n const { visibleCategoriesState } = React.useContext(PickerContext);\n return visibleCategoriesState;\n}\n\nexport function useEmojiSizeState() {\n const { emojiSizeState } = React.useContext(PickerContext);\n return emojiSizeState;\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 { 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 { 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 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 { 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 * 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 DEFAULT_SEARCH_CLEAR_BUTTON_LABEL = 'Clear';\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 searchClearButtonLabel: DEFAULT_SEARCH_CLEAR_BUTTON_LABEL,\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 searchClearButtonLabel: 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 = (\n emoji: EmojiClickData,\n event: MouseEvent,\n api?: OnEmojiClickApi\n) => void;\nexport type OnSkinToneChange = (emoji: SkinTones) => void;\n\ntype OnEmojiClickApi = {\n collapseToReactions: () => void;\n};\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.searchClearButtonLabel,\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 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 =\n config.onSkinToneChange || emptyFunc;\n }, [config.onSkinToneChange]);\n\n return MutableConfigRef;\n}\n\nfunction emptyFunc() {}\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 EmojiListRef = React.useRef<HTMLUListElement>(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 EmojiListRef,\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 EmojiListRef: ElementRef<HTMLUListElement>;\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 EmojiListRef: 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 useEmojiListRef() {\n return useElementRef()['EmojiListRef'];\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 { elementCountInRow } 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 countInRow = elementCountInRow(categoryContent, element);\n\n const emojisInCurrentCategory = allVisibleEmojis(category);\n const currentEmojiIndex = emojisInCurrentCategory.indexOf(element);\n const indexInRow = currentEmojiIndex % countInRow;\n\n if (currentEmojiIndex === -1) {\n return null;\n }\n\n if (emojisInCurrentCategory[currentEmojiIndex - countInRow]) {\n return emojisInCurrentCategory[currentEmojiIndex - countInRow];\n }\n\n const prevVisibleCategory = prevCategory(category);\n\n if (!prevVisibleCategory) {\n return null;\n }\n\n const allPrevEmojis = allVisibleEmojis(prevVisibleCategory);\n\n // if there is an emoji in the same index of `indexInRow` in the previous category, return it\n // for this we need to find the last emoji in the previous category that shares the same indexInRow\n // this is by using the % operator to find the last emoji that matches\n\n const lastIndexInRow = (allPrevEmojis.length % countInRow) - 1;\n\n if (indexInRow > lastIndexInRow) {\n return allPrevEmojis.at(-1);\n }\n\n // otherwise, return the last emoji that shares the same indexInRow\n\n for (let i = allPrevEmojis.length - 1; i >= 0; i--) {\n if (i % countInRow === indexInRow) {\n return allPrevEmojis[i];\n }\n }\n\n return allPrevEmojis.at(-1);\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 countInRow = elementCountInRow(categoryContent, element);\n\n const emojisInCurrentCategory = allVisibleEmojis(category);\n const currentEmojiIndex = emojisInCurrentCategory.indexOf(element);\n\n if (currentEmojiIndex === -1) {\n return null;\n }\n\n // the remainder until the end of the row\n const remainder = countInRow - (currentEmojiIndex % countInRow) - 1;\n const firstInNextRow = currentEmojiIndex + remainder + 1;\n\n if (emojisInCurrentCategory[firstInNextRow]) {\n // if we have a next row, search in the next row for the last available emoji\n for (let p = currentEmojiIndex + countInRow; p % countInRow >= 0; p--) {\n if (emojisInCurrentCategory[p]) {\n return emojisInCurrentCategory[p];\n }\n }\n }\n\n const indexInRow = currentEmojiIndex % countInRow;\n\n const nextVisibleCategory = nextCategory(category);\n const emojisInNextCategory = allVisibleEmojis(nextVisibleCategory);\n\n if (emojisInNextCategory[indexInRow]) {\n return emojisInNextCategory[indexInRow];\n }\n\n return emojisInNextCategory.at(0) ?? null;\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 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\nexport function getLabelHeight(parentNode: NullableElement) {\n if (!parentNode) {\n return DEFAULT_LABEL_HEIGHT;\n }\n\n const label = parentNode.querySelector(asSelectors(ClassNames.label));\n\n if (label) {\n const height = label.getBoundingClientRect().height;\n if (height > 0) {\n return height;\n }\n }\n\n // fallback to default\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';\nimport { Dimensions } from '../virtualization/virtualizationHelpers';\n\n// eslint-disable-next-line max-params\nexport function preloadEmojiIfNeeded(\n emoji: undefined | DataEmoji,\n emojiStyles: EmojiStyle,\n scrollTop: number,\n clientHeight: number,\n topOffset: number,\n style: { top: number } | undefined,\n dimensions: Dimensions,\n getEmojiUrl: GetEmojiUrl\n): void {\n if (!emoji) {\n return;\n }\n\n if (emojiStyles === EmojiStyle.NATIVE) {\n return;\n }\n\n const unified = emojiUnified(emoji);\n\n if (preloadedEmojs.has(unified)) {\n return;\n }\n\n // preload only if the emoji is a few rows below the viewport\n if (!style || !dimensions) {\n return;\n }\n\n setTimeout(() => {\n const emojiTop = topOffset + style.top;\n const viewportBottom = scrollTop + clientHeight;\n\n const isJustBelowViewport =\n emojiTop >= viewportBottom &&\n emojiTop < viewportBottom + dimensions.emojiSize * 2;\n\n if (isJustBelowViewport) {\n preloadEmoji(getEmojiUrl, emoji, emojiStyles);\n }\n });\n}\n\nexport function preloadEmoji(\n getEmojiUrl: GetEmojiUrl,\n emoji: undefined | DataEmoji,\n emojiStyle: EmojiStyle\n): void {\n if (!emoji) {\n return;\n }\n\n const unified = emojiUnified(emoji);\n\n if (preloadedEmojs.has(unified)) {\n return;\n }\n preloadedEmojs.add(unified);\n\n emojiVariations(emoji)\n .concat(unified)\n .forEach(variation => {\n const emojiUrl = getEmojiUrl(variation, emojiStyle);\n preloadImage(emojiUrl);\n });\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 '--epr-skin-tone-outer-border-color':\n 'var(--epr-dark-skin-tone-outer-border-color)',\n '--epr-skin-tone-inner-border-color':\n 'var(--epr-dark-skin-tone-inner-border-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: 'height 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': '#e5f0fa',\n '--epr-hover-bg-color-reduced-opacity': '#e5f0fa80',\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 '--epr-skin-tone-outer-border-color': '#555555',\n '--epr-skin-tone-inner-border-color': 'var(--epr-bg-color)',\n\n '--epr-horizontal-padding': '10px',\n\n '--epr-picker-border-radius': '8px',\n\n /* Header */\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 '--epr-search-border-color': 'var(--epr-search-input-bg-color)',\n '--epr-search-border-color-active': 'var(--epr-highlight-color)',\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 '--epr-dark-skin-tone-outer-border-color':\n 'var(--epr-dark-picker-border-color)',\n '--epr-dark-skin-tone-inner-border-color': '#00000000'\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 {\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 style?: React.CSSProperties;\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 style\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 style={style}\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 style?: React.CSSProperties;\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 style\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 style={style}\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 useGetEmojiUrlConfig\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 const getEmojiUrl = useGetEmojiUrlConfig();\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 getEmojiUrl={getEmojiUrl}\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"," \n import { ReactNode, useEffect } from 'react';\nimport * as React from 'react';\n\nimport { useBodyRef } from '../components/context/ElementRefContext';\nimport { useActiveSkinToneState } from '../components/context/PickerContext';\nimport { ClickableEmoji } from '../components/emoji/Emoji';\nimport {\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useLazyLoadEmojisConfig,\n useSkinTonesDisabledConfig\n} from '../config/useConfig';\nimport { DataEmojis } from '../dataUtils/DataTypes';\nimport { emojiUnified } from '../dataUtils/emojiSelectors';\nimport {\n getEmojiPositionStyle,\n shouldVirtualize\n} from '../virtualization/virtualizationHelpers';\n\nimport { preloadEmojiIfNeeded } from './preloadEmoji';\nimport { useCategoryHeight } from './useCategoryHeight';\nimport { useIsEmojiDisallowed } from './useDisallowedEmojis';\nimport { useIsEmojiHidden } from './useIsEmojiHidden';\n\nexport function useEmojiVirtualization({\n categoryEmojis,\n topOffset,\n onHeightReady,\n scrollTop,\n isCategoryVisible\n}: {\n categoryEmojis: DataEmojis;\n topOffset: number;\n onHeightReady: (height: number) => void;\n scrollTop: number;\n isCategoryVisible: boolean;\n}) {\n const isEmojiHidden = useIsEmojiHidden();\n const lazyLoadEmojis = useLazyLoadEmojisConfig();\n const emojiStyle = useEmojiStyleConfig();\n const [activeSkinTone] = useActiveSkinToneState();\n const isEmojiDisallowed = useIsEmojiDisallowed();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const showVariations = !useSkinTonesDisabledConfig();\n const BodyRef = useBodyRef();\n\n let virtualizedCounter = 0;\n\n const emojisToPush = categoryEmojis.filter(emoji => {\n const isDisallowed = isEmojiDisallowed(emoji);\n const { failedToLoad, filteredOut, hidden } = isEmojiHidden(emoji);\n\n return !failedToLoad && !filteredOut && !hidden && !isDisallowed;\n });\n\n const dimensions = useCategoryHeight(emojisToPush.length);\n\n useEffect(() => {\n if (dimensions) {\n onHeightReady(dimensions.categoryHeight);\n }\n }, [dimensions, onHeightReady, emojisToPush.length]);\n\n const isVirtualized = (style: { top: number; left: number } | undefined) =>\n dimensions &&\n BodyRef.current &&\n shouldVirtualize({\n scrollTop,\n clientHeight: BodyRef.current?.clientHeight ?? 0,\n topOffset,\n style,\n dimensions\n });\n\n const emojis = emojisToPush.reduce((accumulator, emoji, index) => {\n const unified = emojiUnified(emoji, activeSkinTone);\n const style = getEmojiPositionStyle(dimensions, index);\n\n if (isVirtualized(style)) {\n virtualizedCounter++;\n preloadEmojiIfNeeded(\n emoji,\n emojiStyle,\n scrollTop,\n BodyRef.current?.clientHeight ?? 0,\n topOffset,\n style,\n dimensions,\n getEmojiUrl\n );\n return accumulator;\n }\n\n if (!isCategoryVisible) {\n virtualizedCounter++;\n return accumulator;\n }\n\n accumulator.push(\n <ClickableEmoji\n showVariations={showVariations}\n key={unified}\n emoji={emoji}\n unified={unified}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoadEmojis}\n getEmojiUrl={getEmojiUrl}\n style={{\n ...style,\n position: 'absolute'\n }}\n />\n );\n return accumulator;\n }, [] as ReactNode[]);\n\n return {\n virtualizedCounter,\n emojis,\n dimensions\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 * as React from 'react';\n\nimport { EmojiButtonSelector } from '../DomUtils/selectors';\nimport {\n useEmojiListRef,\n usePickerMainRef,\n} from '../components/context/ElementRefContext';\nimport {\n useReactionsModeState,\n useVisibleCategoriesState,\n useEmojiSizeState,\n} from '../components/context/PickerContext';\n\nconst EMOJI_SIZE_DEFAULT = 40;\n\nexport function useCategoryHeight(emojiCount: number):\n | {\n categoryHeight: number;\n emojisPerRow: number;\n emojiSize: number;\n }\n | undefined {\n const EmojiListRef = useEmojiListRef();\n const [isReactionsMode] = useReactionsModeState();\n const PickerMainRef = usePickerMainRef();\n const emojiSizeRef = React.useRef<number | undefined>();\n const [visibleCategories] = useVisibleCategoriesState();\n const [emojiSizeFromContext] = useEmojiSizeState();\n const [dimensions, setDimensions] = React.useState<{\n categoryHeight: number;\n emojisPerRow: number;\n emojiSize: number;\n }>();\n\n // Helper to compute and store dimensions based on current DOM\n const computeAndSetDimensions = React.useCallback(() => {\n const listEl = EmojiListRef.current;\n if (!listEl) return;\n\n const emojiElement = listEl.querySelector(\n EmojiButtonSelector,\n ) as HTMLElement | null;\n\n const measured = emojiElement?.clientHeight;\n if (measured) {\n emojiSizeRef.current = measured;\n }\n const emojiSize =\n emojiSizeFromContext ||\n measured ||\n emojiSizeRef.current ||\n EMOJI_SIZE_DEFAULT;\n const pickerWidth = listEl.clientWidth;\n\n if (pickerWidth === 0 || emojiSize === 0) return;\n\n const emojisPerRow = Math.max(1, Math.floor(pickerWidth / emojiSize));\n const rowCount = Math.ceil(emojiCount / emojisPerRow);\n const categoryHeight = rowCount * emojiSize;\n\n setDimensions({ categoryHeight, emojisPerRow, emojiSize });\n }, [EmojiListRef, emojiCount, emojiSizeFromContext]);\n\n // Recompute on data-count changes and when reactions mode toggles\n React.useEffect(() => {\n computeAndSetDimensions();\n }, [\n emojiCount,\n isReactionsMode,\n computeAndSetDimensions,\n visibleCategories.length,\n ]);\n\n // Listen to transitionend on the picker root (where height transition occurs)\n React.useEffect(() => {\n const rootEl = PickerMainRef.current;\n if (!rootEl) return;\n\n const handler = (e: Event) => {\n const te = e as TransitionEvent;\n const prop = te.propertyName;\n if (\n prop === 'width' ||\n prop === 'max-width' ||\n prop === 'min-width' ||\n prop === 'height' ||\n prop === 'max-height' ||\n prop === 'min-height'\n ) {\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(() => computeAndSetDimensions());\n } else {\n requestAnimationFrame(() => computeAndSetDimensions());\n }\n }\n };\n\n rootEl.addEventListener('transitionend', handler, {\n passive: true,\n });\n return () => {\n rootEl.removeEventListener('transitionend', handler);\n };\n }, [PickerMainRef, computeAndSetDimensions]);\n\n return dimensions;\n}\n","export function shouldVirtualize({\n scrollTop,\n clientHeight,\n topOffset,\n style,\n dimensions\n}: {\n scrollTop: number;\n clientHeight: number;\n topOffset: number;\n style: { top: number } | undefined;\n dimensions: Dimensions;\n}): boolean {\n if (!style || !dimensions) {\n return false;\n }\n\n const emojiTop = topOffset + style.top;\n const emojiBottom = emojiTop + dimensions.emojiSize;\n\n const isVisible =\n emojiBottom + dimensions.emojiSize * 2 >= scrollTop &&\n emojiTop <= scrollTop + clientHeight + dimensions.emojiSize;\n\n return !isVisible;\n}\n\nexport function getEmojiPositionStyle(dimensions: Dimensions, index: number) {\n return dimensions\n ? {\n top: Math.floor(index / dimensions.emojisPerRow) * dimensions.emojiSize,\n left: (index % dimensions.emojisPerRow) * dimensions.emojiSize\n }\n : undefined;\n}\n\n// preload emoji if it is one row below viewport\n\nexport type Dimensions =\n | {\n emojiSize: number;\n emojisPerRow: number;\n categoryHeight: number;\n }\n | undefined;\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 height?: number;\n}>;\n\nexport function EmojiCategory({\n categoryConfig,\n children,\n hidden,\n hiddenOnSearch,\n height\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)} style={{ height }}>\n {children}\n </div>\n </li>\n );\n}\n\nconst styles = stylesheet.create({\n category: {\n '.': ClassNames.category,\n minHeight:\n 'calc(var(--epr-emoji-fullsize) + var(--epr-category-label-height))',\n position: 'relative'\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\nimport {\n categoryFromCategoryConfig\n} from '../../config/categoryConfig';\nimport {\n useCategoriesConfig,\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useLazyLoadEmojisConfig\n} from '../../config/useConfig';\nimport {\n useGetEmojisByCategory,\n emojiUnified\n} from '../../dataUtils/emojiSelectors';\nimport { useActiveSkinToneState, useEmojiSizeState } from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nexport function MeasureEmoji() {\n const categories = useCategoriesConfig();\n const getEmojisByCategory = useGetEmojisByCategory();\n const emojiStyle = useEmojiStyleConfig();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const lazyLoadEmojis = useLazyLoadEmojisConfig();\n const [activeSkinTone] = useActiveSkinToneState();\n const [emojiSize, setEmojiSize] = useEmojiSizeState();\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (ref.current) {\n setEmojiSize(ref.current.clientHeight);\n }\n });\n\n if (emojiSize) {\n return null;\n }\n\n const firstCategory = categories[0];\n const dummyEmoji = getEmojisByCategory(\n categoryFromCategoryConfig(firstCategory)\n )[0];\n const unified = dummyEmoji\n ? emojiUnified(dummyEmoji, activeSkinTone)\n : '';\n\n if (!dummyEmoji) {\n return null;\n }\n\n return (\n <div ref={ref}>\n <ClickableEmoji\n emoji={dummyEmoji}\n unified={unified}\n emojiStyle={emojiStyle}\n getEmojiUrl={getEmojiUrl}\n lazyLoad={lazyLoadEmojis}\n showVariations={false}\n hidden={false}\n style={{\n opacity: 0,\n pointerEvents: 'none',\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: -1,\n height: 'var(--epr-emoji-fullsize)',\n width: 'var(--epr-emoji-fullsize)'\n }}\n />\n </div>\n );\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport { getLabelHeight } from '../../DomUtils/elementPositionInRow';\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n CategoryConfig,\n categoryFromCategoryConfig\n} from '../../config/categoryConfig';\nimport { useCategoriesConfig } from '../../config/useConfig';\nimport { DataEmojis } from '../../dataUtils/DataTypes';\nimport { useGetEmojisByCategory } from '../../dataUtils/emojiSelectors';\nimport { useEmojiVirtualization } from '../../hooks/useEmojiVirtualization';\nimport { useEmojiListRef } from '../context/ElementRefContext';\nimport { useVisibleCategoriesState } from '../context/PickerContext';\n\nimport { EmojiCategory } from './EmojiCategory';\nimport { MeasureEmoji } from './MeasureEmoji';\n\nexport function EmojiList({ scrollTop }: { scrollTop: number }) {\n const categories = useCategoriesConfig();\n const [categoryHeights, setCategoryHeights] = React.useState<{\n [key: string]: number;\n }>({});\n const EmojiListRef = useEmojiListRef();\n const getEmojisByCategory = useGetEmojisByCategory();\n\n const labelHeight = getLabelHeight(EmojiListRef.current);\n\n let topOffset = 0;\n return (\n <ul className={cx(styles.emojiList)} ref={EmojiListRef}>\n <MeasureEmoji />\n {categories.map(categoryConfig => {\n const category = categoryFromCategoryConfig(categoryConfig);\n\n const currentOffset = topOffset;\n const categoryHeight = categoryHeights[category];\n if (categoryHeight) {\n topOffset += categoryHeight + labelHeight;\n }\n\n return (\n <React.Suspense key={category}>\n <RenderCategory\n categoryEmojis={getEmojisByCategory(category)}\n categoryConfig={categoryConfig}\n topOffset={currentOffset}\n onHeightReady={height => {\n if (categoryHeights[category] !== height) {\n setCategoryHeights(prev => ({\n ...prev,\n [category]: height\n }));\n }\n }}\n scrollTop={scrollTop}\n />\n </React.Suspense>\n );\n })}\n </ul>\n );\n}\n\nfunction RenderCategory({\n categoryEmojis,\n categoryConfig,\n topOffset,\n onHeightReady,\n scrollTop\n}: {\n categoryEmojis: DataEmojis;\n categoryConfig: CategoryConfig;\n topOffset: number;\n onHeightReady: (height: number) => void;\n scrollTop: number;\n}) {\n const [visibleCategories] = useVisibleCategoriesState();\n\n const { virtualizedCounter, emojis, dimensions } = useEmojiVirtualization({\n categoryEmojis,\n topOffset,\n onHeightReady,\n scrollTop,\n isCategoryVisible: visibleCategories.includes(categoryConfig.category)\n });\n\n return (\n <EmojiCategory\n categoryConfig={categoryConfig}\n height={dimensions?.categoryHeight}\n // Indicates that there are no visible emojis\n // Hence, the category should be hidden\n hidden={!emojis.length && virtualizedCounter === 0}\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 { 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 const scrollTop = 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 scrollTop={scrollTop} />\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, useState } 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 const [scrollTop, setScrollTop] = useState(0);\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 setScrollTop(bodyRef?.scrollTop ?? 0);\n closeAllOpenToggles();\n }\n\n return () => {\n bodyRef?.removeEventListener('scroll', onScroll);\n };\n }, [BodyRef, closeAllOpenToggles]);\n\n return scrollTop;\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 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 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 border: '1px solid var(--epr-skin-tone-outer-border-color)',\n boxShadow: 'inset 0px 0px 0 1px var(--epr-skin-tone-inner-border-color)',\n ':hover': {\n boxShadow: '0 0 0 3px var(--epr-active-skin-hover-color), inset 0px 0px 0 1px var(--epr-skin-tone-inner-border-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': {\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 }\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 {\n useEmojiVariationPickerState,\n useReactionsModeState\n} 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 const [reactionsOpen] = useReactionsModeState();\n\n if (!previewConfig.showPreview) {\n return null;\n }\n\n return (\n <Flex\n className={cx(\n styles.preview,\n commonInteractionStyles.hiddenOnReactions,\n reactionsOpen && styles.hideOnReactions\n )}\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 hideOnReactions: {\n opacity: '0',\n transition: 'opacity 0.5s ease-in-out'\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","export function categoryNameFromDom($category: Element | null): string | null {\n return $category?.getAttribute('data-name') ?? null;\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';\nimport { useVisibleCategoriesState } from '../context/PickerContext';\n\nimport { CategoryButton } from './CategoryButton';\n\nexport function CategoryNavigation() {\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const [, setVisibleCategories] = useVisibleCategoriesState();\n const scrollCategoryIntoView = useScrollCategoryIntoView();\n useActiveCategoryScrollDetection({ setActiveCategory, setVisibleCategories });\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 scrollCategoryIntoView(category);\n setTimeout(() => {\n setActiveCategory(category);\n }, 10);\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,\n setVisibleCategories\n}: {\n setActiveCategory: (category: string) => void;\n setVisibleCategories: (categories: string[]) => void;\n}) {\n const BodyRef = useBodyRef();\n\n useEffect(() => {\n const visibleCategories = new Map<string, number>();\n const intersectingCategories = new Map<string, boolean>();\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\n if (!id) {\n continue;\n }\n\n visibleCategories.set(id, entry.intersectionRatio);\n intersectingCategories.set(id, entry.isIntersecting);\n }\n\n const ratios = Array.from(visibleCategories);\n const visibleCats = ratios\n .filter(([id, ratio]) => ratio > 0 || intersectingCategories.get(id))\n .map(([id]) => id);\n\n setVisibleCategories(visibleCats);\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 root: bodyRef,\n threshold: [0, 1]\n }\n );\n bodyRef?.querySelectorAll(asSelectors(ClassNames.category)).forEach(el => {\n observer.observe(el);\n });\n\n return () => {\n observer.disconnect();\n };\n }, [BodyRef, setActiveCategory, setVisibleCategories]);\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 { useSearchClearButtonLabelConfig } from '../../../config/useConfig';\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 const searchClearButtonLabel = useSearchClearButtonLabelConfig();\n\n return (\n <Button\n className={cx(\n styles.btnClearSearch,\n commonInteractionStyles.visibleOnSearchOnly\n )}\n onClick={clearSearch}\n aria-label={searchClearButtonLabel}\n title={searchClearButtonLabel}\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 { 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';\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 { 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 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 <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 onChange(event?.target?.value ?? value);\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-border-color)',\n width: '100%',\n ':focus': {\n backgroundColor: 'var(--epr-search-input-bg-color-active)',\n border: '1px solid var(--epr-search-border-color-active)'\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 { emojiByUnified } from './dataUtils/emojiSelectors';\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":["asArray","v","concat","isPsuedoSelector","selector","startsWith","isStyleCondition","isString","length","includes","slice","isImmediatePostcondition","isValidProperty","property","value","isCssVariables","isMediaQuery","joinTruthy","arr","delimiter","filter","Boolean","join","stableHash","prefix","seed","hash","toString","i","charCodeAt","joinedProperty","Rule","constructor","sheet","this","joined","joinedConditions","preconditions","postconditions","hasConditions","scopeClassName","name","key","selectors","mergeSelectors","right","left","genRule","replace","toLowerCase","handlePropertyValue","output","reduce","current","str","ClassNames","Selector","scopeName","setScope","count","addScope","addPrecondition","precondition","addPostcondition","postcondition","createRule","Sheet","rootNode","storedStyles","storedClasses","style","id","styleTag","createStyleTag","getStyle","append","css","base","line","apply","innerHTML","isApplied","document","createElement","type","head","appendChild","addRule","rule","storedClass","forIn","obj","fn","trim","cx","args","classes","arg","Set","push","Array","isArray","Object","entries","forEach","createSheet","create","styles","scopedStyles","iteratePreconditions","iterateStyles","className","add","addScopedStyle","bind","item","res","isDirectClass","mediaQuery","handleMediaQuery","chunkRows","addEachClass","cssVariablesBlock","list","to","asSelectors","classNames","_len","_key","arguments","map","c","stylesheet","hidden","display","opacity","pointerEvents","visibility","overflow","commonStyles","_extends","PickerStyleTag","React","suppressHydrationWarning","dangerouslySetInnerHTML","__html","commonInteractionStyles","categoryBtn","backgroundPositionY","hiddenOnSearch","visibleOnSearchOnly","hiddenOnReactions","transition","height","width","darkMode","_eprDarkTheme","_eprAutoTheme","compareConfig","prev","next","prevCustomEmojis","_prev$customEmojis","customEmojis","nextCustomEmojis","_next$customEmojis","open","emojiVersion","reactionsDefaultOpen","searchPlaceHolder","searchPlaceholder","searchClearButtonLabel","defaultSkinTone","skinTonesDisabled","autoFocusSearch","emojiStyle","theme","suggestedEmojisMode","lazyLoadEmojis","searchDisabled","skinTonePickerLocation","SuggestionMode","EmojiStyle","Theme","SkinTones","Categories","SkinTonePickerLocation","DEFAULT_REACTIONS","alphaNumericEmojiIndex","indexEmoji","emoji","emojiNames","flat","split","char","_alphaNumericEmojiInd","emojiUnified","useDebouncedState","initialValue","delay","_useState","useState","state","setState","timer","useRef","Promise","resolve","clearTimeout","_window","window","setTimeout","useDisallowedEmojis","DisallowedEmojisRef","emojiVersionConfig","usePickerConfig","useMemo","parseFloat","Number","isNaN","allEmojis","disallowedEmojis","supportedLevel","EmojiProperties","added_in","addedIn","addedInNewerVersion","PickerContextProvider","_ref","dispatch","children","filterRef","disallowClickRef","disallowMouseRef","disallowedEmojisRef","suggestedUpdateState","Date","now","searchTerm","skinToneFanOpenState","activeSkinTone","activeCategoryState","emojisThatFailedToLoadState","emojiVariationPickerState","reactionsModeState","isPastInitialLoad","setIsPastInitialLoad","visibleCategoriesState","emojiSizeState","useEffect","PickerContext","Provider","searchIndex","NEUTRAL","useFilterRef","useDisallowMouseRef","useReactionsModeState","useSearchTermState","useActiveSkinToneState","useEmojisThatFailedToLoadState","useEmojiVariationPickerState","useSkinToneFanOpenState","useVisibleCategoriesState","useEmojiSizeState","useUpdateSuggested","suggestedUpdated","setsuggestedUpdate","categoriesOrdered","SUGGESTED","CUSTOM","SMILEYS_PEOPLE","ANIMALS_NATURE","FOOD_DRINK","TRAVEL_PLACES","ACTIVITIES","OBJECTS","SYMBOLS","FLAGS","SuggestedRecent","category","configByCategory","_configByCategory","baseCategoriesConfig","modifiers","categoryFromCategoryConfig","categoryNameFromCategoryConfig","getBaseConfigByCategory","modifier","assign","CDN_URL_APPLE","CDN_URL_FACEBOOK","CDN_URL_TWITTER","CDN_URL_GOOGLE","skinToneVariations","LIGHT","MEDIUM_LIGHT","MEDIUM","MEDIUM_DARK","DARK","skinTonesNamed","acc","skinTonesMapped","mapped","skinTone","_Object$assign","SUGGESTED_LS_KEY","getSuggested","mode","_window$localStorage$","_window2","localStorage","recent","JSON","parse","getItem","FREQUENT","sort","a","b","_unused","_emoji$EmojiPropertie","emojiName","unifiedWithoutSkinTone","unified","splat","splice","emojiHasVariations","_emojiVariationUnifie","emojiVariations","find","variation","emojiVariationUnified","useGetEmojisByCategory","suggestedEmojisModeConfig","suggested","_getSuggested","s","emojiByUnified","_emojis$category","emojis","emojiUrlByUnified","TWITTER","GOOGLE","FACEBOOK","APPLE","cdnUrl","_emoji$EmojiPropertie2","variations","allEmojisByUnified","withoutSkinTone","values","Emoji","KNOWN_FAILING_EMOJIS","DEFAULT_SEARCH_PLACEHOLDER","DEFAULT_SEARCH_CLEAR_BUTTON_LABEL","SEARCH_RESULTS_SUFFIX","SEARCH_RESULTS_ONE_RESULT_FOUND","SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND","mergeConfig","userConfig","basePickerConfig","previewConfig","_userConfig$previewCo","config","categories","userCategoriesConfig","extra","suggestionMode","RECENT","_userCategoriesConfig","mergeCategoriesConfig","hiddenEmojis","unicodeToHide","_config$customEmojis","emojiData","names","imgUrl","customToRegularEmoji","PREVIEW","getEmojiUrl","basePreviewConfig","SEARCH","reactions","allowExpandReactions","defaultEmoji","defaultCaption","showPreview","ConfigContext","PickerConfigProvider","mergedConfig","_React$useState","setMergedConfig","useSetConfig","_objectWithoutPropertiesLoose","_excluded","MOUSE_EVENT_SOURCE","MutableConfigContext","useMutableConfig","emptyFunc","useAllowExpandReactions","useSkinTonesDisabledConfig","useEmojiStyleConfig","useCategoriesConfig","usePreviewConfig","useLazyLoadEmojisConfig","useSearchDisabledConfig","useSkinTonePickerLocationConfig","useGetEmojiUrlConfig","getDimension","dimensionConfig","useIsSearchMode","focusElement","element","requestAnimationFrame","focus","focusPrevElementSibling","previousElementSibling","focusNextElementSibling","nextElementSibling","focusFirstElementChild","firstElementChild","getActiveElement","activeElement","ElementRefContextProvider","PickerMainRef","AnchoredEmojiRef","BodyRef","EmojiListRef","SearchInputRef","SkinTonePickerRef","CategoryNavigationRef","VariationPickerRef","ReactionsRef","ElementRefContext","KeyboardEvents","useElementRef","useEmojiListRef","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","focusNextVisibleEmoji","nextVisibleEmoji","nextCategory","useCloseAllOpenToggles","_useEmojiVariationPic","setVariationPicker","_useSkinToneFanOpenSt","skinToneFanOpen","setSkinToneFanOpen","useCallback","useHasOpenToggles","useAllowMouseMove","DisallowMouseRef","useIsMouseDisallowed","useFocusSearchInput","useFocusCategoryNavigation","useClearSearch","applySearch","useApplySearch","focusSearchInput","setSearchTerm","then","hasMatch","keyword","some","getNormalizedSearchTerm","useSetVariationPicker","setAnchoredEmojiRef","setEmojiVariationPicker","emojiFromElement","useIsSkinToneInSearch","useIsSkinToneInPreview","useKeyboardNavigation","focusSkinTonePicker","setSkinToneFanOpenState","goDownFromSearchInput","isSkinToneInSearch","onKeyDown","clearSearch","hasOpenToggles","disallowMouseMove","closeAllOpenToggles","event","Escape","preventDefault","addEventListener","removeEventListener","usePickerMainKeyboardEvents","useGoDownFromSearchInput","firstEmoji","ArrowRight","ArrowDown","Enter","click","_useSkinToneFanOpenSt2","isOpen","setIsOpen","isSkinToneInPreview","onType","useOnType","ArrowLeft","focusNextSkinTone","focusPrevSkinTone","ArrowUp","useSkinTonePickerKeyboardEvents","useCategoryNavigationKeyboardEvents","focusCategoryNavigation","isSearchMode","goUpFromBody","buttonFromTarget","prevVisibleEmoji","lastVisibleEmoji","prevCategory","focusPrevVisibleEmoji","categoryContent","closestCategoryContent","countInRow","elementCountInRow","emojisInCurrentCategory","allVisibleEmojis","currentEmojiIndex","indexOf","p","indexInRow","emojisInNextCategory","_emojisInNextCategory","at","visibleEmojiOneRowDown","focusVisibleEmojiOneRowDown","exitUp","prevVisibleCategory","allPrevEmojis","visibleEmojiOneRowUp","focusVisibleEmojiOneRowUp","Space","useBodyKeyboardEvents","exitLeft","currentSkinTone","appendSearch","metaKey","ctrlKey","altKey","hasModifier","match","preloadEmoji","preloadedEmojs","has","url","Image","src","DEFAULT_LABEL_HEIGHT","PickerMain","PickerRootElement","_ref2","reactionsMode","searchModeActive","_usePickerConfig16","useStyleConfig","NATIVE","bodyRef","onFocus","button","_ref3","styleProps","main","baseVariables","darkTheme","AUTO","autoThemeDark","_cx","searchActive","reactionsMenu","ref","DarkTheme","emojiPicker","position","flexDirection","borderWidth","borderStyle","borderRadius","borderColor","backgroundColor","boxSizing","fontFamily","autoTheme","backdropFilter","parentWidth","getBoundingClientRect","elementWidth","Math","floor","getLabelHeight","parentNode","label","querySelector","EmojiButtonSelector","VisibleEmojiSelector","visible","emojiElement","_emojiElement$closest","originalUnified","originalUnifiedFromEmojiElement","unifiedFromEmojiElement","elementHeight","_element$clientHeight","clientHeight","emojiTrueOffsetTop","labelHeight","elementOffsetTop","categoryWithoutLabel","_category$clientHeigh","_categoryWithoutLabel","matches","_closestScrollBody$sc","_closestScrollBody","_element$closest","_element$offsetTop","offsetTop","elementOffsetLeft","_element$offsetLeft","offsetLeft","_elementDataSetKey","_elementDataSet$key","_element$dataset","dataset","elementDataSet","allUnifiedFromEmojiElement","isVisibleEmoji","classList","contains","isHidden","from","querySelectorAll","last","elements","maxVisibilityDiffThreshold","parentTop","parentBottom","bottom","parentTopWithLabel","elementTop","elementBottom","maxVisibilityDiffPixels","elementTopWithAllowedDiff","elementBottomWithAllowedDiff","firstVisibleElementInContainer","parseNativeEmoji","hex","String","fromCodePoint","parseInt","isCustomEmoji","undefined","useMouseDownHandlers","ContainerRef","mouseEventSource","mouseDownTimerRef","onEmojiClick","setReactionsOpen","handler","onReactionClick","REACTIONS","collapseToReactions","o","_len2","_key2","useOnEmojiClickConfig","updateSuggested","activeEmojiStyle","onClick","_emojiFromEvent","emojiFromEvent","skinToneToUse","suspectedSkinTone","activeVariationFromUnified","nextList","existing","original","min","_window3","setItem","stringify","_unused2","setSuggested","getImageUrl","imageUrl","isCustom","emojiClickOutput","onMouseDown","onMouseUp","confainerRef","passive","_element$parentElemen","parentElement","Button","props","cursor","border","background","outline","ClickableEmojiButton","_ref$showVariations","showVariations","hasVariations","_ref$noBackground","noBackground","getAriaLabel","_emojiNames$","alignItems","justifyContent","maxWidth","maxHeight","content","borderLeft","borderRight","transform","borderBottom","zIndex","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","reaction","emojiButton","listStyle","margin","useEmojiVirtualization","isUnicodeHidden","emojisThatFailedToLoad","isEmojiFiltered","categoryEmojis","topOffset","onHeightReady","isCategoryVisible","isEmojiHidden","_filter$searchTerm","isEmojiFilteredBySearchTerm","failedToLoad","filteredOut","isEmojiDisallowed","virtualizedCounter","emojisToPush","isDisallowed","_isEmojiHidden","dimensions","emojiCount","isReactionsMode","emojiSizeRef","visibleCategories","emojiSizeFromContext","setDimensions","computeAndSetDimensions","listEl","measured","emojiSize","pickerWidth","clientWidth","emojisPerRow","max","rowCount","ceil","categoryHeight","rootEl","e","prop","propertyName","queueMicrotask","useCategoryHeight","accumulator","index","_BodyRef$current$clie2","_BodyRef$current2","getEmojiPositionStyle","_BodyRef$current$clie","_BodyRef$current","emojiTop","shouldVirtualize","isVirtualized","viewportBottom","preloadEmojiIfNeeded","EmojiCategory","categoryConfig","categoryName","gridGap","gridTemplateColumns","fontWeight","textTransform","MeasureEmoji","getEmojisByCategory","_useEmojiSizeState","setEmojiSize","dummyEmoji","EmojiList","categoryHeights","setCategoryHeights","emojiList","currentOffset","RenderCategory","_extends2","_useEmojiVirtualizati","Direction","EmojiVariationPicker","pointerStyle","_useVariationPickerTo","direction","Up","getMenuDirection","getTop","emojiOffsetTop","_bodyRef$scrollTop","buttonHeight","Down","useVariationPickerTop","getPointerStyle","emojiTruOffsetLeft","usePointerStyle","pointingUp","pointer","boxShadow","transformOrigin","backgroundPosition","Body","setScrollTop","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","SkinTonePickerMenu","SkinTonePicker","VERTICAL","HORIZONTAL","isDisabled","_useActiveSkinToneSta","setActiveSkinTone","onSkinToneChange","fullWidth","expandedSize","ITEM_SIZE","vertical","skinTones","verticalShadow","flexBasis","select","Preview","preview","hideOnReactions","PreviewBody","previewEmoji","setPreviewEmoji","variationPickerEmoji","allow","onEscape","onMouseOver","onEnter","onLeave","_allUnifiedFromEmojiE","relatedTarget","belowFoldByPx","buttonRect","bodyRect","y","detectEmojyPartiallyBelowFold","_allUnifiedFromEmojiE2","_document$activeEleme","blur","handlePartiallyVisibleElementFocus","useEmojiPreviewEvents","_previewEmoji$unified","show","defaultText","borderTop","categoryNameFromDom","$category","_$category$getAttribu","getAttribute","CategoryButton","isActiveCategory","allowNavigation","catBtn","role","DarkActivePositionY","DarkPositionY","DarkInactivePosition","backgroundPositionX","CategoryNavigation","activeCategory","setActiveCategory","setVisibleCategories","scrollCategoryIntoView","Map","intersectingCategories","observer","IntersectionObserver","_step","_iterator","_createForOfIteratorHelperLoose","done","entry","set","intersectionRatio","isIntersecting","ratios","visibleCats","get","lastCategory","_i","_ratios","_ratios$_i","threshold","el","observe","disconnect","useActiveCategoryScrollDetection","customCategoryConfig","categoriesConfig","hideCustomCategory","nav","isCustomCategory","BtnClearSearch","useSearchClearButtonLabelConfig","btnClearSearch","icnClearnSearch","HoverDark","SVGTimes","IcnSearch","icnSearch","SearchContainer","overlay","Search","_usePickerConfig","placeholder","_find","autoFocus","_useFilter","setFilterRef","setFilter","setter","useSetFilterRef","statusSearchResults","filterState","searchResultsCount","_Object$entries","getStatusSearchResults","onChange","inputValue","nextValue","longestMatch","dict","longestMatchingKey","keys","findLongestMatch","filtered","filterEmojiObjectByKeyword","useFilter","input","searchContainer","search","_event$target$value","_event$target","visuallyHidden","clip","clipPath","whiteSpace","Header","EmojiPicker","ContentControl","renderAll","setRenderAll","ExpandedPickerContent","ErrorBoundary","_React$Component","_this","call","hasError","getDerivedStateFromError","_proto","prototype","componentDidCatch","error","errorInfo","console","render","ExportedEmoji","_ref$size","_ref$emojiStyle","emojiUrl","MutableConfigRef","useDefineMutableConfig","EmojiPickerReact"],"ignoreList":[],"sourceRoot":""}
1
+ {"version":3,"file":"329.min.js","mappings":"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","sources":["webpack://MoveoAI/./node_modules/flairup/src/utils/asArray.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/is.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/joinTruthy.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/stableHash.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/stringManipulators.ts","webpack://MoveoAI/./node_modules/flairup/src/Rule.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/classNames.ts","webpack://MoveoAI/./node_modules/flairup/src/Sheet.ts","webpack://MoveoAI/./node_modules/flairup/src/utils/forIn.ts","webpack://MoveoAI/./node_modules/flairup/src/cx.ts","webpack://MoveoAI/./node_modules/flairup/src/index.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/Stylesheet/stylesheet.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/compareConfig.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Reactions/DEFAULT_REACTIONS.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/types/exposedTypes.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/alphaNumericEmojiIndex.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useDebouncedState.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useDisallowedEmojis.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/useConfig.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/emojiSelectors.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/context/PickerContext.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useInitialLoad.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/categoryConfig.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/cdnUrls.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/DataTypes.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/data/skinToneVariations.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/suggested.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/config.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/context/PickerConfigContext.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/config/mutableConfig.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useIsSearchMode.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/focusElement.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/getActiveElement.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/context/ElementRefContext.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useKeyboardNavigation.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/scrollTo.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/selectors.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/keyboardNavigation.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useCloseAllOpenToggles.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useDisallowMouseMove.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useFocus.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useFilter.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useSetVariationPicker.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useShouldShowSkinTonePicker.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/elementPositionInRow.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/preloadEmoji.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/main/PickerMain.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useOnFocus.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/dataUtils/parseNativeEmoji.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/typeRefinements/typeRefinements.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useMouseDownHandlers.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/atoms/Button.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/ClickableEmojiButton.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/emojiStyles.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/EmojiImg.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/NativeEmoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/ViewOnlyEmoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/Emoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Reactions/BtnPlus.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Reactions/Reactions.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useEmojiVirtualization.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useHideEmojisByUniocode.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useIsEmojiHidden.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useCategoryHeight.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/virtualization/virtualizationHelpers.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/EmojiCategory.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/MeasureEmoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/EmojiList.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/EmojiVariationPicker.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/body/Body.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useOnScroll.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Layout/Flex.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Layout/Space.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Layout/Absolute.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/Layout/Relative.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/SkinTonePicker/BtnSkinToneVariation.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/SkinTonePicker/SkinTonePicker.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/footer/Preview.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useEmojiPreviewEvents.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/detectEmojyPartiallyBelowFold.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/DomUtils/categoryNameFromDom.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/navigation/CategoryButton.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/navigation/CategoryNavigation.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useScrollCategoryIntoView.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useActiveCategoryScrollDetection.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/hooks/useShouldHideCustomEmojis.ts","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/Search/BtnClearSearch.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/Search/IcnSearch.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/Search/Search.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/header/Header.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/EmojiPickerReact.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/ErrorBoundary.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/components/emoji/ExportedEmoji.tsx","webpack://MoveoAI/./node_modules/emoji-picker-react/src/index.tsx"],"sourcesContent":["export function asArray<T>(v: T | T[]): T[] {\n return [].concat(v as unknown as []);\n}\n","import { ClassName } from '../types.js';\n\nexport function isPsuedoSelector(selector: string): boolean {\n return selector.startsWith(':');\n}\n\nexport function isStyleCondition(selector: string): boolean {\n return (\n isString(selector) &&\n (selector === '*' ||\n (selector.length > 1 && ':>~.+*'.includes(selector.slice(0, 1))) ||\n isImmediatePostcondition(selector))\n );\n}\n\nexport function isValidProperty(\n property: string,\n value: unknown,\n): value is string {\n return (\n (isString(value) || typeof value === 'number') &&\n !isCssVariables(property) &&\n !isPsuedoSelector(property) &&\n !isMediaQuery(property)\n );\n}\n\nexport function isMediaQuery(selector: string): boolean {\n return selector.startsWith('@media');\n}\n\nexport function isDirectClass(selector: string): boolean {\n return selector === '.';\n}\n\nexport function isCssVariables(selector: string): boolean {\n return selector === '--';\n}\n\nexport function isString(value: unknown): value is string {\n return value + '' === value;\n}\n\nexport function isClassName(value: unknown): value is ClassName {\n return isString(value) && value.length > 1 && value.startsWith('.');\n}\n\nexport function isImmediatePostcondition(\n value: unknown,\n): value is `&${string}` {\n return isString(value) && (value.startsWith('&') || isPsuedoSelector(value));\n}\n","export function joinTruthy(arr: unknown[], delimiter: string = ''): string {\n return arr.filter(Boolean).join(delimiter);\n}\n","// Stable hash function.\nexport function stableHash(prefix: string, seed: string): string {\n let hash = 0;\n if (seed.length === 0) return hash.toString();\n for (let i = 0; i < seed.length; i++) {\n const char = seed.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return `${prefix ?? 'cl'}_${hash.toString(36)}`;\n}\n","// Some properties need special handling\nexport function handlePropertyValue(property: string, value: string): string {\n if (property === 'content') {\n return `\"${value}\"`;\n }\n\n return value;\n}\n\nexport function camelCaseToDash(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\nexport function joinedProperty(property: string, value: string): string {\n return `${property}:${value}`;\n}\n\nexport function toClass(str: string): string {\n return str ? `.${str}` : '';\n}\n\nexport function appendString(base: string, line: string): string {\n return base ? `${base}\\n${line}` : line;\n}\n","import { Sheet } from './Sheet';\nimport { asArray } from './utils/asArray';\nimport { isImmediatePostcondition, isPsuedoSelector } from './utils/is';\nimport { joinTruthy } from './utils/joinTruthy';\nimport { stableHash } from './utils/stableHash';\nimport {\n camelCaseToDash,\n handlePropertyValue,\n joinedProperty,\n toClass,\n} from './utils/stringManipulators';\n\nexport class Rule {\n public hash: string;\n public joined: string;\n public key: string;\n\n constructor(\n private sheet: Sheet,\n public property: string,\n public value: string,\n private selector: Selector,\n ) {\n this.property = property;\n this.value = value;\n this.joined = joinedProperty(property, value);\n const joinedConditions = this.selector.preconditions.concat(\n this.selector.postconditions,\n );\n this.hash = this.selector.hasConditions\n ? (this.selector.scopeClassName as string)\n : stableHash(this.sheet.name, this.joined);\n this.key = joinTruthy([this.joined, joinedConditions, this.hash]);\n }\n\n public toString(): string {\n let selectors = mergeSelectors(this.selector.preconditions, {\n right: this.hash,\n });\n\n selectors = mergeSelectors(this.selector.postconditions, {\n left: selectors,\n });\n\n return `${selectors} {${Rule.genRule(this.property, this.value)}}`;\n }\n\n static genRule(property: string, value: string): string {\n const transformedProperty = camelCaseToDash(property);\n return (\n joinedProperty(\n transformedProperty,\n handlePropertyValue(property, value),\n ) + ';'\n );\n }\n}\n\nexport function mergeSelectors(\n selectors: string[],\n { left = '', right = '' }: { left?: string; right?: string } = {},\n): string {\n const output = selectors.reduce((selectors, current) => {\n if (isPsuedoSelector(current)) {\n return selectors + current;\n }\n\n if (isImmediatePostcondition(current)) {\n return selectors + current.slice(1);\n }\n\n return joinTruthy([selectors, current], ' ');\n\n // selector then postcondition\n }, left);\n\n // preconditions, then selector\n return joinTruthy([output, toClass(right)], ' ');\n}\n\nexport class Selector {\n public preconditions: string[] = [];\n public scopeClassName: string | null = null;\n public scopeName: string | null = null;\n public postconditions: string[] = [];\n\n constructor(\n private sheet: Sheet,\n scopeName: string | null = null,\n {\n preconditions,\n postconditions,\n }: {\n preconditions?: string[] | string | undefined;\n postconditions?: string[] | string | undefined;\n } = {},\n ) {\n this.preconditions = preconditions ? asArray(preconditions) : [];\n this.postconditions = postconditions ? asArray(postconditions) : [];\n this.setScope(scopeName);\n }\n\n private setScope(scopeName: string | null): Selector {\n if (!scopeName) {\n return this;\n }\n\n if (!this.scopeClassName) {\n this.scopeName = scopeName;\n this.scopeClassName = stableHash(\n this.sheet.name,\n // adding the count guarantees uniqueness across style.create calls\n scopeName + this.sheet.count,\n );\n }\n\n return this;\n }\n\n get hasConditions(): boolean {\n return this.preconditions.length > 0 || this.postconditions.length > 0;\n }\n\n addScope(scopeName: string): Selector {\n return new Selector(this.sheet, scopeName, {\n preconditions: this.preconditions,\n postconditions: this.postconditions,\n });\n }\n\n addPrecondition(precondition: string): Selector {\n return new Selector(this.sheet, this.scopeClassName, {\n postconditions: this.postconditions,\n preconditions: this.preconditions.concat(precondition),\n });\n }\n\n addPostcondition(postcondition: string): Selector {\n return new Selector(this.sheet, this.scopeClassName, {\n preconditions: this.preconditions,\n postconditions: this.postconditions.concat(postcondition),\n });\n }\n\n createRule(property: string, value: string): Rule {\n return new Rule(this.sheet, property, value, this);\n }\n}\n","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 { Rule } from './Rule.js';\nimport { StoredStyles } from './types.js';\nimport { isString } from './utils/is.js';\nimport { appendString } from './utils/stringManipulators.js';\n\nexport class Sheet {\n private styleTag: HTMLStyleElement | undefined;\n\n // Hash->css\n private storedStyles: StoredStyles = {};\n\n // styles->hash\n private storedClasses: Record<string, string> = {};\n private style: string = '';\n public count = 0;\n public id: string;\n\n constructor(\n public name: string,\n private rootNode?: HTMLElement | null,\n ) {\n this.id = `flairup-${name}`;\n\n this.styleTag = this.createStyleTag();\n }\n\n getStyle(): string {\n return this.style;\n }\n\n append(css: string): void {\n this.style = appendString(this.style, css);\n }\n\n apply(): void {\n this.count++;\n\n if (!this.styleTag) {\n return;\n }\n\n this.styleTag.innerHTML = this.style;\n }\n\n isApplied(): boolean {\n return !!this.styleTag;\n }\n\n createStyleTag(): HTMLStyleElement | undefined {\n // check that we're in the browser and have access to the DOM\n if (\n typeof document === 'undefined' ||\n this.isApplied() ||\n // Explicitly disallow mounting to the DOM\n this.rootNode === null\n ) {\n return this.styleTag;\n }\n\n const styleTag = document.createElement('style');\n styleTag.type = 'text/css';\n styleTag.id = this.id;\n (this.rootNode ?? document.head).appendChild(styleTag);\n return styleTag;\n }\n\n addRule(rule: Rule): string {\n const storedClass = this.storedClasses[rule.key];\n\n if (isString(storedClass)) {\n return storedClass;\n }\n\n this.storedClasses[rule.key] = rule.hash;\n this.storedStyles[rule.hash] = [rule.property, rule.value];\n\n this.append(rule.toString());\n return rule.hash;\n }\n}\n","export function forIn<O extends Record<string, unknown>>(\n obj: O,\n fn: (key: string, value: O[string]) => void,\n): void {\n for (const key in obj) {\n fn(key.trim(), obj[key]);\n }\n}\n","import { joinTruthy } from './utils/joinTruthy';\n\nexport function cx(...args: unknown[]): string {\n const classes = args.reduce((classes: string[], arg) => {\n if (arg instanceof Set) {\n classes.push(...arg);\n } else if (typeof arg === 'string') {\n classes.push(arg);\n } else if (Array.isArray(arg)) {\n classes.push(cx(...arg));\n } else if (typeof arg === 'object') {\n // @ts-expect-error - it is a string\n Object.entries(arg).forEach(([key, value]) => {\n if (value) {\n classes.push(key);\n }\n });\n }\n\n return classes;\n }, [] as string[]);\n\n return joinTruthy(classes, ' ').trim();\n}\n","import { Rule, Selector, mergeSelectors } from './Rule.js';\nimport { Sheet } from './Sheet.js';\nimport {\n CSSVariablesObject,\n ClassSet,\n CreateSheetInput,\n DirectClass,\n ScopedStyles,\n Styles,\n createSheetReturn,\n} from './types.js';\nimport { asArray } from './utils/asArray.js';\nimport { forIn } from './utils/forIn.js';\nimport {\n isCssVariables,\n isDirectClass,\n isMediaQuery,\n isStyleCondition,\n isValidProperty,\n} from './utils/is.js';\n\nexport { cx } from './cx.js';\n\nexport type { CreateSheetInput, Styles };\n\nexport function createSheet(\n name: string,\n rootNode?: HTMLElement | null,\n): createSheetReturn {\n const sheet = new Sheet(name, rootNode);\n\n return {\n create,\n getStyle: sheet.getStyle.bind(sheet),\n isApplied: sheet.isApplied.bind(sheet),\n };\n\n function create<K extends string>(styles: CreateSheetInput<K>) {\n const scopedStyles: ScopedStyles<K> = {} as ScopedStyles<K>;\n\n iteratePreconditions(sheet, styles, new Selector(sheet)).forEach(\n ([scopeName, styles, selector]) => {\n iterateStyles(sheet, styles as Styles, selector).forEach(\n (className) => {\n addScopedStyle(scopeName as K, className);\n },\n );\n },\n );\n\n // Commit the styles to the sheet.\n // Done only once per create call.\n // This way we do not update the DOM on every style.\n sheet.apply();\n\n return scopedStyles;\n\n function addScopedStyle(name: K, className: string) {\n scopedStyles[name as keyof ScopedStyles<K>] =\n scopedStyles[name as keyof ScopedStyles<K>] ?? new Set<string>();\n scopedStyles[name as keyof ScopedStyles<K>].add(className);\n }\n }\n}\n\n// This one plucks out all of the preconditions\n// and creates selector objects from them\nfunction iteratePreconditions(\n sheet: Sheet,\n styles: Styles,\n selector: Selector,\n) {\n const output: Array<[string, Styles, Selector]> = [];\n\n forIn(styles, (key: string, value) => {\n if (isStyleCondition(key)) {\n return iteratePreconditions(\n sheet,\n value as Styles,\n selector.addPrecondition(key),\n ).forEach((item) => output.push(item));\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - this is a valid case\n output.push([key, styles[key], selector.addScope(key)]);\n });\n\n return output;\n}\n\nfunction iterateStyles(\n sheet: Sheet,\n styles: Styles,\n selector: Selector,\n): ClassSet {\n const output: ClassSet = new Set<string>();\n // eslint-disable-next-line max-statements\n forIn(styles, (property, value) => {\n let res: string[] | Set<string> = [];\n\n // Postconditions\n if (isStyleCondition(property)) {\n res = iterateStyles(\n sheet,\n value as Styles,\n selector.addPostcondition(property),\n );\n // Direct classes: \".\": \"className\"\n } else if (isDirectClass(property)) {\n res = asArray(value as DirectClass);\n } else if (isMediaQuery(property)) {\n res = handleMediaQuery(sheet, value as Styles, property, selector);\n\n // \"--\": { \"--variable\": \"value\" }\n } else if (isCssVariables(property)) {\n res = cssVariablesBlock(sheet, value as CSSVariablesObject, selector);\n\n // \"property\": \"value\"\n } else if (isValidProperty(property, value)) {\n const rule = selector.createRule(property, value);\n sheet.addRule(rule);\n output.add(rule.hash);\n }\n\n return addEachClass(res, output);\n });\n\n return output;\n}\n\nfunction addEachClass(list: string[] | Set<string>, to: Set<string>) {\n list.forEach((className) => to.add(className));\n return to;\n}\n\n// eslint-disable-next-line max-statements\nfunction cssVariablesBlock(\n sheet: Sheet,\n styles: CSSVariablesObject,\n selector: Selector,\n) {\n const classes: ClassSet = new Set<string>();\n\n const chunkRows: string[] = [];\n forIn(styles, (property: string, value) => {\n if (isValidProperty(property, value)) {\n chunkRows.push(Rule.genRule(property, value));\n return;\n }\n const res = iterateStyles(sheet, value ?? {}, selector);\n addEachClass(res, classes);\n });\n\n if (!selector.scopeClassName) {\n return classes;\n }\n\n if (chunkRows.length) {\n const output = chunkRows.join(' ');\n sheet.append(\n `${mergeSelectors(selector.preconditions, {\n right: selector.scopeClassName,\n })} {${output}}`,\n );\n }\n\n classes.add(selector.scopeClassName);\n return classes;\n}\n\nfunction handleMediaQuery(\n sheet: Sheet,\n styles: Styles,\n mediaQuery: string,\n selector: Selector,\n) {\n sheet.append(mediaQuery + ' {');\n\n // iterateStyles will internally append each rule to the sheet\n // as needed. All we have to do is just open the block and close it after.\n const output = iterateStyles(sheet, styles, selector);\n\n sheet.append('}');\n\n return output;\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.searchClearButtonLabel === next.searchClearButtonLabel &&\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 { 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 { 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';\n\nimport { usePickerConfig } from '../components/context/PickerConfigContext';\nimport { useReactionsModeState } from '../components/context/PickerContext';\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 DEFAULT_SEARCH_CLEAR_BUTTON_LABEL,\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 useSearchClearButtonLabelConfig(): string {\n const { searchClearButtonLabel } = usePickerConfig();\n return searchClearButtonLabel ?? DEFAULT_SEARCH_CLEAR_BUTTON_LABEL;\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 const [, setReactionsOpen] = useReactionsModeState();\n\n const handler = current.onEmojiClick || (() => {});\n const { onReactionClick } = current;\n\n if (mouseEventSource === MOUSE_EVENT_SOURCE.REACTIONS && onReactionClick) {\n return (...args) =>\n onReactionClick(...args, {\n collapseToReactions: () => {\n setReactionsOpen(o => o);\n }\n });\n }\n\n return (...args) => {\n handler(...args, {\n collapseToReactions: () => {\n setReactionsOpen(true);\n }\n });\n };\n}\n\nexport function useOnSkinToneChangeConfig(): (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 { useUpdateSuggested } from '../components/context/PickerContext';\nimport { Categories } from '../config/categoryConfig';\nimport { cdnUrl } from '../config/cdnUrls';\nimport { CustomEmoji } from '../config/customEmojiConfig';\nimport { useSuggestedEmojisModeConfig } from '../config/useConfig';\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';\nimport { getSuggested } from './suggested';\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 useGetEmojisByCategory(): (Category: Categories) => DataEmojis {\n const suggestedEmojisModeConfig = useSuggestedEmojisModeConfig();\n const [suggestedUpdated] = useUpdateSuggested();\n\n const suggested = React.useMemo(\n () => {\n const suggested = getSuggested(suggestedEmojisModeConfig) ?? [];\n\n return suggested\n .map(s => emojiByUnified(s.unified))\n .filter(Boolean) as DataEmojis;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [suggestedUpdated, suggestedEmojisModeConfig]\n );\n\n return function getEmojisByCategory(category: Categories): DataEmojis {\n if (category === Categories.SUGGESTED) {\n return suggested;\n }\n\n // @ts-ignore\n return emojis[category] ?? [];\n };\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 * 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 const visibleCategoriesState = useState<string[]>([]);\n const emojiSizeState = useState<number | null>(null);\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 visibleCategoriesState,\n emojiSizeState\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 visibleCategoriesState: ReactState<Array<string>>;\n emojiSizeState: ReactState<number | null>;\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 visibleCategoriesState: [[], () => []],\n emojiSizeState: [null, () => {}]\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 useVisibleCategoriesState() {\n const { visibleCategoriesState } = React.useContext(PickerContext);\n return visibleCategoriesState;\n}\n\nexport function useEmojiSizeState() {\n const { emojiSizeState } = React.useContext(PickerContext);\n return emojiSizeState;\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 { 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 { 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 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 { 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 * 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 DEFAULT_SEARCH_CLEAR_BUTTON_LABEL = 'Clear';\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 searchClearButtonLabel: DEFAULT_SEARCH_CLEAR_BUTTON_LABEL,\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 searchClearButtonLabel: 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 = (\n emoji: EmojiClickData,\n event: MouseEvent,\n api?: OnEmojiClickApi\n) => void;\nexport type OnSkinToneChange = (emoji: SkinTones) => void;\n\ntype OnEmojiClickApi = {\n collapseToReactions: () => void;\n};\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.searchClearButtonLabel,\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 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 =\n config.onSkinToneChange || emptyFunc;\n }, [config.onSkinToneChange]);\n\n return MutableConfigRef;\n}\n\nfunction emptyFunc() {}\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 EmojiListRef = React.useRef<HTMLUListElement>(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 EmojiListRef,\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 EmojiListRef: ElementRef<HTMLUListElement>;\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 EmojiListRef: 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 useEmojiListRef() {\n return useElementRef()['EmojiListRef'];\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 { elementCountInRow } 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 countInRow = elementCountInRow(categoryContent, element);\n\n const emojisInCurrentCategory = allVisibleEmojis(category);\n const currentEmojiIndex = emojisInCurrentCategory.indexOf(element);\n const indexInRow = currentEmojiIndex % countInRow;\n\n if (currentEmojiIndex === -1) {\n return null;\n }\n\n if (emojisInCurrentCategory[currentEmojiIndex - countInRow]) {\n return emojisInCurrentCategory[currentEmojiIndex - countInRow];\n }\n\n const prevVisibleCategory = prevCategory(category);\n\n if (!prevVisibleCategory) {\n return null;\n }\n\n const allPrevEmojis = allVisibleEmojis(prevVisibleCategory);\n\n // if there is an emoji in the same index of `indexInRow` in the previous category, return it\n // for this we need to find the last emoji in the previous category that shares the same indexInRow\n // this is by using the % operator to find the last emoji that matches\n\n const lastIndexInRow = (allPrevEmojis.length % countInRow) - 1;\n\n if (indexInRow > lastIndexInRow) {\n return allPrevEmojis.at(-1);\n }\n\n // otherwise, return the last emoji that shares the same indexInRow\n\n for (let i = allPrevEmojis.length - 1; i >= 0; i--) {\n if (i % countInRow === indexInRow) {\n return allPrevEmojis[i];\n }\n }\n\n return allPrevEmojis.at(-1);\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 countInRow = elementCountInRow(categoryContent, element);\n\n const emojisInCurrentCategory = allVisibleEmojis(category);\n const currentEmojiIndex = emojisInCurrentCategory.indexOf(element);\n\n if (currentEmojiIndex === -1) {\n return null;\n }\n\n // the remainder until the end of the row\n const remainder = countInRow - (currentEmojiIndex % countInRow) - 1;\n const firstInNextRow = currentEmojiIndex + remainder + 1;\n\n if (emojisInCurrentCategory[firstInNextRow]) {\n // if we have a next row, search in the next row for the last available emoji\n for (let p = currentEmojiIndex + countInRow; p % countInRow >= 0; p--) {\n if (emojisInCurrentCategory[p]) {\n return emojisInCurrentCategory[p];\n }\n }\n }\n\n const indexInRow = currentEmojiIndex % countInRow;\n\n const nextVisibleCategory = nextCategory(category);\n const emojisInNextCategory = allVisibleEmojis(nextVisibleCategory);\n\n if (emojisInNextCategory[indexInRow]) {\n return emojisInNextCategory[indexInRow];\n }\n\n return emojisInNextCategory.at(0) ?? null;\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 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\nexport function getLabelHeight(parentNode: NullableElement) {\n if (!parentNode) {\n return DEFAULT_LABEL_HEIGHT;\n }\n\n const label = parentNode.querySelector(asSelectors(ClassNames.label));\n\n if (label) {\n const height = label.getBoundingClientRect().height;\n if (height > 0) {\n return height;\n }\n }\n\n // fallback to default\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';\nimport { Dimensions } from '../virtualization/virtualizationHelpers';\n\n// eslint-disable-next-line max-params\nexport function preloadEmojiIfNeeded(\n emoji: undefined | DataEmoji,\n emojiStyles: EmojiStyle,\n scrollTop: number,\n clientHeight: number,\n topOffset: number,\n style: { top: number } | undefined,\n dimensions: Dimensions,\n getEmojiUrl: GetEmojiUrl\n): void {\n if (!emoji) {\n return;\n }\n\n if (emojiStyles === EmojiStyle.NATIVE) {\n return;\n }\n\n const unified = emojiUnified(emoji);\n\n if (preloadedEmojs.has(unified)) {\n return;\n }\n\n // preload only if the emoji is a few rows below the viewport\n if (!style || !dimensions) {\n return;\n }\n\n setTimeout(() => {\n const emojiTop = topOffset + style.top;\n const viewportBottom = scrollTop + clientHeight;\n\n const isJustBelowViewport =\n emojiTop >= viewportBottom &&\n emojiTop < viewportBottom + dimensions.emojiSize * 2;\n\n if (isJustBelowViewport) {\n preloadEmoji(getEmojiUrl, emoji, emojiStyles);\n }\n });\n}\n\nexport function preloadEmoji(\n getEmojiUrl: GetEmojiUrl,\n emoji: undefined | DataEmoji,\n emojiStyle: EmojiStyle\n): void {\n if (!emoji) {\n return;\n }\n\n const unified = emojiUnified(emoji);\n\n if (preloadedEmojs.has(unified)) {\n return;\n }\n preloadedEmojs.add(unified);\n\n emojiVariations(emoji)\n .concat(unified)\n .forEach(variation => {\n const emojiUrl = getEmojiUrl(variation, emojiStyle);\n preloadImage(emojiUrl);\n });\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 '--epr-skin-tone-outer-border-color':\n 'var(--epr-dark-skin-tone-outer-border-color)',\n '--epr-skin-tone-inner-border-color':\n 'var(--epr-dark-skin-tone-inner-border-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: 'height 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': '#e5f0fa',\n '--epr-hover-bg-color-reduced-opacity': '#e5f0fa80',\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 '--epr-skin-tone-outer-border-color': '#555555',\n '--epr-skin-tone-inner-border-color': 'var(--epr-bg-color)',\n\n '--epr-horizontal-padding': '10px',\n\n '--epr-picker-border-radius': '8px',\n\n /* Header */\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 '--epr-search-border-color': 'var(--epr-search-input-bg-color)',\n '--epr-search-border-color-active': 'var(--epr-highlight-color)',\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 '--epr-dark-skin-tone-outer-border-color':\n 'var(--epr-dark-picker-border-color)',\n '--epr-dark-skin-tone-inner-border-color': '#00000000'\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 {\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 style?: React.CSSProperties;\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 style\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 style={style}\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 style?: React.CSSProperties;\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 style\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 style={style}\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 useGetEmojiUrlConfig\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 const getEmojiUrl = useGetEmojiUrlConfig();\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 getEmojiUrl={getEmojiUrl}\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"," \n import { ReactNode, useEffect } from 'react';\nimport * as React from 'react';\n\nimport { useBodyRef } from '../components/context/ElementRefContext';\nimport { useActiveSkinToneState } from '../components/context/PickerContext';\nimport { ClickableEmoji } from '../components/emoji/Emoji';\nimport {\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useLazyLoadEmojisConfig,\n useSkinTonesDisabledConfig\n} from '../config/useConfig';\nimport { DataEmojis } from '../dataUtils/DataTypes';\nimport { emojiUnified } from '../dataUtils/emojiSelectors';\nimport {\n getEmojiPositionStyle,\n shouldVirtualize\n} from '../virtualization/virtualizationHelpers';\n\nimport { preloadEmojiIfNeeded } from './preloadEmoji';\nimport { useCategoryHeight } from './useCategoryHeight';\nimport { useIsEmojiDisallowed } from './useDisallowedEmojis';\nimport { useIsEmojiHidden } from './useIsEmojiHidden';\n\nexport function useEmojiVirtualization({\n categoryEmojis,\n topOffset,\n onHeightReady,\n scrollTop,\n isCategoryVisible\n}: {\n categoryEmojis: DataEmojis;\n topOffset: number;\n onHeightReady: (height: number) => void;\n scrollTop: number;\n isCategoryVisible: boolean;\n}) {\n const isEmojiHidden = useIsEmojiHidden();\n const lazyLoadEmojis = useLazyLoadEmojisConfig();\n const emojiStyle = useEmojiStyleConfig();\n const [activeSkinTone] = useActiveSkinToneState();\n const isEmojiDisallowed = useIsEmojiDisallowed();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const showVariations = !useSkinTonesDisabledConfig();\n const BodyRef = useBodyRef();\n\n let virtualizedCounter = 0;\n\n const emojisToPush = categoryEmojis.filter(emoji => {\n const isDisallowed = isEmojiDisallowed(emoji);\n const { failedToLoad, filteredOut, hidden } = isEmojiHidden(emoji);\n\n return !failedToLoad && !filteredOut && !hidden && !isDisallowed;\n });\n\n const dimensions = useCategoryHeight(emojisToPush.length);\n\n useEffect(() => {\n if (dimensions) {\n onHeightReady(dimensions.categoryHeight);\n }\n }, [dimensions, onHeightReady, emojisToPush.length]);\n\n const isVirtualized = (style: { top: number; left: number } | undefined) =>\n dimensions &&\n BodyRef.current &&\n shouldVirtualize({\n scrollTop,\n clientHeight: BodyRef.current?.clientHeight ?? 0,\n topOffset,\n style,\n dimensions\n });\n\n const emojis = emojisToPush.reduce((accumulator, emoji, index) => {\n const unified = emojiUnified(emoji, activeSkinTone);\n const style = getEmojiPositionStyle(dimensions, index);\n\n if (isVirtualized(style)) {\n virtualizedCounter++;\n preloadEmojiIfNeeded(\n emoji,\n emojiStyle,\n scrollTop,\n BodyRef.current?.clientHeight ?? 0,\n topOffset,\n style,\n dimensions,\n getEmojiUrl\n );\n return accumulator;\n }\n\n if (!isCategoryVisible) {\n virtualizedCounter++;\n return accumulator;\n }\n\n accumulator.push(\n <ClickableEmoji\n showVariations={showVariations}\n key={unified}\n emoji={emoji}\n unified={unified}\n emojiStyle={emojiStyle}\n lazyLoad={lazyLoadEmojis}\n getEmojiUrl={getEmojiUrl}\n style={{\n ...style,\n position: 'absolute'\n }}\n />\n );\n return accumulator;\n }, [] as ReactNode[]);\n\n return {\n virtualizedCounter,\n emojis,\n dimensions\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 * as React from 'react';\n\nimport { EmojiButtonSelector } from '../DomUtils/selectors';\nimport {\n useEmojiListRef,\n usePickerMainRef,\n} from '../components/context/ElementRefContext';\nimport {\n useReactionsModeState,\n useVisibleCategoriesState,\n useEmojiSizeState,\n} from '../components/context/PickerContext';\n\nconst EMOJI_SIZE_DEFAULT = 40;\n\nexport function useCategoryHeight(emojiCount: number):\n | {\n categoryHeight: number;\n emojisPerRow: number;\n emojiSize: number;\n }\n | undefined {\n const EmojiListRef = useEmojiListRef();\n const [isReactionsMode] = useReactionsModeState();\n const PickerMainRef = usePickerMainRef();\n const emojiSizeRef = React.useRef<number | undefined>();\n const [visibleCategories] = useVisibleCategoriesState();\n const [emojiSizeFromContext] = useEmojiSizeState();\n const [dimensions, setDimensions] = React.useState<{\n categoryHeight: number;\n emojisPerRow: number;\n emojiSize: number;\n }>();\n\n // Helper to compute and store dimensions based on current DOM\n const computeAndSetDimensions = React.useCallback(() => {\n const listEl = EmojiListRef.current;\n if (!listEl) return;\n\n const emojiElement = listEl.querySelector(\n EmojiButtonSelector,\n ) as HTMLElement | null;\n\n const measured = emojiElement?.clientHeight;\n if (measured) {\n emojiSizeRef.current = measured;\n }\n const emojiSize =\n emojiSizeFromContext ||\n measured ||\n emojiSizeRef.current ||\n EMOJI_SIZE_DEFAULT;\n const pickerWidth = listEl.clientWidth;\n\n if (pickerWidth === 0 || emojiSize === 0) return;\n\n const emojisPerRow = Math.max(1, Math.floor(pickerWidth / emojiSize));\n const rowCount = Math.ceil(emojiCount / emojisPerRow);\n const categoryHeight = rowCount * emojiSize;\n\n setDimensions({ categoryHeight, emojisPerRow, emojiSize });\n }, [EmojiListRef, emojiCount, emojiSizeFromContext]);\n\n // Recompute on data-count changes and when reactions mode toggles\n React.useEffect(() => {\n computeAndSetDimensions();\n }, [\n emojiCount,\n isReactionsMode,\n computeAndSetDimensions,\n visibleCategories.length,\n ]);\n\n // Listen to transitionend on the picker root (where height transition occurs)\n React.useEffect(() => {\n const rootEl = PickerMainRef.current;\n if (!rootEl) return;\n\n const handler = (e: Event) => {\n const te = e as TransitionEvent;\n const prop = te.propertyName;\n if (\n prop === 'width' ||\n prop === 'max-width' ||\n prop === 'min-width' ||\n prop === 'height' ||\n prop === 'max-height' ||\n prop === 'min-height'\n ) {\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(() => computeAndSetDimensions());\n } else {\n requestAnimationFrame(() => computeAndSetDimensions());\n }\n }\n };\n\n rootEl.addEventListener('transitionend', handler, {\n passive: true,\n });\n return () => {\n rootEl.removeEventListener('transitionend', handler);\n };\n }, [PickerMainRef, computeAndSetDimensions]);\n\n return dimensions;\n}\n","export function shouldVirtualize({\n scrollTop,\n clientHeight,\n topOffset,\n style,\n dimensions\n}: {\n scrollTop: number;\n clientHeight: number;\n topOffset: number;\n style: { top: number } | undefined;\n dimensions: Dimensions;\n}): boolean {\n if (!style || !dimensions) {\n return false;\n }\n\n const emojiTop = topOffset + style.top;\n const emojiBottom = emojiTop + dimensions.emojiSize;\n\n const isVisible =\n emojiBottom + dimensions.emojiSize * 2 >= scrollTop &&\n emojiTop <= scrollTop + clientHeight + dimensions.emojiSize;\n\n return !isVisible;\n}\n\nexport function getEmojiPositionStyle(dimensions: Dimensions, index: number) {\n return dimensions\n ? {\n top: Math.floor(index / dimensions.emojisPerRow) * dimensions.emojiSize,\n left: (index % dimensions.emojisPerRow) * dimensions.emojiSize\n }\n : undefined;\n}\n\n// preload emoji if it is one row below viewport\n\nexport type Dimensions =\n | {\n emojiSize: number;\n emojisPerRow: number;\n categoryHeight: number;\n }\n | undefined;\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 height?: number;\n}>;\n\nexport function EmojiCategory({\n categoryConfig,\n children,\n hidden,\n hiddenOnSearch,\n height\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)} style={{ height }}>\n {children}\n </div>\n </li>\n );\n}\n\nconst styles = stylesheet.create({\n category: {\n '.': ClassNames.category,\n minHeight:\n 'calc(var(--epr-emoji-fullsize) + var(--epr-category-label-height))',\n position: 'relative'\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\nimport {\n categoryFromCategoryConfig\n} from '../../config/categoryConfig';\nimport {\n useCategoriesConfig,\n useEmojiStyleConfig,\n useGetEmojiUrlConfig,\n useLazyLoadEmojisConfig\n} from '../../config/useConfig';\nimport {\n useGetEmojisByCategory,\n emojiUnified\n} from '../../dataUtils/emojiSelectors';\nimport { useActiveSkinToneState, useEmojiSizeState } from '../context/PickerContext';\nimport { ClickableEmoji } from '../emoji/Emoji';\n\nexport function MeasureEmoji() {\n const categories = useCategoriesConfig();\n const getEmojisByCategory = useGetEmojisByCategory();\n const emojiStyle = useEmojiStyleConfig();\n const getEmojiUrl = useGetEmojiUrlConfig();\n const lazyLoadEmojis = useLazyLoadEmojisConfig();\n const [activeSkinTone] = useActiveSkinToneState();\n const [emojiSize, setEmojiSize] = useEmojiSizeState();\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (ref.current) {\n setEmojiSize(ref.current.clientHeight);\n }\n });\n\n if (emojiSize) {\n return null;\n }\n\n const firstCategory = categories[0];\n const dummyEmoji = getEmojisByCategory(\n categoryFromCategoryConfig(firstCategory)\n )[0];\n const unified = dummyEmoji\n ? emojiUnified(dummyEmoji, activeSkinTone)\n : '';\n\n if (!dummyEmoji) {\n return null;\n }\n\n return (\n <div ref={ref}>\n <ClickableEmoji\n emoji={dummyEmoji}\n unified={unified}\n emojiStyle={emojiStyle}\n getEmojiUrl={getEmojiUrl}\n lazyLoad={lazyLoadEmojis}\n showVariations={false}\n hidden={false}\n style={{\n opacity: 0,\n pointerEvents: 'none',\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: -1,\n height: 'var(--epr-emoji-fullsize)',\n width: 'var(--epr-emoji-fullsize)'\n }}\n />\n </div>\n );\n}\n","import { cx } from 'flairup';\nimport * as React from 'react';\n\nimport { ClassNames } from '../../DomUtils/classNames';\nimport { getLabelHeight } from '../../DomUtils/elementPositionInRow';\nimport { stylesheet } from '../../Stylesheet/stylesheet';\nimport {\n CategoryConfig,\n categoryFromCategoryConfig\n} from '../../config/categoryConfig';\nimport { useCategoriesConfig } from '../../config/useConfig';\nimport { DataEmojis } from '../../dataUtils/DataTypes';\nimport { useGetEmojisByCategory } from '../../dataUtils/emojiSelectors';\nimport { useEmojiVirtualization } from '../../hooks/useEmojiVirtualization';\nimport { useEmojiListRef } from '../context/ElementRefContext';\nimport { useVisibleCategoriesState } from '../context/PickerContext';\n\nimport { EmojiCategory } from './EmojiCategory';\nimport { MeasureEmoji } from './MeasureEmoji';\n\nexport function EmojiList({ scrollTop }: { scrollTop: number }) {\n const categories = useCategoriesConfig();\n const [categoryHeights, setCategoryHeights] = React.useState<{\n [key: string]: number;\n }>({});\n const EmojiListRef = useEmojiListRef();\n const getEmojisByCategory = useGetEmojisByCategory();\n\n const labelHeight = getLabelHeight(EmojiListRef.current);\n\n let topOffset = 0;\n return (\n <ul className={cx(styles.emojiList)} ref={EmojiListRef}>\n <MeasureEmoji />\n {categories.map(categoryConfig => {\n const category = categoryFromCategoryConfig(categoryConfig);\n\n const currentOffset = topOffset;\n const categoryHeight = categoryHeights[category];\n if (categoryHeight) {\n topOffset += categoryHeight + labelHeight;\n }\n\n return (\n <React.Suspense key={category}>\n <RenderCategory\n categoryEmojis={getEmojisByCategory(category)}\n categoryConfig={categoryConfig}\n topOffset={currentOffset}\n onHeightReady={height => {\n if (categoryHeights[category] !== height) {\n setCategoryHeights(prev => ({\n ...prev,\n [category]: height\n }));\n }\n }}\n scrollTop={scrollTop}\n />\n </React.Suspense>\n );\n })}\n </ul>\n );\n}\n\nfunction RenderCategory({\n categoryEmojis,\n categoryConfig,\n topOffset,\n onHeightReady,\n scrollTop\n}: {\n categoryEmojis: DataEmojis;\n categoryConfig: CategoryConfig;\n topOffset: number;\n onHeightReady: (height: number) => void;\n scrollTop: number;\n}) {\n const [visibleCategories] = useVisibleCategoriesState();\n\n const { virtualizedCounter, emojis, dimensions } = useEmojiVirtualization({\n categoryEmojis,\n topOffset,\n onHeightReady,\n scrollTop,\n isCategoryVisible: visibleCategories.includes(categoryConfig.category)\n });\n\n return (\n <EmojiCategory\n categoryConfig={categoryConfig}\n height={dimensions?.categoryHeight}\n // Indicates that there are no visible emojis\n // Hence, the category should be hidden\n hidden={!emojis.length && virtualizedCounter === 0}\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 { 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 const scrollTop = 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 scrollTop={scrollTop} />\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, useState } 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 const [scrollTop, setScrollTop] = useState(0);\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 setScrollTop(bodyRef?.scrollTop ?? 0);\n closeAllOpenToggles();\n }\n\n return () => {\n bodyRef?.removeEventListener('scroll', onScroll);\n };\n }, [BodyRef, closeAllOpenToggles]);\n\n return scrollTop;\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 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 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 border: '1px solid var(--epr-skin-tone-outer-border-color)',\n boxShadow: 'inset 0px 0px 0 1px var(--epr-skin-tone-inner-border-color)',\n ':hover': {\n boxShadow: '0 0 0 3px var(--epr-active-skin-hover-color), inset 0px 0px 0 1px var(--epr-skin-tone-inner-border-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': {\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 }\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 {\n useEmojiVariationPickerState,\n useReactionsModeState\n} 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 const [reactionsOpen] = useReactionsModeState();\n\n if (!previewConfig.showPreview) {\n return null;\n }\n\n return (\n <Flex\n className={cx(\n styles.preview,\n commonInteractionStyles.hiddenOnReactions,\n reactionsOpen && styles.hideOnReactions\n )}\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 hideOnReactions: {\n opacity: '0',\n transition: 'opacity 0.5s ease-in-out'\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","export function categoryNameFromDom($category: Element | null): string | null {\n return $category?.getAttribute('data-name') ?? null;\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';\nimport { useVisibleCategoriesState } from '../context/PickerContext';\n\nimport { CategoryButton } from './CategoryButton';\n\nexport function CategoryNavigation() {\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const [, setVisibleCategories] = useVisibleCategoriesState();\n const scrollCategoryIntoView = useScrollCategoryIntoView();\n useActiveCategoryScrollDetection({ setActiveCategory, setVisibleCategories });\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 scrollCategoryIntoView(category);\n setTimeout(() => {\n setActiveCategory(category);\n }, 10);\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,\n setVisibleCategories\n}: {\n setActiveCategory: (category: string) => void;\n setVisibleCategories: (categories: string[]) => void;\n}) {\n const BodyRef = useBodyRef();\n\n useEffect(() => {\n const visibleCategories = new Map<string, number>();\n const intersectingCategories = new Map<string, boolean>();\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\n if (!id) {\n continue;\n }\n\n visibleCategories.set(id, entry.intersectionRatio);\n intersectingCategories.set(id, entry.isIntersecting);\n }\n\n const ratios = Array.from(visibleCategories);\n const visibleCats = ratios\n .filter(([id, ratio]) => ratio > 0 || intersectingCategories.get(id))\n .map(([id]) => id);\n\n setVisibleCategories(visibleCats);\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 root: bodyRef,\n threshold: [0, 1]\n }\n );\n bodyRef?.querySelectorAll(asSelectors(ClassNames.category)).forEach(el => {\n observer.observe(el);\n });\n\n return () => {\n observer.disconnect();\n };\n }, [BodyRef, setActiveCategory, setVisibleCategories]);\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 { useSearchClearButtonLabelConfig } from '../../../config/useConfig';\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 const searchClearButtonLabel = useSearchClearButtonLabelConfig();\n\n return (\n <Button\n className={cx(\n styles.btnClearSearch,\n commonInteractionStyles.visibleOnSearchOnly\n )}\n onClick={clearSearch}\n aria-label={searchClearButtonLabel}\n title={searchClearButtonLabel}\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 { 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';\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 { 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 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 <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 onChange(event?.target?.value ?? value);\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-border-color)',\n width: '100%',\n ':focus': {\n backgroundColor: 'var(--epr-search-input-bg-color-active)',\n border: '1px solid var(--epr-search-border-color-active)'\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 { emojiByUnified } from './dataUtils/emojiSelectors';\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":["asArray","v","concat","isPsuedoSelector","selector","startsWith","isStyleCondition","isString","length","includes","slice","isImmediatePostcondition","isValidProperty","property","value","isCssVariables","isMediaQuery","joinTruthy","arr","delimiter","filter","Boolean","join","stableHash","prefix","seed","hash","toString","i","charCodeAt","joinedProperty","Rule","constructor","sheet","this","joined","joinedConditions","preconditions","postconditions","hasConditions","scopeClassName","name","key","selectors","mergeSelectors","right","left","genRule","replace","toLowerCase","handlePropertyValue","output","reduce","current","str","ClassNames","Selector","scopeName","setScope","count","addScope","addPrecondition","precondition","addPostcondition","postcondition","createRule","Sheet","rootNode","storedStyles","storedClasses","style","id","styleTag","createStyleTag","getStyle","append","css","base","line","apply","innerHTML","isApplied","document","createElement","type","head","appendChild","addRule","rule","storedClass","forIn","obj","fn","trim","cx","args","classes","arg","Set","push","Array","isArray","Object","entries","forEach","createSheet","create","styles","scopedStyles","iteratePreconditions","iterateStyles","className","add","addScopedStyle","bind","item","res","isDirectClass","mediaQuery","handleMediaQuery","chunkRows","addEachClass","cssVariablesBlock","list","to","asSelectors","classNames","_len","_key","arguments","map","c","stylesheet","hidden","display","opacity","pointerEvents","visibility","overflow","commonStyles","_extends","PickerStyleTag","React","suppressHydrationWarning","dangerouslySetInnerHTML","__html","commonInteractionStyles","categoryBtn","backgroundPositionY","hiddenOnSearch","visibleOnSearchOnly","hiddenOnReactions","transition","height","width","darkMode","_eprDarkTheme","_eprAutoTheme","compareConfig","prev","next","prevCustomEmojis","_prev$customEmojis","customEmojis","nextCustomEmojis","_next$customEmojis","open","emojiVersion","reactionsDefaultOpen","searchPlaceHolder","searchPlaceholder","searchClearButtonLabel","defaultSkinTone","skinTonesDisabled","autoFocusSearch","emojiStyle","theme","suggestedEmojisMode","lazyLoadEmojis","searchDisabled","skinTonePickerLocation","SuggestionMode","EmojiStyle","Theme","SkinTones","Categories","SkinTonePickerLocation","DEFAULT_REACTIONS","alphaNumericEmojiIndex","indexEmoji","emoji","emojiNames","flat","split","char","_alphaNumericEmojiInd","emojiUnified","useDebouncedState","initialValue","delay","_useState","useState","state","setState","timer","useRef","Promise","resolve","clearTimeout","_window","window","setTimeout","useDisallowedEmojis","DisallowedEmojisRef","emojiVersionConfig","usePickerConfig","useMemo","parseFloat","Number","isNaN","allEmojis","disallowedEmojis","supportedLevel","EmojiProperties","added_in","addedIn","addedInNewerVersion","PickerContextProvider","_ref","dispatch","children","filterRef","disallowClickRef","disallowMouseRef","disallowedEmojisRef","suggestedUpdateState","Date","now","searchTerm","skinToneFanOpenState","activeSkinTone","activeCategoryState","emojisThatFailedToLoadState","emojiVariationPickerState","reactionsModeState","isPastInitialLoad","setIsPastInitialLoad","visibleCategoriesState","emojiSizeState","useEffect","PickerContext","Provider","searchIndex","NEUTRAL","useFilterRef","useDisallowMouseRef","useReactionsModeState","useSearchTermState","useActiveSkinToneState","useEmojisThatFailedToLoadState","useEmojiVariationPickerState","useSkinToneFanOpenState","useVisibleCategoriesState","useEmojiSizeState","useUpdateSuggested","suggestedUpdated","setsuggestedUpdate","categoriesOrdered","SUGGESTED","CUSTOM","SMILEYS_PEOPLE","ANIMALS_NATURE","FOOD_DRINK","TRAVEL_PLACES","ACTIVITIES","OBJECTS","SYMBOLS","FLAGS","SuggestedRecent","category","configByCategory","_configByCategory","baseCategoriesConfig","modifiers","categoryFromCategoryConfig","categoryNameFromCategoryConfig","getBaseConfigByCategory","modifier","assign","CDN_URL_APPLE","CDN_URL_FACEBOOK","CDN_URL_TWITTER","CDN_URL_GOOGLE","skinToneVariations","LIGHT","MEDIUM_LIGHT","MEDIUM","MEDIUM_DARK","DARK","skinTonesNamed","acc","skinTonesMapped","mapped","skinTone","_Object$assign","SUGGESTED_LS_KEY","getSuggested","mode","_window$localStorage$","_window2","localStorage","recent","JSON","parse","getItem","FREQUENT","sort","a","b","_unused","_emoji$EmojiPropertie","emojiName","unifiedWithoutSkinTone","unified","splat","splice","emojiHasVariations","_emojiVariationUnifie","emojiVariations","find","variation","emojiVariationUnified","useGetEmojisByCategory","suggestedEmojisModeConfig","suggested","_getSuggested","s","emojiByUnified","_emojis$category","emojis","emojiUrlByUnified","TWITTER","GOOGLE","FACEBOOK","APPLE","cdnUrl","_emoji$EmojiPropertie2","variations","allEmojisByUnified","withoutSkinTone","values","Emoji","KNOWN_FAILING_EMOJIS","DEFAULT_SEARCH_PLACEHOLDER","DEFAULT_SEARCH_CLEAR_BUTTON_LABEL","SEARCH_RESULTS_SUFFIX","SEARCH_RESULTS_ONE_RESULT_FOUND","SEARCH_RESULTS_MULTIPLE_RESULTS_FOUND","mergeConfig","userConfig","basePickerConfig","previewConfig","_userConfig$previewCo","config","categories","userCategoriesConfig","extra","suggestionMode","RECENT","_userCategoriesConfig","mergeCategoriesConfig","hiddenEmojis","unicodeToHide","_config$customEmojis","emojiData","names","imgUrl","customToRegularEmoji","PREVIEW","getEmojiUrl","basePreviewConfig","SEARCH","reactions","allowExpandReactions","defaultEmoji","defaultCaption","showPreview","ConfigContext","PickerConfigProvider","mergedConfig","_React$useState","setMergedConfig","useSetConfig","_objectWithoutPropertiesLoose","_excluded","MOUSE_EVENT_SOURCE","MutableConfigContext","useMutableConfig","emptyFunc","useAllowExpandReactions","useSkinTonesDisabledConfig","useEmojiStyleConfig","useCategoriesConfig","usePreviewConfig","useLazyLoadEmojisConfig","useSearchDisabledConfig","useSkinTonePickerLocationConfig","useGetEmojiUrlConfig","getDimension","dimensionConfig","useIsSearchMode","focusElement","element","requestAnimationFrame","focus","focusPrevElementSibling","previousElementSibling","focusNextElementSibling","nextElementSibling","focusFirstElementChild","firstElementChild","getActiveElement","activeElement","ElementRefContextProvider","PickerMainRef","AnchoredEmojiRef","BodyRef","EmojiListRef","SearchInputRef","SkinTonePickerRef","CategoryNavigationRef","VariationPickerRef","ReactionsRef","ElementRefContext","KeyboardEvents","useElementRef","useEmojiListRef","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","focusNextVisibleEmoji","nextVisibleEmoji","nextCategory","useCloseAllOpenToggles","_useEmojiVariationPic","setVariationPicker","_useSkinToneFanOpenSt","skinToneFanOpen","setSkinToneFanOpen","useCallback","useHasOpenToggles","useAllowMouseMove","DisallowMouseRef","useIsMouseDisallowed","useFocusSearchInput","useFocusCategoryNavigation","useClearSearch","applySearch","useApplySearch","focusSearchInput","setSearchTerm","then","hasMatch","keyword","some","getNormalizedSearchTerm","useSetVariationPicker","setAnchoredEmojiRef","setEmojiVariationPicker","emojiFromElement","useIsSkinToneInSearch","useIsSkinToneInPreview","useKeyboardNavigation","focusSkinTonePicker","setSkinToneFanOpenState","goDownFromSearchInput","isSkinToneInSearch","onKeyDown","clearSearch","hasOpenToggles","disallowMouseMove","closeAllOpenToggles","event","Escape","preventDefault","addEventListener","removeEventListener","usePickerMainKeyboardEvents","useGoDownFromSearchInput","firstEmoji","ArrowRight","ArrowDown","Enter","click","_useSkinToneFanOpenSt2","isOpen","setIsOpen","isSkinToneInPreview","onType","useOnType","ArrowLeft","focusNextSkinTone","focusPrevSkinTone","ArrowUp","useSkinTonePickerKeyboardEvents","useCategoryNavigationKeyboardEvents","focusCategoryNavigation","isSearchMode","goUpFromBody","buttonFromTarget","prevVisibleEmoji","lastVisibleEmoji","prevCategory","focusPrevVisibleEmoji","categoryContent","closestCategoryContent","countInRow","elementCountInRow","emojisInCurrentCategory","allVisibleEmojis","currentEmojiIndex","indexOf","p","indexInRow","emojisInNextCategory","_emojisInNextCategory","at","visibleEmojiOneRowDown","focusVisibleEmojiOneRowDown","exitUp","prevVisibleCategory","allPrevEmojis","visibleEmojiOneRowUp","focusVisibleEmojiOneRowUp","Space","useBodyKeyboardEvents","exitLeft","currentSkinTone","appendSearch","metaKey","ctrlKey","altKey","hasModifier","match","preloadEmoji","preloadedEmojs","has","url","Image","src","DEFAULT_LABEL_HEIGHT","PickerMain","PickerRootElement","_ref2","reactionsMode","searchModeActive","_usePickerConfig16","useStyleConfig","NATIVE","bodyRef","onFocus","button","_ref3","styleProps","main","baseVariables","darkTheme","AUTO","autoThemeDark","_cx","searchActive","reactionsMenu","ref","DarkTheme","emojiPicker","position","flexDirection","borderWidth","borderStyle","borderRadius","borderColor","backgroundColor","boxSizing","fontFamily","autoTheme","backdropFilter","parentWidth","getBoundingClientRect","elementWidth","Math","floor","getLabelHeight","parentNode","label","querySelector","EmojiButtonSelector","VisibleEmojiSelector","visible","emojiElement","_emojiElement$closest","originalUnified","originalUnifiedFromEmojiElement","unifiedFromEmojiElement","elementHeight","_element$clientHeight","clientHeight","emojiTrueOffsetTop","labelHeight","elementOffsetTop","categoryWithoutLabel","_category$clientHeigh","_categoryWithoutLabel","matches","_closestScrollBody$sc","_closestScrollBody","_element$closest","_element$offsetTop","offsetTop","elementOffsetLeft","_element$offsetLeft","offsetLeft","_elementDataSetKey","_elementDataSet$key","_element$dataset","dataset","elementDataSet","allUnifiedFromEmojiElement","isVisibleEmoji","classList","contains","isHidden","from","querySelectorAll","last","elements","maxVisibilityDiffThreshold","parentTop","parentBottom","bottom","parentTopWithLabel","elementTop","elementBottom","maxVisibilityDiffPixels","elementTopWithAllowedDiff","elementBottomWithAllowedDiff","firstVisibleElementInContainer","parseNativeEmoji","hex","String","fromCodePoint","parseInt","isCustomEmoji","undefined","useMouseDownHandlers","ContainerRef","mouseEventSource","mouseDownTimerRef","onEmojiClick","setReactionsOpen","handler","onReactionClick","REACTIONS","collapseToReactions","o","_len2","_key2","useOnEmojiClickConfig","updateSuggested","activeEmojiStyle","onClick","_emojiFromEvent","emojiFromEvent","skinToneToUse","suspectedSkinTone","activeVariationFromUnified","nextList","existing","original","min","_window3","setItem","stringify","_unused2","setSuggested","getImageUrl","imageUrl","isCustom","emojiClickOutput","onMouseDown","onMouseUp","confainerRef","passive","_element$parentElemen","parentElement","Button","props","cursor","border","background","outline","ClickableEmojiButton","_ref$showVariations","showVariations","hasVariations","_ref$noBackground","noBackground","getAriaLabel","_emojiNames$","alignItems","justifyContent","maxWidth","maxHeight","content","borderLeft","borderRight","transform","borderBottom","zIndex","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","reaction","emojiButton","listStyle","margin","useEmojiVirtualization","isUnicodeHidden","emojisThatFailedToLoad","isEmojiFiltered","categoryEmojis","topOffset","onHeightReady","isCategoryVisible","isEmojiHidden","_filter$searchTerm","isEmojiFilteredBySearchTerm","failedToLoad","filteredOut","isEmojiDisallowed","virtualizedCounter","emojisToPush","isDisallowed","_isEmojiHidden","dimensions","emojiCount","isReactionsMode","emojiSizeRef","visibleCategories","emojiSizeFromContext","setDimensions","computeAndSetDimensions","listEl","measured","emojiSize","pickerWidth","clientWidth","emojisPerRow","max","rowCount","ceil","categoryHeight","rootEl","e","prop","propertyName","queueMicrotask","useCategoryHeight","accumulator","index","_BodyRef$current$clie2","_BodyRef$current2","getEmojiPositionStyle","_BodyRef$current$clie","_BodyRef$current","emojiTop","shouldVirtualize","isVirtualized","viewportBottom","preloadEmojiIfNeeded","EmojiCategory","categoryConfig","categoryName","gridGap","gridTemplateColumns","fontWeight","textTransform","MeasureEmoji","getEmojisByCategory","_useEmojiSizeState","setEmojiSize","dummyEmoji","EmojiList","categoryHeights","setCategoryHeights","emojiList","currentOffset","RenderCategory","_extends2","_useEmojiVirtualizati","Direction","EmojiVariationPicker","pointerStyle","_useVariationPickerTo","direction","Up","getMenuDirection","getTop","emojiOffsetTop","_bodyRef$scrollTop","buttonHeight","Down","useVariationPickerTop","getPointerStyle","emojiTruOffsetLeft","usePointerStyle","pointingUp","pointer","boxShadow","transformOrigin","backgroundPosition","Body","setScrollTop","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","SkinTonePickerMenu","SkinTonePicker","VERTICAL","HORIZONTAL","isDisabled","_useActiveSkinToneSta","setActiveSkinTone","onSkinToneChange","fullWidth","expandedSize","ITEM_SIZE","vertical","skinTones","verticalShadow","flexBasis","select","Preview","preview","hideOnReactions","PreviewBody","previewEmoji","setPreviewEmoji","variationPickerEmoji","allow","onEscape","onMouseOver","onEnter","onLeave","_allUnifiedFromEmojiE","relatedTarget","belowFoldByPx","buttonRect","bodyRect","y","detectEmojyPartiallyBelowFold","_allUnifiedFromEmojiE2","_document$activeEleme","blur","handlePartiallyVisibleElementFocus","useEmojiPreviewEvents","_previewEmoji$unified","show","defaultText","borderTop","categoryNameFromDom","$category","_$category$getAttribu","getAttribute","CategoryButton","isActiveCategory","allowNavigation","catBtn","role","DarkActivePositionY","DarkPositionY","DarkInactivePosition","backgroundPositionX","CategoryNavigation","activeCategory","setActiveCategory","setVisibleCategories","scrollCategoryIntoView","Map","intersectingCategories","observer","IntersectionObserver","_step","_iterator","_createForOfIteratorHelperLoose","done","entry","set","intersectionRatio","isIntersecting","ratios","visibleCats","get","lastCategory","_i","_ratios","_ratios$_i","threshold","el","observe","disconnect","useActiveCategoryScrollDetection","customCategoryConfig","categoriesConfig","hideCustomCategory","nav","isCustomCategory","BtnClearSearch","useSearchClearButtonLabelConfig","btnClearSearch","icnClearnSearch","HoverDark","SVGTimes","IcnSearch","icnSearch","SearchContainer","overlay","Search","_usePickerConfig","placeholder","_find","autoFocus","_useFilter","setFilterRef","setFilter","setter","useSetFilterRef","statusSearchResults","filterState","searchResultsCount","_Object$entries","getStatusSearchResults","onChange","inputValue","nextValue","longestMatch","dict","longestMatchingKey","keys","findLongestMatch","filtered","filterEmojiObjectByKeyword","useFilter","input","searchContainer","search","_event$target$value","_event$target","visuallyHidden","clip","clipPath","whiteSpace","Header","EmojiPicker","ContentControl","renderAll","setRenderAll","ExpandedPickerContent","ErrorBoundary","_React$Component","_this","call","hasError","getDerivedStateFromError","_proto","prototype","componentDidCatch","error","errorInfo","console","render","ExportedEmoji","_ref$size","_ref$emojiStyle","emojiUrl","MutableConfigRef","useDefineMutableConfig","EmojiPickerReact"],"sourceRoot":""}