pax_global_header 0000666 0000000 0000000 00000000064 14656474022 0014524 g ustar 00root root 0000000 0000000 52 comment=d6a19f0eb5a983610bd65a1647f5955abe3ee69e bubbletea-0.27.0/ 0000775 0000000 0000000 00000000000 14656474022 0013537 5 ustar 00root root 0000000 0000000 bubbletea-0.27.0/.gitattributes 0000664 0000000 0000000 00000000017 14656474022 0016430 0 ustar 00root root 0000000 0000000 *.golden -text bubbletea-0.27.0/.github/ 0000775 0000000 0000000 00000000000 14656474022 0015077 5 ustar 00root root 0000000 0000000 bubbletea-0.27.0/.github/CODEOWNERS 0000664 0000000 0000000 00000000036 14656474022 0016471 0 ustar 00root root 0000000 0000000 * @meowgorithm @aymanbagabas bubbletea-0.27.0/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 14656474022 0017262 5 ustar 00root root 0000000 0000000 bubbletea-0.27.0/.github/ISSUE_TEMPLATE/bug.yml 0000664 0000000 0000000 00000003251 14656474022 0020563 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 bubbletea-0.27.0/.github/ISSUE_TEMPLATE/bug_report.md 0000664 0000000 0000000 00000001474 14656474022 0021762 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. bubbletea-0.27.0/.github/ISSUE_TEMPLATE/config.yml 0000664 0000000 0000000 00000000170 14656474022 0021250 0 ustar 00root root 0000000 0000000 blank_issues_enabled: true contact_links: - name: Discord url: https://charm.sh/discord about: Chat on our Discord. bubbletea-0.27.0/.github/ISSUE_TEMPLATE/feature_request.md 0000664 0000000 0000000 00000001134 14656474022 0023006 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. bubbletea-0.27.0/.github/dependabot.yml 0000664 0000000 0000000 00000001436 14656474022 0017733 0 ustar 00root root 0000000 0000000 version: 2 updates: - package-ecosystem: "gomod" directory: "/" schedule: interval: "daily" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" - package-ecosystem: "gomod" directory: "/examples" schedule: interval: "daily" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" - package-ecosystem: "gomod" directory: "/tutorials" schedule: interval: "daily" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" bubbletea-0.27.0/.github/workflows/ 0000775 0000000 0000000 00000000000 14656474022 0017134 5 ustar 00root root 0000000 0000000 bubbletea-0.27.0/.github/workflows/build.yml 0000664 0000000 0000000 00000001736 14656474022 0020765 0 ustar 00root root 0000000 0000000 name: build on: [push, pull_request] jobs: build: strategy: matrix: go-version: [~1.18, ^1] os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} env: GO111MODULE: "on" steps: - name: Install Go uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v4 - name: Download Go modules run: go mod download - name: Build run: | go mod tidy go build -v ./... - name: Test run: go test ./... - name: Build examples run: | go mod tidy go build -v ./... working-directory: ./examples - name: Test examples run: go test -v ./... working-directory: ./examples - name: Build tutorials run: | go mod tidy go build -v ./... working-directory: ./tutorials bubbletea-0.27.0/.github/workflows/coverage.yml 0000664 0000000 0000000 00000001267 14656474022 0021460 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@v5 with: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v4 - name: Coverage env: COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | go test -race -covermode atomic -coverprofile=profile.cov ./... go install github.com/mattn/goveralls@latest goveralls -coverprofile=profile.cov -service=github bubbletea-0.27.0/.github/workflows/examples.yml 0000664 0000000 0000000 00000001561 14656474022 0021500 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@v4 - uses: actions/setup-go@v5 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@v5 with: commit_message: "chore: go mod tidy tutorials and examples" branch: master commit_user_name: actions-user commit_user_email: actions@github.com bubbletea-0.27.0/.github/workflows/lint-soft.yml 0000664 0000000 0000000 00000001336 14656474022 0021601 0 ustar 00root root 0000000 0000000 name: lint-soft on: push: pull_request: permissions: contents: read # Optional: allow read access to pull request. Use with `only-new-issues` option. pull-requests: read jobs: golangci: name: lint-soft runs-on: ubuntu-latest steps: - name: Install Go uses: actions/setup-go@v5 with: go-version: ^1 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: # Optional: golangci-lint command line arguments. args: --config .golangci-soft.yml --issues-exit-code=0 # Optional: show only new issues if it's a pull request. The default value is `false`. only-new-issues: true bubbletea-0.27.0/.github/workflows/lint.yml 0000664 0000000 0000000 00000001244 14656474022 0020626 0 ustar 00root root 0000000 0000000 name: lint on: push: pull_request: permissions: contents: read # Optional: allow read access to pull request. Use with `only-new-issues` option. pull-requests: read jobs: golangci: name: lint runs-on: ubuntu-latest steps: - name: Install Go uses: actions/setup-go@v5 with: go-version: ^1 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: # Optional: golangci-lint command line arguments. #args: # Optional: show only new issues if it's a pull request. The default value is `false`. only-new-issues: true bubbletea-0.27.0/.github/workflows/release.yml 0000664 0000000 0000000 00000002122 14656474022 0021274 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 bubbletea-0.27.0/.gitignore 0000664 0000000 0000000 00000001007 14656474022 0015525 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 bubbletea-0.27.0/.golangci-soft.yml 0000664 0000000 0000000 00000001252 14656474022 0017074 0 ustar 00root root 0000000 0000000 run: tests: false issues: include: - EXC0001 - EXC0005 - EXC0011 - EXC0012 - EXC0013 max-issues-per-linter: 0 max-same-issues: 0 linters: enable: # - dupl - exhaustive # - exhaustivestruct - goconst - godot - godox - gomnd - gomoddirectives - goprintffuncname # - lll - misspell - nakedret - nestif - noctx - nolintlint - prealloc - wrapcheck # disable default linters, they are already enabled in .golangci.yml disable: - deadcode - errcheck - gosimple - govet - ineffassign - staticcheck - structcheck - typecheck - unused - varcheck bubbletea-0.27.0/.golangci.yml 0000664 0000000 0000000 00000000623 14656474022 0016124 0 ustar 00root root 0000000 0000000 run: tests: false issues: include: - EXC0001 - EXC0005 - EXC0011 - EXC0012 - EXC0013 max-issues-per-linter: 0 max-same-issues: 0 linters: enable: - bodyclose - exportloopref - gofumpt - goimports - gosec - nilerr - predeclared - revive - rowserrcheck - sqlclosecheck - tparallel - unconvert - unparam - whitespace bubbletea-0.27.0/.goreleaser.yml 0000664 0000000 0000000 00000000237 14656474022 0016472 0 ustar 00root root 0000000 0000000 includes: - from_url: url: charmbracelet/meta/main/goreleaser-lib.yaml # yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json bubbletea-0.27.0/CONTRIBUTING.md 0000664 0000000 0000000 00000000714 14656474022 0015772 0 ustar 00root root 0000000 0000000 # Contributing Pull requests are welcome for any changes. Consider opening an issue for larger changes to get feedback on the idea from the team. If your change touches parts of the Bubble Tea renderer or internals, make sure that all the examples in the `examples/` folder continue to run correctly. For commit messages, please use conventional commits[^1] to make it easier to generate release notes. [^1]: https://www.conventionalcommits.org/en/v1.0.0 bubbletea-0.27.0/LICENSE 0000664 0000000 0000000 00000002070 14656474022 0014543 0 ustar 00root root 0000000 0000000 MIT License Copyright (c) 2020-2023 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. bubbletea-0.27.0/README.md 0000664 0000000 0000000 00000051133 14656474022 0015021 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 • نحنُ نحب المصادر المفتوحة
bubbletea-0.27.0/commands.go 0000664 0000000 0000000 00000012702 14656474022 0015671 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 {
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 BatchMsg(validCmds)
}
}
}
// 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 func() Msg {
return sequenceMsg(cmds)
}
}
// sequenceMsg is used internally to run the given commands in order.
type sequenceMsg []Cmd
// 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{}
}
}
bubbletea-0.27.0/commands_test.go 0000664 0000000 0000000 00000004031 14656474022 0016724 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) {
t.Run("nil cmd", func(t *testing.T) {
if b := Batch(nil); b != nil {
t.Fatalf("expected nil, got %+v", b)
}
})
t.Run("empty cmd", func(t *testing.T) {
if b := Batch(); b != nil {
t.Fatalf("expected nil, got %+v", b)
}
})
t.Run("single cmd", func(t *testing.T) {
b := Batch(Quit)()
if _, ok := b.(QuitMsg); !ok {
t.Fatalf("expected a QuitMsg, got %T", b)
}
})
t.Run("mixed nil cmds", func(t *testing.T) {
b := Batch(nil, Quit, nil, Quit, nil, nil)()
if l := len(b.(BatchMsg)); l != 2 {
t.Fatalf("expected a []Cmd with len 2, got %d", l)
}
})
}
bubbletea-0.27.0/examples/ 0000775 0000000 0000000 00000000000 14656474022 0015355 5 ustar 00root root 0000000 0000000 bubbletea-0.27.0/examples/README.md 0000664 0000000 0000000 00000017066 14656474022 0016646 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
`textinput`s 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.
bubbletea-0.27.0/examples/altscreen-toggle/ 0000775 0000000 0000000 00000000000 14656474022 0020614 5 ustar 00root root 0000000 0000000 bubbletea-0.27.0/examples/altscreen-toggle/README.md 0000664 0000000 0000000 00000000106 14656474022 0022070 0 ustar 00root root 0000000 0000000 # Alt Screen Toggle
bubbletea-0.27.0/examples/altscreen-toggle/altscreen-toggle.gif 0000664 0000000 0000000 00000143562 14656474022 0024555 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