library-ts/browser/dom/ClassFlag.ts

205 lines
4.7 KiB
TypeScript
Raw Normal View History

2025-03-08 08:16:54 +00:00
import { RegExpUtility } from "../text/RegExpUtitlity";
import { DOMEditor } from "./DOMEditor";
export class ClassFlag
{
static readonly active = new ClassFlag( "active" );
static readonly inactive = new ClassFlag( "inactive" );
static readonly enabled = new ClassFlag( "enabled" );
static readonly disabled = new ClassFlag( "disabled" );
static readonly button = new ClassFlag( "button" );
static readonly visible = new ClassFlag( "visible" );
static readonly invisible = new ClassFlag( "invisible" );
static readonly hidden = new ClassFlag( "hidden" );
static readonly show = new ClassFlag( "show" );
static readonly hideable = new ClassFlag( "hideable" );
static readonly playing = new ClassFlag( "playing" );
static readonly paused = new ClassFlag( "paused" );
static readonly error = new ClassFlag( "error" );
static readonly warning = new ClassFlag( "warning" );
static readonly ok = new ClassFlag( "ok" );
static readonly debugging = new ClassFlag( "debugging" );
static readonly loggedIn = new ClassFlag( "logged-in" );
static readonly loggedOut = new ClassFlag( "logged-out" );
static readonly hovered = new ClassFlag( "hovered" );
static readonly selected = new ClassFlag( "selected" );
static readonly dragging = new ClassFlag( "dragging" );
static readonly smooth = new ClassFlag( "smooth" );
static readonly debug = new ClassFlag( "debug" );
static readonly open = new ClassFlag( "open" );
static readonly default = new ClassFlag( "default" );
static readonly clickable = new ClassFlag( "clickable" );
private _value:string;
constructor( value:string )
{
this._value = value;
}
2025-09-06 11:33:04 +00:00
static isIn( flag:string, element:Element )
{
return new ClassFlag( flag ).in( element );
}
2025-03-08 08:16:54 +00:00
static fromEnum( value:string, prefix = "", appendix = "" )
{
let flag = value.toLowerCase().replace( "_", "-" );
return new ClassFlag( prefix + flag + appendix );
}
get selector()
{
return "." + this._value;
}
query( element:Element )
{
return element.querySelector( this.selector );
}
queryAll( element:Element )
{
return DOMEditor.nodeListToArray( element.querySelectorAll( this.selector ) );
}
forEachInDoc( callback:( n:Element ) => void )
{
let all = this.queryAll( document.body );
for ( let i = 0; i < all.length; i++)
{
callback( all[ i ] );
}
}
forEachIn( source:Element, callback:( n:Element ) => void )
{
let all = this.queryAll( source);
for ( let i = 0; i < all.length; i++)
{
callback( all[ i ] );
}
}
queryPrefixed( element:Element )
{
return element.querySelector( `[class^="${this._value}"]` );
}
queryPrefixedAll( element:Element )
{
return element.querySelectorAll( `[class^="${this._value}"]` );
}
queryDoc()
{
return document.querySelector( this.selector );
}
set( element:Element )
{
ClassFlag.setClass( element, this._value, true );
return element;
}
setAll( elements:Element[], selectedElement:Element )
{
elements.forEach( e => this.setAs( e, e === selectedElement ) );
}
setSolo( element:Element )
{
element.setAttribute( "class", this._value );
}
setAs( element:Element, value:boolean )
{
ClassFlag.setClass( element, this._value, value );
return element;
}
removeFrom( element:Element )
{
ClassFlag.setClass( element, this._value, false );
return element;
}
toggle( element:Element )
{
ClassFlag.toggleClass( element, this._value );
return element;
}
in( element:Element )
{
return ClassFlag.hasClass( element, this._value );
}
static clear( element: Element )
{
element.removeAttribute( "class" );
}
static assign( element:Element, value:string )
{
new ClassFlag( value ).set( element );
}
2025-09-06 11:33:04 +00:00
2025-03-08 08:16:54 +00:00
static addClass( element:Element, classString:string )
{
2025-09-06 11:33:04 +00:00
element.classList.add( classString );
2025-03-08 08:16:54 +00:00
}
static removeClass( element:Element, classString:string )
{
2025-09-06 11:33:04 +00:00
element.classList.remove( classString );
2025-03-08 08:16:54 +00:00
}
static hasClass( element:Element, classString:string )
{
2025-09-06 11:33:04 +00:00
return element.classList.contains( classString );
2025-03-08 08:16:54 +00:00
}
static toggleClass( element:Element, className:string )
{
2025-09-06 11:33:04 +00:00
element.classList.toggle( className );
2025-03-08 08:16:54 +00:00
}
static setClass( element:Element, classString:string, enable:boolean )
{
if ( enable )
{
ClassFlag.addClass( element, classString );
}
else
{
ClassFlag.removeClass( element, classString );
}
}
static toggleClassState( element:Element, classString:string )
{
let hasClassAssigned = ClassFlag.hasClass( element, classString );
ClassFlag.setClass( element, classString, ! hasClassAssigned );
}
}