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.
- package/LICENSE +21 -0
- package/README.md +323 -0
- package/android/build/.transforms/5729d3188aa52ad4699e57ce2c5c9358/results.bin +1 -0
- package/android/build/.transforms/5729d3188aa52ad4699e57ce2c5c9358/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/results.bin +1 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/BuildConfig.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategory.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter$VH.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategoryStrip$Companion.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiCategoryStrip.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiData.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$Companion.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$EmojiVH.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$HeaderVH.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Emoji.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Header.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiGridAdapter.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiItem.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSearchBar$5.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSearchBar.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetContentView.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$2$2.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$3$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$10.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$11.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$12.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$2.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$3.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$4.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$5.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$6.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$7.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$8.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$9.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$2.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithoutArgs$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$OnCreate$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$View$1.dex +0 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetModule.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetTheme$Companion.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetTheme.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$6.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$7$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$8.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$Companion.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$compareByDescending$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenBy$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenByDescending$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView$onSearch$lambda$26$$inlined$sortByDescending$1.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSheetUIView.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSkinTonePicker$Companion.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/expo/community/modules/emojisheet/EmojiSkinTonePicker.dex +0 -0
- package/android/build/.transforms/9d5669b57046f2ddfd01bd236a2701f2/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
- package/android/build/generated/source/buildConfig/debug/expo/community/modules/emojisheet/BuildConfig.java +10 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +7 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
- package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
- package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
- package/android/build/intermediates/assets/debug/mergeDebugAssets/emojis.json +1 -0
- package/android/build/intermediates/assets/debug/mergeDebugAssets/translations/de.json +1 -0
- package/android/build/intermediates/assets/debug/mergeDebugAssets/translations/el.json +1 -0
- package/android/build/intermediates/assets/debug/mergeDebugAssets/translations/es.json +1 -0
- package/android/build/intermediates/assets/debug/mergeDebugAssets/translations/fr.json +1 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +10 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_activities.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_flags.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_food.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_nature.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_objects.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_people.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_recent.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_smileys.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_symbols.xml.flat +0 -0
- package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_category_travel.xml.flat +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +11 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
- package/android/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/expo-native-sheet-emojis_debug.kotlin_module +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/expo/community/modules/emojisheet/BuildConfig.class +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +12 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +7 -0
- package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +7 -0
- package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
- package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_activities.xml +9 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_flags.xml +9 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_food.xml +9 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_nature.xml +9 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_objects.xml +9 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_people.xml +9 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_recent.xml +9 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_smileys.xml +9 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_symbols.xml +9 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_category_travel.xml +9 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/expo-native-sheet-emojis_debug.kotlin_module +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/BuildConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategory.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter$VH.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategoryStrip$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiCategoryStrip.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiData.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$EmojiVH.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$HeaderVH.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Emoji.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Header.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiGridAdapter.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiItem.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSearchBar$5.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSearchBar.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetContentView.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$2$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$3$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$10.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$11.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$12.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$3.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$4.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$5.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$6.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$7.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$8.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$9.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithoutArgs$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$OnCreate$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$View$1.class +0 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetTheme$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetTheme.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$6.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$7$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$8.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$compareByDescending$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenBy$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenByDescending$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView$onSearch$lambda$26$$inlined$sortByDescending$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSheetUIView.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSkinTonePicker$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/expo/community/modules/emojisheet/EmojiSkinTonePicker.class +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +11 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.s +1 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s +1 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +2 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.s +1 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +14 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build/tmp/kotlin-classes/debug/META-INF/expo-native-sheet-emojis_debug.kotlin_module +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategory.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter$VH.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategoryStrip$CategoryAdapter.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategoryStrip$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiCategoryStrip.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiData.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$EmojiVH.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$HeaderVH.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Emoji.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem$Header.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter$ListItem.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiGridAdapter.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiItem.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSearchBar$5.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSearchBar.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetContentView.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$2$2.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$3$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$10.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$11.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$12.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$2.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$3.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$4.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$5.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$6.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$7.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$8.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$1$4$9.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$2.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$AsyncFunctionWithoutArgs$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$OnCreate$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$$inlined$View$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$10.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$11.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$12.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$2.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$3.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$4.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$5.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$6.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$7.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$8.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule$definition$lambda$5$lambda$4$$inlined$Prop$9.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetModule.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetTheme$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetTheme.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$6.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$7$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$8.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$compareByDescending$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenBy$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$getFrequentlyUsed$$inlined$thenByDescending$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView$onSearch$lambda$26$$inlined$sortByDescending$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSheetUIView.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSkinTonePicker$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/expo/community/modules/emojisheet/EmojiSkinTonePicker.class +0 -0
- package/android/build.gradle +41 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/assets/emojis.json +1 -0
- package/android/src/main/assets/translations/de.json +1 -0
- package/android/src/main/assets/translations/el.json +1 -0
- package/android/src/main/assets/translations/es.json +1 -0
- package/android/src/main/assets/translations/fr.json +1 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiCategoryStrip.kt +143 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiData.kt +88 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiGridAdapter.kt +147 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSearchBar.kt +152 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetContentView.kt +81 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetModule.kt +367 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetTheme.kt +77 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetUIView.kt +786 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSkinTonePicker.kt +107 -0
- package/android/src/main/res/drawable/ic_category_activities.xml +9 -0
- package/android/src/main/res/drawable/ic_category_flags.xml +9 -0
- package/android/src/main/res/drawable/ic_category_food.xml +9 -0
- package/android/src/main/res/drawable/ic_category_nature.xml +9 -0
- package/android/src/main/res/drawable/ic_category_objects.xml +9 -0
- package/android/src/main/res/drawable/ic_category_people.xml +9 -0
- package/android/src/main/res/drawable/ic_category_recent.xml +9 -0
- package/android/src/main/res/drawable/ic_category_smileys.xml +9 -0
- package/android/src/main/res/drawable/ic_category_symbols.xml +9 -0
- package/android/src/main/res/drawable/ic_category_travel.xml +9 -0
- package/app.plugin.js +1 -0
- package/expo-module.config.json +9 -0
- package/ios/EmojiCategoryStrip.swift +175 -0
- package/ios/EmojiGridView.swift +484 -0
- package/ios/EmojiSearchBar.swift +142 -0
- package/ios/EmojiSheetContentView.swift +97 -0
- package/ios/EmojiSheetModule.podspec +16 -0
- package/ios/EmojiSheetModule.swift +696 -0
- package/ios/EmojiSheetTheme.swift +78 -0
- package/ios/EmojiSheetUIView.swift +743 -0
- package/ios/EmojiSkinTonePicker.swift +97 -0
- package/ios/emojis.json +1 -0
- package/ios/translations/de.json +1 -0
- package/ios/translations/el.json +1 -0
- package/ios/translations/es.json +1 -0
- package/ios/translations/fr.json +1 -0
- package/lib/commonjs/EmojiSheetModule.js +65 -0
- package/lib/commonjs/EmojiSheetModule.js.map +1 -0
- package/lib/commonjs/EmojiSheetModule.types.js +6 -0
- package/lib/commonjs/EmojiSheetModule.types.js.map +1 -0
- package/lib/commonjs/EmojiSheetView.js +51 -0
- package/lib/commonjs/EmojiSheetView.js.map +1 -0
- package/lib/commonjs/index.js +52 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/themes.js +33 -0
- package/lib/commonjs/themes.js.map +1 -0
- package/lib/module/EmojiSheetModule.js +61 -0
- package/lib/module/EmojiSheetModule.js.map +1 -0
- package/lib/module/EmojiSheetModule.types.js +4 -0
- package/lib/module/EmojiSheetModule.types.js.map +1 -0
- package/lib/module/EmojiSheetView.js +47 -0
- package/lib/module/EmojiSheetView.js.map +1 -0
- package/lib/module/index.js +7 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/themes.js +29 -0
- package/lib/module/themes.js.map +1 -0
- package/lib/typescript/EmojiSheetModule.d.ts +8 -0
- package/lib/typescript/EmojiSheetModule.d.ts.map +1 -0
- package/lib/typescript/EmojiSheetModule.types.d.ts +79 -0
- package/lib/typescript/EmojiSheetModule.types.d.ts.map +1 -0
- package/lib/typescript/EmojiSheetView.d.ts +3 -0
- package/lib/typescript/EmojiSheetView.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +6 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/themes.d.ts +4 -0
- package/lib/typescript/themes.d.ts.map +1 -0
- package/package.json +98 -0
- package/plugin/build/withEmojiSheet.d.ts +1 -0
- package/plugin/build/withEmojiSheet.js +92 -0
- package/src/EmojiSheetModule.ts +72 -0
- package/src/EmojiSheetModule.types.ts +88 -0
- package/src/EmojiSheetView.tsx +51 -0
- package/src/index.ts +5 -0
- package/src/themes.ts +29 -0
- package/translations/ca.json +1 -0
- package/translations/cs.json +1 -0
- package/translations/de.json +1 -0
- package/translations/el.json +1 -0
- package/translations/en.json +1 -0
- package/translations/es.json +1 -0
- package/translations/fi.json +1 -0
- package/translations/fr.json +1 -0
- package/translations/hi.json +1 -0
- package/translations/hu.json +1 -0
- package/translations/it.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/nl.json +1 -0
- package/translations/pl.json +1 -0
- package/translations/pt.json +1 -0
- package/translations/ru.json +1 -0
- package/translations/sv.json +1 -0
- package/translations/tr.json +1 -0
- package/translations/uk.json +1 -0
- 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
|
+
}
|