Complaint Form

Add this minimal HTML complaint form to your website to provide users with a straightforward way to report problems or express dissatisfaction. Whether you're managing a business, institution, or service, this form helps you maintain transparency and accountability by ensuring every complaint is heard and addressed professionally.
Preview Preview
Code Code
        
HTML HTML Copy Copy
<form action="https://formspree.io/f/{FORM_ID}" class="fs-form fs-layout__2-column" target="_top" method="POST" > <div class="fs-field"> <label class="fs-label" for="full-name">Full Name</label> <input class="fs-input" id="full-name" name="full-name" placeholder="Enter your full name" required /> </div> <div class="fs-field"> <label class="fs-label" for="email-address">Email Address</label> <input class="fs-input" id="email-address" name="email-address" placeholder="Enter your email address" required /> </div> <div class="fs-field"> <label class="fs-label" for="phone-number">Phone Number</label> <input class="fs-input" id="phone-number" name="phone-number" placeholder="Enter your phone number" required /> </div> <div class="fs-field"> <label class="fs-label" for="address">Address</label> <textarea class="fs-textarea" id="address" name="address" placeholder="Enter your full address" ></textarea> </div> <div class="fs-field"> <label class="fs-label" for="date-of-incident">Date of Incident</label> <input class="fs-input" id="date-of-incident" name="date-of-incident" placeholder="Enter the incident date" required /> </div> <div class="fs-field"> <label class="fs-label" for="incident-location">Location of Incident</label> <input class="fs-input" id="incident-location" name="incident-location" placeholder="Enter the location of the incident" required /> </div> <div class="fs-field"> <label class="fs-label">Type of Complaint</label> <div class="fs-radio-group"> <div class="fs-radio-field"> <div class="fs-radio-wrapper"> <input class="fs-radio" id="complaint-type-product" name="complaint-type" required type="radio" value="product" /> </div> <div> <label class="fs-label" for="complaint-type-product">Product</label> </div> </div> <div class="fs-radio-field"> <div class="fs-radio-wrapper"> <input class="fs-radio" id="complaint-type-service" name="complaint-type" required type="radio" value="service" /> </div> <div> <label class="fs-label" for="complaint-type-service">Service</label> </div> </div> <div class="fs-radio-field"> <div class="fs-radio-wrapper"> <input class="fs-radio" id="complaint-type-staff" name="complaint-type" required type="radio" value="staff" /> </div> <div> <label class="fs-label" for="complaint-type-staff">Staff</label> </div> </div> <div class="fs-radio-field"> <div class="fs-radio-wrapper"> <input class="fs-radio" id="complaint-type-other" name="complaint-type" required type="radio" value="other" /> </div> <div> <label class="fs-label" for="complaint-type-other">Other</label> </div> </div> </div> </div> <div class="fs-field" style="margin-bottom: 2rem"> <label class="fs-label" for="urgency-level">Urgency Level</label> <input class="fs-slider" id="urgency-level" max="3" min="1" name="urgency-level" required step="1" type="range" value="1" /> <div class="slider-label-container"> <span class="slider-label-text">Low</span> <span class="slider-label-text">Medium</span> <span class="slider-label-text">High</span> </div> </div> <div class="fs-field"> <label class="fs-label" for="issue-description"> Description of the Issue </label> <textarea class="fs-textarea" id="issue-description" name="issue-description" placeholder="Describe the issue in detail" required ></textarea> </div> <div class="fs-field"> <label class="fs-label" for="people-involved"> People Involved (if any) </label> <textarea class="fs-textarea" id="people-involved" name="people-involved" placeholder="List names of individuals involved (if any)" ></textarea> </div> <div class="fs-field"> <label class="fs-label" for="order-number"> Order/Invoice Number (if applicable) </label> <input class="fs-input" id="order-number" name="order-number" placeholder="Enter the order or invoice number" /> </div> <div class="fs-field"> <label class="fs-label" for="supporting-evidence"> Supporting Evidence </label> <input class="fs-input" id="supporting-evidence" name="supporting-evidence" placeholder="Provide links to files or images" /> </div> <div class="fs-field"> <label class="fs-label" for="preferred-resolution"> Preferred Resolution </label> <select class="fs-select" id="preferred-resolution" name="preferred-resolution" > <option value="refund">Refund</option> <option value="apology">Apology</option> <option value="replacement">Replacement</option> <option value="other">Other</option> </select> </div> <div class="fs-checkbox-field"> <div class="fs-checkbox-wrapper"> <input class="fs-checkbox" id="follow-up-consent" name="follow-up-consent" type="checkbox" value="yes" /> </div> <div> <label class="fs-label" for="follow-up-consent"> May We Contact You for Follow-Up? </label> </div> </div> <div class="fs-button-group"> <button class="fs-button" type="submit">Submit</button> </div> </form> Show more
CSS CSS Copy Copy
@import url("https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap"); /** Variables **/ :root { --color-background: #cbd5e1; --color-background-alt: #64748b; --color-border-active: #64748b; --color-border-default: #94a3b8; --color-highlight: #cbd5e1; --color-primary: #1e293b; --color-primary-active: #090f1d; --color-text-default: #0f172a; --color-text-muted: #475569; --font-family-body: "Open Sans", sans-serif; --font-family-display: "Nunito Sans", sans-serif; } /** Base **/ *, ::before, ::after { box-sizing: border-box; } * { border: 0; margin: 0; padding: 0; } body { -webkit-font-smoothing: antialiased; font-family: var(--font-family-body); font-optical-sizing: auto; font-style: normal; } button, input, optgroup, select, textarea { font-family: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 100%; font-weight: inherit; line-height: inherit; color: inherit; margin: 0; padding: 0; } [type="checkbox"], [type="radio"], [type="range"] { appearance: none; flex-shrink: 0; padding: 0; user-select: none; } [type="checkbox"]:focus, [type="radio"]:focus, [type="range"]:focus { outline: none; } /** Components **/ .fs-form { display: grid; row-gap: 1.5rem; } .fs-form:where(.fs-layout__2-column) { column-gap: 1.5rem; grid-template-columns: 1fr 1fr; } fieldset { display: grid; margin: 1.5rem 0; row-gap: 1.5rem; } .fs-form:where(.fs-layout__2-column) fieldset { column-gap: 1.5rem; grid-template-columns: 1fr 1fr; grid-column: 1 / -1; } .fs-fieldset-title { color: var(--color-text-default); font-family: var(--font-family-display); font-size: 1.25rem; font-weight: 500; line-height: 1.75rem; margin-bottom: 1.5rem; grid-column: 1 / -1; } .fs-field { display: flex; flex-direction: column; row-gap: 0.375rem; } .fs-label { color: var(--color-text-default); display: block; font-family: var(--font-family-display); font-size: 0.875rem; font-weight: 500; line-height: 1.25rem; } .fs-description { color: var(--color-text-muted); display: block; font-size: 0.875rem; line-height: 1.25rem; } .fs-button-group { display: flex; flex-direction: row-reverse; column-gap: 1.5rem; } .fs-form:where(.fs-layout__2-column) .fs-button-group { grid-column: 1 / -1; } .fs-button { background-color: var(--color-primary); border-radius: 0.375rem; color: white; cursor: pointer; font-size: 0.875rem; font-weight: 500; line-height: 1rem; padding: 1rem 2rem; transition-duration: 200ms; transition-property: background-color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } .fs-button:hover { background-color: var(--color-primary-active); } .fs-button:focus-visible { background-color: var(--color-primary-active); outline: 3px solid var(--color-highlight); } .fs-input, .fs-select { appearance: none; border-radius: 0.375rem; border-width: 0; box-shadow: var(--color-border-default) 0 0 0 1px inset; color: var(--color-text-default); font-size: 1rem; height: 2.5rem; line-height: 1.5rem; outline: none; padding-left: 0.75rem; padding-right: 0.75rem; } .fs-input:focus-visible, .fs-select:focus-visible { box-shadow: var(--color-border-active) 0 0 0 1.5px inset; outline: 3px solid var(--color-highlight); outline-offset: 0; } .fs-input::placeholder { color: var(--color-text-muted); } .fs-checkbox-group, .fs-radio-group { display: flex; flex-direction: column; row-gap: 0.5rem; } .fs-checkbox-field, .fs-radio-field { column-gap: 0.5rem; display: flex; } :is(.fs-checkbox-field, .fs-radio-field) .fs-label + .fs-description { margin-top: 0.125rem; } .fs-checkbox-wrapper, .fs-radio-wrapper { align-items: center; display: flex; height: 1.25rem; } .fs-checkbox, .fs-radio { background-color: #fff; border: 1px solid var(--color-text-default); height: 1rem; width: 1rem; } .fs-checkbox { border-radius: 0.25rem; } .fs-radio { border-radius: 100%; } .fs-checkbox:checked, .fs-radio:checked { background-color: var(--color-primary); background-position: center; background-repeat: no-repeat; background-size: 100% 100%; border-color: transparent; } .fs-checkbox:checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); } .fs-radio:checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); } .fs-checkbox:focus-visible, .fs-radio:focus-visible { outline: 3px solid var(--color-highlight); outline-offset: 0; } .fs-select { background-color: #fff; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); background-position: right 0.5rem center; background-repeat: no-repeat; background-size: 1.5em 1.5em; padding-right: 2.5rem; } .fs-slider { background: transparent; cursor: pointer; height: 1.25rem; width: 100%; } .fs-slider::-moz-range-track { background-color: var(--color-background); border-radius: 0.5rem; height: 0.5rem; } .fs-slider::-webkit-slider-runnable-track { background-color: var(--color-background); border-radius: 0.5rem; height: 0.5rem; } .fs-slider::-moz-range-thumb { background-color: var(--color-primary); border: none; /* Removes extra border that FF applies */ border-radius: 50%; height: 1.25rem; width: 1.25rem; } .fs-slider::-webkit-slider-thumb { appearance: none; background-color: var(--color-primary); border-radius: 50%; height: 1.25rem; margin-top: -0.375rem; /* Centers thumb on the track */ width: 1.25rem; } .fs-slider:focus-visible::-moz-range-thumb { outline: 2px solid var(--color-primary); outline-offset: 2px; } .fs-slider:focus-visible::-webkit-slider-thumb { outline: 2px solid var(--color-primary); outline-offset: 2px; } .fs-switch { background-color: var(--color-background-alt); background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='white'/%3e%3c/svg%3e"); background-position: left center; background-repeat: no-repeat; border-radius: 1.5rem; cursor: pointer; height: 1.5rem; transition-duration: 200ms; transition-property: background-color, background-position; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); width: 2.75rem; } .fs-switch:checked { background-color: var(--color-primary); background-position: right center; } .fs-switch:focus-visible { outline: 3px solid var(--color-highlight); outline-offset: 0; } .fs-textarea { appearance: none; border-radius: 0.375rem; border-width: 0; box-shadow: var(--color-border-default) 0 0 0 1px inset; color: var(--color-primary); font-size: 1rem; line-height: 1.5rem; outline: none; padding: 0.5rem 0.75rem; resize: vertical; } .fs-textarea:focus-visible { box-shadow: var(--color-border-active) 0 0 0 1.5px inset; outline: 3px solid var(--color-highlight); outline-offset: 0; } .fs-textarea::placeholder { color: var(--color-text-muted); } /** Utilities **/ .col-span-full { grid-column: 1 / -1; } .fs-textarea::placeholder { color: var(--color-text-muted); } .slider-label-container { display: flex; justify-content: space-between; width: 100%; margin-top: 0.25rem; } .slider-label-text { font-size: 0.75rem; color: var(--color-text-muted); text-align: center; white-space: nowrap; } Show more
        
HTML HTML/Tailwind Copy Copy
<form action="https://formspree.io/f/{FORM_ID}" class="grid grid-cols-2 gap-x-6 gap-y-6" target="_top" method="POST" > <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="full-name" > Full Name </label> <input class="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="full-name" name="full-name" placeholder="Enter your full name" required /> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="email-address" > Email Address </label> <input class="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="email-address" name="email-address" placeholder="Enter your email address" required /> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="phone-number" > Phone Number </label> <input class="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="phone-number" name="phone-number" placeholder="Enter your phone number" required /> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="address" > Address </label> <textarea class="resize-y appearance-none rounded-md border-0 px-3 py-2 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="address" name="address" placeholder="Enter your full address" ></textarea> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="date-of-incident" > Date of Incident </label> <input class="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="date-of-incident" name="date-of-incident" placeholder="Enter the incident date" required /> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="incident-location" > Location of Incident </label> <input class="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="incident-location" name="incident-location" placeholder="Enter the location of the incident" required /> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" > Type of Complaint </label> <div class="flex flex-col gap-y-2"> <div class="flex gap-x-2"> <div class="flex h-5 items-center"> <input class="checked:bg-radio-checked h-4 w-4 rounded-full border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="complaint-type-product" name="complaint-type" required type="radio" value="product" /> </div> <div> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="complaint-type-product" > Product </label> </div> </div> <div class="flex gap-x-2"> <div class="flex h-5 items-center"> <input class="checked:bg-radio-checked h-4 w-4 rounded-full border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="complaint-type-service" name="complaint-type" required type="radio" value="service" /> </div> <div> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="complaint-type-service" > Service </label> </div> </div> <div class="flex gap-x-2"> <div class="flex h-5 items-center"> <input class="checked:bg-radio-checked h-4 w-4 rounded-full border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="complaint-type-staff" name="complaint-type" required type="radio" value="staff" /> </div> <div> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="complaint-type-staff" > Staff </label> </div> </div> <div class="flex gap-x-2"> <div class="flex h-5 items-center"> <input class="checked:bg-radio-checked h-4 w-4 rounded-full border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="complaint-type-other" name="complaint-type" required type="radio" value="other" /> </div> <div> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="complaint-type-other" > Other </label> </div> </div> </div> </div> <div class="flex flex-col gap-y-1.5" style="margin-bottom: 2rem"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="urgency-level" > Urgency Level </label> <input class="fs-slider" id="urgency-level" max="3" min="1" name="urgency-level" required step="1" type="range" value="1" /> <div class="slider-label-container"> <span class="slider-label-text">Low</span> <span class="slider-label-text">Medium</span> <span class="slider-label-text">High</span> </div> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="issue-description" > Description of the Issue </label> <textarea class="resize-y appearance-none rounded-md border-0 px-3 py-2 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="issue-description" name="issue-description" placeholder="Describe the issue in detail" required ></textarea> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="people-involved" > People Involved (if any) </label> <textarea class="resize-y appearance-none rounded-md border-0 px-3 py-2 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="people-involved" name="people-involved" placeholder="List names of individuals involved (if any)" ></textarea> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="order-number" > Order/Invoice Number (if applicable) </label> <input class="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="order-number" name="order-number" placeholder="Enter the order or invoice number" /> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="supporting-evidence" > Supporting Evidence </label> <input class="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="supporting-evidence" name="supporting-evidence" placeholder="Provide links to files or images" /> </div> <div class="flex flex-col gap-y-1.5"> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="preferred-resolution" > Preferred Resolution </label> <select class="bg-caret-down h-10 appearance-none rounded-md border-0 bg-white bg-[size:1.5em_1.5em] bg-[position:right_0.5rem_center] bg-no-repeat px-3 pe-10 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="preferred-resolution" name="preferred-resolution" > <option value="refund">Refund</option> <option value="apology">Apology</option> <option value="replacement">Replacement</option> <option value="other">Other</option> </select> </div> <div class="flex gap-x-2"> <div class="flex h-5 items-center"> <input class="checked:bg-checkbox-checked h-4 w-4 rounded border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="follow-up-consent" name="follow-up-consent" type="checkbox" value="yes" /> </div> <div> <label class="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" for="follow-up-consent" > May We Contact You for Follow-Up? </label> </div> </div> <div class="col-span-full flex flex-row-reverse gap-x-6"> <button class="cursor-pointer rounded-md bg-[--color-primary] px-8 py-4 text-sm font-medium leading-4 text-white transition-colors duration-200 hover:bg-[--color-primary-active] focus-visible:bg-[--color-primary-active] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-[--color-highlight]" type="submit" > Submit </button> </div> </form> Show more
CSS CSS Copy Copy
@import url("https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap"); @tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { --color-background: #cbd5e1; --color-background-alt: #64748b; --color-border-active: #64748b; --color-border-default: #94a3b8; --color-highlight: #cbd5e1; --color-primary: #1e293b; --color-primary-active: #090f1d; --color-text-default: #0f172a; --color-text-muted: #475569; --font-family-body: "Open Sans", sans-serif; --font-family-display: "Nunito Sans", sans-serif; } *, ::before, ::after { box-sizing: border-box; } * { border: 0; margin: 0; padding: 0; } body { -webkit-font-smoothing: antialiased; font-family: var(--font-family-body); font-optical-sizing: auto; font-style: normal; } button, input, optgroup, select, textarea { font-family: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 100%; font-weight: inherit; line-height: inherit; color: inherit; margin: 0; padding: 0; } [type="checkbox"], [type="radio"], [type="range"] { appearance: none; flex-shrink: 0; padding: 0; user-select: none; } [type="checkbox"]:focus, [type="radio"]:focus, [type="range"]:focus { outline: none; } } @layer components { .fs-slider { background: transparent; cursor: pointer; height: 1.25rem; width: 100%; } .fs-slider::-moz-range-track { background-color: var(--color-background); border-radius: 0.5rem; height: 0.5rem; } .fs-slider::-webkit-slider-runnable-track { background-color: var(--color-background); border-radius: 0.5rem; height: 0.5rem; } .fs-slider::-moz-range-thumb { background-color: var(--color-primary); border: none; /* Removes extra border that FF applies */ border-radius: 50%; height: 1.25rem; width: 1.25rem; } .fs-slider::-webkit-slider-thumb { appearance: none; background-color: var(--color-primary); border-radius: 50%; height: 1.25rem; margin-top: -0.375rem; /* Centers thumb on the track */ width: 1.25rem; } .fs-slider:focus-visible::-moz-range-thumb { outline: 2px solid var(--color-primary); outline-offset: 2px; } .fs-slider:focus-visible::-webkit-slider-thumb { outline: 2px solid var(--color-primary); outline-offset: 2px; } .slider-label-container { @apply flex justify-between w-full mt-1; /* Removed px-2.5 */ } .slider-label-text { @apply text-xs text-gray-500 dark:text-gray-400 text-center whitespace-nowrap; /* text-xs is 0.75rem */ } } @layer utilities { .bg-caret-down { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); } .bg-checkbox-checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); } .bg-radio-checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); } .bg-switch-thumb { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='white'/%3e%3c/svg%3e"); } } Show more
        
HTML React Copy Copy
// Make sure to run npm install @formspree/react // For more help visit https://formspr.ee/react-help import React from "react"; import { useForm, ValidationError } from "@formspree/react"; export function ExampleForm() { const [state, handleSubmit] = useForm("FORM_ID"); if (state.succeeded) { return <p>Thanks for joining!</p>; } return ( <form className="fs-form fs-layout__2-column" onSubmit={handleSubmit}> <div className="fs-field"> <label className="fs-label" htmlFor="full-name"> Full Name </label> <input className="fs-input" id="full-name" name="full-name" placeholder="Enter your full name" required /> </div> <div className="fs-field"> <label className="fs-label" htmlFor="email-address"> Email Address </label> <input className="fs-input" id="email-address" name="email-address" placeholder="Enter your email address" required /> </div> <div className="fs-field"> <label className="fs-label" htmlFor="phone-number"> Phone Number </label> <input className="fs-input" id="phone-number" name="phone-number" placeholder="Enter your phone number" required /> </div> <div className="fs-field"> <label className="fs-label" htmlFor="address"> Address </label> <textarea className="fs-textarea" id="address" name="address" placeholder="Enter your full address" /> </div> <div className="fs-field"> <label className="fs-label" htmlFor="date-of-incident"> Date of Incident </label> <input className="fs-input" id="date-of-incident" name="date-of-incident" placeholder="Enter the incident date" required /> </div> <div className="fs-field"> <label className="fs-label" htmlFor="incident-location"> Location of Incident </label> <input className="fs-input" id="incident-location" name="incident-location" placeholder="Enter the location of the incident" required /> </div> <div className="fs-field"> <label className="fs-label">Type of Complaint</label> <div className="fs-radio-group"> <div className="fs-radio-field"> <div className="fs-radio-wrapper"> <input className="fs-radio" id="complaint-type-product" name="complaint-type" required type="radio" value="product" /> </div> <div> <label className="fs-label" htmlFor="complaint-type-product"> Product </label> </div> </div> <div className="fs-radio-field"> <div className="fs-radio-wrapper"> <input className="fs-radio" id="complaint-type-service" name="complaint-type" required type="radio" value="service" /> </div> <div> <label className="fs-label" htmlFor="complaint-type-service"> Service </label> </div> </div> <div className="fs-radio-field"> <div className="fs-radio-wrapper"> <input className="fs-radio" id="complaint-type-staff" name="complaint-type" required type="radio" value="staff" /> </div> <div> <label className="fs-label" htmlFor="complaint-type-staff"> Staff </label> </div> </div> <div className="fs-radio-field"> <div className="fs-radio-wrapper"> <input className="fs-radio" id="complaint-type-other" name="complaint-type" required type="radio" value="other" /> </div> <div> <label className="fs-label" htmlFor="complaint-type-other"> Other </label> </div> </div> </div> </div> <div className="fs-field" style="position: relative; margin-bottom: 2rem;" > <label className="fs-label" htmlFor="urgency-level"> Urgency Level </label> <input className="fs-slider" defaultValue="1" id="urgency-level" max="3" min="1" name="urgency-level" required step="1" type="range" /> <div className="slider-label-container"> <span className="slider-label-text">Low</span> <span className="slider-label-text">Medium</span> <span className="slider-label-text">High</span> </div> </div> <div className="fs-field"> <label className="fs-label" htmlFor="issue-description"> Description of the Issue </label> <textarea className="fs-textarea" id="issue-description" name="issue-description" placeholder="Describe the issue in detail" required /> </div> <div className="fs-field"> <label className="fs-label" htmlFor="people-involved"> People Involved (if any) </label> <textarea className="fs-textarea" id="people-involved" name="people-involved" placeholder="List names of individuals involved (if any)" /> </div> <div className="fs-field"> <label className="fs-label" htmlFor="order-number"> Order/Invoice Number (if applicable) </label> <input className="fs-input" id="order-number" name="order-number" placeholder="Enter the order or invoice number" /> </div> <div className="fs-field"> <label className="fs-label" htmlFor="supporting-evidence"> Supporting Evidence </label> <input className="fs-input" id="supporting-evidence" name="supporting-evidence" placeholder="Provide links to files or images" /> </div> <div className="fs-field"> <label className="fs-label" htmlFor="preferred-resolution"> Preferred Resolution </label> <select className="fs-select" id="preferred-resolution" name="preferred-resolution" > <option value="refund">Refund</option> <option value="apology">Apology</option> <option value="replacement">Replacement</option> <option value="other">Other</option> </select> </div> <div className="fs-checkbox-field"> <div className="fs-checkbox-wrapper"> <input className="fs-checkbox" id="follow-up-consent" name="follow-up-consent" type="checkbox" value="yes" /> </div> <div> <label className="fs-label" htmlFor="follow-up-consent"> May We Contact You for Follow-Up? </label> </div> </div> <div class="fs-button-group"> <button className="fs-button" type="submit"> Submit </button> </div> </form> ); } Show more
CSS CSS Copy Copy
@import url("https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap"); /** Variables **/ :root { --color-background: #cbd5e1; --color-background-alt: #64748b; --color-border-active: #64748b; --color-border-default: #94a3b8; --color-highlight: #cbd5e1; --color-primary: #1e293b; --color-primary-active: #090f1d; --color-text-default: #0f172a; --color-text-muted: #475569; --font-family-body: "Open Sans", sans-serif; --font-family-display: "Nunito Sans", sans-serif; } /** Base **/ *, ::before, ::after { box-sizing: border-box; } * { border: 0; margin: 0; padding: 0; } body { -webkit-font-smoothing: antialiased; font-family: var(--font-family-body); font-optical-sizing: auto; font-style: normal; } button, input, optgroup, select, textarea { font-family: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 100%; font-weight: inherit; line-height: inherit; color: inherit; margin: 0; padding: 0; } [type="checkbox"], [type="radio"], [type="range"] { appearance: none; flex-shrink: 0; padding: 0; user-select: none; } [type="checkbox"]:focus, [type="radio"]:focus, [type="range"]:focus { outline: none; } /** Components **/ .fs-form { display: grid; row-gap: 1.5rem; } .fs-form:where(.fs-layout__2-column) { column-gap: 1.5rem; grid-template-columns: 1fr 1fr; } fieldset { display: grid; margin: 1.5rem 0; row-gap: 1.5rem; } .fs-form:where(.fs-layout__2-column) fieldset { column-gap: 1.5rem; grid-template-columns: 1fr 1fr; grid-column: 1 / -1; } .fs-fieldset-title { color: var(--color-text-default); font-family: var(--font-family-display); font-size: 1.25rem; font-weight: 500; line-height: 1.75rem; margin-bottom: 1.5rem; grid-column: 1 / -1; } .fs-field { display: flex; flex-direction: column; row-gap: 0.375rem; } .fs-label { color: var(--color-text-default); display: block; font-family: var(--font-family-display); font-size: 0.875rem; font-weight: 500; line-height: 1.25rem; } .fs-description { color: var(--color-text-muted); display: block; font-size: 0.875rem; line-height: 1.25rem; } .fs-button-group { display: flex; flex-direction: row-reverse; column-gap: 1.5rem; } .fs-form:where(.fs-layout__2-column) .fs-button-group { grid-column: 1 / -1; } .fs-button { background-color: var(--color-primary); border-radius: 0.375rem; color: white; cursor: pointer; font-size: 0.875rem; font-weight: 500; line-height: 1rem; padding: 1rem 2rem; transition-duration: 200ms; transition-property: background-color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } .fs-button:hover { background-color: var(--color-primary-active); } .fs-button:focus-visible { background-color: var(--color-primary-active); outline: 3px solid var(--color-highlight); } .fs-input, .fs-select { appearance: none; border-radius: 0.375rem; border-width: 0; box-shadow: var(--color-border-default) 0 0 0 1px inset; color: var(--color-text-default); font-size: 1rem; height: 2.5rem; line-height: 1.5rem; outline: none; padding-left: 0.75rem; padding-right: 0.75rem; } .fs-input:focus-visible, .fs-select:focus-visible { box-shadow: var(--color-border-active) 0 0 0 1.5px inset; outline: 3px solid var(--color-highlight); outline-offset: 0; } .fs-input::placeholder { color: var(--color-text-muted); } .fs-checkbox-group, .fs-radio-group { display: flex; flex-direction: column; row-gap: 0.5rem; } .fs-checkbox-field, .fs-radio-field { column-gap: 0.5rem; display: flex; } :is(.fs-checkbox-field, .fs-radio-field) .fs-label + .fs-description { margin-top: 0.125rem; } .fs-checkbox-wrapper, .fs-radio-wrapper { align-items: center; display: flex; height: 1.25rem; } .fs-checkbox, .fs-radio { background-color: #fff; border: 1px solid var(--color-text-default); height: 1rem; width: 1rem; } .fs-checkbox { border-radius: 0.25rem; } .fs-radio { border-radius: 100%; } .fs-checkbox:checked, .fs-radio:checked { background-color: var(--color-primary); background-position: center; background-repeat: no-repeat; background-size: 100% 100%; border-color: transparent; } .fs-checkbox:checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); } .fs-radio:checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); } .fs-checkbox:focus-visible, .fs-radio:focus-visible { outline: 3px solid var(--color-highlight); outline-offset: 0; } .fs-select { background-color: #fff; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); background-position: right 0.5rem center; background-repeat: no-repeat; background-size: 1.5em 1.5em; padding-right: 2.5rem; } .fs-slider { background: transparent; cursor: pointer; height: 1.25rem; width: 100%; } .fs-slider::-moz-range-track { background-color: var(--color-background); border-radius: 0.5rem; height: 0.5rem; } .fs-slider::-webkit-slider-runnable-track { background-color: var(--color-background); border-radius: 0.5rem; height: 0.5rem; } .fs-slider::-moz-range-thumb { background-color: var(--color-primary); border: none; /* Removes extra border that FF applies */ border-radius: 50%; height: 1.25rem; width: 1.25rem; } .fs-slider::-webkit-slider-thumb { appearance: none; background-color: var(--color-primary); border-radius: 50%; height: 1.25rem; margin-top: -0.375rem; /* Centers thumb on the track */ width: 1.25rem; } .fs-slider:focus-visible::-moz-range-thumb { outline: 2px solid var(--color-primary); outline-offset: 2px; } .fs-slider:focus-visible::-webkit-slider-thumb { outline: 2px solid var(--color-primary); outline-offset: 2px; } .fs-switch { background-color: var(--color-background-alt); background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='white'/%3e%3c/svg%3e"); background-position: left center; background-repeat: no-repeat; border-radius: 1.5rem; cursor: pointer; height: 1.5rem; transition-duration: 200ms; transition-property: background-color, background-position; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); width: 2.75rem; } .fs-switch:checked { background-color: var(--color-primary); background-position: right center; } .fs-switch:focus-visible { outline: 3px solid var(--color-highlight); outline-offset: 0; } .fs-textarea { appearance: none; border-radius: 0.375rem; border-width: 0; box-shadow: var(--color-border-default) 0 0 0 1px inset; color: var(--color-primary); font-size: 1rem; line-height: 1.5rem; outline: none; padding: 0.5rem 0.75rem; resize: vertical; } .fs-textarea:focus-visible { box-shadow: var(--color-border-active) 0 0 0 1.5px inset; outline: 3px solid var(--color-highlight); outline-offset: 0; } .fs-textarea::placeholder { color: var(--color-text-muted); } /** Utilities **/ .col-span-full { grid-column: 1 / -1; } .fs-textarea::placeholder { color: var(--color-text-muted); } .slider-label-container { display: flex; justify-content: space-between; width: 100%; margin-top: 0.25rem; } .slider-label-text { font-size: 0.75rem; color: var(--color-text-muted); text-align: center; white-space: nowrap; } Show more
        
HTML React/Tailwind Copy Copy
// Make sure to run npm install @formspree/react // For more help visit https://formspr.ee/react-help import React from "react"; import { useForm, ValidationError } from "@formspree/react"; export function ExampleForm() { const [state, handleSubmit] = useForm("FORM_ID"); if (state.succeeded) { return <p>Thanks for joining!</p>; } return ( <form className="grid grid-cols-2 gap-x-6 gap-y-6" onSubmit={handleSubmit}> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="full-name" > Full Name </label> <input className="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="full-name" name="full-name" placeholder="Enter your full name" required /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="email-address" > Email Address </label> <input className="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="email-address" name="email-address" placeholder="Enter your email address" required /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="phone-number" > Phone Number </label> <input className="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="phone-number" name="phone-number" placeholder="Enter your phone number" required /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="address" > Address </label> <textarea className="resize-y appearance-none rounded-md border-0 px-3 py-2 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="address" name="address" placeholder="Enter your full address" /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="date-of-incident" > Date of Incident </label> <input className="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="date-of-incident" name="date-of-incident" placeholder="Enter the incident date" required /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="incident-location" > Location of Incident </label> <input className="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="incident-location" name="incident-location" placeholder="Enter the location of the incident" required /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]"> Type of Complaint </label> <div className="flex flex-col gap-y-2"> <div className="flex gap-x-2"> <div className="flex h-5 items-center"> <input className="checked:bg-radio-checked h-4 w-4 rounded-full border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="complaint-type-product" name="complaint-type" required type="radio" value="product" /> </div> <div> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="complaint-type-product" > Product </label> </div> </div> <div className="flex gap-x-2"> <div className="flex h-5 items-center"> <input className="checked:bg-radio-checked h-4 w-4 rounded-full border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="complaint-type-service" name="complaint-type" required type="radio" value="service" /> </div> <div> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="complaint-type-service" > Service </label> </div> </div> <div className="flex gap-x-2"> <div className="flex h-5 items-center"> <input className="checked:bg-radio-checked h-4 w-4 rounded-full border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="complaint-type-staff" name="complaint-type" required type="radio" value="staff" /> </div> <div> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="complaint-type-staff" > Staff </label> </div> </div> <div className="flex gap-x-2"> <div className="flex h-5 items-center"> <input className="checked:bg-radio-checked h-4 w-4 rounded-full border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="complaint-type-other" name="complaint-type" required type="radio" value="other" /> </div> <div> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="complaint-type-other" > Other </label> </div> </div> </div> </div> <div className="flex flex-col gap-y-1.5" style="position: relative; margin-bottom: 2rem;" > <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="urgency-level" > Urgency Level </label> <input className="fs-slider" defaultValue="1" id="urgency-level" max="3" min="1" name="urgency-level" required step="1" type="range" /> <div className="slider-label-container"> <span className="slider-label-text">Low</span> <span className="slider-label-text">Medium</span> <span className="slider-label-text">High</span> </div> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="issue-description" > Description of the Issue </label> <textarea className="resize-y appearance-none rounded-md border-0 px-3 py-2 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="issue-description" name="issue-description" placeholder="Describe the issue in detail" required /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="people-involved" > People Involved (if any) </label> <textarea className="resize-y appearance-none rounded-md border-0 px-3 py-2 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="people-involved" name="people-involved" placeholder="List names of individuals involved (if any)" /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="order-number" > Order/Invoice Number (if applicable) </label> <input className="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="order-number" name="order-number" placeholder="Enter the order or invoice number" /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="supporting-evidence" > Supporting Evidence </label> <input className="h-10 appearance-none rounded-md border-0 px-3 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="supporting-evidence" name="supporting-evidence" placeholder="Provide links to files or images" /> </div> <div className="flex flex-col gap-y-1.5"> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="preferred-resolution" > Preferred Resolution </label> <select className="bg-caret-down h-10 appearance-none rounded-md border-0 bg-white bg-[size:1.5em_1.5em] bg-[position:right_0.5rem_center] bg-no-repeat px-3 pe-10 text-[--color-text-default] outline-none ring-1 ring-inset ring-[--color-border-default] placeholder:text-[--color-text-muted] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight] focus-visible:ring-[1.5px] focus-visible:ring-inset focus-visible:ring-[--color-border-active]" id="preferred-resolution" name="preferred-resolution" > <option value="refund">Refund</option> <option value="apology">Apology</option> <option value="replacement">Replacement</option> <option value="other">Other</option> </select> </div> <div className="flex gap-x-2"> <div className="flex h-5 items-center"> <input className="checked:bg-checkbox-checked h-4 w-4 rounded border border-solid border-[--color-text-default] bg-white checked:border-transparent checked:bg-[--color-primary] checked:bg-[size:100%_100%] checked:bg-center checked:bg-no-repeat focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-offset-0 focus-visible:outline-[--color-highlight]" id="follow-up-consent" name="follow-up-consent" type="checkbox" value="yes" /> </div> <div> <label className="block font-[family-name:--font-family-display] text-sm font-medium text-[--color-text-default]" htmlFor="follow-up-consent" > May We Contact You for Follow-Up? </label> </div> </div> <div class="col-span-full flex flex-row-reverse gap-x-6"> <button className="cursor-pointer rounded-md bg-[--color-primary] px-8 py-4 text-sm font-medium leading-4 text-white transition-colors duration-200 hover:bg-[--color-primary-active] focus-visible:bg-[--color-primary-active] focus-visible:outline focus-visible:outline-[3px] focus-visible:outline-[--color-highlight]" type="submit" > Submit </button> </div> </form> ); } Show more
CSS CSS Copy Copy
@import url("https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap"); @tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { --color-background: #cbd5e1; --color-background-alt: #64748b; --color-border-active: #64748b; --color-border-default: #94a3b8; --color-highlight: #cbd5e1; --color-primary: #1e293b; --color-primary-active: #090f1d; --color-text-default: #0f172a; --color-text-muted: #475569; --font-family-body: "Open Sans", sans-serif; --font-family-display: "Nunito Sans", sans-serif; } *, ::before, ::after { box-sizing: border-box; } * { border: 0; margin: 0; padding: 0; } body { -webkit-font-smoothing: antialiased; font-family: var(--font-family-body); font-optical-sizing: auto; font-style: normal; } button, input, optgroup, select, textarea { font-family: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 100%; font-weight: inherit; line-height: inherit; color: inherit; margin: 0; padding: 0; } [type="checkbox"], [type="radio"], [type="range"] { appearance: none; flex-shrink: 0; padding: 0; user-select: none; } [type="checkbox"]:focus, [type="radio"]:focus, [type="range"]:focus { outline: none; } } @layer components { .fs-slider { background: transparent; cursor: pointer; height: 1.25rem; width: 100%; } .fs-slider::-moz-range-track { background-color: var(--color-background); border-radius: 0.5rem; height: 0.5rem; } .fs-slider::-webkit-slider-runnable-track { background-color: var(--color-background); border-radius: 0.5rem; height: 0.5rem; } .fs-slider::-moz-range-thumb { background-color: var(--color-primary); border: none; /* Removes extra border that FF applies */ border-radius: 50%; height: 1.25rem; width: 1.25rem; } .fs-slider::-webkit-slider-thumb { appearance: none; background-color: var(--color-primary); border-radius: 50%; height: 1.25rem; margin-top: -0.375rem; /* Centers thumb on the track */ width: 1.25rem; } .fs-slider:focus-visible::-moz-range-thumb { outline: 2px solid var(--color-primary); outline-offset: 2px; } .fs-slider:focus-visible::-webkit-slider-thumb { outline: 2px solid var(--color-primary); outline-offset: 2px; } .slider-label-container { @apply flex justify-between w-full mt-1; /* Removed px-2.5 */ } .slider-label-text { @apply text-xs text-gray-500 dark:text-gray-400 text-center whitespace-nowrap; /* text-xs is 0.75rem */ } } @layer utilities { .bg-caret-down { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); } .bg-checkbox-checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); } .bg-radio-checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); } .bg-switch-thumb { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='white'/%3e%3c/svg%3e"); } } Show more

How to use this form

Get started in just a few steps.

  1. Create a form on Formspree

    Create a free account and choose New Form.

  2. Add actions and validation rules

    Choose from our growing list of actions, from Airtable to Zendesk and everything in between.

  3. Update your form's action

    Replace with the form endpoint in the code above with the ID from your new form.
    <form action="https://formspree.io/f/{form_id}" method="post">

  4. Tweak your form's code

    Don’t forget to include a name attribute for every input.

  5. Deploy your form to your hosting platform

    Formspree works great with static websites, but also plays nicely with many hosting platforms like Shopify, Webflow and more. See the guides below.

How to Use This Form in Your Shopify Store

Follow these steps to copy and paste this form into your Shopify theme and get it working in minutes.

  1. Create a Form on Formspree

    Sign up for a free Formspree account and create a new form. Once created, you’ll get a unique form endpoint like https://formspree.io/f/your-form-id.

  2. Copy the HTML from this Library Page

    Scroll up and copy the full HTML form code shown above. Don’t forget to replace the FORM_ID in the action attribute with your actual form ID.

  3. Paste the Form into a Shopify Page

    Go to your Shopify Admin and navigate to Online Store > Themes > Customize. Select the page where you want the form to appear, then add a new Custom Liquid section. Paste the copied HTML into the Custom Liquid field and save.

  4. Copy the CSS Styles

    Scroll up and copy the CSS snippet provided on this page. These styles are optimized for the form layout and appearance.

  5. Paste the CSS into Your Shopify Theme

    In your Shopify Admin, go to Online Store > Themes > Actions > Edit Code. Open the assets/base.css file (or your theme’s main CSS file) and paste the copied CSS at the very end. Save the file.

  6. Preview and Publish

    Return to the page where you added the form. You should now see your styled Formspree form live in your Shopify store. Test it out and then hit “Publish” to make it live for customers.

Integration Guides

Contact forms that work out of the box with top website platforms.

Webflow

Webflow

Adding a Form to Webflow

Wordpress

Wordpress

Adding a Form to Wordpress

GitBook

GitBook

Adding a form to GitBook

Shopify

Shopify

Adding a form to Shopify

Gatsby

Gatsby

React Forms with Gatsby

Eleventy

Eleventy

HTML Forms with Eleventy

Jekyll

Jekyll

HTML Forms with Jekyll

NextJS

NextJS

React Forms with NextJS

What is a Complaint Form?

In a world where consumer rights and business accountability are increasingly emphasized, the complaint form serves as a vital tool for individuals and organizations alike. Whether addressing defective products, unresolved service issues, or even civil rights violations, a well-structured complaint process ensures grievances are recorded, tracked, and resolved efficiently.

A consumer complaint is often the first step in seeking redress for an issue. Whether it’s a billing dispute, a faulty product, or a concern requiring intervention from the attorney general, these forms provide a structured way to document and escalate grievances. Designed to gather key details such as contact information, an account number, and a detailed description of the issue, they not only facilitate communication but also lay the foundation for an effective complaint process.

For businesses, the customer complaint form is an invaluable tool for gathering feedback and managing relationships with their customers. By incorporating clear fields for necessary information, such as the complainant’s contact details, the nature of the issue, and any supporting documents, organizations can address concerns more effectively. In cases involving legal or civil rights matters, these forms become even more crucial, often requiring meticulous documentation to ensure the proper course of action is followed, with legal advice readily available if needed.

This article will delve into the structure of an effective complaint form template, highlight best practices for its creation, and discuss its role in addressing various types of complaints.

Essential Sections for a Customer Complaint Form

An effective complaint form ensures all relevant details are captured to facilitate a smooth resolution process. By including essential sections and key elements, businesses and individuals can structure forms that meet their needs, whether addressing consumer complaints, resolving billing issues, or escalating matters involving civil rights violations. Below, we break down the main components of a well-designed customer complaint form.

Personal Information

  • Contact Information: Collecting the complainant’s name, email address, phone number, and sometimes physical address is critical. This ensures the respondent can reach out for further details or provide updates about the complaint process.
  • Identification Details: For specific contexts, such as business complaints, including identifiers like an account number allows for quicker tracking and resolution.

Complaint Details

  • Issue Description: A clear and concise explanation of the complaint is the heart of the form. It should include the nature of the issue, relevant dates (e.g., date of purchase or when the problem occurred), and the parties involved (e.g., names of employees or businesses).
  • Complaint Category: Providing predefined categories (e.g., billing, service, product quality) helps organize complaints and prioritize resolution efforts.

Complaint Process Information

A good form outlines the steps the complainant can expect after submission, including the acknowledgment of the complaint, estimated timeframes for resolution, and escalation procedures if the issue is not resolved satisfactorily. This transparency fosters trust and sets realistic expectations for both parties.

If the complaint involves potential violations of civil rights, the form should include a prompt to seek legal advice or contact relevant authorities, such as the attorney general. Forms handling legal matters should also allow space for detailed documentation, such as a narrative description or additional notes.

Supporting Documents

  • To strengthen a complaint, forms should include an option to attach supporting evidence. This might include:
    • Receipts.
    • Photographs.
    • Screenshots of conversations or emails.
    • Documents like contracts or account statements.
  • For digital forms, tools like the Adobe PDF Library can be integrated to ensure attachments are accessible and maintain formatting consistency.

Resolution Request

  • Clearly define what the complainant is seeking as a resolution. Common options might include:
    • A refund or exchange.
    • Apologies or clarifications.
    • Legal actions, in cases involving escalated complaints.
  • Including a resolution request field helps clarify expectations and facilitates efficient handling.

Key Elements for an Effective Complaint Process

Clarity and Thoroughness

  • Ensure the form is easy to navigate and understand. Use simple language and provide instructions to guide users in completing each section.
  • Mandatory fields, such as contact information and a detailed issue description, should be clearly marked to prevent incomplete submissions.

Detail-Oriented Design

  • Encourage complainants to provide as much detail as possible. Fields for specifics, like an account number or invoice details, are critical for accurate identification and resolution of issues.
  • When handling consumer complaints, include dropdown menus or checkboxes for common categories to simplify the submission process.
  • For complaints involving civil rights or legal disputes, the form should include contact information for legal resources or government bodies like the attorney general’s office.
  • Clearly state when seeking legal advice is advisable, ensuring users are aware of their rights and responsibilities.

Accessibility and Flexibility

  • Design the form to be accessible across devices and formats. Digital forms should be mobile-friendly, and downloadable versions should leverage tools like the Adobe PDF Library to ensure compatibility.
  • Offer templates or pre-filled examples to reduce errors and improve submission accuracy.

How to Best Create a Complaint Form

Creating an effective complaint form requires thoughtful planning to ensure clarity, accessibility, and functionality. Whether for resolving consumer complaints, managing customer feedback, or addressing civil rights issues, following these steps will help design a form that captures all necessary information and streamlines the complaint process.

Step 1: Choose the Right Format

The format of your complaint form can significantly impact its usability. Decide between digital and physical formats based on your audience and context:

  • Digital Forms: Ideal for accessibility and ease of submission. They can be hosted on websites or shared via email. Tools like Formspree simplify online form creation, while the Adobe PDF Library can generate fillable PDFs for offline use.
  • Paper Forms: Still useful in specific contexts, such as legal proceedings or for users with limited internet access. Ensure they are professionally designed and easy to fill out.

Step 2: Define Clear Instructions

Provide straightforward, step-by-step guidance to help users complete the form. Clear instructions improve accuracy and prevent incomplete submissions. Key points to emphasize include:

  • Which fields are mandatory, such as contact information or an account number.
  • How to describe the issue effectively, including specific details like dates or involved parties.
  • How to attach supporting documents if required.

Step 3: Include All Necessary Fields

A comprehensive form ensures that all relevant details are captured to address the complaint effectively. Key fields to include:

  • Personal Information: Name, email address, phone number, and any other necessary contact information.
  • Complaint Details: A detailed description of the issue, the date it occurred, and the names of any involved parties.
  • Supporting Documents: Space for attaching receipts, photos, or contracts. Digital forms can incorporate features like drag-and-drop uploads.
  • Resolution Request: A section where complainants can specify their desired outcome, such as refunds, exchanges, or other actions.

Step 4: Incorporate a Template

Using a complaint form template can save time and ensure consistency. Templates provide a structure that can be customized to suit specific needs while maintaining professional formatting. Look for templates that align with your organization’s branding and are adaptable for updates.

Step 5: Make It Accessible

Accessibility ensures that everyone can use the form without difficulty. Key considerations include:

  • Device Compatibility: Ensure digital forms are mobile-friendly and responsive.
  • PDF Accessibility: If offering a downloadable form, use tools like the Adobe PDF Library to create forms that are compatible with screen readers and other accessibility aids.
  • Language Clarity: Use simple, inclusive language to make the form easy to understand for a broad audience.

Complaint forms serve as vital tools across a wide range of scenarios, from resolving consumer complaints to addressing civil rights issues. They provide a structured method for individuals and organizations to raise concerns and seek resolutions. Here are some of the most common use cases:

1. Consumer Complaint Scenarios

Consumer complaints often arise in situations where a product or service does not meet expectations. Common examples include:

  • Defective Products: Faulty or damaged goods requiring a refund, replacement, or repair.
  • Service Failures: Poor customer service experiences or unfulfilled promises, such as late deliveries or incorrect billing.
  • Billing Disputes: Cases where charges are incorrect or unauthorized.

Complaint forms in these situations help streamline the complaint process by documenting the issue, ensuring the inclusion of details like the account number, and providing a clear channel for resolution.

2. Customer Complaint Forms in Business

For businesses, customer complaint forms are key to gathering feedback and improving operations. Use cases include:

  • Tracking Customer Issues: Forms help record concerns systematically, ensuring no complaints are overlooked.
  • Improving Services: Businesses can identify patterns in complaints and address recurring problems.
  • Building Customer Trust: Offering a clear and professional complaint process demonstrates commitment to customer satisfaction.

Businesses can leverage tools like Adobe PDF Library for creating accessible forms and Formspree for online submissions, ensuring smooth communication with their customers.

Complaint forms are crucial for addressing more serious issues, such as legal disputes or civil rights violations. Use cases include:

  • Civil Rights Violations: Instances of discrimination or unfair treatment based on race, gender, or other protected characteristics. Such complaints often require meticulous documentation and may involve agencies like the attorney general.
  • Escalated Legal Issues: Cases where legal advice is needed to navigate disputes effectively, such as workplace grievances or public safety concerns.

Including fields for contact information, supporting documents, and a clear description of the issue ensures the form captures all necessary details for legal proceedings.

Conclusion

A well-crafted complaint form is more than just a tool—it’s a bridge between dissatisfaction and resolution. Whether addressing consumer complaints, improving business processes, or handling civil rights issues, these forms ensure that concerns are documented clearly, communicated effectively, and resolved efficiently. By including essential fields such as contact information, issue descriptions, and supporting documents like an account number, a complaint form streamlines the complaint process for both the complainant and the recipient.

Using accessible tools like the Adobe PDF Library for digital forms or Formspree for online submissions makes creating and managing complaint form templates easier than ever. Clear instructions, comprehensive templates, and accessibility features help foster trust, ensure legal compliance, and provide pathways for escalation when necessary, such as contacting the attorney general or seeking legal advice.

Ultimately, a well-structured complaint form transforms frustration into constructive dialogue. It empowers individuals to voice concerns and organizations to address them proactively, promoting accountability and trust. Whether you’re a business aiming to enhance customer satisfaction or an individual seeking fair treatment, a professional, accessible complaint form is an essential part of the solution.

FAQ

  • What are feedback forms?

    Feedback forms are online tools used to collect opinions, reviews, or suggestions from users, customers, or employees. A well-designed feedback form helps improve products, services, or experiences. With Formspree as the backend, these forms are easy to embed, notify you instantly of submissions, and allow real-time response viewing via the Formspree dashboard.

  • How do I create a feedback form?

    To create a feedback form, start by choosing fields like name, email, rating scales, and open-ended comment sections. You can build your own or customize a template and connect it to Formspree for effortless backend functionality, instant email notifications, and organized submission tracking.

  • What information should be collected in a feedback form?

    A feedback form should collect details like the user's name, contact info (optional), their experience rating, and open-ended responses for comments or suggestions. Using Formspree, you can customize the fields to suit your needs and instantly receive feedback submissions via email or dashboard access.

  • What are the subtypes of feedback forms?

    Subtypes of feedback forms include customer feedback forms, employee feedback forms, product feedback forms, event feedback forms, and website feedback forms. All of these can be built with Formspree-powered templates that are flexible, mobile-friendly, and support instant response notifications.

  • Who should use feedback forms?

    Businesses, educational institutions, nonprofits, developers, and event organizers should use feedback forms to gather insights and improve their offerings. Formspree makes it easy to integrate feedback forms into your website and provides instant alerts for each submission, enabling quick action on valuable feedback.

  • What are the 5 R's of feedback?

    The 5 R's of feedback are: Respect, Relevance, Responsiveness, Responsibility, and Relationship. These principles guide how feedback should be given and received to foster constructive communication, especially in organizational or team environments.

  • What is action feedback?

    Action feedback is input that focuses on specific behaviors or outcomes, encouraging measurable improvement or change. It helps guide decision-making and performance adjustments. When collected through a Formspree-powered feedback form, action feedback is immediately available for review and follow-up.

More feedback Forms