or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

core-list.mdindex.mdlegacy-support.mdlist-commands.mdlist-formatting.mdlist-properties.mdtodolist.md
tile.json

list-formatting.mddocs/

List Formatting

Font styling integration for list item markers including bold, italic, font size, font color, and font family formatting.

Capabilities

ListFormatting Plugin

Main plugin that enables formatting of list item markers by integrating with various formatting plugins.

/**
 * The list formatting feature.
 * It enables formatting of list item markers such as bold, italic, font size, font color, and font family.
 */
class ListFormatting extends Plugin {
  /** @inheritDoc */
  static get pluginName(): "ListFormatting";
  
  /** @inheritDoc */
  static get requires(): readonly [
    typeof ListItemBoldIntegration,
    typeof ListItemItalicIntegration,
    typeof ListItemFontSizeIntegration,
    typeof ListItemFontColorIntegration,
    typeof ListItemFontFamilyIntegration
  ];
  
  /** @inheritDoc */
  static override get isOfficialPlugin(): true;
}

Bold Integration

/**
 * The list item bold integration plugin.
 * It enables bold formatting for list item markers.
 */
class ListItemBoldIntegration extends Plugin {
  /** @inheritDoc */
  static get pluginName(): "ListItemBoldIntegration";
  
  /** @inheritDoc */
  static get requires(): readonly [typeof ListEditing, typeof Bold];
}

Italic Integration

/**
 * The list item italic integration plugin.
 * It enables italic formatting for list item markers.
 */
class ListItemItalicIntegration extends Plugin {
  /** @inheritDoc */
  static get pluginName(): "ListItemItalicIntegration";
  
  /** @inheritDoc */
  static get requires(): readonly [typeof ListEditing, typeof Italic];
}

Font Size Integration

/**
 * The list item font size integration plugin.
 * It enables font size formatting for list item markers.
 */
class ListItemFontSizeIntegration extends Plugin {
  /** @inheritDoc */
  static get pluginName(): "ListItemFontSizeIntegration";
  
  /** @inheritDoc */
  static get requires(): readonly [typeof ListEditing, typeof FontSize];
}

Font Color Integration

/**
 * The list item font color integration plugin.
 * It enables font color formatting for list item markers.
 */
class ListItemFontColorIntegration extends Plugin {
  /** @inheritDoc */
  static get pluginName(): "ListItemFontColorIntegration";
  
  /** @inheritDoc */
  static get requires(): readonly [typeof ListEditing, typeof FontColor];
}

Font Family Integration

/**
 * The list item font family integration plugin.
 * It enables font family formatting for list item markers.
 */
class ListItemFontFamilyIntegration extends Plugin {
  /** @inheritDoc */
  static get pluginName(): "ListItemFontFamilyIntegration";
  
  /** @inheritDoc */
  static get requires(): readonly [typeof ListEditing, typeof FontFamily];
}

Configuration

Enabling List Formatting

List formatting is controlled by the enableListItemMarkerFormatting option in the list configuration:

interface ListConfig {
  /**
   * Enables list item marker formatting. Current list of integrated formatting plugins includes:
   * - Font family
   * - Font size  
   * - Font color
   * - Bold
   * - Italic
   * 
   * @default true
   */
  enableListItemMarkerFormatting?: boolean;
}

Usage Examples

Basic Setup with List Formatting

import { ClassicEditor } from "@ckeditor/ckeditor5-editor-classic";
import { 
  List, 
  ListFormatting 
} from "@ckeditor/ckeditor5-list";
import { 
  Bold, 
  Italic, 
  FontSize, 
  FontColor, 
  FontFamily 
} from "@ckeditor/ckeditor5-basic-styles";

ClassicEditor
  .create(document.querySelector('#editor'), {
    plugins: [
      List, 
      ListFormatting,
      Bold, 
      Italic, 
      FontSize, 
      FontColor, 
      FontFamily
    ],
    toolbar: [
      'numberedList', 'bulletedList', '|',
      'bold', 'italic', '|',
      'fontSize', 'fontColor', 'fontFamily'
    ],
    list: {
      enableListItemMarkerFormatting: true
    }
  })
  .then(editor => {
    console.log('Editor with list formatting initialized');
  });

Selective Integration Setup

import { ClassicEditor } from "@ckeditor/ckeditor5-editor-classic";
import { 
  List,
  ListItemBoldIntegration,
  ListItemItalicIntegration,
  ListItemFontColorIntegration
} from "@ckeditor/ckeditor5-list";
import { Bold, Italic, FontColor } from "@ckeditor/ckeditor5-basic-styles";

// Setup with only specific formatting integrations
ClassicEditor
  .create(document.querySelector('#editor'), {
    plugins: [
      List,
      Bold,
      Italic, 
      FontColor,
      ListItemBoldIntegration,
      ListItemItalicIntegration,
      ListItemFontColorIntegration
    ],
    toolbar: [
      'numberedList', 'bulletedList', '|',
      'bold', 'italic', 'fontColor'
    ]
  })
  .then(editor => {
    // Only bold, italic, and font color will affect list markers
    console.log('Editor with selective list formatting initialized');
  });

Programmatic Formatting

// Apply formatting to list markers programmatically
const boldCommand = editor.commands.get('bold');
const italicCommand = editor.commands.get('italic');
const fontSizeCommand = editor.commands.get('fontSize');
const fontColorCommand = editor.commands.get('fontColor');

// Create a list first
const listCommand = editor.commands.get('numberedList');
listCommand.execute();

// Then apply formatting (will affect the list markers)
boldCommand.execute();
italicCommand.execute();
fontSizeCommand.execute({ value: '18px' });
fontColorCommand.execute({ value: '#ff0000' });

Monitoring Formatting State

// Monitor formatting commands for list marker updates
const formattingCommands = ['bold', 'italic', 'fontSize', 'fontColor', 'fontFamily'];

formattingCommands.forEach(commandName => {
  const command = editor.commands.get(commandName);
  
  command.on('change:value', () => {
    console.log(`${commandName} value changed:`, command.value);
    
    // Check if we're in a list
    const listCommand = editor.commands.get('numberedList') || editor.commands.get('bulletedList');
    if (listCommand && listCommand.value) {
      console.log('List marker formatting updated');
    }
  });
});

// Update UI based on current formatting in lists
function updateFormattingUI() {
  const selection = editor.model.document.selection;
  const listCommand = editor.commands.get('numberedList') || editor.commands.get('bulletedList');
  
  if (listCommand && listCommand.value) {
    // We're in a list, show formatting affects markers
    document.querySelector('#formatting-info').textContent = 
      'Formatting will affect list markers';
    
    // Update formatting button states
    const boldCommand = editor.commands.get('bold');
    const italicCommand = editor.commands.get('italic');
    
    document.querySelector('#bold-btn').classList.toggle('active', boldCommand.value);
    document.querySelector('#italic-btn').classList.toggle('active', italicCommand.value);
  } else {
    document.querySelector('#formatting-info').textContent = 
      'Formatting will affect text content';
  }
}

editor.model.document.selection.on('change', updateFormattingUI);

Custom Integration Plugin

import { Plugin } from 'ckeditor5/src/core';
import { ListEditing } from '@ckeditor/ckeditor5-list';

class ListItemUnderlineIntegration extends Plugin {
  static get pluginName() {
    return 'ListItemUnderlineIntegration';
  }
  
  static get requires() {
    return [ListEditing, 'Underline']; // Assuming Underline plugin exists
  }
  
  init() {
    const editor = this.editor;
    const listEditing = editor.plugins.get(ListEditing);
    
    // Register marker formatting for underline
    listEditing.registerDowncastStrategy({
      scope: 'listItem',
      attributeName: 'underline',
      
      // Define how underline should be applied to list markers
      strategy: (modelElement, conversionApi) => {
        const { writer, mapper } = conversionApi;
        const viewElement = mapper.toViewElement(modelElement);
        
        if (viewElement && modelElement.hasAttribute('underline')) {
          writer.setStyle('text-decoration', 'underline', viewElement);
        }
      }
    });
  }
}

// Usage
ClassicEditor
  .create(document.querySelector('#editor'), {
    plugins: [
      List,
      Underline,
      ListItemUnderlineIntegration
    ],
    toolbar: ['numberedList', 'bulletedList', 'underline']
  });

Disabling List Formatting

// Disable list item marker formatting entirely
ClassicEditor
  .create(document.querySelector('#editor'), {
    plugins: [List, Bold, Italic, FontSize],
    toolbar: ['numberedList', 'bulletedList', 'bold', 'italic', 'fontSize'],
    list: {
      enableListItemMarkerFormatting: false
    }
  })
  .then(editor => {
    // Formatting will only affect text content, not list markers
    console.log('List formatting disabled');
  });

Advanced Formatting Configuration

// Custom configuration with specific formatting options
ClassicEditor
  .create(document.querySelector('#editor'), {
    plugins: [
      List, 
      ListFormatting,
      Bold, 
      Italic, 
      FontSize, 
      FontColor, 
      FontFamily
    ],
    list: {
      enableListItemMarkerFormatting: true
    },
    fontSize: {
      options: [9, 11, 13, 'default', 17, 19, 21]
    },
    fontColor: {
      colors: [
        { color: '#000000', label: 'Black' },
        { color: '#FF0000', label: 'Red' },
        { color: '#00FF00', label: 'Green' },
        { color: '#0000FF', label: 'Blue' }
      ]
    },
    fontFamily: {
      options: [
        'default',
        'Arial, Helvetica, sans-serif',
        'Georgia, serif',
        'Impact, Charcoal, sans-serif',
        'Tahoma, Geneva, sans-serif'
      ]
    }
  })
  .then(editor => {
    console.log('Advanced list formatting configured');
  });