---
title: "DroppyNowPlayingPlayer, DroppyKit"
description: "Droppy&#x27;s floating player, the real one: the same view, glass, artwork, controls and lyrics button the floating player and the lock screen draw, showing whatever is playing on the Mac."
canonical: "https://getdroppy.app/docs/droppykit/api/droppy-now-playing-player"
last-updated: "2026-09-09"
---

# DroppyNowPlayingPlayer

Droppy's floating player, the real one: the same view, glass, artwork, controls and lyrics button the floating player and the lock screen draw, showing whatever is playing on the Mac.

`@MainActor struct DroppyNowPlayingPlayer`

Droppy's floating player, the real one: the same view, glass, artwork, controls and lyrics button the floating player and the lock screen draw, showing whatever is playing on the Mac. A droplet that would otherwise draw a now-playing card of its own puts this in its place, so the user sees one player everywhere instead of a look-alike. Since 1.21.0.

The host draws it at the player's own size, `size`; give it that frame and scale it if your layout needs it smaller:

```
if let size = DroppyNowPlayingPlayer.size {
    DroppyNowPlayingPlayer()
        .frame(width: size.width, height: size.height)
} else {
    MyOwnNowPlayingCard()
}
```

`size` is `nil` wherever the host draws no player: the harness, a preview, a Droppy too old to have one. Fall back to your own view then; the player itself draws nothing there.

A droplet that must keep loading on hosts before 1.21.0 can still use it: import DroppyKit with `@_weakLinked`, keep `kit.minAPI` at its old value, and check `#_hasSymbol(DroppyNowPlayingPlayer.self)` before touching it. `droppykit validate` counts a weakly imported symbol as optional.

## Initializers

### init()

`@MainActor init()`

## Type properties

### size

`@MainActor static var size: CGSize? { get }`

The player's size in points, or `nil` where the host draws none.

## Properties

### body

`@MainActor var body: some View { get }`
