Kodza

Contact Brief

A project request section: tags for what is needed, a budget and a time frame picked on a sliding pill, name and email. A summary of the brief writes itself as you pick; sent, the form rolls into a receipt.

Contact No dependencies project request formproject inquiry formagency contact formbudget selectorsegmented controlmulti select tagsform summaryauto resize textareahoneypot spamcontact form 7 alternative Added Nov 2026
/anim/contact-brief/ GitHub Fullscreen

With your AI

Just ask.

Say it to your AI. It gets the exact code below, not its best guess, and knows where it goes.

Add the Kodza Contact Brief to my page.

Not plugged in yet?
claude mcp add -t http kodza https://kodza.dev/api/mcp
Also in Codex, Cursor and VS Code.
kodza-contact-brief.html
<section class="kodza-contact-brief">
  <div class="kodza-contact-brief__bar">
    <p class="kodza-contact-brief__eyebrow">New project</p>
    <p class="kodza-contact-brief__meta"><span class="kodza-contact-brief__dot" aria-hidden="true"></span>Booking from January</p>
  </div>
  <div class="kodza-contact-brief__head">
    <h2 class="kodza-contact-brief__title">Three clicks. Then we talk.</h2>
    <p class="kodza-contact-brief__lead">Tell us what, how much and when. We come back with questions, not a sales deck.</p>
  </div>
  <div class="kodza-contact-brief__inner">
    <div class="kodza-contact-brief__aside">
      <p class="kodza-contact-brief__key">What happens next</p>
      <ol class="kodza-contact-brief__steps">
        <li class="kodza-contact-brief__step">
          <span class="kodza-contact-brief__num" aria-hidden="true">01</span>
          <p class="kodza-contact-brief__what">We read it.</p>
          <p class="kodza-contact-brief__how">The same day, by the two people who would do the work.</p>
        </li>
        <li class="kodza-contact-brief__step">
          <span class="kodza-contact-brief__num" aria-hidden="true">02</span>
          <p class="kodza-contact-brief__what">A 30-minute call.</p>
          <p class="kodza-contact-brief__how">To see if we fit. No slides.</p>
        </li>
        <li class="kodza-contact-brief__step">
          <span class="kodza-contact-brief__num" aria-hidden="true">03</span>
          <p class="kodza-contact-brief__what">A fixed quote.</p>
          <p class="kodza-contact-brief__how">In writing, within a week. It doesn’t move.</p>
        </li>
      </ol>
      <p class="kodza-contact-brief__key">Rather write?</p>
      <a class="kodza-contact-brief__mail" href="mailto:hello@ferry.studio">hello@ferry.studio</a>
    </div>

    <form class="kodza-contact-brief__form" action="#" method="post">
      <div class="kodza-contact-brief__stage">
        <div class="kodza-contact-brief__panel">
          <fieldset class="kodza-contact-brief__group" data-required data-error="Pick at least one, so we know where to start.">
            <legend class="kodza-contact-brief__key">What do you need?</legend>
            <div class="kodza-contact-brief__tags">
              <label class="kodza-contact-brief__tag"><input class="kodza-contact-brief__check" type="checkbox" name="need" value="Website"><svg class="kodza-contact-brief__tick" viewBox="0 0 14 14" width="14" height="14" aria-hidden="true"><path class="kodza-contact-brief__plus" d="M7 2.5v9M2.5 7h9" /><path class="kodza-contact-brief__mark" d="M2.5 7.5 5.5 10.5 11.5 3.5" pathLength="1" /></svg><span class="kodza-contact-brief__said">Website</span></label>
              <label class="kodza-contact-brief__tag"><input class="kodza-contact-brief__check" type="checkbox" name="need" value="Branding"><svg class="kodza-contact-brief__tick" viewBox="0 0 14 14" width="14" height="14" aria-hidden="true"><path class="kodza-contact-brief__plus" d="M7 2.5v9M2.5 7h9" /><path class="kodza-contact-brief__mark" d="M2.5 7.5 5.5 10.5 11.5 3.5" pathLength="1" /></svg><span class="kodza-contact-brief__said">Branding</span></label>
              <label class="kodza-contact-brief__tag"><input class="kodza-contact-brief__check" type="checkbox" name="need" value="Shop"><svg class="kodza-contact-brief__tick" viewBox="0 0 14 14" width="14" height="14" aria-hidden="true"><path class="kodza-contact-brief__plus" d="M7 2.5v9M2.5 7h9" /><path class="kodza-contact-brief__mark" d="M2.5 7.5 5.5 10.5 11.5 3.5" pathLength="1" /></svg><span class="kodza-contact-brief__said">Shop</span></label>
              <label class="kodza-contact-brief__tag"><input class="kodza-contact-brief__check" type="checkbox" name="need" value="App"><svg class="kodza-contact-brief__tick" viewBox="0 0 14 14" width="14" height="14" aria-hidden="true"><path class="kodza-contact-brief__plus" d="M7 2.5v9M2.5 7h9" /><path class="kodza-contact-brief__mark" d="M2.5 7.5 5.5 10.5 11.5 3.5" pathLength="1" /></svg><span class="kodza-contact-brief__said">App</span></label>
              <label class="kodza-contact-brief__tag"><input class="kodza-contact-brief__check" type="checkbox" name="need" value="Motion"><svg class="kodza-contact-brief__tick" viewBox="0 0 14 14" width="14" height="14" aria-hidden="true"><path class="kodza-contact-brief__plus" d="M7 2.5v9M2.5 7h9" /><path class="kodza-contact-brief__mark" d="M2.5 7.5 5.5 10.5 11.5 3.5" pathLength="1" /></svg><span class="kodza-contact-brief__said">Motion</span></label>
            </div>
          </fieldset>
          <fieldset class="kodza-contact-brief__group" data-required data-error="A rough range is enough. It tells us what to propose.">
            <legend class="kodza-contact-brief__key">Budget</legend>
            <div class="kodza-contact-brief__track">
              <label class="kodza-contact-brief__option"><input class="kodza-contact-brief__radio" type="radio" name="budget" value="Under 5k €"><span class="kodza-contact-brief__said">Under 5k €</span></label>
              <label class="kodza-contact-brief__option"><input class="kodza-contact-brief__radio" type="radio" name="budget" value="5–10k €"><span class="kodza-contact-brief__said">5–10k €</span></label>
              <label class="kodza-contact-brief__option"><input class="kodza-contact-brief__radio" type="radio" name="budget" value="10–20k €"><span class="kodza-contact-brief__said">10–20k €</span></label>
              <label class="kodza-contact-brief__option"><input class="kodza-contact-brief__radio" type="radio" name="budget" value="20k € +"><span class="kodza-contact-brief__said">20k € +</span></label>
            </div>
          </fieldset>
          <fieldset class="kodza-contact-brief__group">
            <legend class="kodza-contact-brief__key">When</legend>
            <div class="kodza-contact-brief__track">
              <label class="kodza-contact-brief__option"><input class="kodza-contact-brief__radio" type="radio" name="when" value="ASAP"><span class="kodza-contact-brief__said">Yesterday</span></label>
              <label class="kodza-contact-brief__option"><input class="kodza-contact-brief__radio" type="radio" name="when" value="1–3 months"><span class="kodza-contact-brief__said">1–3 months</span></label>
              <label class="kodza-contact-brief__option"><input class="kodza-contact-brief__radio" type="radio" name="when" value="3–6 months"><span class="kodza-contact-brief__said">3–6 months</span></label>
              <label class="kodza-contact-brief__option"><input class="kodza-contact-brief__radio" type="radio" name="when" value="No rush"><span class="kodza-contact-brief__said">No rush</span></label>
            </div>
          </fieldset>
          <div class="kodza-contact-brief__fields">
            <label class="kodza-contact-brief__box">
              <input class="kodza-contact-brief__input" type="text" name="name" autocomplete="name" placeholder=" " required>
              <span class="kodza-contact-brief__label">Your name</span>
            </label>
            <label class="kodza-contact-brief__box">
              <input class="kodza-contact-brief__input" type="email" name="email" autocomplete="email" placeholder=" " required>
              <span class="kodza-contact-brief__label">Email</span>
            </label>
            <label class="kodza-contact-brief__box kodza-contact-brief__box--area">
              <textarea class="kodza-contact-brief__input kodza-contact-brief__area" name="message" rows="2" maxlength="1000" placeholder=" "></textarea>
              <span class="kodza-contact-brief__label">Anything else? A link helps.</span>
              <span class="kodza-contact-brief__count" aria-hidden="true"></span>
            </label>
            <label class="kodza-contact-brief__trap" aria-hidden="true">Leave this empty <input type="text" name="website" tabindex="-1" autocomplete="off"></label>
          </div>
          <div class="kodza-contact-brief__brief">
            <p class="kodza-contact-brief__key">Your brief</p>
            <p class="kodza-contact-brief__summary">
              <span class="kodza-contact-brief__slot" data-slot="need" data-empty="What"><span class="kodza-contact-brief__roll"></span></span>
              <span class="kodza-contact-brief__slot" data-slot="budget" data-empty="How much"><span class="kodza-contact-brief__roll"></span></span>
              <span class="kodza-contact-brief__slot" data-slot="when" data-empty="When"><span class="kodza-contact-brief__roll"></span></span>
            </p>
          </div>
          <div class="kodza-contact-brief__foot">
            <p class="kodza-contact-brief__note" aria-live="polite">
              <span class="kodza-contact-brief__help">Two minutes, tops. We ask the rest on the call.</span>
              <span class="kodza-contact-brief__error"></span>
            </p>
            <button class="kodza-contact-brief__send" type="submit"><span class="kodza-contact-brief__word">Send the brief</span><span class="kodza-contact-brief__spinner" aria-hidden="true"></span></button>
          </div>
          <p class="kodza-contact-brief__privacy">Your details are used to answer you. Nothing else. <a href="/privacy">Privacy</a></p>
        </div>
        <div class="kodza-contact-brief__done" hidden>
          <p class="kodza-contact-brief__key">Brief sent</p>
          <p class="kodza-contact-brief__thanks" tabindex="-1">Thanks, <span data-value="name">you</span>.</p>
          <dl class="kodza-contact-brief__recap">
            <div class="kodza-contact-brief__row"><dt>What</dt><dd><span data-value="need"></span></dd></div>
            <div class="kodza-contact-brief__row"><dt>How much</dt><dd><span data-value="budget"></span></dd></div>
            <div class="kodza-contact-brief__row"><dt>When</dt><dd><span data-value="when"></span></dd></div>
          </dl>
          <p class="kodza-contact-brief__next">We answer within 48 h, at <span data-value="email">your address</span>, with a time for the call.</p>
          <button class="kodza-contact-brief__again" type="reset">Start over</button>
        </div>
      </div>
    </form>
  </div>
</section>

Checked

Checked before you paste.

Robots poked at it before you did. Every component goes through the same checks, and again each time it changes.

What ranLast run
Accessibilityaxe-core 4.10.2: the WCAG 2.1 A and AA rules, plus best practices. 0 issues
KeyboardThe Tab key gets there, and the focus ring shows when it does. Passed
Reduced motionTurn on reduced motion and what moved just appears. Nothing loops. Passed
Light and darkThe same checks on both themes, contrast included. Passed
WordPressPasted into Twenty Twenty-Five, Twenty Twenty-One, Astra, Blocksy, GeneratePress, Hello Elementor, Kadence and OceanWP. Nothing to flag. 8 / 8 themes
Robots checked this. A human with VoiceOver hasn't yet.
KeyboardPress them in the preview
On a tag
  • Picks the need, or drops itSpace
On a range
  • Picks the next range, round and round→/↓
  • Picks the previous range, round and round←/↑
In a field
  • Sends the brief, or shows what is missingEnter
In the message
  • Sends the brief (Enter makes a new line)⌘Enter

More like this

More in Contact