DroppyShellMetrics
The geometry Droppy draws its surfaces at.
enum DroppyShellMetrics
Mirrored by hand from the app (NotchLayoutConstants, NotchShelfView, HUDLayoutCalculator); scripts/sync_droppykit.sh does not cover it. A droplet rarely needs these directly, the host owns the outer shape, but a preview does, and so does any content that has to keep clear of a corner.
The one thing to take from this type if you take nothing else: the shell is not one shape. Its top shoulders more than triple when it opens, its bottom corners more than double, and the content insets differ by mode by more than the width of most controls. Laying a surface out against one set of numbers and shipping it is how a widget ends up under a camera housing.
Type properties
closedIslandCornerRadius
static let closedIslandCornerRadius: CGFloat
Corner radius of the at-rest Dynamic Island pill.
expandedHUDBottomRadius
static let expandedHUDBottomRadius: CGFloat
Bottom radius of an expanded HUD's card, which hangs less far than the shelf and curves a little tighter for it.
expandedIslandCornerRadius
static let expandedIslandCornerRadius: CGFloat
Corner radius of the expanded Dynamic Island, a touch softer than the shelf so it reads closer to the phone's capsule.
expandedNotchTopRadius
static let expandedNotchTopRadius: CGFloat
Outward wing radius at the top of ANY expanded notch shell, the shelf, an expanded HUD, a takeover.
Three times the closed radius, and the single biggest reason an expanded preview drawn with the closed number looks wrong. The host interpolates between the two as the shelf opens.
expandedShelfCornerRadius
static let expandedShelfCornerRadius: CGFloat
Bottom radius of the EXPANDED shelf on a notch-styled surface.
expandedShoulderInset
static let expandedShoulderInset: CGFloat
Leading and trailing inset every expanded notch surface keeps, so content clears the 32pt shoulder the shell opens to.
contentPadding (20) + shoulder (32) − the 4pt every nested surface shaves, which is how the host derives it.
islandTopMargin
static let islandTopMargin: CGFloat
Gap the island keeps below the screen's top edge.
Four points, not the menu bar's height. The island is a floating pill tucked right under the edge, and a preview that drops it a menu bar's worth reads as a widget parked in the middle of the desktop.
physicalNotchHeight
static let physicalNotchHeight: CGFloat
Height of a MacBook's physical notch, and the height a notch-styled shell draws at when there is no physical cutout to match.
The host measures the real cutout per display and this is its fallback, so treat it as typical rather than exact. Every derived radius below takes a height for that reason.
shelfFullBleedCornerRadius
static let shelfFullBleedCornerRadius: CGFloat
Corner radius of a card that bleeds to the shell's edge, where it DOES have to answer the shell's curve.
shelfWidgetCornerRadius
static let shelfWidgetCornerRadius: CGFloat
Corner radius of a shelf widget's card, inside the shell.
Deliberately much tighter than the shell's own 40pt: the card is a rectangle in a grid, and matching the shell's curve at this size eats the card's corners rather than echoing them.
Type methods
closedNotchBottomRadius(height:)
static func closedNotchBottomRadius(height: CGFloat = physicalNotchHeight) -> CGFloat
Inward bottom radius of the CLOSED notch, derived the same way and deliberately a little larger than the shoulder.
closedNotchTopRadius(height:)
static func closedNotchTopRadius(height: CGFloat = physicalNotchHeight) -> CGFloat
Outward wing radius at the top of the CLOSED notch shell.
Derived from the cutout's height, clamped to 8...10, because the shell traces hardware and hardware differs: a 13.6" Air's notch is shorter than a 16" Pro's, and a fixed radius reads as a mismatch on one of them.
expandedHUDContentInsets(usesNotchStyle:notchHeight:)
static func expandedHUDContentInsets(usesNotchStyle: Bool, notchHeight: CGFloat = physicalNotchHeight) -> EdgeInsets
Insets between an expanded HUD's shell and its card.
The same shoulders as the shelf, and the same 16pt floor, but the top clears the cutout exactly rather than the cutout plus a gap: a HUD's card is shorter and the extra 10pt the shelf keeps would cost it a row.
shelfContentInsets(usesNotchStyle:notchHeight:)
static func shelfContentInsets(usesNotchStyle: Bool, notchHeight: CGFloat = physicalNotchHeight) -> EdgeInsets
Insets between the expanded SHELF's edge and the widget row inside it.
The two modes are not one number. A notch shelf clears the physical cutout plus a 10pt gap at the top and the 32pt shoulders at the sides; the island has neither and keeps a uniform 16.