expo-native-sheet-emojis 1.0.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.
Files changed (441) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +323 -0
  3. package/android/build/.transforms/5729d3188aa52ad4699e57ce2c5c9358/results.bin +1 -0
  4. package/android/build/.transforms/5729d3188aa52ad4699e57ce2c5c9358/transformed/classes/classes_dex/classes.dex +0 -0
  5. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/results.bin +1 -0
  6. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/BuildConfig.dex +0 -0
  7. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategory.dex +0 -0
  8. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter$VH.dex +0 -0
  9. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter.dex +0 -0
  10. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategoryStrip$Companion.dex +0 -0
  11. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategoryStrip.dex +0 -0
  12. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiData.dex +0 -0
  13. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$Companion.dex +0 -0
  14. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$EmojiVH.dex +0 -0
  15. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$HeaderVH.dex +0 -0
  16. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Emoji.dex +0 -0
  17. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Header.dex +0 -0
  18. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem.dex +0 -0
  19. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter.dex +0 -0
  20. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiItem.dex +0 -0
  21. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSearchBar$5.dex +0 -0
  22. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSearchBar.dex +0 -0
  23. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetContentView.dex +0 -0
  24. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$2$2.dex +0 -0
  25. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$3$1.dex +0 -0
  26. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$1.dex +0 -0
  27. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$10.dex +0 -0
  28. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$11.dex +0 -0
  29. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$12.dex +0 -0
  30. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$2.dex +0 -0
  31. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$3.dex +0 -0
  32. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$4.dex +0 -0
  33. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$5.dex +0 -0
  34. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$6.dex +0 -0
  35. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$7.dex +0 -0
  36. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$8.dex +0 -0
  37. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$9.dex +0 -0
  38. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$1.dex +0 -0
  39. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$2.dex +0 -0
  40. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithoutArgs$1.dex +0 -0
  41. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$OnCreate$1.dex +0 -0
  42. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$View$1.dex +0 -0
  43. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$1.dex +0 -0
  44. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$10.dex +0 -0
  45. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$11.dex +0 -0
  46. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$12.dex +0 -0
  47. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$2.dex +0 -0
  48. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$3.dex +0 -0
  49. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$4.dex +0 -0
  50. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$5.dex +0 -0
  51. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$6.dex +0 -0
  52. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$7.dex +0 -0
  53. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$8.dex +0 -0
  54. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$9.dex +0 -0
  55. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule.dex +0 -0
  56. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetTheme$Companion.dex +0 -0
  57. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetTheme.dex +0 -0
  58. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$6.dex +0 -0
  59. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$7$1.dex +0 -0
  60. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$8.dex +0 -0
  61. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$Companion.dex +0 -0
  62. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$compareByDescending$1.dex +0 -0
  63. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenBy$1.dex +0 -0
  64. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenByDescending$1.dex +0 -0
  65. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$onSearch$lambda$26$$inlined$sortByDescending$1.dex +0 -0
  66. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView.dex +0 -0
  67. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSkinTonePicker$Companion.dex +0 -0
  68. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSkinTonePicker.dex +0 -0
  69. package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  70. package/android/build/generated/source/buildConfig/debug/expo/community/modules/emojisheet/BuildConfig.java +10 -0
  71. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +7 -0
  72. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  73. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  74. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  75. package/android/build/intermediates/assets/debug/mergeDebugAssets/emojis.json +1 -0
  76. package/android/build/intermediates/assets/debug/mergeDebugAssets/translations/de.json +1 -0
  77. package/android/build/intermediates/assets/debug/mergeDebugAssets/translations/el.json +1 -0
  78. package/android/build/intermediates/assets/debug/mergeDebugAssets/translations/es.json +1 -0
  79. package/android/build/intermediates/assets/debug/mergeDebugAssets/translations/fr.json +1 -0
  80. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  81. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  82. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +10 -0
  83. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_activities.xml.flat +0 -0
  84. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_flags.xml.flat +0 -0
  85. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_food.xml.flat +0 -0
  86. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_nature.xml.flat +0 -0
  87. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_objects.xml.flat +0 -0
  88. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_people.xml.flat +0 -0
  89. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_recent.xml.flat +0 -0
  90. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_smileys.xml.flat +0 -0
  91. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_symbols.xml.flat +0 -0
  92. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_travel.xml.flat +0 -0
  93. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +11 -0
  94. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  95. package/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  96. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  97. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  98. package/android/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/expo-native-sheet-emojis_debug.kotlin_module +0 -0
  99. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/expo/community/modules/emojisheet/BuildConfig.class +0 -0
  100. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +12 -0
  101. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +7 -0
  102. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +7 -0
  103. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  104. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  105. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_activities.xml +9 -0
  106. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_flags.xml +9 -0
  107. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_food.xml +9 -0
  108. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_nature.xml +9 -0
  109. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_objects.xml +9 -0
  110. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_people.xml +9 -0
  111. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_recent.xml +9 -0
  112. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_smileys.xml +9 -0
  113. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_symbols.xml +9 -0
  114. package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_travel.xml +9 -0
  115. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/expo-native-sheet-emojis_debug.kotlin_module +0 -0
  116. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/BuildConfig.class +0 -0
  117. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategory.class +0 -0
  118. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter$VH.class +0 -0
  119. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter.class +0 -0
  120. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategoryStrip$Companion.class +0 -0
  121. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategoryStrip.class +0 -0
  122. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiData.class +0 -0
  123. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$Companion.class +0 -0
  124. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$EmojiVH.class +0 -0
  125. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$HeaderVH.class +0 -0
  126. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Emoji.class +0 -0
  127. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Header.class +0 -0
  128. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem.class +0 -0
  129. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter.class +0 -0
  130. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiItem.class +0 -0
  131. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSearchBar$5.class +0 -0
  132. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSearchBar.class +0 -0
  133. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetContentView.class +0 -0
  134. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$2$2.class +0 -0
  135. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$3$1.class +0 -0
  136. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$1.class +0 -0
  137. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$10.class +0 -0
  138. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$11.class +0 -0
  139. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$12.class +0 -0
  140. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$2.class +0 -0
  141. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$3.class +0 -0
  142. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$4.class +0 -0
  143. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$5.class +0 -0
  144. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$6.class +0 -0
  145. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$7.class +0 -0
  146. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$8.class +0 -0
  147. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$9.class +0 -0
  148. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$1.class +0 -0
  149. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$2.class +0 -0
  150. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithoutArgs$1.class +0 -0
  151. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$OnCreate$1.class +0 -0
  152. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$View$1.class +0 -0
  153. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$1.class +0 -0
  154. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$10.class +0 -0
  155. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$11.class +0 -0
  156. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$12.class +0 -0
  157. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$2.class +0 -0
  158. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$3.class +0 -0
  159. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$4.class +0 -0
  160. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$5.class +0 -0
  161. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$6.class +0 -0
  162. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$7.class +0 -0
  163. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$8.class +0 -0
  164. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$9.class +0 -0
  165. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule.class +0 -0
  166. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetTheme$Companion.class +0 -0
  167. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetTheme.class +0 -0
  168. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$6.class +0 -0
  169. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$7$1.class +0 -0
  170. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$8.class +0 -0
  171. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$Companion.class +0 -0
  172. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$compareByDescending$1.class +0 -0
  173. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenBy$1.class +0 -0
  174. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenByDescending$1.class +0 -0
  175. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$onSearch$lambda$26$$inlined$sortByDescending$1.class +0 -0
  176. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView.class +0 -0
  177. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSkinTonePicker$Companion.class +0 -0
  178. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSkinTonePicker.class +0 -0
  179. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  180. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +11 -0
  181. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  182. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  183. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  184. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  185. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values +0 -0
  186. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  187. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.s +1 -0
  188. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  189. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  190. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  191. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  192. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  193. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  194. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  195. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  196. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  197. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  198. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  199. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  200. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  201. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  202. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  203. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  204. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  205. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  206. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  207. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  208. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  209. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  210. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
  211. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  212. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  213. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  214. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  215. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  216. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  217. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  218. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  219. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  220. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  221. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  222. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values +0 -0
  223. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  224. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s +1 -0
  225. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  226. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  227. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  228. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  229. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  230. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  231. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  232. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  233. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  234. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  235. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  236. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  237. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  238. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  239. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  240. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  241. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  242. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  243. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  244. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  245. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  246. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  247. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  248. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +2 -0
  249. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  250. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  251. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  252. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  253. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  254. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  255. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  256. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  257. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  258. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  259. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  260. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  261. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  262. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  263. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  264. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  265. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  266. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  267. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values +0 -0
  268. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  269. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.s +1 -0
  270. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  271. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  272. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  273. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  274. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  275. package/android/build/outputs/logs/manifest-merger-debug-report.txt +14 -0
  276. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  277. package/android/build/tmp/kotlin-classes/debug/META-INF/expo-native-sheet-emojis_debug.kotlin_module +0 -0
  278. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategory.class +0 -0
  279. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter$VH.class +0 -0
  280. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter.class +0 -0
  281. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategoryStrip$Companion.class +0 -0
  282. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategoryStrip.class +0 -0
  283. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiData.class +0 -0
  284. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$Companion.class +0 -0
  285. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$EmojiVH.class +0 -0
  286. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$HeaderVH.class +0 -0
  287. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Emoji.class +0 -0
  288. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Header.class +0 -0
  289. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem.class +0 -0
  290. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter.class +0 -0
  291. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiItem.class +0 -0
  292. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSearchBar$5.class +0 -0
  293. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSearchBar.class +0 -0
  294. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetContentView.class +0 -0
  295. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$2$2.class +0 -0
  296. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$3$1.class +0 -0
  297. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$1.class +0 -0
  298. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$10.class +0 -0
  299. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$11.class +0 -0
  300. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$12.class +0 -0
  301. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$2.class +0 -0
  302. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$3.class +0 -0
  303. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$4.class +0 -0
  304. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$5.class +0 -0
  305. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$6.class +0 -0
  306. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$7.class +0 -0
  307. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$8.class +0 -0
  308. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$9.class +0 -0
  309. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$1.class +0 -0
  310. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$2.class +0 -0
  311. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithoutArgs$1.class +0 -0
  312. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$OnCreate$1.class +0 -0
  313. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$View$1.class +0 -0
  314. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$1.class +0 -0
  315. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$10.class +0 -0
  316. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$11.class +0 -0
  317. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$12.class +0 -0
  318. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$2.class +0 -0
  319. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$3.class +0 -0
  320. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$4.class +0 -0
  321. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$5.class +0 -0
  322. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$6.class +0 -0
  323. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$7.class +0 -0
  324. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$8.class +0 -0
  325. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$9.class +0 -0
  326. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule.class +0 -0
  327. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetTheme$Companion.class +0 -0
  328. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetTheme.class +0 -0
  329. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$6.class +0 -0
  330. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$7$1.class +0 -0
  331. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$8.class +0 -0
  332. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$Companion.class +0 -0
  333. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$compareByDescending$1.class +0 -0
  334. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenBy$1.class +0 -0
  335. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenByDescending$1.class +0 -0
  336. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$onSearch$lambda$26$$inlined$sortByDescending$1.class +0 -0
  337. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView.class +0 -0
  338. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSkinTonePicker$Companion.class +0 -0
  339. package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSkinTonePicker.class +0 -0
  340. package/android/build.gradle +41 -0
  341. package/android/src/main/AndroidManifest.xml +2 -0
  342. package/android/src/main/assets/emojis.json +1 -0
  343. package/android/src/main/assets/translations/de.json +1 -0
  344. package/android/src/main/assets/translations/el.json +1 -0
  345. package/android/src/main/assets/translations/es.json +1 -0
  346. package/android/src/main/assets/translations/fr.json +1 -0
  347. package/android/src/main/java/expo/community/modules/emojisheet/EmojiCategoryStrip.kt +143 -0
  348. package/android/src/main/java/expo/community/modules/emojisheet/EmojiData.kt +88 -0
  349. package/android/src/main/java/expo/community/modules/emojisheet/EmojiGridAdapter.kt +147 -0
  350. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSearchBar.kt +152 -0
  351. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetContentView.kt +81 -0
  352. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetModule.kt +367 -0
  353. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetTheme.kt +77 -0
  354. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetUIView.kt +786 -0
  355. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSkinTonePicker.kt +107 -0
  356. package/android/src/main/res/drawable/ic_category_activities.xml +9 -0
  357. package/android/src/main/res/drawable/ic_category_flags.xml +9 -0
  358. package/android/src/main/res/drawable/ic_category_food.xml +9 -0
  359. package/android/src/main/res/drawable/ic_category_nature.xml +9 -0
  360. package/android/src/main/res/drawable/ic_category_objects.xml +9 -0
  361. package/android/src/main/res/drawable/ic_category_people.xml +9 -0
  362. package/android/src/main/res/drawable/ic_category_recent.xml +9 -0
  363. package/android/src/main/res/drawable/ic_category_smileys.xml +9 -0
  364. package/android/src/main/res/drawable/ic_category_symbols.xml +9 -0
  365. package/android/src/main/res/drawable/ic_category_travel.xml +9 -0
  366. package/app.plugin.js +1 -0
  367. package/expo-module.config.json +9 -0
  368. package/ios/EmojiCategoryStrip.swift +175 -0
  369. package/ios/EmojiGridView.swift +484 -0
  370. package/ios/EmojiSearchBar.swift +142 -0
  371. package/ios/EmojiSheetContentView.swift +97 -0
  372. package/ios/EmojiSheetModule.podspec +16 -0
  373. package/ios/EmojiSheetModule.swift +696 -0
  374. package/ios/EmojiSheetTheme.swift +78 -0
  375. package/ios/EmojiSheetUIView.swift +743 -0
  376. package/ios/EmojiSkinTonePicker.swift +97 -0
  377. package/ios/emojis.json +1 -0
  378. package/ios/translations/de.json +1 -0
  379. package/ios/translations/el.json +1 -0
  380. package/ios/translations/es.json +1 -0
  381. package/ios/translations/fr.json +1 -0
  382. package/lib/commonjs/EmojiSheetModule.js +65 -0
  383. package/lib/commonjs/EmojiSheetModule.js.map +1 -0
  384. package/lib/commonjs/EmojiSheetModule.types.js +6 -0
  385. package/lib/commonjs/EmojiSheetModule.types.js.map +1 -0
  386. package/lib/commonjs/EmojiSheetView.js +51 -0
  387. package/lib/commonjs/EmojiSheetView.js.map +1 -0
  388. package/lib/commonjs/index.js +52 -0
  389. package/lib/commonjs/index.js.map +1 -0
  390. package/lib/commonjs/package.json +1 -0
  391. package/lib/commonjs/themes.js +33 -0
  392. package/lib/commonjs/themes.js.map +1 -0
  393. package/lib/module/EmojiSheetModule.js +61 -0
  394. package/lib/module/EmojiSheetModule.js.map +1 -0
  395. package/lib/module/EmojiSheetModule.types.js +4 -0
  396. package/lib/module/EmojiSheetModule.types.js.map +1 -0
  397. package/lib/module/EmojiSheetView.js +47 -0
  398. package/lib/module/EmojiSheetView.js.map +1 -0
  399. package/lib/module/index.js +7 -0
  400. package/lib/module/index.js.map +1 -0
  401. package/lib/module/themes.js +29 -0
  402. package/lib/module/themes.js.map +1 -0
  403. package/lib/typescript/EmojiSheetModule.d.ts +8 -0
  404. package/lib/typescript/EmojiSheetModule.d.ts.map +1 -0
  405. package/lib/typescript/EmojiSheetModule.types.d.ts +79 -0
  406. package/lib/typescript/EmojiSheetModule.types.d.ts.map +1 -0
  407. package/lib/typescript/EmojiSheetView.d.ts +3 -0
  408. package/lib/typescript/EmojiSheetView.d.ts.map +1 -0
  409. package/lib/typescript/index.d.ts +6 -0
  410. package/lib/typescript/index.d.ts.map +1 -0
  411. package/lib/typescript/themes.d.ts +4 -0
  412. package/lib/typescript/themes.d.ts.map +1 -0
  413. package/package.json +98 -0
  414. package/plugin/build/withEmojiSheet.d.ts +1 -0
  415. package/plugin/build/withEmojiSheet.js +92 -0
  416. package/src/EmojiSheetModule.ts +72 -0
  417. package/src/EmojiSheetModule.types.ts +88 -0
  418. package/src/EmojiSheetView.tsx +51 -0
  419. package/src/index.ts +5 -0
  420. package/src/themes.ts +29 -0
  421. package/translations/ca.json +1 -0
  422. package/translations/cs.json +1 -0
  423. package/translations/de.json +1 -0
  424. package/translations/el.json +1 -0
  425. package/translations/en.json +1 -0
  426. package/translations/es.json +1 -0
  427. package/translations/fi.json +1 -0
  428. package/translations/fr.json +1 -0
  429. package/translations/hi.json +1 -0
  430. package/translations/hu.json +1 -0
  431. package/translations/it.json +1 -0
  432. package/translations/ja.json +1 -0
  433. package/translations/ko.json +1 -0
  434. package/translations/nl.json +1 -0
  435. package/translations/pl.json +1 -0
  436. package/translations/pt.json +1 -0
  437. package/translations/ru.json +1 -0
  438. package/translations/sv.json +1 -0
  439. package/translations/tr.json +1 -0
  440. package/translations/uk.json +1 -0
  441. package/translations/zh.json +1 -0
@@ -0,0 +1,743 @@
1
+ import UIKit
2
+
3
+ // MARK: - Delegate Protocol
4
+
5
+ protocol EmojiSheetUIViewDelegate: AnyObject {
6
+ func emojiSheetView(_ view: EmojiSheetUIView, didSelectEmoji data: [String: Any])
7
+ }
8
+
9
+ private enum FrequentlyUsedKeys {
10
+ static let count = "count"
11
+ static let dayStamp = "dayStamp"
12
+ static let timestamp = "timestamp"
13
+ }
14
+
15
+ // MARK: - EmojiSheetUIView
16
+
17
+ class EmojiSheetUIView: UIView,
18
+ EmojiSearchBarDelegate,
19
+ EmojiCategoryStripDelegate,
20
+ EmojiGridViewDelegate
21
+ {
22
+ private enum LayoutConstants {
23
+ static let searchBarTopSpacing: CGFloat = 24
24
+ static let searchBarHorizontalInset: CGFloat = 12
25
+ static let searchBarHeight: CGFloat = 40
26
+ static let searchBarBottomSpacing: CGFloat = 8
27
+ static let categoryStripHeight: CGFloat = 44
28
+ static let floatingBarHorizontalInset: CGFloat = 16
29
+ static let floatingBarBottomInset: CGFloat = 8
30
+ static let floatingBarCornerRadius: CGFloat = 22
31
+ }
32
+
33
+ weak var delegate: EmojiSheetUIViewDelegate?
34
+ var onEmojiSelected: (([String: Any]) -> Void)?
35
+ var searchPlaceholder: String? {
36
+ didSet { if let v = searchPlaceholder { searchBar.setPlaceholder(v) } }
37
+ }
38
+ var noResultsText: String? {
39
+ didSet { if let v = noResultsText { emptyStateLabel.text = v } }
40
+ }
41
+ var onSearchFocusChanged: ((Bool) -> Void)?
42
+ var onScrollIntentUp: (() -> Void)?
43
+ var onPullDownAtTopDrag: ((CGFloat) -> Void)?
44
+ var onPullDownAtTopRelease: ((CGFloat, CGFloat) -> Void)?
45
+
46
+ // MARK: - Configurable Properties
47
+
48
+ var columns: Int = 7 {
49
+ didSet { gridView.columns = columns }
50
+ }
51
+ var emojiSize: CGFloat = 32 {
52
+ didSet { gridView.emojiSize = emojiSize }
53
+ }
54
+ var showSearch: Bool = true {
55
+ didSet { if showSearch != oldValue { configureLayout() } }
56
+ }
57
+ var showRecents: Bool = true
58
+ var enableSkinTones: Bool = true {
59
+ didSet { gridView.enableSkinTones = enableSkinTones }
60
+ }
61
+ var recentLimit: Int = 30
62
+ var categoryBarPosition: String = "top" {
63
+ didSet { if categoryBarPosition != oldValue { configureLayout() } }
64
+ }
65
+ var categoryNames: [String: String]?
66
+ var excludeEmojis: Set<String> = []
67
+
68
+ private var currentTheme: EmojiSheetTheme = .light
69
+ private var allSections: [EmojiSection] = []
70
+ private var filteredSections: [EmojiSection] = []
71
+ private var frequentlyUsedSection: EmojiSection?
72
+ private var localizedKeywords: [String: [String]] = [:]
73
+ private var currentSearchText: String?
74
+ // Search runs on a background queue to avoid blocking the UI while iterating
75
+ // 1900+ emojis with keyword matching. The generation counter ensures stale
76
+ // search results from previous keystrokes are discarded before updating the grid.
77
+ private var searchGeneration: Int = 0
78
+
79
+ private let searchBar = EmojiSearchBar()
80
+ private let categoryStrip = EmojiCategoryStrip()
81
+ private let gridView = EmojiGridView()
82
+ private let emptyStateLabel = UILabel()
83
+
84
+ // Bottom bar mode views
85
+ private var bottomBarBlurView: UIVisualEffectView?
86
+ private var isLayoutConfigured = false
87
+
88
+ // Constraint references for dynamic layout
89
+ private var searchBarTopConstraint: NSLayoutConstraint?
90
+ private var categoryStripTopConstraint: NSLayoutConstraint?
91
+ private var gridViewTopConstraint: NSLayoutConstraint?
92
+ private var gridViewBottomConstraint: NSLayoutConstraint?
93
+ private var categoryStripLeadingConstraint: NSLayoutConstraint?
94
+ private var categoryStripTrailingConstraint: NSLayoutConstraint?
95
+ private var categoryStripHeightConstraint: NSLayoutConstraint?
96
+ private var categoryStripBottomConstraint: NSLayoutConstraint?
97
+
98
+ private static let frequentlyUsedKey = "EmojiSheet_FrequentlyUsed"
99
+
100
+ private static let categoryDisplayNames: [String: String] = [
101
+ "smileys_emotion": "Smileys & Emotion",
102
+ "people_body": "People & Body",
103
+ "animals_nature": "Animals & Nature",
104
+ "food_drink": "Food & Drink",
105
+ "travel_places": "Travel & Places",
106
+ "activities": "Activities",
107
+ "objects": "Objects",
108
+ "symbols": "Symbols",
109
+ "flags": "Flags",
110
+ "frequently_used": "Frequently Used",
111
+ ]
112
+
113
+ // MARK: - Init
114
+
115
+ override init(frame: CGRect) {
116
+ super.init(frame: frame)
117
+ setupViews()
118
+ }
119
+
120
+ required init?(coder: NSCoder) {
121
+ fatalError("init(coder:) has not been implemented")
122
+ }
123
+
124
+ // MARK: - Setup
125
+
126
+ private func setupViews() {
127
+ searchBar.translatesAutoresizingMaskIntoConstraints = false
128
+ categoryStrip.translatesAutoresizingMaskIntoConstraints = false
129
+ gridView.translatesAutoresizingMaskIntoConstraints = false
130
+
131
+ emptyStateLabel.translatesAutoresizingMaskIntoConstraints = false
132
+ emptyStateLabel.text = "No emojis found"
133
+ emptyStateLabel.textAlignment = .center
134
+ emptyStateLabel.font = .systemFont(ofSize: 16)
135
+ emptyStateLabel.isHidden = true
136
+
137
+ addSubview(searchBar)
138
+ addSubview(gridView)
139
+ addSubview(emptyStateLabel)
140
+ addSubview(categoryStrip)
141
+
142
+ searchBar.delegate = self
143
+ categoryStrip.delegate = self
144
+ gridView.delegate = self
145
+
146
+ configureLayout()
147
+ }
148
+
149
+ private func configureLayout() {
150
+ // Remove old dynamic constraints
151
+ [searchBarTopConstraint, categoryStripTopConstraint, gridViewTopConstraint,
152
+ gridViewBottomConstraint, categoryStripLeadingConstraint, categoryStripTrailingConstraint,
153
+ categoryStripHeightConstraint, categoryStripBottomConstraint].compactMap { $0 }.forEach {
154
+ $0.isActive = false
155
+ }
156
+
157
+ // Remove old bottom bar blur + shadow wrapper if present
158
+ bottomBarBlurView?.superview?.removeFromSuperview()
159
+ bottomBarBlurView = nil
160
+
161
+ // Search bar visibility
162
+ searchBar.isHidden = !showSearch
163
+
164
+ let isBottomBar = categoryBarPosition == "bottom"
165
+
166
+ // Always set these constraints for searchBar
167
+ let searchBarLeading = searchBar.leadingAnchor.constraint(
168
+ equalTo: leadingAnchor, constant: LayoutConstants.searchBarHorizontalInset)
169
+ let searchBarTrailing = searchBar.trailingAnchor.constraint(
170
+ equalTo: trailingAnchor, constant: -LayoutConstants.searchBarHorizontalInset)
171
+ let searchBarHeight = searchBar.heightAnchor.constraint(
172
+ equalToConstant: LayoutConstants.searchBarHeight)
173
+
174
+ // Empty state
175
+ let emptyTop = emptyStateLabel.topAnchor.constraint(equalTo: gridView.topAnchor, constant: 40)
176
+ let emptyLeading = emptyStateLabel.leadingAnchor.constraint(equalTo: leadingAnchor)
177
+ let emptyTrailing = emptyStateLabel.trailingAnchor.constraint(equalTo: trailingAnchor)
178
+
179
+ if isBottomBar {
180
+ // Bottom bar mode: floating pill with blur at bottom
181
+ // Shadow wrapper (can't put shadow on clipsToBounds view)
182
+ let shadowWrapper = UIView()
183
+ shadowWrapper.translatesAutoresizingMaskIntoConstraints = false
184
+ shadowWrapper.backgroundColor = .clear
185
+ shadowWrapper.layer.shadowColor = UIColor.black.cgColor
186
+ shadowWrapper.layer.shadowOpacity = 0.12
187
+ shadowWrapper.layer.shadowRadius = 8
188
+ shadowWrapper.layer.shadowOffset = CGSize(width: 0, height: 2)
189
+ addSubview(shadowWrapper)
190
+
191
+ let blurEffect = UIBlurEffect(style: currentTheme.backgroundColor.isLight ? .systemThinMaterial : .systemThinMaterialDark)
192
+ let blurView = UIVisualEffectView(effect: blurEffect)
193
+ blurView.translatesAutoresizingMaskIntoConstraints = false
194
+ blurView.clipsToBounds = true
195
+ blurView.layer.cornerRadius = LayoutConstants.floatingBarCornerRadius
196
+ shadowWrapper.addSubview(blurView)
197
+ bottomBarBlurView = blurView
198
+
199
+ // Pin blur to shadow wrapper
200
+ NSLayoutConstraint.activate([
201
+ blurView.topAnchor.constraint(equalTo: shadowWrapper.topAnchor),
202
+ blurView.leadingAnchor.constraint(equalTo: shadowWrapper.leadingAnchor),
203
+ blurView.trailingAnchor.constraint(equalTo: shadowWrapper.trailingAnchor),
204
+ blurView.bottomAnchor.constraint(equalTo: shadowWrapper.bottomAnchor),
205
+ ])
206
+
207
+ categoryStrip.removeFromSuperview()
208
+ blurView.contentView.addSubview(categoryStrip)
209
+ categoryStrip.translatesAutoresizingMaskIntoConstraints = false
210
+
211
+ // Search bar at top
212
+ searchBarTopConstraint = searchBar.topAnchor.constraint(
213
+ equalTo: topAnchor, constant: LayoutConstants.searchBarTopSpacing)
214
+
215
+ // Grid below search (or top if no search)
216
+ if showSearch {
217
+ gridViewTopConstraint = gridView.topAnchor.constraint(
218
+ equalTo: searchBar.bottomAnchor, constant: LayoutConstants.searchBarBottomSpacing)
219
+ } else {
220
+ gridViewTopConstraint = gridView.topAnchor.constraint(
221
+ equalTo: topAnchor, constant: LayoutConstants.searchBarTopSpacing)
222
+ }
223
+
224
+ gridViewBottomConstraint = gridView.bottomAnchor.constraint(equalTo: bottomAnchor)
225
+
226
+ // Floating pill: inset from edges, above safe area
227
+ let pillBottom = shadowWrapper.bottomAnchor.constraint(
228
+ equalTo: safeAreaLayoutGuide.bottomAnchor,
229
+ constant: -LayoutConstants.floatingBarBottomInset)
230
+ let pillLeading = shadowWrapper.leadingAnchor.constraint(
231
+ equalTo: leadingAnchor,
232
+ constant: LayoutConstants.floatingBarHorizontalInset)
233
+ let pillTrailing = shadowWrapper.trailingAnchor.constraint(
234
+ equalTo: trailingAnchor,
235
+ constant: -LayoutConstants.floatingBarHorizontalInset)
236
+ let pillHeight = shadowWrapper.heightAnchor.constraint(
237
+ equalToConstant: LayoutConstants.categoryStripHeight)
238
+
239
+ // Category strip fills the blur view
240
+ categoryStripLeadingConstraint = categoryStrip.leadingAnchor.constraint(equalTo: blurView.contentView.leadingAnchor)
241
+ categoryStripTrailingConstraint = categoryStrip.trailingAnchor.constraint(equalTo: blurView.contentView.trailingAnchor)
242
+ categoryStripTopConstraint = categoryStrip.topAnchor.constraint(equalTo: blurView.contentView.topAnchor)
243
+ categoryStripHeightConstraint = categoryStrip.heightAnchor.constraint(
244
+ equalToConstant: LayoutConstants.categoryStripHeight)
245
+
246
+ NSLayoutConstraint.activate([
247
+ searchBarTopConstraint!, searchBarLeading, searchBarTrailing, searchBarHeight,
248
+ gridViewTopConstraint!, gridViewBottomConstraint!,
249
+ gridView.leadingAnchor.constraint(equalTo: leadingAnchor),
250
+ gridView.trailingAnchor.constraint(equalTo: trailingAnchor),
251
+ pillBottom, pillLeading, pillTrailing, pillHeight,
252
+ categoryStripLeadingConstraint!, categoryStripTrailingConstraint!,
253
+ categoryStripTopConstraint!, categoryStripHeightConstraint!,
254
+ emptyTop, emptyLeading, emptyTrailing,
255
+ ])
256
+
257
+ // Bottom content inset so grid content scrolls above the floating bar
258
+ let floatingBarTotalHeight = LayoutConstants.categoryStripHeight
259
+ + LayoutConstants.floatingBarBottomInset * 2
260
+ gridView.setBottomContentInset(floatingBarTotalHeight)
261
+
262
+ } else {
263
+ // Top bar mode (default)
264
+ // Make sure categoryStrip is in self (not in blur)
265
+ if categoryStrip.superview !== self {
266
+ categoryStrip.removeFromSuperview()
267
+ addSubview(categoryStrip)
268
+ categoryStrip.translatesAutoresizingMaskIntoConstraints = false
269
+ }
270
+
271
+ gridView.setBottomContentInset(0)
272
+
273
+ searchBarTopConstraint = searchBar.topAnchor.constraint(
274
+ equalTo: topAnchor, constant: LayoutConstants.searchBarTopSpacing)
275
+
276
+ if showSearch {
277
+ categoryStripTopConstraint = categoryStrip.topAnchor.constraint(
278
+ equalTo: searchBar.bottomAnchor, constant: LayoutConstants.searchBarBottomSpacing)
279
+ } else {
280
+ categoryStripTopConstraint = categoryStrip.topAnchor.constraint(
281
+ equalTo: topAnchor, constant: LayoutConstants.searchBarTopSpacing)
282
+ }
283
+
284
+ categoryStripLeadingConstraint = categoryStrip.leadingAnchor.constraint(equalTo: leadingAnchor)
285
+ categoryStripTrailingConstraint = categoryStrip.trailingAnchor.constraint(equalTo: trailingAnchor)
286
+ categoryStripHeightConstraint = categoryStrip.heightAnchor.constraint(
287
+ equalToConstant: LayoutConstants.categoryStripHeight)
288
+
289
+ gridViewTopConstraint = gridView.topAnchor.constraint(equalTo: categoryStrip.bottomAnchor)
290
+ gridViewBottomConstraint = gridView.bottomAnchor.constraint(equalTo: bottomAnchor)
291
+
292
+ NSLayoutConstraint.activate([
293
+ searchBarTopConstraint!, searchBarLeading, searchBarTrailing, searchBarHeight,
294
+ categoryStripTopConstraint!, categoryStripLeadingConstraint!,
295
+ categoryStripTrailingConstraint!, categoryStripHeightConstraint!,
296
+ gridViewTopConstraint!, gridViewBottomConstraint!,
297
+ gridView.leadingAnchor.constraint(equalTo: leadingAnchor),
298
+ gridView.trailingAnchor.constraint(equalTo: trailingAnchor),
299
+ emptyTop, emptyLeading, emptyTrailing,
300
+ ])
301
+ }
302
+
303
+ isLayoutConfigured = true
304
+ }
305
+
306
+ // MARK: - Data Loading (cached across instances)
307
+
308
+ // Emoji data + translation keywords are parsed once on a serial background queue
309
+ // and cached for the app's lifetime. The serial queue prevents concurrent warmCache()
310
+ // and loadDataAsync() from racing on the same static vars.
311
+ private static let cacheQueue = DispatchQueue(label: "EmojiSheetCache")
312
+ private static var cachedSections: [EmojiSection]?
313
+ private static var cachedKeywords: [String: [String]]?
314
+ static var hasCachedData: Bool { cacheQueue.sync { cachedSections != nil && cachedKeywords != nil } }
315
+
316
+ static func warmCache() {
317
+ cacheQueue.async {
318
+ guard cachedSections == nil || cachedKeywords == nil else { return }
319
+ let sections = parseEmojiJSON()
320
+ let keywords = loadAllKeywords()
321
+ cachedSections = sections
322
+ cachedKeywords = keywords
323
+ }
324
+ }
325
+
326
+ private static func loadAllKeywords() -> [String: [String]] {
327
+ let bundle = Bundle(for: EmojiSheetUIView.self)
328
+ var merged: [String: [String]] = [:]
329
+
330
+ // Try translations directory (per-locale files from config plugin)
331
+ if let translationsURL = bundle.url(forResource: "translations", withExtension: nil) ??
332
+ bundle.urls(forResourcesWithExtension: "json", subdirectory: "translations")?.first.map({ $0.deletingLastPathComponent() }) {
333
+ // Load all .json files in translations/
334
+ if let urls = try? FileManager.default.contentsOfDirectory(at: translationsURL, includingPropertiesForKeys: nil)
335
+ .filter({ $0.pathExtension == "json" }) {
336
+ for url in urls {
337
+ if let data = try? Data(contentsOf: url),
338
+ let dict = try? JSONSerialization.jsonObject(with: data) as? [String: [String]] {
339
+ for (key, value) in dict {
340
+ if var existing = merged[key] {
341
+ existing.append(contentsOf: value)
342
+ merged[key] = existing
343
+ } else {
344
+ merged[key] = value
345
+ }
346
+ }
347
+ }
348
+ }
349
+ }
350
+ }
351
+
352
+ // Fallback: try flat "all.json" (legacy format)
353
+ if merged.isEmpty {
354
+ let url = bundle.url(forResource: "all", withExtension: "json")
355
+ ?? bundle.url(forResource: "all", withExtension: "json", subdirectory: "translations")
356
+ if let url, let data = try? Data(contentsOf: url),
357
+ let dict = try? JSONSerialization.jsonObject(with: data) as? [String: [String]] {
358
+ return dict
359
+ }
360
+ }
361
+
362
+ return merged
363
+ }
364
+
365
+ func loadDataAsync() {
366
+ let cached = Self.cacheQueue.sync { (Self.cachedSections, Self.cachedKeywords) }
367
+ if let sections = cached.0, let keywords = cached.1 {
368
+ self.allSections = sections
369
+ self.localizedKeywords = keywords
370
+ self.rebuildSections(searchText: nil)
371
+ return
372
+ }
373
+
374
+ Self.cacheQueue.async { [weak self] in
375
+ guard let self else { return }
376
+ let sections = Self.cachedSections ?? Self.parseEmojiJSON()
377
+ let keywords = Self.cachedKeywords ?? Self.loadAllKeywords()
378
+ Self.cachedSections = sections
379
+ Self.cachedKeywords = keywords
380
+ DispatchQueue.main.async {
381
+ self.allSections = sections
382
+ self.localizedKeywords = keywords
383
+ self.rebuildSections(searchText: nil)
384
+ }
385
+ }
386
+ }
387
+
388
+ private static func parseEmojiJSON() -> [EmojiSection] {
389
+ let bundle = Bundle(for: EmojiSheetUIView.self)
390
+ guard let url = bundle.url(forResource: "emojis", withExtension: "json"),
391
+ let data = try? Data(contentsOf: url),
392
+ let json = try? JSONSerialization.jsonObject(with: data) as? [[String: Any]]
393
+ else {
394
+ return []
395
+ }
396
+
397
+ return json.compactMap { sectionDict -> EmojiSection? in
398
+ guard let title = sectionDict["title"] as? String,
399
+ let items = sectionDict["data"] as? [[String: Any]]
400
+ else {
401
+ return nil
402
+ }
403
+ let emojis = items.compactMap { item -> EmojiItem? in
404
+ guard let emoji = item["emoji"] as? String,
405
+ let name = item["name"] as? String,
406
+ let v = item["v"] as? String,
407
+ let toneEnabled = item["toneEnabled"] as? Bool,
408
+ let keywords = item["keywords"] as? [String],
409
+ let id = item["id"] as? String
410
+ else {
411
+ return nil
412
+ }
413
+ return EmojiItem(emoji: emoji, name: name, version: v, toneEnabled: toneEnabled, keywords: keywords, id: id)
414
+ }
415
+ return EmojiSection(title: title, data: emojis)
416
+ }
417
+ }
418
+
419
+ private func loadLocalizedKeywords() -> [String: [String]] {
420
+ return Self.loadAllKeywords()
421
+ }
422
+
423
+ private var filteredAllSections: [EmojiSection] {
424
+ guard !excludeEmojis.isEmpty else { return allSections }
425
+ return allSections.map { section in
426
+ EmojiSection(title: section.title, data: section.data.filter { !excludeEmojis.contains($0.id) })
427
+ }.filter { !$0.data.isEmpty }
428
+ }
429
+
430
+ private var mergedCategoryNames: [String: String] {
431
+ var names = Self.categoryDisplayNames
432
+ if let custom = categoryNames {
433
+ for (key, value) in custom {
434
+ names[key] = value
435
+ }
436
+ }
437
+ return names
438
+ }
439
+
440
+ private func rebuildSections(searchText: String?) {
441
+ currentSearchText = searchText
442
+
443
+ guard let search = searchText, !search.isEmpty else {
444
+ searchGeneration += 1
445
+ emptyStateLabel.isHidden = true
446
+ gridView.isHidden = false
447
+ var sections: [EmojiSection] = []
448
+ if showRecents {
449
+ let freq = loadFrequentlyUsed().filter { !excludeEmojis.contains($0.id) }
450
+ if !freq.isEmpty {
451
+ sections.append(EmojiSection(title: "frequently_used", data: freq))
452
+ }
453
+ }
454
+ sections.append(contentsOf: filteredAllSections)
455
+ categoryStrip.setSearchActive(false)
456
+ categoryStrip.updateCategories(sections.map { $0.title })
457
+ filteredSections = sections
458
+ gridView.updateSections(sections, categoryNames: mergedCategoryNames)
459
+ // Scroll back to top after clearing search
460
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
461
+ self?.gridView.scrollToTop()
462
+ }
463
+ return
464
+ }
465
+
466
+ categoryStrip.setSearchActive(true)
467
+ searchGeneration += 1
468
+ let generation = searchGeneration
469
+ let sections = filteredAllSections
470
+ let keywords = localizedKeywords
471
+
472
+ DispatchQueue.global(qos: .userInitiated).async { [weak self] in
473
+ guard let self else { return }
474
+ let searchVariants = self.normalizedSearchVariants(search)
475
+ var scored: [(item: EmojiItem, score: Int)] = []
476
+
477
+ for section in sections {
478
+ guard generation == self.searchGeneration else { return }
479
+ for item in section.data {
480
+ let score = self.relevanceScore(
481
+ item: item,
482
+ searchVariants: searchVariants,
483
+ localizedKeywords: keywords
484
+ )
485
+ if score > 0 {
486
+ scored.append((item, score))
487
+ }
488
+ }
489
+ }
490
+
491
+ // Sort by relevance score descending, then by original order for ties
492
+ scored.sort { $0.score > $1.score }
493
+ let matchedItems = scored.map { $0.item }
494
+
495
+ guard generation == self.searchGeneration else { return }
496
+ DispatchQueue.main.async { [weak self] in
497
+ guard let self, generation == self.searchGeneration else { return }
498
+ var resultSections: [EmojiSection] = []
499
+ if !matchedItems.isEmpty {
500
+ resultSections.append(EmojiSection(title: "search_results", data: matchedItems))
501
+ }
502
+ self.emptyStateLabel.isHidden = !matchedItems.isEmpty
503
+ self.gridView.isHidden = matchedItems.isEmpty
504
+ self.filteredSections = resultSections
505
+ self.gridView.updateSections(resultSections, categoryNames: self.mergedCategoryNames)
506
+ self.gridView.scrollToTop()
507
+ }
508
+ }
509
+ }
510
+
511
+ private static func localizedKeywordsForEmoji(_ emoji: String, in dict: [String: [String]]) -> [String] {
512
+ if let kw = dict[emoji] { return kw }
513
+ let stripped = String(emoji.unicodeScalars.filter { $0.value != 0xFE0E && $0.value != 0xFE0F })
514
+ if stripped != emoji, let kw = dict[stripped] { return kw }
515
+ return []
516
+ }
517
+
518
+ // Relevance scoring for search results:
519
+ // 100 = exact name match, 90 = name starts with, 80 = exact keyword,
520
+ // 70 = keyword starts with, 50 = name contains, 30 = keyword contains,
521
+ // 10 = localized keyword contains. Returns 0 for no match.
522
+ private func relevanceScore(
523
+ item: EmojiItem,
524
+ searchVariants: [String],
525
+ localizedKeywords: [String: [String]]
526
+ ) -> Int {
527
+ let nameNorm = normalizeSearchText(item.name)
528
+
529
+ // Check name
530
+ for variant in searchVariants {
531
+ if nameNorm == variant { return 100 }
532
+ if nameNorm.hasPrefix(variant) { return 90 }
533
+ }
534
+
535
+ // Check built-in keywords
536
+ var bestScore = 0
537
+ for kw in item.keywords {
538
+ let kwNorm = normalizeSearchText(kw)
539
+ for variant in searchVariants {
540
+ if kwNorm == variant { bestScore = max(bestScore, 80) }
541
+ else if kwNorm.hasPrefix(variant) { bestScore = max(bestScore, 70) }
542
+ else if kwNorm.contains(variant) { bestScore = max(bestScore, 30) }
543
+ }
544
+ if bestScore >= 80 { break }
545
+ }
546
+
547
+ // Check name contains (lower priority than keyword exact/startsWith)
548
+ if bestScore < 50 {
549
+ for variant in searchVariants {
550
+ if nameNorm.contains(variant) { bestScore = max(bestScore, 50) }
551
+ }
552
+ }
553
+
554
+ if bestScore > 0 { return bestScore }
555
+
556
+ // Check localized keywords
557
+ let localKw = Self.localizedKeywordsForEmoji(item.emoji, in: localizedKeywords)
558
+ for kw in localKw {
559
+ let kwNorm = normalizeSearchText(kw)
560
+ if searchVariants.contains(where: { kwNorm.contains($0) }) { return 10 }
561
+ }
562
+
563
+ // Transliteration fallback for non-Latin scripts
564
+ let nameVariants = normalizedSearchVariants(item.name)
565
+ for nameVariant in nameVariants where nameVariant != nameNorm {
566
+ if searchVariants.contains(where: { nameVariant.contains($0) }) { return 5 }
567
+ }
568
+
569
+ return 0
570
+ }
571
+
572
+ /// Fast path: checks pre-normalized text first, then falls back to transliteration-aware variants.
573
+ private func matchesNormalized(_ normalizedText: String, originalText: String, searchVariants: [String]) -> Bool {
574
+ if searchVariants.contains(where: normalizedText.contains) {
575
+ return true
576
+ }
577
+
578
+ return normalizedSearchVariants(originalText)
579
+ .contains { candidateVariant in
580
+ candidateVariant != normalizedText &&
581
+ searchVariants.contains(where: { candidateVariant.contains($0) })
582
+ }
583
+ }
584
+
585
+ // MARK: - Frequently Used
586
+
587
+ private func loadFrequentlyUsed() -> [EmojiItem] {
588
+ guard let dict = UserDefaults.standard.dictionary(forKey: Self.frequentlyUsedKey) as? [String: [String: Any]] else {
589
+ return []
590
+ }
591
+
592
+ let allEmojis = allSections.flatMap { $0.data }
593
+ let emojiLookup = Dictionary(allEmojis.map { ($0.id, $0) }, uniquingKeysWith: { first, _ in first })
594
+
595
+ let sorted = dict.sorted { a, b in
596
+ let dayA = a.value[FrequentlyUsedKeys.dayStamp] as? Double ?? 0
597
+ let dayB = b.value[FrequentlyUsedKeys.dayStamp] as? Double ?? 0
598
+ if dayA != dayB { return dayA > dayB }
599
+
600
+ let timeA = a.value[FrequentlyUsedKeys.timestamp] as? Double ?? 0
601
+ let timeB = b.value[FrequentlyUsedKeys.timestamp] as? Double ?? 0
602
+ if timeA != timeB { return timeA > timeB }
603
+ return a.key < b.key
604
+ }
605
+
606
+ return sorted.prefix(recentLimit).compactMap { id, _ in
607
+ emojiLookup[id]
608
+ }
609
+ }
610
+
611
+ private func recordEmojiUsage(_ item: EmojiItem) {
612
+ var dict = (UserDefaults.standard.dictionary(forKey: Self.frequentlyUsedKey) as? [String: [String: Any]]) ?? [:]
613
+ let existing = dict[item.id]
614
+ let count = (existing?[FrequentlyUsedKeys.count] as? Int ?? 0) + 1
615
+ let now = Date()
616
+ let dayStamp = Calendar.current.startOfDay(for: now).timeIntervalSince1970
617
+ dict[item.id] = [
618
+ FrequentlyUsedKeys.count: count,
619
+ FrequentlyUsedKeys.dayStamp: dayStamp,
620
+ FrequentlyUsedKeys.timestamp: now.timeIntervalSince1970,
621
+ ]
622
+ UserDefaults.standard.set(dict, forKey: Self.frequentlyUsedKey)
623
+ }
624
+
625
+ private func normalizeSearchText(_ text: String) -> String {
626
+ text
627
+ .precomposedStringWithCompatibilityMapping
628
+ .folding(
629
+ options: [.diacriticInsensitive, .caseInsensitive, .widthInsensitive],
630
+ locale: .current
631
+ )
632
+ .trimmingCharacters(in: .whitespacesAndNewlines)
633
+ .lowercased(with: .current)
634
+ }
635
+
636
+ private func normalizedSearchVariants(_ text: String) -> [String] {
637
+ let normalized = normalizeSearchText(text)
638
+ let transliterated = text.applyingTransform(.toLatin, reverse: false)
639
+ .map(normalizeSearchText)
640
+
641
+ return Array(
642
+ Set(
643
+ [normalized, transliterated]
644
+ .compactMap { $0 }
645
+ .filter { !$0.isEmpty }
646
+ )
647
+ )
648
+ }
649
+
650
+ // MARK: - Theme
651
+
652
+ func updateTheme(_ theme: String) {
653
+ currentTheme = theme == "dark" ? .dark : .light
654
+ applyCurrentTheme()
655
+ }
656
+
657
+ func applyCustomTheme(_ theme: EmojiSheetTheme) {
658
+ currentTheme = theme
659
+ applyCurrentTheme()
660
+ }
661
+
662
+ private func applyCurrentTheme() {
663
+ backgroundColor = currentTheme.backgroundColor
664
+ searchBar.applyTheme(currentTheme)
665
+ categoryStrip.applyTheme(currentTheme)
666
+ gridView.applyTheme(currentTheme)
667
+ emptyStateLabel.textColor = currentTheme.textSecondaryColor
668
+ }
669
+
670
+ // MARK: - EmojiSearchBarDelegate
671
+
672
+ func searchBar(_ searchBar: EmojiSearchBar, didChangeText text: String) {
673
+ let trimmedText = text.trimmingCharacters(in: .whitespacesAndNewlines)
674
+ rebuildSections(searchText: trimmedText.isEmpty ? nil : trimmedText)
675
+ }
676
+
677
+ func searchBarDidBeginEditing(_ searchBar: EmojiSearchBar) {
678
+ onSearchFocusChanged?(true)
679
+ if categoryBarPosition == "bottom" {
680
+ bottomBarBlurView?.superview?.isHidden = true
681
+ }
682
+ }
683
+
684
+ func searchBarDidEndEditing(_ searchBar: EmojiSearchBar) {
685
+ onSearchFocusChanged?(false)
686
+ if categoryBarPosition == "bottom" {
687
+ bottomBarBlurView?.superview?.isHidden = false
688
+ }
689
+ }
690
+
691
+ // MARK: - EmojiCategoryStripDelegate
692
+
693
+ func categoryStrip(_ strip: EmojiCategoryStrip, didSelectCategoryAt index: Int) {
694
+ gridView.scrollToSection(index)
695
+ }
696
+
697
+ // MARK: - EmojiGridViewDelegate
698
+
699
+ func gridView(_ gridView: EmojiGridView, didSelectEmoji emoji: String, item: EmojiItem) {
700
+ recordEmojiUsage(item)
701
+ rebuildSections(searchText: currentSearchText)
702
+ let data: [String: Any] = [
703
+ "emoji": emoji,
704
+ "name": item.name,
705
+ "id": item.id,
706
+ ]
707
+ delegate?.emojiSheetView(self, didSelectEmoji: data)
708
+ onEmojiSelected?(data)
709
+ }
710
+
711
+ func gridView(_ gridView: EmojiGridView, didScrollToSectionAt index: Int) {
712
+ categoryStrip.selectCategory(at: index)
713
+ }
714
+
715
+ func gridViewDidRequestSheetExpansion(_ gridView: EmojiGridView) {
716
+ onScrollIntentUp?()
717
+ }
718
+
719
+ func gridView(_ gridView: EmojiGridView, didDragSheetDown distance: CGFloat) {
720
+ onPullDownAtTopDrag?(distance)
721
+ }
722
+
723
+ func gridView(_ gridView: EmojiGridView, didReleaseSheetDown distance: CGFloat, velocity: CGFloat) {
724
+ onPullDownAtTopRelease?(distance, velocity)
725
+ }
726
+ }
727
+
728
+ // MARK: - UIColor brightness helper
729
+
730
+ private extension UIColor {
731
+ var isLight: Bool {
732
+ var red: CGFloat = 0
733
+ var green: CGFloat = 0
734
+ var blue: CGFloat = 0
735
+ var alpha: CGFloat = 0
736
+ guard getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
737
+ var white: CGFloat = 0
738
+ return getWhite(&white, alpha: &alpha) ? white > 0.5 : true
739
+ }
740
+ let brightness = ((red * 299) + (green * 587) + (blue * 114)) / 1000
741
+ return brightness > 0.5
742
+ }
743
+ }