{"id":32321762,"url":"https://github.com/t-pro/circularrevealkit","last_synced_at":"2026-02-21T20:02:04.501Z","repository":{"id":56905966,"uuid":"88265123","full_name":"T-Pro/CircularRevealKit","owner":"T-Pro","description":"Circular reveal animations made easy","archived":false,"fork":false,"pushed_at":"2026-02-08T01:50:58.000Z","size":6656,"stargazers_count":25,"open_issues_count":0,"forks_count":7,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-02-08T09:43:09.081Z","etag":null,"topics":["cocoapods","material-design","swift5","uinavigationcontroller"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/T-Pro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-04-14T12:18:07.000Z","updated_at":"2026-02-08T01:50:15.000Z","dependencies_parsed_at":"2025-08-02T23:33:24.525Z","dependency_job_id":"f7fcdc0b-cc3f-4993-9202-42b1712ab4b8","html_url":"https://github.com/T-Pro/CircularRevealKit","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/T-Pro/CircularRevealKit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/T-Pro%2FCircularRevealKit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/T-Pro%2FCircularRevealKit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/T-Pro%2FCircularRevealKit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/T-Pro%2FCircularRevealKit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/T-Pro","download_url":"https://codeload.github.com/T-Pro/CircularRevealKit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/T-Pro%2FCircularRevealKit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29691939,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T18:18:25.093Z","status":"ssl_error","status_checked_at":"2026-02-21T18:18:22.435Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cocoapods","material-design","swift5","uinavigationcontroller"],"created_at":"2025-10-23T12:17:08.391Z","updated_at":"2026-02-21T20:02:04.495Z","avatar_url":"https://github.com/T-Pro.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [![CircularRevealKit](./Art/CircularRevealKit.png)](#)\n\n[![Tests](https://github.com/T-Pro/CircularRevealKit/actions/workflows/tests.yml/badge.svg)](https://github.com/T-Pro/CircularRevealKit/actions/workflows/tests.yml)\n[![Version](https://img.shields.io/cocoapods/v/CircularRevealKit.svg?style=flat)](http://cocoapods.org/pods/CircularRevealKit)\n[![License](https://img.shields.io/cocoapods/l/CircularRevealKit.svg?style=flat)](http://cocoapods.org/pods/CircularRevealKit)\n[![Platform](https://img.shields.io/cocoapods/p/CircularRevealKit.svg?style=flat)](http://cocoapods.org/pods/CircularRevealKit)\n[![Swift Package Manager](https://img.shields.io/badge/SPM-compatible-brightgreen.svg?style=flat)](https://swift.org/package-manager/)\n![Swift 5](https://img.shields.io/badge/Swift-5-orange.svg?style=flat)\n\nA lightweight library that brings Material Design's circular reveal effect to iOS. Present and dismiss view controllers or animate individual views with an expanding or contracting circular mask — written entirely in Swift 5.\n\n## Preview\n\n![GIF sample](https://media.giphy.com/media/3cwSEnIK1GJEs/giphy.gif)\n\n## Features\n\n- Circular reveal and unreveal transitions for `UIViewController`\n- Works with both **navigation controller** (push/pop) and **modal** (present/dismiss) flows\n- Circular mask animation on any `UIView`\n- **SwiftUI** support — view modifier, custom transition, and animatable `Shape`\n- Optional fade color overlay between transitions\n- Configurable duration, start frame, and delay\n- **async/await** support alongside closure-based API\n- **ProMotion** support — 120fps animations on capable devices (iOS 15+)\n- Dark Mode compatible (`UIColor.systemBackground`)\n- Zero third-party dependencies\n\n## Requirements\n\n- iOS 13.0+\n- Swift 5.0+\n- Xcode 14+\n\n## Installation\n\n### Swift Package Manager (recommended)\n\nAdd CircularRevealKit to your project via **File \u003e Add Package Dependencies** in Xcode, using the repository URL:\n\n```\nhttps://github.com/T-Pro/CircularRevealKit.git\n```\n\nOr add it to your `Package.swift`:\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/T-Pro/CircularRevealKit.git\", from: \"1.0.0\")\n]\n```\n\n### CocoaPods\n\nAdd the following to your `Podfile`:\n\n```ruby\nplatform :ios, '13.0'\nuse_frameworks!\n\ntarget '\u003cYour Target Name\u003e' do\n  pod 'CircularRevealKit', '~\u003e 1.0.0'\nend\n```\n\nThen run:\n\n```bash\npod install\n```\n\n## Usage\n\nImport the library:\n\n```swift\nimport CircularRevealKit\n```\n\n### Present a View Controller\n\n```swift\nlet detailVC = DetailViewController()\nradialPresent(viewController: detailVC)\n```\n\nWith options:\n\n```swift\nradialPresent(\n    viewController: detailVC,\n    duration: 0.5,\n    startFrame: buttonFrame,\n    fadeColor: .blue,\n    delay: 0.1\n) {\n    print(\"Transition complete\")\n}\n```\n\n### Dismiss a View Controller\n\n```swift\nradialDismiss()\n```\n\nWith options:\n\n```swift\nradialDismiss(fadeColor: .blue, delay: 0.5) {\n    print(\"Dismissed\")\n}\n```\n\n### Animate a View Directly\n\nApply a circular mask animation to any `UIView`:\n\n```swift\nview.drawAnimatedCircularMask(\n    startFrame: originRect,\n    duration: 0.4,\n    revealType: .reveal\n) {\n    print(\"Animation finished\")\n}\n```\n\n### async/await\n\nAll public methods are also available as async alternatives:\n\n```swift\nfunc showDetail() async {\n    let detailVC = DetailViewController()\n    detailVC.modalPresentationStyle = .overCurrentContext\n\n    // Present with circular reveal — suspends until animation finishes\n    await radialPresent(viewController: detailVC, fadeColor: .blue)\n    print(\"Presentation complete\")\n}\n\nfunc closeDetail() async {\n    // Dismiss with circular unreveal — suspends until animation finishes\n    await radialDismiss(fadeColor: .blue, delay: 0.3)\n    print(\"Dismissal complete\")\n}\n```\n\nYou can call these from a `Task` inside any UIKit callback:\n\n```swift\n@objc func buttonTapped() {\n    Task {\n        await showDetail()\n        // This runs only after the animation completes\n    }\n}\n```\n\n### SwiftUI\n\nUse the `.circularReveal` view modifier for state-driven animations:\n\n```swift\nimport SwiftUI\nimport CircularRevealKit\n\nstruct ContentView: View {\n    @State private var showOverlay = false\n    @State private var tapOrigin: CGPoint = .zero\n\n    var body: some View {\n        ZStack {\n            // Your main content\n            Color.blue.ignoresSafeArea()\n\n            Button(\"Reveal\") {\n                showOverlay.toggle()\n            }\n            .font(.title2.bold())\n            .foregroundColor(.white)\n            .background(\n                GeometryReader { geometry in\n                    Color.clear.onAppear {\n                        let frame = geometry.frame(in: .global)\n                        tapOrigin = CGPoint(x: frame.midX, y: frame.midY)\n                    }\n                }\n            )\n\n            // Overlay revealed with circular mask\n            ZStack {\n                Color.orange\n                Text(\"Revealed!\")\n                    .font(.largeTitle.bold())\n                    .foregroundColor(.white)\n            }\n            .ignoresSafeArea()\n            .mask(\n                CircularRevealShape(progress: showOverlay ? 1 : 0, origin: tapOrigin)\n                    .fill(Color.white)\n                    .edgesIgnoringSafeArea(.all)\n            )\n            .allowsHitTesting(showOverlay)\n            .onTapGesture { showOverlay = false }\n        }\n        .animation(.easeInOut(duration: 0.5), value: showOverlay)\n    }\n}\n```\n\nYou can also use the convenience modifier for simpler cases:\n\n```swift\nImage(\"photo\")\n    .circularReveal(isRevealed: isShowing, origin: center)\n```\n\nOr the transition API for conditional views:\n\n```swift\nif showDetail {\n    DetailView()\n        .transition(.circularReveal(from: buttonCenter))\n}\n```\n\n\u003e **Note:** For full-screen reveals that cover the status bar, use `.mask()` with\n\u003e `.edgesIgnoringSafeArea(.all)` on the shape fill as shown above. The convenience\n\u003e modifier and transition handle this automatically.\n\n### ProMotion (120fps)\n\nCircularRevealKit automatically requests high frame rates on ProMotion displays (iOS 15+). To enable 120fps in your app, add this key to your `Info.plist`:\n\n```xml\n\u003ckey\u003eCADisableMinimumFrameDurationOnPhone\u003c/key\u003e\n\u003ctrue/\u003e\n```\n\n\u003e **Note:** This key is required on iPhone. iPad Pro enables 120fps by default.\n\n## Example\n\nTo run the example project, clone the repo and run `pod install` from the `Example` directory:\n\n```bash\ngit clone https://github.com/T-Pro/CircularRevealKit.git\ncd CircularRevealKit/Example\npod install\nopen CircularRevealKit.xcworkspace\n```\n\n## Author\n\nPedro Paulo de Amorim\n\n## Acknowledgments\n\nBased on [RadialTransition_swift](https://github.com/apadalko/RadialTransition_swift) by apadalko.\n\n## License\n\nCircularRevealKit is available under the MIT license. See the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ft-pro%2Fcircularrevealkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ft-pro%2Fcircularrevealkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ft-pro%2Fcircularrevealkit/lists"}