xxshna.ui
V 1.1.0Get started ↗

Number steppers

Increment and decrement a bounded numeric value without a custom input model.

Catalog · 1.1HTML, CSS & optional JSNo runtime dependencies

Live preview

Interactive exampleOpen playground ↗
HTML
<div class="xsh-field xsh-measure">
<label class="xsh-label" for="xsh-quantity">Seats</label>
<div class="xsh-step-input" data-xsh-stepper>
<button class="xsh-button xsh-button--secondary" type="button" aria-label="Remove one seat" data-xsh-step="-1">−</button>
<input id="xsh-quantity" class="xsh-input" type="number" value="4" min="1" max="30" step="1">
<button class="xsh-button xsh-button--secondary" type="button" aria-label="Add one seat" data-xsh-step="1">+</button>
</div>
</div>

Installation & markup

Include the local stylesheet and script once on the page, then place the component inside a data-xsh-ui root. The example above works without a build system.

<link rel="stylesheet" href="/dist/xshna-ui.css">
<div data-xsh-ui>
  <!-- Add the HTML example above -->
</div>
<script defer src="/dist/xshna-ui.js"></script>

Component API

Public classes, attributes and hooks used by this example. Keep the xsh- prefix intact.

IdentifierContract
xsh-step-inputUsed by the example markup and component styles or behavior.
data-xsh-stepperUsed by the example markup and component styles or behavior.
data-xsh-stepUsed by the example markup and component styles or behavior.
minUsed by the example markup and component styles or behavior.
maxUsed by the example markup and component styles or behavior.

Accessibility & keyboard

Buttons respect min/max and change the native number input; keyboard input remains available.

Implementation note. Always enforce numeric boundaries again on the server.

Interaction contract

Behavioral components use the shared delegated runtime; visual-only primitives rely on semantic HTML and CSS. Runtime controls emit bubbling xsh:* CustomEvents; bind application handlers to those events when server persistence, API data or navigation is required.