├── .gitignore ├── CODE_OF_CONDUCT.md ├── Demo ├── LoremDemo.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Resources │ ├── colors.png │ └── lorem.png ├── Shared │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ ├── ContentView.swift │ ├── LoremDemoApp.swift │ └── Sample.swift └── macOS │ └── macOS.entitlements ├── LICENSE.md ├── Package.swift ├── README.md └── Sources └── Lorem ├── Lorem.swift ├── Resources ├── symbols-1.txt ├── symbols-2.txt ├── symbols-3.txt └── symbols-4.txt ├── Source ├── Color.swift ├── Date.swift ├── Image.swift ├── Int.swift ├── Palette.swift ├── String.swift ├── SystemImage.swift ├── Text.swift └── URL.swift └── Support ├── Data.swift ├── Helpers.swift └── Symbol.swift /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/config/registries.json 8 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 9 | .netrc 10 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | To give clarity of what is expected of our contributors, we feel conduct defined by [contributor-covenant.org](https://www.contributor-covenant.org/version/2/1/code_of_conduct/) best articulates our values. 4 | -------------------------------------------------------------------------------- /Demo/LoremDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 55; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 543F294A2846F73A00217231 /* LoremDemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543F293A2846F73900217231 /* LoremDemoApp.swift */; }; 11 | 543F294B2846F73A00217231 /* LoremDemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543F293A2846F73900217231 /* LoremDemoApp.swift */; }; 12 | 543F294C2846F73A00217231 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543F293B2846F73900217231 /* ContentView.swift */; }; 13 | 543F294D2846F73A00217231 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543F293B2846F73900217231 /* ContentView.swift */; }; 14 | 543F294E2846F73A00217231 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 543F293C2846F73A00217231 /* Assets.xcassets */; }; 15 | 543F294F2846F73A00217231 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 543F293C2846F73A00217231 /* Assets.xcassets */; }; 16 | 543F295A2846F74C00217231 /* Lorem in Frameworks */ = {isa = PBXBuildFile; productRef = 543F29592846F74C00217231 /* Lorem */; }; 17 | 54739B582853E31A004953A1 /* Lorem in Frameworks */ = {isa = PBXBuildFile; productRef = 54739B572853E31A004953A1 /* Lorem */; }; 18 | 54F95B572851E99E00557D0C /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F95B562851E99E00557D0C /* Sample.swift */; }; 19 | 54F95B582851E99E00557D0C /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F95B562851E99E00557D0C /* Sample.swift */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | 54240C042853DE5900F4849B /* Lorem */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Lorem; path = ..; sourceTree = ""; }; 24 | 543F293A2846F73900217231 /* LoremDemoApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoremDemoApp.swift; sourceTree = ""; }; 25 | 543F293B2846F73900217231 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 26 | 543F293C2846F73A00217231 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 27 | 543F29412846F73A00217231 /* LoremDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LoremDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 543F29472846F73A00217231 /* LoremDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LoremDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | 543F29492846F73A00217231 /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = ""; }; 30 | 54F95B562851E99E00557D0C /* Sample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Sample.swift; sourceTree = ""; }; 31 | /* End PBXFileReference section */ 32 | 33 | /* Begin PBXFrameworksBuildPhase section */ 34 | 543F293E2846F73A00217231 /* Frameworks */ = { 35 | isa = PBXFrameworksBuildPhase; 36 | buildActionMask = 2147483647; 37 | files = ( 38 | 543F295A2846F74C00217231 /* Lorem in Frameworks */, 39 | ); 40 | runOnlyForDeploymentPostprocessing = 0; 41 | }; 42 | 543F29442846F73A00217231 /* Frameworks */ = { 43 | isa = PBXFrameworksBuildPhase; 44 | buildActionMask = 2147483647; 45 | files = ( 46 | 54739B582853E31A004953A1 /* Lorem in Frameworks */, 47 | ); 48 | runOnlyForDeploymentPostprocessing = 0; 49 | }; 50 | /* End PBXFrameworksBuildPhase section */ 51 | 52 | /* Begin PBXGroup section */ 53 | 543F29342846F73900217231 = { 54 | isa = PBXGroup; 55 | children = ( 56 | 54240C042853DE5900F4849B /* Lorem */, 57 | 543F29392846F73900217231 /* Shared */, 58 | 543F29482846F73A00217231 /* macOS */, 59 | 543F29422846F73A00217231 /* Products */, 60 | 543F29582846F74C00217231 /* Frameworks */, 61 | ); 62 | sourceTree = ""; 63 | }; 64 | 543F29392846F73900217231 /* Shared */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 543F293A2846F73900217231 /* LoremDemoApp.swift */, 68 | 543F293B2846F73900217231 /* ContentView.swift */, 69 | 54F95B562851E99E00557D0C /* Sample.swift */, 70 | 543F293C2846F73A00217231 /* Assets.xcassets */, 71 | ); 72 | path = Shared; 73 | sourceTree = ""; 74 | }; 75 | 543F29422846F73A00217231 /* Products */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 543F29412846F73A00217231 /* LoremDemo.app */, 79 | 543F29472846F73A00217231 /* LoremDemo.app */, 80 | ); 81 | name = Products; 82 | sourceTree = ""; 83 | }; 84 | 543F29482846F73A00217231 /* macOS */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 543F29492846F73A00217231 /* macOS.entitlements */, 88 | ); 89 | path = macOS; 90 | sourceTree = ""; 91 | }; 92 | 543F29582846F74C00217231 /* Frameworks */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | ); 96 | name = Frameworks; 97 | sourceTree = ""; 98 | }; 99 | /* End PBXGroup section */ 100 | 101 | /* Begin PBXNativeTarget section */ 102 | 543F29402846F73A00217231 /* LoremDemo (iOS) */ = { 103 | isa = PBXNativeTarget; 104 | buildConfigurationList = 543F29522846F73A00217231 /* Build configuration list for PBXNativeTarget "LoremDemo (iOS)" */; 105 | buildPhases = ( 106 | 543F293D2846F73A00217231 /* Sources */, 107 | 543F293E2846F73A00217231 /* Frameworks */, 108 | 543F293F2846F73A00217231 /* Resources */, 109 | ); 110 | buildRules = ( 111 | ); 112 | dependencies = ( 113 | ); 114 | name = "LoremDemo (iOS)"; 115 | packageProductDependencies = ( 116 | 543F29592846F74C00217231 /* Lorem */, 117 | ); 118 | productName = "LoremDemo (iOS)"; 119 | productReference = 543F29412846F73A00217231 /* LoremDemo.app */; 120 | productType = "com.apple.product-type.application"; 121 | }; 122 | 543F29462846F73A00217231 /* LoremDemo (macOS) */ = { 123 | isa = PBXNativeTarget; 124 | buildConfigurationList = 543F29552846F73A00217231 /* Build configuration list for PBXNativeTarget "LoremDemo (macOS)" */; 125 | buildPhases = ( 126 | 543F29432846F73A00217231 /* Sources */, 127 | 543F29442846F73A00217231 /* Frameworks */, 128 | 543F29452846F73A00217231 /* Resources */, 129 | ); 130 | buildRules = ( 131 | ); 132 | dependencies = ( 133 | ); 134 | name = "LoremDemo (macOS)"; 135 | packageProductDependencies = ( 136 | 54739B572853E31A004953A1 /* Lorem */, 137 | ); 138 | productName = "LoremDemo (macOS)"; 139 | productReference = 543F29472846F73A00217231 /* LoremDemo.app */; 140 | productType = "com.apple.product-type.application"; 141 | }; 142 | /* End PBXNativeTarget section */ 143 | 144 | /* Begin PBXProject section */ 145 | 543F29352846F73900217231 /* Project object */ = { 146 | isa = PBXProject; 147 | attributes = { 148 | BuildIndependentTargetsInParallel = 1; 149 | LastSwiftUpdateCheck = 1340; 150 | LastUpgradeCheck = 1340; 151 | TargetAttributes = { 152 | 543F29402846F73A00217231 = { 153 | CreatedOnToolsVersion = 13.4; 154 | }; 155 | 543F29462846F73A00217231 = { 156 | CreatedOnToolsVersion = 13.4; 157 | }; 158 | }; 159 | }; 160 | buildConfigurationList = 543F29382846F73900217231 /* Build configuration list for PBXProject "LoremDemo" */; 161 | compatibilityVersion = "Xcode 13.0"; 162 | developmentRegion = en; 163 | hasScannedForEncodings = 0; 164 | knownRegions = ( 165 | en, 166 | Base, 167 | ); 168 | mainGroup = 543F29342846F73900217231; 169 | productRefGroup = 543F29422846F73A00217231 /* Products */; 170 | projectDirPath = ""; 171 | projectRoot = ""; 172 | targets = ( 173 | 543F29402846F73A00217231 /* LoremDemo (iOS) */, 174 | 543F29462846F73A00217231 /* LoremDemo (macOS) */, 175 | ); 176 | }; 177 | /* End PBXProject section */ 178 | 179 | /* Begin PBXResourcesBuildPhase section */ 180 | 543F293F2846F73A00217231 /* Resources */ = { 181 | isa = PBXResourcesBuildPhase; 182 | buildActionMask = 2147483647; 183 | files = ( 184 | 543F294E2846F73A00217231 /* Assets.xcassets in Resources */, 185 | ); 186 | runOnlyForDeploymentPostprocessing = 0; 187 | }; 188 | 543F29452846F73A00217231 /* Resources */ = { 189 | isa = PBXResourcesBuildPhase; 190 | buildActionMask = 2147483647; 191 | files = ( 192 | 543F294F2846F73A00217231 /* Assets.xcassets in Resources */, 193 | ); 194 | runOnlyForDeploymentPostprocessing = 0; 195 | }; 196 | /* End PBXResourcesBuildPhase section */ 197 | 198 | /* Begin PBXSourcesBuildPhase section */ 199 | 543F293D2846F73A00217231 /* Sources */ = { 200 | isa = PBXSourcesBuildPhase; 201 | buildActionMask = 2147483647; 202 | files = ( 203 | 543F294C2846F73A00217231 /* ContentView.swift in Sources */, 204 | 54F95B572851E99E00557D0C /* Sample.swift in Sources */, 205 | 543F294A2846F73A00217231 /* LoremDemoApp.swift in Sources */, 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | }; 209 | 543F29432846F73A00217231 /* Sources */ = { 210 | isa = PBXSourcesBuildPhase; 211 | buildActionMask = 2147483647; 212 | files = ( 213 | 543F294D2846F73A00217231 /* ContentView.swift in Sources */, 214 | 54F95B582851E99E00557D0C /* Sample.swift in Sources */, 215 | 543F294B2846F73A00217231 /* LoremDemoApp.swift in Sources */, 216 | ); 217 | runOnlyForDeploymentPostprocessing = 0; 218 | }; 219 | /* End PBXSourcesBuildPhase section */ 220 | 221 | /* Begin XCBuildConfiguration section */ 222 | 543F29502846F73A00217231 /* Debug */ = { 223 | isa = XCBuildConfiguration; 224 | buildSettings = { 225 | ALWAYS_SEARCH_USER_PATHS = NO; 226 | CLANG_ANALYZER_NONNULL = YES; 227 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 228 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 229 | CLANG_ENABLE_MODULES = YES; 230 | CLANG_ENABLE_OBJC_ARC = YES; 231 | CLANG_ENABLE_OBJC_WEAK = YES; 232 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 233 | CLANG_WARN_BOOL_CONVERSION = YES; 234 | CLANG_WARN_COMMA = YES; 235 | CLANG_WARN_CONSTANT_CONVERSION = YES; 236 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 238 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 239 | CLANG_WARN_EMPTY_BODY = YES; 240 | CLANG_WARN_ENUM_CONVERSION = YES; 241 | CLANG_WARN_INFINITE_RECURSION = YES; 242 | CLANG_WARN_INT_CONVERSION = YES; 243 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 244 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 245 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 246 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 247 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 248 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 249 | CLANG_WARN_STRICT_PROTOTYPES = YES; 250 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 251 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 252 | CLANG_WARN_UNREACHABLE_CODE = YES; 253 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 254 | COPY_PHASE_STRIP = NO; 255 | DEBUG_INFORMATION_FORMAT = dwarf; 256 | ENABLE_STRICT_OBJC_MSGSEND = YES; 257 | ENABLE_TESTABILITY = YES; 258 | GCC_C_LANGUAGE_STANDARD = gnu11; 259 | GCC_DYNAMIC_NO_PIC = NO; 260 | GCC_NO_COMMON_BLOCKS = YES; 261 | GCC_OPTIMIZATION_LEVEL = 0; 262 | GCC_PREPROCESSOR_DEFINITIONS = ( 263 | "DEBUG=1", 264 | "$(inherited)", 265 | ); 266 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 267 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 268 | GCC_WARN_UNDECLARED_SELECTOR = YES; 269 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 270 | GCC_WARN_UNUSED_FUNCTION = YES; 271 | GCC_WARN_UNUSED_VARIABLE = YES; 272 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 273 | MTL_FAST_MATH = YES; 274 | ONLY_ACTIVE_ARCH = YES; 275 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 276 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 277 | }; 278 | name = Debug; 279 | }; 280 | 543F29512846F73A00217231 /* Release */ = { 281 | isa = XCBuildConfiguration; 282 | buildSettings = { 283 | ALWAYS_SEARCH_USER_PATHS = NO; 284 | CLANG_ANALYZER_NONNULL = YES; 285 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 286 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 287 | CLANG_ENABLE_MODULES = YES; 288 | CLANG_ENABLE_OBJC_ARC = YES; 289 | CLANG_ENABLE_OBJC_WEAK = YES; 290 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 291 | CLANG_WARN_BOOL_CONVERSION = YES; 292 | CLANG_WARN_COMMA = YES; 293 | CLANG_WARN_CONSTANT_CONVERSION = YES; 294 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 295 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 296 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 297 | CLANG_WARN_EMPTY_BODY = YES; 298 | CLANG_WARN_ENUM_CONVERSION = YES; 299 | CLANG_WARN_INFINITE_RECURSION = YES; 300 | CLANG_WARN_INT_CONVERSION = YES; 301 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 302 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 303 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 304 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 305 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 306 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 307 | CLANG_WARN_STRICT_PROTOTYPES = YES; 308 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 309 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 310 | CLANG_WARN_UNREACHABLE_CODE = YES; 311 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 312 | COPY_PHASE_STRIP = NO; 313 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 314 | ENABLE_NS_ASSERTIONS = NO; 315 | ENABLE_STRICT_OBJC_MSGSEND = YES; 316 | GCC_C_LANGUAGE_STANDARD = gnu11; 317 | GCC_NO_COMMON_BLOCKS = YES; 318 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 319 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 320 | GCC_WARN_UNDECLARED_SELECTOR = YES; 321 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 322 | GCC_WARN_UNUSED_FUNCTION = YES; 323 | GCC_WARN_UNUSED_VARIABLE = YES; 324 | MTL_ENABLE_DEBUG_INFO = NO; 325 | MTL_FAST_MATH = YES; 326 | SWIFT_COMPILATION_MODE = wholemodule; 327 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 328 | }; 329 | name = Release; 330 | }; 331 | 543F29532846F73A00217231 /* Debug */ = { 332 | isa = XCBuildConfiguration; 333 | buildSettings = { 334 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 335 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 336 | CODE_SIGN_STYLE = Automatic; 337 | CURRENT_PROJECT_VERSION = 1; 338 | DEVELOPMENT_TEAM = V2CWYL9AN8; 339 | ENABLE_PREVIEWS = YES; 340 | GENERATE_INFOPLIST_FILE = YES; 341 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 342 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 343 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 344 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 345 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 346 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 347 | LD_RUNPATH_SEARCH_PATHS = ( 348 | "$(inherited)", 349 | "@executable_path/Frameworks", 350 | ); 351 | MARKETING_VERSION = 1.0; 352 | PRODUCT_BUNDLE_IDENTIFIER = com.benkau.LoremDemo; 353 | PRODUCT_NAME = LoremDemo; 354 | SDKROOT = iphoneos; 355 | SWIFT_EMIT_LOC_STRINGS = YES; 356 | SWIFT_VERSION = 5.0; 357 | TARGETED_DEVICE_FAMILY = "1,2"; 358 | }; 359 | name = Debug; 360 | }; 361 | 543F29542846F73A00217231 /* Release */ = { 362 | isa = XCBuildConfiguration; 363 | buildSettings = { 364 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 365 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 366 | CODE_SIGN_STYLE = Automatic; 367 | CURRENT_PROJECT_VERSION = 1; 368 | DEVELOPMENT_TEAM = V2CWYL9AN8; 369 | ENABLE_PREVIEWS = YES; 370 | GENERATE_INFOPLIST_FILE = YES; 371 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 372 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 373 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 374 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 375 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 376 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 377 | LD_RUNPATH_SEARCH_PATHS = ( 378 | "$(inherited)", 379 | "@executable_path/Frameworks", 380 | ); 381 | MARKETING_VERSION = 1.0; 382 | PRODUCT_BUNDLE_IDENTIFIER = com.benkau.LoremDemo; 383 | PRODUCT_NAME = LoremDemo; 384 | SDKROOT = iphoneos; 385 | SWIFT_EMIT_LOC_STRINGS = YES; 386 | SWIFT_VERSION = 5.0; 387 | TARGETED_DEVICE_FAMILY = "1,2"; 388 | VALIDATE_PRODUCT = YES; 389 | }; 390 | name = Release; 391 | }; 392 | 543F29562846F73A00217231 /* Debug */ = { 393 | isa = XCBuildConfiguration; 394 | buildSettings = { 395 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 396 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 397 | CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; 398 | CODE_SIGN_STYLE = Automatic; 399 | COMBINE_HIDPI_IMAGES = YES; 400 | CURRENT_PROJECT_VERSION = 1; 401 | DEVELOPMENT_TEAM = V2CWYL9AN8; 402 | ENABLE_HARDENED_RUNTIME = YES; 403 | ENABLE_PREVIEWS = YES; 404 | GENERATE_INFOPLIST_FILE = YES; 405 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 406 | LD_RUNPATH_SEARCH_PATHS = ( 407 | "$(inherited)", 408 | "@executable_path/../Frameworks", 409 | ); 410 | MACOSX_DEPLOYMENT_TARGET = 12.3; 411 | MARKETING_VERSION = 1.0; 412 | PRODUCT_BUNDLE_IDENTIFIER = com.benkau.LoremDemo; 413 | PRODUCT_NAME = LoremDemo; 414 | SDKROOT = macosx; 415 | SWIFT_EMIT_LOC_STRINGS = YES; 416 | SWIFT_VERSION = 5.0; 417 | }; 418 | name = Debug; 419 | }; 420 | 543F29572846F73A00217231 /* Release */ = { 421 | isa = XCBuildConfiguration; 422 | buildSettings = { 423 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 424 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 425 | CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; 426 | CODE_SIGN_STYLE = Automatic; 427 | COMBINE_HIDPI_IMAGES = YES; 428 | CURRENT_PROJECT_VERSION = 1; 429 | DEVELOPMENT_TEAM = V2CWYL9AN8; 430 | ENABLE_HARDENED_RUNTIME = YES; 431 | ENABLE_PREVIEWS = YES; 432 | GENERATE_INFOPLIST_FILE = YES; 433 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 434 | LD_RUNPATH_SEARCH_PATHS = ( 435 | "$(inherited)", 436 | "@executable_path/../Frameworks", 437 | ); 438 | MACOSX_DEPLOYMENT_TARGET = 12.3; 439 | MARKETING_VERSION = 1.0; 440 | PRODUCT_BUNDLE_IDENTIFIER = com.benkau.LoremDemo; 441 | PRODUCT_NAME = LoremDemo; 442 | SDKROOT = macosx; 443 | SWIFT_EMIT_LOC_STRINGS = YES; 444 | SWIFT_VERSION = 5.0; 445 | }; 446 | name = Release; 447 | }; 448 | /* End XCBuildConfiguration section */ 449 | 450 | /* Begin XCConfigurationList section */ 451 | 543F29382846F73900217231 /* Build configuration list for PBXProject "LoremDemo" */ = { 452 | isa = XCConfigurationList; 453 | buildConfigurations = ( 454 | 543F29502846F73A00217231 /* Debug */, 455 | 543F29512846F73A00217231 /* Release */, 456 | ); 457 | defaultConfigurationIsVisible = 0; 458 | defaultConfigurationName = Release; 459 | }; 460 | 543F29522846F73A00217231 /* Build configuration list for PBXNativeTarget "LoremDemo (iOS)" */ = { 461 | isa = XCConfigurationList; 462 | buildConfigurations = ( 463 | 543F29532846F73A00217231 /* Debug */, 464 | 543F29542846F73A00217231 /* Release */, 465 | ); 466 | defaultConfigurationIsVisible = 0; 467 | defaultConfigurationName = Release; 468 | }; 469 | 543F29552846F73A00217231 /* Build configuration list for PBXNativeTarget "LoremDemo (macOS)" */ = { 470 | isa = XCConfigurationList; 471 | buildConfigurations = ( 472 | 543F29562846F73A00217231 /* Debug */, 473 | 543F29572846F73A00217231 /* Release */, 474 | ); 475 | defaultConfigurationIsVisible = 0; 476 | defaultConfigurationName = Release; 477 | }; 478 | /* End XCConfigurationList section */ 479 | 480 | /* Begin XCSwiftPackageProductDependency section */ 481 | 543F29592846F74C00217231 /* Lorem */ = { 482 | isa = XCSwiftPackageProductDependency; 483 | productName = Lorem; 484 | }; 485 | 54739B572853E31A004953A1 /* Lorem */ = { 486 | isa = XCSwiftPackageProductDependency; 487 | productName = Lorem; 488 | }; 489 | /* End XCSwiftPackageProductDependency section */ 490 | }; 491 | rootObject = 543F29352846F73900217231 /* Project object */; 492 | } 493 | -------------------------------------------------------------------------------- /Demo/LoremDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Demo/LoremDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Demo/Resources/colors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thirdfort/Lorem/b158632d746a946681ce7714b152cccc1a0716bb/Demo/Resources/colors.png -------------------------------------------------------------------------------- /Demo/Resources/lorem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thirdfort/Lorem/b158632d746a946681ce7714b152cccc1a0716bb/Demo/Resources/lorem.png -------------------------------------------------------------------------------- /Demo/Shared/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Demo/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | }, 93 | { 94 | "idiom" : "mac", 95 | "scale" : "1x", 96 | "size" : "16x16" 97 | }, 98 | { 99 | "idiom" : "mac", 100 | "scale" : "2x", 101 | "size" : "16x16" 102 | }, 103 | { 104 | "idiom" : "mac", 105 | "scale" : "1x", 106 | "size" : "32x32" 107 | }, 108 | { 109 | "idiom" : "mac", 110 | "scale" : "2x", 111 | "size" : "32x32" 112 | }, 113 | { 114 | "idiom" : "mac", 115 | "scale" : "1x", 116 | "size" : "128x128" 117 | }, 118 | { 119 | "idiom" : "mac", 120 | "scale" : "2x", 121 | "size" : "128x128" 122 | }, 123 | { 124 | "idiom" : "mac", 125 | "scale" : "1x", 126 | "size" : "256x256" 127 | }, 128 | { 129 | "idiom" : "mac", 130 | "scale" : "2x", 131 | "size" : "256x256" 132 | }, 133 | { 134 | "idiom" : "mac", 135 | "scale" : "1x", 136 | "size" : "512x512" 137 | }, 138 | { 139 | "idiom" : "mac", 140 | "scale" : "2x", 141 | "size" : "512x512" 142 | } 143 | ], 144 | "info" : { 145 | "author" : "xcode", 146 | "version" : 1 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /Demo/Shared/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Demo/Shared/ContentView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | struct ContentView: View { 4 | var body: some View { 5 | SampleView() 6 | } 7 | } 8 | 9 | struct ContentView_Previews: PreviewProvider { 10 | static var previews: some View { 11 | ContentView() 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Demo/Shared/LoremDemoApp.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | @main 4 | struct LoremDemoApp: App { 5 | var body: some Scene { 6 | WindowGroup { 7 | ContentView() 8 | // .preferredColorScheme(.dark) 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Demo/Shared/Sample.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import Lorem 3 | 4 | struct ColorPalette { 5 | let title: String 6 | let palette: Palette 7 | } 8 | 9 | @available(iOS 14, *) 10 | @available(macOS 12, *) 11 | public struct SampleView: View { 12 | let palettes: [ColorPalette] = [ 13 | .init(title: "RGB", palette: .rgb), 14 | .init(title: "System", palette: .system), 15 | .init(title: "Grayscale (neutral)", palette: .grayscale(.neutral)), 16 | .init(title: "Grayscale (cool)", palette: .grayscale(.cool)), 17 | .init(title: "Grayscale (warm)", palette: .grayscale(.warm)), 18 | .init(title: "Hue", palette: .hue), 19 | ] 20 | 21 | let systemImages: [String] = [ 22 | Lorem.systemImage, Lorem.systemImage, 23 | Lorem.systemImage, Lorem.systemImage, 24 | Lorem.systemImage, Lorem.systemImage, 25 | ] 26 | 27 | public var body: some View { 28 | NavigationView { 29 | List { 30 | Section("Images") { 31 | ScrollView(.horizontal, showsIndicators: false) { 32 | HStack(spacing: 20) { 33 | if #available(iOS 15, *) { 34 | Lorem.asyncImage(size: 100) { phase in 35 | switch phase { 36 | case .success(let image): 37 | image 38 | .resizable() 39 | .scaledToFit() 40 | default: 41 | Rectangle() 42 | .foregroundColor(Color.primary.opacity(0.2)) 43 | } 44 | } 45 | 46 | Lorem.asyncImage(source: .seed(0), size: 200, grayscale: true) { phase in 47 | switch phase { 48 | case .success(let image): 49 | image 50 | .resizable() 51 | .scaledToFit() 52 | .frame(maxWidth: 200) 53 | default: 54 | Rectangle() 55 | .foregroundColor(Color.primary.opacity(0.2)) 56 | .frame(width: 200, height: 200) 57 | } 58 | } 59 | Lorem.asyncImage(source: .seed(100), size: .init(width: 400, height: 200)) { phase in 60 | switch phase { 61 | case .success(let image): 62 | image 63 | .resizable() 64 | .scaledToFit() 65 | .frame(maxWidth: 200) 66 | default: 67 | Rectangle() 68 | .foregroundColor(Color.primary.opacity(0.2)) 69 | .frame(width: 200, height: 200) 70 | } 71 | } 72 | } else { 73 | Lorem.image 74 | Lorem.image 75 | Lorem.image(ratio: 1, color: .accentColor) 76 | } 77 | } 78 | } 79 | .frame(height: 100) 80 | 81 | HStack { 82 | Spacer() 83 | ForEach(systemImages, id: \.self) { name in 84 | Image(systemName: name) 85 | Spacer() 86 | } 87 | } 88 | .foregroundColor(.accentColor) 89 | } 90 | 91 | Section("Person") { 92 | Cell("Name", Lorem.name) 93 | Cell("Age", Lorem.age(year: 1980)) 94 | Cell("Teenager's age", Lorem.age(for: .teen)) 95 | } 96 | 97 | Section("Colors") { 98 | ForEach(palettes.indices, id: \.self) { index in 99 | Cell(palettes[index].title) { 100 | HStack(spacing: 5) { 101 | ForEach(0..<10) { _ in 102 | Lorem.color(palettes[index].palette) 103 | .frame(height: 40) 104 | } 105 | } 106 | } 107 | } 108 | } 109 | 110 | Section("Text") { 111 | Cell("Title", Lorem.title) 112 | Cell("Keywords", Lorem.keywords) 113 | Cell("Sentence", Lorem.sentence) 114 | Cell("Domain") { Lorem.url } 115 | Cell("Email") { Lorem.email } 116 | Cell("Tweet", Lorem.tweet) 117 | } 118 | 119 | Section("Dates") { 120 | Cell("Relative", Lorem.date(within: 2, component: .week, format: .relative())) 121 | Cell("Styled", Lorem.date(.styled(date: .numeric, time: .shortened))) 122 | Cell("ISO 8601", Lorem.date(.iso8601)) 123 | Cell("Custom (HH:mm)", Lorem.date(.formatted("HH:mm"))) 124 | } 125 | 126 | Section("Paragraphs") { 127 | Cell("Single", Lorem.paragraph) 128 | Cell("Two Paragraphs", Lorem.paragraphs(2, separator: "\n\n")) 129 | } 130 | 131 | Section("Data") { 132 | Cell("Number of words", Lorem.Data.words.count) 133 | Cell("Number of first names", Lorem.Data.firstNames.count) 134 | Cell("Number of last names", Lorem.Data.lastNames.count) 135 | Cell("Number of site domains", Lorem.Data.siteDomains.count) 136 | Cell("Number of email domains", Lorem.Data.emailDomains.count) 137 | } 138 | } 139 | .font(.callout) 140 | #if os(iOS) 141 | .listStyle(.insetGrouped) 142 | .navigationBarTitleDisplayMode(.inline) 143 | .navigationBarHidden(true) 144 | #endif 145 | .navigationTitle("Lorem") 146 | } 147 | #if os(iOS) 148 | .navigationViewStyle(.stack) 149 | #endif 150 | } 151 | } 152 | 153 | struct Cell: View { 154 | let title: String 155 | let detail: Content 156 | 157 | init(_ title: String, _ detail: String) where Content == Text { 158 | self.title = title 159 | self.detail = Text(detail) 160 | } 161 | 162 | init(_ title: String, _ detail: S) where Content == Text { 163 | self.title = title 164 | self.detail = Text(verbatim: "\(detail)") 165 | } 166 | 167 | init(_ title: String, @ViewBuilder _ detail: () -> Content) { 168 | self.title = title 169 | self.detail = detail() 170 | } 171 | 172 | var body: some View { 173 | VStack(alignment: .leading, spacing: 4) { 174 | HStack { 175 | Text(title) 176 | .foregroundColor(.secondary) 177 | .font(.footnote.weight(.light)) 178 | Spacer(minLength: 0) 179 | } 180 | 181 | detail 182 | } 183 | .frame(maxWidth: .infinity) 184 | .padding(.vertical, 3) 185 | } 186 | } 187 | 188 | @available(iOS 14, *) 189 | @available(macOS 12, *) 190 | extension Section where Parent == AnyView, Footer == EmptyView, Content: View { 191 | init(_ header: String, @ViewBuilder _ content: () -> Content) { 192 | self.init { 193 | content() 194 | } header: { 195 | AnyView( 196 | Text(header) 197 | .font(.footnote.weight(.medium)) 198 | .textCase(.none) 199 | ) 200 | } footer: { 201 | EmptyView() 202 | } 203 | } 204 | } 205 | 206 | @available(iOS 14, *) 207 | @available(macOS 12, *) 208 | struct SampleView_Previews: PreviewProvider { 209 | static var previews: some View { 210 | SampleView() 211 | } 212 | } 213 | -------------------------------------------------------------------------------- /Demo/macOS/macOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | 204 | 205 | ## Runtime Library Exception to the Apache 2.0 License: ## 206 | 207 | 208 | As an exception, if you use this Software to compile your source code and 209 | portions of this Software are embedded into the binary product as a result, 210 | you may redistribute such product without providing attribution as would 211 | otherwise be required by Sections 4(a), 4(b) and 4(d) of the License. 212 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.6 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Lorem", 8 | platforms: [ 9 | .iOS(.v13), 10 | .macOS(.v10_15), 11 | .tvOS(.v13), 12 | .watchOS(.v6) 13 | ], 14 | products: [ 15 | .library( 16 | name: "Lorem", 17 | targets: ["Lorem"] 18 | ), 19 | ], 20 | targets: [ 21 | .target( 22 | name: "Lorem", 23 | resources: [ 24 | .process("Resources/symbols-1.txt"), 25 | .process("Resources/symbols-2.txt"), 26 | .process("Resources/symbols-3.txt"), 27 | .process("Resources/symbols-4.txt"), 28 | ] 29 | ), 30 | ] 31 | ) 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![ios](https://img.shields.io/badge/iOS-13-green) 2 | ![tv](https://img.shields.io/badge/tvOS-13-green) 3 | ![watchOS](https://img.shields.io/badge/iOS-6-green) 4 | ![mac](https://img.shields.io/badge/macOS-10.15-green) 5 | 6 | # Lorem 7 | 8 | Introducing Lorem, a placeholder generator library for iOS to help you rapidly prototype, build and test your iOS applications. 9 | 10 | ![Lorem sample](https://github.com/thirdfort/Lorem/blob/main/Demo/Resources/lorem.png?raw=true) 11 | 12 | By leveraging Swift generics we're also able to provide a simple, consistent API to make it easier to discover and even find all references when you're ready to remove your placeholder data. 13 | 14 | ```swift 15 | // When used in a context where a simple String is required 16 | Lorem.title // return String 17 | 18 | // But if we use the same code inside a SwiftUI View 19 | var body: some View { 20 | Lorem.title // returns Text 21 | } 22 | ``` 23 | 24 | ## Why? 25 | 26 | Lorem placeholder content is extremely useful when prototyping or even while building your apps while live data is unavailable or just not feasible to access yet. 27 | 28 | Its also incredibly useful when running both manual and automation test suites, as it allows for a more controlled and/or varied set of values to be tested, revealing layout and other issues that may have been missed or difficult to reproduce otherwise. 29 | 30 | Lastly, Lorem data is more clearly _placeholder_ data, which can help stakeholders and other team members better identify where live-data is yet to be implemented. 31 | 32 | ## Features 33 | 34 | Lorem supports various placeholder APIs, including: 35 | 36 | - Strings 37 | - Dates 38 | - URLs 39 | - Images 40 | - SwiftUI View's 41 | 42 | > While most features are supported across all platforms and version, some (like `AsyncImage`) are only available in supported environments. 43 | 44 | In addition to text and images, Lorem also provides useful APIs for working with other types, including `Color`: 45 | 46 | ![Lorem sample](https://github.com/thirdfort/Lorem/blob/main/Demo/Resources/colors.png?raw=true) 47 | 48 | Most APIs also have multiple convenience features to improve the experience where applicable: 49 | 50 | ```swift 51 | // Format dates 52 | Lorem.date(.formatted("HH:mm")) 53 | Lorem.date(.styled(time: .shortened)) 54 | 55 | // 3 to 5 words 56 | Lorem.title(3...5) 57 | 58 | // returns the same grayscale image every time 59 | Lorem.image(source: .seed(0), grayscale: true) 60 | ``` 61 | 62 | ## Usage 63 | 64 | The most basic usage can be achieved using simple `String`: 65 | 66 | ```swift 67 | Lorem.word 68 | Lorem.sentence 69 | Lorem.paragraph 70 | Lorem.title 71 | Lorem.name 72 | Lorem.url 73 | Lomem.email 74 | Lorem.date 75 | ``` 76 | 77 | Since Lorem supports Swift Generics, you can also use it in more contexts: 78 | 79 | ```swift 80 | let url: URL = Lorem.url 81 | let date: Date = Lorem.date 82 | ``` 83 | 84 | Which also means all of the APIs are also available conveniently in SwiftUI 85 | 86 | ```swift 87 | Lorem.title // Text 88 | Lorem.color // Color 89 | Lorem.image // Image 90 | ``` 91 | 92 | Primitives are also available which allows for usage in more scenarios, including UIKit: 93 | 94 | ```swift 95 | Lorem.url // URL 96 | Lorem.date // Date 97 | Lorem.color // Color, UIColor, NSColor 98 | Lorem.image // Image, UIImage, NSImage 99 | ``` 100 | 101 | ## Advanced 102 | 103 | Lorem provides access to its underlying placeholder data primitives, as well as a reusable composer that simplifies text generation. This enables you to easily create custom Lorem placeholders for content where the library doesn't quite meet your needs. 104 | 105 | ```swift 106 | let keywords = Lorem.Composer( 107 | Lorem.word, 108 | countRange: 5...15, 109 | separator: ", ", 110 | terminator: "" 111 | ) 112 | 113 | // tempora, fugit, sit, molestias, suscipit, voluptate, et, numquam, et, voluptatem, et 114 | ``` 115 | 116 | Additionally, Lorem provides convenient access to its data sources, so you can build placeholders with the same data used to build the API. 117 | 118 | ```swift 119 | Lorem.Data.words 120 | Lorem.Data.firstNames 121 | Lorem.Data.lastNames 122 | Lorem.Data.siteDomains 123 | Lorem.Data.emailDomains 124 | // etc 125 | ``` 126 | 127 | ## Installation 128 | 129 | You can install manually (by copying the files in the `Sources` directory) or using Swift Package Manager (**preferred**) 130 | 131 | To install using Swift Package Manager, add this to the `dependencies` section of your `Package.swift` file: 132 | 133 | `.package(url: "https://github.com/Thirdfort/Lorem.git", .upToNextMinor(from: "1.0.0"))` -------------------------------------------------------------------------------- /Sources/Lorem/Lorem.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | /// Represents a namespace for placeholder content 4 | public struct Lorem: RawRepresentable { 5 | public let rawValue: String 6 | public init(rawValue: String) { 7 | self.rawValue = rawValue 8 | } 9 | } 10 | 11 | /// Provides SwiftUI support 12 | extension Lorem: View where Content == Text { 13 | public var body: some View { 14 | Text(rawValue) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/Lorem/Resources/symbols-1.txt: -------------------------------------------------------------------------------- 1 | 0.circle.fill 2 | 0.circle 3 | 0.square.fill 4 | 0.square 5 | 00.circle.fill 6 | 00.circle 7 | 00.square.fill 8 | 00.square 9 | 01.circle.fill 10 | 01.circle 11 | 01.square.fill 12 | 01.square 13 | 02.circle.fill 14 | 02.circle 15 | 02.square.fill 16 | 02.square 17 | 03.circle.fill 18 | 03.circle 19 | 03.square.fill 20 | 03.square 21 | 04.circle.fill 22 | 04.circle 23 | 04.square.fill 24 | 04.square 25 | 05.circle.fill 26 | 05.circle 27 | 05.square.fill 28 | 05.square 29 | 06.circle.fill 30 | 06.circle 31 | 06.square.fill 32 | 06.square 33 | 07.circle.fill 34 | 07.circle 35 | 07.square.fill 36 | 07.square 37 | 08.circle.fill 38 | 08.circle 39 | 08.square.fill 40 | 08.square 41 | 09.circle.fill 42 | 09.circle 43 | 09.square.fill 44 | 09.square 45 | 1.circle.fill 46 | 1.circle 47 | 1.magnifyingglass 48 | 1.square.fill 49 | 1.square 50 | 10.circle.fill 51 | 10.circle 52 | 10.square.fill 53 | 10.square 54 | 11.circle.fill 55 | 11.circle 56 | 11.square.fill 57 | 11.square 58 | 12.circle.fill 59 | 12.circle 60 | 12.square.fill 61 | 12.square 62 | 13.circle.fill 63 | 13.circle 64 | 13.square.fill 65 | 13.square 66 | 14.circle.fill 67 | 14.circle 68 | 14.square.fill 69 | 14.square 70 | 15.circle.fill 71 | 15.circle 72 | 15.square.fill 73 | 15.square 74 | 16.circle.fill 75 | 16.circle 76 | 16.square.fill 77 | 16.square 78 | 17.circle.fill 79 | 17.circle 80 | 17.square.fill 81 | 17.square 82 | 18.circle.fill 83 | 18.circle 84 | 18.square.fill 85 | 18.square 86 | 19.circle.fill 87 | 19.circle 88 | 19.square.fill 89 | 19.square 90 | 2.circle.fill 91 | 2.circle 92 | 2.square.fill 93 | 2.square 94 | 20.circle.fill 95 | 20.circle 96 | 20.square.fill 97 | 20.square 98 | 21.circle.fill 99 | 21.circle 100 | 21.square.fill 101 | 21.square 102 | 22.circle.fill 103 | 22.circle 104 | 22.square.fill 105 | 22.square 106 | 23.circle.fill 107 | 23.circle 108 | 23.square.fill 109 | 23.square 110 | 24.circle.fill 111 | 24.circle 112 | 24.square.fill 113 | 24.square 114 | 25.circle.fill 115 | 25.circle 116 | 25.square.fill 117 | 25.square 118 | 26.circle.fill 119 | 26.circle 120 | 26.square.fill 121 | 26.square 122 | 27.circle.fill 123 | 27.circle 124 | 27.square.fill 125 | 27.square 126 | 28.circle.fill 127 | 28.circle 128 | 28.square.fill 129 | 28.square 130 | 29.circle.fill 131 | 29.circle 132 | 29.square.fill 133 | 29.square 134 | 3.circle.fill 135 | 3.circle 136 | 3.square.fill 137 | 3.square 138 | 30.circle.fill 139 | 30.circle 140 | 30.square.fill 141 | 30.square 142 | 31.circle.fill 143 | 31.circle 144 | 31.square.fill 145 | 31.square 146 | 32.circle.fill 147 | 32.circle 148 | 32.square.fill 149 | 32.square 150 | 33.circle.fill 151 | 33.circle 152 | 33.square.fill 153 | 33.square 154 | 34.circle.fill 155 | 34.circle 156 | 34.square.fill 157 | 34.square 158 | 35.circle.fill 159 | 35.circle 160 | 35.square.fill 161 | 35.square 162 | 36.circle.fill 163 | 36.circle 164 | 36.square.fill 165 | 36.square 166 | 37.circle.fill 167 | 37.circle 168 | 37.square.fill 169 | 37.square 170 | 38.circle.fill 171 | 38.circle 172 | 38.square.fill 173 | 38.square 174 | 39.circle.fill 175 | 39.circle 176 | 39.square.fill 177 | 39.square 178 | 4.alt.circle.fill 179 | 4.alt.circle 180 | 4.alt.square.fill 181 | 4.alt.square 182 | 4.circle.fill 183 | 4.circle 184 | 4.square.fill 185 | 4.square 186 | 40.circle.fill 187 | 40.circle 188 | 40.square.fill 189 | 40.square 190 | 41.circle.fill 191 | 41.circle 192 | 41.square.fill 193 | 41.square 194 | 42.circle.fill 195 | 42.circle 196 | 42.square.fill 197 | 42.square 198 | 43.circle.fill 199 | 43.circle 200 | 43.square.fill 201 | 43.square 202 | 44.circle.fill 203 | 44.circle 204 | 44.square.fill 205 | 44.square 206 | 45.circle.fill 207 | 45.circle 208 | 45.square.fill 209 | 45.square 210 | 46.circle.fill 211 | 46.circle 212 | 46.square.fill 213 | 46.square 214 | 47.circle.fill 215 | 47.circle 216 | 47.square.fill 217 | 47.square 218 | 48.circle.fill 219 | 48.circle 220 | 48.square.fill 221 | 48.square 222 | 49.circle.fill 223 | 49.circle 224 | 49.square.fill 225 | 49.square 226 | 5.circle.fill 227 | 5.circle 228 | 5.square.fill 229 | 5.square 230 | 50.circle.fill 231 | 50.circle 232 | 50.square.fill 233 | 50.square 234 | 6.alt.circle.fill 235 | 6.alt.circle 236 | 6.alt.square.fill 237 | 6.alt.square 238 | 6.circle.fill 239 | 6.circle 240 | 6.square.fill 241 | 6.square 242 | 7.circle.fill 243 | 7.circle 244 | 7.square.fill 245 | 7.square 246 | 8.circle.fill 247 | 8.circle 248 | 8.square.fill 249 | 8.square 250 | 9.alt.circle.fill 251 | 9.alt.circle 252 | 9.alt.square.fill 253 | 9.alt.square 254 | 9.circle.fill 255 | 9.circle 256 | 9.square.fill 257 | 9.square 258 | a.circle.fill 259 | a.circle 260 | a.square.fill 261 | a.square 262 | a 263 | airplane 264 | airplayaudio 265 | airplayvideo 266 | alarm.fill 267 | alarm 268 | alt 269 | ant.circle.fill 270 | ant.circle 271 | ant.fill 272 | ant 273 | antenna.radiowaves.left.and.right 274 | app.badge.fill 275 | app.badge 276 | app.fill 277 | app.gift.fill 278 | app.gift 279 | app 280 | archivebox.fill 281 | archivebox 282 | arkit 283 | arrow.2.circlepath.circle.fill 284 | arrow.2.circlepath.circle 285 | arrow.2.circlepath 286 | arrow.2.squarepath 287 | arrow.3.trianglepath 288 | arrow.branch 289 | arrow.clockwise.circle.fill 290 | arrow.clockwise.circle 291 | arrow.clockwise.icloud.fill 292 | arrow.clockwise.icloud 293 | arrow.clockwise 294 | arrow.counterclockwise.circle.fill 295 | arrow.counterclockwise.circle 296 | arrow.counterclockwise.icloud.fill 297 | arrow.counterclockwise.icloud 298 | arrow.counterclockwise 299 | arrow.down.circle.fill 300 | arrow.down.circle 301 | arrow.down.doc.fill 302 | arrow.down.doc 303 | arrow.down.left.circle.fill 304 | arrow.down.left.circle 305 | arrow.down.left.square.fill 306 | arrow.down.left.square 307 | arrow.down.left.video.fill 308 | arrow.down.left.video 309 | arrow.down.left 310 | arrow.down.right.and.arrow.up.left 311 | arrow.down.right.circle.fill 312 | arrow.down.right.circle 313 | arrow.down.right.square.fill 314 | arrow.down.right.square 315 | arrow.down.right 316 | arrow.down.square.fill 317 | arrow.down.square 318 | arrow.down.to.line.alt 319 | arrow.down.to.line 320 | arrow.down 321 | arrow.left.and.right.circle.fill 322 | arrow.left.and.right.circle 323 | arrow.left.and.right.square.fill 324 | arrow.left.and.right.square 325 | arrow.left.and.right 326 | arrow.left.circle.fill 327 | arrow.left.circle 328 | arrow.left.square.fill 329 | arrow.left.square 330 | arrow.left.to.line.alt 331 | arrow.left.to.line 332 | arrow.left 333 | arrow.merge 334 | arrow.right.arrow.left.circle.fill 335 | arrow.right.arrow.left.circle 336 | arrow.right.arrow.left.square.fill 337 | arrow.right.arrow.left.square 338 | arrow.right.arrow.left 339 | arrow.right.circle.fill 340 | arrow.right.circle 341 | arrow.right.square.fill 342 | arrow.right.square 343 | arrow.right.to.line.alt 344 | arrow.right.to.line 345 | arrow.right 346 | arrow.swap 347 | arrow.turn.down.left 348 | arrow.turn.down.right 349 | arrow.turn.left.down 350 | arrow.turn.left.up 351 | arrow.turn.right.down 352 | arrow.turn.right.up 353 | arrow.turn.up.left 354 | arrow.turn.up.right 355 | arrow.up.and.down.circle.fill 356 | arrow.up.and.down.circle 357 | arrow.up.and.down.square.fill 358 | arrow.up.and.down.square 359 | arrow.up.and.down 360 | arrow.up.arrow.down.circle.fill 361 | arrow.up.arrow.down.circle 362 | arrow.up.arrow.down.square.fill 363 | arrow.up.arrow.down.square 364 | arrow.up.arrow.down 365 | arrow.up.bin.fill 366 | arrow.up.bin 367 | arrow.up.circle.fill 368 | arrow.up.circle 369 | arrow.up.doc.fill 370 | arrow.up.doc 371 | arrow.up.left.and.arrow.down.right 372 | arrow.up.left.circle.fill 373 | arrow.up.left.circle 374 | arrow.up.left.square.fill 375 | arrow.up.left.square 376 | arrow.up.left 377 | arrow.up.right.circle.fill 378 | arrow.up.right.diamond.fill 379 | arrow.up.right.diamond 380 | arrow.up.right.square.fill 381 | arrow.up.right.square 382 | arrow.up.right.video.fill 383 | arrow.up.right.video 384 | arrow.up.right 385 | arrow.up.square.fill 386 | arrow.up.square 387 | arrow.up.to.line.alt 388 | arrow.up.to.line 389 | arrow.up 390 | arrow.upright.circle 391 | arrow.uturn.down.circle.fill 392 | arrow.uturn.down.circle 393 | arrow.uturn.down.square.fill 394 | arrow.uturn.down.square 395 | arrow.uturn.down 396 | arrow.uturn.left.circle.fill 397 | arrow.uturn.left.circle 398 | arrow.uturn.left.square.fill 399 | arrow.uturn.left.square 400 | arrow.uturn.left 401 | arrow.uturn.right.circle.fill 402 | arrow.uturn.right.circle 403 | arrow.uturn.right.square.fill 404 | arrow.uturn.right.square 405 | arrow.uturn.right 406 | arrow.uturn.up.circle.fill 407 | arrow.uturn.up.circle 408 | arrow.uturn.up.square.fill 409 | arrow.uturn.up.square 410 | arrow.uturn.up 411 | arrowshape.turn.up.left.2.fill 412 | arrowshape.turn.up.left.2 413 | arrowshape.turn.up.left.circle.fill 414 | arrowshape.turn.up.left.circle 415 | arrowshape.turn.up.left.fill 416 | arrowshape.turn.up.left 417 | arrowshape.turn.up.right.circle.fill 418 | arrowshape.turn.up.right.circle 419 | arrowshape.turn.up.right.fill 420 | arrowshape.turn.up.right 421 | arrowtriangle.down.circle.fill 422 | arrowtriangle.down.circle 423 | arrowtriangle.down.fill 424 | arrowtriangle.down.square.fill 425 | arrowtriangle.down.square 426 | arrowtriangle.down 427 | arrowtriangle.left.circle.fill 428 | arrowtriangle.left.circle 429 | arrowtriangle.left.fill 430 | arrowtriangle.left.square.fill 431 | arrowtriangle.left.square 432 | arrowtriangle.left 433 | arrowtriangle.right.circle.fill 434 | arrowtriangle.right.circle 435 | arrowtriangle.right.fill 436 | arrowtriangle.right.square.fill 437 | arrowtriangle.right.square 438 | arrowtriangle.right 439 | arrowtriangle.up.circle.fill 440 | arrowtriangle.up.circle 441 | arrowtriangle.up.fill 442 | arrowtriangle.up.square.fill 443 | arrowtriangle.up.square 444 | arrowtriangle.up 445 | asterisk.circle.fill 446 | asterisk.circle 447 | at.badge.minus 448 | at.badge.plus 449 | at 450 | australsign.circle.fill 451 | australsign.circle 452 | australsign.square.fill 453 | australsign.square 454 | b.circle.fill 455 | b.circle 456 | b.square.fill 457 | b.square 458 | backward.end.alt.fill 459 | backward.end.alt 460 | backward.end.fill 461 | backward.end 462 | backward.fill 463 | backward 464 | badge.plus.radiowaves.right 465 | bag.badge.minus.fill 466 | bag.badge.minus 467 | bag.badge.plus.fill 468 | bag.badge.plus 469 | bag.fill 470 | bag 471 | bahtsign.circle.fill 472 | bahtsign.circle 473 | bahtsign.square.fill 474 | bahtsign.square 475 | bandage.fill 476 | bandage 477 | barcode.viewfinder 478 | barcode 479 | battery.0 480 | battery.100 481 | battery.25 482 | bed.double.fill 483 | bed.double 484 | bell.circle.fill 485 | bell.circle 486 | bell.fill 487 | bell.slash.fill 488 | bell.slash 489 | bell 490 | bin.xmark.fill 491 | bin.xmark 492 | bitcoinsign.circle.fill 493 | bitcoinsign.circle 494 | bitcoinsign.square.fill 495 | bitcoinsign.square 496 | bold.italic.underline 497 | bold.underline 498 | bold 499 | bolt.badge.a.fill 500 | bolt.badge.a 501 | bolt.circle.fill 502 | bolt.circle 503 | bolt.fill 504 | bolt.horizontal.circle.fill 505 | bolt.horizontal.circle 506 | bolt.horizontal.fill 507 | bolt.horizontal.icloud.fill 508 | bolt.horizontal.icloud 509 | bolt.horizontal 510 | bolt.slash.fill 511 | bolt.slash 512 | bolt 513 | book.circle.fill 514 | book.circle 515 | book.fill 516 | book 517 | bookmark.fill 518 | bookmark 519 | briefcase.fill 520 | briefcase 521 | bubble.left.and.bubble.right.fill 522 | bubble.left.and.bubble.right 523 | bubble.left.fill 524 | bubble.left 525 | bubble.middle.bottom.fill 526 | bubble.middle.bottom 527 | bubble.middle.top.fill 528 | bubble.middle.top 529 | bubble.right.fill 530 | bubble.right 531 | burn 532 | burst.fill 533 | burst 534 | c.circle.fill 535 | c.circle 536 | c.square.fill 537 | c.square 538 | calendar.badge.minus 539 | calendar.badge.plus 540 | calendar.circle.fill 541 | calendar.circle 542 | calendar 543 | camera.circle.fill 544 | camera.circle 545 | camera.fill 546 | camera.on.rectangle.fill 547 | camera.on.rectangle 548 | camera.rotate.fill 549 | camera.rotate 550 | camera.viewfinder 551 | camera 552 | capslock.fill 553 | capslock 554 | capsule.fill 555 | capsule 556 | captions.bubble.fill 557 | captions.bubble 558 | car.fill 559 | cart.badge.minus.fill 560 | cart.badge.minus 561 | cart.badge.plus.fill 562 | cart.badge.plus 563 | cart.fill 564 | cart 565 | cedisign.circle.fill 566 | cedisign.circle 567 | cedisign.square.fill 568 | cedisign.square 569 | centsign.circle.fill 570 | centsign.circle 571 | centsign.square.fill 572 | centsign.square 573 | chart.bar.fill 574 | chart.bar 575 | chart.pie.fill 576 | chart.pie 577 | checkmark.circle.fill 578 | checkmark.circle 579 | checkmark.rectangle.fill 580 | checkmark.rectangle 581 | checkmark.seal.fill 582 | checkmark.seal 583 | checkmark.shield.fill 584 | checkmark.shield 585 | checkmark.square.fill 586 | checkmark.square 587 | checkmark 588 | chevron.compact.down 589 | chevron.compact.left 590 | chevron.compact.right 591 | chevron.compact.up 592 | chevron.down.circle.fill 593 | chevron.down.circle 594 | chevron.down.square.fill 595 | chevron.down.square 596 | chevron.down 597 | chevron.left.2 598 | chevron.left.circle.fill 599 | chevron.left.circle 600 | chevron.left.slash.chevron.right 601 | chevron.left.square.fill 602 | chevron.left.square 603 | chevron.left 604 | chevron.right.2 605 | chevron.right.circle.fill 606 | chevron.right.circle 607 | chevron.right.square.fill 608 | chevron.right.square 609 | chevron.right 610 | chevron.up.chevron.down 611 | chevron.up.circle.fill 612 | chevron.up.circle 613 | chevron.up.square.fill 614 | chevron.up.square 615 | chevron.up 616 | circle.bottomthird.split 617 | circle.fill 618 | circle.grid.3x3.fill 619 | circle.grid.3x3 620 | circle.grid.hex.fill 621 | circle.grid.hex 622 | circle.lefthalf.fill 623 | circle.righthalf.fill 624 | circle 625 | clear.fill 626 | clear 627 | clock.fill 628 | clock 629 | cloud.bolt.fill 630 | cloud.bolt.rain.fill 631 | cloud.bolt.rain 632 | cloud.bolt 633 | cloud.drizzle.fill 634 | cloud.drizzle 635 | cloud.fill 636 | cloud.fog.fill 637 | cloud.fog 638 | cloud.hail.fill 639 | cloud.hail 640 | cloud.heavyrain.fill 641 | cloud.heavyrain 642 | cloud.moon.bolt.fill 643 | cloud.moon.bolt 644 | cloud.moon.fill 645 | cloud.moon.rain.fill 646 | cloud.moon.rain 647 | cloud.moon 648 | cloud.rain.fill 649 | cloud.rain 650 | cloud.sleet.fill 651 | cloud.sleet 652 | cloud.snow.fill 653 | cloud.snow 654 | cloud.sun.bolt.fill 655 | cloud.sun.bolt 656 | cloud.sun.fill 657 | cloud.sun.rain.fill 658 | cloud.sun.rain 659 | cloud.sun 660 | cloud 661 | coloncurrencysign.circle.fill 662 | coloncurrencysign.circle 663 | coloncurrencysign.square.fill 664 | coloncurrencysign.square 665 | command 666 | control 667 | creditcard.fill 668 | creditcard 669 | crop.rotate 670 | crop 671 | cruzeirosign.circle.fill 672 | cruzeirosign.circle 673 | cruzeirosign.square.fill 674 | cruzeirosign.square 675 | cube.box.fill 676 | cube.box 677 | cube.fill 678 | cube 679 | cursor.rays 680 | d.circle.fill 681 | d.circle 682 | d.square.fill 683 | d.square 684 | decrease.quotelevel 685 | delete.left.fill 686 | delete.left 687 | delete.right.fill 688 | delete.right 689 | desktopcomputer 690 | dial.fill 691 | dial 692 | divide.circle.fill 693 | divide.circle 694 | divide.square.fill 695 | divide.square 696 | divide 697 | doc.append 698 | doc.circle.fill 699 | doc.circle 700 | doc.fill 701 | doc.on.clipboard.fill 702 | doc.on.clipboard 703 | doc.on.doc.fill 704 | doc.on.doc 705 | doc.plaintext 706 | doc.richtext 707 | doc.text.fill 708 | doc.text.magnifyingglass 709 | doc.text.viewfinder 710 | doc.text 711 | doc 712 | dollarsign.circle.fill 713 | dollarsign.circle 714 | dollarsign.square.fill 715 | dollarsign.square 716 | dongsign.circle.fill 717 | dongsign.circle 718 | dongsign.square.fill 719 | dongsign.square 720 | dot.circle.fill 721 | dot.circle 722 | dot.radiowaves.left.and.right 723 | dot.radiowaves.right 724 | dot.square.fill 725 | dot.square 726 | drop.triangle.fill 727 | drop.triangle 728 | e.circle.fill 729 | e.circle 730 | e.square.fill 731 | e.square 732 | ear 733 | eject.fill 734 | eject 735 | ellipses.bubble.fill 736 | ellipses.bubble 737 | ellipsis.circle.fill 738 | ellipsis.circle 739 | ellipsis 740 | envelope.badge.fill 741 | envelope.badge 742 | envelope.circle.fill 743 | envelope.circle 744 | envelope.fill 745 | envelope.open.fill 746 | envelope.open 747 | envelope 748 | equal.circle.fill 749 | equal.circle 750 | equal.square.fill 751 | equal.square 752 | equal 753 | escape 754 | eurosign.circle.fill 755 | eurosign.circle 756 | eurosign.square.fill 757 | eurosign.square 758 | exclamationmark.bubble.fill 759 | exclamationmark.bubble 760 | exclamationmark.circle.fill 761 | exclamationmark.circle 762 | exclamationmark.icloud.fill 763 | exclamationmark.icloud 764 | exclamationmark.octagon.fill 765 | exclamationmark.octagon 766 | exclamationmark.shield.fill 767 | exclamationmark.shield 768 | exclamationmark.square.fill 769 | exclamationmark.square 770 | exclamationmark.triangle.fill 771 | exclamationmark.triangle 772 | exclamationmark 773 | eye.fill 774 | eye.slash.fill 775 | eye.slash 776 | eye 777 | eyedropper.full 778 | eyedropper.halffull 779 | eyedropper 780 | eyeglasses 781 | f.circle.fill 782 | f.circle 783 | f.cursive.circle.fill 784 | f.cursive.circle 785 | f.cursive 786 | f.square.fill 787 | f.square 788 | faceid 789 | film.fill 790 | film 791 | flag.circle.fill 792 | flag.circle 793 | flag.fill 794 | flag.slash.fill 795 | flag.slash 796 | flag 797 | flame.fill 798 | flame 799 | florinsign.circle.fill 800 | florinsign.circle 801 | florinsign.square.fill 802 | florinsign.square 803 | flowchart.fill 804 | flowchart 805 | folder.badge.minus.fill 806 | folder.badge.minus 807 | folder.badge.person.crop.fill 808 | folder.badge.person.crop 809 | folder.badge.plus.fill 810 | folder.badge.plus 811 | folder.circle.fill 812 | folder.circle 813 | folder.fill 814 | folder 815 | forward.end.alt.fill 816 | forward.end.alt 817 | forward.end.fill 818 | forward.end 819 | forward.fill 820 | forward 821 | francsign.circle.fill 822 | francsign.circle 823 | francsign.square.fill 824 | francsign.square 825 | function 826 | fx 827 | g.circle.fill 828 | g.circle 829 | g.square.fill 830 | g.square 831 | gamecontroller.fill 832 | gamecontroller 833 | gauge.badge.minus 834 | gauge.badge.plus 835 | gauge 836 | gear 837 | gift.fill 838 | gift 839 | globe 840 | gobackward.10.ar 841 | gobackward.10.hi 842 | gobackward.10 843 | gobackward.15.ar 844 | gobackward.15.hi 845 | gobackward.15 846 | gobackward.30.ar 847 | gobackward.30.hi 848 | gobackward.30 849 | gobackward.45.ar 850 | gobackward.45.hi 851 | gobackward.45 852 | gobackward.60.ar 853 | gobackward.60.hi 854 | gobackward.60 855 | gobackward.75.ar 856 | gobackward.75.hi 857 | gobackward.75 858 | gobackward.90.ar 859 | gobackward.90.hi 860 | gobackward.90 861 | gobackward.minus 862 | gobackward 863 | goforward.10.ar 864 | goforward.10.hi 865 | goforward.10 866 | goforward.15.ar 867 | goforward.15.hi 868 | goforward.15 869 | goforward.30.ar 870 | goforward.30.hi 871 | goforward.30 872 | goforward.45.ar 873 | goforward.45.hi 874 | goforward.45 875 | goforward.60.ar 876 | goforward.60.hi 877 | goforward.60 878 | goforward.75.ar 879 | goforward.75.hi 880 | goforward.75 881 | goforward.90.ar 882 | goforward.90.hi 883 | goforward.90 884 | goforward.plus 885 | goforward 886 | greaterthan.circle.fill 887 | greaterthan.circle 888 | greaterthan.square.fill 889 | greaterthan.square 890 | greaterthan 891 | grid.circle.fill 892 | grid.circle 893 | grid 894 | guaranisign.circle.fill 895 | guaranisign.circle 896 | guaranisign.square.fill 897 | guaranisign.square 898 | guitars 899 | h.circle.fill 900 | h.circle 901 | h.square.fill 902 | h.square 903 | hammer.fill 904 | hammer 905 | hand.draw.fill 906 | hand.draw 907 | hand.point.left.fill 908 | hand.point.left 909 | hand.point.right.fill 910 | hand.point.right 911 | hand.raised.fill 912 | hand.raised.slash.fill 913 | hand.raised.slash 914 | hand.raised 915 | hand.thumbsdown.fill 916 | hand.thumbsdown 917 | hand.thumbsup.fill 918 | hand.thumbsup 919 | hare.fill 920 | hare 921 | headphones 922 | heart.circle.fill 923 | heart.circle 924 | heart.fill 925 | heart.slash.circle.fill 926 | heart.slash.circle 927 | heart.slash.fill 928 | heart.slash 929 | heart 930 | helm 931 | hexagon.fill 932 | hexagon 933 | hifispeaker.fill 934 | hifispeaker 935 | hourglass.bottomhalf.fill 936 | hourglass.tophalf.fill 937 | hourglass 938 | house.fill 939 | house 940 | hryvniasign.circle.fill 941 | hryvniasign.circle 942 | hryvniasign.square.fill 943 | hryvniasign.square 944 | hurricane 945 | i.circle.fill 946 | i.circle 947 | i.square.fill 948 | i.square 949 | icloud.and.arrow.down.fill 950 | icloud.and.arrow.down 951 | icloud.and.arrow.up.fill 952 | icloud.and.arrow.up 953 | icloud.circle.fill 954 | icloud.circle 955 | icloud.fill 956 | icloud.slash.fill 957 | icloud.slash 958 | icloud 959 | increase.quotelevel 960 | indianrupeesign.circle.fill 961 | indianrupeesign.circle 962 | indianrupeesign.square.fill 963 | indianrupeesign.square 964 | info.circle.fill 965 | info.circle 966 | info 967 | italic 968 | j.circle.fill 969 | j.circle 970 | j.square.fill 971 | j.square 972 | k.circle.fill 973 | k.circle 974 | k.square.fill 975 | k.square 976 | keyboard.chevron.compact.down 977 | keyboard 978 | kipsign.circle.fill 979 | kipsign.circle 980 | kipsign.square.fill 981 | kipsign.square 982 | l.circle.fill 983 | l.circle 984 | l.square.fill 985 | l.square 986 | largecircle.fill.circle 987 | larisign.circle.fill 988 | larisign.circle 989 | larisign.square.fill 990 | larisign.square 991 | lasso 992 | leaf.arrow.circlepath 993 | lessthan.circle.fill 994 | lessthan.circle 995 | lessthan.square.fill 996 | lessthan.square 997 | lessthan 998 | light.max 999 | light.min 1000 | lightbulb.fill 1001 | lightbulb.slash.fill 1002 | lightbulb.slash 1003 | lightbulb 1004 | line.horizontal.3.decrease.circle.fill 1005 | line.horizontal.3.decrease.circle 1006 | line.horizontal.3.decrease 1007 | line.horizontal.3 1008 | link.circle.fill 1009 | link.circle 1010 | link.icloud.fill 1011 | link.icloud 1012 | link 1013 | lirasign.circle.fill 1014 | lirasign.circle 1015 | lirasign.square.fill 1016 | lirasign.square 1017 | list.bullet.below.rectangle 1018 | list.bullet.indent 1019 | list.bullet 1020 | list.dash 1021 | list.number.rtl 1022 | list.number 1023 | livephoto.play 1024 | livephoto.slash 1025 | livephoto 1026 | location.circle.fill 1027 | location.circle 1028 | location.fill 1029 | location.north.fill 1030 | location.north.line.fill 1031 | location.north.line 1032 | location.north 1033 | location.slash.fill 1034 | location.slash 1035 | location 1036 | lock.circle.fill 1037 | lock.circle 1038 | lock.fill 1039 | lock.icloud.fill 1040 | lock.icloud 1041 | lock.open.fill 1042 | lock.open 1043 | lock.rotation.open 1044 | lock.rotation 1045 | lock.shield.fill 1046 | lock.shield 1047 | lock.slash.fill 1048 | lock.slash 1049 | lock 1050 | m.circle.fill 1051 | m.circle 1052 | m.square.fill 1053 | m.square 1054 | macwindow 1055 | magnifyingglass.circle.fill 1056 | magnifyingglass.circle 1057 | magnifyingglass 1058 | manatsign.circle.fill 1059 | manatsign.circle 1060 | manatsign.square.fill 1061 | manatsign.square 1062 | map.fill 1063 | map 1064 | mappin.and.ellipse 1065 | mappin.slash 1066 | mappin 1067 | memories.badge.minus 1068 | memories.badge.plus 1069 | memories 1070 | message.circle.fill 1071 | message.circle 1072 | message.fill 1073 | message 1074 | metronome 1075 | mic.circle.fill 1076 | mic.circle 1077 | mic.fill 1078 | mic.slash.fill 1079 | mic.slash 1080 | mic 1081 | millsign.circle.fill 1082 | millsign.circle 1083 | millsign.square.fill 1084 | millsign.square 1085 | minus.circle.fill 1086 | minus.circle 1087 | minus.magnifyingglass 1088 | minus.rectangle.fill 1089 | minus.rectangle 1090 | minus.slash.plus 1091 | minus.square.fill 1092 | minus.square 1093 | minus 1094 | moon.circle.fill 1095 | moon.circle 1096 | moon.fill 1097 | moon.stars.fill 1098 | moon.stars 1099 | moon.zzz.fill 1100 | moon.zzz 1101 | moon 1102 | multiply.circle.fill 1103 | multiply.circle 1104 | multiply.square.fill 1105 | multiply.square 1106 | multiply 1107 | music.house.fill 1108 | music.house 1109 | music.mic 1110 | music.note.list 1111 | music.note 1112 | n.circle.fill 1113 | n.circle 1114 | n.square.fill 1115 | n.square 1116 | nairasign.circle.fill 1117 | nairasign.circle 1118 | nairasign.square.fill 1119 | nairasign.square 1120 | nosign 1121 | number.circle.fill 1122 | number.circle 1123 | number.square.fill 1124 | number.square 1125 | number 1126 | o.circle.fill 1127 | o.circle 1128 | o.square.fill 1129 | o.square 1130 | option 1131 | p.circle.fill 1132 | p.circle 1133 | p.square.fill 1134 | p.square 1135 | paintbrush.fill 1136 | paintbrush 1137 | pano.fill 1138 | pano 1139 | paperclip 1140 | paperplane.fill 1141 | paperplane 1142 | paragraph 1143 | pause.circle.fill 1144 | pause.circle 1145 | pause.fill 1146 | pause.rectangle.fill 1147 | pause.rectangle 1148 | pause 1149 | pencil.and.ellipsis.rectangle 1150 | pencil.and.outline 1151 | pencil.circle.fill 1152 | pencil.circle 1153 | pencil.slash 1154 | pencil.tip.crop.circle.badge.minus 1155 | pencil.tip.crop.circle.badge.plus 1156 | pencil.tip.crop.circle 1157 | pencil.tip 1158 | pencil 1159 | percent 1160 | person.2.square.stack.fill 1161 | person.2.square.stack 1162 | person.3.fill 1163 | person.3 1164 | person.and.person.fill 1165 | person.and.person 1166 | person.badge.minus.fill 1167 | person.badge.minus 1168 | person.badge.plus.fill 1169 | person.badge.plus 1170 | person.circle.fill 1171 | person.circle 1172 | person.crop.circle.badge.checkmark.fill 1173 | person.crop.circle.badge.checkmark 1174 | person.crop.circle.badge.exclam.fill 1175 | person.crop.circle.badge.exclam 1176 | person.crop.circle.badge.minus.fill 1177 | person.crop.circle.badge.minus 1178 | person.crop.circle.badge.plus.fill 1179 | person.crop.circle.badge.plus 1180 | person.crop.circle.badge.xmark.fill 1181 | person.crop.circle.badge.xmark 1182 | person.crop.circle.fill 1183 | person.crop.circle 1184 | person.crop.rectangle.fill 1185 | person.crop.rectangle 1186 | person.crop.square.fill 1187 | person.crop.square 1188 | person.fill 1189 | person.icloud.fill 1190 | person.icloud 1191 | person 1192 | personalhotspot 1193 | perspective 1194 | pesetasign.circle.fill 1195 | pesetasign.circle 1196 | pesetasign.square.fill 1197 | pesetasign.square 1198 | pesosign.circle.fill 1199 | pesosign.circle 1200 | pesosign.square.fill 1201 | pesosign.square 1202 | phone.arrow.down.left.fill 1203 | phone.arrow.down.left 1204 | phone.arrow.right.fill 1205 | phone.arrow.right 1206 | phone.arrow.up.right.fill 1207 | phone.arrow.up.right 1208 | phone.badge.plus.fill 1209 | phone.badge.plus 1210 | phone.circle.fill 1211 | phone.circle 1212 | phone.down.circle.fill 1213 | phone.down.circle 1214 | phone.down.fill 1215 | phone.down 1216 | phone.fill 1217 | phone 1218 | photo.fill 1219 | photo.on.rectangle.fill 1220 | photo.on.rectangle 1221 | photo 1222 | pin.fill 1223 | pin.slash.fill 1224 | pin.slash 1225 | pin 1226 | play.circle.fill 1227 | play.circle 1228 | play.fill 1229 | play.rectangle.fill 1230 | play.rectangle 1231 | play 1232 | playpause.fill 1233 | playpause 1234 | plus.app.fill 1235 | plus.app 1236 | plus.bubble.fill 1237 | plus.bubble 1238 | plus.circle.fill 1239 | plus.circle 1240 | plus.magnifyingglass 1241 | plus.rectangle.fill 1242 | plus.rectangle.on.rectangle.fill 1243 | plus.rectangle.on.rectangle 1244 | plus.rectangle 1245 | plus.slash.minus 1246 | plus.square.fill 1247 | plus.square.on.square.fill 1248 | plus.square.on.square 1249 | plus.square 1250 | plus 1251 | plusminus.circle.fill 1252 | plusminus.circle 1253 | plusminus 1254 | power 1255 | printer.fill 1256 | printer 1257 | projective 1258 | purchased.circle.fill 1259 | purchased.circle 1260 | purchased 1261 | q.circle.fill 1262 | q.circle 1263 | q.square.fill 1264 | q.square 1265 | qrcode.viewfinder 1266 | qrcode 1267 | questionmark.circle.fill 1268 | questionmark.circle 1269 | questionmark.diamond.fill 1270 | questionmark.diamond 1271 | questionmark.square.fill 1272 | questionmark.square 1273 | questionmark.video.fill.rtl 1274 | questionmark.video.fill 1275 | questionmark.video.rtl 1276 | questionmark.video 1277 | questionmark 1278 | quote.bubble.fill 1279 | quote.bubble 1280 | r.circle.fill 1281 | r.circle 1282 | r.square.fill 1283 | r.square 1284 | radiowaves.left 1285 | radiowaves.right 1286 | rays 1287 | realtimetext 1288 | recordingtape 1289 | rectangle.3.offgrid.fill 1290 | rectangle.3.offgrid 1291 | rectangle.and.arrow.up.right.and.arrow.down.left.slash 1292 | rectangle.and.arrow.up.right.and.arrow.down.left 1293 | rectangle.and.paperclip 1294 | rectangle.badge.checkmark.fill 1295 | rectangle.badge.checkmark 1296 | rectangle.badge.xmark.fill 1297 | rectangle.badge.xmark 1298 | rectangle.compress.vertical 1299 | rectangle.dock 1300 | rectangle.expand.vertical 1301 | rectangle.fill 1302 | rectangle.grid.1x2.fill 1303 | rectangle.grid.1x2 1304 | rectangle.grid.2x2.fill 1305 | rectangle.grid.2x2 1306 | rectangle.grid.3x2.fill 1307 | rectangle.grid.3x2 1308 | rectangle.on.rectangle.angled.fill 1309 | rectangle.on.rectangle.angled 1310 | rectangle.on.rectangle.fill 1311 | rectangle.on.rectangle 1312 | rectangle.split.3x1.fill 1313 | rectangle.split.3x1 1314 | rectangle.split.3x3.fill 1315 | rectangle.split.3x3 1316 | rectangle.stack.badge.minus.fill 1317 | rectangle.stack.badge.minus 1318 | rectangle.stack.badge.person.crop 1319 | rectangle.stack.badge.plus.fill 1320 | rectangle.stack.badge.plus 1321 | rectangle.stack.fill.badge.person.crop 1322 | rectangle.stack.fill 1323 | rectangle.stack.person.crop.fill 1324 | rectangle.stack.person.crop 1325 | rectangle.stack 1326 | rectangle 1327 | repeat.1 1328 | repeat 1329 | return 1330 | rhombus.fill 1331 | rhombus 1332 | ring.circle.fill 1333 | ring.circle 1334 | rosette 1335 | rotate.left.fill 1336 | rotate.left 1337 | rotate.right.fill 1338 | rotate.right 1339 | rublesign.circle.fill 1340 | rublesign.circle 1341 | rublesign.square.fill 1342 | rublesign.square 1343 | rupeesign.circle.fill 1344 | rupeesign.circle 1345 | rupeesign.square.fill 1346 | rupeesign.square 1347 | s.circle.fill 1348 | s.circle 1349 | s.square.fill 1350 | s.square 1351 | safari.fill 1352 | safari 1353 | scissors 1354 | scope 1355 | scribble 1356 | selection.pin.in.out 1357 | sheqelsign.circle.fill 1358 | sheqelsign.circle 1359 | sheqelsign.square.fill 1360 | sheqelsign.square 1361 | shield.fill 1362 | shield.lefthalf.fill 1363 | shield.slash.fill 1364 | shield.slash 1365 | shield 1366 | shift.fill 1367 | shift 1368 | shuffle 1369 | sidebar.left 1370 | sidebar.right 1371 | signature 1372 | skew 1373 | slash.circle.fill 1374 | slash.circle 1375 | slider.horizontal.3 1376 | slider.horizontal.below.rectangle 1377 | slowmo 1378 | smiley.fill 1379 | smiley 1380 | smoke.fill 1381 | smoke 1382 | snow 1383 | sparkles 1384 | speaker.zzz.fill.rtl 1385 | speaker.zzz.rt 1386 | speedometer 1387 | sportscourt.fill 1388 | sportscourt 1389 | square.and.arrow.down.fill 1390 | square.and.arrow.down.on.square.fill 1391 | square.and.arrow.down.on.square 1392 | square.and.arrow.down 1393 | square.and.arrow.up.fill 1394 | square.and.arrow.up.on.square.fill 1395 | square.and.arrow.up.on.square 1396 | square.and.arrow.up 1397 | square.and.line.vertical.and.square.fill 1398 | square.and.line.vertical.and.square 1399 | square.and.pencil 1400 | square.fill.and.line.vertical.and.square 1401 | square.fill.and.line.vertical.square.fill 1402 | square.fill 1403 | square.grid.2x2.fill 1404 | square.grid.2x2 1405 | square.grid.3x2.fill 1406 | square.grid.3x2 1407 | square.grid.4x3.fill 1408 | square.lefthalf.fill 1409 | square.on.circle.fill 1410 | square.on.circle 1411 | square.on.square.fill 1412 | square.on.square 1413 | square.righthalf.fill 1414 | square.split.1x2.fill 1415 | square.split.1x2 1416 | square.split.2x1.fill 1417 | square.split.2x1 1418 | square.split.2x2.fill 1419 | square.split.2x2 1420 | square.stack.3d.down.dottedline 1421 | square.stack.3d.down.right.fill 1422 | square.stack.3d.down.right 1423 | square.stack.3d.up.fill 1424 | square.stack.3d.up.slash.fill 1425 | square.stack.3d.up.slash 1426 | square.stack.3d.up 1427 | square.stack.fill 1428 | square.stack 1429 | square 1430 | squares.below.rectangle 1431 | star.circle.fill 1432 | star.circle 1433 | star.fill 1434 | star.lefthalf.fill 1435 | star.slash.fill 1436 | star.slash 1437 | star 1438 | staroflife.fill 1439 | staroflife 1440 | sterlingsign.circle.fill 1441 | sterlingsign.circle 1442 | sterlingsign.square.fill 1443 | sterlingsign.square 1444 | stop.fill 1445 | stop 1446 | stopwatch.fill 1447 | stopwatch 1448 | strikethrough 1449 | suit.club.fill 1450 | suit.club 1451 | suit.diamond.fill 1452 | suit.diamond 1453 | suit.heart.fill 1454 | suit.heart 1455 | suit.spade.fill 1456 | suit.spade 1457 | sum 1458 | sun.dust.fill 1459 | sun.dust 1460 | sun.haze.fill 1461 | sun.haze 1462 | sun.max.fill 1463 | sun.max 1464 | sun.min.fill 1465 | sun.min 1466 | sunrise.fill 1467 | sunrise 1468 | sunset.fill 1469 | sunset 1470 | t.bubble.fill 1471 | t.bubble 1472 | t.circle.fill 1473 | t.circle 1474 | t.square.fill 1475 | t.square 1476 | table.badge.more.fill 1477 | table.badge.more 1478 | table.fill 1479 | table 1480 | tag.circle.fill 1481 | tag.circle 1482 | tag.fill 1483 | tag 1484 | teletype 1485 | tengesign.circle.fill 1486 | tengesign.circle 1487 | tengesign.square.fill 1488 | tengesign.square 1489 | text.aligncenter 1490 | text.alignleft 1491 | text.alignright 1492 | text.append 1493 | text.badge.checkmark 1494 | text.badge.minus 1495 | text.badge.plus 1496 | text.badge.star 1497 | text.badge.xmark 1498 | text.bubble.fill 1499 | text.bubble 1500 | text.chevron.left 1501 | text.chevron.right 1502 | text.cursor 1503 | text.insert 1504 | text.justify 1505 | text.justifyleft 1506 | text.justifyright 1507 | text.quote 1508 | textbox 1509 | textformat.123 1510 | textformat.abc.dottedunderline 1511 | textformat.abc 1512 | textformat.alt 1513 | textformat.size 1514 | textformat.subscript 1515 | textformat.superscript 1516 | textformat 1517 | thermometer.snowflake 1518 | thermometer.sun 1519 | thermometer 1520 | timelapse 1521 | timer 1522 | tornado 1523 | tortoise.fill 1524 | tortoise 1525 | tram.fill 1526 | trash.circle.fill 1527 | trash.circle 1528 | trash.fill 1529 | trash.slash.fill 1530 | trash.slash 1531 | trash 1532 | tray.2.fill 1533 | tray.2 1534 | tray.and.arrow.down.fill 1535 | tray.and.arrow.down 1536 | tray.and.arrow.up.fill 1537 | tray.and.arrow.up 1538 | tray.fill 1539 | tray.full.fill 1540 | tray.full 1541 | tray 1542 | triangle.fill 1543 | triangle.lefthalf.fill 1544 | triangle.righthalf.fill 1545 | triangle 1546 | tropicalstorm 1547 | tugriksign.circle.fill 1548 | tugriksign.circle 1549 | tugriksign.square.fill 1550 | tugriksign.square 1551 | tuningfork 1552 | turkishlirasign.circle.fill 1553 | turkishlirasign.circle 1554 | turkishlirasign.square.fill 1555 | turkishlirasign.square 1556 | tv.circle.fill 1557 | tv.circle 1558 | tv.fill 1559 | tv.music.note.fill 1560 | tv.music.note 1561 | tv 1562 | u.circle.fill 1563 | u.circle 1564 | u.square.fill 1565 | u.square 1566 | uiwindow.split.2x1 1567 | umbrella.fill 1568 | umbrella 1569 | underline 1570 | v.circle.fill 1571 | v.circle 1572 | v.square.fill 1573 | v.square 1574 | video.badge.plus.fill 1575 | video.badge.plus 1576 | video.circle.fill 1577 | video.circle 1578 | video.fill 1579 | video.slash.fill 1580 | video.slash 1581 | video 1582 | view.2d 1583 | view.3d 1584 | viewfinder.circle.fill 1585 | viewfinder.circle 1586 | viewfinder 1587 | volume.1.fill 1588 | volume.1 1589 | volume.2.fill 1590 | volume.2 1591 | volume.3.fill 1592 | volume.3 1593 | volume.fill 1594 | volume.slash.fill.rtl 1595 | volume.slash.fill 1596 | volume.slash.rtl 1597 | volume.slash 1598 | volume.zzz.fill 1599 | volume.zzz 1600 | volume 1601 | w.circle.fill 1602 | w.circle 1603 | w.square.fill 1604 | w.square 1605 | wand.and.rays.inverse 1606 | wand.and.rays 1607 | wand.and.stars.inverse 1608 | wand.and.stars 1609 | waveform.circle.fill 1610 | waveform.circle 1611 | waveform.path.badge.minus 1612 | waveform.path.badge.plus 1613 | waveform.path.ecg 1614 | waveform.path 1615 | waveform 1616 | wifi.exclamationmark 1617 | wifi.slash 1618 | wifi 1619 | wind.snow 1620 | wind 1621 | wonsign.circle.fill 1622 | wonsign.circle 1623 | wonsign.square.fill 1624 | wonsign.square 1625 | wrench.fill 1626 | wrench 1627 | x.circle.fill 1628 | x.circle 1629 | x.square.fill 1630 | x.square 1631 | x.squareroot 1632 | xmark.circle.fill 1633 | xmark.circle 1634 | xmark.icloud.fill 1635 | xmark.icloud 1636 | xmark.octagon.fill 1637 | xmark.octagon 1638 | xmark.rectangle.fill 1639 | xmark.rectangle 1640 | xmark.seal.fill 1641 | xmark.seal 1642 | xmark.shield.fill 1643 | xmark.shield 1644 | xmark.square.fill 1645 | xmark.square 1646 | xmark 1647 | y.circle.fill 1648 | y.circle 1649 | y.square.fill 1650 | y.square 1651 | yensign.circle.fill 1652 | yensign.circle 1653 | yensign.square.fill 1654 | yensign.square 1655 | z.circle.fill 1656 | z.circle 1657 | z.square.fill 1658 | z.square 1659 | zzz 1660 | -------------------------------------------------------------------------------- /Sources/Lorem/Resources/symbols-2.txt: -------------------------------------------------------------------------------- 1 | square.and.arrow.up 2 | square.and.arrow.up.fill 3 | square.and.arrow.down 4 | square.and.arrow.down.fill 5 | square.and.arrow.up.on.square 6 | square.and.arrow.up.on.square.fill 7 | square.and.arrow.down.on.square 8 | square.and.arrow.down.on.square.fill 9 | pencil 10 | pencil.circle 11 | pencil.circle.fill 12 | pencil.slash 13 | square.and.pencil 14 | rectangle.and.pencil.and.ellipsis 15 | scribble 16 | scribble.variable 17 | highlighter 18 | pencil.and.outline 19 | pencil.tip 20 | pencil.tip.crop.circle 21 | pencil.tip.crop.circle.badge.plus 22 | pencil.tip.crop.circle.badge.minus 23 | pencil.tip.crop.circle.badge.arrow.forward 24 | lasso 25 | lasso.sparkles 26 | trash 27 | trash.fill 28 | trash.circle 29 | trash.circle.fill 30 | trash.slash 31 | trash.slash.fill 32 | folder 33 | folder.fill 34 | folder.circle 35 | folder.circle.fill 36 | folder.badge.plus 37 | folder.fill.badge.plus 38 | folder.badge.minus 39 | folder.fill.badge.minus 40 | folder.badge.questionmark 41 | folder.fill.badge.questionmark 42 | folder.badge.person.crop 43 | folder.fill.badge.person.crop 44 | square.grid.3x1.folder.badge.plus 45 | square.grid.3x1.folder.fill.badge.plus 46 | folder.badge.gear 47 | folder.fill.badge.gear 48 | plus.rectangle.on.folder 49 | plus.rectangle.fill.on.folder.fill 50 | questionmark.folder 51 | questionmark.folder.fill 52 | paperplane 53 | paperplane.fill 54 | paperplane.circle 55 | paperplane.circle.fill 56 | tray 57 | tray.fill 58 | tray.circle 59 | tray.circle.fill 60 | tray.and.arrow.up 61 | tray.and.arrow.up.fill 62 | tray.and.arrow.down 63 | tray.and.arrow.down.fill 64 | tray.2 65 | tray.2.fill 66 | tray.full 67 | tray.full.fill 68 | externaldrive 69 | externaldrive.fill 70 | externaldrive.badge.plus 71 | externaldrive.fill.badge.plus 72 | externaldrive.badge.minus 73 | externaldrive.fill.badge.minus 74 | externaldrive.badge.checkmark 75 | externaldrive.fill.badge.checkmark 76 | externaldrive.badge.xmark 77 | externaldrive.fill.badge.xmark 78 | externaldrive.badge.person.crop 79 | externaldrive.fill.badge.person.crop 80 | externaldrive.badge.icloud 81 | externaldrive.fill.badge.icloud 82 | externaldrive.badge.wifi 83 | externaldrive.fill.badge.wifi 84 | externaldrive.badge.timemachine 85 | externaldrive.fill.badge.timemachine 86 | internaldrive 87 | internaldrive.fill 88 | opticaldiscdrive 89 | opticaldiscdrive.fill 90 | externaldrive.connected.to.line.below 91 | externaldrive.connected.to.line.below.fill 92 | archivebox 93 | archivebox.fill 94 | archivebox.circle 95 | archivebox.circle.fill 96 | xmark.bin 97 | xmark.bin.fill 98 | xmark.bin.circle 99 | xmark.bin.circle.fill 100 | arrow.up.bin 101 | arrow.up.bin.fill 102 | doc 103 | doc.fill 104 | doc.circle 105 | doc.circle.fill 106 | doc.badge.plus 107 | doc.fill.badge.plus 108 | doc.badge.gearshape 109 | doc.badge.gearshape.fill 110 | doc.badge.ellipsis 111 | doc.fill.badge.ellipsis 112 | lock.doc 113 | lock.doc.fill 114 | arrow.up.doc 115 | arrow.up.doc.fill 116 | arrow.down.doc 117 | arrow.down.doc.fill 118 | doc.text 119 | doc.text.fill 120 | doc.zipper 121 | doc.on.doc 122 | doc.on.doc.fill 123 | doc.on.clipboard 124 | arrow.right.doc.on.clipboard 125 | arrow.up.doc.on.clipboard 126 | arrow.triangle.2.circlepath.doc.on.clipboard 127 | doc.on.clipboard.fill 128 | doc.richtext 129 | doc.richtext.fill 130 | doc.plaintext 131 | doc.plaintext.fill 132 | doc.append 133 | doc.append.fill 134 | doc.text.below.ecg 135 | doc.text.below.ecg.fill 136 | chart.bar.doc.horizontal 137 | chart.bar.doc.horizontal.fill 138 | list.bullet.rectangle 139 | terminal 140 | terminal.fill 141 | doc.text.magnifyingglass 142 | note 143 | note.text 144 | note.text.badge.plus 145 | calendar 146 | calendar.circle 147 | calendar.circle.fill 148 | calendar.badge.plus 149 | calendar.badge.minus 150 | calendar.badge.clock 151 | calendar.badge.exclamationmark 152 | arrowshape.turn.up.left 153 | arrowshape.turn.up.left.fill 154 | arrowshape.turn.up.left.circle 155 | arrowshape.turn.up.left.circle.fill 156 | arrowshape.turn.up.backward 157 | arrowshape.turn.up.backward.fill 158 | arrowshape.turn.up.backward.circle 159 | arrowshape.turn.up.backward.circle.fill 160 | arrowshape.turn.up.right 161 | arrowshape.turn.up.right.fill 162 | arrowshape.turn.up.right.circle 163 | arrowshape.turn.up.right.circle.fill 164 | arrowshape.turn.up.forward 165 | arrowshape.turn.up.forward.fill 166 | arrowshape.turn.up.forward.circle 167 | arrowshape.turn.up.forward.circle.fill 168 | arrowshape.turn.up.left.2 169 | arrowshape.turn.up.left.2.fill 170 | arrowshape.turn.up.left.2.circle 171 | arrowshape.turn.up.left.2.circle.fill 172 | arrowshape.turn.up.backward.2 173 | arrowshape.turn.up.backward.2.fill 174 | arrowshape.turn.up.backward.2.circle 175 | arrowshape.turn.up.backward.2.circle.fill 176 | arrowshape.zigzag.right 177 | arrowshape.zigzag.right.fill 178 | arrowshape.zigzag.forward 179 | arrowshape.zigzag.forward.fill 180 | arrowshape.bounce.right 181 | arrowshape.bounce.right.fill 182 | arrowshape.bounce.forward 183 | arrowshape.bounce.forward.fill 184 | book 185 | book.fill 186 | book.circle 187 | book.circle.fill 188 | newspaper 189 | newspaper.fill 190 | books.vertical 191 | books.vertical.fill 192 | book.closed 193 | book.closed.fill 194 | character.book.closed 195 | character.book.closed.fill 196 | text.book.closed 197 | text.book.closed.fill 198 | greetingcard 199 | greetingcard.fill 200 | bookmark 201 | bookmark.fill 202 | bookmark.circle 203 | bookmark.circle.fill 204 | bookmark.slash 205 | bookmark.slash.fill 206 | rosette 207 | graduationcap 208 | graduationcap.fill 209 | ticket 210 | ticket.fill 211 | paperclip 212 | paperclip.circle 213 | paperclip.circle.fill 214 | paperclip.badge.ellipsis 215 | rectangle.and.paperclip 216 | rectangle.dashed.and.paperclip 217 | link 218 | link.circle 219 | link.circle.fill 220 | link.badge.plus 221 | personalhotspot 222 | lineweight 223 | person 224 | person.fill 225 | person.fill.turn.right 226 | person.fill.turn.down 227 | person.fill.turn.left 228 | person.fill.checkmark 229 | person.fill.xmark 230 | person.fill.questionmark 231 | person.circle 232 | person.circle.fill 233 | person.badge.plus 234 | person.fill.badge.plus 235 | person.badge.minus 236 | person.fill.badge.minus 237 | person.and.arrow.left.and.arrow.right 238 | person.fill.and.arrow.left.and.arrow.right 239 | person.2 240 | person.2.fill 241 | person.2.circle 242 | person.2.circle.fill 243 | person.3 244 | person.3.fill 245 | person.crop.circle 246 | person.crop.circle.fill 247 | person.crop.circle.badge.plus 248 | person.crop.circle.fill.badge.plus 249 | person.crop.circle.badge.minus 250 | person.crop.circle.fill.badge.minus 251 | person.crop.circle.badge.checkmark 252 | person.crop.circle.fill.badge.checkmark 253 | person.crop.circle.badge.xmark 254 | person.crop.circle.fill.badge.xmark 255 | person.crop.circle.badge.questionmark 256 | person.crop.circle.fill.badge.questionmark 257 | person.crop.circle.badge.exclamationmark 258 | person.crop.circle.fill.badge.exclamationmark 259 | person.crop.square 260 | person.crop.square.fill 261 | rectangle.stack.person.crop 262 | rectangle.stack.person.crop.fill 263 | person.2.square.stack 264 | person.2.square.stack.fill 265 | person.crop.square.fill.and.at.rectangle 266 | square.and.at.rectangle 267 | command 268 | command.circle 269 | command.circle.fill 270 | command.square 271 | command.square.fill 272 | option 273 | alt 274 | delete.right 275 | delete.right.fill 276 | clear 277 | clear.fill 278 | delete.left 279 | delete.left.fill 280 | shift 281 | shift.fill 282 | capslock 283 | capslock.fill 284 | escape 285 | restart 286 | restart.circle 287 | sleep 288 | wake 289 | power 290 | togglepower 291 | poweron 292 | poweroff 293 | powersleep 294 | directcurrent 295 | dot.arrowtriangles.up.right.down.left.circle 296 | globe 297 | network 298 | sun.min 299 | sun.min.fill 300 | sun.max 301 | sun.max.fill 302 | sunrise 303 | sunrise.fill 304 | sunset 305 | sunset.fill 306 | sun.dust 307 | sun.dust.fill 308 | sun.haze 309 | sun.haze.fill 310 | moon 311 | moon.fill 312 | moon.circle 313 | moon.circle.fill 314 | zzz 315 | moon.zzz 316 | moon.zzz.fill 317 | sparkle 318 | sparkles 319 | moon.stars 320 | moon.stars.fill 321 | cloud 322 | cloud.fill 323 | cloud.drizzle 324 | cloud.drizzle.fill 325 | cloud.rain 326 | cloud.rain.fill 327 | cloud.heavyrain 328 | cloud.heavyrain.fill 329 | cloud.fog 330 | cloud.fog.fill 331 | cloud.hail 332 | cloud.hail.fill 333 | cloud.snow 334 | cloud.snow.fill 335 | cloud.sleet 336 | cloud.sleet.fill 337 | cloud.bolt 338 | cloud.bolt.fill 339 | cloud.bolt.rain 340 | cloud.bolt.rain.fill 341 | cloud.sun 342 | cloud.sun.fill 343 | cloud.sun.rain 344 | cloud.sun.rain.fill 345 | cloud.sun.bolt 346 | cloud.sun.bolt.fill 347 | cloud.moon 348 | cloud.moon.fill 349 | cloud.moon.rain 350 | cloud.moon.rain.fill 351 | cloud.moon.bolt 352 | cloud.moon.bolt.fill 353 | smoke 354 | smoke.fill 355 | wind 356 | wind.snow 357 | snow 358 | tornado 359 | tropicalstorm 360 | hurricane 361 | thermometer.sun 362 | thermometer.sun.fill 363 | thermometer.snowflake 364 | thermometer 365 | aqi.low 366 | aqi.medium 367 | aqi.high 368 | umbrella 369 | umbrella.fill 370 | flame 371 | flame.fill 372 | light.min 373 | light.max 374 | rays 375 | slowmo 376 | timelapse 377 | cursorarrow.rays 378 | cursorarrow 379 | cursorarrow.square 380 | cursorarrow.and.square.on.square.dashed 381 | cursorarrow.click 382 | cursorarrow.click.2 383 | contextualmenu.and.cursorarrow 384 | filemenu.and.cursorarrow 385 | filemenu.and.selection 386 | dot.circle.and.cursorarrow 387 | cursorarrow.motionlines 388 | cursorarrow.motionlines.click 389 | cursorarrow.click.badge.clock 390 | keyboard 391 | keyboard.badge.ellipsis 392 | keyboard.chevron.compact.down 393 | keyboard.chevron.compact.left 394 | keyboard.onehanded.left 395 | keyboard.onehanded.right 396 | rectangle.3.offgrid 397 | rectangle.3.offgrid.fill 398 | square.grid.3x2 399 | square.grid.3x2.fill 400 | rectangle.grid.3x2 401 | rectangle.grid.3x2.fill 402 | square.grid.2x2 403 | square.grid.2x2.fill 404 | rectangle.grid.2x2 405 | rectangle.grid.2x2.fill 406 | square.grid.3x1.below.line.grid.1x2 407 | square.grid.3x1.fill.below.line.grid.1x2 408 | square.grid.4x3.fill 409 | rectangle.grid.1x2 410 | rectangle.grid.1x2.fill 411 | circle.grid.2x2 412 | circle.grid.2x2.fill 413 | circle.grid.3x3 414 | circle.grid.3x3.fill 415 | square.grid.3x3 416 | square.grid.3x3.fill 417 | square.grid.3x3.topleft.fill 418 | square.grid.3x3.topmiddle.fill 419 | square.grid.3x3.topright.fill 420 | square.grid.3x3.middleleft.fill 421 | square.grid.3x3.middle.fill 422 | square.grid.3x3.middleright.fill 423 | square.grid.3x3.bottomleft.fill 424 | square.grid.3x3.bottommiddle.fill 425 | square.grid.3x3.bottomright.fill 426 | circles.hexagongrid 427 | circles.hexagongrid.fill 428 | circles.hexagonpath 429 | circles.hexagonpath.fill 430 | circle.grid.cross 431 | circle.grid.cross.fill 432 | circle.grid.cross.left.fill 433 | circle.grid.cross.up.fill 434 | circle.grid.cross.right.fill 435 | circle.grid.cross.down.fill 436 | seal 437 | seal.fill 438 | checkmark.seal 439 | checkmark.seal.fill 440 | xmark.seal 441 | xmark.seal.fill 442 | exclamationmark.triangle 443 | exclamationmark.triangle.fill 444 | drop 445 | drop.fill 446 | drop.triangle 447 | drop.triangle.fill 448 | play 449 | play.fill 450 | play.circle 451 | play.circle.fill 452 | play.rectangle 453 | play.rectangle.fill 454 | play.slash 455 | play.slash.fill 456 | pause 457 | pause.fill 458 | pause.circle 459 | pause.circle.fill 460 | pause.rectangle 461 | pause.rectangle.fill 462 | stop 463 | stop.fill 464 | stop.circle 465 | stop.circle.fill 466 | record.circle 467 | record.circle.fill 468 | playpause 469 | playpause.fill 470 | backward 471 | backward.fill 472 | forward 473 | forward.fill 474 | backward.end 475 | backward.end.fill 476 | forward.end 477 | forward.end.fill 478 | backward.end.alt 479 | backward.end.alt.fill 480 | forward.end.alt 481 | forward.end.alt.fill 482 | backward.frame 483 | backward.frame.fill 484 | forward.frame 485 | forward.frame.fill 486 | eject 487 | eject.fill 488 | eject.circle 489 | eject.circle.fill 490 | mount 491 | mount.fill 492 | memories 493 | memories.badge.plus 494 | memories.badge.minus 495 | shuffle 496 | shuffle.circle 497 | shuffle.circle.fill 498 | repeat 499 | repeat.circle 500 | repeat.circle.fill 501 | repeat.1 502 | repeat.1.circle 503 | repeat.1.circle.fill 504 | infinity 505 | infinity.circle 506 | infinity.circle.fill 507 | megaphone 508 | megaphone.fill 509 | speaker 510 | speaker.fill 511 | speaker.slash 512 | speaker.slash.fill 513 | speaker.slash.circle 514 | speaker.slash.circle.fill 515 | speaker.zzz 516 | speaker.zzz.fill 517 | speaker.wave.1 518 | speaker.wave.1.fill 519 | speaker.wave.2 520 | speaker.wave.2.fill 521 | speaker.wave.2.circle 522 | speaker.wave.2.circle.fill 523 | speaker.wave.3 524 | speaker.wave.3.fill 525 | badge.plus.radiowaves.right 526 | badge.plus.radiowaves.forward 527 | music.note 528 | music.note.list 529 | music.quarternote.3 530 | music.mic 531 | arrow.rectanglepath 532 | goforward 533 | gobackward 534 | goforward.10 535 | gobackward.10 536 | goforward.15 537 | gobackward.15 538 | goforward.30 539 | gobackward.30 540 | goforward.45 541 | gobackward.45 542 | goforward.60 543 | gobackward.60 544 | goforward.75 545 | gobackward.75 546 | goforward.90 547 | gobackward.90 548 | goforward.plus 549 | gobackward.minus 550 | swift 551 | magnifyingglass 552 | magnifyingglass.circle 553 | magnifyingglass.circle.fill 554 | plus.magnifyingglass 555 | minus.magnifyingglass 556 | 1.magnifyingglass 557 | arrow.up.left.and.down.right.magnifyingglass 558 | text.magnifyingglass 559 | loupe 560 | mic 561 | mic.fill 562 | mic.circle 563 | mic.circle.fill 564 | mic.slash 565 | mic.slash.fill 566 | line.diagonal 567 | line.diagonal.arrow 568 | circle 569 | circle.fill 570 | circle.lefthalf.fill 571 | circle.righthalf.fill 572 | circle.bottomhalf.fill 573 | circle.tophalf.fill 574 | largecircle.fill.circle 575 | smallcircle.fill.circle 576 | smallcircle.fill.circle.fill 577 | circle.dashed 578 | circle.dashed.inset.fill 579 | circlebadge 580 | circlebadge.fill 581 | circlebadge.2 582 | circlebadge.2.fill 583 | smallcircle.circle 584 | smallcircle.circle.fill 585 | target 586 | capsule 587 | capsule.fill 588 | capsule.portrait 589 | capsule.portrait.fill 590 | oval 591 | oval.fill 592 | oval.portrait 593 | oval.portrait.fill 594 | placeholdertext.fill 595 | square 596 | square.fill 597 | square.lefthalf.fill 598 | square.righthalf.fill 599 | square.bottomhalf.fill 600 | square.tophalf.fill 601 | square.slash 602 | square.slash.fill 603 | dot.square 604 | dot.square.fill 605 | circle.square 606 | circle.fill.square.fill 607 | square.dashed 608 | square.dashed.inset.fill 609 | questionmark.square.dashed 610 | squareshape 611 | squareshape.fill 612 | squareshape.dashed.squareshape 613 | squareshape.squareshape.dashed 614 | dot.squareshape 615 | dot.squareshape.fill 616 | app 617 | app.fill 618 | rectangle 619 | rectangle.fill 620 | rectangle.slash 621 | rectangle.slash.fill 622 | rectangle.portrait 623 | rectangle.portrait.fill 624 | triangle 625 | triangle.fill 626 | triangle.lefthalf.fill 627 | triangle.righthalf.fill 628 | diamond 629 | diamond.fill 630 | octagon 631 | octagon.fill 632 | hexagon 633 | hexagon.fill 634 | suit.heart 635 | suit.heart.fill 636 | suit.club 637 | suit.club.fill 638 | suit.spade 639 | suit.spade.fill 640 | suit.diamond 641 | suit.diamond.fill 642 | heart 643 | heart.fill 644 | heart.circle 645 | heart.circle.fill 646 | heart.slash 647 | heart.slash.fill 648 | heart.slash.circle 649 | heart.slash.circle.fill 650 | heart.text.square 651 | heart.text.square.fill 652 | bolt.heart 653 | bolt.heart.fill 654 | arrow.up.heart 655 | arrow.up.heart.fill 656 | arrow.down.heart 657 | arrow.down.heart.fill 658 | arrow.clockwise.heart 659 | arrow.clockwise.heart.fill 660 | rhombus 661 | rhombus.fill 662 | star 663 | star.fill 664 | star.leadinghalf.fill 665 | star.circle 666 | star.circle.fill 667 | star.square 668 | star.square.fill 669 | star.slash 670 | star.slash.fill 671 | line.horizontal.star.fill.line.horizontal 672 | flag 673 | flag.fill 674 | flag.circle 675 | flag.circle.fill 676 | flag.slash 677 | flag.slash.fill 678 | flag.slash.circle 679 | flag.slash.circle.fill 680 | flag.badge.ellipsis 681 | flag.badge.ellipsis.fill 682 | location 683 | location.fill 684 | location.slash 685 | location.slash.fill 686 | location.north 687 | location.north.fill 688 | location.circle 689 | location.circle.fill 690 | location.north.line 691 | location.north.line.fill 692 | bell 693 | bell.fill 694 | bell.circle 695 | bell.circle.fill 696 | bell.slash 697 | bell.slash.fill 698 | bell.slash.circle 699 | bell.slash.circle.fill 700 | bell.badge 701 | bell.badge.fill 702 | tag 703 | tag.fill 704 | tag.circle 705 | tag.circle.fill 706 | tag.slash 707 | tag.slash.fill 708 | bolt 709 | bolt.fill 710 | bolt.circle 711 | bolt.circle.fill 712 | bolt.slash 713 | bolt.slash.fill 714 | bolt.slash.circle 715 | bolt.slash.circle.fill 716 | bolt.badge.a 717 | bolt.badge.a.fill 718 | bolt.horizontal 719 | bolt.horizontal.fill 720 | bolt.horizontal.circle 721 | bolt.horizontal.circle.fill 722 | eye 723 | eye.fill 724 | eye.circle 725 | eye.circle.fill 726 | eye.slash 727 | eye.slash.fill 728 | eyes 729 | eyes.inverse 730 | eyebrow 731 | nose 732 | nose.fill 733 | mustache 734 | mustache.fill 735 | mouth 736 | mouth.fill 737 | icloud 738 | icloud.fill 739 | icloud.circle 740 | icloud.circle.fill 741 | icloud.slash 742 | icloud.slash.fill 743 | exclamationmark.icloud 744 | exclamationmark.icloud.fill 745 | checkmark.icloud 746 | checkmark.icloud.fill 747 | xmark.icloud 748 | xmark.icloud.fill 749 | link.icloud 750 | link.icloud.fill 751 | bolt.horizontal.icloud 752 | bolt.horizontal.icloud.fill 753 | person.icloud 754 | person.icloud.fill 755 | lock.icloud 756 | lock.icloud.fill 757 | key.icloud 758 | key.icloud.fill 759 | arrow.clockwise.icloud 760 | arrow.clockwise.icloud.fill 761 | arrow.counterclockwise.icloud 762 | arrow.counterclockwise.icloud.fill 763 | icloud.and.arrow.down 764 | icloud.and.arrow.down.fill 765 | icloud.and.arrow.up 766 | icloud.and.arrow.up.fill 767 | flashlight.off.fill 768 | flashlight.on.fill 769 | camera 770 | camera.fill 771 | camera.circle 772 | camera.circle.fill 773 | camera.badge.ellipsis 774 | camera.fill.badge.ellipsis 775 | arrow.triangle.2.circlepath.camera 776 | arrow.triangle.2.circlepath.camera.fill 777 | camera.on.rectangle 778 | camera.on.rectangle.fill 779 | message 780 | message.fill 781 | message.circle 782 | message.circle.fill 783 | arrow.up.message 784 | arrow.up.message.fill 785 | plus.message 786 | plus.message.fill 787 | bubble.right 788 | bubble.right.fill 789 | bubble.left 790 | bubble.left.fill 791 | exclamationmark.bubble 792 | exclamationmark.bubble.fill 793 | quote.bubble 794 | quote.bubble.fill 795 | t.bubble 796 | t.bubble.fill 797 | text.bubble 798 | text.bubble.fill 799 | captions.bubble 800 | captions.bubble.fill 801 | plus.bubble 802 | plus.bubble.fill 803 | rectangle.3.offgrid.bubble.left 804 | rectangle.3.offgrid.bubble.left.fill 805 | ellipsis.bubble 806 | ellipsis.bubble.fill 807 | phone.bubble.left 808 | phone.bubble.left.fill 809 | video.bubble.left 810 | video.bubble.left.fill 811 | bubble.middle.bottom 812 | bubble.middle.bottom.fill 813 | bubble.middle.top 814 | bubble.middle.top.fill 815 | bubble.left.and.bubble.right 816 | bubble.left.and.bubble.right.fill 817 | phone 818 | phone.fill 819 | phone.circle 820 | phone.circle.fill 821 | phone.badge.plus 822 | phone.fill.badge.plus 823 | phone.connection 824 | phone.fill.connection 825 | phone.arrow.up.right 826 | phone.fill.arrow.up.right 827 | phone.arrow.down.left 828 | phone.fill.arrow.down.left 829 | phone.arrow.right 830 | phone.fill.arrow.right 831 | phone.down 832 | phone.down.fill 833 | phone.down.circle 834 | phone.down.circle.fill 835 | teletype 836 | teletype.circle 837 | teletype.circle.fill 838 | teletype.answer 839 | video 840 | video.fill 841 | video.circle 842 | video.circle.fill 843 | video.slash 844 | video.slash.fill 845 | video.badge.plus 846 | video.fill.badge.plus 847 | video.badge.checkmark 848 | video.fill.badge.checkmark 849 | arrow.up.right.video 850 | arrow.up.right.video.fill 851 | arrow.down.left.video 852 | arrow.down.left.video.fill 853 | questionmark.video 854 | questionmark.video.fill 855 | envelope 856 | envelope.fill 857 | envelope.circle 858 | envelope.circle.fill 859 | envelope.arrow.triangle.branch 860 | envelope.arrow.triangle.branch.fill 861 | envelope.open 862 | envelope.open.fill 863 | envelope.badge 864 | envelope.badge.fill 865 | envelope.badge.shield.leadinghalf.fill 866 | envelope.fill.badge.shield.trailinghalf.fill 867 | mail.stack 868 | mail.stack.fill 869 | mail 870 | mail.fill 871 | mail.and.text.magnifyingglass 872 | rectangle.and.text.magnifyingglass 873 | arrow.up.right.and.arrow.down.left.rectangle 874 | arrow.up.right.and.arrow.down.left.rectangle.fill 875 | gear 876 | gearshape 877 | gearshape.fill 878 | gearshape.2 879 | gearshape.2.fill 880 | signature 881 | line.3.crossed.swirl.circle 882 | line.3.crossed.swirl.circle.fill 883 | scissors 884 | scissors.badge.ellipsis 885 | ellipsis 886 | ellipsis.circle 887 | ellipsis.circle.fill 888 | ellipsis.rectangle 889 | ellipsis.rectangle.fill 890 | bag 891 | bag.fill 892 | bag.circle 893 | bag.circle.fill 894 | bag.badge.plus 895 | bag.fill.badge.plus 896 | bag.badge.minus 897 | bag.fill.badge.minus 898 | cart 899 | cart.fill 900 | cart.circle 901 | cart.circle.fill 902 | cart.badge.plus 903 | cart.fill.badge.plus 904 | cart.badge.minus 905 | cart.fill.badge.minus 906 | creditcard 907 | creditcard.fill 908 | creditcard.circle 909 | creditcard.circle.fill 910 | giftcard 911 | giftcard.fill 912 | wallet.pass 913 | wallet.pass.fill 914 | wand.and.rays 915 | wand.and.rays.inverse 916 | wand.and.stars 917 | wand.and.stars.inverse 918 | crop 919 | crop.rotate 920 | dial.min 921 | dial.min.fill 922 | dial.max 923 | dial.max.fill 924 | gyroscope 925 | nosign 926 | gauge 927 | gauge.badge.plus 928 | gauge.badge.minus 929 | speedometer 930 | barometer 931 | metronome 932 | metronome.fill 933 | amplifier 934 | die.face.1 935 | die.face.1.fill 936 | die.face.2 937 | die.face.2.fill 938 | die.face.3 939 | die.face.3.fill 940 | die.face.4 941 | die.face.4.fill 942 | die.face.5 943 | die.face.5.fill 944 | die.face.6 945 | die.face.6.fill 946 | square.grid.3x3.fill.square 947 | pianokeys 948 | pianokeys.inverse 949 | tuningfork 950 | paintbrush 951 | paintbrush.fill 952 | paintbrush.pointed 953 | paintbrush.pointed.fill 954 | bandage 955 | bandage.fill 956 | ruler 957 | ruler.fill 958 | level 959 | level.fill 960 | wrench 961 | wrench.fill 962 | hammer 963 | hammer.fill 964 | eyedropper 965 | eyedropper.halffull 966 | eyedropper.full 967 | wrench.and.screwdriver 968 | wrench.and.screwdriver.fill 969 | applescript 970 | applescript.fill 971 | scroll 972 | scroll.fill 973 | stethoscope 974 | printer 975 | printer.fill 976 | printer.fill.and.paper.fill 977 | printer.dotmatrix 978 | printer.dotmatrix.fill 979 | printer.dotmatrix.fill.and.paper.fill 980 | scanner 981 | scanner.fill 982 | faxmachine 983 | briefcase 984 | briefcase.fill 985 | case 986 | case.fill 987 | latch.2.case 988 | latch.2.case.fill 989 | cross.case 990 | cross.case.fill 991 | puzzlepiece 992 | puzzlepiece.fill 993 | homekit 994 | house 995 | house.fill 996 | house.circle 997 | house.circle.fill 998 | music.note.house 999 | music.note.house.fill 1000 | building.columns 1001 | building.columns.fill 1002 | square.split.bottomrightquarter 1003 | square.split.bottomrightquarter.fill 1004 | building 1005 | building.fill 1006 | building.2 1007 | building.2.fill 1008 | building.2.crop.circle 1009 | building.2.crop.circle.fill 1010 | lock 1011 | lock.fill 1012 | lock.circle 1013 | lock.circle.fill 1014 | lock.square 1015 | lock.square.fill 1016 | lock.square.stack 1017 | lock.square.stack.fill 1018 | lock.rectangle 1019 | lock.rectangle.fill 1020 | lock.rectangle.stack 1021 | lock.rectangle.stack.fill 1022 | lock.rectangle.on.rectangle 1023 | lock.rectangle.on.rectangle.fill 1024 | lock.shield 1025 | lock.shield.fill 1026 | lock.slash 1027 | lock.slash.fill 1028 | lock.open 1029 | lock.open.fill 1030 | lock.rotation 1031 | lock.rotation.open 1032 | key 1033 | key.fill 1034 | wifi 1035 | wifi.slash 1036 | wifi.exclamationmark 1037 | pin 1038 | pin.fill 1039 | pin.circle 1040 | pin.circle.fill 1041 | pin.slash 1042 | pin.slash.fill 1043 | mappin 1044 | mappin.circle 1045 | mappin.circle.fill 1046 | mappin.slash 1047 | mappin.and.ellipse 1048 | map 1049 | map.fill 1050 | safari 1051 | safari.fill 1052 | move.3d 1053 | scale.3d 1054 | rotate.3d 1055 | torus 1056 | rotate.left 1057 | rotate.left.fill 1058 | rotate.right 1059 | rotate.right.fill 1060 | selection.pin.in.out 1061 | timeline.selection 1062 | cpu 1063 | memorychip 1064 | opticaldisc 1065 | tv 1066 | tv.fill 1067 | tv.circle 1068 | tv.circle.fill 1069 | 4k.tv 1070 | 4k.tv.fill 1071 | tv.music.note 1072 | tv.music.note.fill 1073 | play.tv 1074 | play.tv.fill 1075 | photo.tv 1076 | tv.and.hifispeaker.fill 1077 | tv.and.mediabox 1078 | display 1079 | display.trianglebadge.exclamationmark 1080 | display.2 1081 | desktopcomputer 1082 | pc 1083 | macpro.gen1 1084 | macpro.gen2 1085 | macpro.gen2.fill 1086 | macpro.gen3 1087 | server.rack 1088 | xserve 1089 | macpro.gen3.server 1090 | laptopcomputer 1091 | laptopcomputer.and.iphone 1092 | macmini 1093 | macmini.fill 1094 | airport.express 1095 | airport.extreme.tower 1096 | airport.extreme 1097 | ipod 1098 | flipphone 1099 | candybarphone 1100 | iphone.homebutton 1101 | iphone.homebutton.landscape 1102 | iphone.homebutton.radiowaves.left.and.right 1103 | iphone.homebutton.slash 1104 | iphone 1105 | iphone.landscape 1106 | iphone.radiowaves.left.and.right 1107 | iphone.slash 1108 | iphone.homebutton.badge.play 1109 | iphone.badge.play 1110 | ipad.homebutton.badge.play 1111 | ipad.badge.play 1112 | ipad.homebutton.landscape.badge.play 1113 | ipad.landscape.badge.play 1114 | arrow.turn.up.forward.iphone 1115 | arrow.turn.up.forward.iphone.fill 1116 | apps.iphone 1117 | apps.iphone.badge.plus 1118 | apps.iphone.landscape 1119 | ipodtouch 1120 | ipodtouch.landscape 1121 | ipodshuffle.gen1 1122 | ipodshuffle.gen2 1123 | ipodshuffle.gen3 1124 | ipodshuffle.gen4 1125 | ipad.homebutton 1126 | ipad 1127 | apps.ipad 1128 | ipad.homebutton.landscape 1129 | ipad.landscape 1130 | apps.ipad.landscape 1131 | applewatch 1132 | applewatch.watchface 1133 | exclamationmark.applewatch 1134 | lock.applewatch 1135 | applewatch.radiowaves.left.and.right 1136 | applewatch.slash 1137 | earpods 1138 | airpods 1139 | airpod.right 1140 | airpod.left 1141 | airpodspro 1142 | airpodpro.right 1143 | airpodpro.left 1144 | homepod 1145 | homepod.fill 1146 | homepod.2 1147 | homepod.2.fill 1148 | hifispeaker.and.homepod 1149 | hifispeaker.and.homepod.fill 1150 | hifispeaker 1151 | hifispeaker.fill 1152 | hifispeaker.2 1153 | hifispeaker.2.fill 1154 | radio 1155 | radio.fill 1156 | appletv 1157 | appletv.fill 1158 | signpost.left 1159 | signpost.left.fill 1160 | signpost.right 1161 | signpost.right.fill 1162 | airplayvideo 1163 | airplayaudio 1164 | dot.radiowaves.left.and.right 1165 | dot.radiowaves.right 1166 | dot.radiowaves.forward 1167 | wave.3.left 1168 | wave.3.left.circle 1169 | wave.3.left.circle.fill 1170 | wave.3.backward 1171 | wave.3.backward.circle 1172 | wave.3.backward.circle.fill 1173 | wave.3.right 1174 | wave.3.right.circle 1175 | wave.3.right.circle.fill 1176 | wave.3.forward 1177 | wave.3.forward.circle 1178 | wave.3.forward.circle.fill 1179 | antenna.radiowaves.left.and.right 1180 | pip 1181 | pip.fill 1182 | pip.exit 1183 | pip.enter 1184 | pip.swap 1185 | pip.remove 1186 | rectangle.arrowtriangle.2.outward 1187 | rectangle.arrowtriangle.2.inward 1188 | rectangle.portrait.arrowtriangle.2.outward 1189 | rectangle.portrait.arrowtriangle.2.inward 1190 | guitars 1191 | guitars.fill 1192 | car 1193 | car.fill 1194 | car.circle 1195 | car.circle.fill 1196 | bolt.car 1197 | bolt.car.fill 1198 | car.2 1199 | car.2.fill 1200 | bus 1201 | bus.fill 1202 | bus.doubledecker 1203 | bus.doubledecker.fill 1204 | tram 1205 | tram.fill 1206 | tram.circle 1207 | tram.circle.fill 1208 | tram.tunnel.fill 1209 | bicycle 1210 | bicycle.circle 1211 | bicycle.circle.fill 1212 | bed.double 1213 | bed.double.fill 1214 | lungs 1215 | lungs.fill 1216 | pills 1217 | pills.fill 1218 | cross 1219 | cross.fill 1220 | cross.circle 1221 | cross.circle.fill 1222 | hare 1223 | hare.fill 1224 | tortoise 1225 | tortoise.fill 1226 | ant 1227 | ant.fill 1228 | ant.circle 1229 | ant.circle.fill 1230 | ladybug 1231 | ladybug.fill 1232 | leaf 1233 | leaf.fill 1234 | leaf.arrow.triangle.circlepath 1235 | film 1236 | film.fill 1237 | sportscourt 1238 | sportscourt.fill 1239 | face.smiling 1240 | face.smiling.fill 1241 | face.dashed 1242 | face.dashed.fill 1243 | crown 1244 | crown.fill 1245 | comb 1246 | comb.fill 1247 | qrcode 1248 | barcode 1249 | viewfinder 1250 | viewfinder.circle 1251 | viewfinder.circle.fill 1252 | barcode.viewfinder 1253 | qrcode.viewfinder 1254 | plus.viewfinder 1255 | camera.viewfinder 1256 | faceid 1257 | doc.text.viewfinder 1258 | doc.text.fill.viewfinder 1259 | location.viewfinder 1260 | location.fill.viewfinder 1261 | person.fill.viewfinder 1262 | rectangle.inset.fill 1263 | rectangle.lefthalf.inset.fill 1264 | rectangle.righthalf.inset.fill 1265 | rectangle.topthird.inset 1266 | rectangle.bottomthird.inset.fill 1267 | rectangle.leftthird.inset.fill 1268 | rectangle.rightthird.inset.fill 1269 | rectangle.center.inset.fill 1270 | rectangle.inset.topleft.fill 1271 | rectangle.inset.topright.fill 1272 | rectangle.inset.bottomleft.fill 1273 | rectangle.inset.bottomright.fill 1274 | rectangle.lefthalf.inset.fill.arrow.left 1275 | rectangle.righthalf.inset.fill.arrow.right 1276 | rectangle.lefthalf.fill 1277 | rectangle.righthalf.fill 1278 | person.crop.rectangle 1279 | person.crop.rectangle.fill 1280 | arrow.up.and.person.rectangle.portrait 1281 | arrow.up.and.person.rectangle.turn.right 1282 | arrow.up.and.person.rectangle.turn.left 1283 | photo 1284 | photo.fill 1285 | text.below.photo 1286 | text.below.photo.fill 1287 | checkerboard.rectangle 1288 | camera.metering.center.weighted.average 1289 | camera.metering.center.weighted 1290 | camera.metering.matrix 1291 | camera.metering.multispot 1292 | camera.metering.none 1293 | camera.metering.partial 1294 | camera.metering.spot 1295 | camera.metering.unknown 1296 | camera.aperture 1297 | rectangle.dashed 1298 | rectangle.dashed.badge.record 1299 | rectangle.badge.plus 1300 | rectangle.fill.badge.plus 1301 | rectangle.badge.minus 1302 | rectangle.fill.badge.minus 1303 | rectangle.badge.checkmark 1304 | rectangle.fill.badge.checkmark 1305 | rectangle.badge.xmark 1306 | rectangle.fill.badge.xmark 1307 | rectangle.badge.person.crop 1308 | rectangle.fill.badge.person.crop 1309 | sidebar.left 1310 | sidebar.right 1311 | sidebar.leading 1312 | sidebar.trailing 1313 | sidebar.squares.left 1314 | sidebar.squares.right 1315 | sidebar.squares.leading 1316 | sidebar.squares.trailing 1317 | macwindow 1318 | macwindow.badge.plus 1319 | dock.rectangle 1320 | dock.arrow.up.rectangle 1321 | dock.arrow.down.rectangle 1322 | menubar.rectangle 1323 | menubar.dock.rectangle 1324 | menubar.dock.rectangle.badge.record 1325 | menubar.arrow.up.rectangle 1326 | menubar.arrow.down.rectangle 1327 | macwindow.on.rectangle 1328 | text.and.command.macwindow 1329 | keyboard.macwindow 1330 | uiwindow.split.2x1 1331 | rectangle.split.3x1 1332 | rectangle.split.3x1.fill 1333 | square.split.2x1 1334 | square.split.2x1.fill 1335 | square.split.1x2 1336 | square.split.1x2.fill 1337 | square.split.2x2 1338 | square.split.2x2.fill 1339 | square.split.diagonal.2x2 1340 | square.split.diagonal.2x2.fill 1341 | square.split.diagonal 1342 | square.split.diagonal.fill 1343 | mosaic 1344 | mosaic.fill 1345 | squares.below.rectangle 1346 | rectangle.split.3x3 1347 | rectangle.split.3x3.fill 1348 | rectangle.split.2x1 1349 | rectangle.split.2x1.fill 1350 | rectangle.split.1x2 1351 | rectangle.split.1x2.fill 1352 | rectangle.split.2x2 1353 | rectangle.split.2x2.fill 1354 | tablecells 1355 | tablecells.fill 1356 | tablecells.badge.ellipsis 1357 | tablecells.badge.ellipsis.fill 1358 | rectangle.on.rectangle 1359 | rectangle.fill.on.rectangle.fill 1360 | rectangle.fill.on.rectangle.fill.circle 1361 | rectangle.fill.on.rectangle.fill.circle.fill 1362 | rectangle.on.rectangle.slash 1363 | rectangle.fill.on.rectangle.fill.slash.fill 1364 | plus.rectangle.on.rectangle 1365 | plus.rectangle.fill.on.rectangle.fill 1366 | photo.on.rectangle 1367 | photo.fill.on.rectangle.fill 1368 | rectangle.on.rectangle.angled 1369 | rectangle.fill.on.rectangle.angled.fill 1370 | photo.on.rectangle.angled 1371 | rectangle.stack 1372 | rectangle.stack.fill 1373 | rectangle.stack.badge.plus 1374 | rectangle.stack.fill.badge.plus 1375 | rectangle.stack.badge.minus 1376 | rectangle.stack.fill.badge.minus 1377 | rectangle.stack.badge.person.crop 1378 | rectangle.stack.fill.badge.person.crop 1379 | sparkles.rectangle.stack 1380 | sparkles.rectangle.stack.fill 1381 | r.square.on.square 1382 | r.square.fill.on.square.fill 1383 | j.square.on.square 1384 | j.square.fill.on.square.fill 1385 | h.square.on.square 1386 | h.square.fill.on.square.fill 1387 | square.on.square 1388 | square.fill.on.square.fill 1389 | square.fill.on.square 1390 | sparkles.square.fill.on.square 1391 | square.on.square.dashed 1392 | plus.square.on.square 1393 | plus.square.fill.on.square.fill 1394 | square.on.circle 1395 | square.fill.on.circle.fill 1396 | square.on.square.squareshape.controlhandles 1397 | squareshape.controlhandles.on.squareshape.controlhandles 1398 | square.stack 1399 | square.stack.fill 1400 | pano 1401 | pano.fill 1402 | square.and.line.vertical.and.square 1403 | square.fill.and.line.vertical.square.fill 1404 | square.fill.and.line.vertical.and.square 1405 | square.and.line.vertical.and.square.fill 1406 | flowchart 1407 | flowchart.fill 1408 | rectangle.connected.to.line.below 1409 | shield 1410 | shield.slash 1411 | shield.fill 1412 | shield.slash.fill 1413 | shield.lefthalf.fill 1414 | shield.lefthalf.fill.slash 1415 | shield.checkerboard 1416 | switch.2 1417 | point.topleft.down.curvedto.point.bottomright.up 1418 | point.fill.topleft.down.curvedto.point.fill.bottomright.up 1419 | slider.horizontal.3 1420 | slider.horizontal.below.rectangle 1421 | slider.horizontal.below.square.fill.and.square 1422 | slider.vertical.3 1423 | cube 1424 | cube.fill 1425 | cube.transparent 1426 | cube.transparent.fill 1427 | shippingbox 1428 | shippingbox.fill 1429 | arkit 1430 | cone 1431 | cone.fill 1432 | pyramid 1433 | pyramid.fill 1434 | square.stack.3d.down.right 1435 | square.stack.3d.down.right.fill 1436 | square.stack.3d.down.forward 1437 | square.stack.3d.down.forward.fill 1438 | square.stack.3d.up 1439 | square.stack.3d.up.fill 1440 | square.stack.3d.up.slash 1441 | square.stack.3d.up.slash.fill 1442 | square.stack.3d.up.badge.a 1443 | square.stack.3d.up.badge.a.fill 1444 | square.stack.3d.forward.dottedline 1445 | square.stack.3d.forward.dottedline.fill 1446 | livephoto 1447 | livephoto.slash 1448 | livephoto.badge.a 1449 | livephoto.play 1450 | scope 1451 | helm 1452 | clock 1453 | clock.fill 1454 | deskclock 1455 | deskclock.fill 1456 | alarm 1457 | alarm.fill 1458 | stopwatch 1459 | stopwatch.fill 1460 | timer 1461 | timer.square 1462 | clock.arrow.circlepath 1463 | exclamationmark.arrow.circlepath 1464 | clock.arrow.2.circlepath 1465 | gamecontroller 1466 | gamecontroller.fill 1467 | l.joystick 1468 | l.joystick.fill 1469 | r.joystick 1470 | r.joystick.fill 1471 | l.joystick.down 1472 | l.joystick.down.fill 1473 | r.joystick.down 1474 | r.joystick.down.fill 1475 | dpad 1476 | dpad.fill 1477 | dpad.left.fill 1478 | dpad.up.fill 1479 | dpad.right.fill 1480 | dpad.down.fill 1481 | circle.circle 1482 | circle.circle.fill 1483 | square.circle 1484 | square.circle.fill 1485 | triangle.circle 1486 | triangle.circle.fill 1487 | rectangle.roundedtop 1488 | rectangle.roundedtop.fill 1489 | rectangle.roundedbottom 1490 | rectangle.roundedbottom.fill 1491 | l.rectangle.roundedbottom 1492 | l.rectangle.roundedbottom.fill 1493 | l1.rectangle.roundedbottom 1494 | l1.rectangle.roundedbottom.fill 1495 | l2.rectangle.roundedtop 1496 | l2.rectangle.roundedtop.fill 1497 | r.rectangle.roundedbottom 1498 | r.rectangle.roundedbottom.fill 1499 | r1.rectangle.roundedbottom 1500 | r1.rectangle.roundedbottom.fill 1501 | r2.rectangle.roundedtop 1502 | r2.rectangle.roundedtop.fill 1503 | lb.rectangle.roundedbottom 1504 | lb.rectangle.roundedbottom.fill 1505 | rb.rectangle.roundedbottom 1506 | rb.rectangle.roundedbottom.fill 1507 | lt.rectangle.roundedtop 1508 | lt.rectangle.roundedtop.fill 1509 | rt.rectangle.roundedtop 1510 | rt.rectangle.roundedtop.fill 1511 | zl.rectangle.roundedtop 1512 | zl.rectangle.roundedtop.fill 1513 | zr.rectangle.roundedtop 1514 | zr.rectangle.roundedtop.fill 1515 | paintpalette 1516 | paintpalette.fill 1517 | figure.walk 1518 | figure.walk.circle 1519 | figure.walk.circle.fill 1520 | figure.walk.diamond 1521 | figure.walk.diamond.fill 1522 | figure.stand 1523 | figure.stand.line.dotted.figure.stand 1524 | figure.wave 1525 | figure.wave.circle 1526 | figure.wave.circle.fill 1527 | ear 1528 | ear.badge.checkmark 1529 | ear.trianglebadge.exclamationmark 1530 | ear.fill 1531 | hearingaid.ear 1532 | hand.raised 1533 | hand.raised.fill 1534 | hand.raised.slash 1535 | hand.raised.slash.fill 1536 | hand.thumbsup 1537 | hand.thumbsup.fill 1538 | hand.thumbsdown 1539 | hand.thumbsdown.fill 1540 | hand.point.up.left 1541 | hand.point.up.left.fill 1542 | hand.draw 1543 | hand.draw.fill 1544 | hand.tap 1545 | hand.tap.fill 1546 | hand.point.left 1547 | hand.point.left.fill 1548 | hand.point.right 1549 | hand.point.right.fill 1550 | hand.point.up 1551 | hand.point.up.fill 1552 | hand.point.up.braille 1553 | hand.point.up.braille.fill 1554 | hand.point.down 1555 | hand.point.down.fill 1556 | hand.wave 1557 | hand.wave.fill 1558 | hands.clap 1559 | hands.clap.fill 1560 | hands.sparkles 1561 | hands.sparkles.fill 1562 | rectangle.compress.vertical 1563 | rectangle.expand.vertical 1564 | rectangle.and.arrow.up.right.and.arrow.down.left 1565 | rectangle.and.arrow.up.right.and.arrow.down.left.slash 1566 | square.2.stack.3d 1567 | square.2.stack.3d.top.fill 1568 | square.2.stack.3d.bottom.fill 1569 | square.3.stack.3d 1570 | square.3.stack.3d.top.fill 1571 | square.3.stack.3d.middle.fill 1572 | square.3.stack.3d.bottom.fill 1573 | cylinder 1574 | cylinder.fill 1575 | cylinder.split.1x2 1576 | cylinder.split.1x2.fill 1577 | chart.bar 1578 | chart.bar.fill 1579 | chart.pie 1580 | chart.pie.fill 1581 | chart.bar.xaxis 1582 | dot.squareshape.split.2x2 1583 | squareshape.split.2x2.dotted 1584 | squareshape.split.2x2 1585 | squareshape.split.3x3 1586 | burst 1587 | burst.fill 1588 | waveform.path.ecg 1589 | waveform.path.ecg.rectangle 1590 | waveform.path.ecg.rectangle.fill 1591 | waveform.path 1592 | waveform.path.badge.plus 1593 | waveform.path.badge.minus 1594 | waveform 1595 | waveform.circle 1596 | waveform.circle.fill 1597 | staroflife 1598 | staroflife.fill 1599 | staroflife.circle 1600 | staroflife.circle.fill 1601 | simcard 1602 | simcard.fill 1603 | simcard.2 1604 | simcard.2.fill 1605 | esim 1606 | esim.fill 1607 | sdcard 1608 | sdcard.fill 1609 | touchid 1610 | bonjour 1611 | atom 1612 | scalemass 1613 | scalemass.fill 1614 | headphones 1615 | headphones.circle 1616 | headphones.circle.fill 1617 | gift 1618 | gift.fill 1619 | gift.circle 1620 | gift.circle.fill 1621 | plus.app 1622 | plus.app.fill 1623 | arrow.down.app 1624 | arrow.down.app.fill 1625 | arrow.up.forward.app 1626 | arrow.up.forward.app.fill 1627 | app.badge 1628 | app.badge.fill 1629 | appclip 1630 | app.gift 1631 | app.gift.fill 1632 | airplane 1633 | airplane.circle 1634 | airplane.circle.fill 1635 | studentdesk 1636 | hourglass 1637 | hourglass.badge.plus 1638 | hourglass.bottomhalf.fill 1639 | hourglass.tophalf.fill 1640 | banknote 1641 | banknote.fill 1642 | paragraphsign 1643 | purchased 1644 | purchased.circle 1645 | purchased.circle.fill 1646 | perspective 1647 | aspectratio 1648 | aspectratio.fill 1649 | camera.filters 1650 | skew 1651 | arrow.left.and.right.righttriangle.left.righttriangle.right 1652 | arrow.left.and.right.righttriangle.left.righttriangle.right.fill 1653 | arrow.up.and.down.righttriangle.up.righttriangle.down 1654 | arrow.up.and.down.righttriangle.up.fill.righttriangle.down.fill 1655 | arrowtriangle.left.and.line.vertical.and.arrowtriangle.right 1656 | arrowtriangle.left.fill.and.line.vertical.and.arrowtriangle.right.fill 1657 | arrowtriangle.right.and.line.vertical.and.arrowtriangle.left 1658 | arrowtriangle.right.fill.and.line.vertical.and.arrowtriangle.left.fill 1659 | grid 1660 | grid.circle 1661 | grid.circle.fill 1662 | burn 1663 | lifepreserver 1664 | lifepreserver.fill 1665 | recordingtape 1666 | eyeglasses 1667 | binoculars 1668 | binoculars.fill 1669 | battery.100 1670 | battery.25 1671 | battery.0 1672 | battery.100.bolt 1673 | minus.plus.batteryblock 1674 | minus.plus.batteryblock.fill 1675 | bolt.fill.batteryblock 1676 | bolt.fill.batteryblock.fill 1677 | lightbulb 1678 | lightbulb.fill 1679 | lightbulb.slash 1680 | lightbulb.slash.fill 1681 | fiberchannel 1682 | square.fill.text.grid.1x2 1683 | list.dash 1684 | list.bullet 1685 | list.triangle 1686 | list.bullet.indent 1687 | list.number 1688 | list.star 1689 | increase.indent 1690 | decrease.indent 1691 | decrease.quotelevel 1692 | increase.quotelevel 1693 | list.bullet.below.rectangle 1694 | text.badge.plus 1695 | text.badge.minus 1696 | text.badge.checkmark 1697 | text.badge.xmark 1698 | text.badge.star 1699 | text.insert 1700 | text.append 1701 | text.quote 1702 | text.alignleft 1703 | text.aligncenter 1704 | text.alignright 1705 | text.justify 1706 | text.justifyleft 1707 | text.justifyright 1708 | text.redaction 1709 | list.and.film 1710 | line.horizontal.3 1711 | line.horizontal.3.decrease 1712 | line.horizontal.3.decrease.circle 1713 | line.horizontal.3.decrease.circle.fill 1714 | line.horizontal.3.circle 1715 | line.horizontal.3.circle.fill 1716 | line.horizontal.2.decrease.circle 1717 | line.horizontal.2.decrease.circle.fill 1718 | character 1719 | textformat.size.smaller 1720 | textformat.size.larger 1721 | abc 1722 | textformat.alt 1723 | textformat 1724 | textformat.size 1725 | textformat.superscript 1726 | textformat.subscript 1727 | bold 1728 | italic 1729 | underline 1730 | strikethrough 1731 | shadow 1732 | bold.italic.underline 1733 | bold.underline 1734 | view.2d 1735 | view.3d 1736 | text.cursor 1737 | fx 1738 | f.cursive 1739 | f.cursive.circle 1740 | f.cursive.circle.fill 1741 | k 1742 | sum 1743 | percent 1744 | function 1745 | textformat.abc 1746 | textformat.abc.dottedunderline 1747 | fn 1748 | textformat.123 1749 | textbox 1750 | a.magnify 1751 | info 1752 | info.circle 1753 | info.circle.fill 1754 | at 1755 | at.circle 1756 | at.circle.fill 1757 | at.badge.plus 1758 | at.badge.minus 1759 | questionmark 1760 | questionmark.circle 1761 | questionmark.circle.fill 1762 | questionmark.square 1763 | questionmark.square.fill 1764 | questionmark.diamond 1765 | questionmark.diamond.fill 1766 | exclamationmark 1767 | exclamationmark.2 1768 | exclamationmark.3 1769 | exclamationmark.circle 1770 | exclamationmark.circle.fill 1771 | exclamationmark.square 1772 | exclamationmark.square.fill 1773 | exclamationmark.octagon 1774 | exclamationmark.octagon.fill 1775 | exclamationmark.shield 1776 | exclamationmark.shield.fill 1777 | plus 1778 | plus.circle 1779 | plus.circle.fill 1780 | plus.square 1781 | plus.square.fill 1782 | plus.rectangle 1783 | plus.rectangle.fill 1784 | plus.rectangle.portrait 1785 | plus.rectangle.portrait.fill 1786 | plus.diamond 1787 | plus.diamond.fill 1788 | minus 1789 | minus.circle 1790 | minus.circle.fill 1791 | minus.square 1792 | minus.square.fill 1793 | minus.rectangle 1794 | minus.rectangle.fill 1795 | minus.rectangle.portrait 1796 | minus.rectangle.portrait.fill 1797 | minus.diamond 1798 | minus.diamond.fill 1799 | plusminus 1800 | plusminus.circle 1801 | plusminus.circle.fill 1802 | plus.slash.minus 1803 | minus.slash.plus 1804 | multiply 1805 | multiply.circle 1806 | multiply.circle.fill 1807 | multiply.square 1808 | multiply.square.fill 1809 | xmark.rectangle 1810 | xmark.rectangle.fill 1811 | xmark.rectangle.portrait 1812 | xmark.rectangle.portrait.fill 1813 | xmark.diamond 1814 | xmark.diamond.fill 1815 | xmark.shield 1816 | xmark.shield.fill 1817 | xmark.octagon 1818 | xmark.octagon.fill 1819 | divide 1820 | divide.circle 1821 | divide.circle.fill 1822 | divide.square 1823 | divide.square.fill 1824 | equal 1825 | equal.circle 1826 | equal.circle.fill 1827 | equal.square 1828 | equal.square.fill 1829 | lessthan 1830 | lessthan.circle 1831 | lessthan.circle.fill 1832 | lessthan.square 1833 | lessthan.square.fill 1834 | greaterthan 1835 | greaterthan.circle 1836 | greaterthan.circle.fill 1837 | greaterthan.square 1838 | greaterthan.square.fill 1839 | chevron.left.slash.chevron.right 1840 | curlybraces 1841 | curlybraces.square 1842 | curlybraces.square.fill 1843 | number 1844 | number.circle 1845 | number.circle.fill 1846 | number.square 1847 | number.square.fill 1848 | x.squareroot 1849 | xmark 1850 | xmark.circle 1851 | xmark.circle.fill 1852 | xmark.square 1853 | xmark.square.fill 1854 | checkmark 1855 | checkmark.circle 1856 | checkmark.circle.fill 1857 | checkmark.square 1858 | checkmark.square.fill 1859 | checkmark.rectangle 1860 | checkmark.rectangle.fill 1861 | checkmark.rectangle.portrait 1862 | checkmark.rectangle.portrait.fill 1863 | checkmark.shield 1864 | checkmark.shield.fill 1865 | chevron.left 1866 | chevron.left.circle 1867 | chevron.left.circle.fill 1868 | chevron.left.square 1869 | chevron.left.square.fill 1870 | chevron.backward 1871 | chevron.backward.circle 1872 | chevron.backward.circle.fill 1873 | chevron.backward.square 1874 | chevron.backward.square.fill 1875 | chevron.right 1876 | chevron.right.circle 1877 | chevron.right.circle.fill 1878 | chevron.right.square 1879 | chevron.right.square.fill 1880 | chevron.forward 1881 | chevron.forward.circle 1882 | chevron.forward.circle.fill 1883 | chevron.forward.square 1884 | chevron.forward.square.fill 1885 | chevron.left.2 1886 | chevron.backward.2 1887 | chevron.right.2 1888 | chevron.forward.2 1889 | chevron.up 1890 | chevron.up.circle 1891 | chevron.up.circle.fill 1892 | chevron.up.square 1893 | chevron.up.square.fill 1894 | chevron.down 1895 | chevron.down.circle 1896 | chevron.down.circle.fill 1897 | chevron.down.square 1898 | chevron.down.square.fill 1899 | control 1900 | projective 1901 | chevron.up.chevron.down 1902 | chevron.compact.up 1903 | chevron.compact.down 1904 | chevron.compact.left 1905 | chevron.compact.right 1906 | arrow.left 1907 | arrow.left.circle 1908 | arrow.left.circle.fill 1909 | arrow.left.square 1910 | arrow.left.square.fill 1911 | arrow.backward 1912 | arrow.backward.circle 1913 | arrow.backward.circle.fill 1914 | arrow.backward.square 1915 | arrow.backward.square.fill 1916 | arrow.right 1917 | arrow.right.circle 1918 | arrow.right.circle.fill 1919 | arrow.right.square 1920 | arrow.right.square.fill 1921 | arrow.forward 1922 | arrow.forward.circle 1923 | arrow.forward.circle.fill 1924 | arrow.forward.square 1925 | arrow.forward.square.fill 1926 | arrow.up 1927 | arrow.up.circle 1928 | arrow.up.circle.fill 1929 | arrow.up.square 1930 | arrow.up.square.fill 1931 | arrow.down 1932 | arrow.down.circle 1933 | arrow.down.circle.fill 1934 | arrow.down.square 1935 | arrow.down.square.fill 1936 | arrow.up.left 1937 | arrow.up.left.circle 1938 | arrow.up.left.circle.fill 1939 | arrow.up.left.square 1940 | arrow.up.left.square.fill 1941 | arrow.up.backward 1942 | arrow.up.backward.circle 1943 | arrow.up.backward.circle.fill 1944 | arrow.up.backward.square 1945 | arrow.up.backward.square.fill 1946 | arrow.up.right 1947 | arrow.up.right.circle 1948 | arrow.up.right.circle.fill 1949 | arrow.up.right.square 1950 | arrow.up.right.square.fill 1951 | arrow.up.forward 1952 | arrow.up.forward.circle 1953 | arrow.up.forward.circle.fill 1954 | arrow.up.forward.square 1955 | arrow.up.forward.square.fill 1956 | arrow.down.left 1957 | arrow.down.left.circle 1958 | arrow.down.left.circle.fill 1959 | arrow.down.left.square 1960 | arrow.down.left.square.fill 1961 | arrow.down.backward 1962 | arrow.down.backward.circle 1963 | arrow.down.backward.circle.fill 1964 | arrow.down.backward.square 1965 | arrow.down.backward.square.fill 1966 | arrow.down.right 1967 | arrow.down.right.circle 1968 | arrow.down.right.circle.fill 1969 | arrow.down.right.square 1970 | arrow.down.right.square.fill 1971 | arrow.down.forward 1972 | arrow.down.forward.circle 1973 | arrow.down.forward.circle.fill 1974 | arrow.down.forward.square 1975 | arrow.down.forward.square.fill 1976 | arrow.left.arrow.right 1977 | arrow.left.arrow.right.circle 1978 | arrow.left.arrow.right.circle.fill 1979 | arrow.left.arrow.right.square 1980 | arrow.left.arrow.right.square.fill 1981 | arrow.up.arrow.down 1982 | arrow.up.arrow.down.circle 1983 | arrow.up.arrow.down.circle.fill 1984 | arrow.up.arrow.down.square 1985 | arrow.up.arrow.down.square.fill 1986 | arrow.turn.down.left 1987 | arrow.turn.up.left 1988 | arrow.turn.down.right 1989 | arrow.turn.up.right 1990 | arrow.turn.right.up 1991 | arrow.turn.left.up 1992 | arrow.turn.right.down 1993 | arrow.turn.left.down 1994 | arrow.uturn.left 1995 | arrow.uturn.left.circle 1996 | arrow.uturn.left.circle.fill 1997 | arrow.uturn.left.circle.badge.ellipsis 1998 | arrow.uturn.left.square 1999 | arrow.uturn.left.square.fill 2000 | arrow.uturn.backward 2001 | arrow.uturn.backward.circle 2002 | arrow.uturn.backward.circle.fill 2003 | arrow.uturn.backward.circle.badge.ellipsis 2004 | arrow.uturn.backward.square 2005 | arrow.uturn.backward.square.fill 2006 | arrow.uturn.right 2007 | arrow.uturn.right.circle 2008 | arrow.uturn.right.circle.fill 2009 | arrow.uturn.right.square 2010 | arrow.uturn.right.square.fill 2011 | arrow.uturn.forward 2012 | arrow.uturn.forward.circle 2013 | arrow.uturn.forward.circle.fill 2014 | arrow.uturn.forward.square 2015 | arrow.uturn.forward.square.fill 2016 | arrow.uturn.up 2017 | arrow.uturn.up.circle 2018 | arrow.uturn.up.circle.fill 2019 | arrow.uturn.up.square 2020 | arrow.uturn.up.square.fill 2021 | arrow.uturn.down 2022 | arrow.uturn.down.circle 2023 | arrow.uturn.down.circle.fill 2024 | arrow.uturn.down.square 2025 | arrow.uturn.down.square.fill 2026 | arrow.up.and.down.and.arrow.left.and.right 2027 | arrow.up.left.and.down.right.and.arrow.up.right.and.down.left 2028 | arrow.left.and.right 2029 | arrow.left.and.right.circle 2030 | arrow.left.and.right.circle.fill 2031 | arrow.left.and.right.square 2032 | arrow.left.and.right.square.fill 2033 | arrow.up.and.down 2034 | arrow.up.and.down.circle 2035 | arrow.up.and.down.circle.fill 2036 | arrow.up.and.down.square 2037 | arrow.up.and.down.square.fill 2038 | arrow.left.to.line.alt 2039 | arrow.left.to.line 2040 | arrow.right.to.line.alt 2041 | arrow.right.to.line 2042 | arrow.up.to.line.alt 2043 | arrow.up.to.line 2044 | arrow.down.to.line.alt 2045 | arrow.down.to.line 2046 | arrow.clockwise 2047 | arrow.clockwise.circle 2048 | arrow.clockwise.circle.fill 2049 | arrow.counterclockwise 2050 | arrow.counterclockwise.circle 2051 | arrow.counterclockwise.circle.fill 2052 | arrow.up.left.and.arrow.down.right 2053 | arrow.up.left.and.arrow.down.right.circle 2054 | arrow.up.left.and.arrow.down.right.circle.fill 2055 | arrow.up.backward.and.arrow.down.forward 2056 | arrow.up.backward.and.arrow.down.forward.circle 2057 | arrow.up.backward.and.arrow.down.forward.circle.fill 2058 | arrow.down.right.and.arrow.up.left 2059 | arrow.down.right.and.arrow.up.left.circle 2060 | arrow.down.right.and.arrow.up.left.circle.fill 2061 | arrow.down.forward.and.arrow.up.backward 2062 | arrow.down.forward.and.arrow.up.backward.circle 2063 | arrow.down.forward.and.arrow.up.backward.circle.fill 2064 | return 2065 | arrow.2.squarepath 2066 | arrow.triangle.2.circlepath 2067 | arrow.triangle.2.circlepath.circle 2068 | arrow.triangle.2.circlepath.circle.fill 2069 | exclamationmark.arrow.triangle.2.circlepath 2070 | arrow.triangle.capsulepath 2071 | arrow.3.trianglepath 2072 | arrow.triangle.turn.up.right.diamond 2073 | arrow.triangle.turn.up.right.diamond.fill 2074 | arrow.triangle.turn.up.right.circle 2075 | arrow.triangle.turn.up.right.circle.fill 2076 | arrow.triangle.merge 2077 | arrow.triangle.swap 2078 | arrow.triangle.branch 2079 | arrow.triangle.pull 2080 | arrowtriangle.left 2081 | arrowtriangle.left.fill 2082 | arrowtriangle.left.circle 2083 | arrowtriangle.left.circle.fill 2084 | arrowtriangle.left.square 2085 | arrowtriangle.left.square.fill 2086 | arrowtriangle.backward 2087 | arrowtriangle.backward.fill 2088 | arrowtriangle.backward.circle 2089 | arrowtriangle.backward.circle.fill 2090 | arrowtriangle.backward.square 2091 | arrowtriangle.backward.square.fill 2092 | arrowtriangle.right 2093 | arrowtriangle.right.fill 2094 | arrowtriangle.right.circle 2095 | arrowtriangle.right.circle.fill 2096 | arrowtriangle.right.square 2097 | arrowtriangle.right.square.fill 2098 | arrowtriangle.forward 2099 | arrowtriangle.forward.fill 2100 | arrowtriangle.forward.circle 2101 | arrowtriangle.forward.circle.fill 2102 | arrowtriangle.forward.square 2103 | arrowtriangle.forward.square.fill 2104 | arrowtriangle.up 2105 | arrowtriangle.up.fill 2106 | arrowtriangle.up.circle 2107 | arrowtriangle.up.circle.fill 2108 | arrowtriangle.up.square 2109 | arrowtriangle.up.square.fill 2110 | arrowtriangle.down 2111 | arrowtriangle.down.fill 2112 | arrowtriangle.down.circle 2113 | arrowtriangle.down.circle.fill 2114 | arrowtriangle.down.square 2115 | arrowtriangle.down.square.fill 2116 | slash.circle 2117 | slash.circle.fill 2118 | asterisk.circle 2119 | asterisk.circle.fill 2120 | a.circle 2121 | a.circle.fill 2122 | a.square 2123 | a.square.fill 2124 | b.circle 2125 | b.circle.fill 2126 | b.square 2127 | b.square.fill 2128 | c.circle 2129 | c.circle.fill 2130 | c.square 2131 | c.square.fill 2132 | d.circle 2133 | d.circle.fill 2134 | d.square 2135 | d.square.fill 2136 | e.circle 2137 | e.circle.fill 2138 | e.square 2139 | e.square.fill 2140 | f.circle 2141 | f.circle.fill 2142 | f.square 2143 | f.square.fill 2144 | g.circle 2145 | g.circle.fill 2146 | g.square 2147 | g.square.fill 2148 | h.circle 2149 | h.circle.fill 2150 | h.square 2151 | h.square.fill 2152 | i.circle 2153 | i.circle.fill 2154 | i.square 2155 | i.square.fill 2156 | j.circle 2157 | j.circle.fill 2158 | j.square 2159 | j.square.fill 2160 | k.circle 2161 | k.circle.fill 2162 | k.square 2163 | k.square.fill 2164 | l.circle 2165 | l.circle.fill 2166 | l.square 2167 | l.square.fill 2168 | m.circle 2169 | m.circle.fill 2170 | m.square 2171 | m.square.fill 2172 | n.circle 2173 | n.circle.fill 2174 | n.square 2175 | n.square.fill 2176 | o.circle 2177 | o.circle.fill 2178 | o.square 2179 | o.square.fill 2180 | p.circle 2181 | p.circle.fill 2182 | p.square 2183 | p.square.fill 2184 | q.circle 2185 | q.circle.fill 2186 | q.square 2187 | q.square.fill 2188 | r.circle 2189 | r.circle.fill 2190 | r.square 2191 | r.square.fill 2192 | s.circle 2193 | s.circle.fill 2194 | s.square 2195 | s.square.fill 2196 | t.circle 2197 | t.circle.fill 2198 | t.square 2199 | t.square.fill 2200 | u.circle 2201 | u.circle.fill 2202 | u.square 2203 | u.square.fill 2204 | v.circle 2205 | v.circle.fill 2206 | v.square 2207 | v.square.fill 2208 | w.circle 2209 | w.circle.fill 2210 | w.square 2211 | w.square.fill 2212 | x.circle 2213 | x.circle.fill 2214 | x.square 2215 | x.square.fill 2216 | y.circle 2217 | y.circle.fill 2218 | y.square 2219 | y.square.fill 2220 | z.circle 2221 | z.circle.fill 2222 | z.square 2223 | z.square.fill 2224 | dollarsign.circle 2225 | dollarsign.circle.fill 2226 | dollarsign.square 2227 | dollarsign.square.fill 2228 | centsign.circle 2229 | centsign.circle.fill 2230 | centsign.square 2231 | centsign.square.fill 2232 | yensign.circle 2233 | yensign.circle.fill 2234 | yensign.square 2235 | yensign.square.fill 2236 | sterlingsign.circle 2237 | sterlingsign.circle.fill 2238 | sterlingsign.square 2239 | sterlingsign.square.fill 2240 | francsign.circle 2241 | francsign.circle.fill 2242 | francsign.square 2243 | francsign.square.fill 2244 | florinsign.circle 2245 | florinsign.circle.fill 2246 | florinsign.square 2247 | florinsign.square.fill 2248 | turkishlirasign.circle 2249 | turkishlirasign.circle.fill 2250 | turkishlirasign.square 2251 | turkishlirasign.square.fill 2252 | rublesign.circle 2253 | rublesign.circle.fill 2254 | rublesign.square 2255 | rublesign.square.fill 2256 | eurosign.circle 2257 | eurosign.circle.fill 2258 | eurosign.square 2259 | eurosign.square.fill 2260 | dongsign.circle 2261 | dongsign.circle.fill 2262 | dongsign.square 2263 | dongsign.square.fill 2264 | indianrupeesign.circle 2265 | indianrupeesign.circle.fill 2266 | indianrupeesign.square 2267 | indianrupeesign.square.fill 2268 | tengesign.circle 2269 | tengesign.circle.fill 2270 | tengesign.square 2271 | tengesign.square.fill 2272 | pesetasign.circle 2273 | pesetasign.circle.fill 2274 | pesetasign.square 2275 | pesetasign.square.fill 2276 | pesosign.circle 2277 | pesosign.circle.fill 2278 | pesosign.square 2279 | pesosign.square.fill 2280 | kipsign.circle 2281 | kipsign.circle.fill 2282 | kipsign.square 2283 | kipsign.square.fill 2284 | wonsign.circle 2285 | wonsign.circle.fill 2286 | wonsign.square 2287 | wonsign.square.fill 2288 | lirasign.circle 2289 | lirasign.circle.fill 2290 | lirasign.square 2291 | lirasign.square.fill 2292 | australsign.circle 2293 | australsign.circle.fill 2294 | australsign.square 2295 | australsign.square.fill 2296 | hryvniasign.circle 2297 | hryvniasign.circle.fill 2298 | hryvniasign.square 2299 | hryvniasign.square.fill 2300 | nairasign.circle 2301 | nairasign.circle.fill 2302 | nairasign.square 2303 | nairasign.square.fill 2304 | guaranisign.circle 2305 | guaranisign.circle.fill 2306 | guaranisign.square 2307 | guaranisign.square.fill 2308 | coloncurrencysign.circle 2309 | coloncurrencysign.circle.fill 2310 | coloncurrencysign.square 2311 | coloncurrencysign.square.fill 2312 | cedisign.circle 2313 | cedisign.circle.fill 2314 | cedisign.square 2315 | cedisign.square.fill 2316 | cruzeirosign.circle 2317 | cruzeirosign.circle.fill 2318 | cruzeirosign.square 2319 | cruzeirosign.square.fill 2320 | tugriksign.circle 2321 | tugriksign.circle.fill 2322 | tugriksign.square 2323 | tugriksign.square.fill 2324 | millsign.circle 2325 | millsign.circle.fill 2326 | millsign.square 2327 | millsign.square.fill 2328 | shekelsign.circle 2329 | shekelsign.circle.fill 2330 | shekelsign.square 2331 | shekelsign.square.fill 2332 | manatsign.circle 2333 | manatsign.circle.fill 2334 | manatsign.square 2335 | manatsign.square.fill 2336 | rupeesign.circle 2337 | rupeesign.circle.fill 2338 | rupeesign.square 2339 | rupeesign.square.fill 2340 | bahtsign.circle 2341 | bahtsign.circle.fill 2342 | bahtsign.square 2343 | bahtsign.square.fill 2344 | larisign.circle 2345 | larisign.circle.fill 2346 | larisign.square 2347 | larisign.square.fill 2348 | bitcoinsign.circle 2349 | bitcoinsign.circle.fill 2350 | bitcoinsign.square 2351 | bitcoinsign.square.fill 2352 | brazilianrealsign.circle 2353 | brazilianrealsign.circle.fill 2354 | brazilianrealsign.square 2355 | brazilianrealsign.square.fill 2356 | 0.circle 2357 | 0.circle.fill 2358 | 0.square 2359 | 0.square.fill 2360 | 1.circle 2361 | 1.circle.fill 2362 | 1.square 2363 | 1.square.fill 2364 | 2.circle 2365 | 2.circle.fill 2366 | 2.square 2367 | 2.square.fill 2368 | 3.circle 2369 | 3.circle.fill 2370 | 3.square 2371 | 3.square.fill 2372 | 4.circle 2373 | 4.circle.fill 2374 | 4.square 2375 | 4.square.fill 2376 | 4.alt.circle 2377 | 4.alt.circle.fill 2378 | 4.alt.square 2379 | 4.alt.square.fill 2380 | 5.circle 2381 | 5.circle.fill 2382 | 5.square 2383 | 5.square.fill 2384 | 6.circle 2385 | 6.circle.fill 2386 | 6.square 2387 | 6.square.fill 2388 | 6.alt.circle 2389 | 6.alt.circle.fill 2390 | 6.alt.square 2391 | 6.alt.square.fill 2392 | 7.circle 2393 | 7.circle.fill 2394 | 7.square 2395 | 7.square.fill 2396 | 8.circle 2397 | 8.circle.fill 2398 | 8.square 2399 | 8.square.fill 2400 | 9.circle 2401 | 9.circle.fill 2402 | 9.square 2403 | 9.square.fill 2404 | 9.alt.circle 2405 | 9.alt.circle.fill 2406 | 9.alt.square 2407 | 9.alt.square.fill 2408 | 00.circle 2409 | 00.circle.fill 2410 | 00.square 2411 | 00.square.fill 2412 | 01.circle 2413 | 01.circle.fill 2414 | 01.square 2415 | 01.square.fill 2416 | 02.circle 2417 | 02.circle.fill 2418 | 02.square 2419 | 02.square.fill 2420 | 03.circle 2421 | 03.circle.fill 2422 | 03.square 2423 | 03.square.fill 2424 | 04.circle 2425 | 04.circle.fill 2426 | 04.square 2427 | 04.square.fill 2428 | 05.circle 2429 | 05.circle.fill 2430 | 05.square 2431 | 05.square.fill 2432 | 06.circle 2433 | 06.circle.fill 2434 | 06.square 2435 | 06.square.fill 2436 | 07.circle 2437 | 07.circle.fill 2438 | 07.square 2439 | 07.square.fill 2440 | 08.circle 2441 | 08.circle.fill 2442 | 08.square 2443 | 08.square.fill 2444 | 09.circle 2445 | 09.circle.fill 2446 | 09.square 2447 | 09.square.fill 2448 | 10.circle 2449 | 10.circle.fill 2450 | 10.square 2451 | 10.square.fill 2452 | 11.circle 2453 | 11.circle.fill 2454 | 11.square 2455 | 11.square.fill 2456 | 12.circle 2457 | 12.circle.fill 2458 | 12.square 2459 | 12.square.fill 2460 | 13.circle 2461 | 13.circle.fill 2462 | 13.square 2463 | 13.square.fill 2464 | 14.circle 2465 | 14.circle.fill 2466 | 14.square 2467 | 14.square.fill 2468 | 15.circle 2469 | 15.circle.fill 2470 | 15.square 2471 | 15.square.fill 2472 | 16.circle 2473 | 16.circle.fill 2474 | 16.square 2475 | 16.square.fill 2476 | 17.circle 2477 | 17.circle.fill 2478 | 17.square 2479 | 17.square.fill 2480 | 18.circle 2481 | 18.circle.fill 2482 | 18.square 2483 | 18.square.fill 2484 | 19.circle 2485 | 19.circle.fill 2486 | 19.square 2487 | 19.square.fill 2488 | 20.circle 2489 | 20.circle.fill 2490 | 20.square 2491 | 20.square.fill 2492 | 21.circle 2493 | 21.circle.fill 2494 | 21.square 2495 | 21.square.fill 2496 | 22.circle 2497 | 22.circle.fill 2498 | 22.square 2499 | 22.square.fill 2500 | 23.circle 2501 | 23.circle.fill 2502 | 23.square 2503 | 23.square.fill 2504 | 24.circle 2505 | 24.circle.fill 2506 | 24.square 2507 | 24.square.fill 2508 | 25.circle 2509 | 25.circle.fill 2510 | 25.square 2511 | 25.square.fill 2512 | 26.circle 2513 | 26.circle.fill 2514 | 26.square 2515 | 26.square.fill 2516 | 27.circle 2517 | 27.circle.fill 2518 | 27.square 2519 | 27.square.fill 2520 | 28.circle 2521 | 28.circle.fill 2522 | 28.square 2523 | 28.square.fill 2524 | 29.circle 2525 | 29.circle.fill 2526 | 29.square 2527 | 29.square.fill 2528 | 30.circle 2529 | 30.circle.fill 2530 | 30.square 2531 | 30.square.fill 2532 | 31.circle 2533 | 31.circle.fill 2534 | 31.square 2535 | 31.square.fill 2536 | 32.circle 2537 | 32.circle.fill 2538 | 32.square 2539 | 32.square.fill 2540 | 33.circle 2541 | 33.circle.fill 2542 | 33.square 2543 | 33.square.fill 2544 | 34.circle 2545 | 34.circle.fill 2546 | 34.square 2547 | 34.square.fill 2548 | 35.circle 2549 | 35.circle.fill 2550 | 35.square 2551 | 35.square.fill 2552 | 36.circle 2553 | 36.circle.fill 2554 | 36.square 2555 | 36.square.fill 2556 | 37.circle 2557 | 37.circle.fill 2558 | 37.square 2559 | 37.square.fill 2560 | 38.circle 2561 | 38.circle.fill 2562 | 38.square 2563 | 38.square.fill 2564 | 39.circle 2565 | 39.circle.fill 2566 | 39.square 2567 | 39.square.fill 2568 | 40.circle 2569 | 40.circle.fill 2570 | 40.square 2571 | 40.square.fill 2572 | 41.circle 2573 | 41.circle.fill 2574 | 41.square 2575 | 41.square.fill 2576 | 42.circle 2577 | 42.circle.fill 2578 | 42.square 2579 | 42.square.fill 2580 | 43.circle 2581 | 43.circle.fill 2582 | 43.square 2583 | 43.square.fill 2584 | 44.circle 2585 | 44.circle.fill 2586 | 44.square 2587 | 44.square.fill 2588 | 45.circle 2589 | 45.circle.fill 2590 | 45.square 2591 | 45.square.fill 2592 | 46.circle 2593 | 46.circle.fill 2594 | 46.square 2595 | 46.square.fill 2596 | 47.circle 2597 | 47.circle.fill 2598 | 47.square 2599 | 47.square.fill 2600 | 48.circle 2601 | 48.circle.fill 2602 | 48.square 2603 | 48.square.fill 2604 | 49.circle 2605 | 49.circle.fill 2606 | 49.square 2607 | 49.square.fill 2608 | 50.circle 2609 | 50.circle.fill 2610 | 50.square 2611 | 50.square.fill 2612 | applelogo 2613 | -------------------------------------------------------------------------------- /Sources/Lorem/Source/Color.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | #if os(iOS) || os(tvOS) || os(watchOS) 4 | @available(iOS 14, *) 5 | @available(watchOS 7, *) 6 | @available(tvOS 14, *) 7 | public extension Lorem where Content == UIColor { 8 | 9 | /// Returns a random placeholder color 10 | static var color: Content { 11 | .init(Lorem.color) 12 | } 13 | 14 | /// Returns a placeholder color, generated from the specified palette 15 | /// - Parameter palette: The color palette used to generate the color 16 | static func color(_ palette: Palette) -> Content { 17 | .init(Lorem.color(palette)) 18 | } 19 | 20 | } 21 | #endif 22 | 23 | #if os(macOS) 24 | @available(macOS 11, *) 25 | public extension Lorem where Content == NSColor { 26 | 27 | /// Returns a random placeholder color 28 | static var color: Content { 29 | .init(Lorem.color) 30 | } 31 | 32 | /// Returns a placeholder color, generated from the specified palette 33 | /// - Parameter palette: The color palette used to generate the color 34 | static func color(_ palette: Palette) -> Content { 35 | .init(Lorem.color(palette)) 36 | } 37 | 38 | } 39 | #endif 40 | 41 | public extension Lorem where Content == Color { 42 | 43 | /// Returns a random placeholder color 44 | static var color: Content { 45 | RGB().color 46 | } 47 | 48 | /// Returns a placeholder color, generated from the specified palette 49 | /// - Parameter palette: The color palette used to generate the color 50 | static func color(_ palette: Palette) -> Content { 51 | palette.color 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /Sources/Lorem/Source/Date.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public extension Lorem where Content == Date { 4 | 5 | /// Returns a placeholder date within the past `20` years 6 | static var date: Date { 7 | date(within: 20, component: .year) 8 | } 9 | 10 | /// Returns a placeholder date within the specified calendar component value 11 | /// - Parameters: 12 | /// - value: The value to use to offset the calendar component 13 | /// - component: The calendar component to offset 14 | /// - locale: The locale the `Calendar` should use 15 | static func date(within value: Int, component: DateComponent, locale: Locale = .init(identifier: "en_US_POSIX")) -> Date { 16 | let upper = Date() 17 | var calendar = Calendar.current 18 | calendar.locale = locale 19 | var components = DateComponents() 20 | 21 | switch component { 22 | case .minute: 23 | components.minute = -value 24 | case .hour: 25 | components.hour = -value 26 | case .day: 27 | components.day = -value 28 | case .week: 29 | components.weekOfYear = -value 30 | case .month: 31 | components.month = -value 32 | case .year: 33 | components.year = -value 34 | } 35 | 36 | let lower = calendar.date(byAdding: components, to: upper) ?? Date() 37 | let timeInterval = upper.timeIntervalSince(lower) 38 | let random = (0...Int(timeInterval)).randomElement()! 39 | return lower.addingTimeInterval(TimeInterval(random)) 40 | } 41 | 42 | internal static func formatter(format: DateFormat) -> Formatter { 43 | let key = DateFormatKey(style: format) 44 | 45 | if let formatter = formatterCache[key] { 46 | return formatter 47 | } 48 | 49 | let formatter = format.formatter 50 | formatterCache[key] = formatter 51 | return formatter 52 | } 53 | } 54 | 55 | private var formatterCache: [DateFormatKey: Formatter] = [:] 56 | private struct DateFormatKey: CustomStringConvertible, Hashable { 57 | var description: String 58 | 59 | init(style: DateFormat) { 60 | switch style { 61 | case .iso8601: 62 | description = "iso8601" 63 | case let .formatted(format): 64 | description = format 65 | case let .styled(date, time): 66 | description = "\(date)-\(time)" 67 | case let .relative(style): 68 | description = "\(style)" 69 | case .custom: 70 | description = "custom" 71 | } 72 | } 73 | } 74 | 75 | /// Represents various date styles 76 | public enum DateStyle: String { 77 | /// Excludes the date part. 78 | case omitted 79 | /// Shows date components in their numeric form. For example, "10/21/2015". 80 | case numeric 81 | /// Shows date components in their abbreviated form if possible. For example, "Oct 21, 2015". 82 | case abbreviated 83 | /// Shows date components in their long form if possible. For example, "October 21, 2015". 84 | case long 85 | /// Shows the complete day. For example, "Wednesday, October 21, 2015". 86 | case complete 87 | 88 | internal var style: DateFormatter.Style { 89 | switch self { 90 | case .omitted: 91 | return .none 92 | case .numeric: 93 | return .short 94 | case .abbreviated: 95 | return .medium 96 | case .long: 97 | return .long 98 | case .complete: 99 | return .full 100 | } 101 | } 102 | 103 | } 104 | 105 | /// Represents various time styles 106 | public enum TimeStyle: String { 107 | /// Excludes the time part. 108 | case omitted 109 | /// For example, "04:29 PM", "16:29". 110 | case shortened 111 | /// For example, "4:29:24 PM", "16:29:24". 112 | case standard 113 | /// For example, "4:29:24 PM PDT", "16:29:24 GMT". 114 | case complete 115 | 116 | internal var style: DateFormatter.Style { 117 | switch self { 118 | case .omitted: 119 | return .none 120 | case .shortened: 121 | return .short 122 | case .standard: 123 | return .medium 124 | case .complete: 125 | return .long 126 | } 127 | } 128 | } 129 | 130 | public enum RelativeStyle: String { 131 | case shortened 132 | case standard 133 | case complete 134 | } 135 | 136 | public enum DateFormat: Equatable { 137 | case iso8601 138 | case relative(_ style: RelativeStyle = .standard) 139 | case styled(date: DateStyle = .numeric, time: TimeStyle = .standard) 140 | case formatted(_ format: String) 141 | case custom(Formatter) 142 | 143 | internal var formatter: Formatter { 144 | switch self { 145 | case .iso8601: 146 | return ISO8601DateFormatter() 147 | case .relative(let style): 148 | let formatter = RelativeDateTimeFormatter() 149 | switch style { 150 | case .shortened: 151 | formatter.unitsStyle = .short 152 | formatter.dateTimeStyle = .numeric 153 | case .complete: 154 | formatter.unitsStyle = .full 155 | formatter.dateTimeStyle = .named 156 | case .standard: 157 | break 158 | } 159 | return formatter 160 | case .styled(let date, let time): 161 | let formatter = DateFormatter() 162 | formatter.dateStyle = date.style 163 | formatter.timeStyle = time.style 164 | return formatter 165 | case .formatted(let format): 166 | let formatter = DateFormatter() 167 | formatter.dateFormat = format 168 | return formatter 169 | case .custom(let formatter): 170 | return formatter 171 | } 172 | } 173 | } 174 | 175 | /// Represents various date components 176 | public enum DateComponent: Equatable { 177 | /// Represents the `minute` calendar component 178 | case minute 179 | /// Represents the `hour` calendar component 180 | case hour 181 | /// Represents the `day` calendar component 182 | case day 183 | /// Represents the `week` calendar component 184 | case week 185 | /// Represents the `month` calendar component 186 | case month 187 | /// Represents the `year` calendar component 188 | case year 189 | } 190 | -------------------------------------------------------------------------------- /Sources/Lorem/Source/Image.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | #if os(iOS) || os(tvOS) || os(watchOS) 4 | public extension Lorem where Content == UIImage { 5 | 6 | /// Returns a random SF-Symbol image 7 | static var systemImage: UIImage? { 8 | UIImage(systemName: Lorem.systemImage) 9 | } 10 | 11 | /// Returns a `200x200px` placeholder image that uses the `picsum.photos` API 12 | static var image: Content? { image(size: 200) } 13 | 14 | /// Returns a placeholder image that uses the `picsum.photos` API 15 | /// - Parameters: 16 | /// - source: The image source to use for fetching the placeholder 17 | /// - size: The desired size, for both the width and height dimencions, for this placeholder 18 | /// - grayscale: If `true`, the placeholder will be returned as a grayscale image 19 | static func image(source: ImageSource = .random, size: CGFloat, grayscale: Bool = false) -> UIImage? { 20 | let url = Lorem.image(source: source, size: size, grayscale: grayscale) 21 | let data = try? Foundation.Data(contentsOf: url) 22 | return data.flatMap { .init(data: $0) } 23 | } 24 | 25 | } 26 | #endif 27 | 28 | #if os(macOS) 29 | public extension Lorem where Content == NSImage { 30 | 31 | /// Returns a random SF-Symbol image 32 | @available(macOS 11, *) 33 | static var systemImage: NSImage? { 34 | NSImage(systemSymbolName: Lorem.systemImage, accessibilityDescription: nil) 35 | } 36 | 37 | /// Returns a `200x200px` placeholder image that uses the `picsum.photos` API 38 | static var image: Content? { image(size: 200) } 39 | 40 | /// Returns a placeholder image that uses the `picsum.photos` API 41 | /// - Parameters: 42 | /// - source: The image source to use for fetching the placeholder 43 | /// - size: The desired size, for both the width and height dimencions, for this placeholder 44 | /// - grayscale: If `true`, the placeholder will be returned as a grayscale image 45 | static func image(source: ImageSource = .random, size: CGFloat, grayscale: Bool = false) -> Content? { 46 | let url = Lorem.image(source: source, size: size, grayscale: grayscale) 47 | return .init(contentsOf: url) 48 | } 49 | 50 | } 51 | #endif 52 | 53 | @available(iOS 15, *) 54 | @available(tvOS 15, *) 55 | @available(watchOS 8, *) 56 | @available(macOS 12, *) 57 | public extension Lorem where Content: View { 58 | 59 | /// Returns an async placeholder image that uses the `picsum.photos` API 60 | /// - Parameters: 61 | /// - source: The image source to use for fetching the placeholder 62 | /// - size: The desired size, for both the width and height dimencions, for this placeholder 63 | /// - grayscale: If `true`, the placeholder will be returned as a grayscale image 64 | /// - transcation: The transaction to use when the phase changes. 65 | /// - content: A closure that takes the load phase as an input, and returns the view to display for the specified phase. 66 | static func asyncImage(source: ImageSource = .random, size: CGFloat, grayscale: Bool = false, transcation: Transaction = .init(), @ViewBuilder content: @escaping (AsyncImagePhase) -> Content) -> some View { 67 | let url = Lorem.image(source: source, size: size, grayscale: grayscale) 68 | return AsyncImage(url: url, transaction: transcation, content: content) 69 | } 70 | 71 | /// Returns an async placeholder image that uses the `picsum.photos` API 72 | /// - Parameters: 73 | /// - source: The image source to use for fetching the placeholder 74 | /// - size: The desired size for this placeholder 75 | /// - grayscale: If `true`, the placeholder will be returned as a grayscale image 76 | /// - transcation: The transaction to use when the phase changes. 77 | /// - content: A closure that takes the load phase as an input, and returns the view to display for the specified phase. 78 | static func asyncImage(source: ImageSource = .random, size: CGSize, grayscale: Bool = false, transcation: Transaction = .init(), @ViewBuilder content: @escaping (AsyncImagePhase) -> Content) -> some View { 79 | let url = Lorem.image(source: source, size: size, grayscale: grayscale) 80 | return AsyncImage(url: url, transaction: transcation, content: content) 81 | } 82 | 83 | } 84 | 85 | public extension Lorem where Content == Image { 86 | 87 | /// Returns a placeholder rectangle representing an image using the `systemGray4` color on iOS and `gray` otherwise 88 | static var image: some View { image() } 89 | 90 | /// Returns a placeholder rectangle representing an image, at the specified aspect ratio 91 | /// - Parameters: 92 | /// - ratio: The aspect ratio to apply to this placeholder 93 | /// - color: The color to apply to this placeholder. Defaults to `systemGray4` 94 | static func image(ratio: CGFloat? = nil, color: Color? = nil) -> some View { 95 | Rectangle() 96 | #if os(iOS) 97 | .foregroundColor(color ?? .init(.systemGray4)) 98 | #else 99 | .foregroundColor(color ?? .init(.gray)) 100 | #endif 101 | .aspectRatio(ratio, contentMode: .fit) 102 | } 103 | 104 | /// Returns a random SF-Symbol image 105 | @available(iOS 13, tvOS 13, macOS 11, watchOS 6, *) 106 | static var systemImage: Image { 107 | Image(systemName: Lorem.systemImage) 108 | } 109 | } 110 | 111 | /// Represents various image source's 112 | public enum ImageSource { 113 | /// Generates a random image 114 | case random 115 | /// Generates a random image, however the image returned will always be the same for this seed 116 | case seed(CustomStringConvertible) 117 | } 118 | -------------------------------------------------------------------------------- /Sources/Lorem/Source/Int.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public enum AgeGroup { 4 | case child 5 | case teen 6 | case adult 7 | case elderly 8 | 9 | var range: ClosedRange { 10 | switch self { 11 | case .child: return 1...12 12 | case .teen: return 13...17 13 | case .adult: return 18...65 14 | case .elderly: return 65...100 15 | } 16 | } 17 | } 18 | 19 | public extension Lorem where Content == Int { 20 | typealias L = Lorem 21 | 22 | /// Returns a placeholder year between 1900 and the current year 23 | static var year: Content { 24 | let year = Calendar.current.component(.year, from: Date()) 25 | return number(in: 1900...Content(year)) 26 | } 27 | 28 | /// Returns a placeholder year in the specified range 29 | static func year(in range: ClosedRange) -> Content { 30 | Lorem.number(in: range) 31 | } 32 | 33 | /// Returns a placeholder age for an adult 34 | static var age: Content { 35 | AgeGroup.adult.range.randomElement()! 36 | } 37 | 38 | /// Returns a placeholder age within the specified age-group 39 | static func age(for group: AgeGroup) -> Content { 40 | group.range.randomElement()! 41 | } 42 | 43 | /// Returns a placeholder age from the specified reference 44 | static func age(year: Int) -> Content { 45 | let birthdate = DateComponents(calendar: .current, year: year).date ?? Date() 46 | let formatter = DateComponentsFormatter() 47 | formatter.allowedUnits = .year 48 | formatter.unitsStyle = .full 49 | let components: DateComponents = Calendar.current.dateComponents([.year], from: birthdate, to: Date()) 50 | return components.year ?? 0 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Sources/Lorem/Source/Palette.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | public protocol Palette { 4 | var color: Color { get } 5 | } 6 | 7 | public extension Palette where Self == RGB { 8 | /// Represents colors in the RGB range 9 | static var rgb: Self { .init() } 10 | } 11 | 12 | public extension Palette where Self == Grayscale { 13 | /// Represents colors in the `neutral` grayscale range 14 | static var grayscale: Self { .init(temperature: .neutral) } 15 | 16 | /// Represents colors in the grayscale range, using the specified temperature 17 | /// - Parameter temperature: The temperature of the value. Defaults to `neutral` 18 | static func grayscale(_ temperature: Grayscale.Temperature) -> Self { .init(temperature: temperature) } 19 | } 20 | 21 | public extension Palette where Self == System { 22 | /// Represents system colors on the current platform (e.g. systemRed, systemBlue, etc.). These colors are well suited for both light/dark modes (where applicable) 23 | static var system: Self { .init() } 24 | } 25 | 26 | public extension Palette where Self == HSB { 27 | /// Represents colors in the HSB range where the saturation is `0.7` and brightness is `0.9` 28 | static var hue: Self { .init(saturation: nil, brightness: nil) } 29 | 30 | /// Represents colors in the HSB range with the specified saturation and brightness 31 | /// - Parameters: 32 | /// - saturation: The saturation value to apply in the range `0...1`. Defaults to `0.7` 33 | /// - brightness: The brightness value to apply in the range `0...1`. Defaults to `0.9` 34 | static func hue(saturation: CGFloat? = nil, brightness: CGFloat? = nil) -> Self { 35 | .init(saturation: saturation, brightness: brightness) 36 | } 37 | } 38 | 39 | /// Represents colors in the RGB range 40 | public struct RGB: Palette { 41 | public var color: Color { 42 | let r = (0...255).randomElement()! 43 | let g = (0...255).randomElement()! 44 | let b = (0...255).randomElement()! 45 | 46 | let red = CGFloat(r) / 255 47 | let green = CGFloat(g) / 255 48 | let blue = CGFloat(b) / 255 49 | 50 | return Color(red: red, green: green, blue: blue) 51 | } 52 | } 53 | 54 | /// Represents colors in the grayscale range 55 | public struct Grayscale: Palette { 56 | public enum Temperature: Hashable { 57 | case warm 58 | case neutral 59 | case cool 60 | } 61 | 62 | let temperature: Temperature 63 | 64 | public var color: Color { 65 | let d = (5...250).randomElement()! 66 | let delta = CGFloat(d) / 255 67 | 68 | switch temperature { 69 | case .neutral: 70 | let b = (2...98).randomElement()! 71 | let delta = CGFloat(b) / 100 72 | return Color(white: delta) 73 | case .cool: 74 | return Color(red: delta - 0.005, green: delta + 0.016, blue: delta + 0.032) 75 | case .warm: 76 | return Color(red: delta + 0.016, green: delta + 0.016, blue: delta) 77 | } 78 | } 79 | } 80 | 81 | /// Represents system colors on the current platform (e.g. systemRed, systemBlue, etc.). These colors are well suited for both light/dark modes (where applicable) 82 | public struct System: Palette { 83 | public var color: Color { 84 | #if os(iOS) || os(tvOS) 85 | var colors: [UIColor] = [ 86 | .systemRed, .systemBlue, .systemPink, .systemTeal, 87 | .systemBrown, .systemIndigo, .systemOrange, 88 | .systemPurple, .systemIndigo, .systemGreen, .systemYellow 89 | ] 90 | 91 | if #available(iOS 15, tvOS 15, *) { 92 | colors.append(contentsOf: [.systemCyan, .systemMint]) 93 | } 94 | 95 | return Color(colors.randomElement()!) 96 | #elseif os(watchOS) 97 | var colors: [UIColor] = [ 98 | .red, .green, .blue, .cyan, .yellow, 99 | .magenta, .orange, .purple, .brown 100 | ] 101 | 102 | return Color(colors.randomElement()!) 103 | #else 104 | let colors: [NSColor] = [ 105 | .systemRed, .systemGreen, .systemBlue, .systemOrange, 106 | .systemYellow, .systemBrown, .systemPink, .systemPurple, 107 | .systemMint, .systemTeal, .systemIndigo 108 | ] 109 | 110 | return Color(colors.randomElement()!) 111 | #endif 112 | } 113 | } 114 | 115 | /// Represents colors in the HSB range 116 | public struct HSB: Palette { 117 | let saturation: CGFloat? 118 | let brightness: CGFloat? 119 | 120 | public var color: Color { 121 | let h = (0...360).randomElement()! 122 | let hue = CGFloat(h) / 360 123 | return Color(hue: hue, saturation: saturation ?? 0.7, brightness: brightness ?? 0.9) 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /Sources/Lorem/Source/String.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public extension Lorem where Content == String { 4 | typealias L = Lorem 5 | 6 | /// Returns a placeholder for representing a single word 7 | static var word: String { 8 | words(1) 9 | } 10 | 11 | /// Returns a placeholder for representing the specified number of words 12 | /// - Parameters: 13 | /// - count: The number of times a word should be generated 14 | /// - separator: The separator to use when composing these words 15 | static func words(_ count: Int, separator: String = " ") -> String { 16 | Composer(L.Data.words.randomElement()!, count: count, separator: separator) 17 | } 18 | 19 | /// Returns a placeholder for representing the specified number of words 20 | /// - Parameters: 21 | /// - countRange: The number of times a word should be generated, the actual count will be a random value in the provided range 22 | /// - separator: The separator to use when composing these words 23 | static func words(_ countRange: ClosedRange, separator: String = " ") -> String { 24 | Composer(L.Data.words.randomElement()!, countRange: countRange, separator: separator) 25 | } 26 | 27 | /// Returns a placeholder for representing a title, containing 2 to 5 words 28 | static var title: String { 29 | let wordsInTitle = (2...5).randomElement()! 30 | return words(wordsInTitle).capitalized 31 | } 32 | 33 | /// Returns a placeholder for representing a title, containing the specified number of words 34 | static func title(_ count: Int) -> String { 35 | words(count).capitalized 36 | } 37 | 38 | /// Returns a placeholder for representing a title, containing the specified number of words 39 | /// - Parameter countRange: The number of times a word should be generated, the actual count will be a random value in the provided range 40 | static func title(_ countRange: ClosedRange) -> String { 41 | words(countRange).capitalized 42 | } 43 | 44 | /// Returns a placeholder for representing a person's first name 45 | static var firstName: String { 46 | L.Data.firstNames.randomElement()! 47 | } 48 | 49 | /// Returns a placeholder for representing a person's last name 50 | static var lastName: String { 51 | L.Data.lastNames.randomElement()! 52 | } 53 | 54 | /// Returns a placeholder for representing a person's name 55 | static var name: String { 56 | "\(firstName) \(lastName)" 57 | } 58 | 59 | /// Returns a placeholder for representing a single sentence, containing 5 to 10 words 60 | static var sentence: String { 61 | Composer(word, countRange: 5...10, separator: " ", terminator: ".").capitalizingFirstLetter 62 | } 63 | 64 | /// Returns a placeholder for representing the specified number of sentences 65 | /// - Parameters: 66 | /// - count: The number of times a sentence should be generated 67 | /// - separator: The separator to use when composing these sentences 68 | static func sentences(_ count: Int, separator: String = " ") -> String { 69 | Composer(sentence, count: count, separator: separator) 70 | } 71 | 72 | /// Returns a placeholder for representing the specified number of sentences 73 | /// - Parameters: 74 | /// - countRange: The number of times a sentence should be generated, the actual count will be a random value in the provided range 75 | /// - separator: The separator to use when composing these sentences 76 | static func sentences(_ countRange: ClosedRange, separator: String = " ") -> String { 77 | Composer(sentence, countRange: countRange, separator: separator) 78 | } 79 | 80 | /// Returns a placeholder for representing a single paragraph, containing 2 to 5 sentences 81 | static var paragraph: String { 82 | sentences(2...5) 83 | } 84 | 85 | /// Returns a placeholder for representing the specified number of paragraphs 86 | /// - Parameters: 87 | /// - count: The number of times a paragraph should be generated 88 | /// - separator: The separator to use when composing these paragraphs 89 | static func paragraphs(_ count: Int, separator: String = "\n") -> String { 90 | Composer(paragraph, count: count, separator: separator) 91 | } 92 | 93 | /// Returns a placeholder for representing the specified number of paragraphs 94 | /// - Parameters: 95 | /// - count: The number of times a paragraph should be generated, the actual count will be a random value in the provided range 96 | /// - separator: The separator to use when composing these paragraphs 97 | static func paragraphs(_ countRange: ClosedRange, separator: String = "\n") -> String { 98 | Composer(paragraph, countRange: countRange, separator: separator) 99 | } 100 | 101 | /// Returns a placeholder URL 102 | static var url: String { 103 | "http://" + L.Data.siteDomains.randomElement()! + "/" 104 | } 105 | 106 | /// Returns a placeholder email address 107 | static var email: String { 108 | let delimiter = ["", ".", "-", "_"].randomElement()! 109 | let domain = L.Data.emailDomains.randomElement()! 110 | return (firstName + delimiter + lastName + "@" + domain).lowercased() 111 | } 112 | 113 | /// Returns a 140 character placeholder representing a tweet 114 | static var tweet: String { 115 | L.Data.tweets.randomElement()! 116 | } 117 | 118 | /// Returns a set of placeholder keywords, containing 5 to 10 words 119 | static var keywords: String { 120 | Composer(word, countRange: 5...10, separator: ", ") 121 | } 122 | 123 | /// Returns a set of placeholder keywords for representing the specified number of words 124 | /// - Parameter count: The number of times a word should be generated 125 | static func keywords(_ count: Int) -> String { 126 | Composer(word, count: count, separator: ", ") 127 | } 128 | 129 | /// Returns a set of placeholder keywords for representing the specified number of words 130 | /// - Parameter countRange: The number of times a word should be generated, the actual count will be a random value in the provided range 131 | static func keywords(_ countRange: ClosedRange) -> String { 132 | Composer(word, countRange: countRange, separator: ", ") 133 | } 134 | 135 | /// Returns a placeholder date, within the past 20 years, using the ISO8601 format 136 | static var date: Content { 137 | date(within: 20, component: .year, format: .iso8601) 138 | } 139 | 140 | /// Returns a placeholder date, within the past 20 years, using the specified format 141 | /// - Parameter format: The format to apply to the date 142 | static func date(_ format: DateFormat) -> String { 143 | date(within: 20, component: .year, format: format) 144 | } 145 | 146 | /// Returns a placeholder date using the specified configuration 147 | /// - Parameters: 148 | /// - value: The value to use to offset the calendar component 149 | /// - component: The calendar component to offset 150 | /// - locale: The locale the `Calendar` should use 151 | /// - format: The format to apply to the date 152 | static func date(within value: Int, component: DateComponent, locale: Locale = .init(identifier: "en_US_POSIX"), format: DateFormat) -> String { 153 | let date = Lorem.date(within: value, component: component, locale: locale) 154 | return Lorem.formatter(format: format).string(for: date) ?? "" 155 | } 156 | 157 | /// Returns a placeholder age for an adult 158 | static var age: Content { 159 | age(for: .adult) 160 | } 161 | 162 | /// Returns a placeholder age within the specified age-group 163 | static func age(for group: AgeGroup) -> Content { 164 | let age = Lorem.age(for: group) 165 | return "\(age)" 166 | } 167 | 168 | /// Returns a placeholder age from the specified reference 169 | static func age(year: Int) -> Content { 170 | let age = Lorem.age(year: year) 171 | return "\(age)" 172 | } 173 | 174 | } 175 | -------------------------------------------------------------------------------- /Sources/Lorem/Source/SystemImage.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | @available(iOS 13, tvOS 13, macOS 11, watchOS 6, *) 4 | public extension Lorem where Content == String { 5 | /// Returns a random SF-Symbol image name 6 | static var systemImage: String { 7 | Symbol.names.randomElement() ?? "" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Sources/Lorem/Source/Text.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | public extension Lorem where Content == Text { 4 | 5 | /// Returns a placeholder for representing a title 6 | static var title: Content { 7 | .init(Lorem.title) 8 | } 9 | 10 | /// Returns a placeholder for representing a title, containing the specified number of words 11 | /// - Parameter count: The number of times a word should be generated 12 | static func title(_ count: Int) -> Content { 13 | .init(Lorem.title(count)) 14 | } 15 | 16 | /// Returns a placeholder for representing a title, containing the specified number of words 17 | /// - Parameter countRange: The number of times a word should be generated, the actual count will be a random value in the provided range 18 | static func title(_ countRange: ClosedRange) -> Content { 19 | .init(Lorem.title(countRange)) 20 | } 21 | 22 | /// Returns a placeholder for representing a person's first name 23 | static var firstName: Content { 24 | .init(Lorem.firstName) 25 | } 26 | 27 | /// Returns a placeholder for representing a person's last name 28 | static var lastName: Content { 29 | .init(Lorem.lastName) 30 | } 31 | 32 | /// Returns a placeholder for representing a person's name 33 | static var name: Content { 34 | .init(Lorem.name) 35 | } 36 | 37 | /// Returns a placeholder for representing a single sentence 38 | static var sentence: Content { 39 | .init(Lorem.sentence) 40 | } 41 | 42 | /// Returns a placeholder for representing the specified number of sentences 43 | /// - Parameters: 44 | /// - count: The number of times a sentence should be generated 45 | /// - separator: The separator to use when composing these sentences 46 | static func sentences(_ count: Int, separator: String = "\n") -> Content { 47 | .init(Lorem.sentences(count, separator: separator)) 48 | } 49 | 50 | /// Returns a placeholder for representing the specified number of sentences 51 | /// - Parameters: 52 | /// - countRange: The number of times a sentence should be generated, the actual count will be a random value in the provided range 53 | /// - separator: The separator to use when composing these sentences 54 | static func sentences(_ countRange: ClosedRange, separator: String = " ") -> Content { 55 | .init(Lorem.sentences(countRange, separator: separator)) 56 | } 57 | 58 | /// Returns a placeholder for representing a single paragraph 59 | static var paragraph: Content { 60 | .init(Lorem.paragraph) 61 | } 62 | 63 | /// Returns a placeholder for representing the specified number of paragraphs 64 | /// - Parameters: 65 | /// - count: The number of times a paragraph should be generated 66 | /// - separator: The separator to use when composing these paragraphs 67 | static func paragraphs(_ count: Int, separator: String = "\n") -> Content { 68 | .init(Lorem.paragraphs(count, separator: separator)) 69 | } 70 | 71 | /// Returns a placeholder for representing the specified number of paragraphs 72 | /// - Parameters: 73 | /// - count: The number of times a paragraph should be generated, the actual count will be a random value in the provided range 74 | /// - separator: The separator to use when composing these paragraphs 75 | static func paragraphs(_ countRange: ClosedRange, separator: String = "\n") -> Content { 76 | .init(Lorem.paragraphs(countRange, separator: separator)) 77 | } 78 | 79 | /// Returns a placeholder URL 80 | static var url: Content { 81 | .init(Lorem.url) 82 | } 83 | 84 | /// Returns a placeholder email address 85 | static var email: Content { 86 | .init(Lorem.email) 87 | } 88 | 89 | /// Returns a 140 character placeholder representing a tweet 90 | static var tweet: Content { 91 | .init(Lorem.tweet) 92 | } 93 | 94 | /// Returns a set of placeholder keywords, containing 5 to 10 words 95 | static var keywords: Content { 96 | .init(Lorem.keywords) 97 | } 98 | 99 | /// Returns a set of placeholder keywords for representing the specified number of words 100 | /// - Parameter count: The number of times a word should be generated 101 | static func keywords(_ count: Int) -> Content { 102 | .init(Lorem.keywords(count)) 103 | } 104 | 105 | /// Returns a set of placeholder keywords for representing the specified number of words 106 | /// - Parameter countRange: The number of times a word should be generated, the actual count will be a random value in the provided range 107 | static func keywords(_ countRange: ClosedRange) -> Content { 108 | .init(Lorem.keywords(countRange)) 109 | } 110 | 111 | /// Returns a placeholder date, within the past 20 years, using the ISO8601 format 112 | static var date: Content { 113 | .init(Lorem.date(.iso8601)) 114 | } 115 | 116 | /// Returns a placeholder date, within the past 20 years, using the specified format 117 | /// - Parameter format: The format to apply to the date 118 | static func date(format: DateFormat) -> Content { 119 | .init(Lorem.date(format)) 120 | } 121 | 122 | /// Returns a placeholder date with the specified configuration 123 | /// - Parameters: 124 | /// - value: The value to use to offset the calendar component 125 | /// - component: The calendar component to offset 126 | /// - locale: The locale the `Calendar` should use 127 | /// - format: The format to apply to the date 128 | static func date(within value: Int, component: DateComponent, locale: Locale = .init(identifier: "en_US_POSIX"), format: DateFormat) -> Content { 129 | .init(Lorem.date(within: value, component: component, locale: locale, format: format)) 130 | } 131 | 132 | /// Returns a placeholder year between 1900 and the current year 133 | static var year: Content { 134 | .init("\(Lorem.year)") 135 | } 136 | 137 | /// Returns a placeholder year in the specified range 138 | static func year(in range: ClosedRange) -> Content { 139 | return Text("\(Lorem.number(in: range))") 140 | } 141 | 142 | /// Returns a placeholder age for an adult 143 | static var age: Content { 144 | age(for: .adult) 145 | } 146 | 147 | /// Returns a placeholder age within the specified age-group 148 | static func age(for group: AgeGroup) -> Content { 149 | let age = Lorem.age(for: group) 150 | return Text("\(age)") 151 | } 152 | 153 | /// Returns a placeholder age from the specified reference 154 | static func age(year: Int) -> Content { 155 | let age = Lorem.age(year: year) 156 | return Text("\(age)") 157 | } 158 | 159 | } 160 | -------------------------------------------------------------------------------- /Sources/Lorem/Source/URL.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import CoreGraphics 3 | 4 | public extension Lorem where Content == URL { 5 | 6 | /// Returns a placeholde URL 7 | static var url: Content { 8 | .init(string: Lorem.url)! 9 | } 10 | 11 | /// Returns a placeholder email address 12 | static var email: Content { 13 | .init(string: Lorem.email)! 14 | } 15 | 16 | /// Returns a placeholder image URL using the `picsum.photos` API 17 | static var image: Content { 18 | image(source: .random, size: 300, grayscale: false) 19 | } 20 | 21 | /// Returns a placeholder image URL using the `picsum.photos` API 22 | /// - Parameters: 23 | /// - source: The image source to specify when generating the URL 24 | /// - size: The desired size, for both width and height, for this placeholder 25 | /// - grayscale: If `true`, the URL will specify a grayscale variant should be provided 26 | static func image(source: ImageSource, size: CGFloat, grayscale: Bool) -> URL { 27 | image(source: source, size: .init(width: size, height: size), grayscale: grayscale) 28 | } 29 | 30 | /// Returns a placeholder image URL using the `picsum.photos` API 31 | /// - Parameters: 32 | /// - source: The image source to specify when generating the URL 33 | /// - size: The desired size for this placeholder 34 | /// - grayscale: If `true`, the URL will specify a grayscale variant should be provided 35 | static func image(source: ImageSource, size: CGSize, grayscale: Bool) -> URL { 36 | var comps = URLComponents(string: "https://picsum.photos")! 37 | var queries: [URLQueryItem] = [] 38 | 39 | if grayscale { 40 | queries.append(.init(name: "grayscale", value: nil)) 41 | } 42 | 43 | comps.queryItems = queries 44 | 45 | var url = comps.url! 46 | 47 | switch source { 48 | case let .seed(seed): 49 | url.appendPathComponent("seed") 50 | url.appendPathComponent("\(seed)") 51 | case .random: 52 | break 53 | } 54 | 55 | return url 56 | .appendingPathComponent("\(Int(size.width))") 57 | .appendingPathComponent("\(Int(size.height))") 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /Sources/Lorem/Support/Data.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension Lorem where Content == String { 4 | public enum Data { } 5 | } 6 | 7 | public extension Lorem.Data where Content == String { 8 | 9 | /// The source `words` used to generate composed Lorem Ipsum 10 | static let words: [String] = { 11 | "alias consequatur aut perferendis sit voluptatem accusantium doloremque aperiam eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo aspernatur aut odit aut fugit sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt neque dolorem ipsum quia dolor sit amet consectetur adipisci velit sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem ut enim ad minima veniam quis nostrum exercitationem ullam corporis nemo enim ipsam voluptatem quia voluptas sit suscipit laboriosam nisi ut aliquid ex ea commodi consequatur quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae et iusto odio dignissimos ducimus qui blanditiis praesentium laudantium totam rem voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident sed ut perspiciatis unde omnis iste natus error similique sunt in culpa qui officia deserunt mollitia animi id est laborum et dolorum fuga et harum quidem rerum facilis est et expedita distinctio nam libero tempore cum soluta nobis est eligendi optio cumque nihil impedit quo porro quisquam est qui minus id quod maxime placeat facere possimus omnis voluptas assumenda est omnis dolor repellendus temporibus autem quibusdam et aut consequatur vel illum qui dolorem eum fugiat quo voluptas nulla pariatur at vero eos et accusamus officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae itaque earum rerum hic tenetur a sapiente delectus ut aut reiciendis voluptatibus maiores doloribus asperiores repellat" 12 | .components(separatedBy: " ") 13 | }() 14 | 15 | /// The source `firstNames` used to generate composed Lorem Ipsum 16 | static let firstNames: [String] = { 17 | "Judith Angelo Margarita Kerry Elaine Lorenzo Justice Doris Raul Liliana Kerry Elise Ciaran Johnny Moses Davion Penny Mohammed Harvey Sheryl Hudson Brendan Brooklynn Denis Sadie Trisha Jacquelyn Virgil Cindy Alexa Marianne Giselle Casey Alondra Angela Katherine Skyler Kyleigh Carly Abel Adrianna Luis Dominick Eoin Noel Ciara Roberto Skylar Brock Earl Dwayne Jackie Hamish Sienna Nolan Daren Jean Shirley Connor Geraldine Niall Kristi Monty Yvonne Tammie Zachariah Fatima Ruby Nadia Anahi Calum Peggy Alfredo Marybeth Bonnie Gordon Cara John Staci Samuel Carmen Rylee Yehudi Colm Beth Dulce Darius inley Javon Jason Perla Wayne Laila Kaleigh Maggie Don Quinn Collin Aniya Zoe Isabel Clint Leland Esmeralda Emma Madeline Byron Courtney Vanessa Terry Antoinette George Constance Preston Rolando Caleb Kenneth Lynette Carley Francesca Johnnie Jordyn Arturo Camila Skye Guy Ana Kaylin Nia Colton Bart Brendon Alvin Daryl Dirk Mya Pete Joann Uriel Alonzo Agnes Chris Alyson Paola Dora Elias Allen Jackie Eric Bonita Kelvin Emiliano Ashton Kyra Kailey Sonja Alberto Ty Summer Brayden Lori Kelly Tomas Joey Billie Katie Stephanie Danielle Alexis Jamal Kieran Lucinda Eliza Allyson Melinda Alma Piper Deana Harriet Bryce Eli Jadyn Rogelio Orlaith Janet Randal Toby Carla Lorie Caitlyn Annika Isabelle inn Ewan Maisie Michelle Grady Ida Reid Emely Tricia Beau Reese Vance Dalton Lexi Rafael Makenzie Mitzi Clinton Xena Angelina Kendrick Leslie Teddy Jerald Noelle Neil Marsha Gayle Omar Abigail Alexandra Phil Andre Billy Brenden Bianca Jared Gretchen Patrick Antonio Josephine Kyla Manuel Freya Kellie Tonia Jamie Sydney Andres Ruben Harrison Hector Clyde Wendell Kaden Ian Tracy Cathleen Shawn" 18 | .components(separatedBy: " ") 19 | }() 20 | 21 | /// The source `lastNames` used to generate composed Lorem Ipsum 22 | static let lastNames: [String] = { 23 | "Chung Chen Melton Hill Puckett Song Hamilton Bender Wagner McLaughlin McNamara Raynor Moon Woodard Desai Wallace Lawrence Griffin Dougherty Powers May Steele Teague Vick Gallagher Solomon Walsh Monroe Connolly Hawkins Middleton Goldstein Watts Johnston Weeks Wilkerson Barton Walton Hall Ross Chung Bender Woods Mangum Joseph Rosenthal Bowden Barton Underwood Jones Baker Merritt Cross Cooper Holmes Sharpe Morgan Hoyle Allen Rich Rich Grant Proctor Diaz Graham Watkins Hinton Marsh Hewitt Branch Walton O'Brien Case Watts Christensen Parks Hardin Lucas Eason Davidson Whitehead Rose Sparks Moore Pearson Rodgers Graves Scarborough Sutton Sinclair Bowman Olsen Love McLean Christian Lamb James Chandler Stout Cowan Golden Bowling Beasley Clapp Abrams Tilley Morse Boykin Sumner Cassidy Davidson Heath Blanchard McAllister McKenzie Byrne Schroeder Griffin Gross Perkins Robertson Palmer Brady Rowe Zhang Hodge Li Bowling Justice Glass Willis Hester Floyd Graves Fischer Norman Chan Hunt Byrd Lane Kaplan Heller May Jennings Hanna Locklear Holloway Jones Glover Vick O'Donnell Goldman McKenna Starr Stone McClure Watson Monroe Abbott Singer Hall Farrell Lucas Norman Atkins Monroe Robertson Sykes Reid Chandler Finch Hobbs Adkins Kinney Whitaker Alexander Conner Waters Becker Rollins Love Adkins Black Fox Hatcher Wu Lloyd Joyce Welch Matthews Chappell MacDonald Kane Butler Pickett Bowman Barton Kennedy Branch Thornton McNeill Weinstein Middleton Moss Lucas Rich Carlton Brady Schultz Nichols Harvey Stevenson Houston Dunn West O'Brien Barr Snyder Cain Heath Boswell Olsen Pittman Weiner Petersen Davis Coleman Terrell Norman Burch Weiner Parrott Henry Gray Chang McLean Eason Weeks Siegel Puckett Heath Hoyle Garrett Neal Baker Goldman Shaffer Choi Carver" 24 | .components(separatedBy: " ") 25 | }() 26 | 27 | /// The source `siteDomains` used to generate composed Lorem Ipsum 28 | static let siteDomains: [String] = { 29 | "twitter.com google.com youtube.com wordpress.org adobe.com blogspot.com godaddy.com wikipedia.org wordpress.com yahoo.com linkedin.com amazon.com flickr.com w3.org apple.com myspace.com tumblr.com digg.com microsoft.com vimeo.com pinterest.com qq.com stumbleupon.com youtu.be addthis.com miibeian.gov.cn delicious.com baidu.com feedburner.com bit.ly facebook.com meta.com" 30 | .components(separatedBy: " ") 31 | }() 32 | 33 | /// The source `emailDomains` used to generate composed Lorem Ipsum 34 | static let emailDomains: [String] = { 35 | "gmail.com yahoo.com hotmail.com email.com live.com me.com mac.com aol.com fastmail.com mail.com" 36 | .components(separatedBy: " ") 37 | }() 38 | 39 | /// The source `tweets` used to generate composed Lorem Ipsum 40 | static let tweets: [String] = { 41 | [ 42 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque interdum rutrum sodales. Nullam mattis fermentum libero, non volutpat.", 43 | "Far away, in a forest next to a river beneath the mountains, there lived a small purple otter called Philip. Philip likes sausages. The End.", 44 | "He liked the quality sausages from Marks & Spencer but due to the recession he had been forced to shop in a less desirable supermarket. End.", 45 | "He awoke one day to find his pile of sausages missing. Roger the greedy boar with human eyes, had skateboarded into the forest & eaten them!", 46 | ] 47 | }() 48 | } 49 | 50 | public extension Lorem where Content: BinaryInteger { 51 | static func number(in range: R) -> Content where R: Collection, R.Element == Content { 52 | range.randomElement()! 53 | } 54 | } 55 | 56 | public extension Lorem where Content: BinaryFloatingPoint { 57 | static func number(in range: R) -> Content where R: Collection, R.Element == Content { 58 | range.randomElement()! 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Sources/Lorem/Support/Helpers.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension String { 4 | var capitalizingFirstLetter: String { 5 | guard !isEmpty else { return self } 6 | return prefix(1).capitalized + dropFirst() 7 | } 8 | } 9 | 10 | public extension Lorem where Content == String { 11 | 12 | /// Composes strings, using the specified separator and terminator to generate more complex `String` representations 13 | /// - Parameters: 14 | /// - value: An autoclosure that's excuted for each `count` allowing you to provide a unique string value to be composed 15 | /// - count: The number of `value`'s to add to the composed `String` 16 | /// - separator: The separator used to form the composed string 17 | /// - terminator: The terminator used to suffix the string 18 | static func Composer(_ value: @autoclosure () -> String, count: Int, separator: String, terminator: String = "") -> Content { 19 | var result = "" 20 | 21 | for index in 0.. String, countRange: ClosedRange, separator: String, terminator: String = "") -> Content { 40 | var result = "" 41 | let count = countRange.randomElement() ?? 1 42 | 43 | for index in 0..