{"id":21376516,"url":"https://github.com/fluidgroup/fluidinterfacekit","last_synced_at":"2025-09-12T18:33:31.353Z","repository":{"id":38948651,"uuid":"437215377","full_name":"FluidGroup/FluidInterfaceKit","owner":"FluidGroup","description":"🌧 A framework that provides the advanced infrastructure for your iPhone apps","archived":false,"fork":false,"pushed_at":"2024-10-16T23:34:28.000Z","size":26905,"stargazers_count":116,"open_issues_count":5,"forks_count":5,"subscribers_count":5,"default_branch":"main","last_synced_at":"2024-10-29T12:58:49.204Z","etag":null,"topics":["animation","fluid-interface","instagram","ios","transition","ui","uikit"],"latest_commit_sha":null,"homepage":"https://fluidgroup.github.io/FluidInterfaceKit/documentation/fluidinterfacekit/","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/FluidGroup.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}},"created_at":"2021-12-11T07:19:48.000Z","updated_at":"2024-10-16T23:32:03.000Z","dependencies_parsed_at":"2023-11-26T08:27:26.282Z","dependency_job_id":"aea95096-4e0c-4da0-9065-dc155fc37ac2","html_url":"https://github.com/FluidGroup/FluidInterfaceKit","commit_stats":{"total_commits":529,"total_committers":6,"mean_commits":88.16666666666667,"dds":0.03402646502835538,"last_synced_commit":"bfa3d34f25d5c290d448fc2e994c4bc4562947e0"},"previous_names":["muukii/fluidinterfacekit"],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FluidGroup%2FFluidInterfaceKit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FluidGroup%2FFluidInterfaceKit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FluidGroup%2FFluidInterfaceKit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FluidGroup%2FFluidInterfaceKit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FluidGroup","download_url":"https://codeload.github.com/FluidGroup/FluidInterfaceKit/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247369952,"owners_count":20927928,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["animation","fluid-interface","instagram","ios","transition","ui","uikit"],"created_at":"2024-11-22T09:16:02.298Z","updated_at":"2025-04-05T17:09:01.377Z","avatar_url":"https://github.com/FluidGroup.png","language":"Swift","funding_links":["https://www.buymeacoffee.com/muukii"],"categories":[],"sub_categories":[],"readme":"# 🌧 FluidInterfaceKit - A set of frameworks that provides advanced infrastructures for your iPhone apps (UIKit-based)\n\n- FluidCore\n  - A set of utilities\n- FluidRuntime\n  - A runtime library to enable hidden powers\n- FluidGesture\n  - Makes a view draggable\n- FluidKeyboardSupport\n  - Integrates the area of the keyboard with the contents of a view\n- FluidPictureInPicture\n- FluidSnackbar\n- FluidStack\n  - Replacement for UINavigationController\n- FluidStackRideauSupport\n- FluidTooltipSupport\n  - Floating view over the specific point\n  - Displaying any target layer with touch event handling\n\n# FluidStack\n\n**FluidStack** provides the advanced infrastructure for your iPhone apps.  \n\nBuilt on top of UIKit, replace UIKit standard transitions with the custom components.\n\nIt provides components that make your app more flexible - interactive and interruptible transition, free to unwind view controllers without `pop` or `dismiss`.\n\nThat would fit to create fully customized UI apps such as Snapchat, Zenly, Uber, Instagram Threads.\n\nFluidInterfaceKit's essential component is `FluidStackController`, which stacks view controllers with customized transitions.\n\nApps run with this component, only stacking but it can get flexibility instead.\n\n\u003e 💔\n\u003e Please take care of the risks to using this framework; the meaning of using this detaches from Apple's UIKit ecosystem.\nFor instance: the history menu of the back bar button, page-sheet modal, and accessibility.\n\u003e This framework tries to follow the updates of UIKit as long as.\n\n[🔗 **Detailed Documentation**](https://fluidgroup.github.io/FluidInterfaceKit/documentation/fluidinterfacekit/)\n\n# Showcase\n\n|Instagram Threads like | Apple like |\n|---|---|\n|\u003cimg width=200px src=https://user-images.githubusercontent.com/1888355/147848629-031e1c5c-0c52-4674-8d9a-dad034b6e87f.gif /\u003e| \u003cimg width=200px src=https://user-images.githubusercontent.com/1888355/147852736-9e926a14-d30f-40ad-9733-c92546d4f8b6.gif /\u003e |\n\n# Structure of App with FluidStack\n\n\u003cimg width=\"882\" alt=\"CleanShot 2022-02-13 at 01 55 46@2x\" src=\"https://user-images.githubusercontent.com/1888355/153720497-91eff2cc-890c-4b7b-b194-ab558c82829a.png\"\u003e\n\n# Motivation\n\nNormally, UIKit allows us to get screen management with `UIViewController.present`, `UIViewController.dismiss`, `UINavigationController.push`, `UINavigationController.pop`.\n\nIn the case of a view controller that needs to display on modal and navigation, that view controller requires to support both.  \nIn modal, what if it uses `navigationItem`, should be wrapped with `UINavigationController` to display.\n\nMoreover, that view controller would consider how to dismiss itself unless handled by outside.  \nPop or dismiss which depends on the context.\n\n**FluidInterfaceKit** provides `FluidStackController`, which is similar to `UINavigationController`.\nIt offers all of the view controllers that are managed in stacking as a child of the stack.\n\nTry to think of it with what if we're using `UINavigationController`.  \nAll view controllers will display on that, and push to the next view controller, what if needed nesting, push another UINavigationController.  \nExpression of transition would not be a problem, we can create a custom transition, so it can be like a modal presentation - slide in from the bottom.\n\nIf the app runs like that, we only use `push` and `pop` to manage screens except for the special case of using `present` - UIAlertController or other modals in third-party libraries.\nStill, modals work very well since nobody use presentation.\n\nAs above mentioned, `FluidStackController` is similar to `UINavigationController`, it just stacks view controllers that are managed as a child.  \nWhat difference with `UINavigationController` is **transitions**, it provides interfaces to create custom transition and it supports more flexibility.\n\nCustom transitions that run with `UIViewControllerAnimatedTransitioning` have some limitations in modal-presentation and push-transition.  \nIt supports cancellation, which would be a part of flexibility, but it's not enough.\n\nPlease see what happens in iOS Home Screen, it supports completely responding to user interaction - opening an app, canceling opening by Home bar, moving back the home, then opening the app again by touch.\n\n# Setting up your app\n\n**ExampleApp** in this project shows how setting up.  \n**FluidInterfaceKit-Demo** shows a lot of examples.\n\nFirst of all, you need to put a `FluidStackController` in a root view controller for a `UIWindow`.\n\nIn Storyboard based app, set the entry pointed view controller as `FluidStackController` or subclass of it.  \nIn Code based app, set a root view controller of `UIWindow` as `FluidStackController` or subclass of it.  \n\n**`didFinishLaunchingWithOptions` in AppDelegate**\n```swift\nlet newWindow = UIWindow()\n       \nnewWindow.rootViewController = RootViewController()\nnewWindow.makeKeyAndVisible()\n    \nwindow = newWindow\n```\n\n**RootViewController**\n```swift\nfinal class RootViewController: FluidViewController {\n \n  override func viewDidLoad() {\n    super.viewDidLoad()\n    \n    view.backgroundColor = .systemBackground\n    \n    // 📍\n    addContentViewController(FirstViewController(), transition: .disabled)\n  }\n}\n```\n\n**FirstViewController**\n\n```swift\nfinal class FirstViewController: FluidViewController {\n    \n  func runSomething() {\n    fluidPush(SecondViewController(), target: .current, relation: .hierarchicalNavigation)\n  }\n}\n```\n\n**SecondViewController**\n\nTo dismiss itself, call `fluidPop()`\n\n## FluidGesture\n\n![CleanShot 2024-03-29 at 04 11 57](https://github.com/FluidGroup/FluidInterfaceKit/assets/1888355/46087985-a052-4c87-b5ef-d5d0061b1ef9)\n\nMaking a view can be draggable in an easier way.  \nSupports dragging finished animation with moving another position respecting gesture's velocity using spring animation.  \nRubber banding effect is built-in.\n\n```swift\nlet draggableView: UIView\n\ndraggableView.makeDraggable(\n  descriptor: .init(\n    horizontal: .init(min: -200, max: 200, bandLength: 30),\n    vertical: .init(min: -200, max: 200, bandLength: 30),\n    handler: .init(\n      onStartDragging: {\n\n      },\n      onEndDragging: { velocity, offset, contentSize in\n        // return proposed offset to finish dragging\n        return .init(width: 0, height: 0)\n      }\n    )\n  )\n)\n```\n\n[SwiftUI Version](https://github.com/FluidGroup/swiftui-snap-dragging-modifier)\n\n---\n\n[🔗 **Detailed Documentation**](https://fluidgroup.github.io/FluidInterfaceKit/documentation/fluidinterfacekit/)\n\n# Support this projects\n\u003ca href=\"https://www.buymeacoffee.com/muukii\"\u003e\n\u003cimg width=\"120\" alt=\"yellow-button\" src=\"https://user-images.githubusercontent.com/1888355/146226808-eb2e9ee0-c6bd-44a2-a330-3bbc8a6244cf.png\"\u003e\n\u003c/a\u003e\n\n# Muukii sponsors your contributions\n\nI sponsor you with one-time sponsor tiers if you could have contributions.\n- Improvement core components\n- Improvement documentations\n- Growing demo applications\n\n# Authors\n\n- [muukii](https://github.com/muukii)\n- [shima11](https://github.com/shima11)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluidgroup%2Ffluidinterfacekit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffluidgroup%2Ffluidinterfacekit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluidgroup%2Ffluidinterfacekit/lists"}