indent-textarea

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

Usage no npm install needed!

<script type="module">
  import indentTextarea from 'https://cdn.skypack.dev/indent-textarea';
</script>

README

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 just download the standalone bundle (it might take a minute to download)

Or use npm:

npm install indent-textarea
// This module is only offered as a ES Module
import * as indentation from 'indent-textarea';

Usage

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

const textarea = document.querySelector('textarea');
indentation.watch(textarea);

If you prefer event delegation:

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

delegate(document.body, 'textarea', 'input', eventHandler);

If you prefer the raw indent/unindent methods, they're also available below.

API

indentation.watch(textarea)

Adds tab and shift+tab event listeners to the provided textarea(s).

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)

indentation.indent(textarea)

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

textarea

Type: HTMLTextAreaElement

indentation.unindent(textarea)

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

textarea

Type: HTMLTextAreaElement

indentation.eventHandler

Type: (event: KeyboardEvent) => void

Raw event handler used by indentation.watch or to use manually via addEventListener

document.querySelector('textarea').addEventListener('click', eventHandler);

Or with event delegation:

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

delegate(document.body, 'textarea', 'input', eventHandler);

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.