emoji-picker-react 4.22.3 → 5.0.1

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.
Files changed (409) hide show
  1. package/README.md +331 -49
  2. package/dist/DomUtils/categoryNameFromDom.d.ts +1 -1
  3. package/dist/DomUtils/classNames.d.ts +23 -23
  4. package/dist/DomUtils/detectEmojyPartiallyBelowFold.d.ts +2 -2
  5. package/dist/DomUtils/elementPositionInRow.d.ts +5 -5
  6. package/dist/DomUtils/eventBelongsToPicker.d.ts +2 -0
  7. package/dist/DomUtils/focusElement.d.ts +5 -5
  8. package/dist/DomUtils/getActiveElement.d.ts +2 -2
  9. package/dist/DomUtils/isJsdom.d.ts +1 -0
  10. package/dist/DomUtils/isRtl.d.ts +1 -0
  11. package/dist/DomUtils/keyboardNavigation.d.ts +15 -8
  12. package/dist/DomUtils/scrollTo.d.ts +4 -5
  13. package/dist/DomUtils/selectors.d.ts +31 -35
  14. package/dist/EmojiPickerReact.d.ts +5 -5
  15. package/dist/Stylesheet/DedupedStyle.d.ts +13 -0
  16. package/dist/Stylesheet/stylesheet.d.ts +40 -37
  17. package/dist/components/ErrorBoundary.d.ts +15 -15
  18. package/dist/components/Layout/Absolute.d.ts +8 -8
  19. package/dist/components/Layout/Flex.d.ts +13 -13
  20. package/dist/components/Layout/Relative.d.ts +8 -8
  21. package/dist/components/Layout/Space.d.ts +7 -7
  22. package/dist/components/Reactions/BtnPlus.d.ts +2 -2
  23. package/dist/components/Reactions/DEFAULT_REACTIONS.d.ts +1 -1
  24. package/dist/components/Reactions/Reactions.d.ts +3 -2
  25. package/dist/components/atoms/Button.d.ts +11 -6
  26. package/dist/components/body/EmojiCategory.d.ts +13 -12
  27. package/dist/components/body/EmojiList.d.ts +7 -4
  28. package/dist/components/body/EmojiVariationPicker.d.ts +2 -2
  29. package/dist/components/body/MeasureEmoji.d.ts +2 -2
  30. package/dist/components/body/listComponents.d.ts +47 -0
  31. package/dist/components/context/ElementRefContext.d.ts +18 -16
  32. package/dist/components/context/PickerConfigContext.d.ts +14 -9
  33. package/dist/components/context/PickerContext.d.ts +57 -25
  34. package/dist/components/context/PickerDataContext.d.ts +23 -17
  35. package/dist/components/emoji/BaseEmojiProps.d.ts +14 -13
  36. package/dist/components/emoji/ClickableEmojiButton.d.ts +23 -15
  37. package/dist/components/emoji/Emoji.d.ts +18 -15
  38. package/dist/components/emoji/EmojiImg.d.ts +11 -11
  39. package/dist/components/emoji/ExportedEmoji.d.ts +11 -11
  40. package/dist/components/emoji/NativeEmoji.d.ts +6 -6
  41. package/dist/components/emoji/ViewOnlyEmoji.d.ts +3 -3
  42. package/dist/components/emoji/emojiStyles.d.ts +6 -1
  43. package/dist/components/footer/Preview.d.ts +7 -7
  44. package/dist/components/header/Header.d.ts +2 -2
  45. package/dist/components/header/Search/BtnClearSearch.d.ts +2 -2
  46. package/dist/components/header/Search/IcnSearch.d.ts +2 -2
  47. package/dist/components/header/Search/Search.d.ts +11 -3
  48. package/dist/components/header/SkinTonePicker/BtnSkinToneVariation.d.ts +12 -12
  49. package/dist/components/header/SkinTonePicker/SkinTonePicker.d.ts +11 -11
  50. package/dist/components/icons/svgIcons.d.ts +4 -0
  51. package/dist/components/main/PickerMainBehaviors.d.ts +4 -0
  52. package/dist/components/main/defaultAppearance.d.ts +12 -0
  53. package/dist/components/main/labelHeight.d.ts +1 -0
  54. package/dist/components/navigation/CategoryButton.d.ts +12 -12
  55. package/dist/components/navigation/CategoryNavIcon.d.ts +4 -4
  56. package/dist/components/navigation/CategoryNavigation.d.ts +19 -2
  57. package/dist/config/categoryConfig.d.ts +34 -34
  58. package/dist/config/cdnUrls.d.ts +2 -2
  59. package/dist/config/compareConfig.d.ts +10 -2
  60. package/dist/config/config.d.ts +166 -64
  61. package/dist/config/customEmojiConfig.d.ts +14 -14
  62. package/dist/config/defaultPickerConfiguration.d.ts +10 -0
  63. package/dist/config/mutableConfig.d.ts +32 -10
  64. package/dist/config/useConfig.d.ts +48 -36
  65. package/dist/data/defaultEmojiData.d.ts +9 -0
  66. package/dist/data/defaultEmojiData.js +40 -0
  67. package/dist/data/emojis-bn.d.mts +39 -0
  68. package/dist/data/emojis-bn.d.ts +38 -2
  69. package/dist/data/emojis-bn.js +25 -2
  70. package/dist/data/emojis-bn.mjs +2 -0
  71. package/dist/data/emojis-da.d.mts +39 -0
  72. package/dist/data/emojis-da.d.ts +38 -2
  73. package/dist/data/emojis-da.js +25 -2
  74. package/dist/data/emojis-da.mjs +2 -0
  75. package/dist/data/emojis-de.d.mts +39 -0
  76. package/dist/data/emojis-de.d.ts +38 -2
  77. package/dist/data/emojis-de.js +25 -2
  78. package/dist/data/emojis-de.mjs +2 -0
  79. package/dist/data/emojis-en-gb.d.mts +39 -0
  80. package/dist/data/emojis-en-gb.d.ts +38 -2
  81. package/dist/data/emojis-en-gb.js +25 -2
  82. package/dist/data/emojis-en-gb.mjs +2 -0
  83. package/dist/data/emojis-en.d.mts +39 -0
  84. package/dist/data/emojis-en.d.ts +38 -2
  85. package/dist/data/emojis-en.js +25 -2
  86. package/dist/data/emojis-en.mjs +2 -0
  87. package/dist/data/emojis-es-mx.d.mts +39 -0
  88. package/dist/data/emojis-es-mx.d.ts +38 -2
  89. package/dist/data/emojis-es-mx.js +25 -2
  90. package/dist/data/emojis-es-mx.mjs +2 -0
  91. package/dist/data/emojis-es.d.mts +39 -0
  92. package/dist/data/emojis-es.d.ts +38 -2
  93. package/dist/data/emojis-es.js +25 -2
  94. package/dist/data/emojis-es.mjs +2 -0
  95. package/dist/data/emojis-et.d.mts +39 -0
  96. package/dist/data/emojis-et.d.ts +38 -2
  97. package/dist/data/emojis-et.js +25 -2
  98. package/dist/data/emojis-et.mjs +2 -0
  99. package/dist/data/emojis-fi.d.mts +39 -0
  100. package/dist/data/emojis-fi.d.ts +38 -2
  101. package/dist/data/emojis-fi.js +25 -2
  102. package/dist/data/emojis-fi.mjs +2 -0
  103. package/dist/data/emojis-fr.d.mts +39 -0
  104. package/dist/data/emojis-fr.d.ts +38 -2
  105. package/dist/data/emojis-fr.js +25 -2
  106. package/dist/data/emojis-fr.mjs +2 -0
  107. package/dist/data/emojis-hi.d.mts +39 -0
  108. package/dist/data/emojis-hi.d.ts +38 -2
  109. package/dist/data/emojis-hi.js +25 -2
  110. package/dist/data/emojis-hi.mjs +2 -0
  111. package/dist/data/emojis-hu.d.mts +39 -0
  112. package/dist/data/emojis-hu.d.ts +38 -2
  113. package/dist/data/emojis-hu.js +25 -2
  114. package/dist/data/emojis-hu.mjs +2 -0
  115. package/dist/data/emojis-it.d.mts +39 -0
  116. package/dist/data/emojis-it.d.ts +38 -2
  117. package/dist/data/emojis-it.js +25 -2
  118. package/dist/data/emojis-it.mjs +2 -0
  119. package/dist/data/emojis-ja.d.mts +39 -0
  120. package/dist/data/emojis-ja.d.ts +38 -2
  121. package/dist/data/emojis-ja.js +25 -2
  122. package/dist/data/emojis-ja.mjs +2 -0
  123. package/dist/data/emojis-ko.d.mts +39 -0
  124. package/dist/data/emojis-ko.d.ts +38 -2
  125. package/dist/data/emojis-ko.js +25 -2
  126. package/dist/data/emojis-ko.mjs +2 -0
  127. package/dist/data/emojis-lt.d.mts +39 -0
  128. package/dist/data/emojis-lt.d.ts +38 -2
  129. package/dist/data/emojis-lt.js +25 -2
  130. package/dist/data/emojis-lt.mjs +2 -0
  131. package/dist/data/emojis-ms.d.mts +39 -0
  132. package/dist/data/emojis-ms.d.ts +38 -2
  133. package/dist/data/emojis-ms.js +25 -2
  134. package/dist/data/emojis-ms.mjs +2 -0
  135. package/dist/data/emojis-nb.d.mts +39 -0
  136. package/dist/data/emojis-nb.d.ts +38 -2
  137. package/dist/data/emojis-nb.js +25 -2
  138. package/dist/data/emojis-nb.mjs +2 -0
  139. package/dist/data/emojis-nl.d.mts +39 -0
  140. package/dist/data/emojis-nl.d.ts +38 -2
  141. package/dist/data/emojis-nl.js +25 -2
  142. package/dist/data/emojis-nl.mjs +2 -0
  143. package/dist/data/emojis-pl.d.mts +39 -0
  144. package/dist/data/emojis-pl.d.ts +38 -2
  145. package/dist/data/emojis-pl.js +25 -2
  146. package/dist/data/emojis-pl.mjs +2 -0
  147. package/dist/data/emojis-pt.d.mts +39 -0
  148. package/dist/data/emojis-pt.d.ts +38 -2
  149. package/dist/data/emojis-pt.js +25 -2
  150. package/dist/data/emojis-pt.mjs +2 -0
  151. package/dist/data/emojis-ru.d.mts +39 -0
  152. package/dist/data/emojis-ru.d.ts +38 -2
  153. package/dist/data/emojis-ru.js +25 -2
  154. package/dist/data/emojis-ru.mjs +2 -0
  155. package/dist/data/emojis-sv.d.mts +39 -0
  156. package/dist/data/emojis-sv.d.ts +38 -2
  157. package/dist/data/emojis-sv.js +25 -2
  158. package/dist/data/emojis-sv.mjs +2 -0
  159. package/dist/data/emojis-th.d.mts +39 -0
  160. package/dist/data/emojis-th.d.ts +38 -2
  161. package/dist/data/emojis-th.js +25 -2
  162. package/dist/data/emojis-th.mjs +2 -0
  163. package/dist/data/emojis-uk.d.mts +39 -0
  164. package/dist/data/emojis-uk.d.ts +38 -2
  165. package/dist/data/emojis-uk.js +25 -2
  166. package/dist/data/emojis-uk.mjs +2 -0
  167. package/dist/data/emojis-vi.d.mts +39 -0
  168. package/dist/data/emojis-vi.d.ts +38 -2
  169. package/dist/data/emojis-vi.js +25 -2
  170. package/dist/data/emojis-vi.mjs +2 -0
  171. package/dist/data/emojis-zh-hant.d.mts +39 -0
  172. package/dist/data/emojis-zh-hant.d.ts +38 -2
  173. package/dist/data/emojis-zh-hant.js +25 -2
  174. package/dist/data/emojis-zh-hant.mjs +2 -0
  175. package/dist/data/emojis-zh.d.mts +39 -0
  176. package/dist/data/emojis-zh.d.ts +38 -2
  177. package/dist/data/emojis-zh.js +25 -2
  178. package/dist/data/emojis-zh.mjs +2 -0
  179. package/dist/data/index.js +1 -0
  180. package/dist/data/registerDefaultEmojiData.d.ts +1 -0
  181. package/dist/data/registerDefaultEmojiData.js +3 -0
  182. package/dist/data/skinToneVariations.js +2 -2
  183. package/dist/data/skinToneVariations.ts +8 -7
  184. package/dist/data-core/pickerData.d.ts +12 -0
  185. package/dist/data-core/prepare.d.ts +23 -0
  186. package/dist/data-core/search.d.ts +13 -0
  187. package/dist/data-core/types.d.ts +23 -0
  188. package/dist/data.d.mts +72 -0
  189. package/dist/data.d.ts +72 -0
  190. package/dist/dataUtils/DataTypes.d.ts +23 -19
  191. package/dist/dataUtils/emojiSelectors.d.ts +15 -16
  192. package/dist/dataUtils/emojiUtils.d.ts +1 -12
  193. package/dist/dataUtils/nativeEmojiSequenceSupport.d.ts +10 -0
  194. package/dist/dataUtils/nativeEmojiSupport.d.ts +40 -0
  195. package/dist/dataUtils/parseNativeEmoji.d.ts +1 -1
  196. package/dist/dataUtils/suggested.d.ts +11 -11
  197. package/dist/dataUtils/suggestedEmojis.d.ts +7 -0
  198. package/dist/esm/chunks/chunk-7ZGTUZFB.mjs +8025 -0
  199. package/dist/esm/chunks/chunk-ACXAQEKG.mjs +149 -0
  200. package/dist/esm/chunks/chunk-F2KS7DCA.mjs +6735 -0
  201. package/dist/esm/chunks/chunk-L5W4PFRJ.mjs +14 -0
  202. package/dist/esm/chunks/chunk-LO4TPPLH.mjs +33 -0
  203. package/dist/esm/chunks/emojis-6L3GRBAP.mjs +7 -0
  204. package/dist/esm/data.mjs +11 -0
  205. package/dist/esm/index.mjs +279 -0
  206. package/dist/esm/primitives/index.mjs +8 -0
  207. package/dist/hooks/preloadEmoji.d.ts +5 -9
  208. package/dist/hooks/useActiveCategoryScrollDetection.d.ts +11 -11
  209. package/dist/hooks/useCategoryHeight.d.ts +7 -5
  210. package/dist/hooks/useCloseAllOpenToggles.d.ts +2 -2
  211. package/dist/hooks/useDataIdentityStabilityWarning.d.ts +13 -0
  212. package/dist/hooks/useDebouncedState.d.ts +1 -1
  213. package/dist/hooks/useDisallowMouseMove.d.ts +4 -4
  214. package/dist/hooks/useDisallowedEmojis.d.ts +2 -3
  215. package/dist/hooks/useEmojiPreviewEvents.d.ts +3 -3
  216. package/dist/hooks/useEmojiVirtualization.d.ts +22 -17
  217. package/dist/hooks/useFilter.d.ts +10 -16
  218. package/dist/hooks/useFocus.d.ts +3 -3
  219. package/dist/hooks/useInitialLoad.d.ts +2 -2
  220. package/dist/hooks/useIsEmojiHidden.d.ts +8 -8
  221. package/dist/hooks/useIsMounted.d.ts +1 -1
  222. package/dist/hooks/useIsSearchMode.d.ts +1 -1
  223. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -2
  224. package/dist/hooks/useKeyboardNavigation.d.ts +3 -1
  225. package/dist/hooks/useMouseDownHandlers.d.ts +8 -4
  226. package/dist/hooks/useOnFocus.d.ts +1 -1
  227. package/dist/hooks/useOnScroll.d.ts +2 -2
  228. package/dist/hooks/useReactionsFocus.d.ts +1 -0
  229. package/dist/hooks/useRegisterRegion.d.ts +24 -0
  230. package/dist/hooks/useResolvedEmojiData.d.ts +37 -0
  231. package/dist/hooks/useScrollCategoryIntoView.d.ts +1 -1
  232. package/dist/hooks/useSearchController.d.ts +17 -0
  233. package/dist/hooks/useSearchResults.d.ts +8 -0
  234. package/dist/hooks/useSetVariationPicker.d.ts +2 -2
  235. package/dist/hooks/useShouldHideCustomEmojis.d.ts +1 -1
  236. package/dist/hooks/useShouldShowSkinTonePicker.d.ts +4 -4
  237. package/dist/index.d.mts +376 -0
  238. package/dist/index.d.ts +376 -9
  239. package/dist/index.js +2 -8
  240. package/dist/primitives/CategoryNav.d.ts +4 -0
  241. package/dist/primitives/Empty.d.ts +6 -0
  242. package/dist/primitives/List.d.ts +4 -0
  243. package/dist/primitives/LoadError.d.ts +8 -0
  244. package/dist/primitives/Loading.d.ts +4 -0
  245. package/dist/primitives/Panel.d.ts +3 -0
  246. package/dist/primitives/Preview.d.ts +3 -0
  247. package/dist/primitives/Reactions.d.ts +2 -0
  248. package/dist/primitives/Root.d.ts +26 -0
  249. package/dist/primitives/Search.d.ts +5 -0
  250. package/dist/primitives/SearchInput.d.ts +3 -0
  251. package/dist/primitives/SkinTone.d.ts +4 -0
  252. package/dist/primitives/Viewport.d.ts +19 -0
  253. package/dist/primitives/appearance.d.ts +3 -0
  254. package/dist/primitives/components.d.ts +27 -0
  255. package/dist/primitives/hooks.d.ts +48 -0
  256. package/dist/primitives/index.d.mts +561 -0
  257. package/dist/primitives/index.d.ts +561 -0
  258. package/dist/primitives/index.js +2 -0
  259. package/dist/primitives/nativeProps.d.ts +15 -0
  260. package/dist/primitives/scope.d.ts +13 -0
  261. package/dist/primitives/structuralStyles.d.ts +16 -0
  262. package/dist/primitives/tokens.d.ts +18 -0
  263. package/dist/primitives/types.d.ts +85 -0
  264. package/dist/state/activeEmojiStore.d.ts +7 -0
  265. package/dist/state/navigationRegistry.d.ts +61 -0
  266. package/dist/state/regionTraversal.d.ts +20 -0
  267. package/dist/typeRefinements/typeRefinements.d.ts +6 -6
  268. package/dist/types/exposedTypes.d.ts +16 -6
  269. package/dist/types/exposedTypes.js +5 -0
  270. package/dist/virtualization/virtualizationHelpers.d.ts +22 -18
  271. package/llms-full.txt +3683 -0
  272. package/llms.txt +66 -480
  273. package/package.json +180 -66
  274. package/src/DomUtils/categoryNameFromDom.ts +1 -1
  275. package/src/DomUtils/classNames.ts +1 -4
  276. package/src/DomUtils/elementPositionInRow.ts +28 -6
  277. package/src/DomUtils/eventBelongsToPicker.ts +17 -0
  278. package/src/DomUtils/getActiveElement.ts +7 -1
  279. package/src/DomUtils/isJsdom.ts +12 -0
  280. package/src/DomUtils/isRtl.ts +5 -0
  281. package/src/DomUtils/keyboardNavigation.ts +164 -144
  282. package/src/DomUtils/scrollTo.ts +20 -18
  283. package/src/DomUtils/selectors.ts +30 -127
  284. package/src/EmojiPickerReact.tsx +155 -48
  285. package/src/Stylesheet/DedupedStyle.tsx +80 -0
  286. package/src/Stylesheet/stylesheet.tsx +128 -59
  287. package/src/components/Layout/Flex.tsx +12 -11
  288. package/src/components/Reactions/BtnPlus.tsx +61 -51
  289. package/src/components/Reactions/Reactions.tsx +113 -55
  290. package/src/components/atoms/Button.tsx +18 -15
  291. package/src/components/body/EmojiCategory.tsx +77 -40
  292. package/src/components/body/EmojiList.tsx +107 -44
  293. package/src/components/body/EmojiVariationPicker.tsx +113 -66
  294. package/src/components/body/MeasureEmoji.tsx +9 -2
  295. package/src/components/body/listComponents.tsx +79 -0
  296. package/src/components/context/ElementRefContext.tsx +46 -35
  297. package/src/components/context/PickerConfigContext.tsx +55 -40
  298. package/src/components/context/PickerContext.tsx +567 -92
  299. package/src/components/context/PickerDataContext.tsx +114 -99
  300. package/src/components/emoji/BaseEmojiProps.ts +5 -4
  301. package/src/components/emoji/ClickableEmojiButton.tsx +148 -63
  302. package/src/components/emoji/Emoji.tsx +24 -2
  303. package/src/components/emoji/EmojiImg.tsx +13 -12
  304. package/src/components/emoji/ExportedEmoji.tsx +5 -4
  305. package/src/components/emoji/NativeEmoji.tsx +19 -16
  306. package/src/components/emoji/ViewOnlyEmoji.tsx +55 -30
  307. package/src/components/emoji/emojiStyles.ts +12 -11
  308. package/src/components/footer/Preview.tsx +86 -91
  309. package/src/components/header/Header.tsx +21 -6
  310. package/src/components/header/Search/BtnClearSearch.tsx +69 -55
  311. package/src/components/header/Search/IcnSearch.tsx +21 -21
  312. package/src/components/header/Search/Search.tsx +79 -137
  313. package/src/components/header/SkinTonePicker/BtnSkinToneVariation.tsx +99 -62
  314. package/src/components/header/SkinTonePicker/SkinTonePicker.tsx +84 -46
  315. package/src/components/icons/svgIcons.ts +17 -0
  316. package/src/components/main/PickerMainBehaviors.tsx +163 -0
  317. package/src/components/main/defaultAppearance.tsx +189 -0
  318. package/src/components/main/labelHeight.ts +5 -0
  319. package/src/components/navigation/CategoryButton.tsx +83 -57
  320. package/src/components/navigation/CategoryNavIcon.tsx +73 -194
  321. package/src/components/navigation/CategoryNavigation.tsx +118 -46
  322. package/src/config/categoryConfig.ts +7 -3
  323. package/src/config/cdnUrls.ts +11 -21
  324. package/src/config/compareConfig.ts +128 -30
  325. package/src/config/config.ts +228 -24
  326. package/src/config/defaultPickerConfiguration.ts +7 -0
  327. package/src/config/mutableConfig.ts +44 -20
  328. package/src/config/useConfig.ts +130 -37
  329. package/src/data/defaultEmojiData.ts +49 -0
  330. package/src/data/registerDefaultEmojiData.ts +8 -0
  331. package/src/data/skinToneVariations.ts +8 -7
  332. package/src/data-core/pickerData.ts +171 -0
  333. package/src/data-core/prepare.ts +163 -0
  334. package/src/data-core/search.ts +122 -0
  335. package/src/data-core/types.ts +36 -0
  336. package/src/data.ts +10 -0
  337. package/src/dataUtils/DataTypes.ts +4 -0
  338. package/src/dataUtils/emojiSelectors.ts +59 -63
  339. package/src/dataUtils/emojiUtils.ts +17 -74
  340. package/src/dataUtils/nativeEmojiSequenceSupport.ts +116 -0
  341. package/src/dataUtils/nativeEmojiSupport.ts +160 -0
  342. package/src/dataUtils/parseNativeEmoji.ts +3 -4
  343. package/src/dataUtils/suggested.ts +8 -4
  344. package/src/dataUtils/suggestedEmojis.ts +92 -0
  345. package/src/env.d.ts +4 -0
  346. package/src/hooks/preloadEmoji.ts +2 -47
  347. package/src/hooks/useActiveCategoryScrollDetection.ts +28 -16
  348. package/src/hooks/useCategoryHeight.ts +116 -10
  349. package/src/hooks/useDataIdentityStabilityWarning.ts +86 -0
  350. package/src/hooks/useDebouncedState.ts +13 -1
  351. package/src/hooks/useDisallowedEmojis.ts +31 -42
  352. package/src/hooks/useEmojiPreviewEvents.ts +43 -10
  353. package/src/hooks/useEmojiVirtualization.tsx +112 -52
  354. package/src/hooks/useFilter.ts +92 -132
  355. package/src/hooks/useFocus.ts +14 -24
  356. package/src/hooks/useIsEmojiHidden.ts +22 -14
  357. package/src/hooks/useKeyboardNavigation.ts +412 -432
  358. package/src/hooks/useMouseDownHandlers.ts +91 -16
  359. package/src/hooks/useOnFocus.ts +12 -3
  360. package/src/hooks/useOnScroll.ts +18 -2
  361. package/src/hooks/useReactionsFocus.ts +118 -0
  362. package/src/hooks/useRegisterRegion.ts +92 -0
  363. package/src/hooks/useResolvedEmojiData.ts +200 -0
  364. package/src/hooks/useScrollCategoryIntoView.ts +74 -12
  365. package/src/hooks/useSearchController.ts +369 -0
  366. package/src/hooks/useSearchResults.ts +51 -0
  367. package/src/hooks/useSetVariationPicker.ts +4 -1
  368. package/src/index.tsx +67 -5
  369. package/src/primitives/CategoryNav.tsx +40 -0
  370. package/src/primitives/Empty.tsx +68 -0
  371. package/src/primitives/List.tsx +61 -0
  372. package/src/primitives/LoadError.tsx +38 -0
  373. package/src/primitives/Loading.tsx +60 -0
  374. package/src/primitives/Panel.tsx +47 -0
  375. package/src/primitives/Preview.tsx +38 -0
  376. package/src/primitives/Reactions.tsx +2 -0
  377. package/src/primitives/Root.tsx +398 -0
  378. package/src/primitives/Search.tsx +41 -0
  379. package/src/primitives/SearchInput.tsx +110 -0
  380. package/src/primitives/SkinTone.tsx +76 -0
  381. package/src/primitives/Viewport.tsx +204 -0
  382. package/src/primitives/appearance.tsx +7 -0
  383. package/src/primitives/components.tsx +30 -0
  384. package/src/primitives/hooks.ts +165 -0
  385. package/src/primitives/index.ts +94 -0
  386. package/src/primitives/nativeProps.ts +90 -0
  387. package/src/primitives/scope.tsx +109 -0
  388. package/src/primitives/structuralStyles.tsx +136 -0
  389. package/src/primitives/tokens.ts +150 -0
  390. package/src/primitives/types.ts +192 -0
  391. package/src/state/activeEmojiStore.ts +39 -0
  392. package/src/state/navigationRegistry.ts +209 -0
  393. package/src/state/regionTraversal.ts +116 -0
  394. package/src/svg.d.ts +2 -2
  395. package/src/types/exposedTypes.ts +28 -1
  396. package/src/virtualization/virtualizationHelpers.ts +29 -8
  397. package/dist/components/body/Body.d.ts +0 -2
  398. package/dist/components/main/PickerMain.d.ts +0 -7
  399. package/dist/dataUtils/alphaNumericEmojiIndex.d.ts +0 -5
  400. package/dist/emoji-picker-react.cjs.development.js +0 -31413
  401. package/dist/emoji-picker-react.cjs.development.js.map +0 -1
  402. package/dist/emoji-picker-react.cjs.production.min.js +0 -2
  403. package/dist/emoji-picker-react.cjs.production.min.js.map +0 -1
  404. package/dist/emoji-picker-react.esm.js +0 -31411
  405. package/dist/emoji-picker-react.esm.js.map +0 -1
  406. package/dist/hooks/useHideEmojisByUniocode.d.ts +0 -1
  407. package/src/components/body/Body.tsx +0 -43
  408. package/src/components/main/PickerMain.tsx +0 -249
  409. package/src/dataUtils/alphaNumericEmojiIndex.ts +0 -21
@@ -1,75 +1,182 @@
1
1
  import * as React from 'react';
2
2
 
3
- import { PickerStyleTag } from './Stylesheet/stylesheet';
4
- import { Reactions } from './components/Reactions/Reactions';
5
- import { Body } from './components/body/Body';
6
- import { ElementRefContextProvider } from './components/context/ElementRefContext';
7
- import { PickerConfigProvider } from './components/context/PickerConfigContext';
8
- import { useReactionsModeState } from './components/context/PickerContext';
9
- import { PickerDataProvider } from './components/context/PickerDataContext';
10
- import { Preview } from './components/footer/Preview';
11
3
  import { Header } from './components/header/Header';
12
- import PickerMain from './components/main/PickerMain';
4
+ import {
5
+ defaultRootClassName,
6
+ defaultRootStyle,
7
+ } from './components/main/defaultAppearance';
13
8
  import { compareConfig } from './config/compareConfig';
14
- import { useAllowExpandReactions, useOpenConfig } from './config/useConfig';
9
+ import { resolveSkinTonePickerLocation } from './config/config';
10
+ import { DefaultPickerConfiguration } from './config/defaultPickerConfiguration';
11
+ import {
12
+ validColumns,
13
+ usePreviewConfig,
14
+ useSkinTonesDisabledConfig,
15
+ } from './config/useConfig';
16
+ import { useIsSkinToneInPreview } from './hooks/useShouldShowSkinTonePicker';
17
+ import {
18
+ Empty,
19
+ List,
20
+ Loading,
21
+ LoadError,
22
+ Preview,
23
+ SkinTone,
24
+ Panel,
25
+ Reactions,
26
+ Root,
27
+ Viewport,
28
+ } from './primitives';
29
+ import { isPickerBehaviorProp } from './primitives/Root';
30
+ import type { RootBehaviorProps, RootProps } from './primitives/types';
31
+ import { SkinTonePickerLocation } from './types/exposedTypes';
15
32
 
16
33
  import { PickerProps } from './index';
17
34
 
35
+ // Canonical default composition: the
36
+ // default picker is assembled from the same exported primitive modules
37
+ // advanced consumers use. Private wrappers provide appearance/layout only;
38
+ // all behavior lives in the shared primitives below.
18
39
  function EmojiPicker(props: PickerProps) {
40
+ const rootInput = props as PickerProps & {
41
+ colorScheme?: PickerProps['theme'];
42
+ unstyled?: boolean;
43
+ components?: RootProps['components'];
44
+ };
45
+ const {
46
+ theme: legacyTheme,
47
+ colorScheme,
48
+ width,
49
+ height,
50
+ className,
51
+ style,
52
+ unstyled,
53
+ components,
54
+ open,
55
+ searchDisabled = false,
56
+ skinTonesDisabled = false,
57
+ skinTonePickerLocation = SkinTonePickerLocation.SEARCH,
58
+ previewConfig,
59
+ ...rest
60
+ } = rootInput;
61
+ const theme = colorScheme ?? legacyTheme;
62
+ const showPreview = previewConfig?.showPreview ?? true;
63
+ const resolvedLocation = resolveSkinTonePickerLocation(
64
+ skinTonePickerLocation,
65
+ searchDisabled,
66
+ showPreview,
67
+ );
68
+ const defaultConfiguration = {
69
+ searchDisabled,
70
+ skinTonesDisabled,
71
+ skinTonePickerLocation: resolvedLocation,
72
+ previewConfig,
73
+ // Closed, as in v4, keeps the picker's state (skin tone, search,
74
+ // reactions mode) and renders nothing.
75
+ open: open !== false,
76
+ };
77
+ const { behaviorProps, unknownProps } = pickBehaviorProps(rest);
78
+ useUnknownPropsWarning(unknownProps);
79
+
19
80
  return (
20
- <ElementRefContextProvider>
21
- <PickerStyleTag nonce={props.nonce} />
22
- <PickerConfigProvider {...props}>
23
- <PickerDataProvider>
24
- <ContentControl />
25
- </PickerDataProvider>
26
- </PickerConfigProvider>
27
- </ElementRefContextProvider>
81
+ <DefaultPickerConfiguration.Provider value={defaultConfiguration}>
82
+ <Root
83
+ appearance={unstyled ? 'none' : 'default'}
84
+ components={components}
85
+ {...(behaviorProps as RootBehaviorProps)}
86
+ className={defaultRootClassName(theme, className, unstyled)}
87
+ style={defaultRootStyle({
88
+ width,
89
+ height,
90
+ style,
91
+ columns: validColumns(props.columns),
92
+ })}
93
+ >
94
+ <Reactions />
95
+ <Panel>{CONTENT}</Panel>
96
+ </Root>
97
+ </DefaultPickerConfiguration.Provider>
28
98
  );
29
99
  }
30
100
 
31
- function ContentControl() {
32
- const [reactionsDefaultOpen] = useReactionsModeState();
33
- const allowExpandReactions = useAllowExpandReactions();
101
+ const NATIVE_ATTRIBUTES: ReadonlySet<string> = new Set([
102
+ 'id',
103
+ 'title',
104
+ 'lang',
105
+ 'dir',
106
+ ]);
34
107
 
35
- const [renderAll, setRenderAll] = React.useState(!reactionsDefaultOpen);
36
- const isOpen = useOpenConfig();
37
-
38
- React.useEffect(() => {
39
- if (reactionsDefaultOpen && !allowExpandReactions) {
40
- return;
41
- }
108
+ function isNativeAttribute(key: string): boolean {
109
+ return (
110
+ NATIVE_ATTRIBUTES.has(key) ||
111
+ key.startsWith('aria-') ||
112
+ key.startsWith('data-')
113
+ );
114
+ }
42
115
 
43
- if (!renderAll) {
44
- setRenderAll(true);
116
+ // Picker props and plain identifying attributes (id, aria-*, data-*) reach
117
+ // Root; anything else is dropped, as in v4. Forwarding every prop would
118
+ // leak removed v3/v4 props such as `pickerStyle` onto the aside as invalid
119
+ // attributes, or turn stray handlers live.
120
+ function pickBehaviorProps(props: object): {
121
+ behaviorProps: Record<string, unknown>;
122
+ unknownProps: string;
123
+ } {
124
+ const behaviorProps: Record<string, unknown> = {};
125
+ const unknown: string[] = [];
126
+ const values = props as Record<string, unknown>;
127
+ for (const key of Object.keys(values)) {
128
+ if (isPickerBehaviorProp(key) || isNativeAttribute(key)) {
129
+ behaviorProps[key] = values[key];
130
+ } else {
131
+ unknown.push(key);
45
132
  }
46
- }, [renderAll, allowExpandReactions, reactionsDefaultOpen]);
47
-
48
- if (!isOpen) {
49
- return null;
50
133
  }
134
+ return { behaviorProps, unknownProps: unknown.join(', ') };
135
+ }
51
136
 
52
- return (
53
- <PickerMain>
54
- <Reactions />
55
- <ExpandedPickerContent renderAll={renderAll} />
56
- </PickerMain>
57
- );
137
+ const useUnknownPropsWarning: (unknownProps: string) => void =
138
+ process.env.NODE_ENV === 'production'
139
+ ? () => undefined
140
+ : useDevUnknownPropsWarning;
141
+
142
+ function useDevUnknownPropsWarning(unknownProps: string) {
143
+ React.useEffect(() => {
144
+ if (unknownProps) {
145
+ // eslint-disable-next-line no-console
146
+ console.warn(
147
+ `[emoji-picker-react] Ignoring unknown prop(s): ${unknownProps}. ` +
148
+ 'See docs/v5/MIGRATION.md for removed props.',
149
+ );
150
+ }
151
+ }, [unknownProps]);
58
152
  }
59
153
 
60
- function ExpandedPickerContent({ renderAll }: { renderAll: boolean }) {
61
- if (!renderAll) {
62
- return null;
63
- }
154
+ function ContentControl() {
155
+ const showPreview = usePreviewConfig().showPreview;
156
+ const skinTonesDisabled = useSkinTonesDisabledConfig();
157
+ const toneInPreview = useIsSkinToneInPreview();
64
158
 
65
159
  return (
66
160
  <>
67
161
  <Header />
68
- <Body />
69
- <Preview />
162
+ <Viewport>
163
+ <List />
164
+ <Empty />
165
+ <Loading />
166
+ <LoadError />
167
+ </Viewport>
168
+ {showPreview && (
169
+ <Preview>
170
+ {!skinTonesDisabled && toneInPreview && (
171
+ <SkinTone orientation="vertical" />
172
+ )}
173
+ </Preview>
174
+ )}
70
175
  </>
71
176
  );
72
177
  }
73
178
 
74
- // eslint-disable-next-line complexity
75
- export default React.memo(EmojiPicker, compareConfig);
179
+ // One immutable composition element; state still belongs to each mounted Root.
180
+ const CONTENT = /* @__PURE__ */ React.createElement(ContentControl);
181
+
182
+ export default /* @__PURE__ */ React.memo(EmojiPicker, compareConfig);
@@ -0,0 +1,80 @@
1
+ import * as React from 'react';
2
+
3
+ import { useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect';
4
+
5
+ type Claim = { update: () => void; detached: () => boolean };
6
+
7
+ // Root node (a document or shadow root) → nonce and CSS text → mounted
8
+ // claims, in mount order. The first claim renders the style element; the
9
+ // rest render nothing. A page with a picker per message otherwise repeats
10
+ // the full library sheet once per picker.
11
+ const claimsByRoot = new WeakMap<Node, Record<string, Claim[]>>();
12
+
13
+ /**
14
+ * Renders `css` once per document or shadow root. Every instance renders
15
+ * the element during SSR and its first client render, so hydration matches
16
+ * the server markup; duplicates drop right after the first paint.
17
+ * When the owner unmounts, the next instance renders the element in the
18
+ * same commit. A different nonce or layer gets its own element: a style
19
+ * allowed by one nonce must not stand in for another under CSP.
20
+ */
21
+ export function DedupedStyle({ css, nonce }: { css: string; nonce?: string }) {
22
+ const styleRef = React.useRef<HTMLStyleElement>(null);
23
+ const rootRef = React.useRef<Node | undefined>(undefined);
24
+ const [owner, setOwner] = React.useState(true);
25
+
26
+ const syncRef = React.useRef<(() => void) | undefined>(undefined);
27
+
28
+ // Register in the commit that mounts the element, so ownership is known
29
+ // before any later picker mounts. A sibling's ownership changes only on
30
+ // unmount (below) and after paint: a state update during layout effects
31
+ // would flush every pending passive effect into the mount, delaying the
32
+ // first paint of the whole picker.
33
+ useIsomorphicLayoutEffect(() => {
34
+ const style = styleRef.current;
35
+ const root = (rootRef.current =
36
+ rootRef.current || (style ? style.getRootNode() : undefined));
37
+ if (!root) {
38
+ return;
39
+ }
40
+ const byKey = claimsByRoot.get(root) || {};
41
+ claimsByRoot.set(root, byKey);
42
+ const key = nonce + css;
43
+ const claims = (byKey[key] = byKey[key] || []);
44
+ const claim: Claim = {
45
+ update: () => setOwner(claims[0] === claim),
46
+ detached: () => !!styleRef.current && !styleRef.current.isConnected,
47
+ };
48
+ // An owner whose element left the document without unmounting (its
49
+ // container was removed by hand) cannot style anything: it yields.
50
+ const sync = (syncRef.current = () => {
51
+ claims.sort((a, b) => +a.detached() - +b.detached());
52
+ claims.forEach((each) => each.update());
53
+ });
54
+ claims.push(claim);
55
+
56
+ return () => {
57
+ syncRef.current = undefined;
58
+ claims.splice(claims.indexOf(claim), 1);
59
+ // The next picker takes over in this same commit: no unstyled frame.
60
+ if (claims.length) {
61
+ sync();
62
+ } else {
63
+ delete byKey[key];
64
+ }
65
+ };
66
+ }, [css, nonce]);
67
+
68
+ React.useEffect(() => {
69
+ if (syncRef.current) syncRef.current();
70
+ }, [css, nonce]);
71
+
72
+ return owner ? (
73
+ <style
74
+ ref={styleRef}
75
+ nonce={nonce}
76
+ suppressHydrationWarning
77
+ dangerouslySetInnerHTML={{ __html: css }}
78
+ />
79
+ ) : null;
80
+ }
@@ -2,8 +2,55 @@ import * as React from 'react';
2
2
  import { Styles, createSheet } from 'shipstyles';
3
3
 
4
4
  import { ClassNames } from '../DomUtils/classNames';
5
+ import { isJsdom } from '../DomUtils/isJsdom';
5
6
 
6
- export const stylesheet = createSheet('epr', null);
7
+ import { DedupedStyle } from './DedupedStyle';
8
+
9
+ // No DOM root: allocating this sheet has no observable effect when its
10
+ // consumers are unused. Keep component style construction in annotated,
11
+ // argument-free factories so bundlers can drop an unused part together
12
+ // with its styles/icons (including darkMode argument construction).
13
+ // A rendered part references its style handles and retains its factory.
14
+ // Default emoji-data registration is intentionally NOT marked pure.
15
+ export const stylesheet = /* @__PURE__ */ createSheet('epr', null);
16
+
17
+ /**
18
+ * Library CSS is unlayered by default, like v4: library classes win over
19
+ * ordinary element/universal resets (`* { padding: 0 }`, `input { … }`),
20
+ * which unlayered app CSS would otherwise apply over a layered library.
21
+ *
22
+ * Design-token declarations (`--epr-*`) are emitted at zero specificity
23
+ * (`:where(…)`), so any consumer selector — one class, any load order —
24
+ * overrides them.
25
+ *
26
+ * `cssLayer` opts into a named cascade layer for layered frameworks
27
+ * (Tailwind v4 utilities cannot beat unlayered CSS): declare it first,
28
+ * e.g. `@layer epr, theme, base, components, utilities;`.
29
+ */
30
+ const TOKEN_RULE = /^([^{}@][^{}]*?)\s*\{((?:\s*--[\w-]+\s*:[^;{}]*;?)+)\s*\}$/;
31
+ const CSS_LAYER_NAME =
32
+ /^(?:[a-zA-Z_]|-[a-zA-Z_-])[a-zA-Z0-9_-]*(?:\.(?:[a-zA-Z_]|-[a-zA-Z_-])[a-zA-Z0-9_-]*)*$/;
33
+
34
+ export function finalizeCss(css: string, cssLayer?: string): string {
35
+ if (!css) {
36
+ return css;
37
+ }
38
+ // jsdom supports neither @layer nor :where reliably; keep plain CSS
39
+ // there so jsdom suites keep computed styles.
40
+ if (isJsdom()) {
41
+ return css;
42
+ }
43
+ const out = css
44
+ .split('\n')
45
+ .map((line) => {
46
+ const match = TOKEN_RULE.exec(line.trim());
47
+ return match ? `:where(${match[1]}) {${match[2]}}` : line;
48
+ })
49
+ .join('\n');
50
+ return cssLayer && CSS_LAYER_NAME.test(cssLayer)
51
+ ? `@layer ${cssLayer}{${out}}`
52
+ : out;
53
+ }
7
54
 
8
55
  const hidden = {
9
56
  display: 'none',
@@ -13,76 +60,98 @@ const hidden = {
13
60
  overflow: 'hidden',
14
61
  };
15
62
 
16
- export const commonStyles = stylesheet.create({
17
- hidden: {
18
- '.': ClassNames.hidden,
19
- ...hidden,
20
- },
21
- });
63
+ export const commonStyles = /* @__PURE__ */ (() =>
64
+ stylesheet.create({
65
+ hidden: {
66
+ '.': ClassNames.hidden,
67
+ ...hidden,
68
+ },
69
+ }))();
22
70
 
23
- export const PickerStyleTag = React.memo(function PickerStyleTag({
24
- nonce,
25
- }: {
26
- nonce?: string;
27
- }) {
28
- return (
29
- <style
30
- nonce={nonce}
31
- suppressHydrationWarning
32
- dangerouslySetInnerHTML={{ __html: stylesheet.getStyle() }}
33
- />
34
- );
35
- });
71
+ export const PickerStyleTag = /* @__PURE__ */ React.memo(
72
+ function PickerStyleTag({
73
+ nonce,
74
+ cssLayer,
75
+ }: {
76
+ nonce?: string;
77
+ cssLayer?: string;
78
+ }) {
79
+ return (
80
+ <DedupedStyle
81
+ nonce={nonce}
82
+ css={finalizeCss(stylesheet.getStyle(), cssLayer)}
83
+ />
84
+ );
85
+ },
86
+ );
36
87
 
37
- export const commonInteractionStyles = stylesheet.create({
38
- '.epr-main': {
39
- ':has(input:not(:placeholder-shown))': {
40
- categoryBtn: {
41
- ':hover': {
42
- opacity: '1',
43
- color: 'var(--epr-category-icon-active-color, #3371B7)',
88
+ // Behavioral state selectors are scoped to the structural root class that
89
+ // every Root carries (default picker and bare primitives alike). Scoping
90
+ // them to the default appearance's classes (epr-main / EmojiPickerReact)
91
+ // left bare compositions with an always-visible clear button, no active
92
+ // category tab state, and search-hidden items that never hid.
93
+ export const commonInteractionStyles = /* @__PURE__ */ (() =>
94
+ stylesheet.create({
95
+ '.epr-structural-root': {
96
+ ':has(input:not(:placeholder-shown))': {
97
+ categoryBtn: {
98
+ ':hover': {
99
+ opacity: '1',
100
+ color: 'var(--epr-category-icon-active-color, #3371B7)',
101
+ },
102
+ },
103
+ hiddenOnSearch: {
104
+ '.': ClassNames.hiddenOnSearch,
105
+ ...hidden,
44
106
  },
45
107
  },
46
- hiddenOnSearch: {
47
- '.': ClassNames.hiddenOnSearch,
48
- ...hidden,
108
+ ':has(input:placeholder-shown)': {
109
+ visibleOnSearchOnly: hidden,
49
110
  },
50
111
  },
51
- ':has(input:placeholder-shown)': {
52
- visibleOnSearchOnly: hidden,
53
- },
54
- },
55
- hiddenOnReactions: {
56
- transition: 'all 0.5s ease-in-out',
57
- },
58
- '.epr-reactions': {
59
112
  hiddenOnReactions: {
60
- height: '0px',
61
- width: '0px',
62
- opacity: '0',
63
- pointerEvents: 'none',
64
- overflow: 'hidden',
113
+ transition: 'all 0.5s ease-in-out',
65
114
  },
66
- },
67
- '.EmojiPickerReact:not(.epr-search-active)': {
68
- categoryBtn: {
69
- ':hover': {
70
- opacity: '1',
71
- color: 'var(--epr-category-icon-active-color, #3371B7)',
72
- },
73
- '&.epr-active': {
74
- opacity: '1',
75
- color: 'var(--epr-category-icon-active-color, #3371B7)',
115
+ '.epr-reactions': {
116
+ hiddenOnReactions: {
117
+ height: '0px',
118
+ width: '0px',
119
+ opacity: '0',
120
+ pointerEvents: 'none',
121
+ overflow: 'hidden',
76
122
  },
77
123
  },
78
- visibleOnSearchOnly: {
79
- '.': 'epr-visible-on-search-only',
80
- ...hidden,
124
+ '.epr-structural-root:not(.epr-search-active)': {
125
+ categoryBtn: {
126
+ ':hover': {
127
+ opacity: '1',
128
+ color: 'var(--epr-category-icon-active-color, #3371B7)',
129
+ },
130
+ '&.epr-active': {
131
+ opacity: '1',
132
+ color: 'var(--epr-category-icon-active-color, #3371B7)',
133
+ },
134
+ },
135
+ visibleOnSearchOnly: {
136
+ '.': 'epr-visible-on-search-only',
137
+ ...hidden,
138
+ },
81
139
  },
82
- },
83
- });
140
+ }))();
84
141
 
85
- export function darkMode(key: string, value: Styles) {
142
+ // Explicit return type: the inferred shape references shipstyles'
143
+ // private PostConditionStyles, which declaration emit cannot name
144
+ // (TS4058). Spelling it with the exported Styles type keeps entry
145
+ // declaration emit clean.
146
+ export function darkMode(
147
+ key: string,
148
+ value: Styles,
149
+ ): {
150
+ '.epr-dark-theme': { [styleKey: string]: Styles };
151
+ '.epr-auto-theme': {
152
+ [styleKey: string]: { '@media (prefers-color-scheme: dark)': Styles };
153
+ };
154
+ } {
86
155
  return {
87
156
  '.epr-dark-theme': {
88
157
  [key]: value,
@@ -31,14 +31,15 @@ export default function Flex({
31
31
  );
32
32
  }
33
33
 
34
- const styles = stylesheet.create({
35
- flex: {
36
- display: 'flex',
37
- },
38
- [FlexDirection.ROW]: {
39
- flexDirection: 'row',
40
- },
41
- [FlexDirection.COLUMN]: {
42
- flexDirection: 'column',
43
- },
44
- });
34
+ const styles = /* @__PURE__ */ (() =>
35
+ stylesheet.create({
36
+ flex: {
37
+ display: 'flex',
38
+ },
39
+ [FlexDirection.ROW]: {
40
+ flexDirection: 'row',
41
+ },
42
+ [FlexDirection.COLUMN]: {
43
+ flexDirection: 'column',
44
+ },
45
+ }))();
@@ -2,65 +2,75 @@ import * as React from 'react';
2
2
  import { cx } from 'shipstyles';
3
3
 
4
4
  import { darkMode, stylesheet } from '../../Stylesheet/stylesheet';
5
+ import { useLabels } from '../../config/useConfig';
6
+ import { useDefaultAppearance } from '../../primitives/appearance';
7
+ import { usePickerComponents } from '../../primitives/components';
5
8
  import { Button } from '../atoms/Button';
6
9
  import { useReactionsModeState } from '../context/PickerContext';
7
-
8
- import Plus from './svg/plus.svg';
10
+ import { PLUS_ICON as Plus } from '../icons/svgIcons';
9
11
 
10
12
  export function BtnPlus() {
11
13
  const [, setReactionsMode] = useReactionsModeState();
12
- return (
13
- <Button
14
- aria-label="Show all Emojis"
15
- title="Show all Emojis"
16
- tabIndex={0}
17
- className={cx(styles.plusSign)}
18
- onClick={() => setReactionsMode(false)}
19
- />
20
- );
14
+ const labels = useLabels();
15
+ const appearance = useDefaultAppearance();
16
+ const { ExpandButton: Custom } = usePickerComponents();
17
+ const props = {
18
+ type: 'button' as const,
19
+ 'aria-label': labels.expandReactions,
20
+ title: labels.expandReactions,
21
+ tabIndex: 0,
22
+ className: cx(appearance && !Custom && styles.plusSign),
23
+ 'data-epr-part': 'expand-reactions',
24
+ onClick: (event: React.MouseEvent<HTMLButtonElement>) => {
25
+ if (!event.defaultPrevented) setReactionsMode(false);
26
+ },
27
+ children: appearance && !Custom ? undefined : '+',
28
+ };
29
+ return Custom ? <Custom {...props} /> : <Button {...props} />;
21
30
  }
22
31
 
23
- const styles = stylesheet.create({
24
- plusSign: {
25
- fontSize: '20px',
26
- padding: '17px',
27
- color: 'var(--epr-text-color)',
28
- borderRadius: '50%',
29
- textAlign: 'center',
30
- lineHeight: '100%',
31
- width: '20px',
32
- height: '20px',
33
- display: 'flex',
34
- justifyContent: 'center',
35
- alignItems: 'center',
36
- transition: 'background-color 0.2s ease-in-out',
37
- ':after': {
38
- content: '',
39
- minWidth: '20px',
40
- minHeight: '20px',
41
- backgroundImage: `url(${Plus})`,
42
- backgroundColor: 'transparent',
43
- backgroundRepeat: 'no-repeat',
44
- backgroundSize: '20px',
45
- backgroundPositionY: '0',
46
- },
47
- ':hover': {
48
- color: 'var(--epr-highlight-color)',
49
- backgroundColor: 'var(--epr-hover-bg-color-reduced-opacity)',
32
+ const styles = /* @__PURE__ */ (() =>
33
+ stylesheet.create({
34
+ plusSign: {
35
+ fontSize: '20px',
36
+ padding: '17px',
37
+ color: 'var(--epr-text-color)',
38
+ borderRadius: '50%',
39
+ textAlign: 'center',
40
+ lineHeight: '100%',
41
+ width: '20px',
42
+ height: '20px',
43
+ display: 'flex',
44
+ justifyContent: 'center',
45
+ alignItems: 'center',
46
+ transition: 'background-color 0.2s ease-in-out',
50
47
  ':after': {
51
- backgroundPositionY: '-20px',
48
+ content: '',
49
+ minWidth: '20px',
50
+ minHeight: '20px',
51
+ backgroundImage: `url("${Plus}")`,
52
+ backgroundColor: 'transparent',
53
+ backgroundRepeat: 'no-repeat',
54
+ backgroundSize: '20px',
55
+ backgroundPositionY: '0',
52
56
  },
53
- },
54
- ':focus': {
55
- color: 'var(--epr-highlight-color)',
56
- backgroundColor: 'var(--epr-hover-bg-color-reduced-opacity)',
57
- ':after': {
58
- backgroundPositionY: '-40px',
57
+ ':hover': {
58
+ color: 'var(--epr-highlight-color)',
59
+ backgroundColor: 'var(--epr-hover-bg-color-reduced-opacity)',
60
+ ':after': {
61
+ backgroundPositionY: '-20px',
62
+ },
63
+ },
64
+ ':focus': {
65
+ color: 'var(--epr-highlight-color)',
66
+ backgroundColor: 'var(--epr-hover-bg-color-reduced-opacity)',
67
+ ':after': {
68
+ backgroundPositionY: '-40px',
69
+ },
59
70
  },
60
71
  },
61
- },
62
- ...darkMode('plusSign', {
63
- ':after': { backgroundPositionY: '-40px' },
64
- ':hover:after': { backgroundPositionY: '-60px' },
65
- }),
66
- });
72
+ ...darkMode('plusSign', {
73
+ ':after': { backgroundPositionY: '-40px' },
74
+ ':hover:after': { backgroundPositionY: '-60px' },
75
+ }),
76
+ }))();