UNPKG

@teaui/core

Version:

A high-level terminal UI library for Node

98 lines 2.39 kB
import { Container } from '../Container.js'; import { Point } from '../geometry.js'; import { Style } from '../Style.js'; import { Text } from './Text.js'; export class Header extends Container { #text; #style; #border = 'single'; constructor({ bold, dim, text, font, ...props }) { super(props); this.#border = props.border; this.#style = new Style({ bold: bold, dim: dim, }); this.#text = new Text({ text: text, font: font, style: this.#style, wrap: true, }); this.add(this.#text); } naturalSize(available) { return this.#text .naturalSize(available) .grow(2, this.#border === 'none' ? 0 : 1); } render(viewport) { const inside = viewport.contentRect.inset({ left: 1, right: 1, bottom: this.#border === 'none' ? 0 : 1, }); const textSize = this.#text.naturalSize(inside.size); viewport.clipped(inside, inside => { this.#text.render(inside); }); const maxWidth = textSize.width + 2; let border; switch (this.#border) { case 'none': return; case 'single': border = '─'; break; case 'bold': border = '━'; break; case 'double': border = '═'; break; } viewport.write(border.repeat(maxWidth), new Point(0, textSize.height), this.#style); } } export function H1(text = '') { return new Header({ text, border: 'double', bold: true, }); } export function H2(text = '') { return new Header({ text, border: 'bold', bold: true, }); } export function H3(text = '') { return new Header({ text, border: 'single', bold: true, }); } export function H4(text = '') { return new Header({ text, border: 'single', }); } export function H5(text = '') { return new Header({ text, border: 'single', dim: true, }); } export function H6(text = '') { return new Header({ text, border: 'none', dim: true, }); } //# sourceMappingURL=Header.js.map