J3W1 / DESIGN SYSTEM
Segmented control
A short exclusive choice implemented with labelled native radios.
stable · LIGHT DOM · 1.1.0
Light DOM retains static content, native semantics, label relationships and host composition without duplicating controls.
Live variants
default
<j3w1-segmented-control id="example-segmented-control-default"><fieldset class="segmented-control radio-group radio-group-horizontal"><legend class="radio-group-legend">View density</legend><div class="segmented-control-options radio-group-options"><label class="radio-group-option"><span class="radio-group-control"><input class="radio-group-input" type="radio" name="example-segmented-control-default-density" value="compact" checked="" data-demo-focus-target=""><span class="radio-group-dot" aria-hidden="true"></span></span><span class="radio-group-text">Compact</span></label><label class="radio-group-option"><span class="radio-group-control"><input class="radio-group-input" type="radio" name="example-segmented-control-default-density" value="comfortable"><span class="radio-group-dot" aria-hidden="true"></span></span><span class="radio-group-text">Comfortable</span></label></div></fieldset></j3w1-segmented-control>Install and register
Use the exact version. If npm publication is pending, install the release tarball from the installation guide.
npm install --save-exact @j3w1/ui@1.1.0import '@j3w1/ui/tokens.css';
import '@j3w1/ui/styles/segmented-control.css';
import '@j3w1/ui/register/segmented-control';Insert the maintained markup above after loading these imports. Its native children provide accessible names and form behavior; the empty custom tag alone does not create a control.
Copy the complete implementation
npx --package=@j3w1/ui@1.1.0 j3w1-ui copy segmented-control --out ./vendor/j3w1/segmented-controlThe CLI verifies every file before writing and refuses overwrites. Serve the output over HTTP and open index.html. Keep its modules, CSS, tokens and licence notices together.
Public API
attributes
| Name | Type / signature | Meaning |
|---|---|---|
disabled | CustomEvent | Disable the native controls owned by this instance. |
loading | CustomEvent | Mark the primary control busy and prevent duplicate activation. |
properties
| Name | Type / signature | Meaning |
|---|---|---|
disabled | boolean | Delegates disabled state to native children. |
name | string | Native control name; application form keys remain explicit. |
methods
| Name | Type / signature | Meaning |
|---|---|---|
refresh | (): void | Reconnect behavior after replacing native child structure. |
focus | (options?: FocusOptions): void | Focus the first usable native control. |
events
| Name | Type / signature | Meaning |
|---|
Dependencies and verification
Registered components: none. Style dependencies: radio-group.
Package presence establishes an available implementation. Actual passes depend on the tested artifact and environment. Read specification execution evidence; read packed-consumer evidence; inspect the complete state matrix.
Full implementation manifest, API and token dependency closure
Canonical specification
Purpose
Choose one value from a short labelled set using native radios. This changes a value; use tabs for associated content panels. Native names, required checks, disabled fieldsets and form reset are preserved.
Anatomy
- fieldset: Legend names the choice.
- options: Native radios sharing one name, each with a visible label.
States
| State | Presentation | Non-colour channel |
|---|---|---|
| default | Named content on the default surface. | Native text and structure. |
| checked | Selected fill and a check indicator. | Native checked state. |
| focus-visible | Dashed focus ring. | Native keyboard focus position. |
| disabled | Disabled semantic foreground, background and border at full opacity. | Native disabled state blocks activation. |
Keyboard
- Tab / Shift+Tab: Enter the native radio group once and leave it.
- Arrow keys / Space: Use native radio selection and wrapping.
Accessibility
Keep native radios and labels. A checked value has both a visible native indicator and its programmatic checked state. Do not hide all radios from assistive technology or put role=tab on the labels.
Portability
Wrap labels and actions without changing source order. Use logical spacing in RTL. Preserve native target sizes at both densities; only bounded data regions may scroll horizontally. Use equivalent native semantics and approved roles; record any unsupported behavior as a mapping deviation. The host owns application data, persistence, permissions and services.
Non-examples
Unlabelled controls, color-only status, drag-only operations, hidden required instructions, stolen focus or an invented service success.