pax_global_header 0000666 0000000 0000000 00000000064 14650106263 0014515 g ustar 00root root 0000000 0000000 52 comment=8b37d4ece5d980a9e00d9b70a287eda2d714be05
golang-github-pterm-pterm-0.12.79/ 0000775 0000000 0000000 00000000000 14650106263 0016676 5 ustar 00root root 0000000 0000000 golang-github-pterm-pterm-0.12.79/.github/ 0000775 0000000 0000000 00000000000 14650106263 0020236 5 ustar 00root root 0000000 0000000 golang-github-pterm-pterm-0.12.79/.github/CODEOWNERS 0000664 0000000 0000000 00000000026 14650106263 0021627 0 ustar 00root root 0000000 0000000 * @MarvinJWendt
golang-github-pterm-pterm-0.12.79/.github/FUNDING.yml 0000664 0000000 0000000 00000001365 14650106263 0022060 0 ustar 00root root 0000000 0000000 # These are supported funding model platforms
github: [ MarvinJWendt ] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ['https://marvin.ws/donate'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
golang-github-pterm-pterm-0.12.79/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 14650106263 0022421 5 ustar 00root root 0000000 0000000 golang-github-pterm-pterm-0.12.79/.github/ISSUE_TEMPLATE/bug_report.md 0000664 0000000 0000000 00000000163 14650106263 0025113 0 ustar 00root root 0000000 0000000 ---
name: Bug report
about: 🐞 Create a bug report to help us improve
title: ''
labels: bug
assignees: ''
---
golang-github-pterm-pterm-0.12.79/.github/ISSUE_TEMPLATE/config.yml 0000664 0000000 0000000 00000000242 14650106263 0024407 0 ustar 00root root 0000000 0000000 contact_links:
- name: Twitter
url: https://marvin.ws/twitter
about: 💬 For questions, feedback and support, you can contact me directly via Twitter!
golang-github-pterm-pterm-0.12.79/.github/ISSUE_TEMPLATE/feature_request.md 0000664 0000000 0000000 00000000170 14650106263 0026144 0 ustar 00root root 0000000 0000000 ---
name: Feature request
about: "✨ Suggest an idea for this project"
title: ''
labels: proposal
assignees: ''
---
golang-github-pterm-pterm-0.12.79/.github/dependabot.yml 0000664 0000000 0000000 00000000767 14650106263 0023100 0 ustar 00root root 0000000 0000000 # To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "gomod" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"
golang-github-pterm-pterm-0.12.79/.github/pull_request_template.md 0000664 0000000 0000000 00000000162 14650106263 0025176 0 ustar 00root root 0000000 0000000
Fixes #YOUR_ISSUE_NUMBER
golang-github-pterm-pterm-0.12.79/.github/release.yml 0000664 0000000 0000000 00000000537 14650106263 0022406 0 ustar 00root root 0000000 0000000 changelog:
exclude:
labels:
- ignore-for-release
authors:
- octocat
categories:
- title: Breaking Changes 🛠
labels:
- breaking
- title: Exciting New Features 🎉
labels:
- feature
- title: Fixes 🔧
labels:
- fix
- title: Other Changes
labels:
- "*"
golang-github-pterm-pterm-0.12.79/.github/workflows/ 0000775 0000000 0000000 00000000000 14650106263 0022273 5 ustar 00root root 0000000 0000000 golang-github-pterm-pterm-0.12.79/.github/workflows/animator.yml 0000664 0000000 0000000 00000000670 14650106263 0024633 0 ustar 00root root 0000000 0000000 on:
push:
branches: master
name: Update Animations
jobs:
animator:
if: "!contains(github.event.head_commit.message, 'autoupdate')"
runs-on: ubuntu-latest
steps:
- name: Git Setup
run: git config --global --add safe.directory /github/workspace
- name: Update Docs
uses: pterm/animation-ci@master
env:
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
TERM: xterm-256color
golang-github-pterm-pterm-0.12.79/.github/workflows/conventional-label.yaml 0000664 0000000 0000000 00000000302 14650106263 0026726 0 ustar 00root root 0000000 0000000 on:
pull_request_target:
types: [ opened, edited ]
name: conventional-release-labels
jobs:
label:
runs-on: ubuntu-latest
steps:
- uses: bcoe/conventional-release-labels@v1
golang-github-pterm-pterm-0.12.79/.github/workflows/go.yml 0000664 0000000 0000000 00000001570 14650106263 0023426 0 ustar 00root root 0000000 0000000 name: Go
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
if: "!contains(github.event.head_commit.message, 'autoupdate')"
name: Build
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ windows-latest ]
steps:
- name: Set up Go 1.x
uses: actions/setup-go@v4
with:
go-version: 1.21
cache-dependency-path: go.sum
id: go
- name: Check out code into the Go module directory
uses: actions/checkout@v3
- name: Get dependencies
run: go get -v -t -d ./...
- name: Build
run: go build -v .
- name: Test
run: go test -coverprofile="coverage.txt" -covermode=atomic -p 1 .
- name: Upload coverage to Codecov
if: success() && matrix.os == 'windows-latest'
uses: codecov/codecov-action@v3
golang-github-pterm-pterm-0.12.79/.github/workflows/lint.yml 0000664 0000000 0000000 00000000647 14650106263 0023773 0 ustar 00root root 0000000 0000000 name: Code Analysis
on: [ push, pull_request ]
jobs:
lint:
if: "!contains(github.event.head_commit.message, 'autoupdate')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: 'stable'
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:
version: latest
golang-github-pterm-pterm-0.12.79/.gitignore 0000664 0000000 0000000 00000000526 14650106263 0020671 0 ustar 00root root 0000000 0000000 # Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
vendor/
# This is where we test stuff
/experimenting/*
/.history
/.vscode
/.idea
golang-github-pterm-pterm-0.12.79/.golangci.yml 0000664 0000000 0000000 00000003472 14650106263 0021270 0 ustar 00root root 0000000 0000000 linters-settings:
gocritic:
enabled-tags:
- diagnostic
- experimental
- opinionated
- performance
- style
disabled-checks:
- dupImport
- ifElseChain
- octalLiteral
- whyNoLint
- wrapperFunc
- exitAfterDefer
- hugeParam
- ptrToRefParam
- paramTypeCombine
- unnamedResult
# maligned:
# suggest-new: true
misspell:
locale: US
linters:
disable-all: true
enable:
- gocritic
- gosec
- govet
- ineffassign
- unconvert
- gosimple
- godox
- whitespace
- staticcheck
# - bodyclose
# - maligned
# - godot
# - deadcode
# - depguard
# - dogsled
# - dupl
# - errcheck
# - exhaustive
# - funlen
# - gochecknoinits
# - goconst
# - gocyclo
# - gofmt
# - goimports
# - golint
# - gomnd
# - goprintffuncname
# - lll
# - misspell
# - nakedret
# - noctx
# - nolintlint
# - rowserrcheck
# - scopelint
# - structcheck
# - stylecheck
# - typecheck
# - unparam
# - unused
# - varcheck
# - whitespace
# - asciicheck
# - gochecknoglobals
# - gocognit
# - goerr113
# - nestif
# - prealloc
# - testpackage
# - wsl
issues:
# Excluding configuration per-path, per-linter, per-text and per-source
exclude-rules:
- path: _test\.go
linters:
- gocyclo
- errcheck
- dupl
- gosec
- gocritic
# https://github.com/go-critic/go-critic/issues/926
- linters:
- gocritic
text: "unnecessaryDefer:"
- linters:
- gocritic
text: "preferDecodeRune:"
service:
golangci-lint-version: 1.31.x # use the fixed version to not introduce new linters unexpectedly
golang-github-pterm-pterm-0.12.79/CODE_OF_CONDUCT.md 0000664 0000000 0000000 00000006432 14650106263 0021502 0 ustar 00root root 0000000 0000000 # Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at pterm@marvinjwendt.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
golang-github-pterm-pterm-0.12.79/CONTRIBUTING.md 0000664 0000000 0000000 00000013607 14650106263 0021136 0 ustar 00root root 0000000 0000000 # Contributing to PTerm
> This document explains how to participate in the development of PTerm.\
If your goal is to report a bug instead of programming PTerm, you can do so [here](https://github.com/pterm/pterm/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
## Best practise
We enforce some best practises, especially made for PTerm, to provide a clean and consistent user experience.
### Styles
Styles should always be consumed as pointers. That way, the user can change the style of printers globally.
## Creating a new printer
> In this chapter we will show you how to create a new printer.
### `TextPrinter` Template
```go
package pterm
type TemplatePrinter struct{
// TODO: Add printer settings here
}
// Sprint formats using the default formats for its operands and returns the resulting string.
// Spaces are added between operands when neither is a string.
func (p TemplatePrinter) Sprint(a ...interface{}) string {
panic("write printer code here")
}
// Sprintln formats using the default formats for its operands and returns the resulting string.
// Spaces are always added between operands and a newline is appended.
func (p TemplatePrinter) Sprintln(a ...interface{}) string {
return Sprintln(p.Sprint(a...))
}
// Sprintf formats according to a format specifier and returns the resulting string.
func (p TemplatePrinter) Sprintf(format string, a ...interface{}) string {
return p.Sprint(Sprintf(format, a...))
}
// Print formats using the default formats for its operands and writes to standard output.
// Spaces are added between operands when neither is a string.
// It returns the number of bytes written and any write error encountered.
func (p TemplatePrinter) Print(a ...interface{}) *TextPrinter {
Print(p.Sprint(a...))
tp := TextPrinter(p)
return &tp
}
// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func (p TemplatePrinter) Println(a ...interface{}) *TextPrinter {
Println(p.Sprint(a...))
tp := TextPrinter(p)
return &tp
}
// Printf formats according to a format specifier and writes to standard output.
// It returns the number of bytes written and any write error encountered.
func (p TemplatePrinter) Printf(format string, a ...interface{}) *TextPrinter {
Print(p.Sprintf(format, a...))
tp := TextPrinter(p)
return &tp
}
```
### `RenderablePrinter` Template
```go
package pterm
type TemplatePrinter struct{
// TODO: Add printer settings here
}
// Srender renders the Template as a string.
func (p TemplatePrinter) Srender() (string, error) {
var ret string
return ret, nil
}
// Render prints the Template to the terminal.
func (p TemplatePrinter) Render() error {
s, err := p.Srender()
if err != nil {
return err
}
Println(s)
return nil
}
```
### `LivePrinter` Template
```go
// Start the TemplatePrinter.
package pterm
import "github.com/pterm/pterm"
type TemplatePrinter struct{
}
func (s TemplatePrinter) Start(text...interface{}) (*TemplatePrinter, error) { // TODO: Replace Template with actual printer.
// TODO: start logic
return &s, nil
}
// Stop terminates the TemplatePrinter immediately.
// The TemplatePrinter will not resolve into anything.
func (s *TemplatePrinter) Stop() error {
// TODO: stop logic
return nil
}
// GenericStart runs Start, but returns a LivePrinter.
// This is used for the interface LivePrinter.
// You most likely want to use Start instead of this in your program.
func (s *TemplatePrinter) GenericStart() (*LivePrinter, error) {
_, err := s.Start()
lp := LivePrinter(s)
return &lp, err
}
// GenericStop runs Stop, but returns a LivePrinter.
// This is used for the interface LivePrinter.
// You most likely want to use Stop instead of this in your program.
func (s *TemplatePrinter) GenericStop() (*LivePrinter, error) {
err := s.Stop()
lp := LivePrinter(s)
return &lp, err
}
```
## Writing Tests
> Each method of PTerm must be tested.
### Required tests for every printer
#### Nil Check
> This ensures that a printer without set values will not produce errors.
```go
func TestTemplatePrinterNilPrint(t *testing.T) { // TODO: Replace "Template" with actual printer name.
p := TemplatePrinter{} // TODO: Replace "Template" with actual printer name.
p.Println("Hello, World!")
}
```
#### `WithXxx()` Methods
> Each method, which starts with `With` can be tested by checking if it actually creates a new printer and sets the value.
Example from `SectionPrinter`:
```go
func TestSectionPrinter_WithStyle(t *testing.T) {
p := SectionPrinter{}
s := NewStyle(FgRed, BgRed, Bold)
p2 := p.WithStyle(s)
assert.Equal(t, s, p2.Style)
assert.Empty(t, p.Style)
}
func TestSectionPrinter_WithTopPadding(t *testing.T) {
p := SectionPrinter{}
p2 := p.WithTopPadding(1337)
assert.Equal(t, 1337, p2.TopPadding)
assert.Empty(t, p.TopPadding)
}
```
### `TextPrinter` Tests Template
```go
func TestTemplatePrinterPrintMethods(t *testing.T) { // TODO: Replace "Template" with actual printer name.
p := DefaultTemplate // TODO: Replace "Template" with actual printer name.
t.Run("Print", func(t *testing.T) {
testPrintContains(t, func(w io.Writer, a interface{}) {
p.Print(a)
})
})
t.Run("Printf", func(t *testing.T) {
testPrintfContains(t, func(w io.Writer, format string, a interface{}) {
p.Printf(format, a)
})
})
t.Run("Println", func(t *testing.T) {
testPrintlnContains(t, func(w io.Writer, a interface{}) {
p.Println(a)
})
})
t.Run("Sprint", func(t *testing.T) {
testSprintContains(t, func(a interface{}) string {
return p.Sprint(a)
})
})
t.Run("Sprintf", func(t *testing.T) {
testSprintfContains(t, func(format string, a interface{}) string {
return p.Sprintf(format, a)
})
})
t.Run("Sprintln", func(t *testing.T) {
testSprintlnContains(t, func(a interface{}) string {
return p.Sprintln(a)
})
})
}
```
golang-github-pterm-pterm-0.12.79/LICENSE 0000664 0000000 0000000 00000002046 14650106263 0017705 0 ustar 00root root 0000000 0000000 MIT License
Copyright (c) 2020 pterm
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
golang-github-pterm-pterm-0.12.79/README.md 0000664 0000000 0000000 00000321214 14650106263 0020160 0 ustar 00root root 0000000 0000000
---
## 📦 Installation
To make PTerm available in your project, you can run the following command.\
Make sure to run this command inside your project, when you're using go modules 😉
```sh
go get github.com/pterm/pterm
```
## ⭐ Main Features
| Feature | Description |
|------------------|-----------------------------------------------------|
| 🪀 Easy to use | PTerm emphasizes ease of use, with [examples](#-examples) and consistent component design. |
| 🤹♀️ Cross-Platform | PTerm works on various OS and terminals, including `Windows CMD`, `macOS iTerm2`, and in CI systems like `GitHub Actions`. |
| 🧪 Well tested | A high test coverage and `28774` automated tests ensure PTerm's reliability. |
| ✨ Consistent Colors | PTerm uses the [ANSI color scheme](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) for uniformity and supports `TrueColor` for advanced terminals. |
| 📚 Component system | PTerm's flexible `Printers` can be used individually or combined to generate beautiful console output. |
| 🛠 Configurable | PTerm is ready to use without configuration but allows easy customization for unique terminal output. |
| ✏ Documentation | Access comprehensive docs on [pkg.go.dev](https://pkg.go.dev/github.com/pterm/pterm#section-documentation) and view practical examples in the [examples section](#-examples). |
### Printers (Components)
### area/demo

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Print an informational message using PTerm's Info printer.
// This message will stay in place while the area updates.
pterm.Info.Println("The previous text will stay in place, while the area updates.")
// Print two new lines as spacer.
pterm.Print("\n\n")
// Start the Area printer from PTerm's DefaultArea, with the Center option.
// The Area printer allows us to update a specific area of the console output.
// The returned 'area' object is used to control the area updates.
area, _ := pterm.DefaultArea.WithCenter().Start()
// Loop 10 times to update the area with the current time.
for i := 0; i < 10; i++ {
// Get the current time, format it as "15:04:05" (hour:minute:second), and convert it to a string.
// Then, create a BigText from the time string using PTerm's DefaultBigText and putils NewLettersFromString.
// The Srender() function is used to save the BigText as a string.
str, _ := pterm.DefaultBigText.WithLetters(putils.LettersFromString(time.Now().Format("15:04:05"))).Srender()
// Update the Area contents with the current time string.
area.Update(str)
// Sleep for a second before the next update.
time.Sleep(time.Second)
}
// Stop the Area printer after all updates are done.
area.Stop()
}
```
### area/center

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new default area in the center of the terminal.
// The Start() function returns the created area and an error.
area, _ := pterm.DefaultArea.WithCenter().Start()
// Loop 5 times to simulate a dynamic update.
for i := 0; i < 5; i++ {
// Update the content of the area with the current count.
// The Sprintf function is used to format the string.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second to simulate a time-consuming task.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
area.Stop()
}
```
### area/default

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new default area and get a reference to it.
// The second return value is an error which is ignored here.
area, _ := pterm.DefaultArea.Start()
// Loop 5 times
for i := 0; i < 5; i++ {
// Update the content of the area dynamically.
// Here we're just displaying the current count.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second before the next update.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
// This will clean up and free resources used by the area.
area.Stop()
}
```
### area/dynamic-chart

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new fullscreen centered area.
// This area will be used to display the bar chart.
area, _ := pterm.DefaultArea.WithFullscreen().WithCenter().Start()
// Ensure the area stops updating when we're done.
defer area.Stop()
// Loop to update the bar chart 10 times.
for i := 0; i < 10; i++ {
// Create a new bar chart with dynamic bars.
// The bars will change based on the current iteration.
barchart := pterm.DefaultBarChart.WithBars(dynamicBars(i))
// Render the bar chart to a string.
// This string will be used to update the area.
content, _ := barchart.Srender()
// Update the area with the new bar chart.
area.Update(content)
// Wait for half a second before the next update.
time.Sleep(500 * time.Millisecond)
}
}
// dynamicBars generates a set of bars for the bar chart.
// The bars will change based on the current iteration.
func dynamicBars(i int) pterm.Bars {
return pterm.Bars{
{Label: "A", Value: 10}, // A static bar.
{Label: "B", Value: 20 * i}, // A bar that grows with each iteration.
{Label: "C", Value: 30}, // Another static bar.
{Label: "D", Value: 40 + i}, // A bar that grows slowly with each iteration.
}
}
```
### area/fullscreen

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new fullscreen area. This will return an area instance and an error.
// The underscore (_) is used to ignore the error.
area, _ := pterm.DefaultArea.WithFullscreen().Start()
// Loop 5 times to update the area content.
for i := 0; i < 5; i++ {
// Update the content of the area with the current count.
// The Sprintf function is used to format the string.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second before the next update.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
area.Stop()
}
```
### area/fullscreen-center

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Initialize a new PTerm area with fullscreen and center options
// The Start() function returns the created area and an error (ignored here)
area, _ := pterm.DefaultArea.WithFullscreen().WithCenter().Start()
// Loop 5 times to demonstrate dynamic content update
for i := 0; i < 5; i++ {
// Update the content of the area with the current count
// The Sprintf function is used to format the string with the count
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second
time.Sleep(time.Second)
}
// Stop the area after all updates are done
// This will clear the area and return the terminal to its normal state
area.Stop()
}
```
### barchart/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the bars for the chart
bars := []pterm.Bar{
{Label: "Bar 1", Value: 5},
{Label: "Bar 2", Value: 3},
{Label: "Longer Label", Value: 7},
}
// Print an informational message
pterm.Info.Println("Chart example with positive only values (bars use 100% of chart area)")
// Create a bar chart with the defined bars and render it
// The DefaultBarChart is used as a base, and the bars are added with the WithBars option
// The Render function is then called to display the chart
pterm.DefaultBarChart.WithBars(bars).Render()
// Create a horizontal bar chart with the defined bars and render it
// The DefaultBarChart is used as a base, the chart is made horizontal with the WithHorizontal option, and the bars are added with the WithBars option
// The Render function is then called to display the chart
pterm.DefaultBarChart.WithHorizontal().WithBars(bars).Render()
}
```
### barchart/custom-height

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define a slice of Bar structs. Each struct represents a bar in the chart.
// The Label field is the name of the bar and the Value field is the height of the bar.
bars := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create and render a bar chart with the defined bars and a height of 5.
// The WithBars method is used to set the bars of the chart.
// The WithHeight method is used to set the height of the chart.
// The Render method is used to display the chart in the terminal.
pterm.DefaultBarChart.WithBars(bars).WithHeight(5).Render()
}
```
### barchart/custom-width

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the bar chart
barData := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create a bar chart with the defined data
// The chart is horizontal and has a width of 5
// The Render() function is called to display the chart
pterm.DefaultBarChart.WithBars(barData).WithHorizontal().WithWidth(5).Render()
}
```
### barchart/default

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the bar chart. Each bar is represented by a `pterm.Bar` struct.
// The `Label` field represents the label of the bar, and the `Value` field represents the value of the bar.
bars := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Use the `DefaultBarChart` from the `pterm` package to create a bar chart.
// The `WithBars` method is used to set the bars of the chart.
// The `Render` method is used to display the chart.
pterm.DefaultBarChart.WithBars(bars).Render()
}
```
### barchart/horizontal

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the bar chart
bars := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create a bar chart with the defined data
// The chart is displayed horizontally
// The Render() function is called to display the chart
pterm.DefaultBarChart.WithBars(bars).WithHorizontal().Render()
}
```
### barchart/horizontal-show-value

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the bar chart
barData := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create a bar chart with the defined data
// The chart is horizontal and displays the value of each bar
// The Render() function is called to display the chart
pterm.DefaultBarChart.WithBars(barData).WithHorizontal().WithShowValue().Render()
}
```
### barchart/mixed-values

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define a set of bars for the chart.
// Each bar has a label and a value.
bars := []pterm.Bar{
{Label: "Bar 1", Value: 2},
{Label: "Bar 2", Value: -3},
{Label: "Bar 3", Value: -2},
{Label: "Bar 4", Value: 5},
{Label: "Longer Label", Value: 7},
}
// Print a section header.
// This is useful for separating different parts of the output.
pterm.DefaultSection.Println("Chart example with mixed values (note screen space usage in case when ABSOLUTE values of negative and positive parts are differ too much)")
// Create a bar chart with the defined bars.
// The chart will display the value of each bar.
// The Render() function is called to display the chart.
pterm.DefaultBarChart.WithBars(bars).WithShowValue().Render()
// Create a horizontal bar chart with the same bars.
// The chart will display the value of each bar.
// The Render() function is called to display the chart.
pterm.DefaultBarChart.WithHorizontal().WithBars(bars).WithShowValue().Render()
}
```
### barchart/negative-values

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define a set of bars with negative values.
// Each bar is represented by a struct with a label and a value.
negativeBars := pterm.Bars{
{Label: "Bar 1", Value: -5},
{Label: "Bar 2", Value: -3},
{Label: "Longer Label", Value: -7},
}
// Print an informational message to the console.
pterm.Info.Println("Chart example with negative only values (bars use 100% of chart area)")
// Create a vertical bar chart with the defined bars.
// The WithShowValue() option is used to display the value of each bar in the chart.
// The Render() method is called to draw the chart.
_ = pterm.DefaultBarChart.WithBars(negativeBars).WithShowValue().Render()
// Create a horizontal bar chart with the same bars.
// The WithHorizontal() option is used to orient the chart horizontally.
// The WithShowValue() option and Render() method are used in the same way as before.
_ = pterm.DefaultBarChart.WithHorizontal().WithBars(negativeBars).WithShowValue().Render()
}
```
### barchart/show-value

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define a slice of bars for the bar chart. Each bar is represented by a struct
// with a Label and a Value. The Label is a string that represents the name of the bar,
// and the Value is an integer that represents the height of the bar.
bars := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create a bar chart with the defined bars using the DefaultBarChart object from PTerm.
// Chain the WithBars method to set the bars of the chart.
// Chain the WithShowValue method to display the value of each bar on the chart.
// Finally, call the Render method to display the chart.
pterm.DefaultBarChart.WithBars(bars).WithShowValue().Render()
}
```
### basictext/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// The DefaultBasicText is a basic text printer provided by PTerm.
// It is used to print text without any special formatting.
pterm.DefaultBasicText.Println("Default basic text printer.")
// The DefaultBasicText can be used in any context that requires a TextPrinter.
// Here, we're using it with the LightMagenta function to color a portion of the text.
pterm.DefaultBasicText.Println("Can be used in any" + pterm.LightMagenta(" TextPrinter ") + "context.")
// The DefaultBasicText is also useful for resolving progress bars and spinners.
}
```
### bigtext/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Create a large text with the LetterStyle from the standard theme.
// This is useful for creating title screens.
pterm.DefaultBigText.WithLetters(putils.LettersFromString("PTerm")).Render()
// Create a large text with differently colored letters.
// Here, the first letter 'P' is colored cyan and the rest 'Term' is colored light magenta.
// This can be used to highlight specific parts of the text.
pterm.DefaultBigText.WithLetters(
putils.LettersFromStringWithStyle("P", pterm.FgCyan.ToStyle()),
putils.LettersFromStringWithStyle("Term", pterm.FgLightMagenta.ToStyle()),
).Render()
// Create a large text with a specific RGB color.
// This can be used when you need a specific color that is not available in the standard colors.
// Here, the color is gold (RGB: 255, 215, 0).
pterm.DefaultBigText.WithLetters(
putils.LettersFromStringWithRGB("PTerm", pterm.NewRGB(255, 215, 0)),
).Render()
}
```
### bigtext/colored

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Initialize a big text display with the letters "P" and "Term"
// "P" is displayed in cyan and "Term" is displayed in light magenta
pterm.DefaultBigText.WithLetters(
putils.LettersFromStringWithStyle("P", pterm.FgCyan.ToStyle()),
putils.LettersFromStringWithStyle("Term", pterm.FgLightMagenta.ToStyle())).
Render() // Render the big text to the terminal
}
```
### bigtext/default

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Define the text to be rendered
var text = "PTerm"
// Convert the text into a format suitable for PTerm
var letters = putils.LettersFromString(text)
// Render the text using PTerm's default big text style
pterm.DefaultBigText.WithLetters(letters).Render()
}
```
### box/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Print an informational message.
pterm.Info.Println("This might not be rendered correctly on GitHub,\nbut it will work in a real terminal.\nThis is because GitHub does not use a monospaced font by default for SVGs")
// Create three panels with text, some of them with titles.
// The panels are created using the DefaultBox style.
panel1 := pterm.DefaultBox.Sprint("Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit,\nsed do eiusmod tempor incididunt\nut labore et dolore\nmagna aliqua.")
panel2 := pterm.DefaultBox.WithTitle("title").Sprint("Ut enim ad minim veniam,\nquis nostrud exercitation\nullamco laboris\nnisi ut aliquip\nex ea commodo\nconsequat.")
panel3 := pterm.DefaultBox.WithTitle("bottom center title").WithTitleBottomCenter().Sprint("Duis aute irure\ndolor in reprehenderit\nin voluptate velit esse cillum\ndolore eu fugiat\nnulla pariatur.")
// Combine the panels into a layout using the DefaultPanel style.
// The layout is a 2D grid, with each row being an array of panels.
// In this case, the first row contains panel1 and panel2, and the second row contains only panel3.
panels, _ := pterm.DefaultPanel.WithPanels(pterm.Panels{
{{Data: panel1}, {Data: panel2}},
{{Data: panel3}},
}).Srender()
// Print the panels layout inside a box with a title.
// The box is created using the DefaultBox style, with the title positioned at the bottom right.
pterm.DefaultBox.WithTitle("Lorem Ipsum").WithTitleBottomRight().WithRightPadding(0).WithBottomPadding(0).Println(panels)
}
```
### box/custom-padding

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a default box with custom padding options and print "Hello, World!" inside it.
pterm.DefaultBox.WithRightPadding(10).WithLeftPadding(10).WithTopPadding(2).WithBottomPadding(2).Println("Hello, World!")
}
```
### box/default

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a default box with PTerm and print a message in it.
// The DefaultBox.Println method automatically starts, prints the message, and stops the box.
pterm.DefaultBox.Println("Hello, World!")
}
```
### box/title

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a default box with specified padding
paddedBox := pterm.DefaultBox.WithLeftPadding(4).WithRightPadding(4).WithTopPadding(1).WithBottomPadding(1)
// Define a title for the box
title := pterm.LightRed("I'm a box!")
// Create boxes with the title positioned differently and containing different content
box1 := paddedBox.WithTitle(title).Sprint("Hello, World!\n 1") // Title at default position (top left)
box2 := paddedBox.WithTitle(title).WithTitleTopCenter().Sprint("Hello, World!\n 2") // Title at top center
box3 := paddedBox.WithTitle(title).WithTitleTopRight().Sprint("Hello, World!\n 3") // Title at top right
box4 := paddedBox.WithTitle(title).WithTitleBottomRight().Sprint("Hello, World!\n 4") // Title at bottom right
box5 := paddedBox.WithTitle(title).WithTitleBottomCenter().Sprint("Hello, World!\n 5") // Title at bottom center
box6 := paddedBox.WithTitle(title).WithTitleBottomLeft().Sprint("Hello, World!\n 6") // Title at bottom left
box7 := paddedBox.WithTitle(title).WithTitleTopLeft().Sprint("Hello, World!\n 7") // Title at top left
// Render the boxes in a panel layout
pterm.DefaultPanel.WithPanels([][]pterm.Panel{
{{box1}, {box2}, {box3}},
{{box4}, {box5}, {box6}},
{{box7}},
}).Render()
}
```
### bulletlist/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Define a list of bullet list items with different levels.
bulletListItems := []pterm.BulletListItem{
{Level: 0, Text: "Level 0"}, // Level 0 item
{Level: 1, Text: "Level 1"}, // Level 1 item
{Level: 2, Text: "Level 2"}, // Level 2 item
}
// Use the default bullet list style to render the list items.
pterm.DefaultBulletList.WithItems(bulletListItems).Render()
// Define a string with different levels of indentation.
text := `0
1
2
3`
// Convert the indented string to a bullet list and render it.
putils.BulletListFromString(text, " ").Render()
}
```
### bulletlist/customized

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define a list of bullet list items with different styles and levels.
bulletListItems := []pterm.BulletListItem{
{
Level: 0, // Level 0 (top level)
Text: "Blue", // Text to display
TextStyle: pterm.NewStyle(pterm.FgBlue), // Text color
BulletStyle: pterm.NewStyle(pterm.FgRed), // Bullet color
},
{
Level: 1, // Level 1 (sub-item)
Text: "Green", // Text to display
TextStyle: pterm.NewStyle(pterm.FgGreen), // Text color
Bullet: "-", // Custom bullet symbol
BulletStyle: pterm.NewStyle(pterm.FgLightWhite), // Bullet color
},
{
Level: 2, // Level 2 (sub-sub-item)
Text: "Cyan", // Text to display
TextStyle: pterm.NewStyle(pterm.FgCyan), // Text color
Bullet: ">", // Custom bullet symbol
BulletStyle: pterm.NewStyle(pterm.FgYellow), // Bullet color
},
}
// Create a bullet list with the defined items and render it.
pterm.DefaultBulletList.WithItems(bulletListItems).Render()
}
```
### center/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Print a block of text centered in the terminal
pterm.DefaultCenter.Println("This text is centered!\nIt centers the whole block by default.\nIn that way you can do stuff like this:")
// Generate BigLetters and store in 's'
s, _ := pterm.DefaultBigText.WithLetters(putils.LettersFromString("PTerm")).Srender()
// Print the BigLetters 's' centered in the terminal
pterm.DefaultCenter.Println(s)
// Print each line of the text separately centered in the terminal
pterm.DefaultCenter.WithCenterEachLineSeparately().Println("This text is centered!\nBut each line is\ncentered\nseparately")
}
```
### coloring/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a table with different foreground and background colors.
pterm.DefaultTable.WithData([][]string{
{pterm.FgBlack.Sprint("Black"), pterm.FgRed.Sprint("Red"), pterm.FgGreen.Sprint("Green"), pterm.FgYellow.Sprint("Yellow")},
{"", pterm.FgLightRed.Sprint("Light Red"), pterm.FgLightGreen.Sprint("Light Green"), pterm.FgLightYellow.Sprint("Light Yellow")},
{pterm.BgBlack.Sprint("Black"), pterm.BgRed.Sprint("Red"), pterm.BgGreen.Sprint("Green"), pterm.BgYellow.Sprint("Yellow")},
{"", pterm.BgLightRed.Sprint("Light Red"), pterm.BgLightGreen.Sprint("Light Green"), pterm.BgLightYellow.Sprint("Light Yellow")},
{pterm.FgBlue.Sprint("Blue"), pterm.FgMagenta.Sprint("Magenta"), pterm.FgCyan.Sprint("Cyan"), pterm.FgWhite.Sprint("White")},
{pterm.FgLightBlue.Sprint("Light Blue"), pterm.FgLightMagenta.Sprint("Light Magenta"), pterm.FgLightCyan.Sprint("Light Cyan"), pterm.FgLightWhite.Sprint("Light White")},
{pterm.BgBlue.Sprint("Blue"), pterm.BgMagenta.Sprint("Magenta"), pterm.BgCyan.Sprint("Cyan"), pterm.BgWhite.Sprint("White")},
{pterm.BgLightBlue.Sprint("Light Blue"), pterm.BgLightMagenta.Sprint("Light Magenta"), pterm.BgLightCyan.Sprint("Light Cyan"), pterm.BgLightWhite.Sprint("Light White")},
}).Render() // Render the table.
pterm.Println()
// Print words in different colors.
pterm.Println(pterm.Red("Hello, ") + pterm.Green("World") + pterm.Cyan("!"))
pterm.Println(pterm.Red("Even " + pterm.Cyan("nested ") + pterm.Green("colors ") + "are supported!"))
pterm.Println()
// Create a new style with a red background, light green foreground, and bold text.
style := pterm.NewStyle(pterm.BgRed, pterm.FgLightGreen, pterm.Bold)
// Print text using the created style.
style.Println("This text uses a style and is bold and light green with a red background!")
}
```
### coloring/disable-output

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Loop from 0 to 14
for i := 0; i < 15; i++ {
switch i {
case 5:
// At the 5th iteration, print a message and disable the output
pterm.Info.Println("Disabled Output!")
pterm.DisableOutput()
case 10:
// At the 10th iteration, enable the output and print a message
pterm.EnableOutput()
pterm.Info.Println("Enabled Output!")
}
// Print a progress message for each iteration
pterm.Printf("Printing something... [%d/%d]\n", i, 15)
}
}
```
### coloring/fade-colors

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Print an informational message.
pterm.Info.Println("RGB colors only work in Terminals which support TrueColor.")
// Define the start and end points for the color gradient.
startColor := pterm.NewRGB(0, 255, 255) // Cyan
endColor := pterm.NewRGB(255, 0, 255) // Magenta
// Get the terminal height to determine the gradient range.
terminalHeight := pterm.GetTerminalHeight()
// Loop over the range of the terminal height to create a color gradient.
for i := 0; i < terminalHeight-2; i++ {
// Calculate the fade factor for the current step in the gradient.
fadeFactor := float32(i) / float32(terminalHeight-2)
// Create a color that represents the current step in the gradient.
currentColor := startColor.Fade(0, 1, fadeFactor, endColor)
// Print a string with the current color.
currentColor.Println("Hello, World!")
}
}
```
### coloring/fade-colors-rgb-style

SHOW SOURCE
```go
package main
import (
"strings"
"github.com/pterm/pterm"
)
func main() {
// Define RGB colors
white := pterm.NewRGB(255, 255, 255)
grey := pterm.NewRGB(128, 128, 128)
black := pterm.NewRGB(0, 0, 0)
red := pterm.NewRGB(255, 0, 0)
purple := pterm.NewRGB(255, 0, 255)
green := pterm.NewRGB(0, 255, 0)
// Define strings to be printed
str1 := "RGB colors only work in Terminals which support TrueColor."
str2 := "The background and foreground colors can be customized individually."
str3 := "Styles can also be applied. For example: Bold or Italic."
// Print first string with color fading from white to purple
printFadedString(str1, white, purple, grey, black)
// Print second string with color fading from purple to red
printFadedString(str2, black, purple, red, red)
// Print third string with color fading from white to green and style changes
printStyledString(str3, white, green, red, black)
}
// printFadedString prints a string with color fading effect
func printFadedString(str string, fgStart, fgEnd, bgStart, bgEnd pterm.RGB) {
strs := strings.Split(str, "")
var result string
for i := 0; i < len(str); i++ {
// Create a style with color fading effect
style := pterm.NewRGBStyle(fgStart.Fade(0, float32(len(str)), float32(i), fgEnd), bgStart.Fade(0, float32(len(str)), float32(i), bgEnd))
// Append styled letter to result string
result += style.Sprint(strs[i])
}
pterm.Println(result)
}
// printStyledString prints a string with color fading and style changes
func printStyledString(str string, fgStart, fgEnd, bgStart, bgEnd pterm.RGB) {
strs := strings.Split(str, "")
var result string
boldStr := strings.Split("Bold", "")
italicStr := strings.Split("Italic", "")
bold, italic := 0, 0
for i := 0; i < len(str); i++ {
// Create a style with color fading effect
style := pterm.NewRGBStyle(fgStart.Fade(0, float32(len(str)), float32(i), fgEnd), bgStart.Fade(0, float32(len(str)), float32(i), bgEnd))
// Check if the next letters are "Bold" or "Italic" and add the corresponding style
if bold < len(boldStr) && i+len(boldStr)-bold <= len(strs) && strings.Join(strs[i:i+len(boldStr)-bold], "") == strings.Join(boldStr[bold:], "") {
style = style.AddOptions(pterm.Bold)
bold++
} else if italic < len(italicStr) && i+len(italicStr)-italic < len(strs) && strings.Join(strs[i:i+len(italicStr)-italic], "") == strings.Join(italicStr[italic:], "") {
style = style.AddOptions(pterm.Italic)
italic++
}
// Append styled letter to result string
result += style.Sprint(strs[i])
}
pterm.Println(result)
}
```
### coloring/fade-multiple-colors

SHOW SOURCE
```go
package main
import (
"strings"
"github.com/pterm/pterm"
)
func main() {
// Define RGB values for gradient points.
startColor := pterm.NewRGB(0, 255, 255)
firstPoint := pterm.NewRGB(255, 0, 255)
secondPoint := pterm.NewRGB(255, 0, 0)
thirdPoint := pterm.NewRGB(0, 255, 0)
endColor := pterm.NewRGB(255, 255, 255)
// Define the string to be printed.
str := "RGB colors only work in Terminals which support TrueColor."
strs := strings.Split(str, "")
// Initialize an empty string for the faded info.
var fadeInfo string
// Loop over the string length to create a gradient effect.
for i := 0; i < len(str); i++ {
// Append each character of the string with a faded color to the info string.
fadeInfo += startColor.Fade(0, float32(len(str)), float32(i), firstPoint).Sprint(strs[i])
}
// Print the info string with gradient effect.
pterm.Info.Println(fadeInfo)
// Get the terminal height.
terminalHeight := pterm.GetTerminalHeight()
// Loop over the terminal height to print "Hello, World!" with a gradient effect.
for i := 0; i < terminalHeight-2; i++ {
// Print the string with a color that fades from startColor to endColor.
startColor.Fade(0, float32(terminalHeight-2), float32(i), firstPoint, secondPoint, thirdPoint, endColor).Println("Hello, World!")
}
}
```
### coloring/override-default-printers

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Print a default error message with PTerm's built-in Error style.
pterm.Error.Println("This is the default Error")
// Override the default error prefix with a new text and style.
pterm.Error.Prefix = pterm.Prefix{Text: "OVERRIDE", Style: pterm.NewStyle(pterm.BgCyan, pterm.FgRed)}
// Print the error message again, this time with the overridden prefix.
pterm.Error.Println("This is the default Error after the prefix was overridden")
}
```
### coloring/print-color-rgb

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a new RGB color with values 178, 44, 199.
// This color will be used for the text.
pterm.NewRGB(178, 44, 199).Println("This text is printed with a custom RGB!")
// Create a new RGB color with values 15, 199, 209.
// This color will be used for the text.
pterm.NewRGB(15, 199, 209).Println("This text is printed with a custom RGB!")
// Create a new RGB color with values 201, 144, 30.
// This color will be used for the background.
// The 'true' argument indicates that the color is for the background.
pterm.NewRGB(201, 144, 30, true).Println("This text is printed with a custom RGB background!")
}
```
### coloring/print-color-rgb-style

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define RGB colors for foreground and background.
foregroundRGB := pterm.RGB{R: 187, G: 80, B: 0}
backgroundRGB := pterm.RGB{R: 0, G: 50, B: 123}
// Create a new RGB style with the defined foreground and background colors.
rgbStyle := pterm.NewRGBStyle(foregroundRGB, backgroundRGB)
// Print a string with the custom RGB style.
rgbStyle.Println("This text is not styled.")
// Add the 'Bold' option to the RGB style and print a string with this style.
rgbStyle.AddOptions(pterm.Bold).Println("This text is bold.")
// Add the 'Italic' option to the RGB style and print a string with this style.
rgbStyle.AddOptions(pterm.Italic).Println("This text is italic.")
}
```
### demo/demo

SHOW SOURCE
```go
package main
import (
"flag"
"math/rand"
"reflect"
"strconv"
"strings"
"time"
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
// Speed the demo up, by setting this flag.
// Usefull for debugging.
// Example:
//
// go run main.go -speedup
var speedup = flag.Bool("speedup", false, "Speed up the demo")
var skipIntro = flag.Bool("skip-intro", false, "Skips the intro")
var second = time.Second
var pseudoProgramList = strings.Split("pseudo-excel pseudo-photoshop pseudo-chrome pseudo-outlook pseudo-explorer "+
"pseudo-git pseudo-vsc pseudo-intellij pseudo-minecraft pseudo-scoop pseudo-chocolatey", " ")
func main() {
setup() // Setup the demo (flags etc.)
// Show intro
if !*skipIntro {
introScreen()
clear()
}
showcase("Structured Logging", 5, func() {
logger := pterm.DefaultLogger.
WithLevel(pterm.LogLevelTrace)
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
time.Sleep(time.Second * 3)
interstingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
logger.Debug("This might be interesting", logger.ArgsFromMap(interstingStuff))
time.Sleep(time.Second * 3)
logger.Info("That was actually interesting", logger.Args("such", "wow"))
time.Sleep(time.Second * 3)
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
time.Sleep(time.Second * 3)
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
time.Sleep(time.Second * 3)
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
})
showcase("Progress bar", 2, func() {
pb, _ := pterm.DefaultProgressbar.WithTotal(len(pseudoProgramList)).WithTitle("Installing stuff").Start()
for i := 0; i < pb.Total; i++ {
pb.UpdateTitle("Installing " + pseudoProgramList[i])
if pseudoProgramList[i] == "pseudo-minecraft" {
pterm.Warning.Println("Could not install pseudo-minecraft\nThe company policy forbids games.")
} else {
pterm.Success.Println("Installing " + pseudoProgramList[i])
}
pb.Increment()
time.Sleep(second / 2)
}
pb.Stop()
})
showcase("Spinner", 2, func() {
list := pseudoProgramList[7:]
spinner, _ := pterm.DefaultSpinner.Start("Installing stuff")
for i := 0; i < len(list); i++ {
spinner.UpdateText("Installing " + list[i])
if list[i] == "pseudo-minecraft" {
pterm.Warning.Println("Could not install pseudo-minecraft\nThe company policy forbids games.")
} else {
pterm.Success.Println("Installing " + list[i])
}
time.Sleep(second)
}
spinner.Success()
})
showcase("Live Output", 2, func() {
pterm.Info.Println("You can use an Area to display changing output:")
pterm.Println()
area, _ := pterm.DefaultArea.WithCenter().Start() // Start the Area printer, with the Center option.
for i := 0; i < 10; i++ {
str, _ := pterm.DefaultBigText.WithLetters(putils.LettersFromString(time.Now().Format("15:04:05"))).Srender() // Save current time in str.
area.Update(str) // Update Area contents.
time.Sleep(time.Second)
}
area.Stop()
})
showcase("Tables", 4, func() {
for i := 0; i < 3; i++ {
pterm.Println()
}
td := [][]string{
{"Library", "Description"},
{"PTerm", "Make beautiful CLIs"},
{"Testza", "Programmer friendly test framework"},
{"Cursor", "Move the cursor around the terminal"},
}
table, _ := pterm.DefaultTable.WithHasHeader().WithData(td).Srender()
boxedTable, _ := pterm.DefaultTable.WithHasHeader().WithData(td).WithBoxed().Srender()
pterm.DefaultCenter.Println(table)
pterm.DefaultCenter.Println(boxedTable)
})
showcase("TrueColor Support", 7, func() {
from := pterm.NewRGB(0, 255, 255) // This RGB value is used as the gradients start point.
to := pterm.NewRGB(255, 0, 255) // This RGB value is used as the gradients first point.
str := "If your terminal has TrueColor support, you can use RGB colors!\nYou can even fade them :)\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
strs := strings.Split(str, "")
var fadeInfo string // String which will be used to print info.
// For loop over the range of the string length.
for i := 0; i < len(str); i++ {
// Append faded letter to info string.
fadeInfo += from.Fade(0, float32(len(str)), float32(i), to).Sprint(strs[i])
}
pterm.DefaultCenter.WithCenterEachLineSeparately().Println(fadeInfo)
})
showcase("Fully Customizable", 2, func() {
for i := 0; i < 4; i++ {
pterm.Println()
}
text := "All printers are fully customizable!"
area := pterm.DefaultArea.WithCenter()
area.Update(pterm.DefaultBox.Sprintln(text))
time.Sleep(second)
area.Update(pterm.DefaultBox.WithTopPadding(1).Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleTopLeft().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleTopCenter().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleTopRight().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleBottomRight().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleBottomCenter().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleBottomLeft().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithBoxStyle(pterm.NewStyle(pterm.FgCyan)).Sprintln(text))
time.Sleep(second / 5)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithBoxStyle(pterm.NewStyle(pterm.FgRed)).Sprintln(text))
time.Sleep(second / 5)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithBoxStyle(pterm.NewStyle(pterm.FgGreen)).Sprintln(text))
time.Sleep(second / 5)
area.Update(pterm.DefaultBox.WithTopPadding(1).
WithBottomPadding(1).
WithLeftPadding(1).
WithRightPadding(1).
WithHorizontalString("═").
WithVerticalString("║").
WithBottomLeftCornerString("╗").
WithBottomRightCornerString("╔").
WithTopLeftCornerString("╝").
WithTopRightCornerString("╚").
Sprintln(text))
area.Stop()
})
showcase("Themes", 2, func() {
pterm.Info.Println("You can change the color theme of PTerm easily to fit your needs!\nThis is the default one:")
time.Sleep(second / 2)
// Print every value of the default theme with its own style.
v := reflect.ValueOf(pterm.ThemeDefault)
typeOfS := v.Type()
if typeOfS == reflect.TypeOf(pterm.Theme{}) {
for i := 0; i < v.NumField(); i++ {
field, ok := v.Field(i).Interface().(pterm.Style)
if ok {
field.Println(typeOfS.Field(i).Name)
}
time.Sleep(time.Millisecond * 250)
}
}
})
showcase("And much more!", 3, func() {
for i := 0; i < 4; i++ {
pterm.Println()
}
box := pterm.DefaultBox.
WithBottomPadding(1).
WithTopPadding(1).
WithLeftPadding(3).
WithRightPadding(3).
Sprintf("Have fun exploring %s!", pterm.Cyan("PTerm"))
pterm.DefaultCenter.Println(box)
})
}
func setup() {
flag.Parse()
if *speedup {
second = time.Millisecond * 200
}
}
func introScreen() {
ptermLogo, _ := pterm.DefaultBigText.WithLetters(
putils.LettersFromStringWithStyle("P", pterm.NewStyle(pterm.FgLightCyan)),
putils.LettersFromStringWithStyle("Term", pterm.NewStyle(pterm.FgLightMagenta))).
Srender()
pterm.DefaultCenter.Print(ptermLogo)
pterm.DefaultCenter.Print(pterm.DefaultHeader.WithFullWidth().WithBackgroundStyle(pterm.NewStyle(pterm.BgLightBlue)).WithMargin(10).Sprint("PTDP - PTerm Demo Program"))
pterm.Info.Println("This animation was generated with the latest version of PTerm!" +
"\nPTerm works on nearly every terminal and operating system." +
"\nIt's super easy to use!" +
"\nIf you want, you can customize everything :)" +
"\nYou can see the code of this demo in the " + pterm.LightMagenta("./_examples/demo") + " directory." +
"\n" +
"\nThis demo was updated at: " + pterm.Green(time.Now().Format("02 Jan 2006 - 15:04:05 MST")))
pterm.Println()
introSpinner, _ := pterm.DefaultSpinner.WithShowTimer(false).WithRemoveWhenDone(true).Start("Waiting for 15 seconds...")
time.Sleep(second)
for i := 14; i > 0; i-- {
if i > 1 {
introSpinner.UpdateText("Waiting for " + strconv.Itoa(i) + " seconds...")
} else {
introSpinner.UpdateText("Waiting for " + strconv.Itoa(i) + " second...")
}
time.Sleep(second)
}
introSpinner.Stop()
}
func clear() {
print("\033[H\033[2J")
}
func showcase(title string, seconds int, content func()) {
pterm.DefaultHeader.WithBackgroundStyle(pterm.NewStyle(pterm.BgLightBlue)).WithFullWidth().Println(title)
pterm.Println()
time.Sleep(second / 2)
content()
time.Sleep(second * time.Duration(seconds))
print("\033[H\033[2J")
}
func randomInt(min, max int) int {
rand.Seed(time.Now().UnixNano())
return rand.Intn(max-min+1) + min
}
```
### header/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Print a default header.
// This uses the default settings of PTerm to print a header.
pterm.DefaultHeader.Println("This is the default header!")
// Print a spacer line for better readability.
pterm.Println()
// Print a full-width header.
// This uses the WithFullWidth() option of PTerm to print a header that spans the full width of the terminal.
pterm.DefaultHeader.WithFullWidth().Println("This is a full-width header.")
}
```
### header/custom

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Customize the DefaultHeader with a cyan background, black text, and a margin of 15.
pterm.DefaultHeader.WithMargin(15).WithBackgroundStyle(pterm.NewStyle(pterm.BgCyan)).WithTextStyle(pterm.NewStyle(pterm.FgBlack)).Println("This is a custom header!")
// Define a new HeaderPrinter with a red background, black text, and a margin of 20.
newHeader := pterm.HeaderPrinter{
TextStyle: pterm.NewStyle(pterm.FgBlack),
BackgroundStyle: pterm.NewStyle(pterm.BgRed),
Margin: 20,
}
// Print the custom header using the new HeaderPrinter.
newHeader.Println("This is a custom header!")
}
```
### heatmap/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap. Each sub-array represents a row in the heatmap.
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the labels for the X and Y axes of the heatmap.
headerData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Create a heatmap with the defined data and axis labels, and enable RGB colors.
// Then render the heatmap.
pterm.DefaultHeatmap.WithAxisData(headerData).WithData(data).WithEnableRGB().Render()
}
```
### heatmap/custom_colors

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the axis labels for the heatmap
headerData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message
pterm.Info.Println("The following table has no rgb (supported by every terminal), no axis data and a legend.")
pterm.Println()
// Create the heatmap with the defined data and options, and render it
pterm.DefaultHeatmap.
WithData(data).
WithBoxed(false).
WithAxisData(headerData).
WithLegend(false).
WithColors(pterm.BgBlue, pterm.BgRed, pterm.BgGreen, pterm.BgYellow).
WithLegend().
Render()
}
```
### heatmap/custom_legend

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the header data for the heatmap
headerData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message
pterm.Info.Println("The following table has rgb (not supported by every terminal), axis data and a custom legend.")
pterm.Println()
// Create the heatmap with the defined data and options
// Options are chained in a single line for simplicity
pterm.DefaultHeatmap.
WithData(data).
WithBoxed(false).
WithAxisData(headerData).
WithEnableRGB().
WithLegendLabel("custom").
WithLegendOnlyColoredCells().
Render() // Render the heatmap
}
```
### heatmap/custom_rgb

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap.
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the axis labels for the heatmap.
axisLabels := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message.
pterm.Info.Println("The following table has rgb (not supported by every terminal), axis data and a legend.")
pterm.Println()
// Define the color range for the heatmap.
rgbRange := []pterm.RGB{
pterm.NewRGB(0, 0, 255),
pterm.NewRGB(255, 0, 0),
pterm.NewRGB(0, 255, 0),
pterm.NewRGB(255, 255, 0),
}
// Create and render the heatmap.
pterm.DefaultHeatmap.
WithData(data).
WithBoxed(false).
WithAxisData(axisLabels).
WithEnableRGB().
WithRGBRange(rgbRange...).
Render()
}
```
### heatmap/no_grid

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap.
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the axis data for the heatmap.
axisData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message.
pterm.Info.Println("The following table has rgb (not supported by every terminal), axis data and a legend.")
pterm.Println()
// Create the heatmap with the defined data and options, then render it.
pterm.DefaultHeatmap.WithData(data).WithBoxed(false).WithAxisData(axisData).WithEnableRGB().WithLegend().WithGrid(false).Render()
}
```
### heatmap/separated

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the heatmap.
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the axis labels for the heatmap.
headerData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message.
pterm.Info.Println("The following table has no rgb (supported by every terminal), no axis data and no legend.")
pterm.Println()
// Create the heatmap with the specified data and options, and render it.
pterm.DefaultHeatmap.WithData(data).WithBoxed(false).WithAxisData(headerData).WithLegend(false).Render()
}
```
### interactive_confirm/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Show an interactive confirmation dialog and get the result.
result, _ := pterm.DefaultInteractiveConfirm.Show()
// Print a blank line for better readability.
pterm.Println()
// Print the user's answer in a formatted way.
pterm.Info.Printfln("You answered: %s", boolToText(result))
}
// boolToText converts a boolean value to a colored text.
// If the value is true, it returns a green "Yes".
// If the value is false, it returns a red "No".
func boolToText(b bool) string {
if b {
return pterm.Green("Yes")
}
return pterm.Red("No")
}
```
### interactive_continue/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Create an interactive continue prompt with default settings
// This will pause the program execution until the user presses enter
// The message displayed is "Press 'Enter' to continue..."
prompt := pterm.DefaultInteractiveContinue
// Show the prompt and wait for user input
// The returned result is the user's input (should be empty as it's a continue prompt)
// The second return value is an error which is ignored here
result, _ := prompt.Show()
// Print a blank line for better readability
pterm.Println()
// Print the user's input with an info prefix
// As this is a continue prompt, the input should be empty
pterm.Info.Printfln("You answered: %s", result)
}
```
### interactive_multiselect/demo

SHOW SOURCE
```go
package main
import (
"fmt"
"github.com/pterm/pterm"
)
func main() {
// Initialize an empty slice to hold the options.
var options []string
// Populate the options slice with 100 options.
for i := 0; i < 100; i++ {
options = append(options, fmt.Sprintf("Option %d", i))
}
// Add 5 more options to the slice, indicating the availability of fuzzy searching.
for i := 0; i < 5; i++ {
options = append(options, fmt.Sprintf("You can use fuzzy searching (%d)", i))
}
// Use PTerm's interactive multiselect to present the options to the user and capture their selections.
// The Show() method displays the options and waits for user input.
selectedOptions, _ := pterm.DefaultInteractiveMultiselect.WithOptions(options).Show()
// Print the selected options, highlighted in green.
pterm.Info.Printfln("Selected options: %s", pterm.Green(selectedOptions))
}
```
### interactive_multiselect/custom-checkmarks

SHOW SOURCE
```go
package main
import (
"fmt"
"github.com/pterm/pterm"
)
func main() {
// Initialize an empty slice to hold the options
var options []string
// Populate the options slice with 5 options
for i := 0; i < 5; i++ {
options = append(options, fmt.Sprintf("Option %d", i))
}
// Create a new interactive multiselect printer with the options
// Disable the filter and define the checkmark symbols
printer := pterm.DefaultInteractiveMultiselect.
WithOptions(options).
WithFilter(false).
WithCheckmark(&pterm.Checkmark{Checked: pterm.Green("+"), Unchecked: pterm.Red("-")})
// Show the interactive multiselect and get the selected options
selectedOptions, _ := printer.Show()
// Print the selected options
pterm.Info.Printfln("Selected options: %s", pterm.Green(selectedOptions))
}
```
### interactive_multiselect/custom-keys

SHOW SOURCE
```go
package main
import (
"atomicgo.dev/keyboard/keys"
"fmt"
"github.com/pterm/pterm"
)
func main() {
// Initialize an empty slice to hold the options
var options []string
// Populate the options slice with 5 options
for i := 0; i < 5; i++ {
options = append(options, fmt.Sprintf("Option %d", i))
}
// Create a new interactive multiselect printer with the options
// Disable the filter and set the keys for confirming and selecting options
printer := pterm.DefaultInteractiveMultiselect.
WithOptions(options).
WithFilter(false).
WithKeyConfirm(keys.Enter).
WithKeySelect(keys.Space)
// Show the interactive multiselect and get the selected options
selectedOptions, _ := printer.Show()
// Print the selected options
pterm.Info.Printfln("Selected options: %s", pterm.Green(selectedOptions))
}
```
### interactive_select/demo

SHOW SOURCE
```go
package main
import (
"fmt"
"github.com/pterm/pterm"
)
func main() {
// Initialize an empty slice to hold the options
var options []string
// Generate 100 options and add them to the options slice
for i := 0; i < 100; i++ {
options = append(options, fmt.Sprintf("Option %d", i))
}
// Generate 5 additional options with a specific message and add them to the options slice
for i := 0; i < 5; i++ {
options = append(options, fmt.Sprintf("You can use fuzzy searching (%d)", i))
}
// Use PTerm's interactive select feature to present the options to the user and capture their selection
// The Show() method displays the options and waits for the user's input
selectedOption, _ := pterm.DefaultInteractiveSelect.WithOptions(options).Show()
// Display the selected option to the user with a green color for emphasis
pterm.Info.Printfln("Selected option: %s", pterm.Green(selectedOption))
}
```
### interactive_textinput/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Create an interactive text input with single line input mode and show it
result, _ := pterm.DefaultInteractiveTextInput.Show()
// Print a blank line for better readability
pterm.Println()
// Print the user's answer with an info prefix
pterm.Info.Printfln("You answered: %s", result)
}
```
### interactive_textinput/default-value

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Create an interactive text input with single line input mode and show it
result, _ := pterm.DefaultInteractiveTextInput.WithDefaultValue("Some default value").Show()
// Print a blank line for better readability
pterm.Println()
// Print the user's answer with an info prefix
pterm.Info.Printfln("You answered: %s", result)
}
```
### interactive_textinput/multi-line

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Create a default interactive text input with multi-line enabled.
// This allows the user to input multiple lines of text.
textInput := pterm.DefaultInteractiveTextInput.WithMultiLine()
// Show the text input to the user and store the result.
// The second return value (an error) is ignored with '_'.
result, _ := textInput.Show()
// Print a blank line for better readability in the output.
pterm.Println()
// Print the user's input prefixed with an informational message.
// The '%s' placeholder is replaced with the user's input.
pterm.Info.Printfln("You answered: %s", result)
}
```
### interactive_textinput/password

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create an interactive text input with a mask for password input
passwordInput := pterm.DefaultInteractiveTextInput.WithMask("*")
// Show the password input prompt and store the result
result, _ := passwordInput.Show("Enter your password")
// Get the default logger from PTerm
logger := pterm.DefaultLogger
// Log the received password (masked)
// Note: In a real-world application, you should never log passwords
logger.Info("Password received", logger.Args("password", result))
}
```
### logger/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"time"
)
func main() {
// Create a logger with trace level
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace)
// Log a trace level message
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
// Pause for 3 seconds
sleep()
// Define a map with interesting stuff
interstingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
// Log a debug level message with arguments from the map
logger.Debug("This might be interesting", logger.ArgsFromMap(interstingStuff))
// Pause for 3 seconds
sleep()
// Log an info level message
logger.Info("That was actually interesting", logger.Args("such", "wow"))
// Pause for 3 seconds
sleep()
// Log a warning level message
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
// Pause for 3 seconds
sleep()
// Log an error level message
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
// Pause for 3 seconds
sleep()
// Log an info level message with a long text that will be automatically wrapped
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
// Pause for 3 seconds
sleep()
// Log a fatal level message
logger.Fatal("Oh no, this process is getting killed!", logger.Args("fatal", true))
}
// Function to pause the execution for 3 seconds
func sleep() {
time.Sleep(time.Second * 3)
}
```
### logger/custom-key-styles

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a logger with a level of Trace or higher.
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace)
// Define a new style for the "priority" key.
priorityStyle := map[string]pterm.Style{
"priority": *pterm.NewStyle(pterm.FgRed),
}
// Overwrite all key styles with the new map.
logger = logger.WithKeyStyles(priorityStyle)
// Log an info message. The "priority" key will be displayed in red.
logger.Info("The priority key should now be red", logger.Args("priority", "low", "foo", "bar"))
// Define a new style for the "foo" key.
fooStyle := *pterm.NewStyle(pterm.FgBlue)
// Append the new style to the existing ones.
logger.AppendKeyStyle("foo", fooStyle)
// Log another info message. The "foo" key will be displayed in blue.
logger.Info("The foo key should now be blue", logger.Args("priority", "low", "foo", "bar"))
}
```
### logger/default

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"time"
)
func main() {
// Create a logger with a level of Trace or higher.
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace)
// Log a trace message with additional arguments.
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
// Create a map of interesting stuff.
interstingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
// Log a debug message with arguments from a map.
logger.Debug("This might be interesting", logger.ArgsFromMap(interstingStuff))
// Log an info message with additional arguments.
logger.Info("That was actually interesting", logger.Args("such", "wow"))
// Log a warning message with additional arguments.
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
// Log an error message with additional arguments.
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
// Log an info message with additional arguments. PTerm will automatically wrap long logs.
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
// Pause for 2 seconds.
time.Sleep(time.Second * 2)
// Log a fatal message with additional arguments. This will terminate the process.
logger.Fatal("Oh no, this process is getting killed!", logger.Args("fatal", true))
}
```
### logger/json

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a logger with Trace level and JSON formatter
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace).WithFormatter(pterm.LogFormatterJSON)
// Log a Trace level message with additional arguments
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
// Create a map of interesting stuff
interestingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
// Log a Debug level message with arguments from the map
logger.Debug("This might be interesting", logger.ArgsFromMap(interestingStuff))
// Log Info, Warn, Error, and Fatal level messages with additional arguments
logger.Info("That was actually interesting", logger.Args("such", "wow"))
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
logger.Fatal("Oh no, this process is getting killed!", logger.Args("fatal", true))
}
```
### logger/with-caller

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a logger with Trace level and caller information
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace).WithCaller()
// Log a trace message with additional arguments
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
// Create a map of interesting stuff
interestingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
// Log a debug message with arguments from a map
logger.Debug("This might be interesting", logger.ArgsFromMap(interestingStuff))
// Log an info message with additional arguments
logger.Info("That was actually interesting", logger.Args("such", "wow"))
// Log a warning message with additional arguments
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
// Log an error message with additional arguments
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
// Log an info message with additional arguments. PTerm will automatically wrap long logs.
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
// Log a fatal message with additional arguments. This will terminate the process.
logger.Fatal("Oh no, this process is getting killed!", logger.Args("fatal", true))
}
```
### multiple-live-printers/demo

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Create a multi printer for managing multiple printers
multi := pterm.DefaultMultiPrinter
// Create two spinners with their own writers
spinner1, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 1")
spinner2, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 2")
// Create five progress bars with their own writers and a total of 100
pb1, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 1")
pb2, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 2")
pb3, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 3")
pb4, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 4")
pb5, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 5")
// Start the multi printer
multi.Start()
// Increment progress bars and spinners based on certain conditions
for i := 1; i <= 100; i++ {
pb1.Increment() // Increment progress bar 1 every iteration
if i%2 == 0 {
pb2.Add(3) // Add 3 to progress bar 2 every even iteration
}
if i%5 == 0 {
pb3.Increment() // Increment progress bar 3 every 5th iteration
}
if i%10 == 0 {
pb4.Increment() // Increment progress bar 4 every 10th iteration
}
if i%3 == 0 {
pb5.Increment() // Increment progress bar 5 every 3rd iteration
}
if i%50 == 0 {
spinner1.Success("Spinner 1 is done!") // Mark spinner 1 as successful every 50th iteration
}
if i%60 == 0 {
spinner2.Fail("Spinner 2 failed!") // Mark spinner 2 as failed every 60th iteration
}
time.Sleep(time.Millisecond * 50) // Sleep for 50 milliseconds between each iteration
}
// Stop the multi printer
multi.Stop()
}
```
### panel/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define panels in a 2D grid system
panels := pterm.Panels{
{
{Data: "This is the first panel"},
{Data: pterm.DefaultHeader.Sprint("Hello, World!")},
{Data: "This\npanel\ncontains\nmultiple\nlines"},
},
{
{Data: pterm.Red("This is another\npanel line")},
{Data: "This is the second panel\nwith a new line"},
},
}
// Render the panels with a padding of 5
_ = pterm.DefaultPanel.WithPanels(panels).WithPadding(5).Render()
}
```
### paragraph/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Using the default paragraph printer to print a long text.
// The text is split at the spaces, which is useful for continuous text of all kinds.
// The line width can be manually adjusted if needed.
pterm.DefaultParagraph.Println("This is the default paragraph printer. As you can see, no words are separated, " +
"but the text is split at the spaces. This is useful for continuous text of all kinds. You can manually change the line width if you want to." +
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam")
// Printing a line space for separation.
pterm.Println()
// Printing a long text without using the paragraph printer.
// The default Println() function is used here, which does not provide intelligent splitting.
pterm.Println("This text is written with the default Println() function. No intelligent splitting here." +
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam")
}
```
### paragraph/customized

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define a long text to be printed as a paragraph.
longText := "This is a custom paragraph printer. As you can see, no words are separated, " +
"but the text is split at the spaces. This is useful for continuous text of all kinds. You can manually change the line width if you want to." +
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam"
// Print the long text as a paragraph with a custom maximal width of 60 characters.
pterm.DefaultParagraph.WithMaxWidth(60).Println(longText)
// Print a line space to separate the paragraph from the following text.
pterm.Println()
// Define another long text to be printed without a paragraph printer.
longTextWithoutParagraph := "This text is written with the default Println() function. No intelligent splitting here." +
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam"
// Print the long text without using a paragraph printer.
pterm.Println(longTextWithoutParagraph)
}
```
### prefix/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Enable debug messages in PTerm.
pterm.EnableDebugMessages()
// Print a debug message with PTerm.
pterm.Debug.Println("Hello, World!")
// Print an informational message with PTerm.
pterm.Info.Println("Hello, World!")
// Print a success message with PTerm.
pterm.Success.Println("Hello, World!")
// Print a warning message with PTerm.
pterm.Warning.Println("Hello, World!")
// Print an error message with PTerm. This will also display the filename and line number in the terminal.
pterm.Error.Println("Errors show the filename and linenumber inside the terminal!")
// Print an informational message with PTerm, with line number.
// This demonstrates that other PrefixPrinters can also display line numbers.
pterm.Info.WithShowLineNumber().Println("Other PrefixPrinters can do that too!")
// Temporarily set Fatal to false, so that the CI won't crash.
// This will print a fatal message with PTerm, but won't terminate the program.
pterm.Fatal.WithFatal(false).Println("Hello, World!")
}
```
### progressbar/demo

SHOW SOURCE
```go
package main
import (
"strings"
"time"
"github.com/pterm/pterm"
)
// Slice of strings representing names of pseudo applications to be downloaded.
var fakeInstallList = strings.Split("pseudo-excel pseudo-photoshop pseudo-chrome pseudo-outlook pseudo-explorer "+
"pseudo-dops pseudo-git pseudo-vsc pseudo-intellij pseudo-minecraft pseudo-scoop pseudo-chocolatey", " ")
func main() {
// Create a progressbar with the total steps equal to the number of items in fakeInstallList.
// Set the initial title of the progressbar to "Downloading stuff".
p, _ := pterm.DefaultProgressbar.WithTotal(len(fakeInstallList)).WithTitle("Downloading stuff").Start()
// Loop over each item in the fakeInstallList.
for i := 0; i < p.Total; i++ {
// Simulate a slow download for the 7th item.
if i == 6 {
time.Sleep(time.Second * 3)
}
// Update the title of the progressbar with the current item being downloaded.
p.UpdateTitle("Downloading " + fakeInstallList[i])
// Print a success message for the current download. This will be printed above the progressbar.
pterm.Success.Println("Downloading " + fakeInstallList[i])
// Increment the progressbar by one to indicate progress.
p.Increment()
// Pause for 350 milliseconds to simulate the time taken for each download.
time.Sleep(time.Millisecond * 350)
}
}
```
### progressbar/multiple

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Create a multi printer instance from the default one
multi := pterm.DefaultMultiPrinter
// Create five progress bars with a total of 100 units each, and assign each a new writer from the multi printer
pb1, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 1")
pb2, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 2")
pb3, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 3")
pb4, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 4")
pb5, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 5")
// Start the multi printer
multi.Start()
// Loop to increment progress bars based on certain conditions
for i := 1; i <= 100; i++ {
pb1.Increment() // Increment the first progress bar at each iteration
if i%2 == 0 {
pb2.Add(3) // Add 3 units to the second progress bar at every even iteration
}
if i%5 == 0 {
pb3.Increment() // Increment the third progress bar at every fifth iteration
}
if i%10 == 0 {
pb4.Increment() // Increment the fourth progress bar at every tenth iteration
}
if i%3 == 0 {
pb5.Increment() // Increment the fifth progress bar at every third iteration
}
time.Sleep(time.Millisecond * 50) // Pause for 50 milliseconds at each iteration
}
// Stop the multi printer
multi.Stop()
}
```
### section/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a section with level one and print it.
pterm.DefaultSection.Println("This is a section!")
// Print an informational message.
pterm.Info.Println("And here is some text.\nThis text could be anything.\nBasically it's just a placeholder")
// Create a section with level two and print it.
pterm.DefaultSection.WithLevel(2).Println("This is another section!")
// Print another informational message.
pterm.Info.Println("And this is\nmore placeholder text")
}
```
### slog/demo

SHOW SOURCE
```go
package main
import (
"log/slog"
"github.com/pterm/pterm"
)
func main() {
// Create a new slog handler with the default PTerm logger
handler := pterm.NewSlogHandler(&pterm.DefaultLogger)
// Create a new slog logger with the handler
logger := slog.New(handler)
// Log a debug message (won't show by default)
logger.Debug("This is a debug message that won't show")
// Change the log level to debug to enable debug messages
pterm.DefaultLogger.Level = pterm.LogLevelDebug
// Log a debug message (will show because debug level is enabled)
logger.Debug("This is a debug message", "changedLevel", true)
// Log an info message
logger.Info("This is an info message")
// Log a warning message
logger.Warn("This is a warning message")
// Log an error message
logger.Error("This is an error message")
}
```
### spinner/demo

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Create and start a fork of the default spinner.
spinnerInfo, _ := pterm.DefaultSpinner.Start("Some informational action...")
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerInfo.Info() // Resolve spinner with error message.
// Create and start a fork of the default spinner.
spinnerSuccess, _ := pterm.DefaultSpinner.Start("Doing something important... (will succeed)")
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerSuccess.Success() // Resolve spinner with success message.
// Create and start a fork of the default spinner.
spinnerWarning, _ := pterm.DefaultSpinner.Start("Doing something important... (will warn)")
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerWarning.Warning() // Resolve spinner with warning message.
// Create and start a fork of the default spinner.
spinnerFail, _ := pterm.DefaultSpinner.Start("Doing something important... (will fail)")
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerFail.Fail() // Resolve spinner with error message.
// Create and start a fork of the default spinner.
spinnerNochange, _ := pterm.DefaultSpinner.Start("Checking something important... (will result in no change)")
// Replace the InfoPrinter with a custom "NOCHG" one
spinnerNochange.InfoPrinter = &pterm.PrefixPrinter{
MessageStyle: &pterm.Style{pterm.FgLightBlue},
Prefix: pterm.Prefix{
Style: &pterm.Style{pterm.FgBlack, pterm.BgLightBlue},
Text: " NOCHG ",
},
}
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerNochange.Info("No change were required") // Resolve spinner with error message.
// Create and start a fork of the default spinner.
spinnerLiveText, _ := pterm.DefaultSpinner.Start("Doing a lot of stuff...")
time.Sleep(time.Second) // Simulate 2 seconds of processing something.
spinnerLiveText.UpdateText("It's really much") // Update spinner text.
time.Sleep(time.Second) // Simulate 2 seconds of processing something.
spinnerLiveText.UpdateText("We're nearly done!") // Update spinner text.
time.Sleep(time.Second) // Simulate 2 seconds of processing something.
spinnerLiveText.Success("Finally!") // Resolve spinner with success message.
}
```
### spinner/multiple

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Create a multi printer. This allows multiple spinners to print simultaneously.
multi := pterm.DefaultMultiPrinter
// Create and start spinner 1 with a new writer from the multi printer.
// The spinner will display the message "Spinner 1".
spinner1, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 1")
// Create and start spinner 2 with a new writer from the multi printer.
// The spinner will display the message "Spinner 2".
spinner2, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 2")
// Create and start spinner 3 with a new writer from the multi printer.
// The spinner will display the message "Spinner 3".
spinner3, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 3")
// Start the multi printer. This will start printing all the spinners.
multi.Start()
// Wait for 1 second.
time.Sleep(time.Millisecond * 1000)
// Stop spinner 1 with a success message.
spinner1.Success("Spinner 1 is done!")
// Wait for 750 milliseconds.
time.Sleep(time.Millisecond * 750)
// Stop spinner 2 with a failure message.
spinner2.Fail("Spinner 2 failed!")
// Wait for 500 milliseconds.
time.Sleep(time.Millisecond * 500)
// Stop spinner 3 with a warning message.
spinner3.Warning("Spinner 3 has a warning!")
// Stop the multi printer. This will stop printing all the spinners.
multi.Stop()
}
```
### style/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define a primary style with light cyan foreground, gray background, and bold text
primary := pterm.NewStyle(pterm.FgLightCyan, pterm.BgGray, pterm.Bold)
// Define a secondary style with light green foreground, white background, and italic text
secondary := pterm.NewStyle(pterm.FgLightGreen, pterm.BgWhite, pterm.Italic)
// Print "Hello, World!" with the primary style
primary.Println("Hello, World!")
// Print "Hello, World!" with the secondary style
secondary.Println("Hello, World!")
}
```
### table/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the first table
tableData1 := pterm.TableData{
{"Firstname", "Lastname", "Email", "Note"},
{"Paul", "Dean", "augue@velitAliquam.co.uk", ""},
{"Callie", "Mckay", "nunc.sed@est.com", "这是一个测试, haha!"},
{"Libby", "Camacho", "lobortis@semper.com", "just a test, hey!"},
{"张", "小宝", "zhang@example.com", ""},
}
// Create a table with a header and the defined data, then render it
pterm.DefaultTable.WithHasHeader().WithData(tableData1).Render()
pterm.Println() // Blank line
// Define the data for the second table
tableData2 := pterm.TableData{
{"Firstname", "Lastname", "Email"},
{"Paul\n\nNewline", "Dean", "augue@velitAliquam.co.uk"},
{"Callie", "Mckay", "nunc.sed@est.com\nNewline"},
{"Libby", "Camacho", "lobortis@semper.com"},
{"张", "小宝", "zhang@example.com"},
}
// Create another table with a header and the defined data, then render it
pterm.DefaultTable.WithHasHeader().WithData(tableData2).Render()
}
```
### table/boxed

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the table.
// Each inner slice represents a row in the table.
// The first row is considered as the header of the table.
tableData := pterm.TableData{
{"Firstname", "Lastname", "Email", "Note"},
{"Paul", "Dean", "augue@velitAliquam.co.uk", ""},
{"Callie", "Mckay", "nunc.sed@est.com", "这是一个测试, haha!"},
{"Libby", "Camacho", "lobortis@semper.com", "just a test, hey!"},
{"张", "小宝", "zhang@example.com", ""},
}
// Create a table with the defined data.
// The table has a header and is boxed.
// Finally, render the table to print it.
pterm.DefaultTable.WithHasHeader().WithBoxed().WithData(tableData).Render()
}
```
### table/multiple-lines

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the table.
data := pterm.TableData{
{"Firstname", "Lastname", "Email"},
{"Paul\n\nNewline", "Dean", "augue@velitAliquam.co.uk"},
{"Callie", "Mckay", "nunc.sed@est.com\nNewline"},
{"Libby", "Camacho", "lobortis@semper.com"},
{"张", "小宝", "zhang@example.com"},
}
// Create and render the table.
// The options are chained in a single line for simplicity.
// The table has a header, a row separator, and a header row separator.
pterm.DefaultTable.WithHasHeader().WithRowSeparator("-").WithHeaderRowSeparator("-").WithData(data).Render()
}
```
### table/right-alignment

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the table.
// Each inner slice represents a row in the table.
// The first row is considered as the header.
tableData := pterm.TableData{
{"Firstname", "Lastname", "Email", "Note"},
{"Paul", "Dean", "augue@velitAliquam.co.uk", ""},
{"Callie", "Mckay", "nunc.sed@est.com", "这是一个测试, haha!"},
{"Libby", "Camacho", "lobortis@semper.com", "just a test, hey!"},
{"张", "小宝", "zhang@example.com", ""},
}
// Create a table with the defined data.
// The table has a header and the text in the cells is right-aligned.
// The Render() method is used to print the table to the console.
pterm.DefaultTable.WithHasHeader().WithRightAlignment().WithData(tableData).Render()
}
```
### theme/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"reflect"
"time"
)
func main() {
// Print an informational message about the default theme styles.
pterm.Info.Println("These are the default theme styles.\nYou can modify them easily to your personal preference,\nor create new themes from scratch :)")
// Print a blank line for better readability.
pterm.Println()
// Get the value and type of the default theme.
v := reflect.ValueOf(pterm.ThemeDefault)
typeOfS := v.Type()
// Check if the type of the default theme is 'pterm.Theme'.
if typeOfS == reflect.TypeOf(pterm.Theme{}) {
// Iterate over each field in the default theme.
for i := 0; i < v.NumField(); i++ {
// Try to convert the field to 'pterm.Style'.
field, ok := v.Field(i).Interface().(pterm.Style)
if ok {
// Print the field name using its own style.
field.Println(typeOfS.Field(i).Name)
}
// Pause for a quarter of a second to make the output easier to read.
time.Sleep(time.Millisecond * 250)
}
}
}
```
### tree/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define a tree structure using pterm.TreeNode
tree := pterm.TreeNode{
// The top node of the tree
Text: "Top node",
// The children of the top node
Children: []pterm.TreeNode{{
// A child node
Text: "Child node",
// The children of the child node
Children: []pterm.TreeNode{
// Grandchildren nodes
{Text: "Grandchild node"},
{Text: "Grandchild node"},
{Text: "Grandchild node"},
},
}},
}
// Render the tree with the defined structure as the root
pterm.DefaultTree.WithRoot(tree).Render()
}
```
### tree/from-leveled-list

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Define a leveled list to represent the structure of the directories.
leveledList := pterm.LeveledList{
{Level: 0, Text: "C:"},
{Level: 1, Text: "Users"},
{Level: 1, Text: "Windows"},
{Level: 1, Text: "Programs"},
{Level: 1, Text: "Programs(x86)"},
{Level: 1, Text: "dev"},
{Level: 0, Text: "D:"},
{Level: 0, Text: "E:"},
{Level: 1, Text: "Movies"},
{Level: 1, Text: "Music"},
{Level: 2, Text: "LinkinPark"},
{Level: 1, Text: "Games"},
{Level: 2, Text: "Shooter"},
{Level: 3, Text: "CallOfDuty"},
{Level: 3, Text: "CS:GO"},
{Level: 3, Text: "Battlefield"},
{Level: 4, Text: "Battlefield 1"},
{Level: 4, Text: "Battlefield 2"},
{Level: 0, Text: "F:"},
{Level: 1, Text: "dev"},
{Level: 2, Text: "dops"},
{Level: 2, Text: "PTerm"},
}
// Convert the leveled list into a tree structure.
root := putils.TreeFromLeveledList(leveledList)
root.Text = "Computer" // Set the root node text.
// Render the tree structure using the default tree printer.
pterm.DefaultTree.WithRoot(root).Render()
}
```
---
> GitHub [@pterm](https://github.com/pterm) ·
> Author [@MarvinJWendt](https://github.com/MarvinJWendt)
> | [PTerm.sh](https://pterm.sh)
golang-github-pterm-pterm-0.12.79/SECURITY.md 0000664 0000000 0000000 00000002720 14650106263 0020470 0 ustar 00root root 0000000 0000000 # PTerm Security Policy
This security policy applies to the PTerm GitHub repository and outlines the process for reporting security issues and handling security incidents. The primary goal of this policy is to ensure the safety and integrity of the PTerm codebase and to minimize the impact of security incidents on our users.
## 1. Overview
PTerm is a command-line interface (CLI) tool library, and we believe the security risks associated with it are minimal. However, we recognize that vulnerabilities can still arise, and we are committed to addressing them promptly and transparently.
## 2. Reporting Security Issues
If you discover a security issue in PTerm, please follow these steps:
Open a new issue in the PTerm GitHub repository, describing the security problem in detail.
## 3. Vulnerable Dependencies
If a dependency of PTerm is found to be vulnerable or infected and requires immediate updates, please follow these steps:
1. Open a new issue in the PTerm GitHub repository, describing the vulnerable dependency and the need for an update.
2. *Optional: Contact @MarvinJWendt directly via Twitter or Discord to alert them to the issue.*
## 4. Incident Response
Upon receiving a security report, the PTerm team will:
1. Acknowledge receipt of the report and review the issue.
2. Investigate the issue and determine the severity and impact.
3. Develop and implement a fix or mitigation plan, as necessary.
4. Update the PTerm repository and notify users, if applicable.
golang-github-pterm-pterm-0.12.79/_examples/ 0000775 0000000 0000000 00000000000 14650106263 0020653 5 ustar 00root root 0000000 0000000 golang-github-pterm-pterm-0.12.79/_examples/README.md 0000664 0000000 0000000 00000301735 14650106263 0022143 0 ustar 00root root 0000000 0000000 # PTerm Examples
> This directory contains examples of using the PTerm library.
### area/demo

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Print an informational message using PTerm's Info printer.
// This message will stay in place while the area updates.
pterm.Info.Println("The previous text will stay in place, while the area updates.")
// Print two new lines as spacer.
pterm.Print("\n\n")
// Start the Area printer from PTerm's DefaultArea, with the Center option.
// The Area printer allows us to update a specific area of the console output.
// The returned 'area' object is used to control the area updates.
area, _ := pterm.DefaultArea.WithCenter().Start()
// Loop 10 times to update the area with the current time.
for i := 0; i < 10; i++ {
// Get the current time, format it as "15:04:05" (hour:minute:second), and convert it to a string.
// Then, create a BigText from the time string using PTerm's DefaultBigText and putils NewLettersFromString.
// The Srender() function is used to save the BigText as a string.
str, _ := pterm.DefaultBigText.WithLetters(putils.LettersFromString(time.Now().Format("15:04:05"))).Srender()
// Update the Area contents with the current time string.
area.Update(str)
// Sleep for a second before the next update.
time.Sleep(time.Second)
}
// Stop the Area printer after all updates are done.
area.Stop()
}
```
### area/center

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new default area in the center of the terminal.
// The Start() function returns the created area and an error.
area, _ := pterm.DefaultArea.WithCenter().Start()
// Loop 5 times to simulate a dynamic update.
for i := 0; i < 5; i++ {
// Update the content of the area with the current count.
// The Sprintf function is used to format the string.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second to simulate a time-consuming task.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
area.Stop()
}
```
### area/default

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new default area and get a reference to it.
// The second return value is an error which is ignored here.
area, _ := pterm.DefaultArea.Start()
// Loop 5 times
for i := 0; i < 5; i++ {
// Update the content of the area dynamically.
// Here we're just displaying the current count.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second before the next update.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
// This will clean up and free resources used by the area.
area.Stop()
}
```
### area/dynamic-chart

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new fullscreen centered area.
// This area will be used to display the bar chart.
area, _ := pterm.DefaultArea.WithFullscreen().WithCenter().Start()
// Ensure the area stops updating when we're done.
defer area.Stop()
// Loop to update the bar chart 10 times.
for i := 0; i < 10; i++ {
// Create a new bar chart with dynamic bars.
// The bars will change based on the current iteration.
barchart := pterm.DefaultBarChart.WithBars(dynamicBars(i))
// Render the bar chart to a string.
// This string will be used to update the area.
content, _ := barchart.Srender()
// Update the area with the new bar chart.
area.Update(content)
// Wait for half a second before the next update.
time.Sleep(500 * time.Millisecond)
}
}
// dynamicBars generates a set of bars for the bar chart.
// The bars will change based on the current iteration.
func dynamicBars(i int) pterm.Bars {
return pterm.Bars{
{Label: "A", Value: 10}, // A static bar.
{Label: "B", Value: 20 * i}, // A bar that grows with each iteration.
{Label: "C", Value: 30}, // Another static bar.
{Label: "D", Value: 40 + i}, // A bar that grows slowly with each iteration.
}
}
```
### area/fullscreen

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new fullscreen area. This will return an area instance and an error.
// The underscore (_) is used to ignore the error.
area, _ := pterm.DefaultArea.WithFullscreen().Start()
// Loop 5 times to update the area content.
for i := 0; i < 5; i++ {
// Update the content of the area with the current count.
// The Sprintf function is used to format the string.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second before the next update.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
area.Stop()
}
```
### area/fullscreen-center

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Initialize a new PTerm area with fullscreen and center options
// The Start() function returns the created area and an error (ignored here)
area, _ := pterm.DefaultArea.WithFullscreen().WithCenter().Start()
// Loop 5 times to demonstrate dynamic content update
for i := 0; i < 5; i++ {
// Update the content of the area with the current count
// The Sprintf function is used to format the string with the count
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second
time.Sleep(time.Second)
}
// Stop the area after all updates are done
// This will clear the area and return the terminal to its normal state
area.Stop()
}
```
### barchart/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the bars for the chart
bars := []pterm.Bar{
{Label: "Bar 1", Value: 5},
{Label: "Bar 2", Value: 3},
{Label: "Longer Label", Value: 7},
}
// Print an informational message
pterm.Info.Println("Chart example with positive only values (bars use 100% of chart area)")
// Create a bar chart with the defined bars and render it
// The DefaultBarChart is used as a base, and the bars are added with the WithBars option
// The Render function is then called to display the chart
pterm.DefaultBarChart.WithBars(bars).Render()
// Create a horizontal bar chart with the defined bars and render it
// The DefaultBarChart is used as a base, the chart is made horizontal with the WithHorizontal option, and the bars are added with the WithBars option
// The Render function is then called to display the chart
pterm.DefaultBarChart.WithHorizontal().WithBars(bars).Render()
}
```
### barchart/custom-height

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define a slice of Bar structs. Each struct represents a bar in the chart.
// The Label field is the name of the bar and the Value field is the height of the bar.
bars := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create and render a bar chart with the defined bars and a height of 5.
// The WithBars method is used to set the bars of the chart.
// The WithHeight method is used to set the height of the chart.
// The Render method is used to display the chart in the terminal.
pterm.DefaultBarChart.WithBars(bars).WithHeight(5).Render()
}
```
### barchart/custom-width

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the bar chart
barData := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create a bar chart with the defined data
// The chart is horizontal and has a width of 5
// The Render() function is called to display the chart
pterm.DefaultBarChart.WithBars(barData).WithHorizontal().WithWidth(5).Render()
}
```
### barchart/default

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the bar chart. Each bar is represented by a `pterm.Bar` struct.
// The `Label` field represents the label of the bar, and the `Value` field represents the value of the bar.
bars := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Use the `DefaultBarChart` from the `pterm` package to create a bar chart.
// The `WithBars` method is used to set the bars of the chart.
// The `Render` method is used to display the chart.
pterm.DefaultBarChart.WithBars(bars).Render()
}
```
### barchart/horizontal

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the bar chart
bars := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create a bar chart with the defined data
// The chart is displayed horizontally
// The Render() function is called to display the chart
pterm.DefaultBarChart.WithBars(bars).WithHorizontal().Render()
}
```
### barchart/horizontal-show-value

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the bar chart
barData := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create a bar chart with the defined data
// The chart is horizontal and displays the value of each bar
// The Render() function is called to display the chart
pterm.DefaultBarChart.WithBars(barData).WithHorizontal().WithShowValue().Render()
}
```
### barchart/mixed-values

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define a set of bars for the chart.
// Each bar has a label and a value.
bars := []pterm.Bar{
{Label: "Bar 1", Value: 2},
{Label: "Bar 2", Value: -3},
{Label: "Bar 3", Value: -2},
{Label: "Bar 4", Value: 5},
{Label: "Longer Label", Value: 7},
}
// Print a section header.
// This is useful for separating different parts of the output.
pterm.DefaultSection.Println("Chart example with mixed values (note screen space usage in case when ABSOLUTE values of negative and positive parts are differ too much)")
// Create a bar chart with the defined bars.
// The chart will display the value of each bar.
// The Render() function is called to display the chart.
pterm.DefaultBarChart.WithBars(bars).WithShowValue().Render()
// Create a horizontal bar chart with the same bars.
// The chart will display the value of each bar.
// The Render() function is called to display the chart.
pterm.DefaultBarChart.WithHorizontal().WithBars(bars).WithShowValue().Render()
}
```
### barchart/negative-values

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define a set of bars with negative values.
// Each bar is represented by a struct with a label and a value.
negativeBars := pterm.Bars{
{Label: "Bar 1", Value: -5},
{Label: "Bar 2", Value: -3},
{Label: "Longer Label", Value: -7},
}
// Print an informational message to the console.
pterm.Info.Println("Chart example with negative only values (bars use 100% of chart area)")
// Create a vertical bar chart with the defined bars.
// The WithShowValue() option is used to display the value of each bar in the chart.
// The Render() method is called to draw the chart.
_ = pterm.DefaultBarChart.WithBars(negativeBars).WithShowValue().Render()
// Create a horizontal bar chart with the same bars.
// The WithHorizontal() option is used to orient the chart horizontally.
// The WithShowValue() option and Render() method are used in the same way as before.
_ = pterm.DefaultBarChart.WithHorizontal().WithBars(negativeBars).WithShowValue().Render()
}
```
### barchart/show-value

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define a slice of bars for the bar chart. Each bar is represented by a struct
// with a Label and a Value. The Label is a string that represents the name of the bar,
// and the Value is an integer that represents the height of the bar.
bars := []pterm.Bar{
{Label: "A", Value: 10},
{Label: "B", Value: 20},
{Label: "C", Value: 30},
{Label: "D", Value: 40},
{Label: "E", Value: 50},
{Label: "F", Value: 40},
{Label: "G", Value: 30},
{Label: "H", Value: 20},
{Label: "I", Value: 10},
}
// Create a bar chart with the defined bars using the DefaultBarChart object from PTerm.
// Chain the WithBars method to set the bars of the chart.
// Chain the WithShowValue method to display the value of each bar on the chart.
// Finally, call the Render method to display the chart.
pterm.DefaultBarChart.WithBars(bars).WithShowValue().Render()
}
```
### basictext/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// The DefaultBasicText is a basic text printer provided by PTerm.
// It is used to print text without any special formatting.
pterm.DefaultBasicText.Println("Default basic text printer.")
// The DefaultBasicText can be used in any context that requires a TextPrinter.
// Here, we're using it with the LightMagenta function to color a portion of the text.
pterm.DefaultBasicText.Println("Can be used in any" + pterm.LightMagenta(" TextPrinter ") + "context.")
// The DefaultBasicText is also useful for resolving progress bars and spinners.
}
```
### bigtext/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Create a large text with the LetterStyle from the standard theme.
// This is useful for creating title screens.
pterm.DefaultBigText.WithLetters(putils.LettersFromString("PTerm")).Render()
// Create a large text with differently colored letters.
// Here, the first letter 'P' is colored cyan and the rest 'Term' is colored light magenta.
// This can be used to highlight specific parts of the text.
pterm.DefaultBigText.WithLetters(
putils.LettersFromStringWithStyle("P", pterm.FgCyan.ToStyle()),
putils.LettersFromStringWithStyle("Term", pterm.FgLightMagenta.ToStyle()),
).Render()
// Create a large text with a specific RGB color.
// This can be used when you need a specific color that is not available in the standard colors.
// Here, the color is gold (RGB: 255, 215, 0).
pterm.DefaultBigText.WithLetters(
putils.LettersFromStringWithRGB("PTerm", pterm.NewRGB(255, 215, 0)),
).Render()
}
```
### bigtext/colored

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Initialize a big text display with the letters "P" and "Term"
// "P" is displayed in cyan and "Term" is displayed in light magenta
pterm.DefaultBigText.WithLetters(
putils.LettersFromStringWithStyle("P", pterm.FgCyan.ToStyle()),
putils.LettersFromStringWithStyle("Term", pterm.FgLightMagenta.ToStyle())).
Render() // Render the big text to the terminal
}
```
### bigtext/default

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Define the text to be rendered
var text = "PTerm"
// Convert the text into a format suitable for PTerm
var letters = putils.LettersFromString(text)
// Render the text using PTerm's default big text style
pterm.DefaultBigText.WithLetters(letters).Render()
}
```
### box/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Print an informational message.
pterm.Info.Println("This might not be rendered correctly on GitHub,\nbut it will work in a real terminal.\nThis is because GitHub does not use a monospaced font by default for SVGs")
// Create three panels with text, some of them with titles.
// The panels are created using the DefaultBox style.
panel1 := pterm.DefaultBox.Sprint("Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit,\nsed do eiusmod tempor incididunt\nut labore et dolore\nmagna aliqua.")
panel2 := pterm.DefaultBox.WithTitle("title").Sprint("Ut enim ad minim veniam,\nquis nostrud exercitation\nullamco laboris\nnisi ut aliquip\nex ea commodo\nconsequat.")
panel3 := pterm.DefaultBox.WithTitle("bottom center title").WithTitleBottomCenter().Sprint("Duis aute irure\ndolor in reprehenderit\nin voluptate velit esse cillum\ndolore eu fugiat\nnulla pariatur.")
// Combine the panels into a layout using the DefaultPanel style.
// The layout is a 2D grid, with each row being an array of panels.
// In this case, the first row contains panel1 and panel2, and the second row contains only panel3.
panels, _ := pterm.DefaultPanel.WithPanels(pterm.Panels{
{{Data: panel1}, {Data: panel2}},
{{Data: panel3}},
}).Srender()
// Print the panels layout inside a box with a title.
// The box is created using the DefaultBox style, with the title positioned at the bottom right.
pterm.DefaultBox.WithTitle("Lorem Ipsum").WithTitleBottomRight().WithRightPadding(0).WithBottomPadding(0).Println(panels)
}
```
### box/custom-padding

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a default box with custom padding options and print "Hello, World!" inside it.
pterm.DefaultBox.WithRightPadding(10).WithLeftPadding(10).WithTopPadding(2).WithBottomPadding(2).Println("Hello, World!")
}
```
### box/default

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a default box with PTerm and print a message in it.
// The DefaultBox.Println method automatically starts, prints the message, and stops the box.
pterm.DefaultBox.Println("Hello, World!")
}
```
### box/title

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a default box with specified padding
paddedBox := pterm.DefaultBox.WithLeftPadding(4).WithRightPadding(4).WithTopPadding(1).WithBottomPadding(1)
// Define a title for the box
title := pterm.LightRed("I'm a box!")
// Create boxes with the title positioned differently and containing different content
box1 := paddedBox.WithTitle(title).Sprint("Hello, World!\n 1") // Title at default position (top left)
box2 := paddedBox.WithTitle(title).WithTitleTopCenter().Sprint("Hello, World!\n 2") // Title at top center
box3 := paddedBox.WithTitle(title).WithTitleTopRight().Sprint("Hello, World!\n 3") // Title at top right
box4 := paddedBox.WithTitle(title).WithTitleBottomRight().Sprint("Hello, World!\n 4") // Title at bottom right
box5 := paddedBox.WithTitle(title).WithTitleBottomCenter().Sprint("Hello, World!\n 5") // Title at bottom center
box6 := paddedBox.WithTitle(title).WithTitleBottomLeft().Sprint("Hello, World!\n 6") // Title at bottom left
box7 := paddedBox.WithTitle(title).WithTitleTopLeft().Sprint("Hello, World!\n 7") // Title at top left
// Render the boxes in a panel layout
pterm.DefaultPanel.WithPanels([][]pterm.Panel{
{{box1}, {box2}, {box3}},
{{box4}, {box5}, {box6}},
{{box7}},
}).Render()
}
```
### bulletlist/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Define a list of bullet list items with different levels.
bulletListItems := []pterm.BulletListItem{
{Level: 0, Text: "Level 0"}, // Level 0 item
{Level: 1, Text: "Level 1"}, // Level 1 item
{Level: 2, Text: "Level 2"}, // Level 2 item
}
// Use the default bullet list style to render the list items.
pterm.DefaultBulletList.WithItems(bulletListItems).Render()
// Define a string with different levels of indentation.
text := `0
1
2
3`
// Convert the indented string to a bullet list and render it.
putils.BulletListFromString(text, " ").Render()
}
```
### bulletlist/customized

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define a list of bullet list items with different styles and levels.
bulletListItems := []pterm.BulletListItem{
{
Level: 0, // Level 0 (top level)
Text: "Blue", // Text to display
TextStyle: pterm.NewStyle(pterm.FgBlue), // Text color
BulletStyle: pterm.NewStyle(pterm.FgRed), // Bullet color
},
{
Level: 1, // Level 1 (sub-item)
Text: "Green", // Text to display
TextStyle: pterm.NewStyle(pterm.FgGreen), // Text color
Bullet: "-", // Custom bullet symbol
BulletStyle: pterm.NewStyle(pterm.FgLightWhite), // Bullet color
},
{
Level: 2, // Level 2 (sub-sub-item)
Text: "Cyan", // Text to display
TextStyle: pterm.NewStyle(pterm.FgCyan), // Text color
Bullet: ">", // Custom bullet symbol
BulletStyle: pterm.NewStyle(pterm.FgYellow), // Bullet color
},
}
// Create a bullet list with the defined items and render it.
pterm.DefaultBulletList.WithItems(bulletListItems).Render()
}
```
### center/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Print a block of text centered in the terminal
pterm.DefaultCenter.Println("This text is centered!\nIt centers the whole block by default.\nIn that way you can do stuff like this:")
// Generate BigLetters and store in 's'
s, _ := pterm.DefaultBigText.WithLetters(putils.LettersFromString("PTerm")).Srender()
// Print the BigLetters 's' centered in the terminal
pterm.DefaultCenter.Println(s)
// Print each line of the text separately centered in the terminal
pterm.DefaultCenter.WithCenterEachLineSeparately().Println("This text is centered!\nBut each line is\ncentered\nseparately")
}
```
### coloring/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a table with different foreground and background colors.
pterm.DefaultTable.WithData([][]string{
{pterm.FgBlack.Sprint("Black"), pterm.FgRed.Sprint("Red"), pterm.FgGreen.Sprint("Green"), pterm.FgYellow.Sprint("Yellow")},
{"", pterm.FgLightRed.Sprint("Light Red"), pterm.FgLightGreen.Sprint("Light Green"), pterm.FgLightYellow.Sprint("Light Yellow")},
{pterm.BgBlack.Sprint("Black"), pterm.BgRed.Sprint("Red"), pterm.BgGreen.Sprint("Green"), pterm.BgYellow.Sprint("Yellow")},
{"", pterm.BgLightRed.Sprint("Light Red"), pterm.BgLightGreen.Sprint("Light Green"), pterm.BgLightYellow.Sprint("Light Yellow")},
{pterm.FgBlue.Sprint("Blue"), pterm.FgMagenta.Sprint("Magenta"), pterm.FgCyan.Sprint("Cyan"), pterm.FgWhite.Sprint("White")},
{pterm.FgLightBlue.Sprint("Light Blue"), pterm.FgLightMagenta.Sprint("Light Magenta"), pterm.FgLightCyan.Sprint("Light Cyan"), pterm.FgLightWhite.Sprint("Light White")},
{pterm.BgBlue.Sprint("Blue"), pterm.BgMagenta.Sprint("Magenta"), pterm.BgCyan.Sprint("Cyan"), pterm.BgWhite.Sprint("White")},
{pterm.BgLightBlue.Sprint("Light Blue"), pterm.BgLightMagenta.Sprint("Light Magenta"), pterm.BgLightCyan.Sprint("Light Cyan"), pterm.BgLightWhite.Sprint("Light White")},
}).Render() // Render the table.
pterm.Println()
// Print words in different colors.
pterm.Println(pterm.Red("Hello, ") + pterm.Green("World") + pterm.Cyan("!"))
pterm.Println(pterm.Red("Even " + pterm.Cyan("nested ") + pterm.Green("colors ") + "are supported!"))
pterm.Println()
// Create a new style with a red background, light green foreground, and bold text.
style := pterm.NewStyle(pterm.BgRed, pterm.FgLightGreen, pterm.Bold)
// Print text using the created style.
style.Println("This text uses a style and is bold and light green with a red background!")
}
```
### coloring/disable-output

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Loop from 0 to 14
for i := 0; i < 15; i++ {
switch i {
case 5:
// At the 5th iteration, print a message and disable the output
pterm.Info.Println("Disabled Output!")
pterm.DisableOutput()
case 10:
// At the 10th iteration, enable the output and print a message
pterm.EnableOutput()
pterm.Info.Println("Enabled Output!")
}
// Print a progress message for each iteration
pterm.Printf("Printing something... [%d/%d]\n", i, 15)
}
}
```
### coloring/fade-colors

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Print an informational message.
pterm.Info.Println("RGB colors only work in Terminals which support TrueColor.")
// Define the start and end points for the color gradient.
startColor := pterm.NewRGB(0, 255, 255) // Cyan
endColor := pterm.NewRGB(255, 0, 255) // Magenta
// Get the terminal height to determine the gradient range.
terminalHeight := pterm.GetTerminalHeight()
// Loop over the range of the terminal height to create a color gradient.
for i := 0; i < terminalHeight-2; i++ {
// Calculate the fade factor for the current step in the gradient.
fadeFactor := float32(i) / float32(terminalHeight-2)
// Create a color that represents the current step in the gradient.
currentColor := startColor.Fade(0, 1, fadeFactor, endColor)
// Print a string with the current color.
currentColor.Println("Hello, World!")
}
}
```
### coloring/fade-colors-rgb-style

SHOW SOURCE
```go
package main
import (
"strings"
"github.com/pterm/pterm"
)
func main() {
// Define RGB colors
white := pterm.NewRGB(255, 255, 255)
grey := pterm.NewRGB(128, 128, 128)
black := pterm.NewRGB(0, 0, 0)
red := pterm.NewRGB(255, 0, 0)
purple := pterm.NewRGB(255, 0, 255)
green := pterm.NewRGB(0, 255, 0)
// Define strings to be printed
str1 := "RGB colors only work in Terminals which support TrueColor."
str2 := "The background and foreground colors can be customized individually."
str3 := "Styles can also be applied. For example: Bold or Italic."
// Print first string with color fading from white to purple
printFadedString(str1, white, purple, grey, black)
// Print second string with color fading from purple to red
printFadedString(str2, black, purple, red, red)
// Print third string with color fading from white to green and style changes
printStyledString(str3, white, green, red, black)
}
// printFadedString prints a string with color fading effect
func printFadedString(str string, fgStart, fgEnd, bgStart, bgEnd pterm.RGB) {
strs := strings.Split(str, "")
var result string
for i := 0; i < len(str); i++ {
// Create a style with color fading effect
style := pterm.NewRGBStyle(fgStart.Fade(0, float32(len(str)), float32(i), fgEnd), bgStart.Fade(0, float32(len(str)), float32(i), bgEnd))
// Append styled letter to result string
result += style.Sprint(strs[i])
}
pterm.Println(result)
}
// printStyledString prints a string with color fading and style changes
func printStyledString(str string, fgStart, fgEnd, bgStart, bgEnd pterm.RGB) {
strs := strings.Split(str, "")
var result string
boldStr := strings.Split("Bold", "")
italicStr := strings.Split("Italic", "")
bold, italic := 0, 0
for i := 0; i < len(str); i++ {
// Create a style with color fading effect
style := pterm.NewRGBStyle(fgStart.Fade(0, float32(len(str)), float32(i), fgEnd), bgStart.Fade(0, float32(len(str)), float32(i), bgEnd))
// Check if the next letters are "Bold" or "Italic" and add the corresponding style
if bold < len(boldStr) && i+len(boldStr)-bold <= len(strs) && strings.Join(strs[i:i+len(boldStr)-bold], "") == strings.Join(boldStr[bold:], "") {
style = style.AddOptions(pterm.Bold)
bold++
} else if italic < len(italicStr) && i+len(italicStr)-italic < len(strs) && strings.Join(strs[i:i+len(italicStr)-italic], "") == strings.Join(italicStr[italic:], "") {
style = style.AddOptions(pterm.Italic)
italic++
}
// Append styled letter to result string
result += style.Sprint(strs[i])
}
pterm.Println(result)
}
```
### coloring/fade-multiple-colors

SHOW SOURCE
```go
package main
import (
"strings"
"github.com/pterm/pterm"
)
func main() {
// Define RGB values for gradient points.
startColor := pterm.NewRGB(0, 255, 255)
firstPoint := pterm.NewRGB(255, 0, 255)
secondPoint := pterm.NewRGB(255, 0, 0)
thirdPoint := pterm.NewRGB(0, 255, 0)
endColor := pterm.NewRGB(255, 255, 255)
// Define the string to be printed.
str := "RGB colors only work in Terminals which support TrueColor."
strs := strings.Split(str, "")
// Initialize an empty string for the faded info.
var fadeInfo string
// Loop over the string length to create a gradient effect.
for i := 0; i < len(str); i++ {
// Append each character of the string with a faded color to the info string.
fadeInfo += startColor.Fade(0, float32(len(str)), float32(i), firstPoint).Sprint(strs[i])
}
// Print the info string with gradient effect.
pterm.Info.Println(fadeInfo)
// Get the terminal height.
terminalHeight := pterm.GetTerminalHeight()
// Loop over the terminal height to print "Hello, World!" with a gradient effect.
for i := 0; i < terminalHeight-2; i++ {
// Print the string with a color that fades from startColor to endColor.
startColor.Fade(0, float32(terminalHeight-2), float32(i), firstPoint, secondPoint, thirdPoint, endColor).Println("Hello, World!")
}
}
```
### coloring/override-default-printers

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Print a default error message with PTerm's built-in Error style.
pterm.Error.Println("This is the default Error")
// Override the default error prefix with a new text and style.
pterm.Error.Prefix = pterm.Prefix{Text: "OVERRIDE", Style: pterm.NewStyle(pterm.BgCyan, pterm.FgRed)}
// Print the error message again, this time with the overridden prefix.
pterm.Error.Println("This is the default Error after the prefix was overridden")
}
```
### coloring/print-color-rgb

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a new RGB color with values 178, 44, 199.
// This color will be used for the text.
pterm.NewRGB(178, 44, 199).Println("This text is printed with a custom RGB!")
// Create a new RGB color with values 15, 199, 209.
// This color will be used for the text.
pterm.NewRGB(15, 199, 209).Println("This text is printed with a custom RGB!")
// Create a new RGB color with values 201, 144, 30.
// This color will be used for the background.
// The 'true' argument indicates that the color is for the background.
pterm.NewRGB(201, 144, 30, true).Println("This text is printed with a custom RGB background!")
}
```
### coloring/print-color-rgb-style

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define RGB colors for foreground and background.
foregroundRGB := pterm.RGB{R: 187, G: 80, B: 0}
backgroundRGB := pterm.RGB{R: 0, G: 50, B: 123}
// Create a new RGB style with the defined foreground and background colors.
rgbStyle := pterm.NewRGBStyle(foregroundRGB, backgroundRGB)
// Print a string with the custom RGB style.
rgbStyle.Println("This text is not styled.")
// Add the 'Bold' option to the RGB style and print a string with this style.
rgbStyle.AddOptions(pterm.Bold).Println("This text is bold.")
// Add the 'Italic' option to the RGB style and print a string with this style.
rgbStyle.AddOptions(pterm.Italic).Println("This text is italic.")
}
```
### demo/demo

SHOW SOURCE
```go
package main
import (
"flag"
"math/rand"
"reflect"
"strconv"
"strings"
"time"
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
// Speed the demo up, by setting this flag.
// Usefull for debugging.
// Example:
//
// go run main.go -speedup
var speedup = flag.Bool("speedup", false, "Speed up the demo")
var skipIntro = flag.Bool("skip-intro", false, "Skips the intro")
var second = time.Second
var pseudoProgramList = strings.Split("pseudo-excel pseudo-photoshop pseudo-chrome pseudo-outlook pseudo-explorer "+
"pseudo-git pseudo-vsc pseudo-intellij pseudo-minecraft pseudo-scoop pseudo-chocolatey", " ")
func main() {
setup() // Setup the demo (flags etc.)
// Show intro
if !*skipIntro {
introScreen()
clear()
}
showcase("Structured Logging", 5, func() {
logger := pterm.DefaultLogger.
WithLevel(pterm.LogLevelTrace)
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
time.Sleep(time.Second * 3)
interstingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
logger.Debug("This might be interesting", logger.ArgsFromMap(interstingStuff))
time.Sleep(time.Second * 3)
logger.Info("That was actually interesting", logger.Args("such", "wow"))
time.Sleep(time.Second * 3)
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
time.Sleep(time.Second * 3)
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
time.Sleep(time.Second * 3)
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
})
showcase("Progress bar", 2, func() {
pb, _ := pterm.DefaultProgressbar.WithTotal(len(pseudoProgramList)).WithTitle("Installing stuff").Start()
for i := 0; i < pb.Total; i++ {
pb.UpdateTitle("Installing " + pseudoProgramList[i])
if pseudoProgramList[i] == "pseudo-minecraft" {
pterm.Warning.Println("Could not install pseudo-minecraft\nThe company policy forbids games.")
} else {
pterm.Success.Println("Installing " + pseudoProgramList[i])
}
pb.Increment()
time.Sleep(second / 2)
}
pb.Stop()
})
showcase("Spinner", 2, func() {
list := pseudoProgramList[7:]
spinner, _ := pterm.DefaultSpinner.Start("Installing stuff")
for i := 0; i < len(list); i++ {
spinner.UpdateText("Installing " + list[i])
if list[i] == "pseudo-minecraft" {
pterm.Warning.Println("Could not install pseudo-minecraft\nThe company policy forbids games.")
} else {
pterm.Success.Println("Installing " + list[i])
}
time.Sleep(second)
}
spinner.Success()
})
showcase("Live Output", 2, func() {
pterm.Info.Println("You can use an Area to display changing output:")
pterm.Println()
area, _ := pterm.DefaultArea.WithCenter().Start() // Start the Area printer, with the Center option.
for i := 0; i < 10; i++ {
str, _ := pterm.DefaultBigText.WithLetters(putils.LettersFromString(time.Now().Format("15:04:05"))).Srender() // Save current time in str.
area.Update(str) // Update Area contents.
time.Sleep(time.Second)
}
area.Stop()
})
showcase("Tables", 4, func() {
for i := 0; i < 3; i++ {
pterm.Println()
}
td := [][]string{
{"Library", "Description"},
{"PTerm", "Make beautiful CLIs"},
{"Testza", "Programmer friendly test framework"},
{"Cursor", "Move the cursor around the terminal"},
}
table, _ := pterm.DefaultTable.WithHasHeader().WithData(td).Srender()
boxedTable, _ := pterm.DefaultTable.WithHasHeader().WithData(td).WithBoxed().Srender()
pterm.DefaultCenter.Println(table)
pterm.DefaultCenter.Println(boxedTable)
})
showcase("TrueColor Support", 7, func() {
from := pterm.NewRGB(0, 255, 255) // This RGB value is used as the gradients start point.
to := pterm.NewRGB(255, 0, 255) // This RGB value is used as the gradients first point.
str := "If your terminal has TrueColor support, you can use RGB colors!\nYou can even fade them :)\n\nLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
strs := strings.Split(str, "")
var fadeInfo string // String which will be used to print info.
// For loop over the range of the string length.
for i := 0; i < len(str); i++ {
// Append faded letter to info string.
fadeInfo += from.Fade(0, float32(len(str)), float32(i), to).Sprint(strs[i])
}
pterm.DefaultCenter.WithCenterEachLineSeparately().Println(fadeInfo)
})
showcase("Fully Customizable", 2, func() {
for i := 0; i < 4; i++ {
pterm.Println()
}
text := "All printers are fully customizable!"
area := pterm.DefaultArea.WithCenter()
area.Update(pterm.DefaultBox.Sprintln(text))
time.Sleep(second)
area.Update(pterm.DefaultBox.WithTopPadding(1).Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleTopLeft().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleTopCenter().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleTopRight().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleBottomRight().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleBottomCenter().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithTitle("Some title!").WithTitleBottomLeft().Sprintln(text))
time.Sleep(second / 3)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithBoxStyle(pterm.NewStyle(pterm.FgCyan)).Sprintln(text))
time.Sleep(second / 5)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithBoxStyle(pterm.NewStyle(pterm.FgRed)).Sprintln(text))
time.Sleep(second / 5)
area.Update(pterm.DefaultBox.WithTopPadding(1).WithBottomPadding(1).WithLeftPadding(1).WithRightPadding(1).WithBoxStyle(pterm.NewStyle(pterm.FgGreen)).Sprintln(text))
time.Sleep(second / 5)
area.Update(pterm.DefaultBox.WithTopPadding(1).
WithBottomPadding(1).
WithLeftPadding(1).
WithRightPadding(1).
WithHorizontalString("═").
WithVerticalString("║").
WithBottomLeftCornerString("╗").
WithBottomRightCornerString("╔").
WithTopLeftCornerString("╝").
WithTopRightCornerString("╚").
Sprintln(text))
area.Stop()
})
showcase("Themes", 2, func() {
pterm.Info.Println("You can change the color theme of PTerm easily to fit your needs!\nThis is the default one:")
time.Sleep(second / 2)
// Print every value of the default theme with its own style.
v := reflect.ValueOf(pterm.ThemeDefault)
typeOfS := v.Type()
if typeOfS == reflect.TypeOf(pterm.Theme{}) {
for i := 0; i < v.NumField(); i++ {
field, ok := v.Field(i).Interface().(pterm.Style)
if ok {
field.Println(typeOfS.Field(i).Name)
}
time.Sleep(time.Millisecond * 250)
}
}
})
showcase("And much more!", 3, func() {
for i := 0; i < 4; i++ {
pterm.Println()
}
box := pterm.DefaultBox.
WithBottomPadding(1).
WithTopPadding(1).
WithLeftPadding(3).
WithRightPadding(3).
Sprintf("Have fun exploring %s!", pterm.Cyan("PTerm"))
pterm.DefaultCenter.Println(box)
})
}
func setup() {
flag.Parse()
if *speedup {
second = time.Millisecond * 200
}
}
func introScreen() {
ptermLogo, _ := pterm.DefaultBigText.WithLetters(
putils.LettersFromStringWithStyle("P", pterm.NewStyle(pterm.FgLightCyan)),
putils.LettersFromStringWithStyle("Term", pterm.NewStyle(pterm.FgLightMagenta))).
Srender()
pterm.DefaultCenter.Print(ptermLogo)
pterm.DefaultCenter.Print(pterm.DefaultHeader.WithFullWidth().WithBackgroundStyle(pterm.NewStyle(pterm.BgLightBlue)).WithMargin(10).Sprint("PTDP - PTerm Demo Program"))
pterm.Info.Println("This animation was generated with the latest version of PTerm!" +
"\nPTerm works on nearly every terminal and operating system." +
"\nIt's super easy to use!" +
"\nIf you want, you can customize everything :)" +
"\nYou can see the code of this demo in the " + pterm.LightMagenta("./_examples/demo") + " directory." +
"\n" +
"\nThis demo was updated at: " + pterm.Green(time.Now().Format("02 Jan 2006 - 15:04:05 MST")))
pterm.Println()
introSpinner, _ := pterm.DefaultSpinner.WithShowTimer(false).WithRemoveWhenDone(true).Start("Waiting for 15 seconds...")
time.Sleep(second)
for i := 14; i > 0; i-- {
if i > 1 {
introSpinner.UpdateText("Waiting for " + strconv.Itoa(i) + " seconds...")
} else {
introSpinner.UpdateText("Waiting for " + strconv.Itoa(i) + " second...")
}
time.Sleep(second)
}
introSpinner.Stop()
}
func clear() {
print("\033[H\033[2J")
}
func showcase(title string, seconds int, content func()) {
pterm.DefaultHeader.WithBackgroundStyle(pterm.NewStyle(pterm.BgLightBlue)).WithFullWidth().Println(title)
pterm.Println()
time.Sleep(second / 2)
content()
time.Sleep(second * time.Duration(seconds))
print("\033[H\033[2J")
}
func randomInt(min, max int) int {
rand.Seed(time.Now().UnixNano())
return rand.Intn(max-min+1) + min
}
```
### header/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Print a default header.
// This uses the default settings of PTerm to print a header.
pterm.DefaultHeader.Println("This is the default header!")
// Print a spacer line for better readability.
pterm.Println()
// Print a full-width header.
// This uses the WithFullWidth() option of PTerm to print a header that spans the full width of the terminal.
pterm.DefaultHeader.WithFullWidth().Println("This is a full-width header.")
}
```
### header/custom

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Customize the DefaultHeader with a cyan background, black text, and a margin of 15.
pterm.DefaultHeader.WithMargin(15).WithBackgroundStyle(pterm.NewStyle(pterm.BgCyan)).WithTextStyle(pterm.NewStyle(pterm.FgBlack)).Println("This is a custom header!")
// Define a new HeaderPrinter with a red background, black text, and a margin of 20.
newHeader := pterm.HeaderPrinter{
TextStyle: pterm.NewStyle(pterm.FgBlack),
BackgroundStyle: pterm.NewStyle(pterm.BgRed),
Margin: 20,
}
// Print the custom header using the new HeaderPrinter.
newHeader.Println("This is a custom header!")
}
```
### heatmap/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap. Each sub-array represents a row in the heatmap.
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the labels for the X and Y axes of the heatmap.
headerData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Create a heatmap with the defined data and axis labels, and enable RGB colors.
// Then render the heatmap.
pterm.DefaultHeatmap.WithAxisData(headerData).WithData(data).WithEnableRGB().Render()
}
```
### heatmap/custom_colors

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the axis labels for the heatmap
headerData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message
pterm.Info.Println("The following table has no rgb (supported by every terminal), no axis data and a legend.")
pterm.Println()
// Create the heatmap with the defined data and options, and render it
pterm.DefaultHeatmap.
WithData(data).
WithBoxed(false).
WithAxisData(headerData).
WithLegend(false).
WithColors(pterm.BgBlue, pterm.BgRed, pterm.BgGreen, pterm.BgYellow).
WithLegend().
Render()
}
```
### heatmap/custom_legend

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the header data for the heatmap
headerData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message
pterm.Info.Println("The following table has rgb (not supported by every terminal), axis data and a custom legend.")
pterm.Println()
// Create the heatmap with the defined data and options
// Options are chained in a single line for simplicity
pterm.DefaultHeatmap.
WithData(data).
WithBoxed(false).
WithAxisData(headerData).
WithEnableRGB().
WithLegendLabel("custom").
WithLegendOnlyColoredCells().
Render() // Render the heatmap
}
```
### heatmap/custom_rgb

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap.
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the axis labels for the heatmap.
axisLabels := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message.
pterm.Info.Println("The following table has rgb (not supported by every terminal), axis data and a legend.")
pterm.Println()
// Define the color range for the heatmap.
rgbRange := []pterm.RGB{
pterm.NewRGB(0, 0, 255),
pterm.NewRGB(255, 0, 0),
pterm.NewRGB(0, 255, 0),
pterm.NewRGB(255, 255, 0),
}
// Create and render the heatmap.
pterm.DefaultHeatmap.
WithData(data).
WithBoxed(false).
WithAxisData(axisLabels).
WithEnableRGB().
WithRGBRange(rgbRange...).
Render()
}
```
### heatmap/no_grid

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define the data for the heatmap.
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the axis data for the heatmap.
axisData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message.
pterm.Info.Println("The following table has rgb (not supported by every terminal), axis data and a legend.")
pterm.Println()
// Create the heatmap with the defined data and options, then render it.
pterm.DefaultHeatmap.WithData(data).WithBoxed(false).WithAxisData(axisData).WithEnableRGB().WithLegend().WithGrid(false).Render()
}
```
### heatmap/separated

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the heatmap.
data := [][]float32{
{0.9, 0.2, -0.7, 0.4, -0.5, 0.6, -0.3, 0.8, -0.1, -1.0, 0.1, -0.8, 0.3},
{0.2, -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.9, -0.9, -0.7, -0.5, -0.3},
{0.4, 0.4, -0.3, -1.0, 0.3, -0.2, -0.9, 0.5, -0.3, -1.0, 0.6, -0.2, -0.9},
{0.9, -0.5, -0.1, 0.3, 1, -0.7, -0.3, 0.1, 0.7, -0.9, -0.5, 0.2, 0.6},
{0.5, 0.6, 0.1, -0.2, -0.7, 0.8, 0.6, 0.1, -0.5, -0.7, 0.7, 0.3, 0.0},
}
// Define the axis labels for the heatmap.
headerData := pterm.HeatmapAxis{
XAxis: []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"},
YAxis: []string{"1", "2", "3", "4", "5"},
}
// Print an informational message.
pterm.Info.Println("The following table has no rgb (supported by every terminal), no axis data and no legend.")
pterm.Println()
// Create the heatmap with the specified data and options, and render it.
pterm.DefaultHeatmap.WithData(data).WithBoxed(false).WithAxisData(headerData).WithLegend(false).Render()
}
```
### interactive_confirm/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Show an interactive confirmation dialog and get the result.
result, _ := pterm.DefaultInteractiveConfirm.Show()
// Print a blank line for better readability.
pterm.Println()
// Print the user's answer in a formatted way.
pterm.Info.Printfln("You answered: %s", boolToText(result))
}
// boolToText converts a boolean value to a colored text.
// If the value is true, it returns a green "Yes".
// If the value is false, it returns a red "No".
func boolToText(b bool) string {
if b {
return pterm.Green("Yes")
}
return pterm.Red("No")
}
```
### interactive_continue/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Create an interactive continue prompt with default settings
// This will pause the program execution until the user presses enter
// The message displayed is "Press 'Enter' to continue..."
prompt := pterm.DefaultInteractiveContinue
// Show the prompt and wait for user input
// The returned result is the user's input (should be empty as it's a continue prompt)
// The second return value is an error which is ignored here
result, _ := prompt.Show()
// Print a blank line for better readability
pterm.Println()
// Print the user's input with an info prefix
// As this is a continue prompt, the input should be empty
pterm.Info.Printfln("You answered: %s", result)
}
```
### interactive_multiselect/demo

SHOW SOURCE
```go
package main
import (
"fmt"
"github.com/pterm/pterm"
)
func main() {
// Initialize an empty slice to hold the options.
var options []string
// Populate the options slice with 100 options.
for i := 0; i < 100; i++ {
options = append(options, fmt.Sprintf("Option %d", i))
}
// Add 5 more options to the slice, indicating the availability of fuzzy searching.
for i := 0; i < 5; i++ {
options = append(options, fmt.Sprintf("You can use fuzzy searching (%d)", i))
}
// Use PTerm's interactive multiselect to present the options to the user and capture their selections.
// The Show() method displays the options and waits for user input.
selectedOptions, _ := pterm.DefaultInteractiveMultiselect.WithOptions(options).Show()
// Print the selected options, highlighted in green.
pterm.Info.Printfln("Selected options: %s", pterm.Green(selectedOptions))
}
```
### interactive_multiselect/custom-checkmarks

SHOW SOURCE
```go
package main
import (
"fmt"
"github.com/pterm/pterm"
)
func main() {
// Initialize an empty slice to hold the options
var options []string
// Populate the options slice with 5 options
for i := 0; i < 5; i++ {
options = append(options, fmt.Sprintf("Option %d", i))
}
// Create a new interactive multiselect printer with the options
// Disable the filter and define the checkmark symbols
printer := pterm.DefaultInteractiveMultiselect.
WithOptions(options).
WithFilter(false).
WithCheckmark(&pterm.Checkmark{Checked: pterm.Green("+"), Unchecked: pterm.Red("-")})
// Show the interactive multiselect and get the selected options
selectedOptions, _ := printer.Show()
// Print the selected options
pterm.Info.Printfln("Selected options: %s", pterm.Green(selectedOptions))
}
```
### interactive_multiselect/custom-keys

SHOW SOURCE
```go
package main
import (
"atomicgo.dev/keyboard/keys"
"fmt"
"github.com/pterm/pterm"
)
func main() {
// Initialize an empty slice to hold the options
var options []string
// Populate the options slice with 5 options
for i := 0; i < 5; i++ {
options = append(options, fmt.Sprintf("Option %d", i))
}
// Create a new interactive multiselect printer with the options
// Disable the filter and set the keys for confirming and selecting options
printer := pterm.DefaultInteractiveMultiselect.
WithOptions(options).
WithFilter(false).
WithKeyConfirm(keys.Enter).
WithKeySelect(keys.Space)
// Show the interactive multiselect and get the selected options
selectedOptions, _ := printer.Show()
// Print the selected options
pterm.Info.Printfln("Selected options: %s", pterm.Green(selectedOptions))
}
```
### interactive_select/demo

SHOW SOURCE
```go
package main
import (
"fmt"
"github.com/pterm/pterm"
)
func main() {
// Initialize an empty slice to hold the options
var options []string
// Generate 100 options and add them to the options slice
for i := 0; i < 100; i++ {
options = append(options, fmt.Sprintf("Option %d", i))
}
// Generate 5 additional options with a specific message and add them to the options slice
for i := 0; i < 5; i++ {
options = append(options, fmt.Sprintf("You can use fuzzy searching (%d)", i))
}
// Use PTerm's interactive select feature to present the options to the user and capture their selection
// The Show() method displays the options and waits for the user's input
selectedOption, _ := pterm.DefaultInteractiveSelect.WithOptions(options).Show()
// Display the selected option to the user with a green color for emphasis
pterm.Info.Printfln("Selected option: %s", pterm.Green(selectedOption))
}
```
### interactive_textinput/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Create an interactive text input with single line input mode and show it
result, _ := pterm.DefaultInteractiveTextInput.Show()
// Print a blank line for better readability
pterm.Println()
// Print the user's answer with an info prefix
pterm.Info.Printfln("You answered: %s", result)
}
```
### interactive_textinput/default-value

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Create an interactive text input with single line input mode and show it
result, _ := pterm.DefaultInteractiveTextInput.WithDefaultValue("Some default value").Show()
// Print a blank line for better readability
pterm.Println()
// Print the user's answer with an info prefix
pterm.Info.Printfln("You answered: %s", result)
}
```
### interactive_textinput/multi-line

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Create a default interactive text input with multi-line enabled.
// This allows the user to input multiple lines of text.
textInput := pterm.DefaultInteractiveTextInput.WithMultiLine()
// Show the text input to the user and store the result.
// The second return value (an error) is ignored with '_'.
result, _ := textInput.Show()
// Print a blank line for better readability in the output.
pterm.Println()
// Print the user's input prefixed with an informational message.
// The '%s' placeholder is replaced with the user's input.
pterm.Info.Printfln("You answered: %s", result)
}
```
### interactive_textinput/password

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create an interactive text input with a mask for password input
passwordInput := pterm.DefaultInteractiveTextInput.WithMask("*")
// Show the password input prompt and store the result
result, _ := passwordInput.Show("Enter your password")
// Get the default logger from PTerm
logger := pterm.DefaultLogger
// Log the received password (masked)
// Note: In a real-world application, you should never log passwords
logger.Info("Password received", logger.Args("password", result))
}
```
### logger/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"time"
)
func main() {
// Create a logger with trace level
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace)
// Log a trace level message
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
// Pause for 3 seconds
sleep()
// Define a map with interesting stuff
interstingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
// Log a debug level message with arguments from the map
logger.Debug("This might be interesting", logger.ArgsFromMap(interstingStuff))
// Pause for 3 seconds
sleep()
// Log an info level message
logger.Info("That was actually interesting", logger.Args("such", "wow"))
// Pause for 3 seconds
sleep()
// Log a warning level message
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
// Pause for 3 seconds
sleep()
// Log an error level message
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
// Pause for 3 seconds
sleep()
// Log an info level message with a long text that will be automatically wrapped
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
// Pause for 3 seconds
sleep()
// Log a fatal level message
logger.Fatal("Oh no, this process is getting killed!", logger.Args("fatal", true))
}
// Function to pause the execution for 3 seconds
func sleep() {
time.Sleep(time.Second * 3)
}
```
### logger/custom-key-styles

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a logger with a level of Trace or higher.
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace)
// Define a new style for the "priority" key.
priorityStyle := map[string]pterm.Style{
"priority": *pterm.NewStyle(pterm.FgRed),
}
// Overwrite all key styles with the new map.
logger = logger.WithKeyStyles(priorityStyle)
// Log an info message. The "priority" key will be displayed in red.
logger.Info("The priority key should now be red", logger.Args("priority", "low", "foo", "bar"))
// Define a new style for the "foo" key.
fooStyle := *pterm.NewStyle(pterm.FgBlue)
// Append the new style to the existing ones.
logger.AppendKeyStyle("foo", fooStyle)
// Log another info message. The "foo" key will be displayed in blue.
logger.Info("The foo key should now be blue", logger.Args("priority", "low", "foo", "bar"))
}
```
### logger/default

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"time"
)
func main() {
// Create a logger with a level of Trace or higher.
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace)
// Log a trace message with additional arguments.
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
// Create a map of interesting stuff.
interstingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
// Log a debug message with arguments from a map.
logger.Debug("This might be interesting", logger.ArgsFromMap(interstingStuff))
// Log an info message with additional arguments.
logger.Info("That was actually interesting", logger.Args("such", "wow"))
// Log a warning message with additional arguments.
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
// Log an error message with additional arguments.
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
// Log an info message with additional arguments. PTerm will automatically wrap long logs.
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
// Pause for 2 seconds.
time.Sleep(time.Second * 2)
// Log a fatal message with additional arguments. This will terminate the process.
logger.Fatal("Oh no, this process is getting killed!", logger.Args("fatal", true))
}
```
### logger/json

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a logger with Trace level and JSON formatter
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace).WithFormatter(pterm.LogFormatterJSON)
// Log a Trace level message with additional arguments
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
// Create a map of interesting stuff
interestingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
// Log a Debug level message with arguments from the map
logger.Debug("This might be interesting", logger.ArgsFromMap(interestingStuff))
// Log Info, Warn, Error, and Fatal level messages with additional arguments
logger.Info("That was actually interesting", logger.Args("such", "wow"))
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
logger.Fatal("Oh no, this process is getting killed!", logger.Args("fatal", true))
}
```
### logger/with-caller

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a logger with Trace level and caller information
logger := pterm.DefaultLogger.WithLevel(pterm.LogLevelTrace).WithCaller()
// Log a trace message with additional arguments
logger.Trace("Doing not so important stuff", logger.Args("priority", "super low"))
// Create a map of interesting stuff
interestingStuff := map[string]any{
"when were crayons invented": "1903",
"what is the meaning of life": 42,
"is this interesting": true,
}
// Log a debug message with arguments from a map
logger.Debug("This might be interesting", logger.ArgsFromMap(interestingStuff))
// Log an info message with additional arguments
logger.Info("That was actually interesting", logger.Args("such", "wow"))
// Log a warning message with additional arguments
logger.Warn("Oh no, I see an error coming to us!", logger.Args("speed", 88, "measures", "mph"))
// Log an error message with additional arguments
logger.Error("Damn, here it is!", logger.Args("error", "something went wrong"))
// Log an info message with additional arguments. PTerm will automatically wrap long logs.
logger.Info("But what's really cool is, that you can print very long logs, and PTerm will automatically wrap them for you! Say goodbye to text, that has weird line breaks!", logger.Args("very", "long"))
// Log a fatal message with additional arguments. This will terminate the process.
logger.Fatal("Oh no, this process is getting killed!", logger.Args("fatal", true))
}
```
### multiple-live-printers/demo

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Create a multi printer for managing multiple printers
multi := pterm.DefaultMultiPrinter
// Create two spinners with their own writers
spinner1, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 1")
spinner2, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 2")
// Create five progress bars with their own writers and a total of 100
pb1, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 1")
pb2, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 2")
pb3, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 3")
pb4, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 4")
pb5, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 5")
// Start the multi printer
multi.Start()
// Increment progress bars and spinners based on certain conditions
for i := 1; i <= 100; i++ {
pb1.Increment() // Increment progress bar 1 every iteration
if i%2 == 0 {
pb2.Add(3) // Add 3 to progress bar 2 every even iteration
}
if i%5 == 0 {
pb3.Increment() // Increment progress bar 3 every 5th iteration
}
if i%10 == 0 {
pb4.Increment() // Increment progress bar 4 every 10th iteration
}
if i%3 == 0 {
pb5.Increment() // Increment progress bar 5 every 3rd iteration
}
if i%50 == 0 {
spinner1.Success("Spinner 1 is done!") // Mark spinner 1 as successful every 50th iteration
}
if i%60 == 0 {
spinner2.Fail("Spinner 2 failed!") // Mark spinner 2 as failed every 60th iteration
}
time.Sleep(time.Millisecond * 50) // Sleep for 50 milliseconds between each iteration
}
// Stop the multi printer
multi.Stop()
}
```
### panel/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define panels in a 2D grid system
panels := pterm.Panels{
{
{Data: "This is the first panel"},
{Data: pterm.DefaultHeader.Sprint("Hello, World!")},
{Data: "This\npanel\ncontains\nmultiple\nlines"},
},
{
{Data: pterm.Red("This is another\npanel line")},
{Data: "This is the second panel\nwith a new line"},
},
}
// Render the panels with a padding of 5
_ = pterm.DefaultPanel.WithPanels(panels).WithPadding(5).Render()
}
```
### paragraph/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Using the default paragraph printer to print a long text.
// The text is split at the spaces, which is useful for continuous text of all kinds.
// The line width can be manually adjusted if needed.
pterm.DefaultParagraph.Println("This is the default paragraph printer. As you can see, no words are separated, " +
"but the text is split at the spaces. This is useful for continuous text of all kinds. You can manually change the line width if you want to." +
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam")
// Printing a line space for separation.
pterm.Println()
// Printing a long text without using the paragraph printer.
// The default Println() function is used here, which does not provide intelligent splitting.
pterm.Println("This text is written with the default Println() function. No intelligent splitting here." +
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam")
}
```
### paragraph/customized

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define a long text to be printed as a paragraph.
longText := "This is a custom paragraph printer. As you can see, no words are separated, " +
"but the text is split at the spaces. This is useful for continuous text of all kinds. You can manually change the line width if you want to." +
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam"
// Print the long text as a paragraph with a custom maximal width of 60 characters.
pterm.DefaultParagraph.WithMaxWidth(60).Println(longText)
// Print a line space to separate the paragraph from the following text.
pterm.Println()
// Define another long text to be printed without a paragraph printer.
longTextWithoutParagraph := "This text is written with the default Println() function. No intelligent splitting here." +
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam"
// Print the long text without using a paragraph printer.
pterm.Println(longTextWithoutParagraph)
}
```
### prefix/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Enable debug messages in PTerm.
pterm.EnableDebugMessages()
// Print a debug message with PTerm.
pterm.Debug.Println("Hello, World!")
// Print an informational message with PTerm.
pterm.Info.Println("Hello, World!")
// Print a success message with PTerm.
pterm.Success.Println("Hello, World!")
// Print a warning message with PTerm.
pterm.Warning.Println("Hello, World!")
// Print an error message with PTerm. This will also display the filename and line number in the terminal.
pterm.Error.Println("Errors show the filename and linenumber inside the terminal!")
// Print an informational message with PTerm, with line number.
// This demonstrates that other PrefixPrinters can also display line numbers.
pterm.Info.WithShowLineNumber().Println("Other PrefixPrinters can do that too!")
// Temporarily set Fatal to false, so that the CI won't crash.
// This will print a fatal message with PTerm, but won't terminate the program.
pterm.Fatal.WithFatal(false).Println("Hello, World!")
}
```
### progressbar/demo

SHOW SOURCE
```go
package main
import (
"strings"
"time"
"github.com/pterm/pterm"
)
// Slice of strings representing names of pseudo applications to be downloaded.
var fakeInstallList = strings.Split("pseudo-excel pseudo-photoshop pseudo-chrome pseudo-outlook pseudo-explorer "+
"pseudo-dops pseudo-git pseudo-vsc pseudo-intellij pseudo-minecraft pseudo-scoop pseudo-chocolatey", " ")
func main() {
// Create a progressbar with the total steps equal to the number of items in fakeInstallList.
// Set the initial title of the progressbar to "Downloading stuff".
p, _ := pterm.DefaultProgressbar.WithTotal(len(fakeInstallList)).WithTitle("Downloading stuff").Start()
// Loop over each item in the fakeInstallList.
for i := 0; i < p.Total; i++ {
// Simulate a slow download for the 7th item.
if i == 6 {
time.Sleep(time.Second * 3)
}
// Update the title of the progressbar with the current item being downloaded.
p.UpdateTitle("Downloading " + fakeInstallList[i])
// Print a success message for the current download. This will be printed above the progressbar.
pterm.Success.Println("Downloading " + fakeInstallList[i])
// Increment the progressbar by one to indicate progress.
p.Increment()
// Pause for 350 milliseconds to simulate the time taken for each download.
time.Sleep(time.Millisecond * 350)
}
}
```
### progressbar/multiple

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Create a multi printer instance from the default one
multi := pterm.DefaultMultiPrinter
// Create five progress bars with a total of 100 units each, and assign each a new writer from the multi printer
pb1, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 1")
pb2, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 2")
pb3, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 3")
pb4, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 4")
pb5, _ := pterm.DefaultProgressbar.WithTotal(100).WithWriter(multi.NewWriter()).Start("Progressbar 5")
// Start the multi printer
multi.Start()
// Loop to increment progress bars based on certain conditions
for i := 1; i <= 100; i++ {
pb1.Increment() // Increment the first progress bar at each iteration
if i%2 == 0 {
pb2.Add(3) // Add 3 units to the second progress bar at every even iteration
}
if i%5 == 0 {
pb3.Increment() // Increment the third progress bar at every fifth iteration
}
if i%10 == 0 {
pb4.Increment() // Increment the fourth progress bar at every tenth iteration
}
if i%3 == 0 {
pb5.Increment() // Increment the fifth progress bar at every third iteration
}
time.Sleep(time.Millisecond * 50) // Pause for 50 milliseconds at each iteration
}
// Stop the multi printer
multi.Stop()
}
```
### section/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Create a section with level one and print it.
pterm.DefaultSection.Println("This is a section!")
// Print an informational message.
pterm.Info.Println("And here is some text.\nThis text could be anything.\nBasically it's just a placeholder")
// Create a section with level two and print it.
pterm.DefaultSection.WithLevel(2).Println("This is another section!")
// Print another informational message.
pterm.Info.Println("And this is\nmore placeholder text")
}
```
### slog/demo

SHOW SOURCE
```go
package main
import (
"log/slog"
"github.com/pterm/pterm"
)
func main() {
// Create a new slog handler with the default PTerm logger
handler := pterm.NewSlogHandler(&pterm.DefaultLogger)
// Create a new slog logger with the handler
logger := slog.New(handler)
// Log a debug message (won't show by default)
logger.Debug("This is a debug message that won't show")
// Change the log level to debug to enable debug messages
pterm.DefaultLogger.Level = pterm.LogLevelDebug
// Log a debug message (will show because debug level is enabled)
logger.Debug("This is a debug message", "changedLevel", true)
// Log an info message
logger.Info("This is an info message")
// Log a warning message
logger.Warn("This is a warning message")
// Log an error message
logger.Error("This is an error message")
}
```
### spinner/demo

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Create and start a fork of the default spinner.
spinnerInfo, _ := pterm.DefaultSpinner.Start("Some informational action...")
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerInfo.Info() // Resolve spinner with error message.
// Create and start a fork of the default spinner.
spinnerSuccess, _ := pterm.DefaultSpinner.Start("Doing something important... (will succeed)")
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerSuccess.Success() // Resolve spinner with success message.
// Create and start a fork of the default spinner.
spinnerWarning, _ := pterm.DefaultSpinner.Start("Doing something important... (will warn)")
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerWarning.Warning() // Resolve spinner with warning message.
// Create and start a fork of the default spinner.
spinnerFail, _ := pterm.DefaultSpinner.Start("Doing something important... (will fail)")
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerFail.Fail() // Resolve spinner with error message.
// Create and start a fork of the default spinner.
spinnerNochange, _ := pterm.DefaultSpinner.Start("Checking something important... (will result in no change)")
// Replace the InfoPrinter with a custom "NOCHG" one
spinnerNochange.InfoPrinter = &pterm.PrefixPrinter{
MessageStyle: &pterm.Style{pterm.FgLightBlue},
Prefix: pterm.Prefix{
Style: &pterm.Style{pterm.FgBlack, pterm.BgLightBlue},
Text: " NOCHG ",
},
}
time.Sleep(time.Second * 2) // Simulate 3 seconds of processing something.
spinnerNochange.Info("No change were required") // Resolve spinner with error message.
// Create and start a fork of the default spinner.
spinnerLiveText, _ := pterm.DefaultSpinner.Start("Doing a lot of stuff...")
time.Sleep(time.Second) // Simulate 2 seconds of processing something.
spinnerLiveText.UpdateText("It's really much") // Update spinner text.
time.Sleep(time.Second) // Simulate 2 seconds of processing something.
spinnerLiveText.UpdateText("We're nearly done!") // Update spinner text.
time.Sleep(time.Second) // Simulate 2 seconds of processing something.
spinnerLiveText.Success("Finally!") // Resolve spinner with success message.
}
```
### spinner/multiple

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Create a multi printer. This allows multiple spinners to print simultaneously.
multi := pterm.DefaultMultiPrinter
// Create and start spinner 1 with a new writer from the multi printer.
// The spinner will display the message "Spinner 1".
spinner1, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 1")
// Create and start spinner 2 with a new writer from the multi printer.
// The spinner will display the message "Spinner 2".
spinner2, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 2")
// Create and start spinner 3 with a new writer from the multi printer.
// The spinner will display the message "Spinner 3".
spinner3, _ := pterm.DefaultSpinner.WithWriter(multi.NewWriter()).Start("Spinner 3")
// Start the multi printer. This will start printing all the spinners.
multi.Start()
// Wait for 1 second.
time.Sleep(time.Millisecond * 1000)
// Stop spinner 1 with a success message.
spinner1.Success("Spinner 1 is done!")
// Wait for 750 milliseconds.
time.Sleep(time.Millisecond * 750)
// Stop spinner 2 with a failure message.
spinner2.Fail("Spinner 2 failed!")
// Wait for 500 milliseconds.
time.Sleep(time.Millisecond * 500)
// Stop spinner 3 with a warning message.
spinner3.Warning("Spinner 3 has a warning!")
// Stop the multi printer. This will stop printing all the spinners.
multi.Stop()
}
```
### style/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define a primary style with light cyan foreground, gray background, and bold text
primary := pterm.NewStyle(pterm.FgLightCyan, pterm.BgGray, pterm.Bold)
// Define a secondary style with light green foreground, white background, and italic text
secondary := pterm.NewStyle(pterm.FgLightGreen, pterm.BgWhite, pterm.Italic)
// Print "Hello, World!" with the primary style
primary.Println("Hello, World!")
// Print "Hello, World!" with the secondary style
secondary.Println("Hello, World!")
}
```
### table/demo

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the first table
tableData1 := pterm.TableData{
{"Firstname", "Lastname", "Email", "Note"},
{"Paul", "Dean", "augue@velitAliquam.co.uk", ""},
{"Callie", "Mckay", "nunc.sed@est.com", "这是一个测试, haha!"},
{"Libby", "Camacho", "lobortis@semper.com", "just a test, hey!"},
{"张", "小宝", "zhang@example.com", ""},
}
// Create a table with a header and the defined data, then render it
pterm.DefaultTable.WithHasHeader().WithData(tableData1).Render()
pterm.Println() // Blank line
// Define the data for the second table
tableData2 := pterm.TableData{
{"Firstname", "Lastname", "Email"},
{"Paul\n\nNewline", "Dean", "augue@velitAliquam.co.uk"},
{"Callie", "Mckay", "nunc.sed@est.com\nNewline"},
{"Libby", "Camacho", "lobortis@semper.com"},
{"张", "小宝", "zhang@example.com"},
}
// Create another table with a header and the defined data, then render it
pterm.DefaultTable.WithHasHeader().WithData(tableData2).Render()
}
```
### table/boxed

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the table.
// Each inner slice represents a row in the table.
// The first row is considered as the header of the table.
tableData := pterm.TableData{
{"Firstname", "Lastname", "Email", "Note"},
{"Paul", "Dean", "augue@velitAliquam.co.uk", ""},
{"Callie", "Mckay", "nunc.sed@est.com", "这是一个测试, haha!"},
{"Libby", "Camacho", "lobortis@semper.com", "just a test, hey!"},
{"张", "小宝", "zhang@example.com", ""},
}
// Create a table with the defined data.
// The table has a header and is boxed.
// Finally, render the table to print it.
pterm.DefaultTable.WithHasHeader().WithBoxed().WithData(tableData).Render()
}
```
### table/multiple-lines

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the table.
data := pterm.TableData{
{"Firstname", "Lastname", "Email"},
{"Paul\n\nNewline", "Dean", "augue@velitAliquam.co.uk"},
{"Callie", "Mckay", "nunc.sed@est.com\nNewline"},
{"Libby", "Camacho", "lobortis@semper.com"},
{"张", "小宝", "zhang@example.com"},
}
// Create and render the table.
// The options are chained in a single line for simplicity.
// The table has a header, a row separator, and a header row separator.
pterm.DefaultTable.WithHasHeader().WithRowSeparator("-").WithHeaderRowSeparator("-").WithData(data).Render()
}
```
### table/right-alignment

SHOW SOURCE
```go
package main
import "github.com/pterm/pterm"
func main() {
// Define the data for the table.
// Each inner slice represents a row in the table.
// The first row is considered as the header.
tableData := pterm.TableData{
{"Firstname", "Lastname", "Email", "Note"},
{"Paul", "Dean", "augue@velitAliquam.co.uk", ""},
{"Callie", "Mckay", "nunc.sed@est.com", "这是一个测试, haha!"},
{"Libby", "Camacho", "lobortis@semper.com", "just a test, hey!"},
{"张", "小宝", "zhang@example.com", ""},
}
// Create a table with the defined data.
// The table has a header and the text in the cells is right-aligned.
// The Render() method is used to print the table to the console.
pterm.DefaultTable.WithHasHeader().WithRightAlignment().WithData(tableData).Render()
}
```
### theme/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"reflect"
"time"
)
func main() {
// Print an informational message about the default theme styles.
pterm.Info.Println("These are the default theme styles.\nYou can modify them easily to your personal preference,\nor create new themes from scratch :)")
// Print a blank line for better readability.
pterm.Println()
// Get the value and type of the default theme.
v := reflect.ValueOf(pterm.ThemeDefault)
typeOfS := v.Type()
// Check if the type of the default theme is 'pterm.Theme'.
if typeOfS == reflect.TypeOf(pterm.Theme{}) {
// Iterate over each field in the default theme.
for i := 0; i < v.NumField(); i++ {
// Try to convert the field to 'pterm.Style'.
field, ok := v.Field(i).Interface().(pterm.Style)
if ok {
// Print the field name using its own style.
field.Println(typeOfS.Field(i).Name)
}
// Pause for a quarter of a second to make the output easier to read.
time.Sleep(time.Millisecond * 250)
}
}
}
```
### tree/demo

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
)
func main() {
// Define a tree structure using pterm.TreeNode
tree := pterm.TreeNode{
// The top node of the tree
Text: "Top node",
// The children of the top node
Children: []pterm.TreeNode{{
// A child node
Text: "Child node",
// The children of the child node
Children: []pterm.TreeNode{
// Grandchildren nodes
{Text: "Grandchild node"},
{Text: "Grandchild node"},
{Text: "Grandchild node"},
},
}},
}
// Render the tree with the defined structure as the root
pterm.DefaultTree.WithRoot(tree).Render()
}
```
### tree/from-leveled-list

SHOW SOURCE
```go
package main
import (
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Define a leveled list to represent the structure of the directories.
leveledList := pterm.LeveledList{
{Level: 0, Text: "C:"},
{Level: 1, Text: "Users"},
{Level: 1, Text: "Windows"},
{Level: 1, Text: "Programs"},
{Level: 1, Text: "Programs(x86)"},
{Level: 1, Text: "dev"},
{Level: 0, Text: "D:"},
{Level: 0, Text: "E:"},
{Level: 1, Text: "Movies"},
{Level: 1, Text: "Music"},
{Level: 2, Text: "LinkinPark"},
{Level: 1, Text: "Games"},
{Level: 2, Text: "Shooter"},
{Level: 3, Text: "CallOfDuty"},
{Level: 3, Text: "CS:GO"},
{Level: 3, Text: "Battlefield"},
{Level: 4, Text: "Battlefield 1"},
{Level: 4, Text: "Battlefield 2"},
{Level: 0, Text: "F:"},
{Level: 1, Text: "dev"},
{Level: 2, Text: "dops"},
{Level: 2, Text: "PTerm"},
}
// Convert the leveled list into a tree structure.
root := putils.TreeFromLeveledList(leveledList)
root.Text = "Computer" // Set the root node text.
// Render the tree structure using the default tree printer.
pterm.DefaultTree.WithRoot(root).Render()
}
```
golang-github-pterm-pterm-0.12.79/_examples/area/ 0000775 0000000 0000000 00000000000 14650106263 0021563 5 ustar 00root root 0000000 0000000 golang-github-pterm-pterm-0.12.79/_examples/area/README.md 0000664 0000000 0000000 00000014744 14650106263 0023054 0 ustar 00root root 0000000 0000000 ### area/demo

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
)
func main() {
// Print an informational message using PTerm's Info printer.
// This message will stay in place while the area updates.
pterm.Info.Println("The previous text will stay in place, while the area updates.")
// Print two new lines as spacer.
pterm.Print("\n\n")
// Start the Area printer from PTerm's DefaultArea, with the Center option.
// The Area printer allows us to update a specific area of the console output.
// The returned 'area' object is used to control the area updates.
area, _ := pterm.DefaultArea.WithCenter().Start()
// Loop 10 times to update the area with the current time.
for i := 0; i < 10; i++ {
// Get the current time, format it as "15:04:05" (hour:minute:second), and convert it to a string.
// Then, create a BigText from the time string using PTerm's DefaultBigText and putils NewLettersFromString.
// The Srender() function is used to save the BigText as a string.
str, _ := pterm.DefaultBigText.WithLetters(putils.LettersFromString(time.Now().Format("15:04:05"))).Srender()
// Update the Area contents with the current time string.
area.Update(str)
// Sleep for a second before the next update.
time.Sleep(time.Second)
}
// Stop the Area printer after all updates are done.
area.Stop()
}
```
### area/center

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new default area in the center of the terminal.
// The Start() function returns the created area and an error.
area, _ := pterm.DefaultArea.WithCenter().Start()
// Loop 5 times to simulate a dynamic update.
for i := 0; i < 5; i++ {
// Update the content of the area with the current count.
// The Sprintf function is used to format the string.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second to simulate a time-consuming task.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
area.Stop()
}
```
### area/default

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new default area and get a reference to it.
// The second return value is an error which is ignored here.
area, _ := pterm.DefaultArea.Start()
// Loop 5 times
for i := 0; i < 5; i++ {
// Update the content of the area dynamically.
// Here we're just displaying the current count.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second before the next update.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
// This will clean up and free resources used by the area.
area.Stop()
}
```
### area/dynamic-chart

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new fullscreen centered area.
// This area will be used to display the bar chart.
area, _ := pterm.DefaultArea.WithFullscreen().WithCenter().Start()
// Ensure the area stops updating when we're done.
defer area.Stop()
// Loop to update the bar chart 10 times.
for i := 0; i < 10; i++ {
// Create a new bar chart with dynamic bars.
// The bars will change based on the current iteration.
barchart := pterm.DefaultBarChart.WithBars(dynamicBars(i))
// Render the bar chart to a string.
// This string will be used to update the area.
content, _ := barchart.Srender()
// Update the area with the new bar chart.
area.Update(content)
// Wait for half a second before the next update.
time.Sleep(500 * time.Millisecond)
}
}
// dynamicBars generates a set of bars for the bar chart.
// The bars will change based on the current iteration.
func dynamicBars(i int) pterm.Bars {
return pterm.Bars{
{Label: "A", Value: 10}, // A static bar.
{Label: "B", Value: 20 * i}, // A bar that grows with each iteration.
{Label: "C", Value: 30}, // Another static bar.
{Label: "D", Value: 40 + i}, // A bar that grows slowly with each iteration.
}
}
```
### area/fullscreen

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new fullscreen area. This will return an area instance and an error.
// The underscore (_) is used to ignore the error.
area, _ := pterm.DefaultArea.WithFullscreen().Start()
// Loop 5 times to update the area content.
for i := 0; i < 5; i++ {
// Update the content of the area with the current count.
// The Sprintf function is used to format the string.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second before the next update.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
area.Stop()
}
```
### area/fullscreen-center

SHOW SOURCE
```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Initialize a new PTerm area with fullscreen and center options
// The Start() function returns the created area and an error (ignored here)
area, _ := pterm.DefaultArea.WithFullscreen().WithCenter().Start()
// Loop 5 times to demonstrate dynamic content update
for i := 0; i < 5; i++ {
// Update the content of the area with the current count
// The Sprintf function is used to format the string with the count
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second
time.Sleep(time.Second)
}
// Stop the area after all updates are done
// This will clear the area and return the terminal to its normal state
area.Stop()
}
```
golang-github-pterm-pterm-0.12.79/_examples/area/center/ 0000775 0000000 0000000 00000000000 14650106263 0023043 5 ustar 00root root 0000000 0000000 golang-github-pterm-pterm-0.12.79/_examples/area/center/README.md 0000664 0000000 0000000 00000001350 14650106263 0024321 0 ustar 00root root 0000000 0000000 # area/center

```go
package main
import (
"time"
"github.com/pterm/pterm"
)
func main() {
// Start a new default area in the center of the terminal.
// The Start() function returns the created area and an error.
area, _ := pterm.DefaultArea.WithCenter().Start()
// Loop 5 times to simulate a dynamic update.
for i := 0; i < 5; i++ {
// Update the content of the area with the current count.
// The Sprintf function is used to format the string.
area.Update(pterm.Sprintf("Current count: %d\nAreas can update their content dynamically!", i))
// Pause for a second to simulate a time-consuming task.
time.Sleep(time.Second)
}
// Stop the area after all updates are done.
area.Stop()
}
```
golang-github-pterm-pterm-0.12.79/_examples/area/center/animation.svg 0000664 0000000 0000000 00000012652 14650106263 0025551 0 ustar 00root root 0000000 0000000