herald

package module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 17, 2026 License: MIT Imports: 3 Imported by: 14

README

herald

HTML-inspired typography for terminal UIs in Go.

CI Code coverage Go Report Card Security Scan version Go Reference License Built with Devbox

Herald maps familiar HTML elements (H1–H6, P, Blockquote, UL, OL, Code, HR, and inline styles) to styled terminal output, built on lipgloss v2. It ships with a Rose Pine-inspired default theme and supports full style customization via functional options.

herald demo output

Installation

go get github.com/indaco/herald

Requires Go 1.25 or later.

Quick start

package main

import (
    "fmt"
    "github.com/indaco/herald"
)

func main() {
    ty := herald.New()

    fmt.Println(ty.H1("Getting Started"))
    fmt.Println(ty.P("Herald renders terminal typography using lipgloss styles."))
    fmt.Println(ty.UL("Headings", "Block elements", "Inline styles"))
}

Available elements

Headings

H1–H3 render with a repeated underline character beneath the text. H4–H6 render with a left bar prefix.

Method Decoration Default character
H1(text) underline
H2(text) underline
H3(text) underline ·
H4(text) bar prefix
H5(text) bar prefix
H6(text) bar prefix

Block elements

Method Description
P(text) Paragraph
Blockquote(text) Indented block with a left bar; supports multi-line input
Code(text) Inline code with background highlight
CodeBlock(text) Fenced code block with padding
HR() Horizontal rule, configurable width and character
fmt.Println(ty.Blockquote("First line.\nSecond line."))
fmt.Println(ty.Code("os.Exit(1)"))
fmt.Println(ty.CodeBlock("func main() {\n\tfmt.Println(\"hello\")\n}"))
fmt.Println(ty.HR())

Lists

fmt.Println(ty.UL("Apples", "Bananas", "Cherries"))
fmt.Println(ty.OL("First", "Second", "Third"))

UL uses a bullet character (default ). OL uses 1., 2., 3. markers.

Inline styles

Method Renders as
Bold(text) Bold
Italic(text) Italic
Underline(text) Underlined
Strikethrough(text) Strikethrough
Small(text) Faint
Mark(text) Highlighted background
Link(label, url) Styled link; url is optional — when both differ, renders as label (url)
Kbd(text) Keyboard key indicator
Abbr(abbr, desc) Abbreviation; desc is optional, appended in parentheses
Sub(text) Subscript, prefixed with _
Sup(text) Superscript, prefixed with ^
fmt.Println(ty.Bold("important") + " and " + ty.Italic("nuanced"))
fmt.Println(ty.Kbd("Ctrl") + " + " + ty.Kbd("C"))
fmt.Println(ty.Link("Go website", "https://go.dev"))
fmt.Println(ty.Abbr("CSS", "Cascading Style Sheets"))
fmt.Println(ty.Sub("2") + "O" + ty.Sup("n"))

Definition lists

DL accepts a slice of [2]string pairs (term, description). DT and DD are available for individual rendering.

fmt.Println(ty.DL([][2]string{
    {"Go", "A statically typed, compiled language"},
    {"Rust", "A systems programming language"},
}))

// Or individually:
fmt.Println(ty.DT("Term"))
fmt.Println(ty.DD("The description for that term."))

Customization

Functional options

Pass options to herald.New() to override individual styles or tokens.

ty := herald.New(
    herald.WithHRWidth(60),
    herald.WithBulletChar("-"),
    herald.WithH1Style(
        lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("#FF0000")),
    ),
)

Style options — each accepts a lipgloss.Style:

Option Targets
WithH1StyleWithH6Style Heading levels 1–6
WithParagraphStyle P
WithBlockquoteStyle Blockquote
WithCodeInlineStyle Code
WithCodeBlockStyle CodeBlock
WithHRStyle HR
WithBoldStyle Bold
WithItalicStyle Italic
WithUnderlineStyle Underline
WithStrikethroughStyle Strikethrough
WithSmallStyle Small
WithMarkStyle Mark
WithLinkStyle Link
WithKbdStyle Kbd
WithAbbrStyle Abbr
WithListBulletStyle Bullet/number marker
WithListItemStyle List item text
WithDTStyle Definition term
WithDDStyle Definition description

Token options — each accepts a string or int:

Option Default Description
WithH1UnderlineChar(c) Underline character for H1
WithH2UnderlineChar(c) Underline character for H2
WithH3UnderlineChar(c) · Underline character for H3
WithHeadingBarChar(c) Bar prefix character for H4–H6
WithBulletChar(c) Bullet character for UL
WithHRChar(c) Character repeated for HR
WithHRWidth(w) 40 Width of HR in characters
WithBlockquoteBar(c) Left bar character for Blockquote

Custom theme

Replace the entire theme by constructing a Theme struct and passing it with WithTheme.

import (
    "github.com/indaco/herald"
    "charm.land/lipgloss/v2"
)

custom := herald.Theme{
    H1:        lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("#FFFFFF")),
    H2:        lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("#AAAAAA")),
    Paragraph: lipgloss.NewStyle().MarginBottom(1),
    // set remaining Theme fields as needed...

    H1UnderlineChar: "=",
    H2UnderlineChar: "-",
    H3UnderlineChar: ".",
    HeadingBarChar:  ">",
    BulletChar:      "*",
    HRChar:          "-",
    HRWidth:         40,
    BlockquoteBar:   "|",
}

ty := herald.New(herald.WithTheme(custom))

DefaultTheme() is exported and can serve as a starting point: call it, modify the fields you need, then pass the result to WithTheme.

Examples

Runnable examples are in the examples/ directory:

Example Description Run
basic All elements with the default Rose Pine theme go run ./examples/basic/
custom-options Override styles, decoration chars, and tokens via functional options go run ./examples/custom-options/
catppuccin-theme Build a full theme from the Catppuccin palette (separate module) cd examples/catppuccin-theme && go run .

The catppuccin-theme example has its own go.mod to keep github.com/catppuccin/go out of herald's core dependencies.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Documentation

Overview

Package herald provides a reusable TUI typography library inspired by CSS frameworks such as Tailwind Typography, Bootstrap, and Pico CSS.

It offers HTML-analogous rendering functions (H1-H6, P, Blockquote, lists, inline styles, etc.) that output styled strings via lipgloss v2.

Quick start:

ty := herald.New()                    // default theme
fmt.Println(ty.H1("Hello, World!"))
fmt.Println(ty.P("Some body text."))
fmt.Println(ty.UL("Apples", "Bananas", "Cherries"))

Customization via functional options:

ty := herald.New(
    herald.WithHRWidth(60),
    herald.WithBulletChar("-"),
    herald.WithH1Style(lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("#FF0000"))),
)

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Option

type Option func(*Typography)

Option is a functional option for configuring a Typography instance.

func WithAbbrStyle

func WithAbbrStyle(s lipgloss.Style) Option

WithAbbrStyle overrides the abbreviation style.

func WithBlockquoteBar

func WithBlockquoteBar(c string) Option

WithBlockquoteBar sets the left-bar character for blockquotes.

func WithBlockquoteStyle

func WithBlockquoteStyle(s lipgloss.Style) Option

WithBlockquoteStyle overrides the blockquote style.

func WithBoldStyle

func WithBoldStyle(s lipgloss.Style) Option

WithBoldStyle overrides the bold style.

func WithBulletChar

func WithBulletChar(c string) Option

WithBulletChar sets the bullet character for unordered lists.

func WithCodeBlockStyle

func WithCodeBlockStyle(s lipgloss.Style) Option

WithCodeBlockStyle overrides the code block style.

func WithCodeInlineStyle

func WithCodeInlineStyle(s lipgloss.Style) Option

WithCodeInlineStyle overrides the inline code style.

func WithDDStyle

func WithDDStyle(s lipgloss.Style) Option

WithDDStyle overrides the definition description style.

func WithDTStyle

func WithDTStyle(s lipgloss.Style) Option

WithDTStyle overrides the definition term style.

func WithH1Style

func WithH1Style(s lipgloss.Style) Option

WithH1Style overrides the H1 heading style.

func WithH1UnderlineChar

func WithH1UnderlineChar(c string) Option

WithH1UnderlineChar sets the character used for the H1 underline.

func WithH2Style

func WithH2Style(s lipgloss.Style) Option

WithH2Style overrides the H2 heading style.

func WithH2UnderlineChar

func WithH2UnderlineChar(c string) Option

WithH2UnderlineChar sets the character used for the H2 underline.

func WithH3Style

func WithH3Style(s lipgloss.Style) Option

WithH3Style overrides the H3 heading style.

func WithH3UnderlineChar

func WithH3UnderlineChar(c string) Option

WithH3UnderlineChar sets the character used for the H3 underline.

func WithH4Style

func WithH4Style(s lipgloss.Style) Option

WithH4Style overrides the H4 heading style.

func WithH5Style

func WithH5Style(s lipgloss.Style) Option

WithH5Style overrides the H5 heading style.

func WithH6Style

func WithH6Style(s lipgloss.Style) Option

WithH6Style overrides the H6 heading style.

func WithHRChar

func WithHRChar(c string) Option

WithHRChar sets the character used for horizontal rules.

func WithHRStyle

func WithHRStyle(s lipgloss.Style) Option

WithHRStyle overrides the horizontal rule style.

func WithHRWidth

func WithHRWidth(w int) Option

WithHRWidth sets the width of horizontal rules in characters.

func WithHeadingBarChar

func WithHeadingBarChar(c string) Option

WithHeadingBarChar sets the bar prefix character for H4-H6.

func WithItalicStyle

func WithItalicStyle(s lipgloss.Style) Option

WithItalicStyle overrides the italic style.

func WithKbdStyle

func WithKbdStyle(s lipgloss.Style) Option

WithKbdStyle overrides the keyboard key style.

func WithLinkStyle

func WithLinkStyle(s lipgloss.Style) Option

WithLinkStyle overrides the link style.

func WithListBulletStyle

func WithListBulletStyle(s lipgloss.Style) Option

WithListBulletStyle overrides the bullet/number marker style.

func WithListItemStyle

func WithListItemStyle(s lipgloss.Style) Option

WithListItemStyle overrides the list item text style.

func WithMarkStyle

func WithMarkStyle(s lipgloss.Style) Option

WithMarkStyle overrides the highlight/mark style.

func WithParagraphStyle

func WithParagraphStyle(s lipgloss.Style) Option

WithParagraphStyle overrides the paragraph style.

func WithSmallStyle

func WithSmallStyle(s lipgloss.Style) Option

WithSmallStyle overrides the small/faint style.

func WithStrikethroughStyle

func WithStrikethroughStyle(s lipgloss.Style) Option

WithStrikethroughStyle overrides the strikethrough style.

func WithTheme

func WithTheme(t Theme) Option

WithTheme sets the entire theme at once.

func WithUnderlineStyle

func WithUnderlineStyle(s lipgloss.Style) Option

WithUnderlineStyle overrides the underline style.

type Theme

type Theme struct {
	// Headings H1-H6
	H1 lipgloss.Style
	H2 lipgloss.Style
	H3 lipgloss.Style
	H4 lipgloss.Style
	H5 lipgloss.Style
	H6 lipgloss.Style

	// Text block elements
	Paragraph  lipgloss.Style
	Blockquote lipgloss.Style
	CodeInline lipgloss.Style
	CodeBlock  lipgloss.Style
	HR         lipgloss.Style

	// List elements
	ListBullet lipgloss.Style // style for the bullet/number marker
	ListItem   lipgloss.Style // style for list item text

	// Inline styles
	Bold          lipgloss.Style
	Italic        lipgloss.Style
	Underline     lipgloss.Style
	Strikethrough lipgloss.Style
	Small         lipgloss.Style
	Mark          lipgloss.Style
	Link          lipgloss.Style
	Kbd           lipgloss.Style
	Abbr          lipgloss.Style
	Sub           lipgloss.Style
	Sup           lipgloss.Style

	// Definition list
	DT lipgloss.Style // definition term
	DD lipgloss.Style // definition description

	// Heading decoration
	H1UnderlineChar string // character repeated under H1 (e.g. "═")
	H2UnderlineChar string // character repeated under H2 (e.g. "─")
	H3UnderlineChar string // character repeated under H3 (e.g. "·")
	HeadingBarChar  string // left-bar prefix for H4-H6 (e.g. "▎")

	// Configurable tokens
	BulletChar    string // character used for unordered list bullets
	HRChar        string // character repeated for horizontal rules
	HRWidth       int    // width of horizontal rule in characters
	BlockquoteBar string // left-bar character for blockquotes
}

Theme holds all style definitions used by Typography to render elements. Each field corresponds to a visual element and is a lipgloss.Style.

func DefaultTheme

func DefaultTheme() Theme

DefaultTheme returns a Theme with sensible default styles that look great in most terminal environments.

type Typography

type Typography struct {
	// contains filtered or unexported fields
}

Typography is the central renderer. It holds a Theme and exposes methods for every supported typographic element.

func New

func New(opts ...Option) *Typography

New creates a new Typography instance with the default theme, then applies any provided functional options.

func (*Typography) Abbr

func (t *Typography) Abbr(abbr string, desc ...string) string

Abbr renders an abbreviation. If a description is provided it is shown in parentheses after the abbreviation.

func (*Typography) Blockquote

func (t *Typography) Blockquote(text string) string

Blockquote renders a blockquote with a left border bar. Multi-line text is handled by prepending the bar to every line.

func (*Typography) Bold

func (t *Typography) Bold(text string) string

Bold renders bold text.

func (*Typography) Code

func (t *Typography) Code(text string) string

Code renders inline code.

func (*Typography) CodeBlock

func (t *Typography) CodeBlock(text string) string

CodeBlock renders a fenced code block.

func (*Typography) DD

func (t *Typography) DD(text string) string

DD renders a single definition description.

func (*Typography) DL

func (t *Typography) DL(pairs [][2]string) string

DL renders a definition list from term-description pairs. Each pair is a two-element array: [term, description]. Odd-length slices ignore the last unpaired element.

func (*Typography) DT

func (t *Typography) DT(text string) string

DT renders a single definition term.

func (*Typography) H1

func (t *Typography) H1(text string) string

H1 renders text as a level-1 heading with a double-line underline.

func (*Typography) H2

func (t *Typography) H2(text string) string

H2 renders text as a level-2 heading with a single-line underline.

func (*Typography) H3

func (t *Typography) H3(text string) string

H3 renders text as a level-3 heading with a dotted underline.

func (*Typography) H4

func (t *Typography) H4(text string) string

H4 renders text as a level-4 heading with a bar prefix.

func (*Typography) H5

func (t *Typography) H5(text string) string

H5 renders text as a level-5 heading with a bar prefix.

func (*Typography) H6

func (t *Typography) H6(text string) string

H6 renders text as a level-6 heading with a bar prefix.

func (*Typography) HR

func (t *Typography) HR() string

HR renders a horizontal rule.

func (*Typography) Italic

func (t *Typography) Italic(text string) string

Italic renders italic text.

func (*Typography) Kbd

func (t *Typography) Kbd(text string) string

Kbd renders a keyboard key indicator.

func (t *Typography) Link(label string, url ...string) string

Link renders a styled URL or link text. If both label and url are provided, it renders as "label (url)". If only one argument is given, it is treated as both the label and the URL.

func (*Typography) Mark

func (t *Typography) Mark(text string) string

Mark renders highlighted text.

func (*Typography) OL

func (t *Typography) OL(items ...string) string

OL renders an ordered (numbered) list from the provided items.

func (*Typography) P

func (t *Typography) P(text string) string

P renders a paragraph.

func (*Typography) Small

func (t *Typography) Small(text string) string

Small renders small/faint text.

func (*Typography) Strikethrough

func (t *Typography) Strikethrough(text string) string

Strikethrough renders strikethrough text.

func (*Typography) Sub

func (t *Typography) Sub(text string) string

Sub renders a subscript marker. In a terminal we prefix with an underscore to visually indicate subscript.

func (*Typography) Sup

func (t *Typography) Sup(text string) string

Sup renders a superscript marker. In a terminal we prefix with a caret to visually indicate superscript.

func (*Typography) Theme

func (t *Typography) Theme() Theme

Theme returns a copy of the current theme.

func (*Typography) UL

func (t *Typography) UL(items ...string) string

UL renders an unordered (bulleted) list from the provided items.

func (*Typography) Underline

func (t *Typography) Underline(text string) string

Underline renders underlined text.

Directories

Path Synopsis
examples
basic command
Basic usage of herald with the default Rose Pine theme.
Basic usage of herald with the default Rose Pine theme.
custom-options command
Customizing herald with functional options: override individual styles, decoration characters, and tokens without replacing the entire theme.
Customizing herald with functional options: override individual styles, decoration characters, and tokens without replacing the entire theme.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL