Spacing control

Edits top, right, bottom, and left spacing with linked or independent native number fields and explicit units.

Padding

Each side is edited separately.

Give content room

Selected frame

Padding

Each side is edited separately.

Use it for

  • Padding, margin, inset, or other four-sided numeric values in a caller-specified unit.
  • Link sides to apply the next edit to every side; linking alone preserves existing values.
  • value/defaultValue/onValueChange and linked/defaultLinked/onLinkedChange control the values and link state independently.

Not for

  • Converting between units or assuming CSS semantics beyond the supplied numeric fields.
  • Treating cleared values as zero; a cleared side is null.

Three ways in. They share one source, so the pixels match whichever you pick.

1. Import the package

npm install @noorddev/vlak-react

// once, next to your app's root
import "@noorddev/vlak-react/css";

import { SpacingControl } from "@noorddev/vlak-react";

Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/spacing-control.

2. Vendor the source

npx @noorddev/vlak-cli add spacing-control

The StyleX leaf lands in components/vlak/ with its dependencies, for your own compiler to own. See StyleX.

3. Through shadcn

npx shadcn add https://vlak.dev/r/spacing-control.json

The same registry item, installed by shadcn's CLI.

CSS only

<link rel="stylesheet" href="node_modules/@noorddev/vlak/css/vlak.css" />

No React. Link vlak.css and use the markup and classes below.

import { SpacingControl } from "@noorddev/vlak-react";

<SpacingControl label="Padding" name="padding" unit="px" min={0} defaultValue={{ top: 16, right: 24, bottom: 16, left: 24 }} />

SpacingControl

Four native numeric fields; linking applies the next edit to every side.

PropTypeDefaultDescription
labelrequiredReactNode
valueSpacingValue
defaultValueSpacingValueinitial
onValueChange(value: SpacingValue) => void
linkedboolean
defaultLinkedbooleanfalse
onLinkedChange(linked: boolean) => void
unitstring"px"
minnumber
maxnumber
stepnumber1
readOnlyboolean

Also accepts Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, "defaultValue" | "onChange">.

KeysDoes
TabMoves through four number inputs and the link action.
Arrow up, Arrow downUses native number stepping with supplied min, max, and step.
Enter, SpaceToggles Link sides on the focused action.
<fieldset class="rs-spacing-control"><legend class="rs-spacing-control-label">Padding</legend><div class="rs-spacing-control-fields"><label class="rs-spacing-control-field">Top (px)<input class="rs-input rs-input-full rs-spacing-control-input" type="number" value="16" /></label><label class="rs-spacing-control-field">Right (px)<input class="rs-input rs-input-full rs-spacing-control-input" type="number" value="24" /></label><label class="rs-spacing-control-field">Bottom (px)<input class="rs-input rs-input-full rs-spacing-control-input" type="number" value="16" /></label><label class="rs-spacing-control-field">Left (px)<input class="rs-input rs-input-full rs-spacing-control-input" type="number" value="24" /></label></div></fieldset>
.rs-spacing-control.rs-spacing-control-label.rs-spacing-control-fields.rs-spacing-control-field.rs-spacing-control-input.rs-spacing-control-link.rs-spacing-control-linked.rs-spacing-control-note