Grows With The Text
With Fit height to content, the field grows line by line up to the Max height and then scrolls inside, with the family scrollbar style.
NWD Multiline Input (Grow & Send) was built to give Bubble the multiline input its native one only half delivers: a text area that grows with the text and can send the message on Enter. It brings auto height up to a limit, an Enter key that inserts a line or submits, line and character limits, a clear icon, and a value changed event that can also fire while typing together in one polished component. Fully customizable through 20+ properties, giving you complete control over every visual and behavioral detail.
Built for what Bubble does not cover.
Bubble's native multiline input does not send on Enter, has no line limit and only reports a change when the person leaves the field. A chat box, a comment field or a notes area ends up with a fixed height that scrolls too early, a send button as the only way out, and workflows that cannot react while the person is still typing.
With Fit height to content, the field grows line by line up to the Max height and then scrolls inside, with the family scrollbar style.
Enter can trigger the Enter pressed event while Shift+Enter breaks the line, the way chat apps work. On phones Enter always breaks the line.
Min characters for validation, Max characters and Max lines that stop typing at the limit, and a character counter.
An option fires value changed as the person types, for live search, autosave and drafts.
A clear icon that keeps Ctrl+Z working, text case including name case, and spell check on or off.
A real text area with an accessible label and description, required and invalid states announced to screen readers.
In detail
Place the plugin element wherever you need it.
Adjust the settings to match your use case, including the character and line limits, the Enter key behavior, and the scrollbar style.
Turn on Fit height to content so the field grows with the text, use the value changed event to capture the confirmed text, and the Enter pressed event to send it, and read the exposed states to use them anywhere in your app.
Turn on Fit height to content in the element's layout so the field grows with the text up to its Max height. Without it the height stays fixed.
Text displayed in the input while it has no value.
Color of the placeholder text.
Case transformation applied while typing. Capitalize raises the first letter of each word; name case also lowers the rest and raises letters after hyphens and apostrophes (ahmed el-maghrebi > Ahmed El-Maghrebi).
Lets the browser underline misspelled words and suggest corrections, in the languages set in the visitor's browser or system. Turn it off for codes, addresses or technical text.
Minimum number of characters, line breaks included. Below it the input is invalid; it never blocks typing. An empty input stays valid unless it is required. Empty for no minimum.
An empty field stays valid unless This input is required? is checked.
Maximum number of characters, line breaks included. It only stops typing past the limit and never makes the input invalid. It also trims the default value and the Set value text, and applies right away when it changes. Use 0 for no limit.
Maximum number of lines, counted by line breaks (a long line that wraps counts as one). At the limit Enter adds no line, and pasted, default or Set value text is cut to it. Empty for no limit.
Lines are counted by line breaks. To limit how tall the field gets, use the element's Max height instead.
Shows the typed and maximum characters (12/100) inside the input.
Font color of the character counter.
Shows an icon that clears the input while it has a value.
Icon used to clear the input.
Color of the clear icon.
Look of the scrollbar in the input: hidden (the text still scrolls), minimal (a handle only) or arrows (a handle with an arrow at each end), each in thin or regular width. Firefox shows its own scrollbar for arrows.
Also triggers Value changed as the user types. Unchecked, it triggers only on leaving the input, or on Enter in submit mode.
A search bound to this element's value already updates as the person types, without this option. Check it when the filter, autosave or counter runs through a workflow.
What Enter does. New line inserts a line break. Both submit options keep the text as is and trigger the Enter pressed event, while Shift+Enter inserts the line break: submit keeping focus leaves the cursor in the field for the next message, as in a chat, and submit losing focus leaves the field. On touch devices Enter always inserts a line break, so sending there takes a button that runs your workflow.
On touch devices Enter always inserts a line break, whatever this option says. Sending there is up to a button of your own.
Value applied on load and on reset.
Disables the component, preventing any interaction.
Input background color when disabled.
Input border color when disabled.
Input font color when disabled.
Marks the field as required and enables input validation.
Input background color when invalid.
Input border color when invalid.
Input background color when focused.
Input border color when focused.
Name read by screen readers. When empty, uses the placeholder or the visible label.
Hint read by screen readers after the name. Empty for none.
Values the element exposes for the rest of the page to read.
line count counts line breaks, not wrapped lines, so it matches what Max lines limits.
Every state updates on each keystroke, so texts, conditions and searches bound to it react as the person types, with no workflow and without waiting for the field to lose focus. For a database search over a large list, consider feeding it from the value changed event instead, so the search runs once per pause or on confirming rather than on every keystroke.
Current text.
Number of characters typed, line breaks included.
Number of lines in the text, counted by line breaks (a long line that wraps counts as one). 0 when empty.
True when the component is not disabled.
True when the input is marked as required.
True when the value is accepted. False when it is required and empty, or shorter than Min characters. It updates on every change, so a workflow can rely on it; the invalid style only shows after the person leaves the field, or when a workflow sets the value.
True while the input has focus.
Where a workflow can start.
Triggered when the text is confirmed with a different value: leaving the input, pressing Enter in submit mode, typing when Trigger value changed while typing is checked, resetting, Set value or Insert text at cursor, or when a change to the case, line limit or character limit adjusts a text that was already typed or set.
Triggered when Enter is pressed with Enter key behavior set to one of the submit options. Shift+Enter inserts a line break instead and does not trigger it, and neither does Enter on touch devices, where it always inserts a line break.
What a workflow can tell the element to do.
Restores the default value, or clears the input when there is none.
Focuses the input.
Writes a value into the field from a workflow and refreshes the exposed states.
Yes applies the value even while the element is disabled. No makes the action do nothing in that state.
The value to write into the field. It goes through the same treatment as a value typed by the user. An empty value clears the field.
Inserts text at the cursor, replacing the selected text, or at the end when the input was never focused. Only the part that fits Max characters and Max lines is inserted, and the input gets the focus back with the cursor after it.
Yes applies the value even while the element is disabled. No makes the action do nothing in that state.
The text to insert. It goes through the same treatment as typed text.
Turn on Bubble's Fit height to content on the element and set a Max height. The field starts at its height, grows one line at a time as the person types and, once it reaches the Max height, keeps that height and scrolls inside. Without Fit height to content the height stays fixed and the text scrolls from the start. Scrollbar style sets how the scrollbar looks in both cases.
Set Enter key behavior to submit keeping focus, the usual choice for a chat, or to submit losing focus when the person sends once and moves on. Enter then keeps the text as it is and triggers the Enter pressed event, where your workflow sends the message and can call Reset to clear the field. Shift+Enter still inserts a line break. On touch devices Enter always inserts a line break, because the phone keyboard has no Shift, so give the page a send button there.
By default, when the person leaves the field with a different text, and when Enter is pressed in submit mode. With Trigger value changed while typing? checked, it also fires as the person types. It also fires on Reset, Set value and Insert text at cursor, and when a change to the text case or to a limit adjusts a text that was already there.
Min characters only validates: below it the field is invalid, but typing is never blocked. Max characters and Max lines only block: they stop typing past the limit and never make the field invalid. Line breaks count as characters, and Max lines counts line breaks, so a long line that wraps counts as one.
Yes. The Insert text at cursor action writes text at the cursor position, replacing the selection when there is one, and respects the limits. It is meant for emoji pickers, mentions and quick replies. Set value replaces the whole text instead.
Yes. The clear icon removes the text the same way a selection and Delete would, so Ctrl+Z, or Cmd+Z on a Mac, brings it back. It shows only while the field has a value, aligned with the first line, and is off by default: turn on Display clear icon? to use it.
This plugin is maintained by GCS Studios and is part of the NWD UI - Input family, form controls built from scratch for Bubble, inspired by a personal component library originally built for React. Each one is carefully designed and tested in real applications before release, for the level of control, polish and reliability that native Bubble inputs often do not provide. See more plugins on the GCS Studios contributor page.
Each control here is drawn by the plugin instead of being restyled from a native one, so they match each other across the library and keep the same shape in every browser.