@momo-kits/native-kits 0.0.1-beta.3 → 0.0.1-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/example/ios/Example/ComponentModel.swift +9 -2
  2. package/example/ios/Example/ContentView.swift +0 -14
  3. package/example/ios/Example/Foundation/ImageDemo.swift +43 -0
  4. package/example/ios/Example/Foundation/Popup/Popups.swift +2 -52
  5. package/example/ios/Example/Foundation/PopupDemo.swift +44 -21
  6. package/example/ios/Example/Foundation/TextInputDemo.swift +36 -0
  7. package/example/ios/Example/Library/CheckboxDemo.swift +19 -0
  8. package/example/ios/Example/Library/SwitchDemo.swift +19 -0
  9. package/example/ios/Example/Main.swift +17 -1
  10. package/example/ios/Example/Resource/foundation.json +2 -2
  11. package/example/ios/Example/Resource/library.json +10 -0
  12. package/example/ios/Example.xcodeproj/project.pbxproj +16 -0
  13. package/example/ios/Example.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +1 -1
  14. package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  15. package/example/ios/Podfile +2 -1
  16. package/example/ios/Podfile.lock +22 -3
  17. package/example/ios/Pods/Local Podspecs/MoMoUIKits.podspec.json +9 -1
  18. package/example/ios/Pods/Manifest.lock +22 -3
  19. package/example/ios/Pods/Pods.xcodeproj/project.pbxproj +1547 -161
  20. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
  21. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
  22. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
  23. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +21 -0
  24. package/example/ios/Pods/SDWebImage/LICENSE +20 -0
  25. package/example/ios/Pods/SDWebImage/README.md +352 -0
  26. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.h +340 -0
  27. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.m +172 -0
  28. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.h +63 -0
  29. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.m +165 -0
  30. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.h +67 -0
  31. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.m +120 -0
  32. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h +114 -0
  33. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m +392 -0
  34. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h +112 -0
  35. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m +420 -0
  36. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.h +23 -0
  37. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.m +133 -0
  38. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.h +168 -0
  39. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.m +79 -0
  40. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.h +110 -0
  41. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.m +540 -0
  42. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.h +145 -0
  43. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m +326 -0
  44. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h +73 -0
  45. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.m +256 -0
  46. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.h +19 -0
  47. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.m +58 -0
  48. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.h +23 -0
  49. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.m +98 -0
  50. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h +450 -0
  51. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m +1030 -0
  52. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.h +153 -0
  53. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.m +68 -0
  54. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.h +156 -0
  55. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m +138 -0
  56. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.h +81 -0
  57. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.m +556 -0
  58. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h +297 -0
  59. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m +26 -0
  60. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h +153 -0
  61. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m +822 -0
  62. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.h +58 -0
  63. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.m +130 -0
  64. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.h +36 -0
  65. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.m +28 -0
  66. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.h +22 -0
  67. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.m +58 -0
  68. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.h +28 -0
  69. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m +127 -0
  70. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.h +25 -0
  71. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.m +101 -0
  72. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.h +58 -0
  73. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m +807 -0
  74. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.h +30 -0
  75. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m +420 -0
  76. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.h +146 -0
  77. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m +170 -0
  78. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.h +40 -0
  79. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.m +123 -0
  80. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.h +241 -0
  81. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.m +331 -0
  82. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.h +78 -0
  83. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.m +158 -0
  84. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.h +32 -0
  85. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.m +39 -0
  86. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.h +36 -0
  87. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.m +39 -0
  88. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.h +95 -0
  89. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.m +17 -0
  90. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.h +352 -0
  91. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.m +149 -0
  92. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h +314 -0
  93. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m +658 -0
  94. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.h +113 -0
  95. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.m +60 -0
  96. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.h +49 -0
  97. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.m +55 -0
  98. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.h +191 -0
  99. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m +722 -0
  100. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h +69 -0
  101. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.m +71 -0
  102. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.h +69 -0
  103. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.m +73 -0
  104. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h +32 -0
  105. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.m +16 -0
  106. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.h +115 -0
  107. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.m +275 -0
  108. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.h +290 -0
  109. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.m +775 -0
  110. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.h +27 -0
  111. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.m +14 -0
  112. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.h +72 -0
  113. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.m +59 -0
  114. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.h +143 -0
  115. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.m +303 -0
  116. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.h +131 -0
  117. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.m +194 -0
  118. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.h +387 -0
  119. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.m +234 -0
  120. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.h +24 -0
  121. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.m +23 -0
  122. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h +46 -0
  123. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m +60 -0
  124. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.h +26 -0
  125. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.m +22 -0
  126. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.h +27 -0
  127. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.m +47 -0
  128. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.h +89 -0
  129. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.m +221 -0
  130. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.h +80 -0
  131. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.m +47 -0
  132. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h +146 -0
  133. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m +824 -0
  134. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.h +129 -0
  135. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.m +76 -0
  136. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.h +194 -0
  137. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.m +67 -0
  138. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.h +110 -0
  139. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.m +446 -0
  140. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.h +48 -0
  141. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.m +82 -0
  142. package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.h +24 -0
  143. package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.m +42 -0
  144. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.h +14 -0
  145. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.m +29 -0
  146. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.h +21 -0
  147. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m +92 -0
  148. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.h +18 -0
  149. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m +32 -0
  150. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h +29 -0
  151. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m +227 -0
  152. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.h +19 -0
  153. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.m +127 -0
  154. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.h +23 -0
  155. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m +164 -0
  156. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.h +21 -0
  157. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.m +83 -0
  158. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageIOAnimatedCoderInternal.h +39 -0
  159. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.h +122 -0
  160. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.m +13 -0
  161. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.h +20 -0
  162. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.m +79 -0
  163. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWebImageTransitionInternal.h +19 -0
  164. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDmetamacros.h +667 -0
  165. package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.h +18 -0
  166. package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.m +42 -0
  167. package/example/ios/Pods/SDWebImage/WebImage/SDWebImage.h +89 -0
  168. package/example/ios/Pods/SDWebImageSwiftUI/LICENSE +19 -0
  169. package/example/ios/Pods/SDWebImageSwiftUI/README.md +690 -0
  170. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/AnimatedImage.swift +870 -0
  171. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Backport.swift +59 -0
  172. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/OnChange.swift +52 -0
  173. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Overlay.swift +124 -0
  174. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/StateObject.swift +151 -0
  175. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Image.swift +78 -0
  176. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageManager.swift +132 -0
  177. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImagePlayer.swift +122 -0
  178. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift +133 -0
  179. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift +82 -0
  180. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift +97 -0
  181. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift +114 -0
  182. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift +64 -0
  183. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SwiftUICompatibility.swift +92 -0
  184. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Transition/Transition.swift +93 -0
  185. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/WebImage.swift +509 -0
  186. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Module/SDWebImageSwiftUI.h +15 -0
  187. package/example/ios/Pods/SkeletonUI/LICENSE +21 -0
  188. package/example/ios/Pods/SkeletonUI/README.md +137 -0
  189. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AngleInteractor.swift +29 -0
  190. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AnglePresenter.swift +7 -0
  191. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Animation/AnimationInteractor.swift +56 -0
  192. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearanceInteractor.swift +58 -0
  193. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearancePresenter.swift +5 -0
  194. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ClosedRange+Normalize.swift +16 -0
  195. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Image+OptionalType.swift +102 -0
  196. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ModifiedContent+SkeletonModifier.swift +26 -0
  197. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Optional+OptionalType.swift +5 -0
  198. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/SecureField+OptionalType.swift +19 -0
  199. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Text+OptionalType.swift +27 -0
  200. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/TextField+OptionalType.swift +35 -0
  201. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Toggle+OptionalType.swift +29 -0
  202. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/UnitPoint+Angle.swift +8 -0
  203. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/View+SkeletonModifier.swift +8 -0
  204. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Modifiers/SkeletonModifier.swift +52 -0
  205. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilineInteractor.swift +41 -0
  206. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilinePresenter.swift +9 -0
  207. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityInteractor.swift +29 -0
  208. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityPresenter.swift +7 -0
  209. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionInteractor.swift +29 -0
  210. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionPresenter.swift +7 -0
  211. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Protocols/OptionalType.swift +4 -0
  212. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusInteractor.swift +29 -0
  213. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusPresenter.swift +7 -0
  214. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapeInteractor.swift +33 -0
  215. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapePresenter.swift +5 -0
  216. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonForEach.swift +20 -0
  217. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonInteractor.swift +27 -0
  218. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonList.swift +20 -0
  219. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonPresenter.swift +15 -0
  220. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonShape.swift +64 -0
  221. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonView.swift +25 -0
  222. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.debug.xcconfig +4 -1
  223. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.release.xcconfig +4 -1
  224. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown +72 -0
  225. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist +90 -0
  226. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig +6 -5
  227. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig +6 -5
  228. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m +5 -0
  229. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch +12 -0
  230. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h +75 -0
  231. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.debug.xcconfig +14 -0
  232. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap +6 -0
  233. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.release.xcconfig +14 -0
  234. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-dummy.m +5 -0
  235. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch +12 -0
  236. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-umbrella.h +17 -0
  237. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.debug.xcconfig +17 -0
  238. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap +6 -0
  239. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.release.xcconfig +17 -0
  240. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-dummy.m +5 -0
  241. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-prefix.pch +12 -0
  242. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-umbrella.h +16 -0
  243. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.debug.xcconfig +12 -0
  244. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.modulemap +6 -0
  245. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.release.xcconfig +12 -0
  246. package/ios/Checkbox/Checkbox.swift +38 -0
  247. package/ios/{Colors+Spacing → Colors+Radius+Spacing}/Colors.swift +0 -0
  248. package/ios/Colors+Radius+Spacing/Radius.swift +22 -0
  249. package/ios/{Colors+Spacing → Colors+Radius+Spacing}/Spacing.swift +0 -0
  250. package/ios/Extensions/View++.swift +9 -0
  251. package/ios/Image/Image.swift +60 -0
  252. package/ios/Input/Input.swift +148 -0
  253. package/ios/OTPKeyboard/OTPKeyboard.swift +3 -3
  254. package/ios/Popup/PopupDisplay.swift +178 -0
  255. package/ios/PopupView/FullscreenPopup.swift +251 -0
  256. package/ios/{Popup → PopupView}/Modifiers.swift +6 -20
  257. package/ios/{Popup → PopupView}/PopupView.swift +38 -146
  258. package/ios/PopupView/Utils++.swift +281 -0
  259. package/ios/Swipeable/SwipeCell.swift +1 -1
  260. package/ios/Switch/Switch.swift +44 -0
  261. package/ios/native-kits.podspec +2 -0
  262. package/package.json +1 -1
  263. package/ios/Colors+Spacing/Radius.swift +0 -11
  264. package/ios/Popup/Utils.swift +0 -186
@@ -0,0 +1,29 @@
1
+ import Combine
2
+ import SwiftUI
3
+
4
+ // sourcery: AutoMockable
5
+ protocol AngleInteractable: AnyObject {
6
+ var presenter: AnglePresenter { get }
7
+ var animation: CurrentValueSubject<Animation?, Never> { get }
8
+ var value: CurrentValueSubject<Double, Never> { get }
9
+ var range: CurrentValueSubject<ClosedRange<Double>, Never> { get }
10
+ }
11
+
12
+ final class AngleInteractor: AngleInteractable {
13
+ let presenter = AnglePresenter()
14
+ let animation: CurrentValueSubject<Animation?, Never>
15
+ let value: CurrentValueSubject<Double, Never>
16
+ let range: CurrentValueSubject<ClosedRange<Double>, Never>
17
+
18
+ private var cancellables = Set<AnyCancellable>()
19
+
20
+ init() {
21
+ value = CurrentValueSubject<Double, Never>(presenter.value)
22
+ animation = CurrentValueSubject<Animation?, Never>(presenter.animation)
23
+ range = CurrentValueSubject<ClosedRange<Double>, Never>(presenter.range)
24
+ range.assign(to: \.range, on: presenter).store(in: &cancellables)
25
+ value.assign(to: \.value, on: presenter).store(in: &cancellables)
26
+ animation.assign(to: \.animation, on: presenter).store(in: &cancellables)
27
+ range.map { $0.lowerBound }.assign(to: \.value, on: presenter).store(in: &cancellables)
28
+ }
29
+ }
@@ -0,0 +1,7 @@
1
+ import SwiftUI
2
+
3
+ final class AnglePresenter: ObservableObject {
4
+ @Published var animation: Animation?
5
+ @Published var value: Double = .zero
6
+ @Published var range: ClosedRange<Double> = .zero ... 360
7
+ }
@@ -0,0 +1,56 @@
1
+ import Combine
2
+ import SwiftUI
3
+
4
+ public enum AnimationType: Equatable {
5
+ case none
6
+ case pulse(range: ClosedRange<Double> = .zero ... 1, duration: Double = 2, delay: Double = 1, speed: Double = 2, autoreverses: Bool = true)
7
+ case linear(range: ClosedRange<CGFloat> = .zero ... 1, duration: Double = 4, delay: Double = 1, speed: Double = 5, autoreverses: Bool = false)
8
+ }
9
+
10
+ // sourcery: AutoMockable
11
+ protocol AnimationInteractable: AnyObject {
12
+ var position: PositionInteractable { get }
13
+ var opacity: OpacityInteractable { get }
14
+ var radius: RadiusInteractable { get }
15
+ var angle: AngleInteractable { get }
16
+ var type: CurrentValueSubject<AnimationType, Never> { get }
17
+ }
18
+
19
+ final class AnimationInteractor: AnimationInteractable {
20
+ let position: PositionInteractable
21
+ let opacity: OpacityInteractable
22
+ let radius: RadiusInteractable
23
+ let angle: AngleInteractable
24
+ let type: CurrentValueSubject<AnimationType, Never>
25
+
26
+ private var cancellables = Set<AnyCancellable>()
27
+
28
+ init(position: PositionInteractable = PositionInteractor(), opacity: OpacityInteractable = OpacityInteractor(), radius: RadiusInteractable = RadiusInteractor(), angle: AngleInteractable = AngleInteractor()) {
29
+ self.position = position
30
+ self.opacity = opacity
31
+ self.radius = radius
32
+ self.angle = angle
33
+ type = CurrentValueSubject<AnimationType, Never>(.linear())
34
+ type.sink { type in
35
+ position.animation.send(nil)
36
+ opacity.animation.send(nil)
37
+ radius.animation.send(nil)
38
+ angle.animation.send(nil)
39
+ switch type {
40
+ case .none:
41
+ break
42
+ case let .pulse(range, duration, delay, speed, autoreverses):
43
+ opacity.range.send(range)
44
+ opacity.animation.send(Animation.easeIn(duration: duration).delay(delay).speed(speed).repeatForever(autoreverses: autoreverses))
45
+ case let .linear(range, duration, delay, speed, autoreverses):
46
+ position.range.send(position.presenter.range.normalize(with: range))
47
+ radius.range.send(radius.presenter.range.normalize(with: range))
48
+ angle.range.send(angle.presenter.range.normalize(with: range))
49
+ position.animation.send(Animation.easeInOut(duration: duration).delay(delay).speed(speed).repeatForever(autoreverses: autoreverses))
50
+ opacity.animation.send(autoreverses ? nil : Animation.easeIn(duration: duration).delay(delay).speed(speed * 2).repeatForever(autoreverses: true))
51
+ radius.animation.send(Animation.easeInOut(duration: duration).delay(delay).speed(speed).repeatForever(autoreverses: autoreverses))
52
+ angle.animation.send(Animation.easeInOut(duration: duration).delay(delay).speed(speed).repeatForever(autoreverses: autoreverses))
53
+ }
54
+ }.store(in: &cancellables)
55
+ }
56
+ }
@@ -0,0 +1,58 @@
1
+ import Combine
2
+ import SwiftUI
3
+
4
+ public enum GradientType: Equatable {
5
+ case linear
6
+ case angular
7
+ case radial
8
+ }
9
+
10
+ public struct SkeletonColor {
11
+ public static var primary: Color {
12
+ #if os(iOS)
13
+ return Color(.systemGray4)
14
+ #elseif os(tvOS)
15
+ return Color(.tertiaryLabel)
16
+ #elseif os(watchOS)
17
+ return Color.secondary
18
+ #elseif os(macOS)
19
+ return Color(.alternateSelectedControlColor)
20
+ #endif
21
+ }
22
+
23
+ public static var background: Color {
24
+ #if os(iOS)
25
+ return Color(.systemGray6)
26
+ #elseif os(tvOS)
27
+ return Color(.secondaryLabel)
28
+ #elseif os(watchOS)
29
+ return Color.primary
30
+ #elseif os(macOS)
31
+ return Color(.unemphasizedSelectedContentBackgroundColor)
32
+ #endif
33
+ }
34
+ }
35
+
36
+
37
+ public enum AppearanceType: Equatable {
38
+ case solid(color: Color = SkeletonColor.primary, background: Color = SkeletonColor.background)
39
+ case gradient(GradientType = .linear, color: Color = SkeletonColor.primary, background: Color = SkeletonColor.background, radius: CGFloat = 1, angle: CGFloat = .zero)
40
+ }
41
+
42
+ // sourcery: AutoMockable
43
+ protocol AppearanceInteractable: AnyObject {
44
+ var presenter: AppearancePresenter { get }
45
+ var type: CurrentValueSubject<AppearanceType, Never> { get }
46
+ }
47
+
48
+ final class AppearanceInteractor: AppearanceInteractable {
49
+ let presenter = AppearancePresenter()
50
+ let type: CurrentValueSubject<AppearanceType, Never>
51
+
52
+ private var cancellables = Set<AnyCancellable>()
53
+
54
+ init() {
55
+ type = CurrentValueSubject<AppearanceType, Never>(presenter.type)
56
+ type.assign(to: \.type, on: presenter).store(in: &cancellables)
57
+ }
58
+ }
@@ -0,0 +1,5 @@
1
+ import SwiftUI
2
+
3
+ final class AppearancePresenter: ObservableObject {
4
+ @Published var type: AppearanceType = .gradient()
5
+ }
@@ -0,0 +1,16 @@
1
+ import CoreGraphics
2
+
3
+ extension ClosedRange where Bound == CGFloat {
4
+ func normalize(with range: ClosedRange) -> ClosedRange {
5
+ let lowerBound = range.lowerBound == .zero ? self.lowerBound : range.lowerBound
6
+ let upperBound = range.upperBound == 1 ? self.upperBound : range.upperBound
7
+ return lowerBound < upperBound ? lowerBound ... upperBound : self
8
+ }
9
+ }
10
+
11
+ extension ClosedRange where Bound == Double {
12
+ func normalize(with range: ClosedRange<CGFloat>) -> ClosedRange {
13
+ let normalized = (CGFloat(lowerBound) ... CGFloat(upperBound)).normalize(with: range)
14
+ return Double(normalized.lowerBound) ... Double(normalized.upperBound)
15
+ }
16
+ }
@@ -0,0 +1,102 @@
1
+ import SwiftUI
2
+
3
+ public extension Image {
4
+ #if os(iOS) || os(tvOS) || os(watchOS)
5
+ init(uiImage: UIImage?) {
6
+ if let uiImage = uiImage {
7
+ self.init(uiImage: uiImage)
8
+ } else {
9
+ self.init(uiImage: UIImage())
10
+ }
11
+ }
12
+
13
+ #elseif os(macOS)
14
+ init(nsImage: NSImage?) {
15
+ if let nsImage = nsImage {
16
+ self.init(nsImage: nsImage)
17
+ } else {
18
+ self.init(nsImage: NSImage())
19
+ }
20
+ }
21
+ #endif
22
+
23
+ init(_ name: String?, bundle: Bundle? = nil) {
24
+ if let name = name {
25
+ self.init(name, bundle: bundle)
26
+ } else {
27
+ self.init(String(), bundle: bundle)
28
+ }
29
+ }
30
+
31
+ init(_ name: String?, bundle: Bundle? = nil, label: Text) {
32
+ if let name = name {
33
+ self.init(name, bundle: bundle, label: label)
34
+ } else {
35
+ self.init(String(), bundle: bundle, label: label)
36
+ }
37
+ }
38
+
39
+ init(decorative name: String?, bundle: Bundle? = nil) {
40
+ if let name = name {
41
+ self.init(decorative: name, bundle: bundle)
42
+ } else {
43
+ self.init(decorative: String(), bundle: bundle)
44
+ }
45
+ }
46
+
47
+ #if os(iOS) || os(tvOS) || os(watchOS)
48
+ init(systemName: String?) {
49
+ if let systemName = systemName {
50
+ self.init(systemName: systemName)
51
+ } else {
52
+ self.init(systemName: String())
53
+ }
54
+ }
55
+ #endif
56
+
57
+ #if os(iOS) || os(tvOS) || os(watchOS)
58
+ init(_ cgImage: CGImage?, scale: CGFloat, orientation: Image.Orientation = .up, label: Text) {
59
+ if let cgImage = cgImage {
60
+ self.init(cgImage, scale: scale, orientation: orientation, label: label)
61
+ } else if let image = UIImage().cgImage {
62
+ self.init(image, scale: scale, orientation: orientation, label: label)
63
+ } else {
64
+ self.init(String())
65
+ }
66
+ }
67
+
68
+ #elseif os(macOS)
69
+ init(_ cgImage: CGImage?, scale: CGFloat, orientation: Image.Orientation = .up, label: Text) {
70
+ if let cgImage = cgImage {
71
+ self.init(cgImage, scale: scale, orientation: orientation, label: label)
72
+ } else if let image = NSImage().cgImage(forProposedRect: nil, context: nil, hints: nil) {
73
+ self.init(image, scale: scale, orientation: orientation, label: label)
74
+ } else {
75
+ self.init(String())
76
+ }
77
+ }
78
+ #endif
79
+
80
+ #if os(iOS) || os(tvOS) || os(watchOS)
81
+ init(decorative cgImage: CGImage?, scale: CGFloat, orientation: Image.Orientation = .up) {
82
+ if let cgImage = cgImage {
83
+ self.init(decorative: cgImage, scale: scale, orientation: orientation)
84
+ } else if let image = UIImage().cgImage {
85
+ self.init(decorative: image, scale: scale, orientation: orientation)
86
+ } else {
87
+ self.init(String())
88
+ }
89
+ }
90
+
91
+ #elseif os(macOS)
92
+ init(decorative cgImage: CGImage?, scale: CGFloat, orientation: Image.Orientation = .up) {
93
+ if let cgImage = cgImage {
94
+ self.init(decorative: cgImage, scale: scale, orientation: orientation)
95
+ } else if let image = NSImage().cgImage(forProposedRect: nil, context: nil, hints: nil) {
96
+ self.init(decorative: image, scale: scale, orientation: orientation)
97
+ } else {
98
+ self.init(String())
99
+ }
100
+ }
101
+ #endif
102
+ }
@@ -0,0 +1,26 @@
1
+ import SwiftUI
2
+
3
+ @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
4
+ public extension ModifiedContent where Content: View, Modifier == SkeletonModifier {
5
+ func animation(type: AnimationType) -> ModifiedContent<Content, SkeletonModifier> {
6
+ modifier.skeleton.animation.type.send(type)
7
+ return self
8
+ }
9
+
10
+ func appearance(type: AppearanceType) -> ModifiedContent<Content, SkeletonModifier> {
11
+ modifier.skeleton.appearance.type.send(type)
12
+ return self
13
+ }
14
+
15
+ func multiline(lines: Int, scales: [Int: CGFloat]? = nil, spacing: CGFloat? = nil) -> ModifiedContent<Content, SkeletonModifier> {
16
+ modifier.skeleton.multiline.lines.send(lines)
17
+ modifier.skeleton.multiline.scales.send(scales)
18
+ modifier.skeleton.multiline.spacing.send(spacing)
19
+ return self
20
+ }
21
+
22
+ func shape(type: ShapeType) -> ModifiedContent<Content, SkeletonModifier> {
23
+ modifier.skeleton.shape.type.send(type)
24
+ return self
25
+ }
26
+ }
@@ -0,0 +1,5 @@
1
+ extension Optional: OptionalType {
2
+ public var wrapped: Wrapped? {
3
+ self
4
+ }
5
+ }
@@ -0,0 +1,19 @@
1
+ import SwiftUI
2
+
3
+ public extension SecureField where Label == Text {
4
+ init(_ titleKey: LocalizedStringKey?, text: Binding<String>, onCommit: @escaping () -> Void = {}) {
5
+ if let titleKey = titleKey {
6
+ self.init(titleKey, text: text, onCommit: onCommit)
7
+ } else {
8
+ self.init(LocalizedStringKey(String()), text: text, onCommit: onCommit)
9
+ }
10
+ }
11
+
12
+ init<S>(_ title: S?, text: Binding<String>, onCommit: @escaping () -> Void = {}) where S: OptionalType, S.Wrapped: StringProtocol {
13
+ if let title = title?.wrapped {
14
+ self.init(title, text: text, onCommit: onCommit)
15
+ } else {
16
+ self.init(String(), text: text, onCommit: onCommit)
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,27 @@
1
+ import SwiftUI
2
+
3
+ public extension Text {
4
+ init<S>(_ content: S?) where S: OptionalType, S.Wrapped: StringProtocol {
5
+ if let content = content?.wrapped {
6
+ self.init(content)
7
+ } else {
8
+ self.init(String())
9
+ }
10
+ }
11
+
12
+ init(_ key: LocalizedStringKey?, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil) {
13
+ if let key = key {
14
+ self.init(key, tableName: tableName, bundle: bundle, comment: comment)
15
+ } else {
16
+ self.init(LocalizedStringKey(String()), tableName: tableName, bundle: bundle, comment: comment)
17
+ }
18
+ }
19
+
20
+ init(verbatim content: String?) {
21
+ if let content = content {
22
+ self.init(verbatim: content)
23
+ } else {
24
+ self.init(verbatim: String())
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,35 @@
1
+ import SwiftUI
2
+
3
+ public extension TextField where Label == Text {
4
+ init(titleKey: LocalizedStringKey?, text: Binding<String>, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) {
5
+ if let titleKey = titleKey {
6
+ self.init(titleKey, text: text, onEditingChanged: onEditingChanged, onCommit: onCommit)
7
+ } else {
8
+ self.init(LocalizedStringKey(String()), text: text, onEditingChanged: onEditingChanged, onCommit: onCommit)
9
+ }
10
+ }
11
+
12
+ init<S>(_ title: S?, text: Binding<String>, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) where S: OptionalType, S.Wrapped: StringProtocol {
13
+ if let title = title?.wrapped {
14
+ self.init(title, text: text, onEditingChanged: onEditingChanged, onCommit: onCommit)
15
+ } else {
16
+ self.init(String(), text: text, onEditingChanged: onEditingChanged, onCommit: onCommit)
17
+ }
18
+ }
19
+
20
+ init<T>(titleKey: LocalizedStringKey?, value: Binding<T>, formatter: Formatter, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) {
21
+ if let titleKey = titleKey {
22
+ self.init(titleKey, value: value, formatter: formatter, onEditingChanged: onEditingChanged, onCommit: onCommit)
23
+ } else {
24
+ self.init(LocalizedStringKey(String()), value: value, formatter: formatter, onEditingChanged: onEditingChanged, onCommit: onCommit)
25
+ }
26
+ }
27
+
28
+ init<S, T>(_ title: S?, value: Binding<T>, formatter: Formatter, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) where S: OptionalType, S.Wrapped: StringProtocol {
29
+ if let title = title?.wrapped {
30
+ self.init(title, value: value, formatter: formatter, onEditingChanged: onEditingChanged, onCommit: onCommit)
31
+ } else {
32
+ self.init(String(), value: value, formatter: formatter, onEditingChanged: onEditingChanged, onCommit: onCommit)
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,29 @@
1
+ import SwiftUI
2
+
3
+ public extension Toggle where Label: View {
4
+ init(isOn: Binding<Bool>?, @ViewBuilder label: () -> Label) {
5
+ if let isOn = isOn {
6
+ self.init(isOn: isOn, label: label)
7
+ } else {
8
+ self.init(isOn: Binding.constant(Bool()), label: label)
9
+ }
10
+ }
11
+ }
12
+
13
+ public extension Toggle where Label == Text {
14
+ init(_ titleKey: LocalizedStringKey?, isOn: Binding<Bool>) {
15
+ if let titleKey = titleKey {
16
+ self.init(titleKey, isOn: isOn)
17
+ } else {
18
+ self.init(String(), isOn: isOn)
19
+ }
20
+ }
21
+
22
+ init<S>(_ title: S?, isOn: Binding<Bool>) where S: OptionalType, S.Wrapped: StringProtocol {
23
+ if let title = title?.wrapped {
24
+ self.init(title, isOn: isOn)
25
+ } else {
26
+ self.init(String(), isOn: isOn)
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,8 @@
1
+ import SwiftUI
2
+
3
+ extension UnitPoint {
4
+ static func point(with position: CGFloat, _ radius: CGFloat, _ angle: CGFloat) -> UnitPoint {
5
+ let radians = angle * .pi / 180.0
6
+ return UnitPoint(x: (position + radius) * cos(radians), y: (position + radius) * sin(radians))
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ import SwiftUI
2
+
3
+ @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
4
+ public extension View {
5
+ func skeleton(with loading: Bool, size: CGSize? = .none, transition: AnyTransition? = nil, animated: Animation? = nil) -> ModifiedContent<Self, SkeletonModifier> {
6
+ modifier(SkeletonModifier(skeleton: SkeletonInteractor(loading, size: size, transition: transition, animated: animated)))
7
+ }
8
+ }
@@ -0,0 +1,52 @@
1
+ import SwiftUI
2
+
3
+ @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
4
+ public struct SkeletonModifier: ViewModifier {
5
+ let skeleton: SkeletonInteractable
6
+ @State var animation: Bool = false
7
+
8
+ public func body(content: Content) -> some View {
9
+ ZStack {
10
+ if skeleton.presenter.loading {
11
+ VStack(spacing: skeleton.multiline.presenter.spacing) {
12
+ ForEach(0 ..< skeleton.multiline.presenter.lines, id: \.self) { line in
13
+ GeometryReader { geometry in
14
+ SkeletonView(skeleton: skeleton, line: line)
15
+ .frame(width: skeleton.multiline.presenter.scale * geometry.size.width, height: geometry.size.height)
16
+ .onReceive([animation].publisher.filter { $0 }.removeDuplicates().first()) { _ in
17
+ withAnimation(skeleton.animation.position.presenter.animation) {
18
+ skeleton.animation.position.value.send(skeleton.animation.position.presenter.range.upperBound)
19
+ }
20
+ withAnimation(skeleton.animation.opacity.presenter.animation) {
21
+ skeleton.animation.opacity.value.send(skeleton.animation.opacity.presenter.range.upperBound)
22
+ }
23
+ withAnimation(skeleton.animation.radius.presenter.animation) {
24
+ skeleton.animation.radius.value.send(skeleton.animation.radius.presenter.range.upperBound)
25
+ }
26
+ withAnimation(skeleton.animation.angle.presenter.animation) {
27
+ skeleton.animation.angle.value.send(skeleton.animation.angle.presenter.range.upperBound)
28
+ }
29
+ }
30
+ .onAppear {
31
+ DispatchQueue.main.async {
32
+ animation = true
33
+ }
34
+ }
35
+ .onDisappear {
36
+ DispatchQueue.main.async {
37
+ animation = false
38
+ }
39
+ }
40
+ }
41
+ }
42
+ }
43
+ .frame(width: skeleton.presenter.size?.width, height: skeleton.presenter.size?.height)
44
+ .transition(skeleton.presenter.transition)
45
+ } else {
46
+ content
47
+ .transition(skeleton.presenter.transition)
48
+ }
49
+ }
50
+ .animation(skeleton.presenter.animated, value: skeleton.presenter.loading)
51
+ }
52
+ }
@@ -0,0 +1,41 @@
1
+ import Combine
2
+ import SwiftUI
3
+
4
+ // sourcery: AutoMockable
5
+ protocol MultilineInteractable: AnyObject {
6
+ var presenter: MultilinePresenter { get }
7
+ var line: CurrentValueSubject<Int, Never> { get }
8
+ var lines: CurrentValueSubject<Int, Never> { get }
9
+ var scale: CurrentValueSubject<CGFloat, Never> { get }
10
+ var spacing: CurrentValueSubject<CGFloat?, Never> { get }
11
+ var scales: CurrentValueSubject<[Int: CGFloat]?, Never> { get }
12
+ }
13
+
14
+ final class MultilineInteractor: MultilineInteractable {
15
+ let presenter = MultilinePresenter()
16
+ let line: CurrentValueSubject<Int, Never>
17
+ let lines: CurrentValueSubject<Int, Never>
18
+ let scale: CurrentValueSubject<CGFloat, Never>
19
+ let spacing: CurrentValueSubject<CGFloat?, Never>
20
+ let scales: CurrentValueSubject<[Int: CGFloat]?, Never>
21
+
22
+ private var cancellables = Set<AnyCancellable>()
23
+
24
+ init() {
25
+ line = CurrentValueSubject<Int, Never>(presenter.line)
26
+ lines = CurrentValueSubject<Int, Never>(presenter.lines)
27
+ scale = CurrentValueSubject<CGFloat, Never>(presenter.scale)
28
+ spacing = CurrentValueSubject<CGFloat?, Never>(presenter.spacing)
29
+ scales = CurrentValueSubject<[Int: CGFloat]?, Never>(presenter.scales)
30
+ line.map { [weak self] line in
31
+ guard let self = self else { fatalError() }
32
+ if let scale = self.scales.value?[line] {
33
+ return scale
34
+ }
35
+ return 1
36
+ }.assign(to: \.scale, on: presenter).store(in: &cancellables)
37
+ lines.assign(to: \.lines, on: presenter).store(in: &cancellables)
38
+ scales.assign(to: \.scales, on: presenter).store(in: &cancellables)
39
+ spacing.assign(to: \.spacing, on: presenter).store(in: &cancellables)
40
+ }
41
+ }
@@ -0,0 +1,9 @@
1
+ import SwiftUI
2
+
3
+ final class MultilinePresenter: ObservableObject {
4
+ @Published var line: Int = 0
5
+ @Published var lines: Int = 1
6
+ @Published var spacing: CGFloat?
7
+ @Published var scale: CGFloat = 1
8
+ @Published var scales: [Int: CGFloat]?
9
+ }
@@ -0,0 +1,29 @@
1
+ import Combine
2
+ import SwiftUI
3
+
4
+ // sourcery: AutoMockable
5
+ protocol OpacityInteractable: AnyObject {
6
+ var presenter: OpacityPresenter { get }
7
+ var animation: CurrentValueSubject<Animation?, Never> { get }
8
+ var value: CurrentValueSubject<Double, Never> { get }
9
+ var range: CurrentValueSubject<ClosedRange<Double>, Never> { get }
10
+ }
11
+
12
+ final class OpacityInteractor: OpacityInteractable {
13
+ let presenter = OpacityPresenter()
14
+ let animation: CurrentValueSubject<Animation?, Never>
15
+ let value: CurrentValueSubject<Double, Never>
16
+ let range: CurrentValueSubject<ClosedRange<Double>, Never>
17
+
18
+ private var cancellables = Set<AnyCancellable>()
19
+
20
+ init() {
21
+ value = CurrentValueSubject<Double, Never>(presenter.value)
22
+ animation = CurrentValueSubject<Animation?, Never>(presenter.animation)
23
+ range = CurrentValueSubject<ClosedRange<Double>, Never>(presenter.range)
24
+ range.assign(to: \.range, on: presenter).store(in: &cancellables)
25
+ value.assign(to: \.value, on: presenter).store(in: &cancellables)
26
+ animation.assign(to: \.animation, on: presenter).store(in: &cancellables)
27
+ range.map { $0.lowerBound }.assign(to: \.value, on: presenter).store(in: &cancellables)
28
+ }
29
+ }
@@ -0,0 +1,7 @@
1
+ import SwiftUI
2
+
3
+ final class OpacityPresenter: ObservableObject {
4
+ @Published var animation: Animation?
5
+ @Published var value: Double = .zero
6
+ @Published var range: ClosedRange<Double> = .zero ... 1
7
+ }
@@ -0,0 +1,29 @@
1
+ import Combine
2
+ import SwiftUI
3
+
4
+ // sourcery: AutoMockable
5
+ protocol PositionInteractable: AnyObject {
6
+ var presenter: PositionPresenter { get }
7
+ var animation: CurrentValueSubject<Animation?, Never> { get }
8
+ var value: CurrentValueSubject<CGFloat, Never> { get }
9
+ var range: CurrentValueSubject<ClosedRange<CGFloat>, Never> { get }
10
+ }
11
+
12
+ final class PositionInteractor: PositionInteractable {
13
+ let presenter = PositionPresenter()
14
+ let animation: CurrentValueSubject<Animation?, Never>
15
+ let value: CurrentValueSubject<CGFloat, Never>
16
+ let range: CurrentValueSubject<ClosedRange<CGFloat>, Never>
17
+
18
+ private var cancellables = Set<AnyCancellable>()
19
+
20
+ init() {
21
+ value = CurrentValueSubject<CGFloat, Never>(presenter.value)
22
+ animation = CurrentValueSubject<Animation?, Never>(presenter.animation)
23
+ range = CurrentValueSubject<ClosedRange<CGFloat>, Never>(presenter.range)
24
+ range.assign(to: \.range, on: presenter).store(in: &cancellables)
25
+ value.assign(to: \.value, on: presenter).store(in: &cancellables)
26
+ animation.assign(to: \.animation, on: presenter).store(in: &cancellables)
27
+ range.map { $0.lowerBound }.assign(to: \.value, on: presenter).store(in: &cancellables)
28
+ }
29
+ }
@@ -0,0 +1,7 @@
1
+ import SwiftUI
2
+
3
+ final class PositionPresenter: ObservableObject {
4
+ @Published var animation: Animation?
5
+ @Published var value: CGFloat = .zero
6
+ @Published var range: ClosedRange<CGFloat> = .zero ... 1
7
+ }
@@ -0,0 +1,4 @@
1
+ public protocol OptionalType {
2
+ associatedtype Wrapped
3
+ var wrapped: Wrapped? { get }
4
+ }