OverrideInput borders use 2px ridge bronze with a 2px stamped-input shadow in caput; focus adds a 4px outer glow in sienna at 30% alpha.
Every form input rendered in every state, with War Dungeon’s brand treatment. Use this when wiring real forms — contact, account, checkout, newsletter.
Seven single-line text input types. Every state stacked vertically so you can see default through disabled without lifting a finger.
OverrideInput borders use 2px ridge bronze with a 2px stamped-input shadow in caput; focus adds a 4px outer glow in sienna at 30% alpha.
OverrideBrowser validation balloon suppressed; replaced by an inline italic palatino message in sienna with a stamped-roundel exclamation.
OverrideThe mask glyph stays the browser default; ridge depth removed on disabled so the field reads as inert plate, not pressed.
OverrideBrowser numeric keyboard hint preserved on mobile via the native type="tel"; brand treatment is purely visual.
OverrideSame baseline as text; no separate URL adornment in the visual treatment.
OverrideSpinner buttons are left at browser default for the documentation form; the cart line item uses the bespoke cart-line-item__qty stepper instead.
OverrideBrowser’s default clear (×) glyph hidden; the live-search overlay uses its own clear button in site-header__tool chrome.
Five date / time variants. The calendar dropdown receives brand-styled chrome — previews shown on filled state below each panel.
OverrideNative date picker styling varies by browser; brand chrome wraps the field only. The Phase-2 implementation may swap in a JS calendar so the dropdown can carry rivet ornament and sienna day-cell highlights.
OverrideBrowser default time control retained; brand chrome wraps the field only. 24-hour format enforced by locale, not by the brand layer.
OverrideUsed on archival surfaces (creator submission month, release window). Same wrapper chrome as type="date".
OverrideRare control — reserved for league signups and weekly tournament windows. Browser support is uneven; expect to fall back to a custom widget at Phase 2.
OverrideUsed by the Army Builder for scheduled-match metadata. The value is captured in the user’s local time zone and re-projected to UTC server-side.
Three sizes — small (3 rows), medium (6 rows), large (12 rows) — for everything from order notes to creator-spotlight long-form copy.
OverrideVertical resize handle retained; horizontal disabled to preserve column rhythm. Italic placeholder in caput at 55% alpha.
OverrideDefault workshop / contact form size. Pairs with the contact-form-band catalogue block.
OverrideReserved for creator/admin authoring surfaces. Phase 2 may swap the raw textarea for a TinyMCE instance — the wrapper chrome holds.
Selects, checkboxes, radios — with brand-styled custom indicators. Ridge bronze frames, sienna fill on checked, stamped check glyph.
OverrideNative chevron glyph hidden via appearance: none; replaced by a sienna SVG glyph baked into the background image.
OverrideNative <select multiple> behaviour is ergonomically poor; production renders as this stamped option-list pattern with click-to-toggle. Selected rows take sienna fill with white text.
OverrideNative checkbox hidden; the visible indicator is a ridge-bronze stamped square that flips to sienna fill with a white check glyph when checked.
OverrideUse <fieldset> wrapping the group with a <legend> for accessibility; the visual treatment is the same per-row indicator as the single checkbox.
OverrideNative radio hidden; visible indicator is a ridge-bronze stamped circle with a sienna inner dot (with 1px caput ring) when selected.
OverrideProduction checkout uses the catalogue’s shipping-method-option block, which adds price and ETA chrome around the radio — the bare radio shown here is the underlying primitive.
Single-value range and dual-handle price filter. Track in ridge bronze; thumb a stamped brass roundel with hard-edged offset shadow.
OverrideNative <input type="range"> styled via the custom track and thumb wrapper. Phase 2 will wire up the underlying input for keyboard accessibility.
OverrideBuilt on the noUiSlider library at Phase 2; thumb + track wrapper inherits the brand-stamped chrome. Used in the filter-sidebar price filter on shop archives.
Single, multi, and drag-drop. The drag-drop zone is framed with the plated-frame catalogue block + dotted-bronze inner border + stamped-roundel upload glyph.
OverrideNative file control hidden; visible chrome is a sienna stamped button + italic filename strip on white. Caption flips to non-italic liquourice when a file is chosen.
OverrideSame chrome as single-file; the difference is the multiple attribute on the underlying input and the count prefix in the filename strip.
Drop your painted-mini photos here
JPEG or PNG, up to 8 MB each, 8 files max
Release to upload
JPEG or PNG, up to 8 MB each, 8 files max
Press space to browse
JPEG or PNG, up to 8 MB each, 8 files max
3 photos loaded
salamanders-front.jpg, side.jpg, base.jpg · ready to send
Wrong format
Tried to drop a .heic — convert to JPEG and try again
Uploads paused
Workshop reviewers off duty — back at 09:00.
OverrideDrop zone is wrapped in the catalogue’s plated-frame block to keep its visual register identical to creator-portrait and hero media plating. Dotted bronze inner border thickens to solid sienna on focus / error / filled (positive variant).
Colour picker preset to the brand palette swatches, and a documented panel for the hidden field so it doesn’t go unseen.
OverrideNative type="color" is hidden; visible chrome is a ridge-bronze stamped swatch with a monospace hex caption, plus a row of brand-palette preset chips for the operator to click. The selected preset shows a caput outline.
<input type="hidden" name="form_id" value="contact-workshop-v1"> <input type="hidden" name="csrf_token" value="3f7e…d8"> <input type="hidden" name="referrer" value="/learn/how-to/salamanders/">
Hidden fields render zero pixels — included here for developer awareness of their presence in the payload. Always paired with a CSRF token and a form-identifier value so the handler routes correctly.
OverrideNo visual treatment — the brand chrome doesn’t apply. The dark stamped doc card is a developer-affordance pattern, not a runtime control.
Primary, secondary, tertiary, destructive, disabled — each across default / hover / focus / pressed / disabled.
OverrideSienna fill, white modesto-condensed text, 2px ridge bronze border, stamped 2px caput offset shadow. Hover translates the button up-left by 1px and grows the shadow to 3px; pressed re-seats it.
OverrideTransparent fill, ridge-bronze frame, liquourice text. Same shadow profile as primary so the pair sit at the same visual altitude on the page.
OverrideSienna text, underline at 4px offset, no border, no shadow. Reads as a link — reserved for low-stakes secondary actions next to a primary submit.
OverrideCowboy fill, sienna outline + sienna text, leading triangle warning glyph. Always second to a primary “Keep” / “Cancel” in confirmation dialogs.
Four short notes for the Phase-2 developer wiring real forms. Read these before the first <form> ships.
All the form-field chrome on this page is authored in the brand silo at wp-content/themes/war-dungeon/assets/scss/components/_forms.scss — the same tokens declared in the styleguide’s :root are what every input draws from. Don’t override token values inline; if a new ridge width or shadow profile is genuinely needed, add a token first, then reference it from the component file. The state stand-in classes you see in this reference (.ff--hover, .ff--focus, etc.) exist for the reference page only; in real forms the corresponding pseudo-classes (:hover, :focus-visible) and ARIA states ([aria-invalid]) drive the same rules.
Every public-facing form ships with a CSRF token from wp_create_nonce() and a honeypot input named website — rendered offscreen via aria-hidden + tabindex="-1", not display: none (which some bots skip). The handler discards any submission where the honeypot is populated. The token name is _wpnonce; the action is the form’s ID-slug. Account, checkout, and admin forms additionally guard against replay with a 15-minute token TTL.
Error messages render beneath the field they describe, in the italic palatino sienna treatment shown in this reference — never as a toast, never as a popover. The exclamation-roundel glyph is part of the message, not a separate element, so screen-readers announce it inline. Group-level errors (multi-field rules: “Pick at least one chapter”) attach to the <fieldset>’s <legend>. Submit-time errors scroll the first invalid field into view and shift focus to it; in-line edits clear the error as soon as the field validates.
Every input has a real <label> with a for= attribute — placeholders are never used as labels (they vanish on type and fail contrast tests). Required fields take aria-required="true"; invalid ones take aria-invalid="true" and aria-describedby pointing at the error-message ID. Focus order follows DOM order — do not use tabindex values above zero. The focus ring (4px sienna at 30% alpha) is mandatory; suppressing it for visual reasons is a bug, not a preference.
On every order over £75.
No fuss, no formalities.
40K · AoS · Old World · D&D.
Cross-brand loyalty.