1.0.4 • Published 7 months ago

markdown-it-task-lists-ts v1.0.4

Weekly downloads
-
License
MIT
Repository
github
Last release
7 months ago

markdown-it-task-lists-ts

A TypeScript-first markdown-it plugin that converts GitHub-style task lists to HTML checkboxes. Built with type safety and customization in mind.

Features

  • Full TypeScript support with comprehensive type definitions
  • Customizable CSS classes for all elements
  • Support for nested task lists
  • Configurable checkbox behavior (enabled/disabled)
  • Accessible HTML output with proper labeling
  • Zero dependencies (except for markdown-it peer dependency)

Installation

npm install markdown-it-task-lists-ts
# or
yarn add markdown-it-task-lists-ts

Usage

import MarkdownIt from 'markdown-it';
import taskLists, { type TaskListOptions } from 'markdown-it-task-lists-ts';

const md = new MarkdownIt();

// Basic usage with default options
md.use(taskLists);

// Usage with custom options
md.use(taskLists, {
  enabled: true,           // Enable checkbox interaction
  label: true,            // Wrap checkboxes in labels
  labelAfter: false,      // Place label before checkbox
  listClass: 'todo-list', // Custom class for ul elements
  itemClass: 'todo-item', // Custom class for li elements
  checkboxClass: 'todo-checkbox', // Custom class for input elements
  labelClass: 'todo-label',        // Custom class for label elements
  tiptapCompatible: true // Output HTML compatible with Tiptap's task list extension
});

// Convert markdown to HTML
const markdown = `
- [ ] Unchecked task
- [x] Checked task
  - [ ] Nested task
`;

const html = md.render(markdown);

Output HTML

The plugin generates semantic HTML with proper ARIA attributes and customizable classes:

<ul class="contains-task-list">
  <li class="task-list-item">
    <label class="task-list-item-label" for="task-item-1">
      <input class="task-list-item-checkbox" type="checkbox" id="task-item-1">
      Unchecked task
    </label>
  </li>
  <li class="task-list-item">
    <label class="task-list-item-label" for="task-item-2">
      <input class="task-list-item-checkbox" type="checkbox" checked id="task-item-2">
      Checked task
    </label>
    <ul class="contains-task-list">
      <li class="task-list-item">
        <label class="task-list-item-label" for="task-item-3">
          <input class="task-list-item-checkbox" type="checkbox" id="task-item-3">
          Nested task
        </label>
      </li>
    </ul>
  </li>
</ul>

Options

OptionTypeDefaultDescription
enabledbooleanfalseWhen true, checkboxes are interactive. When false, they have the disabled attribute.
labelbooleantrueWhen true, wraps checkboxes in label elements for better accessibility and UX.
labelAfterbooleanfalseWhen true, places the label after the checkbox instead of before.
listClassstring'contains-task-list'CSS class for the ul element containing task items.
itemClassstring'task-list-item'CSS class for the li elements containing tasks.
checkboxClassstring'task-list-item-checkbox'CSS class for the checkbox input elements.
labelClassstring'task-list-item-label'CSS class for the label elements (when label option is true).
tiptapCompatiblebooleanfalseWhether to output HTML compatible with Tiptap's task list extension

Tiptap Compatibility

When tiptapCompatible is set to true, the plugin will output HTML that is compatible with Tiptap's task list extension:

<ul data-type="taskList">
  <li data-type="taskItem" data-checked="false">Unchecked task</li>
  <li data-type="taskItem" data-checked="true">Checked task</li>
</ul>

This is useful when using the plugin with Tiptap's TaskList and TaskItem extensions.

Example:

import MarkdownIt from 'markdown-it';
import taskLists, { type TaskListOptions } from 'markdown-it-task-lists-ts';

const md = new MarkdownIt();
md.use(taskLists, {
  enabled: true,
  label: true,
  tiptapCompatible: true
});

Styling

The plugin provides default classes that you can style, or you can specify your own classes through the options:

/* Default styling */
.contains-task-list {
  list-style-type: none;
  padding-left: 0;
}

.task-list-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.task-list-item-checkbox {
  margin: 0;
}

.task-list-item-label {
  cursor: pointer;
}

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

License

MIT License - see the LICENSE file for details.

1.0.4

7 months ago

1.0.3

7 months ago

1.0.2

7 months ago

1.0.1

7 months ago

1.0.0

7 months ago