or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

dom.mdevents.mdindex.mdnode.mdproperties.mdsearch.mdselection.mdtag.mdview.md
tile.json

dom.mddocs/

DOM Manipulation

Core DOM operations for inserting, removing, cloning, and structurally modifying elements. Provides type-safe alternatives to native DOM manipulation with consistent API patterns.

Capabilities

Element Insertion

Insert elements at specific positions in the DOM tree with precise control over placement.

/**
 * Insert element as the last child of parent
 * @param parent - Container element to append to
 * @param element - Element to insert
 */
function append(parent: SugarElement<Node>, element: SugarElement<Node>): void;

/**
 * Insert element as the first child of parent  
 * @param parent - Container element to prepend to
 * @param element - Element to insert
 */
function prepend(parent: SugarElement<Node>, element: SugarElement<Node>): void;

/**
 * Insert element immediately before the marker element
 * @param marker - Reference element for insertion point
 * @param element - Element to insert
 */
function before(marker: SugarElement<Node>, element: SugarElement<Node>): void;

/**
 * Insert element immediately after the marker element
 * @param marker - Reference element for insertion point  
 * @param element - Element to insert
 */
function after(marker: SugarElement<Node>, element: SugarElement<Node>): void;

/**
 * Insert element at specific index within parent's children
 * @param parent - Container element
 * @param element - Element to insert
 * @param index - Zero-based position for insertion
 */
function appendAt(parent: SugarElement<Node>, element: SugarElement<Node>, index: number): void;

/**
 * Wrap an element with a wrapper element
 * @param element - Element to be wrapped
 * @param wrapper - Wrapper element
 */
function wrap(element: SugarElement<Node>, wrapper: SugarElement<Node>): void;

Usage Examples:

import { SugarElement, Insert } from "@ephox/sugar";

// Create elements
const container = SugarElement.fromTag('div');
const header = SugarElement.fromTag('h1');
const paragraph = SugarElement.fromTag('p');

// Append to container
Insert.append(container, header);
Insert.append(container, paragraph);

// Insert at specific position
const newDiv = SugarElement.fromTag('div');
Insert.appendAt(container, newDiv, 1); // Between header and paragraph

// Wrap existing element
const wrapper = SugarElement.fromTag('section');
Insert.wrap(container, wrapper);

Bulk Insertion

Insert multiple elements efficiently in a single operation.

/**
 * Insert multiple elements before the marker element
 * @param marker - Reference element for insertion point
 * @param elements - Array of elements to insert
 */
function before(marker: SugarElement<Node>, elements: SugarElement<Node>[]): void;

/**
 * Insert multiple elements after the marker element
 * @param marker - Reference element for insertion point
 * @param elements - Array of elements to insert
 */
function after(marker: SugarElement<Node>, elements: SugarElement<Node>[]): void;

/**
 * Insert multiple elements as first children of parent
 * @param parent - Container element
 * @param elements - Array of elements to insert
 */
function prepend(parent: SugarElement<Node>, elements: SugarElement<Node>[]): void;

/**
 * Insert multiple elements as last children of parent
 * @param parent - Container element  
 * @param elements - Array of elements to insert
 */
function append(parent: SugarElement<Node>, elements: SugarElement<Node>[]): void;

Element Removal

Remove elements from the DOM with different strategies for handling children.

/**
 * Remove element from its parent, destroying the element
 * @param element - Element to remove
 */
function remove(element: SugarElement<Node>): void;

/**
 * Remove all children from element but keep the element itself
 * @param element - Element to empty
 */
function empty(element: SugarElement<Node>): void;

/**
 * Remove wrapper element but keep its children in place
 * @param wrapper - Wrapper element to remove
 */
function unwrap(wrapper: SugarElement<Node>): void;

Usage Examples:

import { Remove } from "@ephox/sugar";

// Remove element completely
Remove.remove(oldElement);

// Clear content but keep element
Remove.empty(container);

// Remove wrapper, preserve children
Remove.unwrap(temporaryWrapper);

Element Cloning and Replication

Create copies of elements with different levels of depth and tag mutation.

/**
 * Create shallow copy of element (no children copied)
 * @param original - Element to clone
 * @returns Cloned element without children
 */
function shallow<E extends Node>(original: SugarElement<E>): SugarElement<E>;

/**
 * Create deep copy of element including all children
 * @param original - Element to clone  
 * @returns Cloned element with all descendants
 */
function deep<E extends Node>(original: SugarElement<E>): SugarElement<E>;

/**
 * Create shallow copy with different tag name
 * @param original - Element to clone
 * @param tag - New tag name for the clone
 * @returns Cloned element with new tag, no children
 */
function shallowAs<K extends keyof HTMLElementFullTagNameMap>(
  original: SugarElement<Element>, 
  tag: K
): SugarElement<HTMLElementFullTagNameMap[K]>;

/**
 * Create deep copy with different tag name
 * @param original - Element to clone
 * @param tag - New tag name for the clone
 * @returns Cloned element with new tag and all children
 */
function copy<K extends keyof HTMLElementFullTagNameMap>(
  original: SugarElement<Element>, 
  tag: K
): SugarElement<HTMLElementFullTagNameMap[K]>;

/**
 * Change element's tag name while preserving children
 * @param original - Element to mutate
 * @param tag - New tag name
 * @returns New element with different tag, same children
 */
function mutate<K extends keyof HTMLElementFullTagNameMap>(
  original: SugarElement<Element>, 
  tag: K
): SugarElement<HTMLElementFullTagNameMap[K]>;

Element Comparison

Compare elements for equality and containment relationships.

/**
 * Test if two elements refer to the same DOM node
 * @param e1 - First element
 * @param e2 - Second element  
 * @returns True if elements are identical
 */
function eq(e1: SugarElement<unknown>, e2: SugarElement<unknown>): boolean;

/**
 * Test if two elements are structurally equal (same content)
 * @param e1 - First element
 * @param e2 - Second element
 * @returns True if elements have same structure and content
 */
function isEqualNode(e1: SugarElement<Node>, e2: SugarElement<Node>): boolean;

/**
 * Test if element is contained within another element
 * @param container - Potential container element
 * @param contained - Element that might be contained
 * @returns True if container contains the element
 */
function contains(container: SugarElement<Node>, contained: SugarElement<Node>): boolean;

/**
 * Test if element is a member of an array of elements
 * @param element - Element to search for
 * @param elements - Array of elements to search in
 * @returns True if element is found in array
 */
function member(element: SugarElement<unknown>, elements: SugarElement<unknown>[]): boolean;

Focus Management

Manage element focus states and find focused elements within the DOM.

/**
 * Set focus to an element with optional scroll prevention
 * @param element - Element to focus
 * @param preventScroll - Whether to prevent automatic scrolling
 */
function focus(element: SugarElement<HTMLElement>, preventScroll?: boolean): void;

/**
 * Remove focus from an element
 * @param element - Element to blur
 */
function blur(element: SugarElement<HTMLElement>): void;

/**
 * Check if element currently has focus
 * @param element - Element to test
 * @returns True if element has focus
 */
function hasFocus(element: SugarElement<Node>): boolean;

/**
 * Get the currently active (focused) element
 * @param root - Root node to search within
 * @returns Active element if found
 */
function active<T extends HTMLElement>(root?: RootNode): Optional<SugarElement<T>>;

/**
 * Focus element only if no descendant already has focus
 * @param element - Element to conditionally focus
 */
function focusInside(element: SugarElement<HTMLElement>): void;

/**
 * Find focused descendant within element
 * @param element - Element to search within
 * @returns Focused descendant if found
 */
function search(element: SugarElement<Node>): Optional<SugarElement<HTMLElement>>;

Document Position and Hierarchy

Work with document positions and element hierarchies for complex positioning operations.

/**
 * Test if one position comes after another in document order
 * @param start - Starting element
 * @param soffset - Starting offset
 * @param finish - Ending element  
 * @param foffset - Ending offset
 * @returns True if start position is after finish position
 */
function after(
  start: SugarElement<Node>, 
  soffset: number, 
  finish: SugarElement<Node>, 
  foffset: number
): boolean;

/**
 * Find common ancestor of two positions
 * @param start - Starting element
 * @param soffset - Starting offset
 * @param finish - Ending element
 * @param foffset - Ending offset  
 * @returns Common ancestor element
 */
function commonAncestorContainer(
  start: SugarElement<Node>, 
  soffset: number, 
  finish: SugarElement<Node>, 
  foffset: number
): SugarElement<Node>;

/**
 * Generate array of indices representing path from ancestor to descendant
 * @param ancestor - Starting ancestor element
 * @param descendant - Target descendant element
 * @returns Array of child indices forming path, if valid
 */
function path(ancestor: SugarElement<Node>, descendant: SugarElement<Node>): Optional<number[]>;

/**
 * Follow a path of child indices from ancestor to find descendant
 * @param ancestor - Starting ancestor element
 * @param descendantPath - Array of child indices to follow
 * @returns Found descendant element, if path is valid
 */
function follow(ancestor: SugarElement<Node>, descendantPath: number[]): Optional<SugarElement<Node>>;

HTML Content and Links

Manage HTML content and external resource links.

/**
 * Get outer HTML of element (handles Shadow DOM)
 * @param element - Element to get HTML from
 * @returns Complete HTML string including element tags
 */
function getOuter(element: SugarElement<Node>): string;

/**
 * Add stylesheet link to document head
 * @param url - URL of stylesheet to load
 * @param scope - Document to add link to (defaults to current document)
 * @returns Created link element
 */
function addStylesheet(url: string, scope?: SugarElement<Document>): SugarElement<HTMLLinkElement>;

/**
 * Get HTML representation of element, with Shadow DOM safety
 * @param element - Element to get HTML from
 * @returns HTML string, or '#shadow-root' for shadow roots
 */
function getHtml(element: SugarElement<Node>): string;

Types

// Re-exported from other modules
type RootNode = SugarElement<Document | ShadowRoot>;