pax_global_header 0000666 0000000 0000000 00000000064 15062612743 0014520 g ustar 00root root 0000000 0000000 52 comment=9edf69c677c7353eca5fae6d3ea3986af39717b7 charmbracelet-bubbletea-143649d/ 0000775 0000000 0000000 00000000000 15062612743 0016517 5 ustar 00root root 0000000 0000000 charmbracelet-bubbletea-143649d/.gitattributes 0000664 0000000 0000000 00000000017 15062612743 0021410 0 ustar 00root root 0000000 0000000 *.golden -text charmbracelet-bubbletea-143649d/.github/ 0000775 0000000 0000000 00000000000 15062612743 0020057 5 ustar 00root root 0000000 0000000 charmbracelet-bubbletea-143649d/.github/CODEOWNERS 0000664 0000000 0000000 00000000036 15062612743 0021451 0 ustar 00root root 0000000 0000000 * @meowgorithm @aymanbagabas charmbracelet-bubbletea-143649d/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 15062612743 0022242 5 ustar 00root root 0000000 0000000 charmbracelet-bubbletea-143649d/.github/ISSUE_TEMPLATE/bug.yml 0000664 0000000 0000000 00000003251 15062612743 0023543 0 ustar 00root root 0000000 0000000 name: Bug Report description: File a bug report labels: [bug] body: - type: markdown attributes: value: | Thanks for taking the time to fill out this bug report! Please fill the form below. - type: textarea id: what-happened attributes: label: What happened? description: Also tell us, what did you expect to happen? validations: required: true - type: textarea id: reproducible attributes: label: How can we reproduce this? description: | Please share a code snippet, gist, or public repository that reproduces the issue. Make sure to make the reproducible as concise as possible, with only the minimum required code to reproduce the issue. validations: required: true - type: textarea id: version attributes: label: Which version of bubbletea are you using? description: '' render: bash validations: required: true - type: textarea id: terminaal attributes: label: Which terminals did you reproduce this with? description: | Other helpful information: was it over SSH? On tmux? Which version of said terminal? validations: required: true - type: checkboxes id: search attributes: label: Search options: - label: | I searched for other open and closed issues and pull requests before opening this, and didn't find anything that seems related. required: true - type: textarea id: ctx attributes: label: Additional context description: Anything else you would like to add validations: required: false charmbracelet-bubbletea-143649d/.github/ISSUE_TEMPLATE/bug_report.md 0000664 0000000 0000000 00000001474 15062612743 0024742 0 ustar 00root root 0000000 0000000 --- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **Setup** Please complete the following information along with version numbers, if applicable. - OS [e.g. Ubuntu, macOS] - Shell [e.g. zsh, fish] - Terminal Emulator [e.g. kitty, iterm] - Terminal Multiplexer [e.g. tmux] **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Source Code** Please include source code if needed to reproduce the behavior. **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** Add screenshots to help explain your problem. **Additional context** Add any other context about the problem here. charmbracelet-bubbletea-143649d/.github/ISSUE_TEMPLATE/config.yml 0000664 0000000 0000000 00000000170 15062612743 0024230 0 ustar 00root root 0000000 0000000 blank_issues_enabled: true contact_links: - name: Discord url: https://charm.sh/discord about: Chat on our Discord. charmbracelet-bubbletea-143649d/.github/ISSUE_TEMPLATE/feature_request.md 0000664 0000000 0000000 00000001134 15062612743 0025766 0 ustar 00root root 0000000 0000000 --- name: Feature request about: Suggest an idea for this project title: '' labels: enhancement assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. charmbracelet-bubbletea-143649d/.github/dependabot.yml 0000664 0000000 0000000 00000003171 15062612743 0022711 0 ustar 00root root 0000000 0000000 version: 2 updates: - package-ecosystem: "gomod" directory: "/" schedule: interval: "weekly" day: "monday" time: "05:00" timezone: "America/New_York" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" groups: all: patterns: - "*" - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" day: "monday" time: "05:00" timezone: "America/New_York" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" groups: all: patterns: - "*" - package-ecosystem: "docker" directory: "/" schedule: interval: "weekly" day: "monday" time: "05:00" timezone: "America/New_York" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" groups: all: patterns: - "*" - package-ecosystem: "gomod" directory: "/examples" schedule: interval: "weekly" day: "monday" time: "05:00" timezone: "America/New_York" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" groups: all: patterns: - "*" - package-ecosystem: "gomod" directory: "/tutorials" schedule: interval: "weekly" day: "monday" time: "05:00" timezone: "America/New_York" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" groups: all: patterns: - "*" charmbracelet-bubbletea-143649d/.github/workflows/ 0000775 0000000 0000000 00000000000 15062612743 0022114 5 ustar 00root root 0000000 0000000 charmbracelet-bubbletea-143649d/.github/workflows/build.yml 0000664 0000000 0000000 00000000676 15062612743 0023747 0 ustar 00root root 0000000 0000000 name: build on: [push, pull_request] jobs: build: uses: charmbracelet/meta/.github/workflows/build.yml@main build-go-mod: uses: charmbracelet/meta/.github/workflows/build.yml@main with: go-version: "" go-version-file: ./go.mod build-examples: uses: charmbracelet/meta/.github/workflows/build.yml@main with: go-version: "" go-version-file: ./examples/go.mod working-directory: ./examples charmbracelet-bubbletea-143649d/.github/workflows/coverage.yml 0000664 0000000 0000000 00000001203 15062612743 0024426 0 ustar 00root root 0000000 0000000 name: coverage on: [push, pull_request] jobs: coverage: strategy: matrix: go-version: [^1] os: [ubuntu-latest] runs-on: ${{ matrix.os }} env: GO111MODULE: "on" steps: - name: Install Go uses: actions/setup-go@v6 with: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v5 - name: Coverage run: | go test -race -covermode=atomic -coverprofile=coverage.txt ./... - uses: codecov/codecov-action@v5 with: file: ./coverage.txt token: ${{ secrets.CODECOV_TOKEN }} charmbracelet-bubbletea-143649d/.github/workflows/dependabot-sync.yml 0000664 0000000 0000000 00000000643 15062612743 0025721 0 ustar 00root root 0000000 0000000 name: dependabot-sync on: schedule: - cron: "0 0 * * 0" # every Sunday at midnight workflow_dispatch: # allows manual triggering permissions: contents: write pull-requests: write jobs: dependabot-sync: uses: charmbracelet/meta/.github/workflows/dependabot-sync.yml@main with: repo_name: ${{ github.event.repository.name }} secrets: gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} charmbracelet-bubbletea-143649d/.github/workflows/examples.yml 0000664 0000000 0000000 00000001561 15062612743 0024460 0 ustar 00root root 0000000 0000000 name: examples on: push: branches: - 'master' paths: - '.github/workflows/examples.yml' - './examples/go.mod' - './examples/go.sum' - './tutorials/go.mod' - './tutorials/go.sum' - './go.mod' - './go.sum' workflow_dispatch: {} jobs: tidy: permissions: contents: write runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: go-version: '^1' cache: true - shell: bash run: | (cd ./examples && go mod tidy) (cd ./tutorials && go mod tidy) - uses: stefanzweifel/git-auto-commit-action@v6 with: commit_message: "chore: go mod tidy tutorials and examples" branch: master commit_user_name: actions-user commit_user_email: actions@github.com charmbracelet-bubbletea-143649d/.github/workflows/lint-sync.yml 0000664 0000000 0000000 00000000417 15062612743 0024561 0 ustar 00root root 0000000 0000000 name: lint-sync on: schedule: # every Sunday at midnight - cron: "0 0 * * 0" workflow_dispatch: # allows manual triggering permissions: contents: write pull-requests: write jobs: lint: uses: charmbracelet/meta/.github/workflows/lint-sync.yml@main charmbracelet-bubbletea-143649d/.github/workflows/lint.yml 0000664 0000000 0000000 00000000163 15062612743 0023605 0 ustar 00root root 0000000 0000000 name: lint on: push: pull_request: jobs: lint: uses: charmbracelet/meta/.github/workflows/lint.yml@main charmbracelet-bubbletea-143649d/.github/workflows/release.yml 0000664 0000000 0000000 00000002122 15062612743 0024254 0 ustar 00root root 0000000 0000000 name: goreleaser on: push: tags: - v*.*.* concurrency: group: goreleaser cancel-in-progress: true jobs: goreleaser: uses: charmbracelet/meta/.github/workflows/goreleaser.yml@main secrets: docker_username: ${{ secrets.DOCKERHUB_USERNAME }} docker_token: ${{ secrets.DOCKERHUB_TOKEN }} gh_pat: ${{ secrets.PERSONAL_ACCESS_TOKEN }} goreleaser_key: ${{ secrets.GORELEASER_KEY }} twitter_consumer_key: ${{ secrets.TWITTER_CONSUMER_KEY }} twitter_consumer_secret: ${{ secrets.TWITTER_CONSUMER_SECRET }} twitter_access_token: ${{ secrets.TWITTER_ACCESS_TOKEN }} twitter_access_token_secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} mastodon_client_id: ${{ secrets.MASTODON_CLIENT_ID }} mastodon_client_secret: ${{ secrets.MASTODON_CLIENT_SECRET }} mastodon_access_token: ${{ secrets.MASTODON_ACCESS_TOKEN }} discord_webhook_id: ${{ secrets.DISCORD_WEBHOOK_ID }} discord_webhook_token: ${{ secrets.DISCORD_WEBHOOK_TOKEN }} # yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json charmbracelet-bubbletea-143649d/.gitignore 0000664 0000000 0000000 00000001015 15062612743 0020504 0 ustar 00root root 0000000 0000000 .DS_Store .envrc examples/fullscreen/fullscreen examples/help/help examples/http/http examples/list-default/list-default examples/list-fancy/list-fancy examples/list-simple/list-simple examples/mouse/mouse examples/pager/pager examples/progress-download/color_vortex.blend examples/progress-download/progress-download examples/simple/simple examples/spinner/spinner examples/textinput/textinput examples/textinputs/textinputs examples/views/views tutorials/basics/basics tutorials/commands/commands .idea coverage.txt dist/ charmbracelet-bubbletea-143649d/.golangci.yml 0000664 0000000 0000000 00000001267 15062612743 0021111 0 ustar 00root root 0000000 0000000 version: "2" run: tests: false linters: enable: - bodyclose - exhaustive - goconst - godot - gomoddirectives - goprintffuncname - gosec - misspell - nakedret - nestif - nilerr - noctx - nolintlint - prealloc - revive - rowserrcheck - sqlclosecheck - tparallel - unconvert - unparam - whitespace - wrapcheck exclusions: rules: - text: '(slog|log)\.\w+' linters: - noctx generated: lax presets: - common-false-positives issues: max-issues-per-linter: 0 max-same-issues: 0 formatters: enable: - gofumpt - goimports exclusions: generated: lax charmbracelet-bubbletea-143649d/.goreleaser.yml 0000664 0000000 0000000 00000000250 15062612743 0021445 0 ustar 00root root 0000000 0000000 # yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json version: 2 includes: - from_url: url: charmbracelet/meta/main/goreleaser-lib.yaml charmbracelet-bubbletea-143649d/LICENSE 0000664 0000000 0000000 00000002070 15062612743 0017523 0 ustar 00root root 0000000 0000000 MIT License Copyright (c) 2020-2025 Charmbracelet, Inc 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. charmbracelet-bubbletea-143649d/README.md 0000664 0000000 0000000 00000034746 15062612743 0020014 0 ustar 00root root 0000000 0000000 # Bubble Tea
The fun, functional and stateful way to build terminal apps. A Go framework based on [The Elm Architecture][elm]. Bubble Tea is well-suited for simple and complex terminal applications, either inline, full-window, or a mix of both.
Charm热爱开源 • Charm loves open source • نحنُ نحب المصادر المفتوحة
charmbracelet-bubbletea-143649d/Taskfile.yaml 0000664 0000000 0000000 00000000267 15062612743 0021152 0 ustar 00root root 0000000 0000000 # https://taskfile.dev
version: '3'
tasks:
lint:
desc: Run lint
cmds:
- golangci-lint run
test:
desc: Run tests
cmds:
- go test ./... {{.CLI_ARGS}}
charmbracelet-bubbletea-143649d/commands.go 0000664 0000000 0000000 00000013442 15062612743 0020653 0 ustar 00root root 0000000 0000000 package tea
import (
"time"
)
// Batch performs a bunch of commands concurrently with no ordering guarantees
// about the results. Use a Batch to return several commands.
//
// Example:
//
// func (m model) Init() Cmd {
// return tea.Batch(someCommand, someOtherCommand)
// }
func Batch(cmds ...Cmd) Cmd {
return compactCmds[BatchMsg](cmds)
}
// BatchMsg is a message used to perform a bunch of commands concurrently with
// no ordering guarantees. You can send a BatchMsg with Batch.
type BatchMsg []Cmd
// Sequence runs the given commands one at a time, in order. Contrast this with
// Batch, which runs commands concurrently.
func Sequence(cmds ...Cmd) Cmd {
return compactCmds[sequenceMsg](cmds)
}
// sequenceMsg is used internally to run the given commands in order.
type sequenceMsg []Cmd
// compactCmds ignores any nil commands in cmds, and returns the most direct
// command possible. That is, considering the non-nil commands, if there are
// none it returns nil, if there is exactly one it returns that command
// directly, else it returns the non-nil commands as type T.
func compactCmds[T ~[]Cmd](cmds []Cmd) Cmd {
var validCmds []Cmd //nolint:prealloc
for _, c := range cmds {
if c == nil {
continue
}
validCmds = append(validCmds, c)
}
switch len(validCmds) {
case 0:
return nil
case 1:
return validCmds[0]
default:
return func() Msg {
return T(validCmds)
}
}
}
// Every is a command that ticks in sync with the system clock. So, if you
// wanted to tick with the system clock every second, minute or hour you
// could use this. It's also handy for having different things tick in sync.
//
// Because we're ticking with the system clock the tick will likely not run for
// the entire specified duration. For example, if we're ticking for one minute
// and the clock is at 12:34:20 then the next tick will happen at 12:35:00, 40
// seconds later.
//
// To produce the command, pass a duration and a function which returns
// a message containing the time at which the tick occurred.
//
// type TickMsg time.Time
//
// cmd := Every(time.Second, func(t time.Time) Msg {
// return TickMsg(t)
// })
//
// Beginners' note: Every sends a single message and won't automatically
// dispatch messages at an interval. To do that, you'll want to return another
// Every command after receiving your tick message. For example:
//
// type TickMsg time.Time
//
// // Send a message every second.
// func tickEvery() Cmd {
// return Every(time.Second, func(t time.Time) Msg {
// return TickMsg(t)
// })
// }
//
// func (m model) Init() Cmd {
// // Start ticking.
// return tickEvery()
// }
//
// func (m model) Update(msg Msg) (Model, Cmd) {
// switch msg.(type) {
// case TickMsg:
// // Return your Every command again to loop.
// return m, tickEvery()
// }
// return m, nil
// }
//
// Every is analogous to Tick in the Elm Architecture.
func Every(duration time.Duration, fn func(time.Time) Msg) Cmd {
n := time.Now()
d := n.Truncate(duration).Add(duration).Sub(n)
t := time.NewTimer(d)
return func() Msg {
ts := <-t.C
t.Stop()
for len(t.C) > 0 {
<-t.C
}
return fn(ts)
}
}
// Tick produces a command at an interval independent of the system clock at
// the given duration. That is, the timer begins precisely when invoked,
// and runs for its entire duration.
//
// To produce the command, pass a duration and a function which returns
// a message containing the time at which the tick occurred.
//
// type TickMsg time.Time
//
// cmd := Tick(time.Second, func(t time.Time) Msg {
// return TickMsg(t)
// })
//
// Beginners' note: Tick sends a single message and won't automatically
// dispatch messages at an interval. To do that, you'll want to return another
// Tick command after receiving your tick message. For example:
//
// type TickMsg time.Time
//
// func doTick() Cmd {
// return Tick(time.Second, func(t time.Time) Msg {
// return TickMsg(t)
// })
// }
//
// func (m model) Init() Cmd {
// // Start ticking.
// return doTick()
// }
//
// func (m model) Update(msg Msg) (Model, Cmd) {
// switch msg.(type) {
// case TickMsg:
// // Return your Tick command again to loop.
// return m, doTick()
// }
// return m, nil
// }
func Tick(d time.Duration, fn func(time.Time) Msg) Cmd {
t := time.NewTimer(d)
return func() Msg {
ts := <-t.C
t.Stop()
for len(t.C) > 0 {
<-t.C
}
return fn(ts)
}
}
// Sequentially produces a command that sequentially executes the given
// commands.
// The Msg returned is the first non-nil message returned by a Cmd.
//
// func saveStateCmd() Msg {
// if err := save(); err != nil {
// return errMsg{err}
// }
// return nil
// }
//
// cmd := Sequentially(saveStateCmd, Quit)
//
// Deprecated: use Sequence instead.
func Sequentially(cmds ...Cmd) Cmd {
return func() Msg {
for _, cmd := range cmds {
if cmd == nil {
continue
}
if msg := cmd(); msg != nil {
return msg
}
}
return nil
}
}
// setWindowTitleMsg is an internal message used to set the window title.
type setWindowTitleMsg string
// SetWindowTitle produces a command that sets the terminal title.
//
// For example:
//
// func (m model) Init() Cmd {
// // Set title.
// return tea.SetWindowTitle("My App")
// }
func SetWindowTitle(title string) Cmd {
return func() Msg {
return setWindowTitleMsg(title)
}
}
type windowSizeMsg struct{}
// WindowSize is a command that queries the terminal for its current size. It
// delivers the results to Update via a [WindowSizeMsg]. Keep in mind that
// WindowSizeMsgs will automatically be delivered to Update when the [Program]
// starts and when the window dimensions change so in many cases you will not
// need to explicitly invoke this command.
func WindowSize() Cmd {
return func() Msg {
return windowSizeMsg{}
}
}
charmbracelet-bubbletea-143649d/commands_test.go 0000664 0000000 0000000 00000004363 15062612743 0021714 0 ustar 00root root 0000000 0000000 package tea
import (
"fmt"
"testing"
"time"
)
func TestEvery(t *testing.T) {
expected := "every ms"
msg := Every(time.Millisecond, func(t time.Time) Msg {
return expected
})()
if expected != msg {
t.Fatalf("expected a msg %v but got %v", expected, msg)
}
}
func TestTick(t *testing.T) {
expected := "tick"
msg := Tick(time.Millisecond, func(t time.Time) Msg {
return expected
})()
if expected != msg {
t.Fatalf("expected a msg %v but got %v", expected, msg)
}
}
func TestSequentially(t *testing.T) {
expectedErrMsg := fmt.Errorf("some err")
expectedStrMsg := "some msg"
nilReturnCmd := func() Msg {
return nil
}
tests := []struct {
name string
cmds []Cmd
expected Msg
}{
{
name: "all nil",
cmds: []Cmd{nilReturnCmd, nilReturnCmd},
expected: nil,
},
{
name: "null cmds",
cmds: []Cmd{nil, nil},
expected: nil,
},
{
name: "one error",
cmds: []Cmd{
nilReturnCmd,
func() Msg {
return expectedErrMsg
},
nilReturnCmd,
},
expected: expectedErrMsg,
},
{
name: "some msg",
cmds: []Cmd{
nilReturnCmd,
func() Msg {
return expectedStrMsg
},
nilReturnCmd,
},
expected: expectedStrMsg,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
if msg := Sequentially(test.cmds...)(); msg != test.expected {
t.Fatalf("expected a msg %v but got %v", test.expected, msg)
}
})
}
}
func TestBatch(t *testing.T) {
testMultipleCommands[BatchMsg](t, Batch)
}
func TestSequence(t *testing.T) {
testMultipleCommands[sequenceMsg](t, Sequence)
}
func testMultipleCommands[T ~[]Cmd](t *testing.T, createFn func(cmd ...Cmd) Cmd) {
t.Run("nil cmd", func(t *testing.T) {
if b := createFn(nil); b != nil {
t.Fatalf("expected nil, got %+v", b)
}
})
t.Run("empty cmd", func(t *testing.T) {
if b := createFn(); b != nil {
t.Fatalf("expected nil, got %+v", b)
}
})
t.Run("single cmd", func(t *testing.T) {
b := createFn(Quit)()
if _, ok := b.(QuitMsg); !ok {
t.Fatalf("expected a QuitMsg, got %T", b)
}
})
t.Run("mixed nil cmds", func(t *testing.T) {
b := createFn(nil, Quit, nil, Quit, nil, nil)()
if l := len(b.(T)); l != 2 {
t.Fatalf("expected a []Cmd with len 2, got %d", l)
}
})
}
charmbracelet-bubbletea-143649d/examples/ 0000775 0000000 0000000 00000000000 15062612743 0020335 5 ustar 00root root 0000000 0000000 charmbracelet-bubbletea-143649d/examples/README.md 0000664 0000000 0000000 00000017066 15062612743 0021626 0 ustar 00root root 0000000 0000000 # Examples
### Alt Screen Toggle
The `altscreen-toggle` example shows how to transition between the alternative
screen buffer and the normal screen buffer using Bubble Tea.
### Chat
The `chat` examples shows a basic chat application with a multi-line `textarea`
input.
### Composable Views
The `composable-views` example shows how to compose two bubble models (spinner
and timer) together in a single application and switch between them.
### Credit Card Form
The `credit-card-form` example demonstrates how to build a multi-step form with
`textinputs` bubbles and validation on the inputs.
### Debounce
The `debounce` example shows how to throttle key presses to avoid overloading
your Bubble Tea application.
### Exec
The `exec` example shows how to execute a running command during the execution
of a Bubble Tea application such as launching an `EDITOR`.
### Full Screen
The `fullscreen` example shows how to make a Bubble Tea application fullscreen.
### Glamour
The `glamour` example shows how to use [Glamour](https://github.com/charmbracelet/glamour) inside a viewport bubble.
### Help
The `help` example shows how to use the `help` bubble to display help to the
user of your application.
### Http
The `http` example shows how to make an `http` call within your Bubble Tea
application.
### Default List
The `list-default` example shows how to use the list bubble.
### Fancy List
The `list-fancy` example shows how to use the list bubble with extra customizations.
### Simple List
The `list-simple` example shows how to use the list and customize it to have a simpler, more compact, appearance.
### Mouse
The `mouse` example shows how to receive mouse events in a Bubble Tea
application.
Code
### Package Manager
The `package-manager` example shows how to build an interface for a package
manager using the `tea.Println` feature.
### Pager
The `pager` example shows how to build a simple pager application similar to
`less`.
### Paginator
The `paginator` example shows how to build a simple paginated list.
### Pipe
The `pipe` example demonstrates using shell pipes to communicate with Bubble
Tea applications.
### Animated Progress
The `progress-animated` example shows how to build a progress bar with an
animated progression.
### Download Progress
The `progress-download` example demonstrates how to download a file while
indicating download progress through Bubble Tea.
Code
### Static Progress
The `progress-static` example shows a progress bar with static incrementation
of progress.
### Real Time
The `realtime` example demonstrates the use of go channels to perform realtime
communication with a Bubble Tea application.
### Result
The `result` example shows a choice menu with the ability to select an option.
### Send Msg
The `send-msg` example demonstrates the usage of custom `tea.Msg`s.
### Sequence
The `sequence` example demonstrates the `tea.Sequence` command.
### Simple
The `simple` example shows a very simple Bubble Tea application.
### Spinner
The `spinner` example demonstrates a spinner bubble being used to indicate loading.
### Spinners
The `spinner` example shows various spinner types that are available.
### Split Editors
The `split-editors` example shows multiple `textarea`s being used in a single
application and being able to switch focus between them.
### Stop Watch
The `stopwatch` example shows a sample stop watch built with Bubble Tea.
### Table
The `table` example demonstrates the table bubble being used to display tabular
data.
### Tabs
The `tabs` example demonstrates tabbed navigation styled with [Lip Gloss](https://github.com/charmbracelet/lipgloss).
### Text Area
The `textarea` example demonstrates a simple Bubble Tea application using a
`textarea` bubble.
### Text Input
The `textinput` example demonstrates a simple Bubble Tea application using a `textinput` bubble.
### Multiple Text Inputs
The `textinputs` example shows multiple `textinputs` and being able to switch
focus between them as well as changing the cursor mode.
### Timer
The `timer` example shows a simple timer built with Bubble Tea.
### TUI Daemon
The `tui-daemon-combo` demonstrates building a text-user interface along with a
daemon mode using Bubble Tea.
### Views
The `views` example demonstrates how to build a Bubble Tea application with
multiple views and switch between them.
charmbracelet-bubbletea-143649d/examples/altscreen-toggle/ 0000775 0000000 0000000 00000000000 15062612743 0023574 5 ustar 00root root 0000000 0000000 charmbracelet-bubbletea-143649d/examples/altscreen-toggle/README.md 0000664 0000000 0000000 00000000106 15062612743 0025050 0 ustar 00root root 0000000 0000000 # Alt Screen Toggle
charmbracelet-bubbletea-143649d/examples/altscreen-toggle/altscreen-toggle.gif 0000664 0000000 0000000 00000143562 15062612743 0027535 0 ustar 00root root 0000000 0000000 GIF89aX !/ ! 6!!!!!7"""###$#@$$$%%%&&&'&&'''((()&')))*'(***+'(+)U+++,+Y,,,---.().../(*///0001(*11122231n3334),4445556*-6667*.7778889*.97999:8:::;+/;9;;;<+/<<<=:===>>>?,1???@@@A-2AAABBBCCCD-3DDDEEEFCFFFG.5GGGH/5HHHI.5IIIJ/6JJJK/6KHKKKLHLLLM07MMMN07NNNOOOPPPQQQR09RRRSOSSSTPTTTUQUUUVVVW2