Comprehensive UI widget toolkit for building desktop-like web applications with layouts, panels, tabs, menus, and other interactive components
npx @tessl/cli install tessl/npm-lumino--widgets@2.7.0Lumino Widgets is a comprehensive UI widget toolkit for building desktop-like web applications. It provides a flexible widget system with layout management, panels, menus, docking, tabs, and many other UI components for creating sophisticated user interfaces that mimic desktop application experiences in the browser.
npm install @lumino/widgetsimport { Widget, BoxPanel, DockPanel, TabBar, MenuBar } from "@lumino/widgets";For CommonJS:
const { Widget, BoxPanel, DockPanel, TabBar, MenuBar } = require("@lumino/widgets");import { Widget, BoxPanel, DockPanel, TabPanel } from "@lumino/widgets";
// Create widgets
const widget1 = new Widget({ node: document.createElement('div') });
widget1.node.textContent = 'Widget 1';
widget1.title.label = 'First Widget';
const widget2 = new Widget({ node: document.createElement('div') });
widget2.node.textContent = 'Widget 2';
widget2.title.label = 'Second Widget';
// Create a tab panel to organize widgets
const tabPanel = new TabPanel();
tabPanel.addWidget(widget1);
tabPanel.addWidget(widget2);
// Create a dock panel for advanced layout
const dockPanel = new DockPanel();
dockPanel.addWidget(tabPanel);
// Attach to DOM
Widget.attach(dockPanel, document.body);Lumino Widgets is built around several key architectural concepts:
Widget is the base class for all UI components, providing lifecycle management, event handling, and DOM integrationLayout classes manage widget positioning and sizing within containersPanel, BoxPanel, SplitPanel, etc.) that combine widgets with specific layoutsTitle objects provide metadata (labels, icons, captions) for widgets in containers like tabs and menusCore widget system providing the foundational classes for building UI components.
class Widget {
constructor(options?: Widget.IOptions);
readonly node: HTMLElement;
readonly isDisposed: boolean;
readonly isAttached: boolean;
readonly isHidden: boolean;
readonly isVisible: boolean;
readonly title: Title<Widget>;
parent: Widget | null;
layout: Layout | null;
dispose(): void;
show(): void;
hide(): void;
update(): void;
fit(): void;
}
class Title<T> {
constructor(options: Title.IOptions<T>);
readonly owner: T;
label: string;
icon: VirtualElement.IRenderer | undefined;
iconClass: string;
caption: string;
className: string;
closable: boolean;
}
abstract class Layout {
parent: Widget | null;
readonly isDisposed: boolean;
abstract dispose(): void;
abstract widgets(): IterableIterator<Widget>;
fit(): void;
update(): void;
}Flexible layout managers for organizing widgets with different arrangement patterns.
class BoxLayout extends Layout {
constructor(options?: BoxLayout.IOptions);
direction: BoxLayout.Direction;
alignment: BoxLayout.Alignment;
spacing: number;
insertWidget(index: number, widget: Widget): void;
removeWidget(widget: Widget): void;
}
class GridLayout extends Layout {
constructor(options?: GridLayout.IOptions);
readonly rowCount: number;
readonly columnCount: number;
rowSpacing: number;
columnSpacing: number;
}
class SplitLayout extends Layout {
constructor(options: SplitLayout.IOptions);
orientation: SplitLayout.Orientation;
alignment: SplitLayout.Alignment;
spacing: number;
readonly handles: ReadonlyArray<HTMLDivElement>;
setRelativeSizes(sizes: number[], update?: boolean): void;
}
class AccordionLayout extends SplitLayout {
constructor(options?: AccordionLayout.IOptions);
readonly renderer: AccordionLayout.IRenderer;
titleSpace: number;
collapse(index: number): void;
expand(index: number): void;
isExpanded(index: number): boolean;
}
class DockLayout extends Layout {
constructor(options: DockLayout.IOptions);
readonly renderer: DockLayout.IRenderer;
spacing: number;
readonly isEmpty: boolean;
addWidget(widget: Widget, options?: DockLayout.IAddOptions): void;
saveLayout(): DockLayout.ILayoutConfig;
restoreLayout(config: DockLayout.ILayoutConfig): void;
}Container widgets that combine layout managers with widget collections for common UI patterns.
class Panel extends Widget {
constructor(options?: Panel.IOptions);
readonly widgets: ReadonlyArray<Widget>;
addWidget(widget: Widget): void;
insertWidget(index: number, widget: Widget): void;
}
class BoxPanel extends Panel {
constructor(options?: BoxPanel.IOptions);
direction: BoxPanel.Direction;
alignment: BoxPanel.Alignment;
spacing: number;
}
class DockPanel extends Panel {
constructor(options?: DockPanel.IOptions);
readonly isEmpty: boolean;
mode: DockPanel.Mode;
tabsMovable: boolean;
readonly selectedWidgets: ReadonlyArray<Widget>;
readonly tabBars: ReadonlyArray<TabBar<Widget>>;
addWidget(widget: Widget, options?: DockPanel.IAddOptions): void;
saveLayout(): DockPanel.ILayoutConfig;
restoreLayout(config: DockPanel.ILayoutConfig): void;
}
class TabPanel extends Panel {
constructor(options?: TabPanel.IOptions);
currentIndex: number;
readonly currentWidget: Widget | null;
tabsMovable: boolean;
tabPlacement: TabPanel.TabPlacement;
readonly tabBar: TabBar<Widget>;
}Interactive UI components for user input and navigation.
class MenuBar extends Widget {
constructor(options?: MenuBar.IOptions);
readonly activeMenu: Menu | null;
activeIndex: number;
readonly menus: ReadonlyArray<Menu>;
addMenu(menu: Menu, update?: boolean): void;
insertMenu(index: number, menu: Menu, update?: boolean): void;
openActiveMenu(): void;
}
class TabBar<T> extends Widget {
constructor(options?: TabBar.IOptions<T>);
tabsMovable: boolean;
titlesEditable: boolean;
allowDeselect: boolean;
currentTitle: Title<T> | null;
currentIndex: number;
orientation: TabBar.Orientation;
readonly titles: ReadonlyArray<Title<T>>;
addTab(value: Title<T> | Title.IOptions<T>): Title<T>;
insertTab(index: number, value: Title<T> | Title.IOptions<T>): Title<T>;
}
class CommandPalette extends Widget {
constructor(options: CommandPalette.IOptions);
readonly commands: CommandRegistry;
addItem(options: CommandPalette.IItemOptions): CommandPalette.IItem;
removeItem(item: CommandPalette.IItem): void;
refresh(): void;
}
class ScrollBar extends Widget {
constructor(options?: ScrollBar.IOptions);
orientation: ScrollBar.Orientation;
value: number;
page: number;
maximum: number;
}Advanced features for focus management, context menus, and other specialized functionality.
class FocusTracker<T> implements IDisposable {
constructor();
readonly currentWidget: T | null;
readonly activeWidget: T | null;
readonly widgets: ReadonlyArray<T>;
add(widget: T): void;
remove(widget: T): void;
}
class ContextMenu {
constructor(options: ContextMenu.IOptions);
readonly menu: Menu;
addItem(options: ContextMenu.IItemOptions): ContextMenu.IItem;
open(event: MouseEvent | KeyboardEvent): boolean;
}
class Menu extends Widget {
constructor(options: Menu.IOptions);
readonly items: ReadonlyArray<Menu.IItem>;
activeItem: Menu.IItem | null;
activeIndex: number;
addItem(options: Menu.IItemOptions): Menu.IItem;
open(x: number, y: number, options?: Menu.IOpenOptions): boolean;
}namespace Widget {
interface IOptions {
node?: HTMLElement;
tag?: keyof HTMLElementTagNameMap;
}
enum HiddenMode {
Display = 0,
Scale = 1,
ContentVisibility = 2
}
enum Flag {
IsDisposed = 0x1,
IsAttached = 0x2,
IsHidden = 0x4,
IsVisible = 0x8,
DisallowLayout = 0x10
}
class ResizeMessage {
constructor(width: number, height: number);
readonly width: number;
readonly height: number;
}
class ChildMessage {
constructor(type: string, child: Widget);
readonly child: Widget;
}
// Static utility functions
function attach(widget: Widget, host: HTMLElement, ref?: HTMLElement | null): void;
function detach(widget: Widget): void;
}
namespace Title {
interface IOptions<T> {
owner: T;
label?: string;
mnemonic?: number;
icon?: VirtualElement.IRenderer;
iconClass?: string;
iconLabel?: string;
caption?: string;
className?: string;
closable?: boolean;
dataset?: Dataset;
}
type Dataset = { readonly [key: string]: string };
}