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

properties.mddocs/

Properties and Attributes

CSS styling, HTML attributes, and class management utilities providing type-safe property operations, computed style access, and attribute manipulation.

Capabilities

CSS Style Management

Comprehensive CSS property manipulation with computed style access and batch operations.

/**
 * Set single CSS property on element
 * @param element - Element to style
 * @param property - CSS property name (e.g., 'color', 'margin-top')
 * @param value - CSS value as string
 */
function set(element: SugarElement<Node>, property: string, value: string): void;

/**
 * Set multiple CSS properties at once
 * @param element - Element to style
 * @param css - Object mapping property names to values
 */
function setAll(element: SugarElement<Node>, css: Record<string, string>): void;

/**
 * Set CSS properties from object with optional values
 * @param element - Element to style  
 * @param css - Object mapping property names to optional values
 */
function setOptions(element: SugarElement<Node>, css: Record<string, Optional<string>>): void;

/**
 * Get computed CSS property value
 * @param element - Element to read from
 * @param property - CSS property name to retrieve
 * @returns Computed CSS value as string
 */
function get(element: SugarElement<Element>, property: string): string;

/**
 * Get raw CSS property value from element's style attribute
 * @param element - Element to read from
 * @param property - CSS property name to retrieve
 * @returns Raw CSS value from style attribute, if set
 */
function getRaw(element: SugarElement<Node>, property: string): Optional<string>;

/**
 * Get all raw CSS properties from element's style attribute
 * @param element - Element to read from
 * @returns Object containing all style attribute properties
 */
function getAllRaw(element: SugarElement<Node>): Record<string, string>;

/**
 * Check if CSS value is valid for given property
 * @param tag - HTML tag name context
 * @param property - CSS property name
 * @param value - CSS value to validate
 * @returns True if value is valid for property
 */
function isValidValue(tag: string, property: string, value: string): boolean;

/**
 * Remove CSS property from element
 * @param element - Element to modify
 * @param property - CSS property name to remove
 */
function remove(element: SugarElement<Node>, property: string): void;

/**
 * Preserve element's current styles during operation
 * @param element - Element to preserve styles for
 * @param f - Function to execute while preserving styles
 * @returns Return value of function f
 */
function preserve<E extends Element, T>(element: SugarElement<E>, f: (e: SugarElement<E>) => T): T;

/**
 * Copy all styles from source to target element
 * @param source - Element to copy styles from
 * @param target - Element to copy styles to
 */
function copy(source: SugarElement<Node>, target: SugarElement<HTMLElement>): void;

/**
 * Force browser reflow/repaint of element
 * @param e - Element to reflow
 */
function reflow(e: SugarElement<HTMLElement>): void;

/**
 * Transfer specific CSS properties from source to destination
 * @param source - Element to copy properties from
 * @param destination - Element to copy properties to
 * @param styles - Array of CSS property names to transfer
 */
function transfer(source: SugarElement<Node>, destination: SugarElement<Node>, styles: string[]): void;

Usage Examples:

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

const element = SugarElement.fromTag('div');

// Set individual styles
Css.set(element, 'color', 'blue');
Css.set(element, 'margin-top', '20px');

// Set multiple styles
Css.setAll(element, {
  'background-color': 'lightblue',
  'padding': '10px',
  'border-radius': '5px'
});

// Get computed styles
const color = Css.get(element, 'color');
const marginTop = Css.get(element, 'margin-top');

// Conditional styling with optional values
Css.setOptions(element, {
  'display': Optional.some('block'),
  'visibility': Optional.none() // Won't be set
});

// Preserve styles during DOM manipulation
Css.preserve(element, (elem) => {
  // Perform operations that might affect styles
  // Original styles will be restored after
  return someOperation(elem);
});

CSS Property Managers

Object-oriented approach to managing specific CSS properties.

/**
 * Create CSS property manager for specific property/value combination
 * @param property - CSS property name
 * @param value - CSS value to manage
 * @returns Property manager object
 */
function CssProperty(property: string, value: string): CssProperty;

interface CssProperty {
  /** Check if element has this property set to managed value */
  readonly is: (element: SugarElement<Element>) => boolean;
  /** Remove this property from element */
  readonly remove: (element: SugarElement<Element>) => void;
  /** Set this property to managed value on element */
  readonly set: (element: SugarElement<Element>) => void;
}

Usage Examples:

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

// Create property managers for common styles
const hiddenProperty = CssProperty('display', 'none');
const visibleProperty = CssProperty('visibility', 'visible');

const element = SugarElement.fromTag('div');

// Use property managers
hiddenProperty.set(element);           // Sets display: none
console.log(hiddenProperty.is(element)); // true

hiddenProperty.remove(element);        // Removes display property
console.log(hiddenProperty.is(element)); // false

CSS Class Management

Type-safe class manipulation with toggle support.

/**
 * Add CSS class to element
 * @param element - Element to modify
 * @param clazz - CSS class name to add
 */
function add(element: SugarElement<Element>, clazz: string): void;

/**
 * Remove CSS class from element
 * @param element - Element to modify
 * @param clazz - CSS class name to remove
 */
function remove(element: SugarElement<Element>, clazz: string): void;

/**
 * Toggle CSS class on element
 * @param element - Element to modify
 * @param clazz - CSS class name to toggle
 * @returns True if class is now present, false if removed
 */
function toggle(element: SugarElement<Element>, clazz: string): boolean;

/**
 * Create class toggler for element/class combination
 * @param element - Element to create toggler for
 * @param clazz - CSS class name to toggle
 * @returns Toggler object for programmatic control
 */
function toggler(element: SugarElement<Element>, clazz: string): Toggler;

/**
 * Check if element has specific CSS class
 * @param element - Element to check
 * @param clazz - CSS class name to look for
 * @returns True if element has the class
 */
function has(element: SugarElement<Node>, clazz: string): boolean;

Usage Examples:

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

const button = SugarElement.fromTag('button');

// Basic class management
Class.add(button, 'btn');
Class.add(button, 'btn-primary');
console.log(Class.has(button, 'btn')); // true

// Toggle functionality
const isActive = Class.toggle(button, 'active'); // Returns true if now active
Class.toggle(button, 'active'); // Removes 'active' class

// Create reusable toggler
const activeToggler = Class.toggler(button, 'active');
activeToggler.on();     // Add 'active' class
activeToggler.off();    // Remove 'active' class
activeToggler.toggle(); // Toggle 'active' class
console.log(activeToggler.isOn()); // Check current state

Generic Toggler

Flexible toggling system for any on/off operations.

/**
 * Create generic toggler with custom turn-on/turn-off functions
 * @param turnOff - Function to call for "off" state
 * @param turnOn - Function to call for "on" state  
 * @param initial - Initial state (true = on, false = off)
 * @returns Toggler object
 */
function Toggler(turnOff: () => void, turnOn: () => void, initial: boolean): Toggler;

interface Toggler {
  /** Turn toggler on (execute turnOn function) */
  readonly on: () => void;
  /** Turn toggler off (execute turnOff function) */
  readonly off: () => void;
  /** Toggle current state */
  readonly toggle: () => void;
  /** Check if currently in "on" state */
  readonly isOn: () => boolean;
}

HTML Attribute Management

Comprehensive attribute manipulation with type-safe operations.

/**
 * Set HTML attribute on element
 * @param element - Element to modify
 * @param key - Attribute name
 * @param value - Attribute value (string, boolean, or number)
 */
function set(element: SugarElement<Element>, key: string, value: string | boolean | number): void;

/**
 * Set multiple attributes at once
 * @param element - Element to modify
 * @param attrs - Object mapping attribute names to values
 */
function setAll(element: SugarElement<Element>, attrs: Record<string, string | boolean | number>): void;

/**
 * Set attributes from object with optional values
 * @param element - Element to modify
 * @param attrs - Object mapping attribute names to optional values
 */
function setOptions(element: SugarElement<Element>, attrs: Record<string, Optional<string | boolean | number>>): void;

/**
 * Get attribute value from element
 * @param element - Element to read from
 * @param key - Attribute name to retrieve
 * @returns Attribute value as string, or undefined if not set
 */
function get(element: SugarElement<Element>, key: string): undefined | string;

/**
 * Safely get attribute value from element
 * @param element - Element to read from
 * @param key - Attribute name to retrieve
 * @returns Optional containing attribute value
 */
function getOpt(element: SugarElement<Element>, key: string): Optional<string>;

/**
 * Check if element has specific attribute
 * @param element - Element to check
 * @param key - Attribute name to look for
 * @returns True if attribute exists (regardless of value)
 */
function has(element: SugarElement<Node>, key: string): boolean;

/**
 * Remove attribute from element
 * @param element - Element to modify
 * @param key - Attribute name to remove
 */
function remove(element: SugarElement<Element>, key: string): void;

/**
 * Check if element has no attributes
 * @param element - Element to check
 * @returns True if element has no attributes at all
 */
function hasNone(element: SugarElement<Node>): boolean;

/**
 * Clone all attributes from element into object
 * @param element - Element to read attributes from
 * @returns Object containing all attribute name/value pairs
 */
function clone(element: SugarElement<Element>): Record<string, string>;

/**
 * Transfer specific attributes from source to destination
 * @param source - Element to copy attributes from
 * @param destination - Element to copy attributes to
 * @param attrs - Array of attribute names to transfer
 */
function transfer(source: SugarElement<Element>, destination: SugarElement<Element>, attrs: string[]): void;

Usage Examples:

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

const input = SugarElement.fromTag('input');

// Set individual attributes
Attribute.set(input, 'type', 'email');
Attribute.set(input, 'required', true);
Attribute.set(input, 'maxlength', 100);

// Set multiple attributes
Attribute.setAll(input, {
  'placeholder': 'Enter your email',
  'class': 'form-control',
  'aria-label': 'Email address'
});

// Get attribute values
const inputType = Attribute.get(input, 'type'); // 'email'
const isRequired = Attribute.has(input, 'required'); // true

// Safe attribute access
const placeholderOpt = Attribute.getOpt(input, 'placeholder');
placeholderOpt.each(placeholder => {
  console.log('Placeholder text:', placeholder);
});

// Clone attributes for reuse
const attrs = Attribute.clone(input);
const newInput = SugarElement.fromTag('input');
Attribute.setAll(newInput, attrs);

Attribute Property Managers

Object-oriented approach to managing specific HTML attributes.

/**
 * Create attribute property manager for specific attribute/value combination
 * @param attribute - HTML attribute name
 * @param value - Attribute value to manage
 * @returns Property manager object
 */
function AttributeProperty(attribute: string, value: string): AttributeProperty;

interface AttributeProperty {
  /** Check if element has this attribute set to managed value */
  readonly is: (element: SugarElement<Element>) => boolean;
  /** Remove this attribute from element */
  readonly remove: (element: SugarElement<Element>) => void;
  /** Set this attribute to managed value on element */
  readonly set: (element: SugarElement<Element>) => void;
}

Usage Examples:

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

// Create attribute managers
const hiddenAttribute = AttributeProperty('hidden', 'true');
const disabledAttribute = AttributeProperty('disabled', 'disabled');

const element = SugarElement.fromTag('button');

// Use attribute managers
disabledAttribute.set(element);           // Sets disabled="disabled"
console.log(disabledAttribute.is(element)); // true

disabledAttribute.remove(element);        // Removes disabled attribute
console.log(disabledAttribute.is(element)); // false

HTML Content Management

Safe HTML content manipulation utilities.

/**
 * Get HTML content from element
 * @param element - Element to read HTML from
 * @returns Inner HTML content as string
 */
function get(element: SugarElement<Element>): string;

/**
 * Set HTML content of element
 * @param element - Element to modify
 * @param value - HTML string to set as content
 */
function set(element: SugarElement<Element>, value: string): void;

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

Multiple Class Operations

Manage multiple CSS classes simultaneously with array-based operations.

/**
 * Add multiple classes to element
 * @param element - Element to add classes to
 * @param classes - Array of class names to add
 */
function add(element: SugarElement<Element>, classes: string[]): void;

/**
 * Remove multiple classes from element
 * @param element - Element to remove classes from
 * @param classes - Array of class names to remove
 */
function remove(element: SugarElement<Element>, classes: string[]): void;

/**
 * Toggle multiple classes on element
 * @param element - Element to toggle classes on
 * @param classes - Array of class names to toggle
 */
function toggle(element: SugarElement<Element>, classes: string[]): void;

/**
 * Test if element has all specified classes
 * @param element - Element to test
 * @param classes - Array of class names to check
 * @returns True if all classes are present
 */
function hasAll(element: SugarElement<Node>, classes: string[]): boolean;

/**
 * Test if element has any of the specified classes
 * @param element - Element to test
 * @param classes - Array of class names to check
 * @returns True if any class is present
 */
function hasAny(element: SugarElement<Node>, classes: string[]): boolean;

/**
 * Get all classes from element as array
 * @param element - Element to read classes from
 * @returns Array of all class names
 */
function get(element: SugarElement<Element>): string[];

Form Element Values

Get and set values for form input elements with type-safe operations.

/**
 * Get value from form element
 * @param element - Form element to read value from
 * @returns Current value as string
 */
function get(element: SugarElement<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>): string;

/**
 * Set value on form element
 * @param element - Form element to set value on
 * @param value - Value to set
 */
function set(element: SugarElement<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>, value: string): void;

/**
 * Get value from element safely (returns Optional)
 * @param element - Element to read value from
 * @returns Value wrapped in Optional
 */
function getOpt(element: SugarElement<Node>): Optional<string>;

Text Content Management

Manage text content of elements with safe text operations.

/**
 * Get text content from element
 * @param element - Element to read text from
 * @returns Text content as string
 */
function get(element: SugarElement<Node>): string;

/**
 * Set text content of element
 * @param element - Element to set text on
 * @param value - Text content to set
 */
function set(element: SugarElement<Node>, value: string): void;

/**
 * Get text content safely (returns Optional)
 * @param element - Element to read text from
 * @returns Text content wrapped in Optional
 */
function getOption(element: SugarElement<Node>): Optional<string>;

Checkbox State Management

Manage checked state of checkbox and radio button elements.

/**
 * Get checked state of checkbox/radio element
 * @param element - Checkbox or radio element
 * @returns True if element is checked
 */
function get(element: SugarElement<HTMLInputElement>): boolean;

/**
 * Set checked state of checkbox/radio element
 * @param element - Checkbox or radio element
 * @param state - New checked state
 */
function set(element: SugarElement<HTMLInputElement>, state: boolean): void;

Content Editable Management

Manage contentEditable attribute state on elements.

/**
 * Get contentEditable state
 * @param element - Element to check
 * @returns ContentEditable state string
 */
function get(element: SugarElement<HTMLElement>): string;

/**
 * Set element as editable
 * @param element - Element to make editable
 */
function on(element: SugarElement<HTMLElement>): void;

/**
 * Set element as non-editable
 * @param element - Element to make non-editable
 */
function off(element: SugarElement<HTMLElement>): void;

/**
 * Check if element is editable
 * @param element - Element to test
 * @returns True if element is contentEditable
 */
function isOn(element: SugarElement<Node>): boolean;

Additional Property Utilities

Specialized utilities for text direction, float properties, and attribute lists.

// Direction utilities
function isRtl(element: SugarElement<Node>): boolean;
function getDirection(element: SugarElement<Node>): 'rtl' | 'ltr';

// Float utilities  
function get(element: SugarElement<Element>): string;
function set(element: SugarElement<Element>, value: string): void;

// Element alignment utilities
function isCenter(element: SugarElement<HTMLElement>): boolean;
function isLeft(element: SugarElement<HTMLElement>): boolean;
function isRight(element: SugarElement<HTMLElement>): boolean;
function isJustify(element: SugarElement<HTMLElement>): boolean;

// Attribute list operations
function clone(element: SugarElement<Element>): Record<string, string>;
function copy(source: SugarElement<Element>, target: SugarElement<Element>): void;

Types

// Property manager interfaces
interface CssProperty {
  readonly is: (element: SugarElement<Element>) => boolean;
  readonly remove: (element: SugarElement<Element>) => void;
  readonly set: (element: SugarElement<Element>) => void;
}

interface AttributeProperty {
  readonly is: (element: SugarElement<Element>) => boolean;
  readonly remove: (element: SugarElement<Element>) => void;
  readonly set: (element: SugarElement<Element>) => void;
}

// Toggler interface for state management
interface Toggler {
  readonly on: () => void;
  readonly off: () => void;
  readonly toggle: () => void;
  readonly isOn: () => boolean;
}

// Optional type from @ephox/katamari
interface Optional<T> {
  isSome(): boolean;
  isNone(): boolean;
  getOr<U>(def: U): T | U;
  each(f: (t: T) => void): void;
}