diff --git a/EmojiPicker.podspec b/EmojiPicker.podspec index 17f968b..46bf276 100644 --- a/EmojiPicker.podspec +++ b/EmojiPicker.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'EmojiPicker' - s.version = '3.0.7' + s.version = '3.0.8' s.license = 'MIT' s.summary = 'Emoji picker for iOS like on MacOS' s.homepage = 'https://github.com/htmlprogrammist/EmojiPicker' diff --git a/Example App/EmojiPicker.xcworkspace/xcuserdata/egbad.xcuserdatad/UserInterfaceState.xcuserstate b/Example App/EmojiPicker.xcworkspace/xcuserdata/egbad.xcuserdatad/UserInterfaceState.xcuserstate index 054b788..5ae7efd 100644 Binary files a/Example App/EmojiPicker.xcworkspace/xcuserdata/egbad.xcuserdatad/UserInterfaceState.xcuserstate and b/Example App/EmojiPicker.xcworkspace/xcuserdata/egbad.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Example App/Podfile.lock b/Example App/Podfile.lock index 14ba498..b3c2509 100644 --- a/Example App/Podfile.lock +++ b/Example App/Podfile.lock @@ -1,6 +1,6 @@ PODS: - - EmojiPicker (3.0.7) - - EmojiPicker/Tests (3.0.7) + - EmojiPicker (3.0.8) + - EmojiPicker/Tests (3.0.8) DEPENDENCIES: - EmojiPicker (from `../`) @@ -11,7 +11,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - EmojiPicker: 296cacb36c0eb34fe978d5411eaa06a67cd6da4b + EmojiPicker: 2015f097678687260575d880b5960194802d6958 PODFILE CHECKSUM: e686a8fbd8a5367eac0bf7fb77e0bbddf18a2353 diff --git a/Example App/Pods/Local Podspecs/EmojiPicker.podspec.json b/Example App/Pods/Local Podspecs/EmojiPicker.podspec.json index 376676e..00e1d8c 100644 --- a/Example App/Pods/Local Podspecs/EmojiPicker.podspec.json +++ b/Example App/Pods/Local Podspecs/EmojiPicker.podspec.json @@ -1,6 +1,6 @@ { "name": "EmojiPicker", - "version": "3.0.7", + "version": "3.0.8", "license": "MIT", "summary": "Emoji picker for iOS like on MacOS", "homepage": "https://github.com/htmlprogrammist/EmojiPicker", @@ -9,7 +9,7 @@ }, "source": { "git": "https://github.com/htmlprogrammist/EmojiPicker.git", - "tag": "3.0.7" + "tag": "3.0.8" }, "source_files": "Sources/EmojiPicker/**/*.{swift}", "resource_bundles": { diff --git a/Example App/Pods/Manifest.lock b/Example App/Pods/Manifest.lock index 14ba498..b3c2509 100644 --- a/Example App/Pods/Manifest.lock +++ b/Example App/Pods/Manifest.lock @@ -1,6 +1,6 @@ PODS: - - EmojiPicker (3.0.7) - - EmojiPicker/Tests (3.0.7) + - EmojiPicker (3.0.8) + - EmojiPicker/Tests (3.0.8) DEPENDENCIES: - EmojiPicker (from `../`) @@ -11,7 +11,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - EmojiPicker: 296cacb36c0eb34fe978d5411eaa06a67cd6da4b + EmojiPicker: 2015f097678687260575d880b5960194802d6958 PODFILE CHECKSUM: e686a8fbd8a5367eac0bf7fb77e0bbddf18a2353 diff --git a/Example App/Pods/Pods.xcodeproj/project.pbxproj b/Example App/Pods/Pods.xcodeproj/project.pbxproj index 113cec1..792f4e9 100644 --- a/Example App/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example App/Pods/Pods.xcodeproj/project.pbxproj @@ -7,28 +7,28 @@ objects = { /* Begin PBXBuildFile section */ - 030AE488A502B3BCECD45B5F5CB3976B /* 13.json in Resources */ = {isa = PBXBuildFile; fileRef = 0434193E612B0CFCBE170CAE6ED7203D /* 13.json */; }; + 026F70CA873745025D740EA8F37B5A4B /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2986D62B22C60D901F173D8C03F52ABB /* Localizable.strings */; }; 04631E91E77F1BDF6CD1C6FBC1E53AEA /* Pods-EmojiPicker_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E41074865C769D58022F8DB9C2B17FE /* Pods-EmojiPicker_Example-dummy.m */; }; 1BD5BD4A3B12A75F38ED5F2FDB618219 /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A9A7BCE09C329094A63A9346307BBC /* Bundle.swift */; }; 2197DB04645805BA239B5D4B1FE84C3F /* EmojiPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FDF49F927ED49808EDF97FCEB14B7FE /* EmojiPickerView.swift */; }; 247A19BDE3664944E16330C8ACB4D375 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DDFB975765E00A1BC7E04F006A8B740 /* UIColor.swift */; }; - 26C58DFFFE9814C705747299D63D5D44 /* 11.json in Resources */ = {isa = PBXBuildFile; fileRef = 44617086BACB1E1AB067D0CBBD8B8598 /* 11.json */; }; + 251A37371E3F82FD4DD46B64F2CA540A /* 13.json in Resources */ = {isa = PBXBuildFile; fileRef = 0434193E612B0CFCBE170CAE6ED7203D /* 13.json */; }; 2B20811BC07717C26B5991875DBBCE72 /* EmojiCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067B05DDFD00E75BDDFC7564F924BE52 /* EmojiCollectionViewHeader.swift */; }; - 35D4BAB8E0C70599C467EEB98158FEC5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 30FBA6AF30CF71F606D3F046A12948DB /* Localizable.strings */; }; 37BCBFD2539F182214A51248A2ED5DD9 /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4F0869863382FB40BD266FF74DE1C9 /* UIView.swift */; }; 39B099AC152338C3A617C77C5C3AA622 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0642C72AF52C6359B635C6E2C186D93 /* Observable.swift */; }; + 4472696D9CC06359DD1AAC6AC50B0FD8 /* 5.json in Resources */ = {isa = PBXBuildFile; fileRef = D401C1B4BE71D30265BC708D01D4AF89 /* 5.json */; }; 4676029316B5331DD69A0F145D8AFC28 /* PickerArrowDirectionModeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4311B53BFFFB9DA2930342F199FBED7B /* PickerArrowDirectionModeTests.swift */; }; 4A24A8FB5C32E22034B7E37289C617FA /* TouchableEmojiCategoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C72F40635EF9AD0CA7FC11300A7DBB7D /* TouchableEmojiCategoryView.swift */; }; - 50B2F410300336E44639C8FC9F633548 /* 12.1.json in Resources */ = {isa = PBXBuildFile; fileRef = 7AA45F04BD13A460C3A250803F8B2F98 /* 12.1.json */; }; 56BA270AB99594F94AEF33A5547D8C4A /* CategoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12082593CF3D322E78D65F60C90CE972 /* CategoryTests.swift */; }; 57D61917332D126453DBF79EF2FFDA6B /* EmojiCategoryIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18214A563D4310D39B4269002C7E20AA /* EmojiCategoryIconView.swift */; }; 58DC22FCAA4EED93BC5ED2880DA8B7AA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 5C8F4A12287061CA2E61A78FE3992DEF /* 14.json in Resources */ = {isa = PBXBuildFile; fileRef = 429B2301A33FE5438CC0E9E33E06CBA6 /* 14.json */; }; 5EF4507FF0C8F6AB41D32B2F83F98E19 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - 61EA755019227DB57F09DECA4A13371D /* 13.1.json in Resources */ = {isa = PBXBuildFile; fileRef = 1820E9E8A4596D7A9F93535E6BAD5AA4 /* 13.1.json */; }; 75FCD9A524D1F805DDCA65899BB00316 /* EmojiPickerDelegateMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33A25632D14D2D2DC31C1254545F8F0 /* EmojiPickerDelegateMock.swift */; }; 766BA8E5F480B639266CD03ED1534C9F /* EmojiManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23442F8A0852CD623685A0F7BE0507F2 /* EmojiManager.swift */; }; 7AD411BFDBD6A713CE09B1E0E825F163 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 7B1D5D55F441E2959BDBB61FFF458942 /* EmojiManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 724753DC60CE5470741BCC13BA5B9197 /* EmojiManagerTests.swift */; }; + 81793DA464A2E5F70F72F22B2ABCF540 /* 13.1.json in Resources */ = {isa = PBXBuildFile; fileRef = 1820E9E8A4596D7A9F93535E6BAD5AA4 /* 13.1.json */; }; 8619A7D052AEB849AF0697A08624734A /* EmojiPicker-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 50353A2C6D5D1F57E7465A824018D469 /* EmojiPicker-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8C34782F7B4E11F6091E4EED834FFF63 /* EmojiPickerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7ED560BB34BED35A6534913C017578D /* EmojiPickerViewModel.swift */; }; 9A2782112A50E341AB7BC2FB1BA4D9D8 /* EmojiCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6FB36389279027D402AB1D91CC8A5D5 /* EmojiCollectionViewCell.swift */; }; @@ -36,34 +36,34 @@ 9F1900612EA3442E85BF5AD3C26549E1 /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77EE580E125AFD7225844BE4340A9827 /* Emoji.swift */; }; A033F36AAEDA625337F68F9755BA1D77 /* Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = A644FA19A48DBAA4AF44BD1CD084A0D0 /* Category.swift */; }; AD7FF7F0EC95BD3381737E120FEC7847 /* EmojiPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8A787233E0905D2A328ABCA13908055 /* EmojiPickerViewController.swift */; }; + BB5123C9BA027BD4C3EFA657504034C7 /* 12.1.json in Resources */ = {isa = PBXBuildFile; fileRef = 7AA45F04BD13A460C3A250803F8B2F98 /* 12.1.json */; }; + C275730F8E1BFB94AC690D43880D0D14 /* 11.json in Resources */ = {isa = PBXBuildFile; fileRef = 44617086BACB1E1AB067D0CBBD8B8598 /* 11.json */; }; CA89FA34641E1AE4C8BB2427A26AF286 /* EmojiManagerStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9631319C6FA78D5C5B43FF13CAAB547A /* EmojiManagerStub.swift */; }; CB6A01F77F3D1F5FBBB5585D5F509DA6 /* PickerArrowDirectionMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93CCB47D9D974E0907A7A5F440CFC261 /* PickerArrowDirectionMode.swift */; }; D87D90972546DFB456AE2B38379D5E2C /* Pods-EmojiPicker_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 509EFFB149756F700CC3A368970476A6 /* Pods-EmojiPicker_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; DD011EA4FCF00ADAE1211D6269CA4D13 /* ObservableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE0D52160101ADF5E32E575414C92A75 /* ObservableTests.swift */; }; E155396F45D28DD95C7596E246386EC1 /* EmojiPickerViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C133272836D5EC21F1CD8AA7378E2447 /* EmojiPickerViewModelTests.swift */; }; E560B1C76BE6582D935CEEA610D0BABE /* EmojiSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AEEE26AA528418D851DC0C01AF2970E /* EmojiSet.swift */; }; - EB8126D35440C69B81AA068624EF0378 /* 14.json in Resources */ = {isa = PBXBuildFile; fileRef = 429B2301A33FE5438CC0E9E33E06CBA6 /* 14.json */; }; - EEA18DBEF1D17F6CD57E99D30B936A6A /* 5.json in Resources */ = {isa = PBXBuildFile; fileRef = D401C1B4BE71D30265BC708D01D4AF89 /* 5.json */; }; F1DCE6CFACDEE599EC225E7AA0E8C7EC /* Skin.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0B4F25759D953B97CE000F47F624C7 /* Skin.swift */; }; FCEBE070BE2A3A9DFAA44C54B933EB3F /* EmojiPicker-Resources in Resources */ = {isa = PBXBuildFile; fileRef = 72DF50AF5F8CB0E66065910A9B57FFFE /* EmojiPicker-Resources */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 074D5A78DA5A763442F6F3F9CB2F26E8 /* PBXContainerItemProxy */ = { + 8066ED038F6C938FA660D8A80FB79C36 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 3DA7DB1A9F7F32C07F0F0F8CD7CCD936; - remoteInfo = "EmojiPicker-Resources"; + remoteGlobalIDString = 74B1BE29E8F4437DC0A1829FA5157AE0; + remoteInfo = EmojiPicker; }; - 55563FEBD02EDAE00A9AE4986247B338 /* PBXContainerItemProxy */ = { + B9A867C873E0F34288C07320B682438D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 74B1BE29E8F4437DC0A1829FA5157AE0; - remoteInfo = EmojiPicker; + remoteGlobalIDString = 3DA7DB1A9F7F32C07F0F0F8CD7CCD936; + remoteInfo = "EmojiPicker-Resources"; }; - 8D25C874C2CBCDBAFE9A499FFBB1CDD0 /* PBXContainerItemProxy */ = { + CBAD8BF34408206E97FD3A8DC58BA27B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; @@ -77,14 +77,13 @@ 0434193E612B0CFCBE170CAE6ED7203D /* 13.json */ = {isa = PBXFileReference; includeInIndex = 1; path = 13.json; sourceTree = ""; }; 067B05DDFD00E75BDDFC7564F924BE52 /* EmojiCollectionViewHeader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiCollectionViewHeader.swift; sourceTree = ""; }; 12082593CF3D322E78D65F60C90CE972 /* CategoryTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CategoryTests.swift; path = Tests/EmojiPickerTests/CategoryTests.swift; sourceTree = ""; }; - 15C88F311B02809A0A3F67EE8AA5418C /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = de.lproj/Localizable.strings; sourceTree = ""; }; 1714EB656EE2FCC9FA0A89B3C30338DB /* EmojiPicker.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = EmojiPicker.release.xcconfig; sourceTree = ""; }; 1820E9E8A4596D7A9F93535E6BAD5AA4 /* 13.1.json */ = {isa = PBXFileReference; includeInIndex = 1; path = 13.1.json; sourceTree = ""; }; 18214A563D4310D39B4269002C7E20AA /* EmojiCategoryIconView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiCategoryIconView.swift; sourceTree = ""; }; 23442F8A0852CD623685A0F7BE0507F2 /* EmojiManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiManager.swift; sourceTree = ""; }; 23BE90F951883808EBCF02CDD69ED1AB /* EmojiPicker */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = EmojiPicker; path = EmojiPicker.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 23BF8AA77C12B8663AE2A6DE53C5809C /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = hi.lproj/Localizable.strings; sourceTree = ""; }; 2DDFB975765E00A1BC7E04F006A8B740 /* UIColor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = ""; }; + 31CA50F5482D412395950669F79C9481 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = de.lproj/Localizable.strings; sourceTree = ""; }; 34EC614B25DFFBF0318E2F8E2D7DF2CC /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 3515F577DCDF309EB51D3B5D6EB985A7 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 382524B7DD3E7F2893D02267E796F68E /* Pods-EmojiPicker_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-EmojiPicker_Example.modulemap"; sourceTree = ""; }; @@ -102,6 +101,7 @@ 57A9A7BCE09C329094A63A9346307BBC /* Bundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = ""; }; 5FFCF687F23CBE36E970127D9B9AB400 /* Pods-EmojiPicker_Example */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-EmojiPicker_Example"; path = Pods_EmojiPicker_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 60CDDCE1EBAF6641C515D019921650A6 /* EmojiPicker-Unit-Tests */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "EmojiPicker-Unit-Tests"; path = "EmojiPicker-Unit-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 62BE4B99E1210A1C802F81DFFC0A8A5C /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 6E41074865C769D58022F8DB9C2B17FE /* Pods-EmojiPicker_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-EmojiPicker_Example-dummy.m"; sourceTree = ""; }; 714609DCC83990E1EA798C7D23F9F734 /* EmojiPicker.unit-tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "EmojiPicker.unit-tests.release.xcconfig"; sourceTree = ""; }; 724753DC60CE5470741BCC13BA5B9197 /* EmojiManagerTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EmojiManagerTests.swift; path = Tests/EmojiPickerTests/EmojiManagerTests.swift; sourceTree = ""; }; @@ -109,36 +109,37 @@ 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 77EE580E125AFD7225844BE4340A9827 /* Emoji.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Emoji.swift; sourceTree = ""; }; 7AA45F04BD13A460C3A250803F8B2F98 /* 12.1.json */ = {isa = PBXFileReference; includeInIndex = 1; path = 12.1.json; sourceTree = ""; }; - 857735F9B123307D861C32B73D229E7F /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = tr.lproj/Localizable.strings; sourceTree = ""; }; 8AEEE26AA528418D851DC0C01AF2970E /* EmojiSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiSet.swift; sourceTree = ""; }; 8C127AC5D75C5B8E34B970AF14DA3CE6 /* EmojiPicker.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = EmojiPicker.modulemap; sourceTree = ""; }; 8FDF49F927ED49808EDF97FCEB14B7FE /* EmojiPickerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiPickerView.swift; sourceTree = ""; }; 9022BA69F449C6369DE0F5187DFD286D /* EmojiPicker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "EmojiPicker-dummy.m"; sourceTree = ""; }; + 9129B9DFDEAF91C6ABA383991D4E95F3 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = hi.lproj/Localizable.strings; sourceTree = ""; }; 93CCB47D9D974E0907A7A5F440CFC261 /* PickerArrowDirectionMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PickerArrowDirectionMode.swift; sourceTree = ""; }; 9631319C6FA78D5C5B43FF13CAAB547A /* EmojiManagerStub.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiManagerStub.swift; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; A644FA19A48DBAA4AF44BD1CD084A0D0 /* Category.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Category.swift; sourceTree = ""; }; A66E21E0B052B50A29602427E1E2DC23 /* Pods-EmojiPicker_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-EmojiPicker_Example-Info.plist"; sourceTree = ""; }; - A804029DD69197DDB7EBC0259A0DAA44 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + A70B67CDF3D488604F340E46F2EC1A14 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = en.lproj/Localizable.strings; sourceTree = ""; }; A8BD50F0E9978D23340775A97ADC0BD7 /* EmojiPicker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = EmojiPicker.debug.xcconfig; sourceTree = ""; }; A905A9ECCFAAAAA933763D899E8722C6 /* EmojiPicker-Unit-Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "EmojiPicker-Unit-Tests-frameworks.sh"; sourceTree = ""; }; + B38CF7F70B380CFBD1D532CA6D45BCD6 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = zh.lproj/Localizable.strings; sourceTree = ""; }; BC0B4F25759D953B97CE000F47F624C7 /* Skin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Skin.swift; sourceTree = ""; }; + BF8779BF3A599C2F80DB1508A648E005 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = uk.lproj/Localizable.strings; sourceTree = ""; }; C133272836D5EC21F1CD8AA7378E2447 /* EmojiPickerViewModelTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EmojiPickerViewModelTests.swift; path = Tests/EmojiPickerTests/EmojiPickerViewModelTests.swift; sourceTree = ""; }; C1D65E908BD216818AADD8E193C432CE /* EmojiPicker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "EmojiPicker-Info.plist"; sourceTree = ""; }; C33A25632D14D2D2DC31C1254545F8F0 /* EmojiPickerDelegateMock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiPickerDelegateMock.swift; sourceTree = ""; }; C3C403037197B28249C58071BF952407 /* EmojiPicker-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "EmojiPicker-prefix.pch"; sourceTree = ""; }; C6FB36389279027D402AB1D91CC8A5D5 /* EmojiCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiCollectionViewCell.swift; sourceTree = ""; }; C72F40635EF9AD0CA7FC11300A7DBB7D /* TouchableEmojiCategoryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TouchableEmojiCategoryView.swift; sourceTree = ""; }; - CEC782B1413FBC971F52A53796ABB8CD /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = uk.lproj/Localizable.strings; sourceTree = ""; }; D089390CB10DE5D7264EAF267B71BF52 /* Pods-EmojiPicker_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiPicker_Example.debug.xcconfig"; sourceTree = ""; }; D0B1C88F829541DAEF35CF30E76D83B7 /* Pods-EmojiPicker_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiPicker_Example.release.xcconfig"; sourceTree = ""; }; + D1B4436F2EA129B3BF7CAB9B1CF42597 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = ru.lproj/Localizable.strings; sourceTree = ""; }; D401C1B4BE71D30265BC708D01D4AF89 /* 5.json */ = {isa = PBXFileReference; includeInIndex = 1; path = 5.json; sourceTree = ""; }; D7ED560BB34BED35A6534913C017578D /* EmojiPickerViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiPickerViewModel.swift; sourceTree = ""; }; D9A8ECD769F879596441DCFFBAFD34CC /* Pods-EmojiPicker_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-EmojiPicker_Example-frameworks.sh"; sourceTree = ""; }; - D9FB6448EF5D667B5B29106470463FE1 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = ru.lproj/Localizable.strings; sourceTree = ""; }; DE0D52160101ADF5E32E575414C92A75 /* ObservableTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableTests.swift; path = Tests/EmojiPickerTests/ObservableTests.swift; sourceTree = ""; }; - E94C870B61E100D4AFA6567D6B565CC6 /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = en.lproj/Localizable.strings; sourceTree = ""; }; F0642C72AF52C6359B635C6E2C186D93 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; + F68475DF7E34CEF32B807DAD1F9E6C3C /* Localizable.strings */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = tr.lproj/Localizable.strings; sourceTree = ""; }; F8A787233E0905D2A328ABCA13908055 /* EmojiPickerViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EmojiPickerViewController.swift; sourceTree = ""; }; FC4F0869863382FB40BD266FF74DE1C9 /* UIView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = UIView.swift; sourceTree = ""; }; FEC6B8950F4C546111DE3F93FECA20B5 /* Pods-EmojiPicker_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-EmojiPicker_Example-acknowledgements.markdown"; sourceTree = ""; }; @@ -161,33 +162,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - C7413BD5F4AA8D3A568483A1FA295959 /* Frameworks */ = { + CC05765125F8057E32CE235D7A08ECF7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 7AD411BFDBD6A713CE09B1E0E825F163 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - CC05765125F8057E32CE235D7A08ECF7 /* Frameworks */ = { + E9E450A71C7BBD6B3E184AC43E6883FD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7AD411BFDBD6A713CE09B1E0E825F163 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 05771BC4261E0EF92E07DC266EE6ED2E /* Localization */ = { - isa = PBXGroup; - children = ( - 30FBA6AF30CF71F606D3F046A12948DB /* Localizable.strings */, - ); - name = Localization; - path = Sources/EmojiPicker/Resources/Localization; - sourceTree = ""; - }; 091A3D74EE0F3FDDC5084FD3ED67CDF9 /* EmojiCategoryView */ = { isa = PBXGroup; children = ( @@ -295,7 +287,7 @@ 8DC76CCB3AE18B319AB092715E1A44C2 /* Bindings */, 5ECE24B07F4F1242C0E0186F236A3879 /* Data */, 9626F0D3EC80EA301E33D5D4EDCE5D96 /* Extensions */, - 05771BC4261E0EF92E07DC266EE6ED2E /* Localization */, + EE3DEAEC95D11D1F026BDC71A2391785 /* Localization */, D718E71009ED3E350968D5FF016BCB61 /* Models */, 93B5D72C2FEF745F19859ED7B1093CC5 /* Pod */, CB5BF15CA28D54B4520699A43B729C75 /* Services */, @@ -440,6 +432,15 @@ path = Tests/EmojiPickerTests/Stubs; sourceTree = ""; }; + EE3DEAEC95D11D1F026BDC71A2391785 /* Localization */ = { + isa = PBXGroup; + children = ( + 2986D62B22C60D901F173D8C03F52ABB /* Localizable.strings */, + ); + name = Localization; + path = Sources/EmojiPicker/Resources/Localization; + sourceTree = ""; + }; F335215D4D5B81982E7F065C8F829E1C /* Targets Support Files */ = { isa = PBXGroup; children = ( @@ -472,11 +473,11 @@ /* Begin PBXNativeTarget section */ 3DA7DB1A9F7F32C07F0F0F8CD7CCD936 /* EmojiPicker-Resources */ = { isa = PBXNativeTarget; - buildConfigurationList = 2CDF4DD9A44ADA836B119C4A68F73753 /* Build configuration list for PBXNativeTarget "EmojiPicker-Resources" */; + buildConfigurationList = 196AD6301C073A497EC309177329F16D /* Build configuration list for PBXNativeTarget "EmojiPicker-Resources" */; buildPhases = ( - 1414F0942A7638C78FB2399DEB0A143A /* Sources */, - C7413BD5F4AA8D3A568483A1FA295959 /* Frameworks */, - 5AB0321A376161AD5857405ADDD7C1F3 /* Resources */, + 18A82D250525C98FB73DAA0D23B4780D /* Sources */, + E9E450A71C7BBD6B3E184AC43E6883FD /* Frameworks */, + 0E032EBE94F2E2170044DF7F325C4304 /* Resources */, ); buildRules = ( ); @@ -499,7 +500,7 @@ buildRules = ( ); dependencies = ( - 4824B7A8406E54878D1E92A72FCFD404 /* PBXTargetDependency */, + 0B660C0F31095266555E34E91363EC8B /* PBXTargetDependency */, ); name = EmojiPicker; productName = EmojiPicker; @@ -518,7 +519,7 @@ buildRules = ( ); dependencies = ( - C8F4FD4DC037D88FFB916490C6413963 /* PBXTargetDependency */, + 6D50AA525162B521ACCC5ABE50C36A9E /* PBXTargetDependency */, ); name = "Pods-EmojiPicker_Example"; productName = Pods_EmojiPicker_Example; @@ -538,7 +539,7 @@ buildRules = ( ); dependencies = ( - 78507C58534AF469220B951872FF5F38 /* PBXTargetDependency */, + D265D3BEE791883DF4F9C0FFD8AE2BA9 /* PBXTargetDependency */, ); name = "EmojiPicker-Unit-Tests"; productName = "EmojiPicker-Unit-Tests"; @@ -567,6 +568,7 @@ ru, tr, uk, + zh, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; productRefGroup = 1A1160E78863D1B69A568D78ED779947 /* Products */; @@ -582,24 +584,24 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 3A1EAA898A3CA7A89B81272E2EFC7D24 /* Resources */ = { + 0E032EBE94F2E2170044DF7F325C4304 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + C275730F8E1BFB94AC690D43880D0D14 /* 11.json in Resources */, + BB5123C9BA027BD4C3EFA657504034C7 /* 12.1.json in Resources */, + 251A37371E3F82FD4DD46B64F2CA540A /* 13.json in Resources */, + 81793DA464A2E5F70F72F22B2ABCF540 /* 13.1.json in Resources */, + 5C8F4A12287061CA2E61A78FE3992DEF /* 14.json in Resources */, + 4472696D9CC06359DD1AAC6AC50B0FD8 /* 5.json in Resources */, + 026F70CA873745025D740EA8F37B5A4B /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5AB0321A376161AD5857405ADDD7C1F3 /* Resources */ = { + 3A1EAA898A3CA7A89B81272E2EFC7D24 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 26C58DFFFE9814C705747299D63D5D44 /* 11.json in Resources */, - 50B2F410300336E44639C8FC9F633548 /* 12.1.json in Resources */, - 030AE488A502B3BCECD45B5F5CB3976B /* 13.json in Resources */, - 61EA755019227DB57F09DECA4A13371D /* 13.1.json in Resources */, - EB8126D35440C69B81AA068624EF0378 /* 14.json in Resources */, - EEA18DBEF1D17F6CD57E99D30B936A6A /* 5.json in Resources */, - 35D4BAB8E0C70599C467EEB98158FEC5 /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -685,18 +687,18 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1414F0942A7638C78FB2399DEB0A143A /* Sources */ = { + 156B3AE09B8921C3DFBBE7E31DD735E8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 04631E91E77F1BDF6CD1C6FBC1E53AEA /* Pods-EmojiPicker_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 156B3AE09B8921C3DFBBE7E31DD735E8 /* Sources */ = { + 18A82D250525C98FB73DAA0D23B4780D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 04631E91E77F1BDF6CD1C6FBC1E53AEA /* Pods-EmojiPicker_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -717,37 +719,38 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 4824B7A8406E54878D1E92A72FCFD404 /* PBXTargetDependency */ = { + 0B660C0F31095266555E34E91363EC8B /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "EmojiPicker-Resources"; target = 3DA7DB1A9F7F32C07F0F0F8CD7CCD936 /* EmojiPicker-Resources */; - targetProxy = 074D5A78DA5A763442F6F3F9CB2F26E8 /* PBXContainerItemProxy */; + targetProxy = B9A867C873E0F34288C07320B682438D /* PBXContainerItemProxy */; }; - 78507C58534AF469220B951872FF5F38 /* PBXTargetDependency */ = { + 6D50AA525162B521ACCC5ABE50C36A9E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = EmojiPicker; target = 74B1BE29E8F4437DC0A1829FA5157AE0 /* EmojiPicker */; - targetProxy = 55563FEBD02EDAE00A9AE4986247B338 /* PBXContainerItemProxy */; + targetProxy = 8066ED038F6C938FA660D8A80FB79C36 /* PBXContainerItemProxy */; }; - C8F4FD4DC037D88FFB916490C6413963 /* PBXTargetDependency */ = { + D265D3BEE791883DF4F9C0FFD8AE2BA9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = EmojiPicker; target = 74B1BE29E8F4437DC0A1829FA5157AE0 /* EmojiPicker */; - targetProxy = 8D25C874C2CBCDBAFE9A499FFBB1CDD0 /* PBXContainerItemProxy */; + targetProxy = CBAD8BF34408206E97FD3A8DC58BA27B /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 30FBA6AF30CF71F606D3F046A12948DB /* Localizable.strings */ = { + 2986D62B22C60D901F173D8C03F52ABB /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( - 15C88F311B02809A0A3F67EE8AA5418C /* Localizable.strings */, - E94C870B61E100D4AFA6567D6B565CC6 /* Localizable.strings */, - A804029DD69197DDB7EBC0259A0DAA44 /* Localizable.strings */, - 23BF8AA77C12B8663AE2A6DE53C5809C /* Localizable.strings */, - D9FB6448EF5D667B5B29106470463FE1 /* Localizable.strings */, - 857735F9B123307D861C32B73D229E7F /* Localizable.strings */, - CEC782B1413FBC971F52A53796ABB8CD /* Localizable.strings */, + 31CA50F5482D412395950669F79C9481 /* Localizable.strings */, + A70B67CDF3D488604F340E46F2EC1A14 /* Localizable.strings */, + 62BE4B99E1210A1C802F81DFFC0A8A5C /* Localizable.strings */, + 9129B9DFDEAF91C6ABA383991D4E95F3 /* Localizable.strings */, + D1B4436F2EA129B3BF7CAB9B1CF42597 /* Localizable.strings */, + F68475DF7E34CEF32B807DAD1F9E6C3C /* Localizable.strings */, + BF8779BF3A599C2F80DB1508A648E005 /* Localizable.strings */, + B38CF7F70B380CFBD1D532CA6D45BCD6 /* Localizable.strings */, ); name = Localizable.strings; path = .; @@ -756,6 +759,22 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 0CE2861EDB970DCFA2C684BC457C1EED /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1714EB656EE2FCC9FA0A89B3C30338DB /* EmojiPicker.release.xcconfig */; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/EmojiPicker"; + IBSC_MODULE = EmojiPicker; + INFOPLIST_FILE = "Target Support Files/EmojiPicker/ResourceBundle-Resources-EmojiPicker-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.1; + PRODUCT_NAME = Resources; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; 12E068767CF35B513130A458C3536CFB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -918,23 +937,7 @@ }; name = Debug; }; - 6085CE777B4932FB19E4ABD21EE85C56 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1714EB656EE2FCC9FA0A89B3C30338DB /* EmojiPicker.release.xcconfig */; - buildSettings = { - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/EmojiPicker"; - IBSC_MODULE = EmojiPicker; - INFOPLIST_FILE = "Target Support Files/EmojiPicker/ResourceBundle-Resources-EmojiPicker-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.1; - PRODUCT_NAME = Resources; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 8DBDF96728ADDE6F2FB667635BE44714 /* Debug */ = { + 528C595E75EA33A0AD379E57741E3170 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = A8BD50F0E9978D23340775A97ADC0BD7 /* EmojiPicker.debug.xcconfig */; buildSettings = { @@ -1100,11 +1103,11 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2CDF4DD9A44ADA836B119C4A68F73753 /* Build configuration list for PBXNativeTarget "EmojiPicker-Resources" */ = { + 196AD6301C073A497EC309177329F16D /* Build configuration list for PBXNativeTarget "EmojiPicker-Resources" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8DBDF96728ADDE6F2FB667635BE44714 /* Debug */, - 6085CE777B4932FB19E4ABD21EE85C56 /* Release */, + 528C595E75EA33A0AD379E57741E3170 /* Debug */, + 0CE2861EDB970DCFA2C684BC457C1EED /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example App/Pods/Target Support Files/EmojiPicker/EmojiPicker-Info.plist b/Example App/Pods/Target Support Files/EmojiPicker/EmojiPicker-Info.plist index 62bad7c..7c9a111 100644 --- a/Example App/Pods/Target Support Files/EmojiPicker/EmojiPicker-Info.plist +++ b/Example App/Pods/Target Support Files/EmojiPicker/EmojiPicker-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.0.7 + 3.0.8 CFBundleSignature ???? CFBundleVersion diff --git a/Example App/Pods/Target Support Files/EmojiPicker/ResourceBundle-Resources-EmojiPicker-Info.plist b/Example App/Pods/Target Support Files/EmojiPicker/ResourceBundle-Resources-EmojiPicker-Info.plist index 77bd3b2..31fadbe 100644 --- a/Example App/Pods/Target Support Files/EmojiPicker/ResourceBundle-Resources-EmojiPicker-Info.plist +++ b/Example App/Pods/Target Support Files/EmojiPicker/ResourceBundle-Resources-EmojiPicker-Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 3.0.7 + 3.0.8 CFBundleSignature ???? CFBundleVersion diff --git a/README.md b/README.md index 95ff740..8ef4d24 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ -# EmojiPicker - -Emoji picker for iOS like on macOS - -

- - +

+
+ EmojiPicker is a customizable package
implementing macOS-style emoji picker popover +
+ Emoji Picker Preview

## Navigation @@ -15,16 +13,17 @@ Emoji picker for iOS like on macOS - [Manually](#manually) - [Quick Start](#quick-start) - [Usage](#usage) - - [Required parameters](#required-parameters) + - [Delegate](#delegate) + - [Source view](#source-view) - [Selected emoji category tint color](#selected-emoji-category-tint-color) - [Arrow direction](#arrow-direction) - [Horizontal inset](#horizontal-inset) - [Is dismissed after choosing](#is-dismissed-after-choosing) - [Custom height](#custom-height) - [Feedback generator style](#feedback-generator-style) -- [Localizations](#localizations) +- [Localization](#localization) - [Contributing](#contributing) -- [Getting started](#getting-started) +- [Experiments](#experiments) ## Installation @@ -153,16 +152,19 @@ viewController.feedbackGeneratorStyle = .soft ## Localization +* Chinese 🇨🇳 * English 🇬🇧 -* Russian 🇷🇺 -* Ukraine 🇺🇦 * French 🇫🇷 * German 🇩🇪 * Hindi 🇮🇳 +* Russian 🇷🇺 * Turkish 🇹🇷 +* Ukrainian 🇺🇦 You can also contribute your language to this list. Please, read [following heading](#contributing) for more information. +> ❗️ Note that the languages are arranged in alphabetical order + ## Contributing Contributions are welcomed and encouraged! Please see the [Contributing guide](https://github.com/htmlprogrammist/EmojiPicker/blob/main/CONTRIBUTING.md). @@ -171,7 +173,7 @@ To be a truly great community, we need to welcome developers from all walks of l To give clarity of what is expected of our members, we have adopted the code of conduct defined by the Contributor Covenant. This document is used across many open source communities, and we think it articulates our values well. For more, see the [Code of Conduct](https://github.com/htmlprogrammist/EmojiPicker/blob/main/CODE_OF_CONDUCT.md). -## Getting started +## Experiments To play around with the project, contribute to it, see how it works or adapt it for yourself: diff --git a/Sources/EmojiPicker.h b/Sources/EmojiPicker.h deleted file mode 100644 index 0a4bf55..0000000 --- a/Sources/EmojiPicker.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// EmojiPicker.h -// EmojiPicker -// -// Created by Егор Бадмаев on 13.01.2023. -// - -#import - -//! Project version number for EmojiPicker. -FOUNDATION_EXPORT double EmojiPickerVersionNumber; - -//! Project version string for EmojiPicker. -FOUNDATION_EXPORT const unsigned char EmojiPickerVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/Sources/EmojiPicker/Bindings/Observable.swift b/Sources/EmojiPicker/Bindings/Observable.swift index 02bd6aa..9618e2a 100644 --- a/Sources/EmojiPicker/Bindings/Observable.swift +++ b/Sources/EmojiPicker/Bindings/Observable.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Extensions/Foundation/Bundle.swift b/Sources/EmojiPicker/Extensions/Foundation/Bundle.swift index 578b713..6aa2339 100644 --- a/Sources/EmojiPicker/Extensions/Foundation/Bundle.swift +++ b/Sources/EmojiPicker/Extensions/Foundation/Bundle.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Extensions/UIKit/UIColor.swift b/Sources/EmojiPicker/Extensions/UIKit/UIColor.swift index 80cdcd7..3ce9a45 100644 --- a/Sources/EmojiPicker/Extensions/UIKit/UIColor.swift +++ b/Sources/EmojiPicker/Extensions/UIKit/UIColor.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Extensions/UIKit/UIView.swift b/Sources/EmojiPicker/Extensions/UIKit/UIView.swift index 82dab5c..580c25b 100644 --- a/Sources/EmojiPicker/Extensions/UIKit/UIView.swift +++ b/Sources/EmojiPicker/Extensions/UIKit/UIView.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Models/Category.swift b/Sources/EmojiPicker/Models/Category.swift index ebef318..45510ca 100644 --- a/Sources/EmojiPicker/Models/Category.swift +++ b/Sources/EmojiPicker/Models/Category.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Egor Badmaev // // Permission is hereby granted, free of charge, to any person obtaining a copy @@ -24,11 +25,11 @@ struct Category: Decodable { /// Type-safe category type. let type: CategoryType /// Identifiers of emojis. - let emojis: [String] + let identifiers: [Emoji.ID] enum CodingKeys: String, CodingKey { case type = "id" - case emojis + case identifiers = "emojis" } } diff --git a/Sources/EmojiPicker/Models/Emoji.swift b/Sources/EmojiPicker/Models/Emoji.swift index 58c1ee3..543fe56 100644 --- a/Sources/EmojiPicker/Models/Emoji.swift +++ b/Sources/EmojiPicker/Models/Emoji.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Egor Badmaev // // Permission is hereby granted, free of charge, to any person obtaining a copy @@ -20,7 +21,7 @@ // SOFTWARE. /// An object that represents emoji. -struct Emoji: Decodable { +struct Emoji: Decodable, Identifiable { /// Emoji identifier. let id: String /// Name of an emoji. @@ -31,4 +32,15 @@ struct Emoji: Decodable { let skins: [Skin] /// Version in which the emoji appeared. let version: Double + /// Skin tone number. We save it so user can use the skin he chose. + var skinToneIndex = 0 +} + +extension Emoji { + /// String emoji. For example: 😄 + /// + /// Shows in the collection view. + var emoji: String { + return skins[skinToneIndex].native + } } diff --git a/Sources/EmojiPicker/Models/EmojiSet.swift b/Sources/EmojiPicker/Models/EmojiSet.swift index 357a633..45fed9c 100644 --- a/Sources/EmojiPicker/Models/EmojiSet.swift +++ b/Sources/EmojiPicker/Models/EmojiSet.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Egor Badmaev // // Permission is hereby granted, free of charge, to any person obtaining a copy @@ -23,8 +24,8 @@ struct EmojiSet: Decodable { /// Emoji categories. let categories: [Category] - /// Emojis dictionary. Key is the name (id) of emoji. - let emojis: [String: Emoji] + /// Emojis dictionary from which you can get emojis by ID. + let emojis: [Emoji.ID: Emoji] /// Aliases of keywords for emojis. let aliases: [String: String] } diff --git a/Sources/EmojiPicker/Models/PickerArrowDirectionMode.swift b/Sources/EmojiPicker/Models/PickerArrowDirectionMode.swift index 3104253..1e87b24 100644 --- a/Sources/EmojiPicker/Models/PickerArrowDirectionMode.swift +++ b/Sources/EmojiPicker/Models/PickerArrowDirectionMode.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Models/Skin.swift b/Sources/EmojiPicker/Models/Skin.swift index 2fa98d1..7365353 100644 --- a/Sources/EmojiPicker/Models/Skin.swift +++ b/Sources/EmojiPicker/Models/Skin.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Egor Badmaev // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Resources/Localization/zh.lproj/Localizable.strings b/Sources/EmojiPicker/Resources/Localization/zh.lproj/Localizable.strings new file mode 100644 index 0000000..d6cb9dc --- /dev/null +++ b/Sources/EmojiPicker/Resources/Localization/zh.lproj/Localizable.strings @@ -0,0 +1,8 @@ +"people" = "微笑与人"; +"nature" = "动物与自然"; +"foods" = "食物及饮品"; +"activity" = "活动"; +"places" = "旅游及地点"; +"objects" = "对象"; +"symbols" = "符号"; +"flags" = "旗帜"; diff --git a/Sources/EmojiPicker/Services/EmojiManager.swift b/Sources/EmojiPicker/Services/EmojiManager.swift index 6f5bc7f..d3dfced 100644 --- a/Sources/EmojiPicker/Services/EmojiManager.swift +++ b/Sources/EmojiPicker/Services/EmojiManager.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Egor Badmaev // // Permission is hereby granted, free of charge, to any person obtaining a copy @@ -19,13 +20,13 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -import UIKit +import Foundation /// An abstraction over entity that provides emoji set. protocol EmojiManagerProtocol { - /// Gets version of iOS for current device. + /// Provides a set of emojis. /// - /// - Returns: Array of emoji categories (and array of emojis inside them). + /// - Returns: Set of emojis. func provideEmojis() -> EmojiSet } @@ -62,8 +63,12 @@ final class EmojiManager: EmojiManagerProtocol { } } + /// Version of operating system of a device. + /// + /// It takes major and minor version of a device and returns it as `15.5`. private var deviceVersion: Double { - return (UIDevice.current.systemVersion as NSString).doubleValue + let operatingSystemVersion = ProcessInfo().operatingSystemVersion + return Double(operatingSystemVersion.majorVersion) + Double(operatingSystemVersion.minorVersion) / 10 } // MARK: - Internal Methods diff --git a/Sources/EmojiPicker/ViewModel/EmojiPickerViewModel.swift b/Sources/EmojiPicker/ViewModel/EmojiPickerViewModel.swift index 0e4e3f8..848791e 100644 --- a/Sources/EmojiPicker/ViewModel/EmojiPickerViewModel.swift +++ b/Sources/EmojiPicker/ViewModel/EmojiPickerViewModel.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy @@ -65,12 +66,12 @@ final class EmojiPickerViewModel: EmojiPickerViewModelProtocol { } func numberOfItems(in section: Int) -> Int { - return emojiSet.categories[section].emojis.count + return emojiSet.categories[section].identifiers.count } func emoji(at indexPath: IndexPath) -> String { - let name = emojiSet.categories[indexPath.section].emojis[indexPath.row] - return emojiSet.emojis[name]?.skins[0].native ?? "❗️" + let name = emojiSet.categories[indexPath.section].identifiers[indexPath.row] + return emojiSet.emojis[name]?.emoji ?? "⚠️" } func sectionHeaderViewModel(for section: Int) -> String { diff --git a/Sources/EmojiPicker/Views/EmojiCategoryView/EmojiCategoryIconView.swift b/Sources/EmojiPicker/Views/EmojiCategoryView/EmojiCategoryIconView.swift index f0eb151..2a4b165 100644 --- a/Sources/EmojiPicker/Views/EmojiCategoryView/EmojiCategoryIconView.swift +++ b/Sources/EmojiPicker/Views/EmojiCategoryView/EmojiCategoryIconView.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Views/EmojiCategoryView/TouchableEmojiCategoryView.swift b/Sources/EmojiPicker/Views/EmojiCategoryView/TouchableEmojiCategoryView.swift index 0f928ad..12e8478 100644 --- a/Sources/EmojiPicker/Views/EmojiCategoryView/TouchableEmojiCategoryView.swift +++ b/Sources/EmojiPicker/Views/EmojiCategoryView/TouchableEmojiCategoryView.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Views/EmojiCollectionViewCell.swift b/Sources/EmojiPicker/Views/EmojiCollectionViewCell.swift index 0e5ff21..c2e9a51 100644 --- a/Sources/EmojiPicker/Views/EmojiCollectionViewCell.swift +++ b/Sources/EmojiPicker/Views/EmojiCollectionViewCell.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Views/EmojiCollectionViewHeader.swift b/Sources/EmojiPicker/Views/EmojiCollectionViewHeader.swift index 3581d82..86a1165 100644 --- a/Sources/EmojiPicker/Views/EmojiCollectionViewHeader.swift +++ b/Sources/EmojiPicker/Views/EmojiCollectionViewHeader.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Sources/EmojiPicker/Views/EmojiPickerView.swift b/Sources/EmojiPicker/Views/EmojiPickerView.swift index 592ec85..3cf6e5b 100644 --- a/Sources/EmojiPicker/Views/EmojiPickerView.swift +++ b/Sources/EmojiPicker/Views/EmojiPickerView.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy @@ -58,7 +59,7 @@ final class EmojiPickerView: UIView { }() // MARK: - Private Properties - + private let separatorView: UIView = { let view = UIView() view.backgroundColor = .separatorColor @@ -82,13 +83,14 @@ final class EmojiPickerView: UIView { /// - Note: The number `0.13` was taken based on the proportion of this element to the width of the EmojiPicker on macOS. private var categoriesStackViewHeight: CGFloat { bounds.width * 0.13 } private var categoriesStackHeightConstraint: NSLayoutConstraint? - + // MARK: - Init + override init(frame: CGRect) { super.init(frame: .zero) - setupView() + setupCategoryViews() } - + @available(*, unavailable, message: "init(coder:) has not been implemented") required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") @@ -99,7 +101,7 @@ final class EmojiPickerView: UIView { override func draw(_ rect: CGRect) { super.draw(rect) - setupCategoryViews() + setupView() } /// Passes the index of the selected category to all categoryViews to update the state. @@ -113,18 +115,17 @@ final class EmojiPickerView: UIView { } // MARK: - Private Methods + private func setupView() { - backgroundColor = .popoverBackgroundColor - addSubview(collectionView) addSubview(categoriesStackView) addSubview(separatorView) let categoriesStackHeightConstraint = categoriesStackView.heightAnchor.constraint( - equalToConstant: categoriesStackViewHeight + equalToConstant: categoriesStackViewHeight ) self.categoriesStackHeightConstraint = categoriesStackHeightConstraint - + NSLayoutConstraint.activate([ collectionView.leadingAnchor.constraint(equalTo: leadingAnchor), collectionView.trailingAnchor.constraint(equalTo: trailingAnchor), @@ -144,6 +145,7 @@ final class EmojiPickerView: UIView { } private func setupCategoryViews() { + backgroundColor = .popoverBackgroundColor categoriesStackHeightConstraint?.constant = categoriesStackViewHeight categoryViews = [] categoriesStackView.subviews.forEach { $0.removeFromSuperview() } diff --git a/Sources/EmojiPicker/Views/EmojiPickerViewController.swift b/Sources/EmojiPicker/Views/EmojiPickerViewController.swift index 3d6f8a7..c56d99d 100644 --- a/Sources/EmojiPicker/Views/EmojiPickerViewController.swift +++ b/Sources/EmojiPicker/Views/EmojiPickerViewController.swift @@ -1,4 +1,5 @@ // The MIT License (MIT) +// // Copyright © 2022 Ivan Izyumkin // // Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/Tests/EmojiPickerTests/CategoryTests.swift b/Tests/EmojiPickerTests/CategoryTests.swift index f69f382..04e00fa 100644 --- a/Tests/EmojiPickerTests/CategoryTests.swift +++ b/Tests/EmojiPickerTests/CategoryTests.swift @@ -17,23 +17,29 @@ class CategoryTests: XCTestCase { } func test_decodeCategory_success() throws { - let result = try? JSONDecoder().decode(EmojiPicker.Category.self, from: category1) + category = try? JSONDecoder().decode(EmojiPicker.Category.self, from: category1) - XCTAssertNotNil(result) - XCTAssertEqual(result?.emojis, ["grinning", "smiley", "smile"]) + XCTAssertNotNil(category, "The result of decoding should be successful") + XCTAssertEqual(category.type, CategoryType.people) + XCTAssertEqual(category?.identifiers, ["grinning", "smiley", "smile"]) } - func test_decodeCategory_arraySuccess() throws { - let result = try? JSONDecoder().decode([EmojiPicker.Category].self, from: category3) + func test_decodeCategory_wrongCodingKeys1() throws { + category = try? JSONDecoder().decode(EmojiPicker.Category.self, from: category2) - XCTAssertNotNil(result) - XCTAssertEqual(result?.count, 2) + XCTAssertNil(category) } - func test_decodeCategory_wrongCodingKeys() throws { - let result = try? JSONDecoder().decode(EmojiPicker.Category.self, from: category2) + func test_decodeCategory_wrongCodingKeys2() throws { + category = try? JSONDecoder().decode(EmojiPicker.Category.self, from: category3) - XCTAssertNil(result) + XCTAssertNil(category) + } + + func test_decodeCategory_wrongCodingKeys3() throws { + category = try? JSONDecoder().decode(EmojiPicker.Category.self, from: category4) + + XCTAssertNil(category) } } @@ -51,7 +57,7 @@ fileprivate let category1 = Data(""" fileprivate let category2 = Data(""" { "type": "people", - "emojis": [ + "identifiers": [ "grinning", "smiley", "smile", @@ -60,22 +66,23 @@ fileprivate let category2 = Data(""" """.utf8) fileprivate let category3 = Data(""" -[ - { - "id": "people", - "emojis": [ +{ + "id": "people", + "identifiers": [ "grinning", + "smiley", "smile", - "zzz" - ] - }, - { - "id": "nature", - "emojis": [ - "monkey", - "leaves", - "dog" - ] - } -] + ] +} +""".utf8) + +fileprivate let category4 = Data(""" +{ + "type": "people", + "emojis": [ + "grinning", + "smiley", + "smile", + ] +} """.utf8) diff --git a/Tests/EmojiPickerTests/EmojiPickerViewModelTests.swift b/Tests/EmojiPickerTests/EmojiPickerViewModelTests.swift index b1fde0b..5ef777b 100644 --- a/Tests/EmojiPickerTests/EmojiPickerViewModelTests.swift +++ b/Tests/EmojiPickerTests/EmojiPickerViewModelTests.swift @@ -41,7 +41,7 @@ class EmojiPickerViewModelTests: XCTestCase { let result = viewModel.numberOfItems(in: 0) - XCTAssertEqual(result, emojiManagerStub.emojiSet.categories[section].emojis.count) + XCTAssertEqual(result, emojiManagerStub.emojiSet.categories[section].identifiers.count) } func testEmojiAtIndexPathMethod() throws { @@ -50,14 +50,9 @@ class EmojiPickerViewModelTests: XCTestCase { let result = viewModel.emoji(at: indexPath) let expectedResult = emojiManagerStub.emojiSet.emojis[ - emojiManagerStub.emojiSet.categories[indexPath.section].emojis[indexPath.row] - ]? - .skins[0] - .native - XCTAssertEqual( - result, - expectedResult - ) + emojiManagerStub.emojiSet.categories[indexPath.section].identifiers[indexPath.row] + ]?.emoji + XCTAssertEqual(result, expectedResult) } func testSectionHeaderViewModelMethod() throws { diff --git a/Tests/EmojiPickerTests/Stubs/EmojiManagerStub.swift b/Tests/EmojiPickerTests/Stubs/EmojiManagerStub.swift index 32406cb..1faa4c5 100644 --- a/Tests/EmojiPickerTests/Stubs/EmojiManagerStub.swift +++ b/Tests/EmojiPickerTests/Stubs/EmojiManagerStub.swift @@ -9,22 +9,18 @@ class EmojiManagerStub: EmojiManagerProtocol { - var deviceVersion: Double { - 11.1 - } - func provideEmojis() -> EmojiSet { emojiSet } var emojiSet = EmojiSet( categories: [ - Category(type: .people, emojis: [ + Category(type: .people, identifiers: [ "smile", "laughing", "grin" ]), - Category(type: .foods, emojis: [ + Category(type: .foods, identifiers: [ "peach" ]), ], @@ -36,7 +32,8 @@ class EmojiManagerStub: EmojiManagerProtocol { skins: [ Skin(unified: "1f604", native: "😄") ], - version: 1.0), + version: 1.0 + ), "laughing": Emoji( id: "laughing", name: "Grinning Squinting Face", @@ -44,7 +41,8 @@ class EmojiManagerStub: EmojiManagerProtocol { skins: [ Skin(unified: "1f606", native: "😆") ], - version: 1.0), + version: 1.0 + ), "grin": Emoji( id: "grin", name: "Beaming Face with Smiling Eyes", @@ -52,7 +50,8 @@ class EmojiManagerStub: EmojiManagerProtocol { skins: [ Skin(unified: "1f601", native: "😁") ], - version: 1.0), + version: 1.0 + ), "peach": Emoji( id: "peach", name: "Peach", @@ -60,7 +59,8 @@ class EmojiManagerStub: EmojiManagerProtocol { skins: [ Skin(unified: "1f351", native: "🍑") ], - version: 1.0), + version: 1.0 + ), ], aliases: [:] )