Settings forms
Settings built from a schema, and every field kind they need: tags, key-value pairs, lists, secrets, hotkeys, JSON, sizes, repeatable rows and tri-state checklists.
01SchemaForm
SchemaForm
Settings drawn from a list of fields. Each field picks its control by kind and sits in a labelled Field, so help and errors are always tied to the control. Fields can depend on others, choices can load from the network with a Retry beside the select, and unknown kinds come from a widgets map.
{}A ranged number can draw as a slider with the number beside it.
A few short choices read better as segments than as a menu.
{}02TagInput
TagInput
Chips plus a combobox. Type to filter, ↑/↓ to move, Enter or a comma to add; Backspace in the empty field removes the last chip. New tags can go through a colour step first.
- Hype
- Clutch
- Raid
- Funny
- Fail
- Sub
- Wholesome
- Rage quit
What happened in this clip.
- @Mods
- @VIPs
- @Subscribers
- @everyone
- @here
- No matching tags.
- Hype
- Raid
- Funny
- Clutch
- Fail
- Sub
- Wholesome
- Rage quit
03KeyValueEditor
KeyValueEditor
Rows of key and value for webhook headers, form fields and lookups. Add, remove and reorder with the buttons or Alt+↑/↓; the same key twice is marked in words.
Used twice
Used twice
Two rows use the same key.
04ListInput
ListInput
A list typed as text. The entries show as chips underneath, so it's clear how the text was read; entries that fail a check are named in words.
3 entries. Separate entries with commas.
- spoiler
- leak
- ending
2 entries. One entry per line.
- Drink some water, {user.name}!
- Hydration check, chat 💧
One picks at random each time.
2 entries. One entry per line.
“not a link”: not a web address
- https://crostream.io
- not a link
05SecretInput
SecretInput
For tokens and keys the server never sends back. The state is spelled out in words under the field (saved, will be replaced, not set), not shown as a dot.
Saved. Leave this empty to keep the saved value.
Saving will replace the saved value.
Not set yet. This is required.
06HotkeyInput
HotkeyInput
Records a key combination: activate it, press the keys. Esc cancels, Backspace clears, plain Tab leaves. Shown as keycaps, read out in words, and problems are explained.
F13–F24 and media keys work alone.
Already used by “Save a Moment”.
07JsonField
JsonField
JSON in the code editor. Invalid text is never thrown away: the problem is named with its line, `invalid` is bindable so Save can wait, and Reset puts the default back.
Code editor. Tab indents; press Escape, then Tab, to move focus out.
Valid JSON.
Code editor. Tab indents; press Escape, then Tab, to move focus out.
Not valid JSON. Line 4: Expected double-quoted property name
08SizeInput
SizeInput
Width × height: scrubbable numbers clamped to a range, an optional aspect lock, a presets menu for the usual canvas sizes, and Reset.
09RepeaterList
RepeaterList
Rows you can add, remove and reorder: by the grip, with the Move buttons, or Alt+↑/↓ on a heading. Every change is announced and focus stays where you were. Rows fold to a one-line summary and are keyed by id, so typing state never jumps.
How the widget's code reads it.
How the widget's code reads it.
How the widget's code reads it.
3 entries. One entry per line.
- Pill
- Block
- Ring
- Outline 1 2px
- Outline 2 6px
10TriStateChecklist
TriStateChecklist
Edit one set of options across many things at once. Each starts as on all, on some (mixed) or on none of the selection; clicking cycles it, and a mixed one can go back to “leave as is”. The result is only the difference.
No changes yet.
11EditableList
EditableList
Manage named things: rename in place, recolour, see how much each is used, and delete with a two-step confirmation that says what happens. Names must be unique.
- Used on 42 clips
- Used on 9 clips
- Used on 17 clips
- Not used yet
12ConditionBuilder
ConditionBuilder
A rule builder: comparisons joined by all or any, nested groups, and “not” on any rule. A rule checks a template or a live value, compares it with operators fitted to its kind, and shows the right control for the value.
{bits} ≥ 100
stream is live or not {user_login} = nightbot or (counter value (headpats) ≥ 10 and {message} contains pat)
Choose what to check