indent-textarea

Add editor-like tab-to-indent functionality to <textarea>, in a few bytes


Keywords
editor, indent, indentation, tab, text area
License
MIT
Install
npm install indent-textarea@1.0.4

Documentation

indent-textarea

Add editor-like tab-to-indent functionality to <textarea>, in a few bytes

Try the demo.

  • Supports the native undo functionality (ctrl+z, cmd+z, context menu), as seen in the gif on the side.
  • Supports also Firefox (a lot of solutions online don't because of bugs and deprecations) but without undo support.

This only supports tab and shift+tab but it doesn't preserve it on enter like a full code editor would. If you need a more complete solution, check out behave.js (outdated, no undo) or CodeMirror (much heavier).

Note: the API used (document.execCommand) will trigger multiple input events when multiple lines are selected, so if you have a listener on the textarea, make sure to debounce it.

Install

You can download the standalone bundle

Or use npm:

npm install indent-textarea
// This module is only offered as a ES Module
import {enableTabToIndent} from 'indent-textarea';

Usage

You can listen to tab and shift+tab to indent and unindent respectively.

const textarea = document.querySelector('textarea');
enableTabToIndent(textarea);

If you prefer event delegation:

import delegate from 'delegate-it';
import {tabToIndentListener} from 'indent-textarea';

delegate(document.body, 'textarea', 'keydown', tabToIndentListener);

If you prefer the raw indentSelection/unindentSelection methods, they're also available below.

API

enableTabToIndent(textarea, signal)

Adds tab and shift+tab event listeners to the provided textarea(s). It also listens to esc to blur/unfocus the field and allow the user to keep tabbing.

textarea

Type: HTMLTextAreaElement string Iterable<HTMLTextAreaElement>

This can be:

  • the <textarea> DOM element
  • an array/iterable of DOM elements
  • or a selector that will be used via document.querySelectorAll (it will watch all the selected elements)

signal

This is an AbortSignal that allows you to remove/disable the listener

const controller = new AbortController();
const textarea = document.querySelector('textarea');
enableTabToIndent(textarea, controller.signal);

// And then later, to stop listening
controller.abort();

indentSelection(textarea)

Raw method to indent the selected text in the provided <textarea> element, once, instantly.

textarea

Type: HTMLTextAreaElement

unindentSelection(textarea)

Raw method to unindent the selected text in the provided <textarea> element, once, instantly.

textarea

Type: HTMLTextAreaElement

tabToIndentListener

Type: (event: KeyboardEvent) => void

Raw event handler used by enableTabToIndent or to use manually via addEventListener

document.querySelector('textarea').addEventListener('keydown', tabToIndentListener);

Or with event delegation:

import delegate from 'delegate-it';
import {tabToIndentListener} from 'indent-textarea';

delegate(document.body, 'textarea', 'keydown', tabToIndentListener);

Related

  • text-field-edit - Insert text in a textarea (supports Firefox and Undo). Used by this module.
  • fit-textarea - Automatically expand a <textarea> to fit its content, in a few bytes.
  • delegate-it - DOM event delegation, in <1KB. Can be used to attach one indent-textarea to many elements.
  • Refined GitHub - Uses this module.

License

MIT © Federico Brigante