jixoai-ui
the terminal design language
loading the style sheet…
Skip to content
docs · print medium: screen

registry:ui · Layout

pattern-login — ssh user@host, the card

The `ssh user@host` login card — a composition product, not a primitive: user/host lanes are plain Input (innerInlineStart carries the user@ / --host= glyphs), the passphrase reveal rides the Input's own eye (hard F1 prerequisite — no pattern-local fallback), the OTP second-factor screen rides input-otp (joined form value; incomplete codes submit empty), the submit is a PressButton, and the footer is the copyable npx bootstrap line — the terminal idiom's magic-link analog.

input + innerInlineStart slots input-otp 2FA press-button submit bootstrap copy footer

pattern-login

The login card: the echo line composes the live user@host as you type, the passphrase field carries the Input's own reveal eye (starts hidden — the value is never revealed by default), and the footer is the copyable bootstrap command — the terminal idiom's magic link.

pattern-login-usage.svelte svelte
<script lang="ts">
  import PatternLogin from '@ui/pattern-login.svelte';
  import PatternLoginOtp from '@ui/pattern-login/pattern-login-otp.svelte';
</script>

<PatternLogin host="deploy.jixoai.dev" command="npx jixoai-ui init"
  onsignin={() => gotoOtpStep()} />

<!-- the second factor: the joined code submits through onverify -->
<PatternLoginOtp host="deploy.jixoai.dev" length={6}
  hint="code sent to operator@deploy.jixoai.dev"
  onverify={(code) => verify(code)} />

pattern-login — the 2FA variant

The second-factor screen: input-otp owns the slot mechanics (auto-advance, paste distribution, the joined form value — incomplete codes submit empty, never a partial lie), the verify step is a press-button, and the same card law carries the frame.

pattern-login-usage.svelte svelte
<script lang="ts">
  import PatternLogin from '@ui/pattern-login.svelte';
  import PatternLoginOtp from '@ui/pattern-login/pattern-login-otp.svelte';
</script>

<PatternLogin host="deploy.jixoai.dev" command="npx jixoai-ui init"
  onsignin={() => gotoOtpStep()} />

<!-- the second factor: the joined code submits through onverify -->
<PatternLoginOtp host="deploy.jixoai.dev" length={6}
  hint="code sent to operator@deploy.jixoai.dev"
  onverify={(code) => verify(code)} />

usage

Usage

Two screens, one story: the card signs in, the OTP screen verifies. Pair them by swapping on onsignin.

pattern-login usage
<script lang="ts">
  import PatternLogin from '@ui/pattern-login.svelte';
  import PatternLoginOtp from '@ui/pattern-login/pattern-login-otp.svelte';
</script>

<PatternLogin host="deploy.jixoai.dev" command="npx jixoai-ui init"
  onsignin={() => gotoOtpStep()} />

<!-- the second factor: the joined code submits through onverify -->
<PatternLoginOtp host="deploy.jixoai.dev" length={6}
  hint="code sent to operator@deploy.jixoai.dev"
  onverify={(code) => verify(code)} />

a11y

Accessibility

Every lane is a labeled native input; the echo line is decorative (aria-hidden) so nothing is announced twice; the reveal is the Input's own aria-pressed toggle.

Keyboard

KeyAction
TabWalks user → host → passphrase eye → connect → footer copy in reading order
Enter / SpaceActivates the focused control — the eye flips the type, connect submits, copy hits the clipboard

ARIA

AttributeValueDescription
label[for]every laneuser / host / passphrase each render a real label wired to the native input
aria-hiddentrueOn the decorative ssh echo line — the typed fields are the truth
aria-pressedthe input revealMirrors the passphrase visibility state (starts false — hidden)
error lanesInput error propPass an error string to any lane: aria-invalid + aria-describedby + the dashed ! message line, all the Input's own

axes

Universal props

The eight-axis surface (explicit-props): size · shape · radius · density · color · theme · elevation · motion — each axis takes named steps, auto (inherit the ambient context; stamps nothing), an exact number (px · coefficient · dp · hue per axis), or query() for responsive/container-conditional values. FIRST-TIME contract, all no-own: a composition product — the size axis scales the card root, the Input/PressButton lanes ride the ambient chain (吃也供).

PatternLogin / PatternLoginOtp · universal props

pattern-login-universal.svelte svelte
<PatternLogin size={18} density="small">…</PatternLogin>

api

API

PatternLogin props — plus PatternLoginOtp (the named export) below.

Properties

PropertyTypeDefaultDescription
host string'jixoai.dev'The host the card addresses (echo line + host lane value).
user string''The user lane; bindable — the echo line mirrors it live.
password string''The passphrase lane; bindable. The reveal is the Input's own (default on).
command string'npx jixoai-ui init'The bootstrap footer command — copy payload.
onsignin () => void—Fires on submit; the card never navigates on its own.
children Snippet—Extra lanes between the passphrase and the submit.
class string''Class passthrough to the card root.
PatternLoginOtp: host string'jixoai.dev'The host being verified (hint + echo).
PatternLoginOtp: length number6Slot count of the one-time code.
PatternLoginOtp: value string''The joined code; bindable.
PatternLoginOtp: hint string''One-line context under the slots (where the code was sent).
PatternLoginOtp: onverify (code: string) => void—Fires with the joined code on submit.

Universal props

PropertyTypeDefaultDescription
size'small' | 'medium' | 'large' | 'auto' | number'auto' · ambient scopethe base scale — root font-size; parts size in em
shape'round' | 'scoop' | 'bevel' | 'notch' | 'square' | 'squircle' | 'auto''auto' · ambient scopecorner geometry (CSS corner-shape; §14 degrade table)
radius'small' | 'medium' | 'large' | 'auto' | number'auto' · ambient scopecorner size; auto = the concentric broadcast (§3)
density'small' | 'medium' | 'large' | 'auto' | number'auto' · ambient scopespacing/leading scale over the kernel channels (§4)
color'primary' | 'secondary' | 'error' | 'warn' | 'success' | 'info' | 'auto' | number | string'auto' · ambient scopethe hue axis of the fixed oklch primary system (§5)
theme'light' | 'dark' | 'system' | 'auto''auto' · ambient scopelight/dark profile; system = the JS-mutable global (§6)
elevation'level-1' | 'level0' | 'level1' | 'level2' | 'level3' | 'level4' | 'level5' | 'auto' | number'auto' · ambient scopeofficial M3 levels over the surface ladder (§7)
motion'reduced' | 'subtle' | 'normal' | 'expressive' | 'auto' | number'auto' · ambient scopeintensity across the motion kernels (§8)
jixoai-ui ui.jixoai.com the jixoai design language

Theme

Brand hue

0°

Auto cycle · 24h