---
title: "DroppySettingsLayoutMetrics, DroppyKit"
description: "Shared layout metrics for settings rows and cards."
canonical: "https://getdroppy.app/docs/droppykit/api/droppy-settings-layout-metrics"
last-updated: "2026-09-09"
---

# DroppySettingsLayoutMetrics

Shared layout metrics for settings rows and cards.

`enum DroppySettingsLayoutMetrics`

Every number here is measured against the grouped `Form` System Settings is built from, and Droppy's own Settings pages are that Form now. A one-line row is 36.5pt tall, separated from the next by a 1pt line; text, separators and controls sit 10pt in from the card edge; the card itself is 20pt in from the page edge and draws no border. The legacy card and rows (a pane built before [`DropletSettingsPane`](https://getdroppy.app/docs/droppykit/api/droplet-settings-pane) existed) draw exactly these numbers, so a droplet compiled against an older kit renders the same page as one written the 1.9.0 way. Jordy, on such a droplet's page: "doesn't have the new native style at all? fix that 100%."

The values changed in 1.9.0 (row 38pt on a 6pt inner padding, 11pt text column paid half by a group box). A droplet that composed its own rows from these constants gets the Form's geometry for free through the resilient framework.

## Type properties

### cardContentInset

`static let cardContentInset: CGFloat`

Content inset the card adds inside its edge. Zero: the Form's card is a flat fill with no border and no inner margin, and the rows pay the whole column themselves. Was 5 while the card was a group box.

### cardCornerRadius

`static let cardCornerRadius: CGFloat`

Corner radius of a card. Circular, not continuous: the Form's corner profile matches an 11pt circle to the half pixel at every depth and a continuous corner of any radius does not.

### controlSpacing

`static let controlSpacing: CGFloat`

Spacing between a row's label block and its trailing control.

### dividerLeadingInset

`static let dividerLeadingInset: CGFloat`

Horizontal inset of in-card dividers: the row text column, on both sides, like the Form's separators.

### pageContentReadableMaxWidth

`static let pageContentReadableMaxWidth: CGFloat`

Widest a full settings page's content column grows on a wide window (DroppyKit 0.4.1).

A CEILING, not a width. Droppy resolves the actual column from the live window (base width minus sidebar, floor 380) and only reaches this cap when the user widens the window, so a pane must fill the width the host proposes (`preferredContentWidth`, or the proposed layout width) rather than framing itself at a flat 900. Clamp to this value only when you own the whole page (the harness case), the same rule as `pageHorizontalInset`.

### pageHorizontalInset

`static let pageHorizontalInset: CGFloat`

Horizontal inset of a full settings PAGE's content column: the cards themselves, not the rows inside them.

This is the inset THE HOST applies around every settings page, droplet detail pages included (the grouped Form's own 20pt side inset). Under [`dropletDetail`](https://getdroppy.app/docs/droppykit/api/settings-pane-presentation#droplet-detail) the host has already paid it, so a pane must NOT add it again: a pane that self-applies a page inset renders its cards narrower than every native page beside it. Apply it yourself only when you own the whole page, which is the harness and standalone-tool case.

Was 24 before 0.4.2, which taught exactly that double-inset: the proof-bundle pane rendered 24pt narrower per side than the built-in detail pages the same shop shows. 24 is an info-view-local inset, not a page inset; the Store preserves it rather than applying a negative counter-inset that can push narrow three-column content out of bounds. Was 16 until the host moved to the grouped Form, whose inset is 20.

### pageVerticalInset

`static let pageVerticalInset: CGFloat`

Vertical inset of a full settings page's content column. The host's own value (the grouped Form's top inset); see `pageHorizontalInset` for who pays it.

### pickerTileSpacing

`static let pickerTileSpacing: CGFloat`

Spacing between picker tiles.

### rowMinHeight

`static let rowMinHeight: CGFloat`

Minimum content height of a one-line row; with the vertical padding on both sides it is the Form's 36.5pt row.

### rowPadding

`static let rowPadding: CGFloat`

Horizontal inner padding of a settings row: the Form's 10pt text and control column.

### rowVerticalPadding

`static let rowVerticalPadding: CGFloat`

Vertical inner padding of a settings row. One point less than the column: the Form's row is 36.5pt with a switch or a line of text in it and 39pt with a 21pt value pill, which is 9pt above and below a content floor of 18.5pt, not 10pt around 16.5.

### sectionHeaderLeadingInset

`static let sectionHeaderLeadingInset: CGFloat`

Leading inset of a section header, on the row text column of the card beneath it.

### sectionHeaderSpacing

`static let sectionHeaderSpacing: CGFloat`

Vertical gap between a section header and the card under it: the Form's, measured from the header's line box to the card's top edge.

### sectionSpacing

`static let sectionSpacing: CGFloat`

Vertical gap between two cards in one pane, and between a card and the next section's header: what the Form leaves between sections.

### stackedRowSpacing

`static let stackedRowSpacing: CGFloat`

Vertical spacing between a stacked row's title and its content.
