Settings panel
A two-column settings screen composed from the sidebar-nav, fieldset, switch, select, radio-group, text-field, checkbox and button components; below 600px the sidebar becomes a tab strip.
stable · light DOM · 4.0.0. Light DOM retains static content, native semantics, label relationships and host composition without duplicating controls.
Live variants
default
Example destination: sp keyboard
Example destination: sp notifications
Example destination: sp advanced
<j3w1-settings-panel id="example-settings-panel-default"><form><div class="settings-panel" role="region" aria-labelledby="example-settings-panel-default-sp-title">
<div class="settings-panel-nav">
<nav class="sidebar-nav" aria-label="Settings sections">
<ul class="sidebar-nav-list">
<li class="sidebar-nav-item"><a class="sidebar-nav-link sidebar-nav-current" href="#example-settings-panel-default-sp-appearance" aria-current="page"><span class="sidebar-nav-icon" aria-hidden="true"><svg viewBox="0 0 16 16" width="16" height="16" focusable="false"><rect x="2.5" y="2.5" width="11" height="11"></rect></svg></span><span class="sidebar-nav-label">Appearance</span></a></li>
<li class="sidebar-nav-item"><a class="sidebar-nav-link" href="#example-settings-panel-default-sp-keyboard"><span class="sidebar-nav-icon" aria-hidden="true"><svg viewBox="0 0 16 16" width="16" height="16" focusable="false"><rect x="2.5" y="4.5" width="11" height="7"></rect><path d="M5 8h6"></path></svg></span><span class="sidebar-nav-label">Keyboard</span></a></li>
<li class="sidebar-nav-item"><a class="sidebar-nav-link" href="#example-settings-panel-default-sp-notifications"><span class="sidebar-nav-icon" aria-hidden="true"><svg viewBox="0 0 16 16" width="16" height="16" focusable="false"><path d="M4 11V7a4 4 0 0 1 8 0v4l1 1H3z"></path><path d="M6.5 13.5h3"></path></svg></span><span class="sidebar-nav-label">Notifications</span></a></li>
<li class="sidebar-nav-item"><a class="sidebar-nav-link" href="#example-settings-panel-default-sp-advanced"><span class="sidebar-nav-icon" aria-hidden="true"><svg viewBox="0 0 16 16" width="16" height="16" focusable="false"><path d="M2.5 4h11M2.5 8h11M2.5 12h11"></path></svg></span><span class="sidebar-nav-label">Advanced</span></a></li>
</ul>
</nav>
</div>
<div class="settings-panel-content" role="form" aria-labelledby="example-settings-panel-default-sp-title" id="example-settings-panel-default-sp-appearance">
<h2 class="settings-panel-title" id="example-settings-panel-default-sp-title">Appearance</h2>
<p class="settings-panel-lead">Bar, gaps and labels of the workstation. Changes apply to new windows.</p>
<fieldset class="fieldset settings-panel-group">
<legend class="fieldset-legend">Bar and gaps</legend>
<div class="fieldset-body">
<div class="switch-row">
<span class="switch-name" id="example-settings-panel-default-sp-hide-bar-name">Hide the bar</span>
<j3w1-switch><button class="switch settings-panel-demo-target" type="button" role="switch" aria-checked="false" aria-labelledby="example-settings-panel-default-sp-hide-bar-name">
<span class="switch-track"><span class="switch-thumb"></span></span>
<span class="switch-state" aria-hidden="true"><span class="switch-state-off">Off</span><span class="switch-state-on">On</span></span>
</button></j3w1-switch>
</div>
<div class="switch-row">
<span class="switch-name" id="example-settings-panel-default-sp-smart-gaps-name">Smart gaps</span>
<j3w1-switch><button class="switch" type="button" role="switch" aria-checked="true" aria-labelledby="example-settings-panel-default-sp-smart-gaps-name">
<span class="switch-track"><span class="switch-thumb"></span></span>
<span class="switch-state" aria-hidden="true"><span class="switch-state-off">Off</span><span class="switch-state-on">On</span></span>
</button></j3w1-switch>
</div>
<div class="select">
<label class="select-label" for="example-settings-panel-default-sp-wallpaper">Wallpaper</label>
<div class="select-root">
<select class="select-control" id="example-settings-panel-default-sp-wallpaper" aria-describedby="example-settings-panel-default-sp-wallpaper-help example-settings-panel-default-sp-wallpaper-message" name="example-settings-panel-default-sp-wallpaper">
<option value="black" selected="">black</option>
<option value="ember">ember</option>
<option value="ridge">ridge</option>
</select>
<svg class="select-chevron" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M4 6.5l4 4 4-4"></path></svg>
</div>
<p class="select-help" id="example-settings-panel-default-sp-wallpaper-help">Shown only where no window is.</p>
<p class="select-message" id="example-settings-panel-default-sp-wallpaper-message">✕ Choose a wallpaper.</p>
</div>
<fieldset class="radio-group radio-group-horizontal" aria-describedby="example-settings-panel-default-sp-labels-message">
<legend class="radio-group-legend">Bar labels</legend>
<div class="radio-group-options">
<label class="radio-group-option">
<span class="radio-group-control">
<input class="radio-group-input" type="radio" name="example-settings-panel-default-sp-labels" value="zh" checked="">
<span class="radio-group-dot" aria-hidden="true"></span>
</span>
<span class="radio-group-text" lang="zh">中文</span>
</label>
<label class="radio-group-option">
<span class="radio-group-control">
<input class="radio-group-input" type="radio" name="example-settings-panel-default-sp-labels" value="en">
<span class="radio-group-dot" aria-hidden="true"></span>
</span>
<span class="radio-group-text">English</span>
</label>
</div>
<p class="radio-group-message" id="example-settings-panel-default-sp-labels-message">✕ Choose a language.</p>
</fieldset>
<div class="text-field">
<label class="text-field-label" for="example-settings-panel-default-sp-inner-gap">Inner gap</label>
<div class="text-field-root">
<input class="text-field-input text-field-input-numeric" id="example-settings-panel-default-sp-inner-gap" type="number" value="14" min="0" max="64" step="1" placeholder="0" aria-describedby="example-settings-panel-default-sp-inner-gap-help example-settings-panel-default-sp-inner-gap-message" name="example-settings-panel-default-sp-inner-gap">
<span class="text-field-affix" aria-hidden="true">px</span>
<span class="text-field-loading" aria-hidden="true">⋯</span>
</div>
<p class="text-field-help" id="example-settings-panel-default-sp-inner-gap-help">Pixels between windows; the outer gap follows.</p>
<p class="text-field-message" id="example-settings-panel-default-sp-inner-gap-message">✕ Between 0 and 64.</p>
</div>
<fieldset class="checkbox checkbox-group" aria-describedby="example-settings-panel-default-sp-modules-message">
<legend class="checkbox-legend">Bar modules</legend>
<label class="checkbox-option">
<span class="checkbox-control">
<input class="checkbox-input" type="checkbox" name="example-settings-panel-default-sp-modules" value="cpu" checked="">
<svg class="checkbox-check" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M3.5 8.5l3 3 6-6"></path></svg>
<svg class="checkbox-dash" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M4 8h8"></path></svg>
</span>
<span class="checkbox-text">CPU load</span>
</label>
<label class="checkbox-option">
<span class="checkbox-control">
<input class="checkbox-input" type="checkbox" name="example-settings-panel-default-sp-modules" value="memory" checked="">
<svg class="checkbox-check" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M3.5 8.5l3 3 6-6"></path></svg>
<svg class="checkbox-dash" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M4 8h8"></path></svg>
</span>
<span class="checkbox-text">Memory</span>
</label>
<label class="checkbox-option">
<span class="checkbox-control">
<input class="checkbox-input" type="checkbox" name="example-settings-panel-default-sp-modules" value="battery">
<svg class="checkbox-check" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M3.5 8.5l3 3 6-6"></path></svg>
<svg class="checkbox-dash" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M4 8h8"></path></svg>
</span>
<span class="checkbox-text">Battery</span>
</label>
<p class="checkbox-message" id="example-settings-panel-default-sp-modules-message">✕ Choose at least one module.</p>
</fieldset>
</div>
</fieldset>
<div class="settings-panel-footer">
<button class="button settings-panel-apply" type="submit"><span class="button-loading" aria-hidden="true">⋯</span><span class="button-label">Apply</span></button>
<button class="button button-secondary" type="button"><span class="button-loading" aria-hidden="true">⋯</span><span class="button-label">Reset</span></button>
</div>
</div>
</div></form><p role="status" data-form-status=""></p><p id="example-settings-panel-default-sp-keyboard" tabindex="-1" class="j3w1-example-target">Example destination: sp keyboard</p><p id="example-settings-panel-default-sp-notifications" tabindex="-1" class="j3w1-example-target">Example destination: sp notifications</p><p id="example-settings-panel-default-sp-advanced" tabindex="-1" class="j3w1-example-target">Example destination: sp advanced</p></j3w1-settings-panel>narrow
Example destination: sp keyboard
Example destination: sp notifications
Example destination: sp advanced
<j3w1-settings-panel id="example-settings-panel-narrow"><form><div class="settings-panel settings-panel-narrow" role="region" aria-labelledby="example-settings-panel-narrow-sp-title">
<div class="settings-panel-nav">
<nav class="sidebar-nav" aria-label="Settings sections">
<ul class="sidebar-nav-list">
<li class="sidebar-nav-item"><a class="sidebar-nav-link sidebar-nav-current" href="#example-settings-panel-narrow-sp-appearance" aria-current="page"><span class="sidebar-nav-icon" aria-hidden="true"><svg viewBox="0 0 16 16" width="16" height="16" focusable="false"><rect x="2.5" y="2.5" width="11" height="11"></rect></svg></span><span class="sidebar-nav-label">Appearance</span></a></li>
<li class="sidebar-nav-item"><a class="sidebar-nav-link" href="#example-settings-panel-narrow-sp-keyboard"><span class="sidebar-nav-icon" aria-hidden="true"><svg viewBox="0 0 16 16" width="16" height="16" focusable="false"><rect x="2.5" y="4.5" width="11" height="7"></rect><path d="M5 8h6"></path></svg></span><span class="sidebar-nav-label">Keyboard</span></a></li>
<li class="sidebar-nav-item"><a class="sidebar-nav-link" href="#example-settings-panel-narrow-sp-notifications"><span class="sidebar-nav-icon" aria-hidden="true"><svg viewBox="0 0 16 16" width="16" height="16" focusable="false"><path d="M4 11V7a4 4 0 0 1 8 0v4l1 1H3z"></path><path d="M6.5 13.5h3"></path></svg></span><span class="sidebar-nav-label">Notifications</span></a></li>
<li class="sidebar-nav-item"><a class="sidebar-nav-link" href="#example-settings-panel-narrow-sp-advanced"><span class="sidebar-nav-icon" aria-hidden="true"><svg viewBox="0 0 16 16" width="16" height="16" focusable="false"><path d="M2.5 4h11M2.5 8h11M2.5 12h11"></path></svg></span><span class="sidebar-nav-label">Advanced</span></a></li>
</ul>
</nav>
</div>
<div class="settings-panel-content" role="form" aria-labelledby="example-settings-panel-narrow-sp-title" id="example-settings-panel-narrow-sp-appearance">
<h2 class="settings-panel-title" id="example-settings-panel-narrow-sp-title">Appearance</h2>
<p class="settings-panel-lead">Bar, gaps and labels of the workstation. Changes apply to new windows.</p>
<fieldset class="fieldset settings-panel-group">
<legend class="fieldset-legend">Bar and gaps</legend>
<div class="fieldset-body">
<div class="switch-row">
<span class="switch-name" id="example-settings-panel-narrow-sp-hide-bar-name">Hide the bar</span>
<j3w1-switch><button class="switch settings-panel-demo-target" type="button" role="switch" aria-checked="false" aria-labelledby="example-settings-panel-narrow-sp-hide-bar-name">
<span class="switch-track"><span class="switch-thumb"></span></span>
<span class="switch-state" aria-hidden="true"><span class="switch-state-off">Off</span><span class="switch-state-on">On</span></span>
</button></j3w1-switch>
</div>
<div class="switch-row">
<span class="switch-name" id="example-settings-panel-narrow-sp-smart-gaps-name">Smart gaps</span>
<j3w1-switch><button class="switch" type="button" role="switch" aria-checked="true" aria-labelledby="example-settings-panel-narrow-sp-smart-gaps-name">
<span class="switch-track"><span class="switch-thumb"></span></span>
<span class="switch-state" aria-hidden="true"><span class="switch-state-off">Off</span><span class="switch-state-on">On</span></span>
</button></j3w1-switch>
</div>
<div class="select">
<label class="select-label" for="example-settings-panel-narrow-sp-wallpaper">Wallpaper</label>
<div class="select-root">
<select class="select-control" id="example-settings-panel-narrow-sp-wallpaper" aria-describedby="example-settings-panel-narrow-sp-wallpaper-help example-settings-panel-narrow-sp-wallpaper-message" name="example-settings-panel-narrow-sp-wallpaper">
<option value="black" selected="">black</option>
<option value="ember">ember</option>
<option value="ridge">ridge</option>
</select>
<svg class="select-chevron" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M4 6.5l4 4 4-4"></path></svg>
</div>
<p class="select-help" id="example-settings-panel-narrow-sp-wallpaper-help">Shown only where no window is.</p>
<p class="select-message" id="example-settings-panel-narrow-sp-wallpaper-message">✕ Choose a wallpaper.</p>
</div>
<fieldset class="radio-group radio-group-horizontal" aria-describedby="example-settings-panel-narrow-sp-labels-message">
<legend class="radio-group-legend">Bar labels</legend>
<div class="radio-group-options">
<label class="radio-group-option">
<span class="radio-group-control">
<input class="radio-group-input" type="radio" name="example-settings-panel-narrow-sp-labels" value="zh" checked="">
<span class="radio-group-dot" aria-hidden="true"></span>
</span>
<span class="radio-group-text" lang="zh">中文</span>
</label>
<label class="radio-group-option">
<span class="radio-group-control">
<input class="radio-group-input" type="radio" name="example-settings-panel-narrow-sp-labels" value="en">
<span class="radio-group-dot" aria-hidden="true"></span>
</span>
<span class="radio-group-text">English</span>
</label>
</div>
<p class="radio-group-message" id="example-settings-panel-narrow-sp-labels-message">✕ Choose a language.</p>
</fieldset>
<div class="text-field">
<label class="text-field-label" for="example-settings-panel-narrow-sp-inner-gap">Inner gap</label>
<div class="text-field-root">
<input class="text-field-input text-field-input-numeric" id="example-settings-panel-narrow-sp-inner-gap" type="number" value="14" min="0" max="64" step="1" placeholder="0" aria-describedby="example-settings-panel-narrow-sp-inner-gap-help example-settings-panel-narrow-sp-inner-gap-message" name="example-settings-panel-narrow-sp-inner-gap">
<span class="text-field-affix" aria-hidden="true">px</span>
<span class="text-field-loading" aria-hidden="true">⋯</span>
</div>
<p class="text-field-help" id="example-settings-panel-narrow-sp-inner-gap-help">Pixels between windows; the outer gap follows.</p>
<p class="text-field-message" id="example-settings-panel-narrow-sp-inner-gap-message">✕ Between 0 and 64.</p>
</div>
<fieldset class="checkbox checkbox-group" aria-describedby="example-settings-panel-narrow-sp-modules-message">
<legend class="checkbox-legend">Bar modules</legend>
<label class="checkbox-option">
<span class="checkbox-control">
<input class="checkbox-input" type="checkbox" name="example-settings-panel-narrow-sp-modules" value="cpu" checked="">
<svg class="checkbox-check" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M3.5 8.5l3 3 6-6"></path></svg>
<svg class="checkbox-dash" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M4 8h8"></path></svg>
</span>
<span class="checkbox-text">CPU load</span>
</label>
<label class="checkbox-option">
<span class="checkbox-control">
<input class="checkbox-input" type="checkbox" name="example-settings-panel-narrow-sp-modules" value="memory" checked="">
<svg class="checkbox-check" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M3.5 8.5l3 3 6-6"></path></svg>
<svg class="checkbox-dash" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M4 8h8"></path></svg>
</span>
<span class="checkbox-text">Memory</span>
</label>
<label class="checkbox-option">
<span class="checkbox-control">
<input class="checkbox-input" type="checkbox" name="example-settings-panel-narrow-sp-modules" value="battery">
<svg class="checkbox-check" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M3.5 8.5l3 3 6-6"></path></svg>
<svg class="checkbox-dash" aria-hidden="true" focusable="false" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="square"><path d="M4 8h8"></path></svg>
</span>
<span class="checkbox-text">Battery</span>
</label>
<p class="checkbox-message" id="example-settings-panel-narrow-sp-modules-message">✕ Choose at least one module.</p>
</fieldset>
</div>
</fieldset>
<div class="settings-panel-footer">
<button class="button settings-panel-apply" type="submit"><span class="button-loading" aria-hidden="true">⋯</span><span class="button-label">Apply</span></button>
<button class="button button-secondary" type="button"><span class="button-loading" aria-hidden="true">⋯</span><span class="button-label">Reset</span></button>
</div>
</div>
</div></form><p role="status" data-form-status=""></p><p id="example-settings-panel-narrow-sp-keyboard" tabindex="-1" class="j3w1-example-target">Example destination: sp keyboard</p><p id="example-settings-panel-narrow-sp-notifications" tabindex="-1" class="j3w1-example-target">Example destination: sp notifications</p><p id="example-settings-panel-narrow-sp-advanced" tabindex="-1" class="j3w1-example-target">Example destination: sp advanced</p></j3w1-settings-panel>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@4.0.0import '@j3w1/ui/tokens.css';
import '@j3w1/ui/styles/settings-panel.css';
import '@j3w1/ui/register/settings-panel';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@4.0.0 j3w1-ui copy settings-panel --out ./vendor/j3w1/settings-panelThe 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 |
|---|---|---|
j3w1-submit | CustomEvent | Validated local native form values; the host owns saving. |
Dependencies and verification
Registered components: switch. Style dependencies: button, field, text-field, checkbox, radio-group, select, switch, sidebar-nav, fieldset.
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
Settings panel settings-panel
A two-column settings screen composed from the sidebar-nav, fieldset, switch, select, radio-group, text-field, checkbox and button components; below 600px the sidebar becomes a tab strip.
Report an issue with this component
Tokens
Focus a role to inspect its values; follow its link for persistent usage and source details.
| Part | Role | Value | Use |
|---|---|---|---|
root.bg | color.surface.defaultapproveduse | #0d0707 | D-041 surface.default: color.primitive.modern.panel. |
root.border | color.border.defaultapproveduse | #482b2b | D-041 border.default: color.primitive.modern.divider. |
nav.bg | color.surface.defaultapproveduse | #0d0707 | D-041 surface.default: color.primitive.modern.panel. |
nav.border | color.border.dividerapproveduse | #482b2b | D-041 border.divider: color.primitive.modern.divider. |
nav.text | color.text.defaultapproveduse | #e99499 | D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills. |
nav.current-text | color.text.brightapproveduse | #ffa2a7 | D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills. |
nav.current-indicator | color.border.selected-indicatorobserveduse | #e53935 | 2px indicator bar on the selected tab or nav item. |
nav.bg-hover | color.interaction.hover.bgapproveduse | #1c1010 | D-041 interaction.hover.bg: color.primitive.modern.hover. |
title.text | color.text.brightapproveduse | #ffa2a7 | D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills. |
lead.text | color.text.mutedapproveduse | #d4868b | D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills. |
group.border | color.border.dividerapproveduse | #482b2b | D-041 border.divider: color.primitive.modern.divider. |
group.legend | color.text.brightapproveduse | #ffa2a7 | D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills. |
control.bg | color.surface.inputapproveduse | #000000 | Form-control fill. |
control.border | color.border.controlapproveduse | #c81a1a | D-041 owner correction: red control and floating-frame borders, distinct from rose text. |
control.text | color.text.defaultapproveduse | #e99499 | D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills. |
control.ring | color.interaction.focus.ringobserveduse | #e53935 | 1px dashed focus ring on controls and rows. |
control.checked-bg | color.action.primary.bgapproveduse | #7d1310 | Primary button fill; D-026 darkened it off color12, which stays fixed as heritage ANSI 12. |
control.checked-glyph | color.action.primary.textapproveduse | #ffa2a7 | Primary action labels: bright rose across rest, hover and pressed states (D-033). |
invalid.border | color.status.danger.borderobserveduse | #e53935 | Danger border, 2px on invalid inputs. |
invalid.message | color.status.danger.textobserveduse | #f07178 | D-041 readable error text on neutral surfaces and native warning tints. |
footer.border | color.border.dividerapproveduse | #482b2b | D-041 border.divider: color.primitive.modern.divider. |
apply.bg | color.action.primary.bgapproveduse | #7d1310 | Primary button fill; D-026 darkened it off color12, which stays fixed as heritage ANSI 12. |
apply.text | color.action.primary.textapproveduse | #ffa2a7 | Primary action labels: bright rose across rest, hover and pressed states (D-033). |
apply.busy-glyph | color.action.primary.textapproveduse | #ffa2a7 | Primary action labels: bright rose across rest, hover and pressed states (D-033). |
reset.text | color.action.secondary.textapproveduse | #ffa2a7 | D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills. |
reset.border | color.action.secondary.borderapproveduse | #986f72 | D-041 action.secondary.border: color.primitive.modern.control. |
State matrix
Every declared state and combination, statically rendered; the default cell is live. Sizes: compact, comfortable (switch with the density control above).
| State | Two columns | Narrow (360px) |
|---|---|---|
default | AppearanceBar, gaps and labels of the workstation. Changes apply to new windows. | AppearanceBar, gaps and labels of the workstation. Changes apply to new windows.
Hide the bar
Smart gaps
Shown only where no window is. Pixels between windows; the outer gap follows. |
focus-visible | ||
invalid | ||
busy |
Purpose
Proves the form components compose without new tokens, in every state and at every width; it prescribes no product.
Anatomy
Parts as listed in the anatomy; each uses its component’s own markup and classes.
States
| State | Visual | Non-colour channel |
|---|---|---|
| default | every component’s rest tokens on color.surface.default; the open section carries the indicator bar | aria-current |
| focus-visible | the dashed color.interaction.focus.ring on the focused control (shown on the first switch); others at rest | the ring |
| invalid | the inner-gap field takes the 2px color.status.danger.border and its ✕ message; others at rest | border width 1 → 2px; glyph; aria-invalid |
| busy | Apply shows the static ⋯ glyph in color.action.primary.text; the form carries aria-busy; nothing shrinks or animates | glyph; aria-busy; cursor: progress |
The composed components keep their own hover, checked, disabled and read-only treatments; only the states the screen adds are declared here.
Keyboard
As in the key table. Nothing traps focus and nothing changes on hover alone.
Accessibility
The nav has its own label, so two navigation landmarks on a page stay
distinguishable; the open section is aria-current="page". aria-busy on the form announces the pending Apply without
a live region. Every control has a programmatic label; every message is
linked by aria-describedby. Text meets 4.5:1; control boundaries, the
indicator bar and the danger border 3:1.
Portability
The sidebar width is specimen layout too, not a rule. Toolkits port each contained component through its own mapping and place them with their native layout.
Non-examples
A rounded, shadowed settings card. A Material-style app bar above the form. Pill switches or animated thumbs. Section links as filled tabs instead of the indicator bar. A red form background for invalid. Dimming the controls with opacity while applying. A spinner replacing the Apply label.
Contrast report
15 declared pairs measured on resolved sRGB values with the WCAG 2.x formula; 0 waived (decorative only), 0 failing. A pass is a design target for the named role, not an application-wide conformance claim.
| Pair | State | Kind | Foreground | Background | Ratio | Min | Result |
|---|---|---|---|---|---|---|---|
| settings-panel default text | default | text | color.text.default #e99499 | color.surface.default #0d0707 | 8.72 | 4.5 | pass |
| settings-panel focus-visible text | focus-visible | text | color.text.default #e99499 | color.surface.input #000000 | 9.16 | 4.5 | pass |
| settings-panel focus-visible border | focus-visible | ui | color.border.control #c81a1a | color.surface.input #000000 | 3.62 | 3 | pass |
| settings-panel focus-visible outline | focus-visible | ui | color.interaction.focus.ring #e53935 | color.surface.input #000000 | 4.97 | 3 | pass |
| settings-panel invalid text | invalid | text | color.text.default #e99499 | color.surface.input #000000 | 9.16 | 4.5 | pass |
| settings-panel invalid border | invalid | ui | color.status.danger.border #e53935 | color.surface.input #000000 | 4.97 | 3 | pass |
| settings-panel busy text | busy | text | color.action.primary.text #ffa2a7 | color.action.primary.bg #7d1310 | 5.57 | 4.5 | pass |
| title, legend and the current section on the panel surface | — | text | color.text.bright #ffa2a7 | color.surface.default #0d0707 | 10.45 | 4.5 | pass |
| lead and help text on the panel surface | — | text | color.text.muted #d4868b | color.surface.default #0d0707 | 7.22 | 4.5 | pass |
| validation message on the panel surface | invalid | text | color.status.danger.text #f07178 | color.surface.default #0d0707 | 6.98 | 4.5 | pass |
| current-section indicator bar | — | ui | color.border.selected-indicator #e53935 | color.surface.default #0d0707 | 4.73 | 3 | pass |
| control boundaries on the panel surface | — | ui | color.border.control #c81a1a | color.surface.default #0d0707 | 3.44 | 3 | pass |
| Reset button boundary | — | ui | color.action.secondary.border #986f72 | color.surface.default #0d0707 | 4.62 | 3 | pass |
| panel edge (decorative) | — | ui | color.border.default #482b2b | color.surface.default #0d0707 | 1.58 | 1 | pass |
| sidebar, group and footer rules (decorative) | — | ui | color.border.divider #482b2b | color.surface.default #0d0707 | 1.58 | 1 | pass |
Keys
| Key | Action |
|---|---|
| Tab / Shift+Tab | Walks the section links, then the controls in reading order, then Apply and Reset; nothing inside is a composite widget, so every control is its own stop. |
| Enter / Space | Enter follows a section link; Space toggles a switch or native checkbox; Enter or Space opens the select. |
| Arrow keys | Move within the radio-group and the select's options; step the numeric field. |
| Escape | Nothing; the panel is not a dialog and nothing is dismissed. |
For agents
Component JSON ·Implementation brief ·Build a task kit ·
Related: sidebar-nav fieldset switch select radio-group text-field checkbox button tabs
Stress fixtures: FX-STATE-MATRIX FX-320 FX-360 FX-ZOOM-200 FX-RM FX-HC FX-I18N FX-RTL FX-DENSITY