Inspector Spacing

About this component

Inspector Spacing

Settings row for the four edges of a box: the row carries a CSS-shorthand summary, and opens a cross where each field sits on the edge it sets, tied together or not.

Usage

The import and the props worth knowing about, in one place.

import { InspectorSpacing } from "@/components/beste/component/inspector-spacing";

// Uncontrolled. The row reads "16 24 px"; the cross opens on click, and the link
// toggle in its middle starts on when all four edges already match.
<InspectorSpacing label="Padding" defaultValue={{ top: 16, right: 24, bottom: 16, left: 24 }} suffix="px" />

// Controlled, with a separate commit for expensive work
<InspectorSpacing
  label="Margin"
  value={margin}
  onValueChange={setMargin}                             // every accepted keystroke
  onValueCommit={(value) => console.log("persist", value)} // Enter or blur
  min={0}
  max={128}
  step={4}
  suffix="px"
/>

<InspectorSpacing
  label="Inset"
  icon={Frame}           // optional leading icon
  linked={linked}        // take the link state over, if it belongs to your state
  onLinkedChange={setLinked}
  onOpenChange={(open) => console.log("editor open:", open)}
  value={inset}
  onValueChange={setInset}
  tone="outline"         // "muted" (default) | "outline" | "ghost"
  size="sm"              // "sm" | "default" | "lg"
/>

// Always four edges, no tie-together toggle
<InspectorSpacing label="Border width" hideLink max={12} value={border} onValueChange={setBorder} />

Keyboard and gestures

Every one of these is in the component already. They are listed because a props table cannot mention a gesture, so nothing else on this page can tell you they exist.

Arrow Up / DownOne step on the focused edge.
Shift + ArrowTen steps.
EnterAccept what was typed into the field.
EscapeThrow the draft away and put the committed value back.
The link toggleTies the four edges together; typing into one then writes all four.

Props

Read from the component's own type, so this cannot drift from what it accepts.

PropTypeDefaultDescription
label*string—Label rendered on the left, inside the row.
iconLucideIcon—Optional leading icon shown before the label.
valuePartial<Record<EdgeKey, number>>—Controlled value. Pair it with `onValueChange`.
defaultValuePartial<Record<EdgeKey, number>>—Initial value in uncontrolled mode.
onValueChange(value: SpacingValue) => void—Fires on every accepted keystroke and every step.
onValueCommit(value: SpacingValue) => void—Fires once an edit is finished — Enter, or leaving a field.
onOpenChange(open: boolean) => void—Fires when the editor opens or closes.
minnumber0Smallest value an edge may hold.
maxnumber999Largest value an edge may hold.
stepnumber1Amount one arrow key press moves an edge.
suffixstring—Muted unit after the summary, e.g. "px", "rem".
defaultLinkedboolean—Start with the edges tied together. Defaults to on when the incoming value already has four equal edges, which is the usual starting point.
linkedboolean—Controlled link state, if the toggle belongs to your own state.
onLinkedChange(linked: boolean) => void—
hideLinkboolean—Drop the link toggle and always edit the four edges separately.
disabledboolean—Block interaction and dim the row.
tone"muted" | "outline" | "ghost""muted"Surface treatment: filled (default), hairline outline, or bare until hover.
size"sm" | "default" | "lg""default"Row height preset.
classNamestring—
aria-labelstring—Accessible name for the group. Falls back to `label`.

More Inspector components

View all Inspector