.text
A one-line text answer.
.text Label // example .text Full name*
Dotdown™
Dotdown™ is a tiny text format for forms. Type a dot and a field type, and the field is there. It is built into the form editor, so there is nothing to install.
# Event signup .text Your name* .email Email* .select Plan: Free, Pro, Team
On the New form or Edit form page, open “Dotdown™” next to the Fields heading. On a phone it is already open when you create a form.
A menu of field types appears. Pick one with Enter, Tab or a tap, or just type the whole line yourself. Typing / works too, and the menu will still give you the dot version.
Every time you start a new line, the form below updates to match what you typed. You can also click “To form ⤵”, or press ⌘/Ctrl + Enter.
Open the box on a form you already have and it fills itself with that form as text. Edit the field rows, close and reopen the box, and the text catches up.
The top of the form is its info. Put it between two --- lines and everything below is fields.
--- Event signup Please fill this in. #event #feedback --- .text Your name* .email Email*
A field is optional unless you mark it. A * at the end of the label makes it required.
.text Full name* .text Nickname .select Plan*: Free, Pro, Team .email*
.text Your name A line starting with a dot is a field: .type, then the label.
## Your details
A plain line, or a line starting with ##, becomes a text block between fields.
# Event signup
With no form-info block (above), a first line starting with # is the form title and the plain line after it is the description.
Chain fields on one line.
.text Full name .number Quantity .email Email // .text Full name // .number Quantity // .email Email
Skip the label and you get a sensible one.
.email // .email Email .tel // .tel Phone .url // .url Website
An unknown word becomes a text field.
.first_name // .text First name .nickname // .text Nickname
Add * to the end of a label to make the field required. No star means optional.
.email Work email* // required .text Nickname // optional
Choices go after a colon, separated by commas.
.select Plan: Free, Pro, Team // a dropdown with 3 choices
Pre-fill a field with = after the label. See Default values below.
.text Country = Malaysia // starts as Malaysia .select Plan = Pro: Free, Pro, Team // Pro is pre-selected .checkbox Extras = Meals, Bus: Meals, Bus, Hotel // Meals and Bus are ticked
The label is whatever you want visitors to see. A field is optional unless its label ends with *.
.text A one-line text answer.
.text Label // example .text Full name*
.textarea A longer, multi-line answer.
.textarea Label // example .textarea Anything else?
.number A number. Totals and repeating groups count from a number field.
.number Label // example .number Guests
.email An email address.
.email Label // example .email Work email*
.tel A phone number.
.tel Label // example .tel Mobile
.url A web address.
.url Label // example .url Portfolio
.date A date picker.
.date Label // example .date Birthday
.time A time picker.
.time Label // example .time Pickup time
.rating A rating from 1 to 5.
.rating Label // example .rating How was it?
.select A dropdown. Visitors pick one.
.select Label: Choice 1, Choice 2 // example .select Plan*: Free, Pro, Team
.radio Buttons. Visitors pick one, and all choices stay visible.
.radio Label: Choice 1, Choice 2 // example .radio Size*: small, medium, big
.checkbox Without choices, one yes/no box. With choices, a list where visitors can tick as many as they like.
.checkbox Label .checkbox Label: Choice 1, Choice 2 // example .checkbox I agree to the terms* .checkbox Topics: News, Offers, Events
.file An upload: a PDF or an image, up to 10MB. It is emailed to you.
.file Label // example .file Resume*
.camera A big button to take a photo, or choose one from the device. Up to 10MB.
.camera Label // example .camera Photo of the damage
.signature A box to sign in, with a finger or the mouse.
.signature Label // example .signature Sign here*
.doodle Visitors draw on top of an image, like a floor plan or a body outline.
.doodle Label: https://link-to-image // example .doodle Mark the damage: https://example.com/car.png
.description A block of text, not an input. Use it for instructions.
.description Your text // example .description Please read this before you start.
.page Starts a new page with Next and Back buttons.
.page Title > target // example .page Payment
.divider A line that splits the form into parts.
.divider .image A picture shown in the form.
.image https://link-to-image Alt text // example .image https://example.com/logo.png Our logo
.tally A running total: a number field multiplied by a price.
.tally Label: Number field x Price // example .number Guests .tally Total: Guests x $25
.duplicate A group of fields repeated once per unit of a number field, like one set per child or guest.
.duplicate Label: Number field { fields } // example .number Kids .duplicate Child: Kids { .text Name .date Birthday }
.additive A group where the visitor adds more copies with a button.
.additive Label { fields } .additive Label: 5 { fields } // example .additive Review: 5 { .text Name .textarea Comment }
Split a long form into pages, and send visitors to a different page depending on their answer. Planning a branching form? Read the .page guide.
.text Name* .page Payment .number Guests .page Thanks .textarea Anything else?
Put > and a page title (or submit) after a choice.
.radio Plan: Free > submit, Pro > Payment, Team .page Payment .number Guests
Pro > Payment Choosing Pro jumps to the page titled Payment.Free > submit Choosing Free submits the form right there.Team No jump, so it goes to the next page..text Name .page Payment > Thanks .number Guests .page Shipping .text Address .page Thanks .textarea Anything else?
These do not stop you applying the form:
--- Event signup --- .text Name* .radio Plan: Free > submit, Pro > Payment, Team .page Payment .number Guests .tally Total: Guests x $25 .page Extras .checkbox Newsletter
Free submits straight away. Pro and Team go on to Payment, then Extras.
Start a field with an answer already in it.
.text Country = Malaysia // starts as Malaysia .number Guests = 1 // starts as 1
.select Plan = Pro: Free, Pro, Team // Pro is pre-selected .radio Size = Medium: Small, Medium, Large .checkbox Extras = Meals, Bus: Meals, Bus, Hotel // Meals and Bus are ticked .checkbox Agree = yes // a plain Yes/No box starts ticked
= and the value right after the label (and its star), before any colon: .text Country* = Malaysia.= Meals, Bus. A plain Yes/No checkbox starts ticked with = yes (or true, on, 1).Plan = Free with Free > submit submits unless the visitor changes it..file, .camera, .signature, .doodle, .tally and groups. You will see an error if you try..text Name* .text Country* = Malaysia .select Plan = Free: Free > submit, Pro, Team .checkbox Extras = Meals: Meals, Bus, Hotel
Country starts as Malaysia. Plan starts on Free, which submits straight away.
Put it together and you get this.
--- Birthday party RSVP Tell us who is coming. #party #rsvp --- .text Your name* .email Email* .number Guests* .duplicate Guest: Guests { .text Name* .select Meal: Chicken, Veggie } .tally Total: Guests x $25 .textarea Anything we should know?
After they submit, visitors see a short default message. Add .post to write your own.
.text Name* .email Email* .post Thanks, {Name}! We will email {Email} the schedule this week. .image https://example.com/confirmed.png .link See what to bring: https://example.com/packing
.text Name* .post > https://example.com/thanks
.post, visitors see the default: “Thanks! Your response to …was sent.”.post goes last. Everything after it is the thank-you page: the text after .post is the heading, and plain lines, .image, .divider and .link follow. A question after it is an error.{Name} is replaced with what the visitor answered in the field called Name. It is blank if they skipped it. Use it in the heading, the text, or a link’s label. A name that matches no field gives a warning..post > https://… sends visitors to that address straight after they submit, so anything written under it is never shown. It has to start with http:// or https://.{ } there is an error..link Label: https://… is a button. It works anywhere in the form, not only after .post.?test=1) the thank-you page is shown as normal, and a redirect shows where visitors would go without leaving.Labels have to be different, with one exception: the same name can be asked on pages that nobody visits together.
.select Ticket*: Student > Student details, Adult > Adult details .page Student details > Thanks .text Name* // Name on the Student page .page Adult details .text Name* // the same Name on the Adult page: one column .page Thanks .textarea Anything else?
.text Name#1* // visitors see "Name" .text Name#2* // visitors see "Name" too, but it is a separate column
# and a word or number to the end of a label to keep two fields apart. Visitors see only the label before the #; your export keeps the whole thing, so you can tell the columns apart.# has to touch the word before it. Name#1 is hidden from visitors, but Room #2 (with a space) is shown as it is..text Name#1* = Alex.The box has find and replace, go to line, comment toggle and line numbers. See Dotdown™ editor keys.