Aether 💫
@aethers.world
20 | design engineer | ex-apple maps intrn | building @KyoSchoolApp + whatever else feels fun
Backporting Glass Container effects to iOS 18 👀, uses the exact same API as 26, just drops in
September 28, 2025 at 5:04 AM
Backporting Glass Container effects to iOS 18 👀, uses the exact same API as 26, just drops in
Excited to reintroduce Garnish, a Swift Package for intelligent contrast in your UI. Great for accessibility and visual harmony.
→ github.com/Aeastr/Garnish
Still early development, bugs may be present, open to feedback
→ github.com/Aeastr/Garnish
Still early development, bugs may be present, open to feedback
August 6, 2025 at 7:19 AM
Excited to reintroduce Garnish, a Swift Package for intelligent contrast in your UI. Great for accessibility and visual harmony.
→ github.com/Aeastr/Garnish
Still early development, bugs may be present, open to feedback
→ github.com/Aeastr/Garnish
Still early development, bugs may be present, open to feedback
Portal is a SwiftUI package for seamless transitions between views – across navigation pushes, sheets, and more – built around a flexible portal metaphor.
July 31, 2025 at 3:20 AM
Portal is a SwiftUI package for seamless transitions between views – across navigation pushes, sheets, and more – built around a flexible portal metaphor.
Big update for Portal! Portal now uses modern iOS 17 APIs, with fallbacks for previous versions, as well as an improved API with more customization and smoother text animations
→ github.com/Aeastr/Portal
→ github.com/Aeastr/Portal
July 31, 2025 at 3:20 AM
Big update for Portal! Portal now uses modern iOS 17 APIs, with fallbacks for previous versions, as well as an improved API with more customization and smoother text animations
→ github.com/Aeastr/Portal
→ github.com/Aeastr/Portal
new update for NotchMyProblem💙(position content around the iPhone's cutout)
improved compatibility across devices – padding, bounds, etc. now auto-adjust for the space, and added new APIs for configuring behavior + improved naming
github.com/Aeastr/Notch...
improved compatibility across devices – padding, bounds, etc. now auto-adjust for the space, and added new APIs for configuring behavior + improved naming
github.com/Aeastr/Notch...
July 31, 2025 at 3:16 AM
new update for NotchMyProblem💙(position content around the iPhone's cutout)
improved compatibility across devices – padding, bounds, etc. now auto-adjust for the space, and added new APIs for configuring behavior + improved naming
github.com/Aeastr/Notch...
improved compatibility across devices – padding, bounds, etc. now auto-adjust for the space, and added new APIs for configuring behavior + improved naming
github.com/Aeastr/Notch...
Sticker filters in Deco 1.1, soon
June 2, 2025 at 7:12 PM
Sticker filters in Deco 1.1, soon
new package ⚡ MenuWithAView – a SwiftUI package that lets you add an accessory view to your context menu interactions in addition to the standard menu content, using UIKit's private _UIContextMenuAccessoryView.
github.com/Aeastr/MenuW...
github.com/Aeastr/MenuW...
May 12, 2025 at 10:17 PM
new package ⚡ MenuWithAView – a SwiftUI package that lets you add an accessory view to your context menu interactions in addition to the standard menu content, using UIKit's private _UIContextMenuAccessoryView.
github.com/Aeastr/MenuW...
github.com/Aeastr/MenuW...
Neat update for Portal 🌀
.portalTransition now takes in item, meaning you can trigger transitions using the same declarative, data-driven pattern as SwiftUI's .sheet(item:...)
github.com/Aeastr/Portal
.portalTransition now takes in item, meaning you can trigger transitions using the same declarative, data-driven pattern as SwiftUI's .sheet(item:...)
github.com/Aeastr/Portal
April 29, 2025 at 9:23 AM
Neat update for Portal 🌀
.portalTransition now takes in item, meaning you can trigger transitions using the same declarative, data-driven pattern as SwiftUI's .sheet(item:...)
github.com/Aeastr/Portal
.portalTransition now takes in item, meaning you can trigger transitions using the same declarative, data-driven pattern as SwiftUI's .sheet(item:...)
github.com/Aeastr/Portal
check the voice branch for one that literally does yap
April 25, 2025 at 12:08 AM
check the voice branch for one that literally does yap
April 25, 2025 at 12:08 AM
Would you prefer a more dense sticker grid in deco?
April 23, 2025 at 9:06 PM
Would you prefer a more dense sticker grid in deco?
Small thing used in Deco & Kyo
github.com/Aeastr/Glyph...
github.com/Aeastr/Glyph...
April 23, 2025 at 2:13 AM
Small thing used in Deco & Kyo
github.com/Aeastr/Glyph...
github.com/Aeastr/Glyph...
Portal (github.com/Aeastr/Portal) makes really cool interactions possible, can't wait to ship this
April 22, 2025 at 8:18 PM
Portal (github.com/Aeastr/Portal) makes really cool interactions possible, can't wait to ship this
Sticker Capturing coming soon to Deco, little sneak peak 👀
April 22, 2025 at 4:03 AM
Sticker Capturing coming soon to Deco, little sneak peak 👀
April 22, 2025 at 1:18 AM
When animate flips to true, it drives the overlay to animate from source → destination. When animate flips back to false, it reverses the animation. This overlay is only visible during the transition, the views attached to source and destination are show when the transition finishes
April 21, 2025 at 11:51 PM
When animate flips to true, it drives the overlay to animate from source → destination. When animate flips back to false, it reverses the animation. This overlay is only visible during the transition, the views attached to source and destination are show when the transition finishes
Each uses anchors to capture its view’s bounding rect in the parent coordinate space, storing it in a shared array keyed by it's ID.
Wherever you want to trigger the move (often on the parent container of your sheet or navigation), you call portalTransition(id: "X", ..) {}
Wherever you want to trigger the move (often on the parent container of your sheet or navigation), you call portalTransition(id: "X", ..) {}
April 21, 2025 at 11:51 PM
Each uses anchors to capture its view’s bounding rect in the parent coordinate space, storing it in a shared array keyed by it's ID.
Wherever you want to trigger the move (often on the parent container of your sheet or navigation), you call portalTransition(id: "X", ..) {}
Wherever you want to trigger the move (often on the parent container of your sheet or navigation), you call portalTransition(id: "X", ..) {}
You mark exactly the two views you want to animate:
.portalSource(id: "X") on the “leaving” view
.portalDestination(id: "X") on the “arriving” view
.portalSource(id: "X") on the “leaving” view
.portalDestination(id: "X") on the “arriving” view
April 21, 2025 at 11:51 PM
You mark exactly the two views you want to animate:
.portalSource(id: "X") on the “leaving” view
.portalDestination(id: "X") on the “arriving” view
.portalSource(id: "X") on the “leaving” view
.portalDestination(id: "X") on the “arriving” view