[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-6889":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":14,"stars90d":16,"forks30d":16,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":31,"readmeContent":32,"aiSummary":33,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":34,"discoverSource":35},6889,"Pow","EmergeTools\u002FPow","EmergeTools","Delightful SwiftUI effects for your app","https:\u002F\u002Fmovingparts.io\u002Fpow",null,"Swift",4307,191,19,16,0,2,7,28.85,"MIT License",false,"main",[24,25,26,27,28,29,30],"animation","effects","ios","particles","swift","swiftui","transitions","2026-06-12 02:01:31","![](.\u002Fimages\u002Fog-image.png)\n\n# Pow\n\n[![](https:\u002F\u002Fimg.shields.io\u002Fendpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FEmergeTools%2FPow%2Fbadge%3Ftype%3Dswift-versions)](https:\u002F\u002Fswiftpackageindex.com\u002FEmergeTools\u002FPow)\n[![](https:\u002F\u002Fimg.shields.io\u002Fendpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FEmergeTools%2FPow%2Fbadge%3Ftype%3Dplatforms)](https:\u002F\u002Fswiftpackageindex.com\u002FEmergeTools\u002FPow)\n[![](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdynamic\u002Fjson?url=https%3A%2F%2Fwww.emergetools.com%2Fapi%2Fv2%2Fpublic_new_build%3FexampleId%3Dpow.Pow%26platform%3Dios%26badgeOption%3Dversion_and_max_install_size%26buildType%3Drelease&query=$.badgeMetadata&label=Pow&logo=apple)](https:\u002F\u002Fwww.emergetools.com\u002Fapp\u002Fexample\u002Fios\u002Fpow.Pow\u002Frelease?utm_campaign=badge-data)\n\nDelightful SwiftUI effects for your app. \n\n[Check out other open source projects from Emerge Tools](https:\u002F\u002Fwww.emergetools.com\u002Fopen-source)\n\n# Installation\n\nTo add a package dependency to your Xcode project, select _File_ > _Add Package_ and enter this repository's URL (https:\u002F\u002Fgithub.com\u002FEmergeTools\u002FPow).\n\nTo add a package dependency to Swift Package, add this repository to your list of dependencies.\n```swift\n.package(url: \"https:\u002F\u002Fgithub.com\u002FEmergeTools\u002FPow\", from: Version(1, 0, 0))\n```\n\nAnd to your target as a product:\n```swift\n.product(name: \"Pow\", package: \"Pow\")\n```\n\nIf you are moving from the previously closed source Pow framework to the new open source package, please refer to our [Transition Guide](). If you have any problems please file an [issue](https:\u002F\u002Fgithub.com\u002FEmergeTools\u002FPow\u002Fissues).\n\n# Overview\n\nPow features a selection of [SwiftUI transitions](#transitions) as well as [Change Effects](#change-effects) that trigger every time a value is updated.\n\nYou can find previews of all effects [on the Pow website](https:\u002F\u002Fmovingparts.io\u002Fpow). If you have an iOS Developer Environment, you can check out the [Pow Example App](https:\u002F\u002Fgithub.com\u002FEmergeTools\u002FPow\u002Ftree\u002Fmain\u002FExample).\n\n# Feedback & Contribution\n\nThis project provides multiple forms of delivering feedback to maintainers.\n\nIf you are figuring out how to use about Pow or one of it's effects we ask that you first consult the [effects examples page](https:\u002F\u002Fmovingparts.io\u002Fpow).\n\nIf you still have a question, enhancement, or a way to improve Pow, this project leverages GitHub's [Issues](https:\u002F\u002Fgithub.com\u002FEmergeTools\u002FPow\u002Fissues) to manage your requests. If you find a bug and wish to report it, an issue would be greatly appreciated.\n\n# Requirements\n\n- iOS 15.0+\n- macOS 12.0\n- Mac Catalyst 15.0+\n- visionOS beta 6 (requires Xcode 15.1 beta 3)\n\n## Change Effects\n\nChange Effects are effects that will trigger a visual or haptic every time a value changes.\n\nUse the `changeEffect` modifier and pass in an `AnyChangeEffect` as well as a value to watch for changes.\n\n```swift\nButton {\n    post.toggleLike()\n} label: {\n    Label(post.likes.formatted(), systemName: \"heart.fill\")\n}\n.changeEffect(.spray { heart }, value: post.likes, isEnabled: post.isLiked)\n.tint(post.isLiked ? .red : .gray)\n```\n\nYou can choose from the following Change Effects: [Spray](#spray), [Haptic Feedback](#haptic-feedback), [Jump](#jump), [Ping](#ping), [Rise](#rise), [Shake](#shake), [Shine](#shine), and [Spin](#spin).\n\n### Spray\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#spray)\n\nAn effect that emits multiple particles in different shades and sizes moving up from the origin point.\n\n```swift\nlikeButton\n  .changeEffect(\n    .spray(origin: .center) { Image(systemName: \"heart.fill\") },\n    value: likes\n  )\n```\n\n- Parameters:\n  - `origin`: The origin of the particles.\n  - `layer`: The `ParticleLayer` on which to render the effect, default is `local`.\n  - `particles`: The particles to emit.\n\n```swift\nstatic func spray(origin: UnitPoint = .center, layer: ParticleLayer = .local, @ViewBuilder _ particles: () -> some View) -> AnyChangeEffect\n```\n\n### Haptic Feedback\n\nTriggers haptic feedback to communicate successes, failures, and warnings whenever a value changes.\n\n- `notification`: The feedback type to trigger.\n\n```swift\nstatic func feedback(hapticNotification type: UINotificationFeedbackGenerator.FeedbackType) -> AnyChangeEffect\n```\n\nTriggers haptic feedback to simulate physical impacts whenever a value changes.\n\n- `impact`: The feedback style to trigger.\n\n```swift\nstatic func feedback(hapticImpact style: UIImpactFeedbackGenerator.FeedbackStyle) -> AnyChangeEffect\n```\n\nTriggers haptic feedback to indicate a change in selection whenever a value changes.\n\n```swift\nstatic var feedbackHapticSelection: AnyChangeEffect\n```\n\n### Jump\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#jump)\n\nMakes the view jump the given height and then bounces a few times before settling.\n\n- `height`: The height of the jump.\n\n```swift\nstatic func jump(height: CGFloat) -> AnyChangeEffect\n```\n\n### Ping\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#ping)\n\nAdds one or more shapes that slowly grow and fade-out behind the view.\n\nThe shape will be colored by the current tint style.\n\n- Parameters:\n  - `shape`: The shape to use for the effect.\n  - `count`: The number of shapes to emit.\n\n```swift\n  static func ping(shape: some InsettableShape, count: Int) -> AnyChangeEffect\n```\n\n An effect that adds one or more shapes that slowly grow and fade-out behind the view.\n\n - Parameters:\n   - `shape`: The shape to use for the effect.\n   - `style`: The style to use for the effect.\n   - `count`: The number of shapes to emit.\n\n```swift\nstatic func ping(shape: some InsettableShape, style: some ShapeStyle, count: Int) -> AnyChangeEffect\n```\n\n### Rise\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#rise)\n\nAn effect that emits the provided particles from the origin point and slowly float up while moving side to side.\n\n- Parameters:\n  - `origin`: The origin of the particle.\n  - `layer`: The `ParticleLayer` on which to render the effect, default is `local`.\n  - `particles`: The particles to emit.\n\n```swift\nstatic func rise(origin: UnitPoint = .center, layer: ParticleLayer = .local, @ViewBuilder _ particles: () -> some View) -> AnyChangeEffect\n```\n\n### Shake\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#shake)\n\nShakes the view when a change happens.\n\n```swift\nstatic var shake: AnyChangeEffect\n```\n\nAn effect that shakes the view when a change happens.\n\n- `rate`: The rate of the shake.\n\n```swift\nstatic func shake(rate: ShakeRate) -> AnyChangeEffect\n```\n\n### Shine\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#shine)\n\nHighlights the view with a shine moving over the view.\n\nThe shine moves from the top leading edge to bottom trailing edge.\n\n```swift\nstatic var shine: AnyChangeEffect\n```\n\nHighlights the view with a shine moving over the view.\n\nThe shine moves from the top leading edge to bottom trailing edge.\n\n```swift\nstatic func shine(duration: Double) -> AnyChangeEffect\n```\n\nHighlights the view with a shine moving over the view.\n\nThe angle is relative to the current `layoutDirection`, such that 0° represents sweeping towards the trailing edge and 90° represents sweeping towards the bottom edge.\n\n- Parameters:\n  - `angle`: The angle of the animation.\n  - `duration`: The duration of the animation.\n\n```swift\nstatic func shine(angle: Angle, duration: Double = 1.0) -> AnyChangeEffect\n```\n\n### Sound Effect Feedback\n\nTriggers a sound effect as feedback whenever a value changes.\n\nThis effect will not interrupt or duck any other audio that may be currently playing. This effect is not guaranteed to be triggered; the effect running depends on the user's silent switch position and the current playback device.\n\nTo relay important information to the user, you should always accompany audio effects with visual cues.\n\n- `soundEffect`: The sound effect to trigger.\n\n```swift\nstatic func feedback(_ soundEffect: SoundEffect) -> AnyChangeEffect\n```\n\n### Spin\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#spin)\n\nSpins the view around the given axis when a change happens.\n\n```swift\nstatic var spin: AnyChangeEffect\n```\n\nSpins the view around the given axis when a change happens.\n\n- Parameters:\n  - axis: The x, y and z elements that specify the axis of rotation.\n  - anchor: The location with a default of center that defines a point in 3D space about which the rotation is anchored.\n  - anchorZ: The location with a default of 0 that defines a point in 3D space about which the rotation is anchored.\n  - perspective: The relative vanishing point with a default of 1 \u002F 6 for this rotation.\n\n```swift\nstatic func spin(axis: (x: CGFloat, y: CGFloat, z: CGFloat), anchor: UnitPoint = .center, anchorZ: CGFloat = 0, perspective: CGFloat = 1 \u002F 6) -> AnyChangeEffect\n```\n\n### Delay\n\nEvery change effect can be delayed to trigger the effect after some time. \n\n```swift\nButton(\"Submit\") { \n    \u003C#code#>\n}\n.buttonStyle(.borderedProminent)\n.disabled(name.isEmpty)\n.changeEffect(.shine.delay(1), value: name.isEmpty, isEnabled: !name.isEmpty)\n```\n\n- Parameters:\n  - `delay`: The delay in seconds.\n\n```swift\nfunc delay(_ delay: Double) -> AnyChangeEffect\n```\n\n## Particle Layer\n\nA particle layer is a context in which particle effects draw their particles.\n\nThe `particleLayer(name:)` view modifier wraps the view in a particle layer with the given name.\n\nParticle effects such as `AnyChangeEffect.spray` can render their particles on this position in the view tree to avoid being clipped by their immediate ancestor.\n\nFor example, certain `List` styles may clip their rows. Use `particleLayer(_:)` to render particles on top of the entire `List` or even its enclosing `NavigationStack`.\n\n```swift\nfunc particleLayer(name: AnyHashable) -> some View\n```\n\n## Transitions\n\nAll transitions are namespaced under the `movingParts` static variable, e.g.\n\n```swift\nmyView.transition(.movingParts.anvil)\n```\n\n### Anvil\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#anvil)\n\nA transition that drops the view down from the top with matching haptic feedback.\n\nThe transition is only performed on insertion and takes 1.4 seconds.\n\n```swift\nstatic var anvil: AnyTransition\n```\n\n### Blinds\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#blinds)\n\nA transition that reveals the view as if it was behind window blinds.\n\n```swift\nstatic var blinds: AnyTransition\n```\n\nA transition that reveals the view as if it was behind window blinds.\n\nParameters:\n- `slatWidth`: The width of each slat.\n- `style`: The style of blinds, either `.venetian` or `.vertical`.\n- `isStaggered`: Whether all slats opens at the same time or in sequence.\n\n```swift\nstatic func blinds(slatWidth: CGFloat, style: BlindsStyle = .venetian, isStaggered: Bool = false) -> AnyTransition\n```\n\n### Blur\n\n[Preview ](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#blur)\n\nA transition from blurry to sharp on insertion, and from sharp to blurry\non removal.\n\n```swift\nstatic var blur: AnyTransition\n```\n\n### Boing\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#boing)\n\nA transition that moves the view down with any overshoot resulting in an\nelastic deformation of the view.\n\n```swift\nstatic var boing: AnyTransition\n```\n\nA transition that moves the view from the specified edge on insertion,    \nand towards it on removal, with any overshoot resulting in an elastic    \ndeformation of the view.\n\n```swift\nstatic func boing(edge: Edge) -> AnyTransition\n```\n\n### Clock\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#clock)\n\nA transition using a clockwise sweep around the centerpoint of the view.\n\n```swift\nstatic var clock: AnyTransition\n```\n\nA transition using a clockwise sweep around the centerpoint of the view.\n\n- Parameter `blurRadius`: The radius of the blur applied to the mask.\n\n```swift\nstatic func clock(blurRadius: CGFloat)  -> AnyTransition\n```\n\n### Flicker\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#flicker)\n\nA transition that toggles the visibility of the view multiple times\nbefore settling.\n\n```swift\nstatic var flicker: AnyTransition\n```\n\nA transition that toggles the visibility of the view multiple times\nbefore settling.\n\n- Parameter `count`: The number of times the visibility is toggled.\n\n```swift\nstatic func flicker(count: Int) -> AnyTransition\n```\n\n### Film Exposure\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#film-exposure)\n\nA transition from completely dark to fully visible on insertion, and\nfrom fully visible to completely dark on removal.\n\n```swift\nstatic var filmExposure: AnyTransition\n```\n\n### Flip\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#flip)\n\nA transition that inserts by rotating the view towards the viewer, and\nremoves by rotating the view away from the viewer.\n\n> **Note:**\n> Any overshoot of the animation will result in the view continuing the rotation past the view's normal state before eventually settling.\n\n```swift\nstatic var flip: AnyTransition\n```\n\n### Glare\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#glare)\n\nA transitions that shows the view by combining a diagonal wipe with a\nwhite streak.\n\n```swift\nstatic var glare: AnyTransition\n```\n\nA transitions that shows the view by combining a wipe with a colored\nstreak.\n\nThe angle is relative to the current `layoutDirection`, such that 0°\nrepresents sweeping towards the trailing edge on insertion and 90°\nrepresents sweeping towards the bottom edge.\n\nIn this example, the removal of the view is using a glare with an\nexponential ease-in curve, combined with a anticipating scale animation,\nmaking for a more dramatic exit.\n\n```swift\ninfoBox\n  .transition(\n    .asymmetric(\n      insertion: .movingParts.glare(angle: .degrees(225)),\n      removal: .movingParts.glare(angle: .degrees(45)\n    )\n    .animation(.movingParts.easeInExponential(duration: 0.9))\n        .combined(with:\n          .scale(scale: 1.4)\n            .animation(.movingParts.anticipate(duration: 0.9).delay(0.1)\n        )\n      )\n    )\n  )\n```\n\n- Parameters:\n  - `direction`: The angle of the wipe.\n  - `color`: The color of the glare effect.\n\n```swift\nstatic func glare(angle: Angle, color: Color = .white) -> AnyTransition\n```\n\n### Iris\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#iris)\n\nA transition that takes the shape of a growing circle when inserting,\nand a shrinking circle when removing.\n\n- Parameters:\n  - `origin`: The center point of the circle as it grows or shrinks.\n  - `blurRadius`: The radius of the blur applied to the mask.\n\n```swift\nstatic func iris(origin: UnitPoint = .center, blurRadius: CGFloat = 0) -> AnyTransition\n```\n\n### Move\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#move)\n\nA transition that moves the view from the specified edge of the on\ninsertion and towards it on removal.\n\n```swift\nstatic func move(edge: Edge) -> AnyTransition\n```\n\nA transition that moves the view at the specified angle.\n\nThe angle is relative to the current `layoutDirection`, such that 0° represents animating towards the trailing edge on insertion and 90° represents inserting towards the bottom edge.\n\nIn this example, the view insertion is animated by moving it towards the top trailing corner and the removal is animated by moving it towards the bottom edge.\n\n```swift\nText(\"Hello\")\n  .transition(\n    .asymmetric(\n      insertion: .movingParts.move(angle: .degrees(45)),\n      removal:   .movingParts.move(angle: .degrees(90))\n    )\n  )\n```\n\n- Parameter `angle`: The direction of the animation.\n\n```swift\nstatic func move(angle: Angle) -> AnyTransition\n```\n\n### Pop\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#pop)\n\nA transition that shows a view with a ripple effect and a flurry of\ntint-colored particles.\n\nThe transition is only performed on insertion and takes 1.2 seconds.\n\n```swift\nstatic var pop: AnyTransition\n```\n\nA transition that shows a view with a ripple effect and a flurry of\ncolored particles.\n\nIn this example, the star uses the pop effect only when transitioning\nfrom `starred == false` to `starred == true`:\n\n```swift\nButton {\n  starred.toggle()\n} label: {\n  if starred {\n    Image(systemName: \"star.fill\")\n      .foregroundStyle(.orange)\n      .transition(.movingParts.pop(.orange))\n  } else {\n    Image(systemName: \"star\")\n      .foregroundStyle(.gray)\n      .transition(.identity)\n  }\n}\n```\n\nThe transition is only performed on insertion.\n\n- Parameter `style`: The style to use for the effect.\n\n```swift\nstatic func pop\u003CS: ShapeStyle>(_ style: S) -> AnyTransition\n```\n\n### Poof\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#poof)\n\nA transition that removes the view in a dissolving cartoon style cloud.\n\nThe transition is only performed on removal and takes 0.4 seconds.\n\n```swift\nstatic var poof: AnyTransition\n```\n\n### Rotate3D\n\nA transition that inserts by rotating from the specified rotation, and\nremoves by rotating to the specified rotation in three dimensions.\n\nIn this example, the view is rotated 90˚ about the y axis around\nits bottom edge as if it was rising from lying on its back face:\n\n```swift\nText(\"Hello\")\n  .transition(.movingParts.rotate3D(\n    .degrees(90),\n      axis: (1, 0, 0),\n      anchor: .bottom,\n      perspective: 1.0 \u002F 6.0)\n  )\n```\n\n> **Note:**\n> Any overshoot of the animation will result in the view continuing the rotation past the view's normal state before eventually settling.\n\n- Parameters:\n  - `angle`: The angle from which to rotate the view.\n  - `axis`: The x, y and z elements that specify the axis of rotation.\n  - `anchor`: The location with a default of center that defines a point\n            in 3D space about which the rotation is anchored.\n  - `anchorZ`: The location with a default of 0 that defines a point in 3D\n             space about which the rotation is anchored.\n  - `perspective`: The relative vanishing point with a default of 1 for\n                 this rotation.\n\n```swift\nstatic func rotate3D(_ angle: Angle, axis: (x: CGFloat, y: CGFloat, z: CGFloat), anchor: UnitPoint = .center, anchorZ: CGFloat = 0, perspective: CGFloat = 1) -> AnyTransition\n```\n\n### Snapshot\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#snapshot)\n\nA transition from completely bright to fully visible on insertion, and\nfrom fully visible to completely bright on removal.\n\n```swift\nstatic var snapshot: AnyTransition\n```\n\n### Skid\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#skid)\n\nA transition that moves the view in from its leading edge with any\novershoot resulting in an elastic deformation of the view.\n\n```swift\nstatic var skid: AnyTransition\n```\n\nA transition that moves the view in from the specified edge during\ninsertion and towards it during removal with any overshoot resulting\nin an elastic deformation of the view.\n\n- Parameter `direction`: The direction of the transition.\n\n```swift\nstatic func skid(direction: SkidDirection) -> AnyTransition\n```\n\n### Swoosh\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#swoosh)\n\nA three-dimensional transition from the back of the towards the front\nduring insertion and from the front towards the back during removal.\n\n```swift\nstatic var swoosh: AnyTransition\n```\n\n### Vanish\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#vanish)\n\nA transition that dissolves the view into many small particles.\n\nThe transition is only performed on removal.\n\n> **Note:**\n> This transition will use an ease-out animation with a duration of 900ms if the current `Animation` is `.default`.\n\n```swift\nstatic var vanish: AnyTransition\n```\n\nA transition that dissolves the view into many small particles.\n\nThe transition is only performed on removal.\n\n> **Note:**\n> This transition will use an ease-out animation with a duration of 900ms if the current `Animation` is `.default`.\n\n- Parameter `style`: The style to use for the particles.\n\n```swift\nstatic func vanish\u003CS: ShapeStyle>(_ style: S) -> AnyTransition\n```\n\nA transition that dissolves the view into many small particles following a given shape.\n\nThe transition is only performed on removal.\n\n> **Note:**\n> This transition will use an ease-out animation with a duration of 900ms if the current `Animation` is `.default`.\n\n- Parameter `style`: The style to use for the particles.\n- Parameter `mask`: The mask that determines where particles should be placed.\n- Parameter `eoFill`: A Boolean that indicates whether the shape is interpreted with the even-odd winding number rule.\n\n```swift\nstatic func vanish\u003CT: ShapeStyle, S: Shape>(_ style: T, mask: S, eoFill: Bool = false) -> AnyTransition\n```\n\n### Wipe\n\n[Preview](https:\u002F\u002Fmovingparts.io\u002Fpow\u002F#wipe)\n\nA transition using a sweep from the specified edge on insertion, and\ntowards it on removal.\n\n- Parameters:\n  - `edge`: The edge at which the sweep starts or ends.\n  - `blurRadius`: The radius of the blur applied to the mask.\n\n```swift\nstatic func wipe(edge: Edge, blurRadius: CGFloat = 0) -> AnyTransition\n```\n\nA transition using a sweep at the specified angle.\n\nThe angle is relative to the current `layoutDirection`, such that 0° \nrepresents sweeping towards the trailing edge on insertion and 90° \nrepresents sweeping towards the bottom edge.\n\n- Parameters:\n  - `angle`: The angle of the animation.\n  - `blurRadius`: The radius of the blur applied to the mask.\n\n```swift\nstatic func wipe(angle: Angle, blurRadius: CGFloat = 0) -> AnyTransition\n```\n","Pow 是一个为 SwiftUI 应用提供精美动画效果的库。它提供了丰富的过渡动画和变化效果，能够根据值的变化触发视觉或触觉反馈，极大地增强了应用的交互体验。该库采用 Swift 语言编写，支持 iOS、macOS 和 Mac Catalyst 等多个平台，并且兼容最新的 visionOS。适用于需要提升用户界面动态表现力的各种移动和桌面应用开发场景。","2026-06-11 03:09:25","top_language"]