@teaui/core
Version:
A high-level terminal UI library for Node
98 lines • 2.39 kB
JavaScript
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